Viewing Issue Advanced Details
ID Category [?] Severity [?] Reproducibility Date Submitted Last Update
03476 Crash/Freeze Critical (emulation) Always Oct 15, 2009, 21:11 May 15, 2010, 23:13
Tester M.A.S.H. View Status Public Platform MAME (Self-compiled)
Assigned To AWJ Resolution Fixed OS Windows XP (32-bit)
Status [?] Resolved Driver
Version 0.134u3 Fixed in Version 0.138u1 Build Normal
Fixed in Git Commit Github Pull Request #
Summary 03476: quartet, quarteta, dumpmtmt: Games do not start.
Description Quartet (Rev A, 8751 315-5194) and clone Quartet (8751 315-5194) doesn't start
since MAME 0.131u3 (black screen).

WhatsNew
- 0.131u3: Aaron Giles and Dr. Decapitator added/hooked MCU dump in
clone Quartet 2 (8751 317-0010).


In both games the i8751 MCU is missing and there are changes in the
source drivers\segas16a.c line 1035 from:


static ADDRESS_MAP_START( mcu_io_map, ADDRESS_SPACE_DATA, 8 )
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_END

to

static ADDRESS_MAP_START( mcu_io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0xffff) AM_READWRITE(mcu_io_r, mcu_io_w)
AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READNOP AM_WRITE(mcu_control_w)
AM_RANGE(MCS51_PORT_P3, MCS51_PORT_P3) AM_READNOP /* read during jb int0 */
ADDRESS_MAP_END

These additional changes doesn't work for both Quartet games.
I added a new MACHINE_DRIVER_START without the 'mcu_io_map' entry and
changed quartet and quarteta to use it. This works fine.

>>>>

static MACHINE_DRIVER_START( system16a_no8751 )
MDRV_IMPORT_FROM(system16a)
MDRV_CPU_MODIFY("maincpu")
MDRV_CPU_VBLANK_INT("screen", i8751_main_cpu_vblank)

MDRV_CPU_ADD("mcu", I8751, 8000000)
        MDRV_CPU_VBLANK_INT("screen", mcu_irq_assert)
MACHINE_DRIVER_END

GAME( 1986, quartet, 0, system16a_no8751, quartet, quartet, ROT0, "Sega", "Quartet (Rev A, 8751 315-5194)", GAME_UNEMULATED_PROTECTION )
GAME( 1986, quarteta, quartet, system16a_no8751, quartet, quartet, ROT0, "Sega", "Quartet (8751 315-5194)", GAME_UNEMULATED_PROTECTION )
Steps To Reproduce
Additional Information
Github Commit
Flags
Regression Version 0.131u3
Affected Sets / Systems quartet, quarteta, dumpmtmt
Attached Files
 
Relationships
There are no relationship linked to this issue.
Notes
3
User avatar
No.05074
etabeta
Developer
Oct 27, 2009, 21:49
I'm not sure this is a bug: isn't the UNEMULATED_PROTECTION flag set exactly because the MCU is not emulated yet?
User avatar
No.05075
Tafoid
Administrator
Oct 27, 2009, 22:39
The flag was added, yes. I'm not sure if Aaron intended this set and clone to become unplayable when it used to work before the emu was needed. It was simulated before, I think.
User avatar
No.05986
AWJ
Developer
Apr 17, 2010, 23:18
edited on: Apr 17, 2010, 23:36
dumpmtmt has the same problem.

This is happening because even though the i8751 MCU is disabled, it writes to each of its special I/O ports during its CPU_RESET and in the case of segas16a.c this causes the 68000 RESET line to get set and never cleared:

static CPU_RESET( mcs51 )
{
(snip)
/* set the port configurations to all 1's */
SET_P3(0xff);
SET_P2(0xff);
SET_P1(0xff);
SET_P0(0xff);

To fix the problem, two things need to be done:

First, either the MAME core needs to be made not to call CPU_RESET functions for CPUs that are disabled, or individual CPU cores such as mcs51 have to be made to check whether they are disabled and if they are, not call any functions at reset that can affect the machine at large. I'm not sure which is the right approach--Aaron?

Second, in drivers that have an i8751 that needs to be disabled (because we don't have a dump and are using simulation) the i8751 needs to be disabled at the driver level using MDRV_CPU_FLAGS(CPU_DISABLE) rather than at runtime using cpu_suspend(). Suspending the CPU at runtime doesn't happen until after the various reset functions have already been called, so even if one of the fixes above is applied it won't help quartet or dumpmtmt.