diff --git a/src/mame/drivers/dynax.cpp b/src/mame/drivers/dynax.cpp index fadd6038dbf..3452cf6bd1d 100644 --- a/src/mame/drivers/dynax.cpp +++ b/src/mame/drivers/dynax.cpp @@ -1212,7 +1212,7 @@ WRITE8_MEMBER(dynax_state::tenkai_palette_w) void dynax_state::tenkai_update_rombank() { - m_romptr = memregion("maincpu")->base() + 0x10000 + 0x8000 * m_rombank; + m_bankdev->set_bank(m_rombank); // logerror("rombank = %02x\n", m_rombank); } @@ -1264,37 +1264,6 @@ READ8_MEMBER(dynax_state::tenkai_p8_r) return 0x00; } -READ8_MEMBER(dynax_state::tenkai_8000_r) -{ - if (m_rombank < 0x10) - return m_romptr[offset]; - else if ((m_rombank == 0x10) && (offset < 0x10)) - { - return m_rtc->read(space, offset); - } - else if (m_rombank == 0x12) - return tenkai_palette_r(space, offset); - - logerror("%04x: unmapped offset %04X read with rombank=%02X\n", space.device().safe_pc(), offset, m_rombank); - return 0x00; -} - -WRITE8_MEMBER(dynax_state::tenkai_8000_w) -{ - if ((m_rombank == 0x10) && (offset < 0x10)) - { - m_rtc->write(space, offset, data); - return; - } - else if (m_rombank == 0x12) - { - tenkai_palette_w(space, offset, data); - return; - } - - logerror("%04x: unmapped offset %04X=%02X written with rombank=%02X\n", space.device().safe_pc(), offset, data, m_rombank); -} - void dynax_state::tenkai_show_6c() { // popmessage("%02x %02x", m_tenkai_6c, m_tenkai_70); @@ -1332,7 +1301,7 @@ static ADDRESS_MAP_START( tenkai_map, AS_PROGRAM, 8, dynax_state ) AM_RANGE( 0x0000, 0x5fff ) AM_ROM AM_RANGE( 0x6000, 0x6fff ) AM_RAM AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram") - AM_RANGE( 0x8000, 0xffff ) AM_READWRITE(tenkai_8000_r, tenkai_8000_w) + AM_RANGE( 0x8000, 0xffff ) AM_DEVICE("bankdev", address_map_bank_device, amap8) AM_RANGE( 0x10000, 0x10000 ) AM_DEVREAD("aysnd", ay8910_device, data_r) // AY8910 AM_RANGE( 0x10008, 0x10008 ) AM_DEVWRITE("aysnd", ay8910_device, data_w) // AM_RANGE( 0x10010, 0x10010 ) AM_DEVWRITE("aysnd", ay8910_device, address_w) // @@ -1351,6 +1320,12 @@ static ADDRESS_MAP_START( tenkai_map, AS_PROGRAM, 8, dynax_state ) AM_RANGE( 0x100e1, 0x100e7 ) AM_WRITE(tenkai_blitter_rev2_w) // Blitter (inverted scroll values) ADDRESS_MAP_END +static ADDRESS_MAP_START( tenkai_banked_map, AS_PROGRAM, 8, dynax_state ) + AM_RANGE( 0x00000, 0x3ffff ) AM_ROM AM_REGION("maincpu", 0x10000) + AM_RANGE( 0x80000, 0x8000f ) AM_DEVREADWRITE("rtc", msm6242_device, read, write) + AM_RANGE( 0x90000, 0x97fff ) AM_READWRITE(tenkai_palette_r, tenkai_palette_w) +ADDRESS_MAP_END + /*************************************************************************** Mahjong Gekisha ***************************************************************************/ @@ -1391,88 +1366,38 @@ WRITE8_MEMBER(dynax_state::gekisha_hopper_w) // popmessage("%02x %02x", gekisha_val[0], gekisha_val[1]); } -void dynax_state::gekisha_set_rombank( uint8_t data ) -{ - m_rombank = data; - m_romptr = memregion("maincpu")->base() + 0x8000 + m_rombank * 0x8000; -} - WRITE8_MEMBER(dynax_state::gekisha_p4_w) { - m_gekisha_rom_enable = !BIT(data, 3); - gekisha_set_rombank(BIT(data, 2)); -} - -READ8_MEMBER(dynax_state::gekisha_8000_r) -{ - if (m_gekisha_rom_enable) - return m_romptr[offset]; - - switch (offset + 0x8000) - { - case 0x8061: return ioport("COINS")->read(); - case 0x8062: return gekisha_keyboard_1_r(space, 0); - case 0x8063: return gekisha_keyboard_0_r(space, 0); - case 0x8064: return ioport("DSW1")->read(); - case 0x8065: return ioport("DSW3")->read(); - case 0x8066: return ioport("DSW4")->read(); - case 0x8067: return ioport("DSW2")->read(); - } - - logerror("%04x: unmapped offset %04X read with rombank=%02X\n",space.device().safe_pc(), offset, m_rombank); - return 0x00; -} - -WRITE8_MEMBER(dynax_state::gekisha_8000_w) -{ - if (!m_gekisha_rom_enable) - { - switch (offset + 0x8000) - { - // same offsets as mjfriday - - case 0x8001: dynax_blit_palette01_w(space, offset - 0x01, data); return; - -// case 0x8002: // ? 1 - - case 0x8003: dynax_blit_backpen_w(space, offset - 0x03, data); return; - - case 0x8010: case 0x8011: case 0x8012: case 0x8013: - case 0x8014: case 0x8015: case 0x8016: case 0x8017: - m_mainlatch->write_bit(offset & 7, BIT(data, 0)); return; - - case 0x8020: - case 0x8021: gekisha_hopper_w(space, offset - 0x20, data); return; - - case 0x8041: - case 0x8042: - case 0x8043: - case 0x8044: - case 0x8045: - case 0x8046: - case 0x8047: dynax_blitter_rev2_w(space, offset - 0x41, data); return; - - case 0x8050: // CRT controller - case 0x8051: return; - - case 0x8070: m_ym2413->register_port_w(space, 0, data); return; - case 0x8071: m_ym2413->data_port_w(space, 0, data); return; - - case 0x8060: m_keyb = data; return; - -// case 0x8080: // ? 0,1,6 (bit 0 = screen disable?) -// popmessage("80 = %02x", data); -// break; - } - } - logerror("%04x: unmapped offset %04X=%02X written with rombank=%02X\n", space.device().safe_pc(), offset, data, m_rombank); + m_bankdev->set_bank((data >> 2) & 3); } static ADDRESS_MAP_START( gekisha_map, AS_PROGRAM, 8, dynax_state ) AM_RANGE( 0x0000, 0x6fff ) AM_ROM AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram") - AM_RANGE( 0x8000, 0xffff ) AM_READWRITE(gekisha_8000_r, gekisha_8000_w) + AM_RANGE( 0x8000, 0xffff ) AM_DEVICE("bankdev", address_map_bank_device, amap8) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( gekisha_banked_map, AS_PROGRAM, 8, dynax_state ) + AM_RANGE( 0x00000, 0x0ffff ) AM_ROM AM_REGION("maincpu", 0x8000) + AM_RANGE( 0x10001, 0x10001 ) AM_WRITE(dynax_blit_palette01_w) // Layers Palettes (Low Bits) +// AM_RANGE( 0x10002, 0x10002 ) // ? 1 + AM_RANGE( 0x10003, 0x10003 ) AM_WRITE(dynax_blit_backpen_w) // Background Color + AM_RANGE( 0x10010, 0x10017 ) AM_DEVWRITE("mainlatch", ls259_device, write_d0) + AM_RANGE( 0x10020, 0x10021 ) AM_WRITE(gekisha_hopper_w) + AM_RANGE( 0x10041, 0x10047 ) AM_WRITE(dynax_blitter_rev2_w) // Blitter +// AM_RANGE( 0x10050, 0x10050 ) AM_WRITENOP // CRT Controller +// AM_RANGE( 0x10051, 0x10051 ) AM_WRITENOP // CRT Controller + AM_RANGE( 0x10060, 0x10060 ) AM_WRITE(hanamai_keyboard_w) // keyboard row select + AM_RANGE( 0x10061, 0x10061 ) AM_READ_PORT("COINS") // Coins + AM_RANGE( 0x10062, 0x10062 ) AM_READ(gekisha_keyboard_1_r) // P2 + AM_RANGE( 0x10063, 0x10063 ) AM_READ(gekisha_keyboard_0_r) // P1 + AM_RANGE( 0x10064, 0x10064 ) AM_READ_PORT("DSW1") // DSW + AM_RANGE( 0x10065, 0x10065 ) AM_READ_PORT("DSW3") // DSW + AM_RANGE( 0x10066, 0x10066 ) AM_READ_PORT("DSW4") // DSW + AM_RANGE( 0x10067, 0x10067 ) AM_READ_PORT("DSW2") // DSW + AM_RANGE( 0x10070, 0x10071 ) AM_DEVWRITE("ym2413", ym2413_device, write) // +// AM_RANGE( 0x10080, 0x10080 ) // ? 0,1,6 (bit 0 = screen disable?) ADDRESS_MAP_END @@ -4244,7 +4169,6 @@ MACHINE_START_MEMBER(dynax_state,dynax) save_item(NAME(m_tenkai_70)); save_item(NAME(m_gekisha_val)); save_item(NAME(m_palette_ram)); - save_item(NAME(m_gekisha_rom_enable)); } MACHINE_RESET_MEMBER(dynax_state,dynax) @@ -4280,7 +4204,6 @@ MACHINE_RESET_MEMBER(dynax_state,dynax) m_tenkai_70 = 0; m_gekisha_val[0] = 0; m_gekisha_val[1] = 0; - m_gekisha_rom_enable = 0; memset(m_palette_ram, 0, ARRAY_LENGTH(m_palette_ram)); } @@ -4939,13 +4862,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(dynax_state::tenkai_interrupt) m_maincpu->set_input_line(INPUT_LINE_IRQ1, HOLD_LINE); } -MACHINE_START_MEMBER(dynax_state,tenkai) -{ - MACHINE_START_CALL_MEMBER(dynax); - - machine().save().register_postload(save_prepost_delegate(FUNC(dynax_state::tenkai_update_rombank), this)); -} - WRITE_LINE_MEMBER(dynax_state::tenkai_rtc_irq) { m_maincpu->set_input_line(INPUT_LINE_IRQ2, HOLD_LINE); @@ -4967,7 +4883,13 @@ static MACHINE_CONFIG_START( tenkai ) MCFG_TLCS90_PORT_P8_WRITE_CB(WRITE8(dynax_state, tenkai_p8_w)) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", dynax_state, tenkai_interrupt, "screen", 0, 1) - MCFG_MACHINE_START_OVERRIDE(dynax_state,tenkai) + MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(tenkai_banked_map) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(20) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x8000) + + MCFG_MACHINE_START_OVERRIDE(dynax_state,dynax) MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) MCFG_NVRAM_ADD_0FILL("nvram") @@ -5024,25 +4946,6 @@ MACHINE_CONFIG_END Mahjong Gekisha ***************************************************************************/ -void dynax_state::gekisha_bank_postload() -{ - gekisha_set_rombank(m_rombank); -} - -MACHINE_START_MEMBER(dynax_state,gekisha) -{ - MACHINE_START_CALL_MEMBER(dynax); - - machine().save().register_postload(save_prepost_delegate(FUNC(dynax_state::gekisha_bank_postload), this)); -} - -MACHINE_RESET_MEMBER(dynax_state,gekisha) -{ - MACHINE_RESET_CALL_MEMBER(dynax); - - gekisha_set_rombank(0); -} - static MACHINE_CONFIG_START( gekisha ) /* basic machine hardware */ @@ -5051,8 +4954,14 @@ static MACHINE_CONFIG_START( gekisha ) MCFG_TLCS90_PORT_P4_WRITE_CB(WRITE8(dynax_state, gekisha_p4_w)) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, irq0_line_hold) - MCFG_MACHINE_START_OVERRIDE(dynax_state,gekisha) - MCFG_MACHINE_RESET_OVERRIDE(dynax_state,gekisha) + MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(gekisha_banked_map) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(17) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x8000) + + MCFG_MACHINE_START_OVERRIDE(dynax_state,dynax) + MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) MCFG_NVRAM_ADD_0FILL("nvram") diff --git a/src/mame/includes/dynax.h b/src/mame/includes/dynax.h index f807e1787d7..28d0024da6e 100644 --- a/src/mame/includes/dynax.h +++ b/src/mame/includes/dynax.h @@ -7,6 +7,7 @@ ***************************************************************************/ #include "machine/74259.h" +#include "machine/bankdev.h" #include "machine/msm6242.h" #include "sound/ym2413.h" #include "sound/msm5205.h" @@ -27,6 +28,7 @@ public: , m_palette(*this, "palette") , m_rtc(*this, "rtc") , m_mainlatch(*this, "mainlatch") + , m_bankdev(*this, "bankdev") , m_gfx_region1(*this, "gfx1") , m_gfx_region2(*this, "gfx2") , m_gfx_region3(*this, "gfx3") @@ -49,6 +51,7 @@ public: required_device m_palette; optional_device m_rtc; optional_device m_mainlatch; + optional_device m_bankdev; optional_region_ptr m_gfx_region1; optional_region_ptr m_gfx_region2; optional_region_ptr m_gfx_region3; @@ -137,8 +140,6 @@ public: int m_tenkai_6c; int m_tenkai_70; uint8_t m_gekisha_val[2]; - uint8_t m_gekisha_rom_enable; - uint8_t *m_romptr; uint8_t *m_hnoridur_ptr; DECLARE_WRITE8_MEMBER(dynax_vblank_ack_w); @@ -196,8 +197,6 @@ public: DECLARE_WRITE8_MEMBER(tenkai_p7_w); DECLARE_WRITE8_MEMBER(tenkai_p8_w); DECLARE_READ8_MEMBER(tenkai_p8_r); - DECLARE_READ8_MEMBER(tenkai_8000_r); - DECLARE_WRITE8_MEMBER(tenkai_8000_w); DECLARE_WRITE_LINE_MEMBER(tenkai_6c_w); DECLARE_WRITE_LINE_MEMBER(tenkai_70_w); DECLARE_WRITE8_MEMBER(tenkai_blit_romregion_w); @@ -206,8 +205,6 @@ public: DECLARE_READ8_MEMBER(gekisha_keyboard_1_r); DECLARE_WRITE8_MEMBER(gekisha_hopper_w); DECLARE_WRITE8_MEMBER(gekisha_p4_w); - DECLARE_READ8_MEMBER(gekisha_8000_r); - DECLARE_WRITE8_MEMBER(gekisha_8000_w); DECLARE_WRITE8_MEMBER(dynax_extra_scrollx_w); DECLARE_WRITE8_MEMBER(dynax_extra_scrolly_w); DECLARE_WRITE8_MEMBER(dynax_blit_pen_w); @@ -276,7 +273,6 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(tenkai_interrupt); void tenkai_update_rombank(); - void gekisha_bank_postload(); DECLARE_WRITE_LINE_MEMBER(sprtmtch_sound_callback); DECLARE_WRITE_LINE_MEMBER(jantouki_sound_callback); @@ -286,9 +282,6 @@ public: DECLARE_MACHINE_RESET(adpcm); DECLARE_WRITE8_MEMBER(adpcm_reset_w); DECLARE_WRITE_LINE_MEMBER(adpcm_reset_kludge_w); - DECLARE_MACHINE_START(gekisha); - DECLARE_MACHINE_RESET(gekisha); - DECLARE_MACHINE_START(tenkai); DECLARE_WRITE8_MEMBER(tenkai_dswsel_w); DECLARE_READ8_MEMBER(tenkai_dsw_r); DECLARE_WRITE_LINE_MEMBER(tenkai_rtc_irq);