mirror of
https://github.com/holub/mame
synced 2025-04-22 00:11:58 +03:00
crimfght: verify some things from the schematics
- full memory map for the audio cpu - proper irq set/clear for the audio cpu - add mirrors for watchdog/coincount/audioirq ports (address decoding pals need to be dumped for more improvements) - add coin b settings, not used in game but can be verified in service mode - the system can read back some bankswitch port values using the port shared with dsw3, emulating this fixes the wrong status display of the service mode dipswitch in service mode (previously inverted)
This commit is contained in:
parent
7774b46677
commit
4bb49d0ff5
@ -33,23 +33,6 @@ WRITE8_MEMBER(crimfght_state::crimfght_coin_w)
|
||||
coin_counter_w(machine(), 1, data & 2);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(crimfght_state::crimfght_sh_irqtrigger_w)
|
||||
{
|
||||
soundlatch_byte_w(space, offset, data);
|
||||
m_audiocpu->set_input_line(0, HOLD_LINE);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(crimfght_state::crimfght_snd_bankswitch_w)
|
||||
{
|
||||
/* b1: bank for channel A */
|
||||
/* b0: bank for channel B */
|
||||
|
||||
int bank_A = BIT(data, 1);
|
||||
int bank_B = BIT(data, 0);
|
||||
|
||||
m_k007232->set_bank(bank_A, bank_B );
|
||||
}
|
||||
|
||||
READ8_MEMBER(crimfght_state::k052109_051960_r)
|
||||
{
|
||||
if (m_k052109->get_rmrd_line() == CLEAR_LINE)
|
||||
@ -75,11 +58,35 @@ WRITE8_MEMBER(crimfght_state::k052109_051960_w)
|
||||
m_k051960->k051960_w(space, offset - 0x3c00, data);
|
||||
}
|
||||
|
||||
/********************************************/
|
||||
WRITE8_MEMBER(crimfght_state::sound_w)
|
||||
{
|
||||
// writing the latch asserts the irq line
|
||||
soundlatch_write(0, data);
|
||||
m_audiocpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
|
||||
}
|
||||
|
||||
READ8_MEMBER( crimfght_state::datain_r )
|
||||
{
|
||||
// reading the latch clears the irq
|
||||
m_audiocpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
|
||||
return soundlatch_read(0);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(crimfght_state::ym2151_ct_w)
|
||||
{
|
||||
// ne output from the 007232 is connected to a ls399 which
|
||||
// has inputs connected to the ct1 and ct2 outputs from
|
||||
// the ym2151 used to select the bank
|
||||
|
||||
int bank_a = BIT(data, 1);
|
||||
int bank_b = BIT(data, 0);
|
||||
|
||||
m_k007232->set_bank(bank_a, bank_b);
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( crimfght_map, AS_PROGRAM, 8, crimfght_state )
|
||||
AM_RANGE(0x0000, 0x03ff) AM_RAMBANK("bank1") /* banked RAM */
|
||||
AM_RANGE(0x0400, 0x1fff) AM_RAM /* RAM */
|
||||
AM_RANGE(0x0400, 0x1fff) AM_RAM
|
||||
AM_RANGE(0x3f80, 0x3f80) AM_READ_PORT("SYSTEM")
|
||||
AM_RANGE(0x3f81, 0x3f81) AM_READ_PORT("P1")
|
||||
AM_RANGE(0x3f82, 0x3f82) AM_READ_PORT("P2")
|
||||
@ -88,19 +95,20 @@ static ADDRESS_MAP_START( crimfght_map, AS_PROGRAM, 8, crimfght_state )
|
||||
AM_RANGE(0x3f85, 0x3f85) AM_READ_PORT("P3")
|
||||
AM_RANGE(0x3f86, 0x3f86) AM_READ_PORT("P4")
|
||||
AM_RANGE(0x3f87, 0x3f87) AM_READ_PORT("DSW1")
|
||||
AM_RANGE(0x3f88, 0x3f88) AM_READ(watchdog_reset_r) AM_WRITE(crimfght_coin_w) /* watchdog reset */
|
||||
AM_RANGE(0x3f8c, 0x3f8c) AM_WRITE(crimfght_sh_irqtrigger_w) /* cause interrupt on audio CPU? */
|
||||
AM_RANGE(0x3f88, 0x3f88) AM_MIRROR(0x03) AM_READ(watchdog_reset_r) AM_WRITE(crimfght_coin_w) // 051550
|
||||
AM_RANGE(0x3f8c, 0x3f8c) AM_MIRROR(0x03) AM_WRITE(sound_w)
|
||||
AM_RANGE(0x2000, 0x5fff) AM_READWRITE(k052109_051960_r, k052109_051960_w) /* video RAM + sprite RAM */
|
||||
AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank2") /* banked ROM */
|
||||
AM_RANGE(0x8000, 0xffff) AM_ROM /* ROM */
|
||||
AM_RANGE(0x8000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// full memory map derived from schematics
|
||||
static ADDRESS_MAP_START( crimfght_sound_map, AS_PROGRAM, 8, crimfght_state )
|
||||
AM_RANGE(0x0000, 0x7fff) AM_ROM /* ROM 821l01.h4 */
|
||||
AM_RANGE(0x8000, 0x87ff) AM_RAM /* RAM */
|
||||
AM_RANGE(0xa000, 0xa001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) /* YM2151 */
|
||||
AM_RANGE(0xc000, 0xc000) AM_READ(soundlatch_byte_r) /* soundlatch_byte_r */
|
||||
AM_RANGE(0xe000, 0xe00d) AM_DEVREADWRITE("k007232", k007232_device, read, write) /* 007232 registers */
|
||||
AM_RANGE(0x0000, 0x7fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0x87ff) AM_MIRROR(0x1800) AM_RAM
|
||||
AM_RANGE(0xa000, 0xa001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write)
|
||||
AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x1fff) AM_READ(datain_r)
|
||||
AM_RANGE(0xe000, 0xe00f) AM_MIRROR(0x1ff0) AM_DEVREADWRITE("k007232", k007232_device, read, write)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/***************************************************************************
|
||||
@ -111,48 +119,64 @@ ADDRESS_MAP_END
|
||||
|
||||
static INPUT_PORTS_START( crimfght )
|
||||
PORT_START("DSW1")
|
||||
PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2,3,4")
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) )
|
||||
PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) )
|
||||
PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) )
|
||||
PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) )
|
||||
PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
|
||||
PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) )
|
||||
PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
|
||||
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
|
||||
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
|
||||
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
|
||||
PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) )
|
||||
PORT_DIPSETTING( 0x00, "1 Coin/99 Credits" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0xf0, 0xf0, "SW1:5,6,7,8" ) /* Manual says these are unused */
|
||||
PORT_DIPNAME(0x0f, 0x0f, DEF_STR( Coin_A )) PORT_DIPLOCATION("SW1:1,2,3,4")
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ))
|
||||
PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ))
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ))
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ))
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ))
|
||||
PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ))
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ))
|
||||
PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ))
|
||||
PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ))
|
||||
PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ))
|
||||
PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ))
|
||||
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ))
|
||||
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ))
|
||||
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ))
|
||||
PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ))
|
||||
PORT_DIPSETTING( 0x00, "Void")
|
||||
PORT_DIPNAME(0xf0, 0x00, "Coin B (unused)") PORT_DIPLOCATION("SW1:5,6,7,8")
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ))
|
||||
PORT_DIPSETTING( 0x50, DEF_STR( 3C_1C ))
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ))
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( 3C_2C ))
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( 4C_3C ))
|
||||
PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ))
|
||||
PORT_DIPSETTING( 0x30, DEF_STR( 3C_4C ))
|
||||
PORT_DIPSETTING( 0x70, DEF_STR( 2C_3C ))
|
||||
PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ))
|
||||
PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ))
|
||||
PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ))
|
||||
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ))
|
||||
PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ))
|
||||
PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ))
|
||||
PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ))
|
||||
PORT_DIPSETTING( 0x00, "Void")
|
||||
|
||||
PORT_START("DSW2")
|
||||
PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW2:1" ) /* Manual says these are unused */
|
||||
PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW2:2" ) /* Manual says these are unused */
|
||||
PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SW2:3" ) /* Manual says these are unused */
|
||||
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW2:4" ) /* Manual says these are unused */
|
||||
PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW2:5" ) /* Manual says these are unused */
|
||||
PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7")
|
||||
PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) )
|
||||
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPUNUSED_DIPLOC(0x01, 0x01, "SW2:1")
|
||||
PORT_DIPUNUSED_DIPLOC(0x02, 0x02, "SW2:2")
|
||||
PORT_DIPUNUSED_DIPLOC(0x04, 0x04, "SW2:3")
|
||||
PORT_DIPUNUSED_DIPLOC(0x08, 0x08, "SW2:4")
|
||||
PORT_DIPUNUSED_DIPLOC(0x10, 0x10, "SW2:5")
|
||||
PORT_DIPNAME(0x60, 0x40, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW2:6,7")
|
||||
PORT_DIPSETTING( 0x60, DEF_STR( Easy ))
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Normal ))
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Difficult ))
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ))
|
||||
PORT_DIPNAME(0x80, 0x00, DEF_STR( Demo_Sounds )) PORT_DIPLOCATION("SW2:8")
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ))
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ))
|
||||
|
||||
PORT_START("DSW3")
|
||||
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1")
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW3:2" ) /* Manual says these are unused */
|
||||
PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_HIGH, "SW3:3" )
|
||||
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Manual says these are unused */
|
||||
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
PORT_DIPNAME(0x01, 0x01, DEF_STR( Flip_Screen )) PORT_DIPLOCATION("SW3:1")
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ))
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ))
|
||||
PORT_DIPUNUSED_DIPLOC(0x02, IP_ACTIVE_LOW, "SW3:2")
|
||||
PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3")
|
||||
PORT_DIPUNUSED_DIPLOC(0x08, IP_ACTIVE_LOW, "SW3:4")
|
||||
PORT_BIT(0xf0, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, crimfght_state, system_r, 0)
|
||||
|
||||
PORT_START("P1")
|
||||
KONAMI8_B12_UNK(1)
|
||||
@ -167,14 +191,14 @@ static INPUT_PORTS_START( crimfght )
|
||||
KONAMI8_B12_UNK(4)
|
||||
|
||||
PORT_START("SYSTEM")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE2 )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE3 )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE4 )
|
||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_COIN1)
|
||||
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_COIN2)
|
||||
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_COIN3)
|
||||
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_COIN4)
|
||||
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_SERVICE1)
|
||||
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_SERVICE2)
|
||||
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_SERVICE3)
|
||||
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_SERVICE4)
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( crimfghtj )
|
||||
@ -234,8 +258,11 @@ void crimfght_state::machine_start()
|
||||
|
||||
WRITE8_MEMBER( crimfght_state::banking_callback )
|
||||
{
|
||||
membank("bank2")->set_entry(data & 0x0f);
|
||||
|
||||
/* bit 5 = select work RAM or palette */
|
||||
if (data & 0x20)
|
||||
m_woco = BIT(data, 5);
|
||||
if (m_woco)
|
||||
{
|
||||
m_maincpu->space(AS_PROGRAM).install_read_bank(0x0000, 0x03ff, "bank3");
|
||||
m_maincpu->space(AS_PROGRAM).install_write_handler(0x0000, 0x03ff, write8_delegate(FUNC(palette_device::write), m_palette.target()));
|
||||
@ -245,9 +272,22 @@ WRITE8_MEMBER( crimfght_state::banking_callback )
|
||||
m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0x0000, 0x03ff, "bank1"); /* RAM */
|
||||
|
||||
/* bit 6 = enable char ROM reading through the video RAM */
|
||||
m_k052109->set_rmrd_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
|
||||
m_rmrd = BIT(data, 6);
|
||||
m_k052109->set_rmrd_line(m_rmrd ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
membank("bank2")->set_entry(data & 0x0f);
|
||||
m_init = BIT(data, 7);
|
||||
}
|
||||
|
||||
CUSTOM_INPUT_MEMBER( crimfght_state::system_r )
|
||||
{
|
||||
UINT8 data = 0;
|
||||
|
||||
data |= 1 << 4; // VCC
|
||||
data |= m_woco << 5;
|
||||
data |= m_rmrd << 6;
|
||||
data |= m_init << 7;
|
||||
|
||||
return data >> 4;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( crimfght, crimfght_state )
|
||||
@ -286,7 +326,7 @@ static MACHINE_CONFIG_START( crimfght, crimfght_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_YM2151_ADD("ymsnd", XTAL_3_579545MHz) /* verified on pcb */
|
||||
MCFG_YM2151_PORT_WRITE_HANDLER(WRITE8(crimfght_state,crimfght_snd_bankswitch_w))
|
||||
MCFG_YM2151_PORT_WRITE_HANDLER(WRITE8(crimfght_state, ym2151_ct_w))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
|
||||
|
@ -35,10 +35,11 @@ public:
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
DECLARE_WRITE8_MEMBER(crimfght_coin_w);
|
||||
DECLARE_WRITE8_MEMBER(crimfght_sh_irqtrigger_w);
|
||||
DECLARE_WRITE8_MEMBER(sound_w);
|
||||
DECLARE_READ8_MEMBER(k052109_051960_r);
|
||||
DECLARE_WRITE8_MEMBER(k052109_051960_w);
|
||||
DECLARE_WRITE8_MEMBER(crimfght_snd_bankswitch_w);
|
||||
DECLARE_READ8_MEMBER(datain_r);
|
||||
DECLARE_WRITE8_MEMBER(ym2151_ct_w);
|
||||
virtual void machine_start();
|
||||
virtual void video_start();
|
||||
UINT32 screen_update_crimfght(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
@ -47,4 +48,10 @@ public:
|
||||
K052109_CB_MEMBER(tile_callback);
|
||||
K051960_CB_MEMBER(sprite_callback);
|
||||
DECLARE_WRITE8_MEMBER(banking_callback);
|
||||
DECLARE_CUSTOM_INPUT_MEMBER(system_r);
|
||||
|
||||
private:
|
||||
int m_woco;
|
||||
int m_rmrd;
|
||||
int m_init;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user