|クラッシュ/フリーズ||重要 (ゲーム)||解決済み||修正済み||2016-07-06 08:18||2016-08-04 18:42|
|詳 細||This is my first MAME bug report. I hope I have provided enough information to fix the issue.|
The 2K "280 ZZZap / Dodgem" cartridge (file 280zzap) for the Bally Arcade/Astrocade no longer works in MAME. I just tested it with mame0175b_64bit using Windows 7. This cartridge doesn't act correctly-- but it USED to work fine in early versions of MESS. I can start "280 ZZZap" from the Astrocade menu as normal, and as before, it still works; I can play the game. I pressed reset (F3) and was returned to the main menu (as expected). Then I chose "Dodgem" and I selected my "Race Time" as normal. The game's start screen is quickly drawn, and then the emulator resets to the cartridge's main menu.
The last time that Dodgem worked was in MESS 0.123. An update to the astrocade driver was made for the next release of MESS 0.124 (March 2008). The update to the Astrocade driver is described as:
- [ASTROCDE] Removed the MESS specific implementation of the video hardware
in favor of the more accurate MAME version. Also fixed the I/O ports
defintion which improves the sound a lot. [Dirk Best]
I posted about this issue on the Bally Alley Yahoo groups in September 2013. A member of the group (Richard Degler) sent me a private email with an explanation of what is happening in the emulator what the Astrocade driver fails to work correctly.
Hopefully, Richard's information will help someone figure-out what is causing the issue. Here is what I received from Richard:
If you're serious about getting MESS fixed for Dodgem, here's where it goes wrong
LD A,$23 ; set Interrupt register for L23xx
Setting up this here...
; Interrupt Vectors table
L2330: DW L2334 ; for DODGEM only
L2332: DW L24EA ; for 280 ZZZAP
; DODGEM Interrupt handler
L2334: EX AF,AF' ; [aka DB $08,$D9]
Then later, with Game ID either 0 for 280ZZZap or 1 for Dodgem...
; Jump over ?? entry point
L2493: LD HL,L4FC3 ; "custom time base" byte
LD BC,$0601 ; reset to 6 and mask CT0 on
CALL CTIMER ; do a System CALL
CALL STIMER ; do another System CALL
LD A,(L4F5C) ; read Game ID
JR Z,L24AB ; (+$03) skip if 280 ZZZAP
LD BC,$30A0 ; on DODGEM only
L24AB: LD A,B
OUT (INFBK),A ; &(13)=regB for INterrupt FeedBacK
OUT (INLIN),A ; &(15)=regC for write INterrupt LINe
If you set a "bp 24ab" and "F12" to Run and select 1 for 280ZZZAP then "Run to Next Interrupt - F7" you can see that the interrupt goes to 24EA as it should, but select 2 for DODGEM instead then "F7" it goes off to D908 which, if you do the math, means it used L2334: as a vector NOT the targeted routine.
The WZ "register" in the left column not only shows this final Interrupt Routine address, but if you step thorough using F10 rather than F7 you can see it shows the last byte OUTput (x 256) and the Port Number PLUS one, which seems like a bug in the display rather than the actual Port it wrote to.
That is the full explanation that Richard sent to me.