[uae] Re: Lupo Alberto issue [Was Re: E-UAE 0.8.27-RC1 released]

  • From: Toni Wilen <twilen@xxxxxxxxxx>
  • To: uae@xxxxxxxxxxxxx
  • Date: Sat, 23 Oct 2004 22:48:40 +0300

I'm sorry, but i have just subscribed so i couldn't directly reply to the message (before i used to read the archive). I only want to notify Giulio and Richard that the freeze during the game with Lupo Alberto is a winuae issue too. It was reported in this message in the EAB forum by diduz: http://eab.abime.net/showthread.php?t=15230

>P.S.: "Lupo Alberto", an old Italian platform by Idea, locks up after some minutes >(this has ALWAYS happened and has nothing to do with my problem). What could >the cause be?

unfortunately, Toni didn't have a clue. Now, it seems to me that with very old version of Winuae i was able to play this funny game, but i can't remember which (maybe the famous 0.8.8R8). Giulio, maybe you tryed with more recent version of uae/e-uae: is this a regression?

Now I do have a clue :)

If this game worked in older versions, it was only due to an accident or due to quite incorrectly timed blitter and cpu..

00022aae 4eba 001c JSR.L (PC,$001c) == $00022acc
ok, here game starts the blitter
00022ae6 3290 MOVE.W (A0),(A1) (A1 = DFF058)
00022ae8 4e75 RTS -> 22AB2
gah. and here it clears the blitter interrupt AFTER blit has been started.. -> blitter interrupt is lost if blit finishes before this line (usually happens when scrolling because "scroll" blit is only 1x16 words) -> basically programmers did very stupid thing..
00022ab2 33fc 0040 00df f09c MOVE.W #$0040,$00dff09c

It seems this won't work until cpu and blitter timing is perfect. I don't want to do any random tweaks because they will break other programs.

btw, 68000 is very "interesting" because it uses microcode. Different addresssing modes can have totally different memory access order and this really needs to be emulated properly too (probably affects Lupo Alberto).. for example:

move.w z(ax),(ay): fetch "z", prefetch next instruction opcode, fetch word pointed by z(ax), write word to (ay)

move.w (a0)+,$12345678.w: fetch $1234 (high word), fetch word pointed by (a0), fetch $5678 (low word), write word to $12345678, prefetch.

Fortunately there is nice blitter trick that can be used to "trace" cpu's memory accesses without any extra hardware. Unfortunately this is ultra-boring, in theory all 40000+ instructions needs to be checked..

Other related posts: