diff options
Diffstat (limited to 'src/mame/drivers/konmedal.cpp')
-rw-r--r-- | src/mame/drivers/konmedal.cpp | 115 |
1 files changed, 98 insertions, 17 deletions
diff --git a/src/mame/drivers/konmedal.cpp b/src/mame/drivers/konmedal.cpp index e8449a2f1da..72c558a1316 100644 --- a/src/mame/drivers/konmedal.cpp +++ b/src/mame/drivers/konmedal.cpp @@ -27,6 +27,7 @@ Konami Custom chips: #include "cpu/z80/z80.h" #include "machine/eepromser.h" #include "machine/gen_latch.h" +#include "machine/timer.h" #include "sound/ymz280b.h" #include "sound/okim6295.h" #include "sound/k051649.h" @@ -68,8 +69,15 @@ public: K056832_CB_MEMBER(tile_callback); K052109_CB_MEMBER(shuriboy_tile_callback); - INTERRUPT_GEN_MEMBER(shuriboy_interrupt); + TIMER_DEVICE_CALLBACK_MEMBER(scanline); DECLARE_WRITE8_MEMBER(shuri_bank_w); + DECLARE_READ8_MEMBER(shuri_video_r); + DECLARE_WRITE8_MEMBER(shuri_video_w); + DECLARE_WRITE8_MEMBER(shuri_control_w); + DECLARE_WRITE8_MEMBER(shuri_vrom_addr_w); + DECLARE_WRITE8_MEMBER(shuri_vrom_bank_w); + DECLARE_READ8_MEMBER(shuri_irq_r); + DECLARE_WRITE8_MEMBER(shuri_irq_w); protected: virtual void machine_start() override; @@ -84,7 +92,8 @@ private: optional_device<ymz280b_device> m_ymz; optional_device<okim6295_device> m_oki; - u8 m_control, m_control2; + u8 m_control, m_control2, m_shuri_irq; + u32 m_vrom_base; }; WRITE8_MEMBER(konmedal_state::control2_w) @@ -248,6 +257,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( shuriboy_main, AS_PROGRAM, 8, konmedal_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_REGION("maincpu", 0) AM_RANGE(0x8000, 0x87ff) AM_RAM + AM_RANGE(0x8b00, 0x8b00) AM_WRITENOP // watchdog? AM_RANGE(0x8c00, 0x8c00) AM_WRITE(shuri_bank_w) AM_RANGE(0x9800, 0x987f) AM_DEVREADWRITE("k051649", k051649_device, k051649_waveform_r, k051649_waveform_w) AM_RANGE(0x9880, 0x9889) AM_DEVWRITE("k051649", k051649_device, k051649_frequency_w) @@ -255,7 +265,12 @@ static ADDRESS_MAP_START( shuriboy_main, AS_PROGRAM, 8, konmedal_state ) AM_RANGE(0x988f, 0x988f) AM_DEVWRITE("k051649", k051649_device, k051649_keyonoff_w) AM_RANGE(0x98e0, 0x98ff) AM_DEVREADWRITE("k051649", k051649_device, k051649_test_r, k051649_test_w) AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank1") - AM_RANGE(0xc000, 0xffff) AM_DEVREADWRITE("k052109", k052109_device, read, write) + AM_RANGE(0xc000, 0xdbff) AM_DEVREADWRITE("k052109", k052109_device, read, write) + AM_RANGE(0xdd00, 0xdd00) AM_READWRITE(shuri_irq_r, shuri_irq_w) + AM_RANGE(0xdd80, 0xdd80) AM_WRITE(shuri_control_w) + AM_RANGE(0xde00, 0xde00) AM_WRITE(shuri_vrom_addr_w) + AM_RANGE(0xdf00, 0xdf00) AM_WRITE(shuri_vrom_bank_w) + AM_RANGE(0xe000, 0xffff) AM_READWRITE(shuri_video_r, shuri_video_w) ADDRESS_MAP_END static INPUT_PORTS_START( konmedal ) @@ -349,6 +364,8 @@ MACHINE_START_MEMBER(konmedal_state, shuriboy) void konmedal_state::machine_reset() { + m_vrom_base = 0; + m_control = m_control2 = m_shuri_irq = 0; } static MACHINE_CONFIG_START( tsukande ) @@ -435,13 +452,7 @@ Dips: 2 x 8 dips bank K052109_CB_MEMBER(konmedal_state::shuriboy_tile_callback) { *code |= ((*color & 0x03) << 8) | ((*color & 0x10) << 6) | ((*color & 0x0c) << 9) | (bank << 13); -// *color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5); -} - -INTERRUPT_GEN_MEMBER(konmedal_state::shuriboy_interrupt) -{ - if (m_k052109->is_irq_enabled()) - device.execute().set_input_line(0, HOLD_LINE); +// *color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5); } WRITE8_MEMBER(konmedal_state::shuri_bank_w) @@ -450,16 +461,85 @@ WRITE8_MEMBER(konmedal_state::shuri_bank_w) membank("bank1")->set_entry(data&0x3); } +READ8_MEMBER(konmedal_state::shuri_video_r) +{ + if (!(m_control & 0x10)) + { + return m_k052109->read(space, offset+0x2000); + } + + uint8_t *ROM = memregion("k052109")->base(); + return ROM[offset + m_vrom_base]; +} + +WRITE8_MEMBER(konmedal_state::shuri_video_w) +{ + m_k052109->write(space, offset+0x2000, data); +} + +READ8_MEMBER(konmedal_state::shuri_irq_r) +{ + return m_shuri_irq; +} + +WRITE8_MEMBER(konmedal_state::shuri_irq_w) +{ + if ((m_shuri_irq & 0x4) && !(data & 0x4)) + { + m_maincpu->set_input_line(0, CLEAR_LINE); + } + else if ((m_shuri_irq & 0x1) && !(data & 0x1)) + { + m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + } + + m_shuri_irq = data; +} + +TIMER_DEVICE_CALLBACK_MEMBER(konmedal_state::scanline) +{ + int scanline = param; + + if ((scanline == 240) && (m_shuri_irq & 0x4)) + { + m_maincpu->set_input_line(0, ASSERT_LINE); + + } + + if ((scanline == 255) && (m_shuri_irq & 0x1)) + { + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + } +} + +WRITE8_MEMBER(konmedal_state::shuri_control_w) +{ + m_control = data; +} + +WRITE8_MEMBER(konmedal_state::shuri_vrom_addr_w) +{ + m_vrom_base &= ~0xf000; + m_vrom_base |= (data << 12); +} + +WRITE8_MEMBER(konmedal_state::shuri_vrom_bank_w) +{ + m_vrom_base &= ~0xf0000; + data &= 0xc0; + m_vrom_base |= (data << 10); +} + static MACHINE_CONFIG_START( shuriboy ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_24MHz / 3) // divisor unknown MCFG_CPU_PROGRAM_MAP(shuriboy_main) - MCFG_CPU_VBLANK_INT_DRIVER("screen", konmedal_state, shuriboy_interrupt) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", konmedal_state, scanline, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) // everything not verified, just a placeholder MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(30)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(80, 400-1, 16, 240-1) MCFG_SCREEN_UPDATE_DRIVER(konmedal_state, screen_update_shuriboy) @@ -531,10 +611,10 @@ ROM_START( shuriboy ) ROM_LOAD( "gs-341-b01.13g", 0x000000, 0x010000, CRC(3c0f36b6) SHA1(1d3838f45969228a8b2054cd5baf8892db68b644) ) ROM_REGION( 0x40000, "k052109", 0 ) /* tilemaps */ - ROM_LOAD32_BYTE( "341-A03.2H", 0x000002, 0x010000, CRC(8e9e9835) SHA1(f8dc4579f238d91c0aef59167be7e5de87dc4ba7) ) - ROM_LOAD32_BYTE( "341-A04.4H", 0x000003, 0x010000, CRC(ac82d67b) SHA1(65869adfbb67cf10c92e50239fd747fc5ad4714d) ) - ROM_LOAD32_BYTE( "341-A05.5H", 0x000000, 0x010000, CRC(31403832) SHA1(d13c54d3768a0c2d60a3751db8980199f60db243) ) - ROM_LOAD32_BYTE( "341-A06.7H", 0x000001, 0x010000, CRC(361e26eb) SHA1(7b5ad6a6067afb3350d85a3f2026e4d685429e20) ) + ROM_LOAD32_BYTE( "341-A03.2H", 0x000000, 0x010000, CRC(8e9e9835) SHA1(f8dc4579f238d91c0aef59167be7e5de87dc4ba7) ) + ROM_LOAD32_BYTE( "341-A04.4H", 0x000001, 0x010000, CRC(ac82d67b) SHA1(65869adfbb67cf10c92e50239fd747fc5ad4714d) ) + ROM_LOAD32_BYTE( "341-A05.5H", 0x000002, 0x010000, CRC(31403832) SHA1(d13c54d3768a0c2d60a3751db8980199f60db243) ) + ROM_LOAD32_BYTE( "341-A06.7H", 0x000003, 0x010000, CRC(361e26eb) SHA1(7b5ad6a6067afb3350d85a3f2026e4d685429e20) ) ROM_REGION( 0x200000, "upd", 0 ) ROM_LOAD( "341-A02.13C", 0x000000, 0x020000, CRC(e1f5c8f1) SHA1(323a078720e09a7326e82cb623b6c90e2674e800) ) @@ -542,4 +622,5 @@ ROM_END GAME( 1995, tsukande, 0, tsukande, konmedal, konmedal_state, 0, ROT0, "Konami", "Tsukande Toru Chicchi", MACHINE_NOT_WORKING) GAME( 1995, ddboy, 0, ddboy, konmedal, konmedal_state, 0, ROT0, "Konami", "Dam Dam Boy", MACHINE_NOT_WORKING) -GAME( 1993, shuriboy, 0, shuriboy, konmedal, konmedal_state, 0, ROT0, "Konami", "Shuriken Boy", MACHINE_IS_SKELETON) +GAME( 1993, shuriboy, 0, shuriboy, konmedal, konmedal_state, 0, ROT0, "Konami", "Shuriken Boy", MACHINE_NOT_WORKING) + |