diff options
author | 2018-01-13 16:06:32 -0500 | |
---|---|---|
committer | 2018-01-13 16:06:32 -0500 | |
commit | 70eef438bb382697ad24b06fe3a4e358bc9d6fd1 (patch) | |
tree | e557a031742e8558df4b99d72c9049d8beb25c89 | |
parent | ec89b992547d994d6cb8351f486eb2e3f7b6c979 (diff) |
quickpick5: more progress (nw)
-rw-r--r-- | src/mame/drivers/quickpick5.cpp | 96 |
1 files changed, 70 insertions, 26 deletions
diff --git a/src/mame/drivers/quickpick5.cpp b/src/mame/drivers/quickpick5.cpp index 14c3d728538..248dfaa3419 100644 --- a/src/mame/drivers/quickpick5.cpp +++ b/src/mame/drivers/quickpick5.cpp @@ -14,7 +14,7 @@ Konami Custom chips: 051649 (SCC1 sound) - 053252 (timing/interrupt controller?) + 053252 (timing/interrupt controller) 053244 (sprites) 053245 (sprites) @@ -27,6 +27,9 @@ #include "sound/okim6295.h" #include "video/k053244_k053245.h" #include "video/konami_helper.h" +#include "machine/k053252.h" +#include "machine/nvram.h" +#include "machine/timer.h" #include "screen.h" #include "speaker.h" @@ -39,6 +42,7 @@ public: m_palette(*this, "palette"), m_k053245(*this, "k053245"), m_k051649(*this, "k051649"), + m_k053252(*this, "k053252"), m_gfxdecode(*this, "gfxdecode"), m_oki(*this, "oki"), m_ttlrom_offset(0) @@ -48,16 +52,13 @@ public: K05324X_CB_MEMBER(sprite_callback); TILE_GET_INFO_MEMBER(ttl_get_tile_info); - INTERRUPT_GEN_MEMBER(vbl_interrupt); + DECLARE_WRITE8_MEMBER(ccu_int_time_w); + TIMER_DEVICE_CALLBACK_MEMBER(scanline); READ8_MEMBER(control_r) { return m_control; } - READ8_MEMBER(inp_magic_r) { return 0xff; } - - READ8_MEMBER(irq_flag_r) { return 0xff; } - - WRITE8_MEMBER(vbl_ack_w) { m_maincpu->set_input_line(0, CLEAR_LINE); } - WRITE8_MEMBER(nmi_ack_w) { m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } + WRITE_LINE_MEMBER(vbl_ack_w) { m_maincpu->set_input_line(0, CLEAR_LINE); } + WRITE_LINE_MEMBER(nmi_ack_w) { m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } // A0 is inverted to match the Z80's endianness. Typical Konami. READ8_MEMBER(k244_r) { return m_k053245->k053244_r(space, offset^1); } @@ -88,6 +89,7 @@ private: required_device<palette_device> m_palette; required_device<k05324x_device> m_k053245; required_device<k051649_device> m_k051649; + required_device<k053252_device> m_k053252; required_device<gfxdecode_device> m_gfxdecode; required_device<okim6295_device> m_oki; @@ -96,8 +98,16 @@ private: uint8_t m_control; int m_ttlrom_offset; uint8_t m_vram[0x1000]; + bool m_title_hack; + int m_ccu_int_time, m_ccu_int_time_count; }; +WRITE8_MEMBER(quickpick5_state::ccu_int_time_w) +{ + logerror("ccu_int_time rewritten with value of %02x\n", data); + m_ccu_int_time = data; +} + READ8_MEMBER(quickpick5_state::vram_r) { if ((m_control & 0x10) == 0x10) @@ -153,12 +163,7 @@ WRITE8_MEMBER(quickpick5_state::vram_w) } m_vram[offset] = data; -} - -INTERRUPT_GEN_MEMBER(quickpick5_state::vbl_interrupt) -{ - m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - m_maincpu->set_input_line(0, ASSERT_LINE); + m_ttl_tilemap->mark_tile_dirty(offset>>1); } void quickpick5_state::video_start() @@ -189,8 +194,12 @@ void quickpick5_state::video_start() m_ttl_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(quickpick5_state::ttl_get_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); m_ttl_tilemap->set_transparent_pen(0); + m_ttl_tilemap->set_scrollx(80); + m_ttl_tilemap->set_scrolly(28); m_ttlrom_offset = 0; + m_ccu_int_time_count = 0; + m_ccu_int_time = 20; } TILE_GET_INFO_MEMBER(quickpick5_state::ttl_get_tile_info) @@ -210,11 +219,14 @@ uint32_t quickpick5_state::screen_update_quickpick5(screen_device &screen, bitma { bitmap.fill(0, cliprect); screen.priority().fill(0, cliprect); - - m_ttl_tilemap->mark_all_dirty(); - m_ttl_tilemap->draw(screen, bitmap, cliprect, 0, 0xff); + m_title_hack = false; m_k053245->sprites_draw(bitmap, cliprect, screen.priority()); + if (!m_title_hack) + { + m_ttl_tilemap->draw(screen, bitmap, cliprect, 0, 0xff); + } + return 0; } @@ -222,19 +234,44 @@ K05324X_CB_MEMBER(quickpick5_state::sprite_callback) { *code = (*code & 0x7ff); *color = (*color & 0x003f); + + if (*code == 0x520) + { + m_title_hack = true; + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(quickpick5_state::scanline) +{ + int scanline = param; + + // z80 /IRQ is connected to the IRQ1(vblank) pin of k053252 CCU + if(scanline == 255) + { + m_maincpu->set_input_line(0, ASSERT_LINE); + } + + // z80 /NMI is connected to the IRQ2 pin of k053252 CCU + // the following code is emulating INT_TIME of the k053252, this code will go away + // when the new konami branch is merged. + m_ccu_int_time_count--; + if (m_ccu_int_time_count <= 0) + { + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + m_ccu_int_time_count = m_ccu_int_time; + } } static ADDRESS_MAP_START( quickpick5_main, AS_PROGRAM, 8, quickpick5_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_REGION("maincpu", 0) AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") - AM_RANGE(0xc000, 0xdbff) AM_RAM + AM_RANGE(0xc000, 0xdbff) AM_RAM AM_SHARE("nvram") + AM_RANGE(0xdc00, 0xdc0f) AM_DEVREADWRITE("k053252", k053252_device, read, write) AM_RANGE(0xdc40, 0xdc4f) AM_READWRITE(k244_r, k244_w) AM_RANGE(0xdc80, 0xdc80) AM_READ_PORT("DSW3") AM_RANGE(0xdc81, 0xdc81) AM_READ_PORT("DSW4") AM_RANGE(0xdcc0, 0xdcc0) AM_READ_PORT("DSW1") AM_RANGE(0xdcc1, 0xdcc1) AM_READ_PORT("DSW2") - AM_RANGE(0xdc0e, 0xdc0e) AM_READWRITE(irq_flag_r, nmi_ack_w) - AM_RANGE(0xdc0f, 0xdc0f) AM_READWRITE(irq_flag_r, vbl_ack_w) AM_RANGE(0xdd00, 0xdd00) AM_WRITENOP AM_RANGE(0xdd40, 0xdd40) AM_NOP AM_RANGE(0xdd80, 0xdd80) AM_READWRITE(control_r, control_w) @@ -362,14 +399,19 @@ static MACHINE_CONFIG_START( quickpick5 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_32MHz/4) // z84c0008pec 8mhz part, 32Mhz xtal verified on PCB, divisor unknown MCFG_CPU_PROGRAM_MAP(quickpick5_main) - MCFG_CPU_VBLANK_INT_DRIVER("screen", quickpick5_state, vbl_interrupt) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", quickpick5_state, scanline, "screen", 0, 1) + + MCFG_DEVICE_ADD("k053252", K053252, XTAL_32MHz/4) /* K053252, xtal verified, divider not verified */ + MCFG_K053252_INT1_ACK_CB(WRITELINE(quickpick5_state, vbl_ack_w)) + MCFG_K053252_INT2_ACK_CB(WRITELINE(quickpick5_state, nmi_ack_w)) + MCFG_K053252_INT_TIME_CB(WRITE8(quickpick5_state, ccu_int_time_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.62) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(20)) MCFG_SCREEN_SIZE(64*8, 33*8) - MCFG_SCREEN_VISIBLE_AREA(88, 456-1, 24, 264-1) + MCFG_SCREEN_VISIBLE_AREA(88, 456-1, 28, 256-1) MCFG_SCREEN_UPDATE_DRIVER(quickpick5_state, screen_update_quickpick5) MCFG_SCREEN_PALETTE("palette") @@ -379,17 +421,19 @@ static MACHINE_CONFIG_START( quickpick5 ) MCFG_DEVICE_ADD("k053245", K053245, 0) MCFG_GFX_PALETTE("palette") - MCFG_K05324X_OFFSETS(-44, -8) + MCFG_K05324X_OFFSETS(-(44+80), 20) MCFG_K05324X_CB(quickpick5_state, sprite_callback) MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty) + MCFG_NVRAM_ADD_0FILL("nvram") + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_K051649_ADD("k051649", XTAL_32MHz/16) + MCFG_K051649_ADD("k051649", XTAL_32MHz/18) // xtal is verified, divider is not MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45) - MCFG_OKIM6295_ADD("oki", XTAL_32MHz/16, PIN7_HIGH) + MCFG_OKIM6295_ADD("oki", XTAL_32MHz/18, PIN7_HIGH) MCFG_SOUND_ROUTE(0, "mono", 1.0) MCFG_SOUND_ROUTE(1, "mono", 1.0) MACHINE_CONFIG_END |