[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MiNT] TAS in GFA Linker



On 06/09/2014 05:43, Lonny Pursell wrote:
Initial tests seem to indicate a stable linker now. \o/
Pierre will do more testing, but I think its solved.

Excellent!

And would you believe the best?

Yesterday, just after providing you replacement instructions for TAS in the GFA Linker, I tested the new PmDoom 0.59 on the FireBee. Everything worked fine, except the keyboard in full screen which hangs after a few keystrokes (long lasting bug). Then I got an intuition: the keyboard hangs after a few press/releases. The scancode press/release indication is in bit 7. Bit 7, funny, the same one used by TAS. By chance, maybe there is a TAS in the SDL keyboard routine? That would explain things. So I looked at the SDL sources and... there was one TAS !!!

The TAS instruction had already been replaced by BTST on ColdFire, but for another reason. SDL used TAS D0, but on ColdFire that addressing mode is not available (the read-modify-write special cycle is a nonsense on a register). So it had been replaced by BTST (as TAS was only used to test the high bit).

But yesterday morning, Andreas gave me a hint by saying that TAS ans BSET were not interchangeable. And Thomas posted the documentation here, where it appears that TAS and BSET do not set the same condition flags.

And that was the mistake in SDL!

The original code looked like:
    tas  d0
    spl  (a0)

Naturally, it had been replaced by:
    btst #7,d0
    spl  (a0)

But it was wrong!
SPL uses the N flag.
As the documentation says, TAS sets the N bit, but BTST does not change it!

So I replaced SPL by SEQ (similar to the GFA patch), and it worked :-D

Many thanks to all of you, after years we can finally enjoy PmDoom and other SDL suff in full screen on ColdFire.

PS: There are still bugs in the FireBee's FPGA which prevent to correctly display a lot of standard VIDEL video modes, including standard Falcon TrueColor. But that's another story.

--
Vincent Rivière