From 7b2f0a616640a722f184a04f9697c2515fbbaf5a Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 17 Nov 2018 16:25:36 +0900 Subject: karnov.cpp : Cleanups Convert background tilemap into generic MAME tilemap system, Cleanup handlers, Reduce unnecessary values, address_space arguments, Duplicates, Region sizes --- src/mame/drivers/karnov.cpp | 282 +++++++++++++++++++------------------------- src/mame/includes/karnov.h | 24 ++-- src/mame/video/karnov.cpp | 92 ++++----------- 3 files changed, 157 insertions(+), 241 deletions(-) diff --git a/src/mame/drivers/karnov.cpp b/src/mame/drivers/karnov.cpp index 47ca81c4310..40109973f03 100644 --- a/src/mame/drivers/karnov.cpp +++ b/src/mame/drivers/karnov.cpp @@ -334,92 +334,60 @@ void karnov_state::chelnov_i8751_w( int data ) * *************************************/ -WRITE16_MEMBER(karnov_state::karnov_control_w) +WRITE16_MEMBER(karnov_state::mcu_ack_w) { - /* Mnemonics filled in from the schematics, brackets are my comments */ - switch (offset << 1) - { - case 0: /* SECLR (Interrupt ack for Level 6 i8751 interrupt) */ - m_maincpu->set_input_line(6, CLEAR_LINE); + m_maincpu->set_input_line(6, CLEAR_LINE); - if (m_i8751_needs_ack) - { - /* If a command and coin insert happen at once, then the i8751 will queue the coin command until the previous command is ACK'd */ - if (m_i8751_coin_pending) - { - m_i8751_return = m_i8751_coin_pending; - m_maincpu->set_input_line(6, HOLD_LINE); - m_i8751_coin_pending = 0; - } - else if (m_i8751_command_queue) - { - /* Pending control command - just write it back as SECREQ */ - m_i8751_needs_ack = 0; - karnov_control_w(space, 3, m_i8751_command_queue, 0xffff); - m_i8751_command_queue = 0; - } - else - { - m_i8751_needs_ack = 0; - } - } - return; - - case 2: /* SONREQ (Sound CPU byte) */ - m_soundlatch->write(space, 0, data & 0xff); - break; - - case 4: /* DM (DMA to buffer spriteram) */ - m_spriteram->copy(); - break; - - case 6: /* SECREQ (Interrupt & Data to i8751) */ - if (m_microcontroller_id == KARNOV || m_microcontroller_id == KARNOVJ) - karnov_i8751_w(data); - if (m_microcontroller_id == CHELNOV || m_microcontroller_id == CHELNOVU || m_microcontroller_id == CHELNOVJ) - chelnov_i8751_w(data); - if (m_microcontroller_id == WNDRPLNT) - wndrplnt_i8751_w(data); - break; - - case 8: /* HSHIFT (9 bits) - Top bit indicates video flip */ - COMBINE_DATA(&m_scroll[0]); - karnov_flipscreen_w(data >> 15); - break; - - case 0xa: /* VSHIFT */ - COMBINE_DATA(&m_scroll[1]); - break; - - case 0xc: /* SECR (Reset i8751) */ - logerror("Reset i8751\n"); - m_i8751_needs_ack = 0; + if (m_i8751_needs_ack) + { + /* If a command and coin insert happen at once, then the i8751 will queue the coin command until the previous command is ACK'd */ + if (m_i8751_coin_pending) + { + m_i8751_return = m_i8751_coin_pending; + m_maincpu->set_input_line(6, HOLD_LINE); m_i8751_coin_pending = 0; + } + else if (m_i8751_command_queue) + { + /* Pending control command - just write it back as SECREQ */ + m_i8751_needs_ack = 0; + mcu_w(m_i8751_command_queue); m_i8751_command_queue = 0; - m_i8751_return = 0; - break; - - case 0xe: /* INTCLR (Interrupt ack for Level 7 vbl interrupt) */ - m_maincpu->set_input_line(7, CLEAR_LINE); - break; + } + else + { + m_i8751_needs_ack = 0; + } } } -READ16_MEMBER(karnov_state::karnov_control_r) +u16 karnov_state::mcu_r() { - switch (offset << 1) - { - case 0: - return ioport("P1_P2")->read(); - case 2: /* Start buttons & VBL */ - return ioport("SYSTEM")->read(); - case 4: - return ioport("DSW")->read(); - case 6: /* i8751 return values */ - return m_i8751_return; - } + return m_i8751_return; +} - return ~0; +void karnov_state::mcu_w(u16 data) +{ + if (m_microcontroller_id == KARNOV || m_microcontroller_id == KARNOVJ) + karnov_i8751_w(data); + if (m_microcontroller_id == CHELNOV || m_microcontroller_id == CHELNOVU || m_microcontroller_id == CHELNOVJ) + chelnov_i8751_w(data); + if (m_microcontroller_id == WNDRPLNT) + wndrplnt_i8751_w(data); +} + +WRITE16_MEMBER(karnov_state::mcu_reset_w) +{ + logerror("Reset i8751\n"); + m_i8751_needs_ack = 0; + m_i8751_coin_pending = 0; + m_i8751_command_queue = 0; + m_i8751_return = 0; +} + +WRITE16_MEMBER(karnov_state::vint_ack_w) +{ + m_maincpu->set_input_line(7, CLEAR_LINE); } /************************************* @@ -433,12 +401,19 @@ void karnov_state::karnov_map(address_map &map) map(0x000000, 0x05ffff).rom(); map(0x060000, 0x063fff).ram().share("ram"); map(0x080000, 0x080fff).ram().share("spriteram"); - map(0x0a0000, 0x0a07ff).ram().w(FUNC(karnov_state::karnov_videoram_w)).share("videoram"); - map(0x0a0800, 0x0a0fff).w(FUNC(karnov_state::karnov_videoram_w)); /* Wndrplnt Mirror */ - map(0x0a1000, 0x0a17ff).writeonly().share("pf_data"); - map(0x0a1800, 0x0a1fff).w(FUNC(karnov_state::karnov_playfield_swap_w)); - map(0x0c0000, 0x0c0007).r(FUNC(karnov_state::karnov_control_r)); - map(0x0c0000, 0x0c000f).w(FUNC(karnov_state::karnov_control_w)); + map(0x0a0000, 0x0a07ff).ram().w(FUNC(karnov_state::videoram_w)).share("videoram"); + map(0x0a0800, 0x0a0fff).w(FUNC(karnov_state::videoram_w)); /* Wndrplnt Mirror */ + map(0x0a1000, 0x0a17ff).w(FUNC(karnov_state::playfield_w)).share("pf_data"); + map(0x0a1800, 0x0a1fff).lw16("pf_col_w", [this](offs_t offset, u16 data, u16 mem_mask) + { playfield_w(((offset & 0x1f) << 5) | ((offset & 0x3e0) >> 5), data, mem_mask); }); + map(0x0c0000, 0x0c0001).portr("P1_P2").w(FUNC(karnov_state::mcu_ack_w)); + map(0x0c0002, 0x0c0003).portr("SYSTEM"); + map(0x0c0003, 0x0c0003).w(m_soundlatch, FUNC(generic_latch_8_device::write)); + map(0x0c0004, 0x0c0005).portr("DSW").w(m_spriteram, FUNC(buffered_spriteram16_device::write)); + map(0x0c0006, 0x0c0007).rw(FUNC(karnov_state::mcu_r), FUNC(karnov_state::mcu_w)); + map(0x0c0008, 0x0c000b).writeonly().share("scroll"); + map(0x0c000c, 0x0c000d).w(FUNC(karnov_state::mcu_reset_w)); + map(0x0c000e, 0x0c000f).w(FUNC(karnov_state::vint_ack_w)); } @@ -694,44 +669,30 @@ INPUT_PORTS_END static const gfx_layout chars = { 8,8, - 1024, + RGN_FRAC(1,4), 3, - { 0x6000*8,0x4000*8,0x2000*8 }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + { RGN_FRAC(3,4),RGN_FRAC(2,4),RGN_FRAC(1,4) }, + { STEP8(0,1) }, + { STEP8(0,8) }, 8*8 /* every sprite takes 8 consecutive bytes */ }; -static const gfx_layout sprites = -{ - 16,16, - 4096, - 4, - { 0x60000*8,0x00000*8,0x20000*8,0x40000*8 }, - { 16*8, 1+(16*8), 2+(16*8), 3+(16*8), 4+(16*8), 5+(16*8), 6+(16*8), 7+(16*8), - 0,1,2,3,4,5,6,7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 ,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8}, - 16*16 -}; - - /* 16x16 tiles, 4 Planes, each plane is 0x10000 bytes */ static const gfx_layout tiles = { 16,16, - 2048, + RGN_FRAC(1,4), 4, - { 0x30000*8,0x00000*8,0x10000*8,0x20000*8 }, - { 16*8, 1+(16*8), 2+(16*8), 3+(16*8), 4+(16*8), 5+(16*8), 6+(16*8), 7+(16*8), - 0,1,2,3,4,5,6,7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 ,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8}, + { RGN_FRAC(3,4),0,RGN_FRAC(1,4),RGN_FRAC(2,4) }, + { STEP8(16*8,1), STEP8(0,1) }, + { STEP16(0,8) }, 16*16 }; static GFXDECODE_START( gfx_karnov ) - GFXDECODE_ENTRY( "gfx1", 0, chars, 0, 4 ) /* colors 0-31 */ - GFXDECODE_ENTRY( "gfx2", 0, tiles, 512, 16 ) /* colors 512-767 */ - GFXDECODE_ENTRY( "gfx3", 0, sprites, 256, 16 ) /* colors 256-511 */ + GFXDECODE_ENTRY( "gfx1", 0, chars, 0, 4 ) /* colors 0-31 */ + GFXDECODE_ENTRY( "gfx2", 0, tiles, 512, 16 ) /* colors 512-767 */ + GFXDECODE_ENTRY( "gfx3", 0, tiles, 256, 16 ) /* colors 256-511 */ GFXDECODE_END @@ -780,9 +741,6 @@ WRITE_LINE_MEMBER(karnov_state::vbint_w) void karnov_state::machine_start() { - save_item(NAME(m_flipscreen)); - save_item(NAME(m_scroll)); - save_item(NAME(m_i8751_return)); save_item(NAME(m_i8751_needs_ack)); save_item(NAME(m_i8751_coin_pending)); @@ -803,7 +761,6 @@ void karnov_state::machine_reset() m_i8751_level = 0; // m_latch = 0; - m_flipscreen = 0; m_scroll[0] = 0; m_scroll[1] = 0; } @@ -827,7 +784,7 @@ MACHINE_CONFIG_START(karnov_state::karnov) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE_DRIVER(karnov_state, screen_update_karnov) + MCFG_SCREEN_UPDATE_DRIVER(karnov_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, karnov_state, vbint_w)) @@ -896,7 +853,6 @@ MACHINE_CONFIG_START(karnov_state::wndrplnt) MCFG_DEVICE_ADD("audiocpu", M6502, 1500000) /* Accurate */ MCFG_DEVICE_PROGRAM_MAP(karnov_sound_map) - /* video hardware */ MCFG_DEVICE_ADD("spriteram", BUFFERED_SPRITERAM16) @@ -905,7 +861,7 @@ MACHINE_CONFIG_START(karnov_state::wndrplnt) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE_DRIVER(karnov_state, screen_update_karnov) + MCFG_SCREEN_UPDATE_DRIVER(karnov_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, karnov_state, vbint_w)) @@ -963,15 +919,15 @@ ROM_START( karnov ) ROM_LOAD( "dn03-", 0x20000, 0x10000, CRC(90d9dd9c) SHA1(00a3bed276927f099d57e90f28fd77bd41a3c360) ) ROM_LOAD( "dn02-", 0x30000, 0x10000, CRC(1e04d7b9) SHA1(a2c6fde42569a52cc6d9a86715dea4a8bea80092) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x60000, "gfx3", 0 ) ROM_LOAD( "dn12-", 0x00000, 0x10000, CRC(9806772c) SHA1(01f17fa033262a3e64e0675cc4e20b3c3f4b254d) ) /* Sprites - 2 sets of 4, interleaved here */ ROM_LOAD( "dn14-5", 0x10000, 0x08000, CRC(ac9e6732) SHA1(6f61344eb8a13349471145dee252a01aadb8cdf0) ) - ROM_LOAD( "dn13-", 0x20000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) - ROM_LOAD( "dn15-5", 0x30000, 0x08000, CRC(8933fcb8) SHA1(0dbda4b032ed3776d7633264f39e6f00ace7a238) ) - ROM_LOAD( "dn16-", 0x40000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) - ROM_LOAD( "dn17-5", 0x50000, 0x08000, CRC(b70ae950) SHA1(1ec833bdad12710ea846ef48dddbe2e1ae6b8ce1) ) - ROM_LOAD( "dn18-", 0x60000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) - ROM_LOAD( "dn19-5", 0x70000, 0x08000, CRC(8fd4fa40) SHA1(1870fb0c5c64fbc53a10115f0f3c7624cf2465db) ) + ROM_LOAD( "dn13-", 0x18000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) + ROM_LOAD( "dn15-5", 0x28000, 0x08000, CRC(8933fcb8) SHA1(0dbda4b032ed3776d7633264f39e6f00ace7a238) ) + ROM_LOAD( "dn16-", 0x30000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) + ROM_LOAD( "dn17-5", 0x40000, 0x08000, CRC(b70ae950) SHA1(1ec833bdad12710ea846ef48dddbe2e1ae6b8ce1) ) + ROM_LOAD( "dn18-", 0x48000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) + ROM_LOAD( "dn19-5", 0x58000, 0x08000, CRC(8fd4fa40) SHA1(1870fb0c5c64fbc53a10115f0f3c7624cf2465db) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "karnprom.21", 0x0000, 0x0400, CRC(aab0bb93) SHA1(545707fbb1007fca1fe297c5fce61e485e7084fc) ) @@ -1002,15 +958,15 @@ ROM_START( karnova ) ROM_LOAD( "dn03-", 0x20000, 0x10000, CRC(90d9dd9c) SHA1(00a3bed276927f099d57e90f28fd77bd41a3c360) ) ROM_LOAD( "dn02-", 0x30000, 0x10000, CRC(1e04d7b9) SHA1(a2c6fde42569a52cc6d9a86715dea4a8bea80092) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x60000, "gfx3", 0 ) ROM_LOAD( "dn12-", 0x00000, 0x10000, CRC(9806772c) SHA1(01f17fa033262a3e64e0675cc4e20b3c3f4b254d) ) /* Sprites - 2 sets of 4, interleaved here */ ROM_LOAD( "dn14-5", 0x10000, 0x08000, CRC(ac9e6732) SHA1(6f61344eb8a13349471145dee252a01aadb8cdf0) ) - ROM_LOAD( "dn13-", 0x20000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) - ROM_LOAD( "dn15-5", 0x30000, 0x08000, CRC(8933fcb8) SHA1(0dbda4b032ed3776d7633264f39e6f00ace7a238) ) - ROM_LOAD( "dn16-", 0x40000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) - ROM_LOAD( "dn17-5", 0x50000, 0x08000, CRC(b70ae950) SHA1(1ec833bdad12710ea846ef48dddbe2e1ae6b8ce1) ) - ROM_LOAD( "dn18-", 0x60000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) - ROM_LOAD( "dn19-5", 0x70000, 0x08000, CRC(8fd4fa40) SHA1(1870fb0c5c64fbc53a10115f0f3c7624cf2465db) ) + ROM_LOAD( "dn13-", 0x18000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) + ROM_LOAD( "dn15-5", 0x28000, 0x08000, CRC(8933fcb8) SHA1(0dbda4b032ed3776d7633264f39e6f00ace7a238) ) + ROM_LOAD( "dn16-", 0x30000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) + ROM_LOAD( "dn17-5", 0x40000, 0x08000, CRC(b70ae950) SHA1(1ec833bdad12710ea846ef48dddbe2e1ae6b8ce1) ) + ROM_LOAD( "dn18-", 0x48000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) + ROM_LOAD( "dn19-5", 0x58000, 0x08000, CRC(8fd4fa40) SHA1(1870fb0c5c64fbc53a10115f0f3c7624cf2465db) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "karnprom.21", 0x0000, 0x0400, CRC(aab0bb93) SHA1(545707fbb1007fca1fe297c5fce61e485e7084fc) ) @@ -1041,15 +997,15 @@ ROM_START( karnovj ) ROM_LOAD( "dn03-", 0x20000, 0x10000, CRC(90d9dd9c) SHA1(00a3bed276927f099d57e90f28fd77bd41a3c360) ) ROM_LOAD( "dn02-", 0x30000, 0x10000, CRC(1e04d7b9) SHA1(a2c6fde42569a52cc6d9a86715dea4a8bea80092) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x60000, "gfx3", 0 ) ROM_LOAD( "dn12-", 0x00000, 0x10000, CRC(9806772c) SHA1(01f17fa033262a3e64e0675cc4e20b3c3f4b254d) ) /* Sprites - 2 sets of 4, interleaved here */ ROM_LOAD( "kar14", 0x10000, 0x08000, CRC(c6b39595) SHA1(3bc2d0a613cc1b5d255cccc3b26e21ea1c23e75b) ) - ROM_LOAD( "dn13-", 0x20000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) - ROM_LOAD( "kar15", 0x30000, 0x08000, CRC(2f72cac0) SHA1(a71e61eea77ecd3240c5217ae84e7aa3ef21288a) ) - ROM_LOAD( "dn16-", 0x40000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) - ROM_LOAD( "kar17", 0x50000, 0x08000, CRC(7851c70f) SHA1(47b7a64dd8230e95cd7ae7f661c7586c7598c356) ) - ROM_LOAD( "dn18-", 0x60000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) - ROM_LOAD( "kar19", 0x70000, 0x08000, CRC(7bc174bb) SHA1(d8bc320169fc3a9cdd3f271ea523fb0486abae2c) ) + ROM_LOAD( "dn13-", 0x18000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) + ROM_LOAD( "kar15", 0x28000, 0x08000, CRC(2f72cac0) SHA1(a71e61eea77ecd3240c5217ae84e7aa3ef21288a) ) + ROM_LOAD( "dn16-", 0x30000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) + ROM_LOAD( "kar17", 0x40000, 0x08000, CRC(7851c70f) SHA1(47b7a64dd8230e95cd7ae7f661c7586c7598c356) ) + ROM_LOAD( "dn18-", 0x48000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) + ROM_LOAD( "kar19", 0x58000, 0x08000, CRC(7bc174bb) SHA1(d8bc320169fc3a9cdd3f271ea523fb0486abae2c) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "karnprom.21", 0x0000, 0x0400, CRC(aab0bb93) SHA1(545707fbb1007fca1fe297c5fce61e485e7084fc) ) @@ -1086,15 +1042,15 @@ ROM_START( karnovjbl ) ROM_LOAD( "15.bin", 0x30000, 0x08000, CRC(04551cc8) SHA1(d0b89b55b8e139e11b79efd26edeffd8022ee385) ) ROM_LOAD( "16.bin", 0x38000, 0x08000, CRC(12bc9e09) SHA1(d2f527138d475fc7d798aaf48e08b133be090543) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x60000, "gfx3", 0 ) ROM_LOAD( "17.bin", 0x00000, 0x10000, CRC(9806772c) SHA1(01f17fa033262a3e64e0675cc4e20b3c3f4b254d) ) /* Sprites - 2 sets of 4, interleaved here */ ROM_LOAD( "19.bin", 0x10000, 0x08000, CRC(c6b39595) SHA1(3bc2d0a613cc1b5d255cccc3b26e21ea1c23e75b) ) - ROM_LOAD( "18.bin", 0x20000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) - ROM_LOAD( "20.bin", 0x30000, 0x08000, CRC(2f72cac0) SHA1(a71e61eea77ecd3240c5217ae84e7aa3ef21288a) ) - ROM_LOAD( "21.bin", 0x40000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) - ROM_LOAD( "22.bin", 0x50000, 0x08000, CRC(7851c70f) SHA1(47b7a64dd8230e95cd7ae7f661c7586c7598c356) ) - ROM_LOAD( "23.bin", 0x60000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) - ROM_LOAD( "24.bin", 0x70000, 0x08000, CRC(7bc174bb) SHA1(d8bc320169fc3a9cdd3f271ea523fb0486abae2c) ) + ROM_LOAD( "18.bin", 0x18000, 0x10000, CRC(a03308f9) SHA1(1d450725a5c488332c83d8f64a73a750ce7fe4c7) ) + ROM_LOAD( "20.bin", 0x28000, 0x08000, CRC(2f72cac0) SHA1(a71e61eea77ecd3240c5217ae84e7aa3ef21288a) ) + ROM_LOAD( "21.bin", 0x30000, 0x10000, CRC(55e63a11) SHA1(3ef0468fa02ac5382007428122216917ad5eaa0e) ) + ROM_LOAD( "22.bin", 0x40000, 0x08000, CRC(7851c70f) SHA1(47b7a64dd8230e95cd7ae7f661c7586c7598c356) ) + ROM_LOAD( "23.bin", 0x48000, 0x10000, CRC(2ad53213) SHA1(f22696920bf3d74fb0e28e2d7cb31be5e183c6b4) ) + ROM_LOAD( "24.bin", 0x58000, 0x08000, CRC(7bc174bb) SHA1(d8bc320169fc3a9cdd3f271ea523fb0486abae2c) ) ROM_REGION( 0x0800, "proms", 0 ) // not dumped for this set ROM_LOAD( "karnprom.21", 0x0000, 0x0400, CRC(aab0bb93) SHA1(545707fbb1007fca1fe297c5fce61e485e7084fc) ) @@ -1164,11 +1120,11 @@ ROM_START( chelnov ) ROM_LOAD( "ee03-.d15", 0x20000, 0x10000, CRC(7178e182) SHA1(e8f03bda417e8f2f0508df40057d39ce6ee74f16) ) ROM_LOAD( "ee02-.c18", 0x30000, 0x10000, CRC(9d7c45ae) SHA1(014dfafa6898e5fd0d124391e698b4f76d38fa94) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x40000, "gfx3", 0 ) ROM_LOAD( "ee12-.f8", 0x00000, 0x10000, CRC(9b1c53a5) SHA1(b0fdc89dc7fd0931fa4bca3bbc20fc88f637ec74) ) /* Sprites */ - ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) - ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) - ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) + ROM_LOAD( "ee13-.f9", 0x10000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) + ROM_LOAD( "ee14-.f13", 0x20000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) + ROM_LOAD( "ee15-.f15", 0x30000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "ee21.k8", 0x0000, 0x0400, CRC(b1db6586) SHA1(a7ecfcb4cf0f7450900820b3dfad8813efedfbea) ) /* different from the other set; */ @@ -1200,11 +1156,11 @@ ROM_START( chelnovu ) ROM_LOAD( "ee03-.d15", 0x20000, 0x10000, CRC(7178e182) SHA1(e8f03bda417e8f2f0508df40057d39ce6ee74f16) ) ROM_LOAD( "ee02-.c18", 0x30000, 0x10000, CRC(9d7c45ae) SHA1(014dfafa6898e5fd0d124391e698b4f76d38fa94) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x40000, "gfx3", 0 ) ROM_LOAD( "ee12-.f8", 0x00000, 0x10000, CRC(9b1c53a5) SHA1(b0fdc89dc7fd0931fa4bca3bbc20fc88f637ec74) ) /* Sprites */ - ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) - ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) - ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) + ROM_LOAD( "ee13-.f9", 0x10000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) + ROM_LOAD( "ee14-.f13", 0x20000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) + ROM_LOAD( "ee15-.f15", 0x30000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "ee21.k8", 0x0000, 0x0400, CRC(b1db6586) SHA1(a7ecfcb4cf0f7450900820b3dfad8813efedfbea) ) /* different from the other set; */ @@ -1236,11 +1192,11 @@ ROM_START( chelnovj ) ROM_LOAD( "ee03-.d15", 0x20000, 0x10000, CRC(7178e182) SHA1(e8f03bda417e8f2f0508df40057d39ce6ee74f16) ) ROM_LOAD( "ee02-.c18", 0x30000, 0x10000, CRC(9d7c45ae) SHA1(014dfafa6898e5fd0d124391e698b4f76d38fa94) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x40000, "gfx3", 0 ) ROM_LOAD( "ee12-.f8", 0x00000, 0x10000, CRC(9b1c53a5) SHA1(b0fdc89dc7fd0931fa4bca3bbc20fc88f637ec74) ) /* Sprites */ - ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) - ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) - ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) + ROM_LOAD( "ee13-.f9", 0x10000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) + ROM_LOAD( "ee14-.f13", 0x20000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) + ROM_LOAD( "ee15-.f15", 0x30000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "a-k7.bin", 0x0000, 0x0400, CRC(309c49d8) SHA1(7220002f6ef97514b4e6f61706fc16061120dafa) ) /* different from the parent set; - might be bad */ @@ -1277,11 +1233,11 @@ ROM_START( chelnovjbl ) // code is the same as the regular chelnovj set ROM_LOAD( "4.bin", 0x30000, 0x08000, CRC(276a46de) SHA1(5b8932dec0e10be128f5ed41798a8928c0aa506b) ) ROM_LOAD( "5.bin", 0x38000, 0x08000, CRC(99cee6cd) SHA1(b2cd0a1aef04fd63ad27ac8a61d17a6bb4c8b600) ) - ROM_REGION( 0x80000, "gfx3", 0 ) /* Sprites */ + ROM_REGION( 0x40000, "gfx3", 0 ) /* Sprites */ ROM_LOAD( "17.bin", 0x00000, 0x10000, CRC(47c857f8) SHA1(59f50365cee266c0e4075c989dc7fde50e43667a) ) // probably bad (1st half is 99.996948% match) - ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) - ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) - ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) + ROM_LOAD( "ee13-.f9", 0x10000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) + ROM_LOAD( "ee14-.f13", 0x20000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) + ROM_LOAD( "ee15-.f15", 0x30000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "a-k7.bin", 0x0000, 0x0400, CRC(309c49d8) SHA1(7220002f6ef97514b4e6f61706fc16061120dafa) ) /* different from the parent set; - might be bad (comment from chelnovj, not dumped here) */ @@ -1329,11 +1285,11 @@ ROM_START( chelnovjbla ) ROM_LOAD( "4.bin", 0x30000, 0x08000, CRC(276a46de) SHA1(5b8932dec0e10be128f5ed41798a8928c0aa506b) ) ROM_LOAD( "5.bin", 0x38000, 0x08000, CRC(99cee6cd) SHA1(b2cd0a1aef04fd63ad27ac8a61d17a6bb4c8b600) ) - ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_REGION( 0x40000, "gfx3", 0 ) ROM_LOAD( "ee12-.f8", 0x00000, 0x10000, CRC(9b1c53a5) SHA1(b0fdc89dc7fd0931fa4bca3bbc20fc88f637ec74) ) /* Sprites */ - ROM_LOAD( "ee13-.f9", 0x20000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) - ROM_LOAD( "ee14-.f13", 0x40000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) - ROM_LOAD( "ee15-.f15", 0x60000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) + ROM_LOAD( "ee13-.f9", 0x10000, 0x10000, CRC(72b8ae3e) SHA1(535dfd70e6d13296342d96917a57d46bdb28a59e) ) + ROM_LOAD( "ee14-.f13", 0x20000, 0x10000, CRC(d8f4bbde) SHA1(1f2d336dd97c9cc39e124c18cae634afb0ef3316) ) + ROM_LOAD( "ee15-.f15", 0x30000, 0x10000, CRC(81e3e68b) SHA1(1059c70b8bfe09c212a19767cfe23efa22afc196) ) ROM_REGION( 0x0800, "proms", 0 ) ROM_LOAD( "a-k7.bin", 0x0000, 0x0400, CRC(309c49d8) SHA1(7220002f6ef97514b4e6f61706fc16061120dafa) ) /* different from the parent set; - might be bad (comment from chelnovj, not dumped here) */ diff --git a/src/mame/includes/karnov.h b/src/mame/includes/karnov.h index 59eda457c98..5744dd30b56 100644 --- a/src/mame/includes/karnov.h +++ b/src/mame/includes/karnov.h @@ -25,7 +25,8 @@ public: m_soundlatch(*this, "soundlatch"), m_ram(*this, "ram"), m_videoram(*this, "videoram"), - m_pf_data(*this, "pf_data") { } + m_pf_data(*this, "pf_data"), + m_scroll(*this, "scroll") { } /* devices */ required_device m_maincpu; @@ -40,12 +41,11 @@ public: required_shared_ptr m_ram; required_shared_ptr m_videoram; required_shared_ptr m_pf_data; + required_shared_ptr m_scroll; /* video-related */ - std::unique_ptr m_bitmap_f; + tilemap_t *m_bg_tilemap; tilemap_t *m_fix_tilemap; - int m_flipscreen; - uint16_t m_scroll[2]; /* misc */ uint16_t m_i8751_return; @@ -57,25 +57,27 @@ public: int m_coin_mask; int m_latch; - DECLARE_WRITE16_MEMBER(karnov_control_w); - DECLARE_READ16_MEMBER(karnov_control_r); - DECLARE_WRITE16_MEMBER(karnov_videoram_w); - DECLARE_WRITE16_MEMBER(karnov_playfield_swap_w); + u16 mcu_r(); + void mcu_w(u16 data); + DECLARE_WRITE16_MEMBER(mcu_ack_w); + DECLARE_WRITE16_MEMBER(mcu_reset_w); + DECLARE_WRITE16_MEMBER(vint_ack_w); + DECLARE_WRITE16_MEMBER(videoram_w); + void playfield_w(offs_t offset, u16 data, u16 mem_mask); void init_wndrplnt(); void init_karnov(); void init_karnovj(); void init_chelnovu(); void init_chelnovj(); void init_chelnov(); + TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_fix_tile_info); virtual void machine_start() override; virtual void machine_reset() override; DECLARE_VIDEO_START(karnov); DECLARE_VIDEO_START(wndrplnt); - uint32_t screen_update_karnov(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(vbint_w); - void karnov_flipscreen_w( int data ); - void draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect ); void karnov_i8751_w( int data ); void wndrplnt_i8751_w( int data ); void chelnov_i8751_w( int data ); diff --git a/src/mame/video/karnov.cpp b/src/mame/video/karnov.cpp index b9f6443bd26..730e87ffbb8 100644 --- a/src/mame/video/karnov.cpp +++ b/src/mame/video/karnov.cpp @@ -9,66 +9,19 @@ #include "emu.h" #include "includes/karnov.h" -void karnov_state::karnov_flipscreen_w( int data ) -{ - m_flipscreen = data; - m_fix_tilemap->set_flip(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - m_spritegen->set_flip_screen(m_flipscreen); -} +/******************************************************************************/ -void karnov_state::draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect ) +uint32_t karnov_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int my, mx, offs, color, tile, fx, fy; - int scrollx = m_scroll[0]; - int scrolly = m_scroll[1]; - - if (m_flipscreen) - fx = fy = 1; - else - fx = fy = 0; - - mx = -1; - my = 0; - - for (offs = 0; offs < 0x400; offs ++) - { - mx++; - if (mx == 32) - { - mx=0; - my++; - } - - tile = m_pf_data[offs]; - color = tile >> 12; - tile = tile & 0x7ff; - if (m_flipscreen) - m_gfxdecode->gfx(1)->opaque(*m_bitmap_f,m_bitmap_f->cliprect(),tile, - color, fx, fy, 496-16*mx,496-16*my); - else - m_gfxdecode->gfx(1)->opaque(*m_bitmap_f,m_bitmap_f->cliprect(),tile, - color, fx, fy, 16*mx,16*my); - } - - if (!m_flipscreen) - { - scrolly = -scrolly; - scrollx = -scrollx; - } - else - { - scrolly = scrolly + 256; - scrollx = scrollx + 256; - } - - copyscrollbitmap(bitmap, *m_bitmap_f, 1, &scrollx, 1, &scrolly, cliprect); -} + int const flip = BIT(m_scroll[0], 15); -/******************************************************************************/ + m_bg_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + m_fix_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + m_spritegen->set_flip_screen(flip); -uint32_t karnov_state::screen_update_karnov(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - draw_background(bitmap, cliprect); + m_bg_tilemap->set_scrollx(m_scroll[0]); + m_bg_tilemap->set_scrolly(m_scroll[1]); + m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); m_spritegen->draw_sprites(bitmap, cliprect, m_spriteram->buffer(), 0x800, 0); m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0); return 0; @@ -80,21 +33,30 @@ TILE_GET_INFO_MEMBER(karnov_state::get_fix_tile_info) { int tile = m_videoram[tile_index]; SET_TILE_INFO_MEMBER(0, - tile&0xfff, - tile>>14, + tile & 0xfff, + tile >> 14, 0); } -WRITE16_MEMBER(karnov_state::karnov_videoram_w) +TILE_GET_INFO_MEMBER(karnov_state::get_bg_tile_info) +{ + int tile = m_pf_data[tile_index]; + SET_TILE_INFO_MEMBER(1, + tile & 0x7ff, + tile >> 12, + 0); +} + +WRITE16_MEMBER(karnov_state::videoram_w) { COMBINE_DATA(&m_videoram[offset]); m_fix_tilemap->mark_tile_dirty(offset); } -WRITE16_MEMBER(karnov_state::karnov_playfield_swap_w) +void karnov_state::playfield_w(offs_t offset, u16 data, u16 mem_mask) { - offset = ((offset & 0x1f) << 5) | ((offset & 0x3e0) >> 5); COMBINE_DATA(&m_pf_data[offset]); + m_bg_tilemap->mark_tile_dirty(offset); } /******************************************************************************/ @@ -102,22 +64,18 @@ WRITE16_MEMBER(karnov_state::karnov_playfield_swap_w) VIDEO_START_MEMBER(karnov_state,karnov) { /* Allocate bitmap & tilemap */ - m_bitmap_f = std::make_unique(512, 512); + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_fix_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - save_item(NAME(*m_bitmap_f)); - m_fix_tilemap->set_transparent_pen(0); } VIDEO_START_MEMBER(karnov_state,wndrplnt) { /* Allocate bitmap & tilemap */ - m_bitmap_f = std::make_unique(512, 512); + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_fix_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 32, 32); - save_item(NAME(*m_bitmap_f)); - m_fix_tilemap->set_transparent_pen(0); } -- cgit v1.2.3