mirror of
https://github.com/holub/mame
synced 2025-04-24 17:30:55 +03:00
Fix #02349
This commit is contained in:
parent
cebbc6258c
commit
0acf62b8f2
@ -21,7 +21,7 @@ Notes:
|
||||
- kicknrun does a PS4 STOP ERROR shortly after boot, but works afterwards.
|
||||
PS4 is the MC6801U4 mcu.
|
||||
|
||||
- Kiki Kaikai suffers from random lock-up's. It happens when the sound
|
||||
- Kiki Kaikai suffers from random lock-ups. It happens when the sound
|
||||
CPU misses CTS from YM2203. The processor will loop infinitely and the main
|
||||
CPU will in turn wait forever. It's difficult to meet the required level
|
||||
of synchronization. This is kludged by filtering the 2203's busy signal.
|
||||
@ -35,9 +35,6 @@ Notes:
|
||||
figure it all out. Indeed, the 68705 code reads all the memory locations
|
||||
related to the missing collision detection, but does nothing with them.
|
||||
|
||||
- In the KiKi KaiKai MCU simulation, I don't bother supporting the coinage dip
|
||||
switch settings. Therefore, it's hardwired to be 1 coin / 1 credit.
|
||||
|
||||
- Kick and Run is a rom swap for Kiki KaiKai as the pal chips are all A85-0x
|
||||
A85 is the Taito rom code for Kiki KaiKai. Even the MCU is socketed!
|
||||
|
||||
@ -224,8 +221,7 @@ static INPUT_PORTS_START( mexico86 )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
PORT_START("IN3")
|
||||
/* the following is actually service coin 1 */
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Advance") PORT_CODE(KEYCODE_F1)
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
|
||||
@ -283,8 +279,8 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // Ofuda in service mode
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // Oharai
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
@ -293,8 +289,8 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
@ -359,7 +355,7 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
PORT_START("IN3")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
|
||||
@ -417,7 +413,8 @@ void mexico86_state::machine_start()
|
||||
save_item(NAME(m_mcu_running));
|
||||
save_item(NAME(m_mcu_initialised));
|
||||
save_item(NAME(m_coin_last));
|
||||
|
||||
save_item(NAME(m_coin_fract));
|
||||
|
||||
save_item(NAME(m_charbank));
|
||||
}
|
||||
|
||||
@ -438,7 +435,9 @@ void mexico86_state::machine_reset()
|
||||
|
||||
m_mcu_running = 0;
|
||||
m_mcu_initialised = 0;
|
||||
m_coin_last = 0;
|
||||
m_coin_last[0] = false;
|
||||
m_coin_last[1] = false;
|
||||
m_coin_fract = 0;
|
||||
|
||||
m_charbank = 0;
|
||||
}
|
||||
|
@ -30,7 +30,6 @@ Tank Force (c) 1991 Namco
|
||||
We are missing some alternate versions:
|
||||
- Alice In Wonderland (English version of Marchen Maze)
|
||||
- Face Off (6 sticks)
|
||||
- Tank Force (4 players)
|
||||
|
||||
|
||||
|
||||
@ -2846,7 +2845,7 @@ GAME( 1988, wldcourt, 0, ns1, wldcourt, namcos1_state, wldcourt, ROT
|
||||
GAME( 1988, splatter, 0, ns1, splatter3,namcos1_state, splatter, ROT180, "Namco", "Splatter House (World, new version (SH3))", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, splatter2, splatter, ns1, splatter, namcos1_state, splatter, ROT180, "Namco", "Splatter House (World, old version (SH2))", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, splatterj, splatter, ns1, splatter, namcos1_state, splatter, ROT180, "Namco", "Splatter House (Japan, SH1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, faceoff, 0, ns1, faceoff, namcos1_state, faceoff, ROT180, "Namco", "Face Off (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1988, faceoff, 0, ns1, faceoff, namcos1_state, faceoff, ROT180, "Namco", "Face Off (Japan 2 Players)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1989, rompers, 0, ns1, ns1, namcos1_state, rompers, ROT90, "Namco", "Rompers (Japan, new version (Rev B))", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1989, romperso, rompers, ns1, ns1, namcos1_state, rompers, ROT90, "Namco", "Rompers (Japan, old version)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1989, blastoff, 0, ns1, ns1, namcos1_state, blastoff, ROT90, "Namco", "Blast Off (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
@ -2857,6 +2856,6 @@ GAME( 1990, pistoldm, 0, ns1, ns1, namcos1_state, pistoldm, ROT
|
||||
GAME( 1990, boxyboy, 0, ns1, boxyboy, namcos1_state, soukobdx, ROT0, "Namco", "Boxy Boy (SB?)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1990, soukobdx, boxyboy, ns1, boxyboy, namcos1_state, soukobdx, ROT0, "Namco", "Souko Ban Deluxe (Japan, SB1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1990, puzlclub, 0, ns1, puzlclub, namcos1_state, puzlclub, ROT90, "Namco", "Puzzle Club (Japan prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, tankfrce, 0, ns1, ns1, namcos1_state, tankfrce, ROT0, "Namco", "Tank Force (US, 2 Player)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, tankfrce4, tankfrce, ns1, tankfrc4, namcos1_state, tankfrc4, ROT0, "Namco", "Tank Force (US, 4 Player)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, tankfrce, 0, ns1, ns1, namcos1_state, tankfrce, ROT0, "Namco", "Tank Force (US, 2 Players)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, tankfrce4, tankfrce, ns1, tankfrc4, namcos1_state, tankfrc4, ROT0, "Namco", "Tank Force (US, 4 Players)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, tankfrcej, tankfrce, ns1, ns1, namcos1_state, tankfrce, ROT0, "Namco", "Tank Force (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -41,7 +41,8 @@ public:
|
||||
/* kikikai mcu simulation */
|
||||
int m_mcu_running;
|
||||
int m_mcu_initialised;
|
||||
int m_coin_last;
|
||||
bool m_coin_last[2];
|
||||
UINT8 m_coin_fract;
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_maincpu;
|
||||
@ -73,4 +74,5 @@ public:
|
||||
INTERRUPT_GEN_MEMBER(kikikai_interrupt);
|
||||
INTERRUPT_GEN_MEMBER(mexico86_m68705_interrupt);
|
||||
void mcu_simulate( );
|
||||
bool mcu_coin_counter_w(bool condition);
|
||||
};
|
||||
|
@ -64,17 +64,47 @@ void mexico86_state::mcu_simulate( )
|
||||
if (m_mcu_initialised)
|
||||
{
|
||||
int i;
|
||||
int coin_curr;
|
||||
|
||||
coin_curr = ~ioport("IN0")->read() & 1;
|
||||
if (coin_curr && !m_coin_last && m_protection_ram[0x01] < 9)
|
||||
bool coin_curr;
|
||||
UINT8 coin_in_read = ioport("IN0")->read() & 3;
|
||||
|
||||
// TODO: still needs Coinage B into account
|
||||
for(int coin_idx = 0; coin_idx < 2; coin_idx++)
|
||||
{
|
||||
m_protection_ram[0x01]++; // increase credits counter
|
||||
m_protection_ram[0x0a] = 0x01; // set flag (coin inserted sound is not played otherwise)
|
||||
}
|
||||
m_coin_last = coin_curr;
|
||||
coin_curr = (coin_in_read & (1 << coin_idx)) == 0;
|
||||
if (coin_curr && m_coin_last[coin_idx] == false)
|
||||
{
|
||||
UINT8 coinage_setting = (ioport("DSW0")->read() >> (coin_idx*2 + 4)) & 3;
|
||||
|
||||
// increase credits counter
|
||||
switch(coinage_setting)
|
||||
{
|
||||
case 0: // 2c / 3c
|
||||
case 1: // 2c / 1c
|
||||
if(m_coin_fract == 1)
|
||||
{
|
||||
m_protection_ram[0x01]+= (coinage_setting == 0) ? 3 : 1;
|
||||
m_coin_fract = 0;
|
||||
}
|
||||
else
|
||||
m_coin_fract ++;
|
||||
|
||||
m_protection_ram[0x04] = 0x3c; // coin inputs
|
||||
break;
|
||||
case 2: // 1c / 2c
|
||||
case 3: // 1c / 1c
|
||||
m_protection_ram[0x01]+= (coinage_setting == 2) ? 2 : 1;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
m_protection_ram[0x0a] = 0x01; // set flag (coin inserted sound is not played otherwise)
|
||||
}
|
||||
m_coin_last[coin_idx] = coin_curr;
|
||||
}
|
||||
// Purge any coin counter higher than 9 TODO: is this limit correct?
|
||||
if(m_protection_ram[0x01] > 9)
|
||||
m_protection_ram[0x01] = 9;
|
||||
|
||||
m_protection_ram[0x04] = 0x3c | (coin_in_read ^ 3); // coin inputs
|
||||
|
||||
m_protection_ram[0x02] = BITSWAP8(ioport("IN1")->read(), 7,6,5,4,2,3,1,0); // player 1
|
||||
m_protection_ram[0x03] = BITSWAP8(ioport("IN2")->read(), 7,6,5,4,2,3,1,0); // player 2
|
||||
|
Loading…
Reference in New Issue
Block a user