From a0d861bc4ee12882b5d8cbcf27f0a645b87c928d Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 11 Apr 2020 03:30:16 +0900 Subject: [PATCH] rpunch.cpp: Update drawing behaviors, misc updates (#6534) * rpunch.cpp: Update drawing behaviors, misc updates Use pdrawgfx for sprite priority, Use bitmap_ind16 for drawing framebuffer behavior, Fix notes and variable names Add notes, Use set_rom_bank for upd bankswitching, Reduce unnecessary includes, Fix spacing, Fix address map related to framebuffer exists, Use shorter/correct type values, Simplify handlers, Cleanup gfx layouts * rpunch.cpp : Use shorter type value --- src/mame/drivers/rpunch.cpp | 229 +++++++++++++++++------------------- src/mame/includes/rpunch.h | 42 +++---- src/mame/video/rpunch.cpp | 165 +++++++++++++------------- 3 files changed, 212 insertions(+), 224 deletions(-) diff --git a/src/mame/drivers/rpunch.cpp b/src/mame/drivers/rpunch.cpp index 10f4a43e483..43c514ad970 100644 --- a/src/mame/drivers/rpunch.cpp +++ b/src/mame/drivers/rpunch.cpp @@ -55,8 +55,8 @@ W -------- ---x---- (background 1 palette bank) W -------- ----xxxx (bitmap palette bank) 0C000E W -------- xxxxxxxx Sound communications - 0C0010 W -------- --xxxxxx Sprite bias (???) - 0C0012 W -------- --xxxxxx Bitmap bias (???) + 0C0010 W -------- --xxxxxx Number of active sprite entries + 0C0012 W -------- --xxxxxx Split point of sprite priority 0C0018 R -xxxx-xx --xxxxxx Player 1 input port R -x------ -------- (2 player start) R --x----- -------- (1 player start) @@ -110,7 +110,6 @@ #include "includes/rpunch.h" #include "cpu/m68000/m68000.h" -#include "cpu/m6809/m6809.h" #include "cpu/z80/z80.h" #include "machine/input_merger.h" #include "sound/ym2151.h" @@ -132,21 +131,15 @@ void rpunch_state::machine_start() save_item(NAME(m_upd_rom_bank)); save_item(NAME(m_sprite_xoffs)); save_item(NAME(m_videoflags)); - save_item(NAME(m_bins)); - save_item(NAME(m_gins)); + save_item(NAME(m_sprite_pri)); + save_item(NAME(m_sprite_num)); } void rpunch_state::machine_reset() { - if (memregion("upd")) - { - uint8_t *snd = memregion("upd")->base(); - memcpy(snd, snd + 0x20000, 0x20000); - } } - /************************************* * * Input ports @@ -165,32 +158,26 @@ CUSTOM_INPUT_MEMBER(rpunch_state::hi_bits_r) * *************************************/ -READ16_MEMBER(rpunch_state::sound_busy_r) +u16 rpunch_state::sound_busy_r() { return m_soundlatch->pending_r(); } - /************************************* * * UPD7759 controller * *************************************/ -WRITE8_MEMBER(rpunch_state::upd_control_w) +void rpunch_state::upd_control_w(u8 data) { - if ((data & 1) != m_upd_rom_bank) - { - uint8_t *snd = memregion("upd")->base(); - m_upd_rom_bank = data & 1; - memcpy(snd, snd + 0x20000 * (m_upd_rom_bank + 1), 0x20000); - } + m_upd7759->set_rom_bank(BIT(data, 0)); m_upd7759->reset_w(BIT(data, 7)); } -WRITE8_MEMBER(rpunch_state::upd_data_w) +void rpunch_state::upd_data_w(u8 data) { m_upd7759->port_w(data); m_upd7759->start_w(0); @@ -198,26 +185,24 @@ WRITE8_MEMBER(rpunch_state::upd_data_w) } - /************************************* * * Main CPU memory handlers * *************************************/ -void rpunch_state::main_map(address_map &map) +void rpunch_state::svolley_map(address_map &map) { map.global_mask(0xfffff); map(0x000000, 0x03ffff).rom(); - map(0x040000, 0x04ffff).ram().share("bitmapram"); map(0x060000, 0x060fff).ram().share("spriteram"); - map(0x080000, 0x083fff).ram().w(FUNC(rpunch_state::rpunch_videoram_w)).share("videoram"); + map(0x080000, 0x083fff).ram().w(FUNC(rpunch_state::videoram_w)).share("videoram"); map(0x0a0000, 0x0a07ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x0c0000, 0x0c0007).w(FUNC(rpunch_state::rpunch_scrollreg_w)); - map(0x0c0009, 0x0c0009).select(0x20).w(FUNC(rpunch_state::rpunch_gga_w)); - map(0x0c000c, 0x0c000d).w(FUNC(rpunch_state::rpunch_videoreg_w)); + map(0x0c0000, 0x0c0007).w(FUNC(rpunch_state::scrollreg_w)); + map(0x0c0009, 0x0c0009).select(0x20).w(FUNC(rpunch_state::gga_w)); + map(0x0c000c, 0x0c000d).w(FUNC(rpunch_state::videoreg_w)); map(0x0c000f, 0x0c000f).w(m_soundlatch, FUNC(generic_latch_8_device::write)).umask16(0x00ff); - map(0x0c0010, 0x0c0013).w(FUNC(rpunch_state::rpunch_ins_w)); + map(0x0c0010, 0x0c0013).w(FUNC(rpunch_state::sprite_ctrl_w)).umask16(0x00ff); map(0x0c0018, 0x0c0019).portr("P1"); map(0x0c001a, 0x0c001b).portr("P2"); map(0x0c001c, 0x0c001d).portr("DSW"); @@ -225,9 +210,16 @@ void rpunch_state::main_map(address_map &map) map(0x0fc000, 0x0fffff).ram(); } +void rpunch_state::rpunch_map(address_map &map) +{ + svolley_map(map); + map.global_mask(0xfffff); + map(0x040000, 0x04ffff).rw(FUNC(rpunch_state::pixmap_r), FUNC(rpunch_state::pixmap_w)); // mirrored? +} + void rpunch_state::svolleybl_main_map(address_map &map) { - main_map(map); + svolley_map(map); // TODO: sound latch hook up is incomplete map(0x090000, 0x090fff).ram(); // ? @@ -413,10 +405,10 @@ static const gfx_layout bglayout = 8,8, RGN_FRAC(1,1), 4, - { 0, 1, 2, 3 }, - { 4, 0, 12, 8, 20, 16, 28, 24 }, - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, - 8*32 + { STEP4(0,1) }, + { STEP4(3*4,-4), STEP4(7*4,-4) }, + { STEP8(0,8*4) }, + 8*8*4 }; @@ -425,20 +417,17 @@ static const gfx_layout splayout = 16,32, RGN_FRAC(1,1), 4, - { 0, 1, 2, 3 }, - { 12, 8, 4, 0, 28, 24, 20, 16, 44, 40, 36, 32, 60, 56, 52, 48 }, - { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, - 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64, - 16*64, 17*64, 18*64, 19*64, 20*64, 21*64, 22*64, 23*64, - 24*64, 25*64, 26*64, 27*64, 28*64, 29*64, 30*64, 31*64 }, - 8*256 + { STEP4(0,1) }, + { STEP4(3*4,-4), STEP4(7*4,-4), STEP4(11*4,-4), STEP4(15*4,-4) }, + { STEP32(0,16*4) }, + 16*32*4 }; static GFXDECODE_START( gfx_rpunch ) - GFXDECODE_ENTRY( "gfx1", 0, bglayout, 0, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, bglayout, 256, 16 ) - GFXDECODE_ENTRY( "sprites", 0, splayout, 0, 16*4 ) + GFXDECODE_ENTRY( "gfx1", 0, bglayout, 0, 16 ) + GFXDECODE_ENTRY( "gfx2", 0, bglayout, 256, 16 ) + GFXDECODE_ENTRY( "sprites", 0, splayout, 0, 64 ) GFXDECODE_END @@ -449,8 +438,8 @@ static const gfx_layout bootleg_tile_layout = 4, { STEP4(0,8) }, { STEP8(0,1) }, - { STEP8(0,32) }, - 8*32, + { STEP8(0,8*4) }, + 8*8*4 }; static const gfx_layout bootleg_sprite_layout = @@ -459,15 +448,15 @@ static const gfx_layout bootleg_sprite_layout = RGN_FRAC(1,1), 4, { STEP4(0,8) }, - { STEP8(0,1), STEP8(1024,1) }, - { STEP32(0,32) }, - 32*32*2, + { STEP8(0,1), STEP8(32*8*4,1) }, + { STEP32(0,8*4) }, + 16*32*4 }; static GFXDECODE_START( gfx_svolleybl ) - GFXDECODE_ENTRY( "gfx1", 0, bootleg_tile_layout, 0, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, bootleg_tile_layout, 256, 16 ) - GFXDECODE_ENTRY( "sprites", 0, bootleg_sprite_layout, 0, 16*4 ) + GFXDECODE_ENTRY( "gfx1", 0, bootleg_tile_layout, 0, 16 ) + GFXDECODE_ENTRY( "gfx2", 0, bootleg_tile_layout, 256, 16 ) + GFXDECODE_ENTRY( "sprites", 0, bootleg_sprite_layout, 0, 64 ) GFXDECODE_END @@ -481,7 +470,7 @@ void rpunch_state::rpunch(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->set_addrmap(AS_PROGRAM, &rpunch_state::main_map); + m_maincpu->set_addrmap(AS_PROGRAM, &rpunch_state::rpunch_map); Z80(config, m_audiocpu, MASTER_CLOCK/4); m_audiocpu->set_addrmap(AS_PROGRAM, &rpunch_state::sound_map); @@ -496,14 +485,14 @@ void rpunch_state::rpunch(machine_config &config) m_screen->set_refresh_hz(60); m_screen->set_size(304, 224); m_screen->set_visarea(8, 303-8, 0, 223-8); - m_screen->set_screen_update(FUNC(rpunch_state::screen_update_rpunch)); + m_screen->set_screen_update(FUNC(rpunch_state::screen_update)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_rpunch); PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024); VSYSTEM_GGA(config, m_gga, VIDEO_CLOCK/2); // verified from rpunch schematics - m_gga->write_cb().set(FUNC(rpunch_state::rpunch_gga_data_w)); + m_gga->write_cb().set(FUNC(rpunch_state::gga_data_w)); MCFG_VIDEO_START_OVERRIDE(rpunch_state,rpunch) @@ -521,6 +510,7 @@ void rpunch_state::rpunch(machine_config &config) void rpunch_state::svolley(machine_config &config) { rpunch(config); + m_maincpu->set_addrmap(AS_PROGRAM, &rpunch_state::svolley_map); MCFG_VIDEO_START_OVERRIDE(rpunch_state,svolley) } @@ -543,14 +533,14 @@ void rpunch_state::svolleybl(machine_config &config) m_screen->set_refresh_hz(60); m_screen->set_size(304, 224); m_screen->set_visarea(8, 303-8, 0, 223-8); - m_screen->set_screen_update(FUNC(rpunch_state::screen_update_rpunch)); + m_screen->set_screen_update(FUNC(rpunch_state::screen_update)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_svolleybl); PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 1024); VSYSTEM_GGA(config, m_gga, VIDEO_CLOCK/2); - m_gga->write_cb().set(FUNC(rpunch_state::rpunch_gga_data_w)); + m_gga->write_cb().set(FUNC(rpunch_state::gga_data_w)); MCFG_VIDEO_START_OVERRIDE(rpunch_state,rpunch) @@ -572,6 +562,7 @@ void rpunch_state::svolleybl(machine_config &config) * *************************************/ +// VS7-0102 PCB (CPU Board) with VS7-0101 PCB (Video/ROM Board?) ROM_START( rpunch ) ROM_REGION( 0x40000, "maincpu", 0 ) ROM_LOAD16_BYTE( "rpunch.20", 0x00000, 0x08000, CRC(a2028d59) SHA1(d304811853ad68b3977edb90b94f3e2c7507be82) ) @@ -583,15 +574,15 @@ ROM_START( rpunch ) ROM_LOAD( "rpunch.92", 0x00000, 0x10000, CRC(5e1870e3) SHA1(0ab33f39144ed72d805341d869f61764610d3df6) ) ROM_REGION( 0x80000, "gfx1", ROMREGION_ERASEFF ) - ROM_LOAD( "rl_c13.bin", 0x00000, 0x40000, CRC(7c8403b0) SHA1(2fb92860a41f3331076c73b2b010e175cb4929ca) ) - ROM_LOAD( "rl_c10.bin", 0x40000, 0x08000, CRC(312eb260) SHA1(31faa90fde54fbc6c110bee7b4690a30beaec469) ) - ROM_LOAD( "rl_c12.bin", 0x48000, 0x08000, CRC(bea85219) SHA1(4036bdad921dd3555a2dc6bb12e9ffa615de70ca) ) - ROM_FILL( 0x50000, 0x10000, 0xff ) + ROM_LOAD16_WORD_SWAP( "rl_c13.bin", 0x00000, 0x40000, CRC(7c8403b0) SHA1(2fb92860a41f3331076c73b2b010e175cb4929ca) ) + ROM_LOAD16_WORD_SWAP( "rl_c10.bin", 0x40000, 0x08000, CRC(312eb260) SHA1(31faa90fde54fbc6c110bee7b4690a30beaec469) ) + ROM_LOAD16_WORD_SWAP( "rl_c12.bin", 0x48000, 0x08000, CRC(bea85219) SHA1(4036bdad921dd3555a2dc6bb12e9ffa615de70ca) ) + ROM_FILL( 0x50000, 0x10000, 0xff ) ROM_REGION( 0x80000, "gfx2", ROMREGION_ERASEFF ) - ROM_LOAD( "rl_a10.bin", 0x00000, 0x40000, CRC(c2a77619) SHA1(9b1e85fb18833c3b96a6c58b8714984f60a90afc) ) - ROM_LOAD( "rl_a13.bin", 0x40000, 0x08000, CRC(a39c2c16) SHA1(d8d55eb58d3fc79f982f535ec85f69593fe9d883) ) - ROM_LOAD( "rpunch.54", 0x48000, 0x08000, CRC(e2969747) SHA1(8da996fc2e2e3d281f293d0ccaf35ebdb9379d48) ) + ROM_LOAD16_WORD_SWAP( "rl_a10.bin", 0x00000, 0x40000, CRC(c2a77619) SHA1(9b1e85fb18833c3b96a6c58b8714984f60a90afc) ) + ROM_LOAD16_WORD_SWAP( "rl_a13.bin", 0x40000, 0x08000, CRC(a39c2c16) SHA1(d8d55eb58d3fc79f982f535ec85f69593fe9d883) ) + ROM_LOAD16_WORD_SWAP( "rpunch.54", 0x48000, 0x08000, CRC(e2969747) SHA1(8da996fc2e2e3d281f293d0ccaf35ebdb9379d48) ) ROM_REGION( 0x80000, "sprites", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "rl_4g.bin", 0x00000, 0x20000, CRC(c5cb4b7a) SHA1(2b6be85800ab62b000a0b01cff8af689b25c4c65) ) @@ -601,8 +592,8 @@ ROM_START( rpunch ) ROM_LOAD16_BYTE( "rpunch.85", 0x50000, 0x08000, CRC(60b88a2c) SHA1(b10aba06a5d88d0f27041f9e356aebf9f8a230df) ) ROM_LOAD16_BYTE( "rpunch.86", 0x50001, 0x08000, CRC(91d204f6) SHA1(68b5fb29ea5404597adada1a197ad853e79ada1c) ) - ROM_REGION( 0x60000, "upd", 0 ) - ROM_LOAD( "rl_f18.bin", 0x20000, 0x20000, CRC(47840673) SHA1(ffe20f8772a987f5dd06a3f348a1e3cfed26e19e) ) + ROM_REGION( 0x40000, "upd", 0 ) + ROM_LOAD( "rl_f18.bin", 0x00000, 0x20000, CRC(47840673) SHA1(ffe20f8772a987f5dd06a3f348a1e3cfed26e19e) ) // ROM_LOAD( "rpunch.91", 0x00000, 0x0f000, CRC(7512cc59) ) ROM_END @@ -617,15 +608,15 @@ ROM_START( rabiolep ) ROM_LOAD( "rl_f20.bin", 0x00000, 0x10000, CRC(a6f50351) SHA1(3152d4ed100b0dfaf0da4ee79cd9e0f1692335e0) ) ROM_REGION( 0x80000, "gfx1", ROMREGION_ERASEFF ) - ROM_LOAD( "rl_c13.bin", 0x00000, 0x40000, CRC(7c8403b0) SHA1(2fb92860a41f3331076c73b2b010e175cb4929ca) ) - ROM_LOAD( "rl_c10.bin", 0x40000, 0x08000, CRC(312eb260) SHA1(31faa90fde54fbc6c110bee7b4690a30beaec469) ) - ROM_LOAD( "rl_c12.bin", 0x48000, 0x08000, CRC(bea85219) SHA1(4036bdad921dd3555a2dc6bb12e9ffa615de70ca) ) - ROM_FILL( 0x50000, 0x10000, 0xff ) + ROM_LOAD16_WORD_SWAP( "rl_c13.bin", 0x00000, 0x40000, CRC(7c8403b0) SHA1(2fb92860a41f3331076c73b2b010e175cb4929ca) ) + ROM_LOAD16_WORD_SWAP( "rl_c10.bin", 0x40000, 0x08000, CRC(312eb260) SHA1(31faa90fde54fbc6c110bee7b4690a30beaec469) ) + ROM_LOAD16_WORD_SWAP( "rl_c12.bin", 0x48000, 0x08000, CRC(bea85219) SHA1(4036bdad921dd3555a2dc6bb12e9ffa615de70ca) ) + ROM_FILL( 0x50000, 0x10000, 0xff ) ROM_REGION( 0x80000, "gfx2", ROMREGION_ERASEFF ) - ROM_LOAD( "rl_a10.bin", 0x00000, 0x40000, CRC(c2a77619) SHA1(9b1e85fb18833c3b96a6c58b8714984f60a90afc) ) - ROM_LOAD( "rl_a13.bin", 0x40000, 0x08000, CRC(a39c2c16) SHA1(d8d55eb58d3fc79f982f535ec85f69593fe9d883) ) - ROM_LOAD( "rl_a12.bin", 0x48000, 0x08000, CRC(970b0e32) SHA1(a1d4025ee4470a41aa047c6f06ca7aa98a1f7ffd) ) + ROM_LOAD16_WORD_SWAP( "rl_a10.bin", 0x00000, 0x40000, CRC(c2a77619) SHA1(9b1e85fb18833c3b96a6c58b8714984f60a90afc) ) + ROM_LOAD16_WORD_SWAP( "rl_a13.bin", 0x40000, 0x08000, CRC(a39c2c16) SHA1(d8d55eb58d3fc79f982f535ec85f69593fe9d883) ) + ROM_LOAD16_WORD_SWAP( "rl_a12.bin", 0x48000, 0x08000, CRC(970b0e32) SHA1(a1d4025ee4470a41aa047c6f06ca7aa98a1f7ffd) ) ROM_REGION( 0x80000, "sprites", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "rl_4g.bin", 0x00000, 0x20000, CRC(c5cb4b7a) SHA1(2b6be85800ab62b000a0b01cff8af689b25c4c65) ) @@ -635,11 +626,11 @@ ROM_START( rabiolep ) ROM_LOAD16_BYTE( "rl_2g.bin", 0x50000, 0x08000, CRC(744903b4) SHA1(ba931a7f6bea8cebab8314551ed34896316b6661) ) ROM_LOAD16_BYTE( "rl_2h.bin", 0x50001, 0x08000, CRC(09649e75) SHA1(a650561a11970fbcbc4610fc67cb9f54fa3145a6) ) - ROM_REGION( 0x60000, "upd", 0 ) - ROM_LOAD( "rl_f18.bin", 0x20000, 0x20000, CRC(47840673) SHA1(ffe20f8772a987f5dd06a3f348a1e3cfed26e19e) ) + ROM_REGION( 0x40000, "upd", 0 ) + ROM_LOAD( "rl_f18.bin", 0x00000, 0x20000, CRC(47840673) SHA1(ffe20f8772a987f5dd06a3f348a1e3cfed26e19e) ) ROM_END - +// VS-68K-2 (H2) PCB ROM_START( svolley ) ROM_REGION( 0x40000, "maincpu", 0 ) ROM_LOAD16_BYTE( "sps_13.bin", 0x00000, 0x10000, CRC(2fbc5dcf) SHA1(fba4d353948f29b75b4db464509f7e606703f9dc) ) @@ -651,18 +642,18 @@ ROM_START( svolley ) ROM_LOAD( "sps_17.bin", 0x00000, 0x10000, CRC(48b89688) SHA1(1f39d979a852f5237a7d95231e86a28cdc1f4d65) ) ROM_REGION( 0x80000, "gfx1", ROMREGION_ERASEFF ) - ROM_LOAD( "sps_02.bin", 0x00000, 0x10000, CRC(1a0abe75) SHA1(49251c5e377f9317471f7df26ac2c6b8cfa51007) ) - ROM_LOAD( "sps_03.bin", 0x10000, 0x10000, CRC(36279075) SHA1(6c4cf3fab9eb764cb8bc10ab4f8aa54d0afb65d9) ) - ROM_LOAD( "sps_04.bin", 0x20000, 0x10000, CRC(7cede7d9) SHA1(9c7e3a9b7dd8d390b327d52ced35b03b8c1fd5ee) ) - ROM_LOAD( "sps_01.bin", 0x30000, 0x08000, CRC(6425e6d7) SHA1(b6c81155c22072d1de88ca23d58bd9621139dc6c) ) - ROM_LOAD( "sps_10.bin", 0x40000, 0x08000, CRC(a12b1589) SHA1(ecaa941f29c028ca94fcd1d86edfd69884e61d2c) ) + ROM_LOAD16_WORD_SWAP( "sps_02.bin", 0x00000, 0x10000, CRC(1a0abe75) SHA1(49251c5e377f9317471f7df26ac2c6b8cfa51007) ) + ROM_LOAD16_WORD_SWAP( "sps_03.bin", 0x10000, 0x10000, CRC(36279075) SHA1(6c4cf3fab9eb764cb8bc10ab4f8aa54d0afb65d9) ) + ROM_LOAD16_WORD_SWAP( "sps_04.bin", 0x20000, 0x10000, CRC(7cede7d9) SHA1(9c7e3a9b7dd8d390b327d52ced35b03b8c1fd5ee) ) + ROM_LOAD16_WORD_SWAP( "sps_01.bin", 0x30000, 0x08000, CRC(6425e6d7) SHA1(b6c81155c22072d1de88ca23d58bd9621139dc6c) ) + ROM_LOAD16_WORD_SWAP( "sps_10.bin", 0x40000, 0x08000, CRC(a12b1589) SHA1(ecaa941f29c028ca94fcd1d86edfd69884e61d2c) ) ROM_REGION( 0x80000, "gfx2", ROMREGION_ERASEFF ) - ROM_LOAD( "sps_05.bin", 0x00000, 0x10000, CRC(b0671d12) SHA1(defc71b6d7c31c74a58789a1620a506f36b85837) ) - ROM_LOAD( "sps_06.bin", 0x10000, 0x10000, CRC(c231957e) SHA1(b56afd41969bd865ad3ca16fb51e39030aeb1943) ) - ROM_LOAD( "sps_07.bin", 0x20000, 0x10000, CRC(904b7709) SHA1(9b66a565cd599928b666baad9f97c50f35ffcc37) ) - ROM_LOAD( "sps_08.bin", 0x30000, 0x10000, CRC(5430ffac) SHA1(163311d96f2f7e1ecb0901d0be73ac357b01bf6a) ) - ROM_LOAD( "sps_09.bin", 0x40000, 0x10000, CRC(414a6278) SHA1(baa9dc9ab0dd3c5f27c128de23053edcddf45ad0) ) + ROM_LOAD16_WORD_SWAP( "sps_05.bin", 0x00000, 0x10000, CRC(b0671d12) SHA1(defc71b6d7c31c74a58789a1620a506f36b85837) ) + ROM_LOAD16_WORD_SWAP( "sps_06.bin", 0x10000, 0x10000, CRC(c231957e) SHA1(b56afd41969bd865ad3ca16fb51e39030aeb1943) ) + ROM_LOAD16_WORD_SWAP( "sps_07.bin", 0x20000, 0x10000, CRC(904b7709) SHA1(9b66a565cd599928b666baad9f97c50f35ffcc37) ) + ROM_LOAD16_WORD_SWAP( "sps_08.bin", 0x30000, 0x10000, CRC(5430ffac) SHA1(163311d96f2f7e1ecb0901d0be73ac357b01bf6a) ) + ROM_LOAD16_WORD_SWAP( "sps_09.bin", 0x40000, 0x10000, CRC(414a6278) SHA1(baa9dc9ab0dd3c5f27c128de23053edcddf45ad0) ) ROM_REGION( 0x80000, "sprites", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "sps_20.bin", 0x00000, 0x10000, CRC(c9e7206d) SHA1(af5b2f49387a3b46c6693f4782aa0e587f17ab25) ) @@ -674,9 +665,9 @@ ROM_START( svolley ) ROM_LOAD16_BYTE( "sps_21.bin", 0x30001, 0x08000, CRC(9dd28b42) SHA1(5f49456ee49ed7df59629d02a9da57eac370c388) ) ROM_RELOAD(0x60001, 0x8000) - ROM_REGION( 0x60000, "upd", 0 ) - ROM_LOAD( "sps_16.bin", 0x20000, 0x20000, CRC(456d0f36) SHA1(3d1bdc5c79b41a7b33932d6a8b838f01cea9d4ed) ) - ROM_LOAD( "sps_15.bin", 0x40000, 0x10000, CRC(f33f415f) SHA1(1dd465d9b3009754a7d53400562a53dacff364fc) ) + ROM_REGION( 0x40000, "upd", 0 ) + ROM_LOAD( "sps_16.bin", 0x00000, 0x20000, CRC(456d0f36) SHA1(3d1bdc5c79b41a7b33932d6a8b838f01cea9d4ed) ) + ROM_LOAD( "sps_15.bin", 0x20000, 0x10000, CRC(f33f415f) SHA1(1dd465d9b3009754a7d53400562a53dacff364fc) ) ROM_END ROM_START( svolleyk ) @@ -690,19 +681,19 @@ ROM_START( svolleyk ) ROM_LOAD( "sps_17.bin", 0x00000, 0x10000, CRC(48b89688) SHA1(1f39d979a852f5237a7d95231e86a28cdc1f4d65) ) ROM_REGION( 0x80000, "gfx1", ROMREGION_ERASEFF ) - ROM_LOAD( "sps_02.bin", 0x00000, 0x10000, CRC(1a0abe75) SHA1(49251c5e377f9317471f7df26ac2c6b8cfa51007) ) - ROM_LOAD( "sps_03.bin", 0x10000, 0x10000, CRC(36279075) SHA1(6c4cf3fab9eb764cb8bc10ab4f8aa54d0afb65d9) ) - ROM_LOAD( "sps_04.bin", 0x20000, 0x10000, CRC(7cede7d9) SHA1(9c7e3a9b7dd8d390b327d52ced35b03b8c1fd5ee) ) - ROM_LOAD( "sps_01.bin", 0x30000, 0x08000, CRC(6425e6d7) SHA1(b6c81155c22072d1de88ca23d58bd9621139dc6c) ) - ROM_LOAD( "sps_10.bin", 0x40000, 0x08000, CRC(a12b1589) SHA1(ecaa941f29c028ca94fcd1d86edfd69884e61d2c) ) + ROM_LOAD16_WORD_SWAP( "sps_02.bin", 0x00000, 0x10000, CRC(1a0abe75) SHA1(49251c5e377f9317471f7df26ac2c6b8cfa51007) ) + ROM_LOAD16_WORD_SWAP( "sps_03.bin", 0x10000, 0x10000, CRC(36279075) SHA1(6c4cf3fab9eb764cb8bc10ab4f8aa54d0afb65d9) ) + ROM_LOAD16_WORD_SWAP( "sps_04.bin", 0x20000, 0x10000, CRC(7cede7d9) SHA1(9c7e3a9b7dd8d390b327d52ced35b03b8c1fd5ee) ) + ROM_LOAD16_WORD_SWAP( "sps_01.bin", 0x30000, 0x08000, CRC(6425e6d7) SHA1(b6c81155c22072d1de88ca23d58bd9621139dc6c) ) + ROM_LOAD16_WORD_SWAP( "sps_10.bin", 0x40000, 0x08000, CRC(a12b1589) SHA1(ecaa941f29c028ca94fcd1d86edfd69884e61d2c) ) ROM_REGION( 0x80000, "gfx2", ROMREGION_ERASEFF ) - ROM_LOAD( "sps_05.bin", 0x00000, 0x10000, CRC(b0671d12) SHA1(defc71b6d7c31c74a58789a1620a506f36b85837) ) - ROM_LOAD( "sps_06.bin", 0x10000, 0x10000, CRC(c231957e) SHA1(b56afd41969bd865ad3ca16fb51e39030aeb1943) ) - ROM_LOAD( "sps_07.bin", 0x20000, 0x10000, CRC(904b7709) SHA1(9b66a565cd599928b666baad9f97c50f35ffcc37) ) - ROM_LOAD( "sps_08.bin", 0x30000, 0x10000, CRC(5430ffac) SHA1(163311d96f2f7e1ecb0901d0be73ac357b01bf6a) ) - ROM_LOAD( "sps_09.bin", 0x40000, 0x10000, CRC(414a6278) SHA1(baa9dc9ab0dd3c5f27c128de23053edcddf45ad0) ) - ROM_LOAD( "a09.bin", 0x50000, 0x08000, CRC(dd92dfe1) SHA1(08c956e11d567a215ec3cdaf6ef75fa9a886513a) ) // contains Korea, GB and Spain flags + ROM_LOAD16_WORD_SWAP( "sps_05.bin", 0x00000, 0x10000, CRC(b0671d12) SHA1(defc71b6d7c31c74a58789a1620a506f36b85837) ) + ROM_LOAD16_WORD_SWAP( "sps_06.bin", 0x10000, 0x10000, CRC(c231957e) SHA1(b56afd41969bd865ad3ca16fb51e39030aeb1943) ) + ROM_LOAD16_WORD_SWAP( "sps_07.bin", 0x20000, 0x10000, CRC(904b7709) SHA1(9b66a565cd599928b666baad9f97c50f35ffcc37) ) + ROM_LOAD16_WORD_SWAP( "sps_08.bin", 0x30000, 0x10000, CRC(5430ffac) SHA1(163311d96f2f7e1ecb0901d0be73ac357b01bf6a) ) + ROM_LOAD16_WORD_SWAP( "sps_09.bin", 0x40000, 0x10000, CRC(414a6278) SHA1(baa9dc9ab0dd3c5f27c128de23053edcddf45ad0) ) + ROM_LOAD16_WORD_SWAP( "a09.bin", 0x50000, 0x08000, CRC(dd92dfe1) SHA1(08c956e11d567a215ec3cdaf6ef75fa9a886513a) ) // contains Korea, GB and Spain flags ROM_REGION( 0x80000, "sprites", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "sps_20.bin", 0x00000, 0x10000, CRC(c9e7206d) SHA1(af5b2f49387a3b46c6693f4782aa0e587f17ab25) ) @@ -714,9 +705,9 @@ ROM_START( svolleyk ) ROM_LOAD16_BYTE( "sps_21.bin", 0x30001, 0x08000, CRC(9dd28b42) SHA1(5f49456ee49ed7df59629d02a9da57eac370c388) ) ROM_RELOAD(0x60001, 0x8000) - ROM_REGION( 0x60000, "upd", 0 ) - ROM_LOAD( "sps_16.bin", 0x20000, 0x20000, CRC(456d0f36) SHA1(3d1bdc5c79b41a7b33932d6a8b838f01cea9d4ed) ) - ROM_LOAD( "sps_15.bin", 0x40000, 0x10000, CRC(f33f415f) SHA1(1dd465d9b3009754a7d53400562a53dacff364fc) ) + ROM_REGION( 0x40000, "upd", 0 ) + ROM_LOAD( "sps_16.bin", 0x00000, 0x20000, CRC(456d0f36) SHA1(3d1bdc5c79b41a7b33932d6a8b838f01cea9d4ed) ) + ROM_LOAD( "sps_15.bin", 0x20000, 0x10000, CRC(f33f415f) SHA1(1dd465d9b3009754a7d53400562a53dacff364fc) ) ROM_END ROM_START( svolleyu ) @@ -730,19 +721,19 @@ ROM_START( svolleyu ) ROM_LOAD( "sps_17.bin", 0x00000, 0x10000, CRC(48b89688) SHA1(1f39d979a852f5237a7d95231e86a28cdc1f4d65) ) ROM_REGION( 0x80000, "gfx1", ROMREGION_ERASEFF ) - ROM_LOAD( "sps_02.bin", 0x00000, 0x10000, CRC(1a0abe75) SHA1(49251c5e377f9317471f7df26ac2c6b8cfa51007) ) - ROM_LOAD( "sps_03.bin", 0x10000, 0x10000, CRC(36279075) SHA1(6c4cf3fab9eb764cb8bc10ab4f8aa54d0afb65d9) ) - ROM_LOAD( "sps_04.bin", 0x20000, 0x10000, CRC(7cede7d9) SHA1(9c7e3a9b7dd8d390b327d52ced35b03b8c1fd5ee) ) - ROM_LOAD( "sps_01.bin", 0x30000, 0x08000, CRC(6425e6d7) SHA1(b6c81155c22072d1de88ca23d58bd9621139dc6c) ) - ROM_LOAD( "sps_10.bin", 0x40000, 0x08000, CRC(a12b1589) SHA1(ecaa941f29c028ca94fcd1d86edfd69884e61d2c) ) + ROM_LOAD16_WORD_SWAP( "sps_02.bin", 0x00000, 0x10000, CRC(1a0abe75) SHA1(49251c5e377f9317471f7df26ac2c6b8cfa51007) ) + ROM_LOAD16_WORD_SWAP( "sps_03.bin", 0x10000, 0x10000, CRC(36279075) SHA1(6c4cf3fab9eb764cb8bc10ab4f8aa54d0afb65d9) ) + ROM_LOAD16_WORD_SWAP( "sps_04.bin", 0x20000, 0x10000, CRC(7cede7d9) SHA1(9c7e3a9b7dd8d390b327d52ced35b03b8c1fd5ee) ) + ROM_LOAD16_WORD_SWAP( "sps_01.bin", 0x30000, 0x08000, CRC(6425e6d7) SHA1(b6c81155c22072d1de88ca23d58bd9621139dc6c) ) + ROM_LOAD16_WORD_SWAP( "sps_10.bin", 0x40000, 0x08000, CRC(a12b1589) SHA1(ecaa941f29c028ca94fcd1d86edfd69884e61d2c) ) ROM_REGION( 0x80000, "gfx2", ROMREGION_ERASEFF ) - ROM_LOAD( "sps_05.bin", 0x00000, 0x10000, CRC(b0671d12) SHA1(defc71b6d7c31c74a58789a1620a506f36b85837) ) - ROM_LOAD( "sps_06.bin", 0x10000, 0x10000, CRC(c231957e) SHA1(b56afd41969bd865ad3ca16fb51e39030aeb1943) ) - ROM_LOAD( "sps_07.bin", 0x20000, 0x10000, CRC(904b7709) SHA1(9b66a565cd599928b666baad9f97c50f35ffcc37) ) - ROM_LOAD( "sps_08.bin", 0x30000, 0x10000, CRC(5430ffac) SHA1(163311d96f2f7e1ecb0901d0be73ac357b01bf6a) ) - ROM_LOAD( "sps_09.bin", 0x40000, 0x10000, CRC(414a6278) SHA1(baa9dc9ab0dd3c5f27c128de23053edcddf45ad0) ) -// ROM_LOAD( "a09.bin", 0x50000, 0x08000, CRC(dd92dfe1) SHA1(08c956e11d567a215ec3cdaf6ef75fa9a886513a) ) // not on this set? + ROM_LOAD16_WORD_SWAP( "sps_05.bin", 0x00000, 0x10000, CRC(b0671d12) SHA1(defc71b6d7c31c74a58789a1620a506f36b85837) ) + ROM_LOAD16_WORD_SWAP( "sps_06.bin", 0x10000, 0x10000, CRC(c231957e) SHA1(b56afd41969bd865ad3ca16fb51e39030aeb1943) ) + ROM_LOAD16_WORD_SWAP( "sps_07.bin", 0x20000, 0x10000, CRC(904b7709) SHA1(9b66a565cd599928b666baad9f97c50f35ffcc37) ) + ROM_LOAD16_WORD_SWAP( "sps_08.bin", 0x30000, 0x10000, CRC(5430ffac) SHA1(163311d96f2f7e1ecb0901d0be73ac357b01bf6a) ) + ROM_LOAD16_WORD_SWAP( "sps_09.bin", 0x40000, 0x10000, CRC(414a6278) SHA1(baa9dc9ab0dd3c5f27c128de23053edcddf45ad0) ) +// ROM_LOAD16_WORD_SWAP( "a09.bin", 0x50000, 0x08000, CRC(dd92dfe1) SHA1(08c956e11d567a215ec3cdaf6ef75fa9a886513a) ) // not on this set? ROM_REGION( 0x80000, "sprites", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "sps_20.bin", 0x00000, 0x10000, CRC(c9e7206d) SHA1(af5b2f49387a3b46c6693f4782aa0e587f17ab25) ) @@ -754,9 +745,9 @@ ROM_START( svolleyu ) ROM_LOAD16_BYTE( "sps_21.bin", 0x30001, 0x08000, CRC(9dd28b42) SHA1(5f49456ee49ed7df59629d02a9da57eac370c388) ) ROM_RELOAD(0x60001, 0x8000) - ROM_REGION( 0x60000, "upd", 0 ) - ROM_LOAD( "sps_16.bin", 0x20000, 0x20000, CRC(456d0f36) SHA1(3d1bdc5c79b41a7b33932d6a8b838f01cea9d4ed) ) - ROM_LOAD( "sps_15.bin", 0x40000, 0x10000, CRC(f33f415f) SHA1(1dd465d9b3009754a7d53400562a53dacff364fc) ) + ROM_REGION( 0x40000, "upd", 0 ) + ROM_LOAD( "sps_16.bin", 0x00000, 0x20000, CRC(456d0f36) SHA1(3d1bdc5c79b41a7b33932d6a8b838f01cea9d4ed) ) + ROM_LOAD( "sps_15.bin", 0x20000, 0x10000, CRC(f33f415f) SHA1(1dd465d9b3009754a7d53400562a53dacff364fc) ) ROM_END @@ -789,7 +780,6 @@ ROM_START( svolleybl ) ROM_LOAD32_BYTE( "21.bin", 0x000002, 0x010000, CRC(51cbe0d6) SHA1(d60b2a297d7e994c60db28e8ba60b0664e01f61d) ) ROM_LOAD32_BYTE( "22.bin", 0x000003, 0x010000, CRC(c289bfc0) SHA1(4a8929c5f304a1d203cad04c72fc6e96764dc858) ) - ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 Sound CPU */ ROM_LOAD( "2-snd.bin", 0x00000, 0x10000, CRC(e3065b1d) SHA1(c4a3a95ba7f43cdf1b0c574f41de06d007ad2bd8) ) // matches 1.ic140 from spikes91 ROM_LOAD( "1-snd.bin", 0x10000, 0x08000, CRC(009d7157) SHA1(2cdda7094c7476289d75a78ee25b34fa3b3225c0) ) // matches 2.ic141 from spikes91, when halved @@ -813,7 +803,6 @@ void rpunch_state::init_svolley() /* the main differences between Super Volleyball and Rabbit Punch are */ /* the lack of direct-mapped bitmap and a different palette base for sprites */ m_sprite_palette = 0x080; - m_bitmapram.set_target(nullptr, 0); } @@ -831,5 +820,5 @@ GAME( 1989, svolleyk, svolley, svolley, svolley, rpunch_state, init_svolley GAME( 1989, svolleyu, svolley, svolley, svolley, rpunch_state, init_svolley, ROT0, "V-System Co. (Data East license)", "Super Volleyball (US)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) // video registers are changed, and there's some kind of RAM at 090xxx, possible a different sprite scheme for the bootleg (even if the original is intact) -// the sound system seems to be ripped from the later Power Spikes (see aerofgt.c) +// the sound system seems to be ripped from the later Power Spikes (see aerofgt.cpp) GAME( 1991, svolleybl, svolley, svolleybl, svolley, rpunch_state, init_svolley, ROT0, "bootleg", "Super Volleyball (bootleg)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_NO_COCKTAIL ) // aka 1991 Spikes? diff --git a/src/mame/includes/rpunch.h b/src/mame/includes/rpunch.h index dd293225fba..31ac54d7d2e 100644 --- a/src/mame/includes/rpunch.h +++ b/src/mame/includes/rpunch.h @@ -26,7 +26,6 @@ public: m_palette(*this, "palette"), m_gga(*this, "gga"), m_videoram(*this, "videoram"), - m_bitmapram(*this, "bitmapram"), m_spriteram(*this, "spriteram") { } @@ -53,40 +52,43 @@ private: required_device m_palette; required_device m_gga; - required_shared_ptr m_videoram; - required_shared_ptr m_bitmapram; - required_shared_ptr m_spriteram; + required_shared_ptr m_videoram; + required_shared_ptr m_spriteram; - uint8_t m_upd_rom_bank; + u8 m_upd_rom_bank; int m_sprite_palette; int m_sprite_xoffs; - uint16_t m_videoflags; - uint8_t m_bins; - uint8_t m_gins; + u16 m_videoflags; + u8 m_sprite_pri; + u8 m_sprite_num; tilemap_t *m_background[2]; + std::unique_ptr m_pixmap; emu_timer *m_crtc_timer; - DECLARE_READ16_MEMBER(sound_busy_r); - DECLARE_WRITE16_MEMBER(rpunch_videoram_w); - DECLARE_WRITE16_MEMBER(rpunch_videoreg_w); - DECLARE_WRITE16_MEMBER(rpunch_scrollreg_w); - DECLARE_WRITE8_MEMBER(rpunch_gga_w); - DECLARE_WRITE8_MEMBER(rpunch_gga_data_w); - DECLARE_WRITE16_MEMBER(rpunch_ins_w); - DECLARE_WRITE8_MEMBER(upd_control_w); - DECLARE_WRITE8_MEMBER(upd_data_w); + u16 sound_busy_r(); + u8 pixmap_r(offs_t offset); + void pixmap_w(offs_t offset, u8 data); + void videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0); + void videoreg_w(offs_t offset, u16 data, u16 mem_mask = ~0); + void scrollreg_w(offs_t offset, u16 data, u16 mem_mask = ~0); + DECLARE_WRITE8_MEMBER(gga_w); + DECLARE_WRITE8_MEMBER(gga_data_w); + void sprite_ctrl_w(offs_t offset, u8 data); + void upd_control_w(u8 data); + void upd_data_w(u8 data); TILE_GET_INFO_MEMBER(get_bg0_tile_info); TILE_GET_INFO_MEMBER(get_bg1_tile_info); DECLARE_VIDEO_START(rpunch); DECLARE_VIDEO_START(svolley); - uint32_t screen_update_rpunch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_CALLBACK_MEMBER(crtc_interrupt_gen); - void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int start, int stop); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_bitmap(bitmap_ind16 &bitmap, const rectangle &cliprect); - void main_map(address_map &map); void sound_map(address_map &map); + void rpunch_map(address_map &map); + void svolley_map(address_map &map); void svolleybl_main_map(address_map &map); void svolleybl_sound_map(address_map &map); }; diff --git a/src/mame/video/rpunch.cpp b/src/mame/video/rpunch.cpp index 9aeef547d2a..2a5c2459c14 100644 --- a/src/mame/video/rpunch.cpp +++ b/src/mame/video/rpunch.cpp @@ -2,7 +2,7 @@ // copyright-holders:Aaron Giles /*************************************************************************** - video/rpunch.c + video/rpunch.cpp Functions to emulate the video hardware of the machine. @@ -12,11 +12,6 @@ #include "includes/rpunch.h" -#define BITMAP_WIDTH 304 -#define BITMAP_HEIGHT 224 -#define BITMAP_XOFFSET 4 - - /************************************* * * Tilemap callbacks @@ -25,8 +20,7 @@ TILE_GET_INFO_MEMBER(rpunch_state::get_bg0_tile_info) { - uint16_t *videoram = m_videoram; - int data = videoram[tile_index]; + const u16 data = m_videoram[tile_index]; int code; if (m_videoflags & 0x0400) code = (data & 0x0fff) | 0x2000; else code = (data & 0x1fff); @@ -39,8 +33,7 @@ TILE_GET_INFO_MEMBER(rpunch_state::get_bg0_tile_info) TILE_GET_INFO_MEMBER(rpunch_state::get_bg1_tile_info) { - uint16_t *videoram = m_videoram; - int data = videoram[0x2000 / 2 + tile_index]; + const u16 data = m_videoram[0x1000 | tile_index]; int code; if (m_videoflags & 0x0800) code = (data & 0x0fff) | 0x2000; else code = (data & 0x1fff); @@ -68,6 +61,7 @@ TIMER_CALLBACK_MEMBER(rpunch_state::crtc_interrupt_gen) VIDEO_START_MEMBER(rpunch_state,rpunch) { + m_videoflags = 0; m_sprite_xoffs = 0; /* allocate tilemaps for the backgrounds */ @@ -77,11 +71,15 @@ VIDEO_START_MEMBER(rpunch_state,rpunch) /* configure the tilemaps */ m_background[1]->set_transparent_pen(15); - if (m_bitmapram) - memset(m_bitmapram, 0xff, m_bitmapram.bytes()); + m_pixmap = std::make_unique(512, 256); + + const rectangle pixmap_rect(0,511,0,255); + m_pixmap->fill(0xf, pixmap_rect); /* reset the timer */ m_crtc_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rpunch_state::crtc_interrupt_gen),this)); + + save_item(NAME(*m_pixmap)); } @@ -93,28 +91,41 @@ VIDEO_START_MEMBER(rpunch_state,svolley) } - - - /************************************* * * Write handlers * *************************************/ -WRITE16_MEMBER(rpunch_state::rpunch_videoram_w) +u8 rpunch_state::pixmap_r(offs_t offset) { - uint16_t *videoram = m_videoram; - int tmap = offset >> 12; - int tile_index = offset & 0xfff; - COMBINE_DATA(&videoram[offset]); + const int sy = offset >> 8; + const int sx = (offset & 0xff) << 1; + + return ((m_pixmap->pix16(sy & 0xff, sx & ~1) & 0xf) << 4) | (m_pixmap->pix16(sy & 0xff, sx | 1) & 0xf); +} + +void rpunch_state::pixmap_w(offs_t offset, u8 data) +{ + const int sy = offset >> 8; + const int sx = (offset & 0xff) << 1; + + m_pixmap->pix16(sy & 0xff, sx & ~1) = ((data & 0xf0) >> 4); + m_pixmap->pix16(sy & 0xff, sx | 1) = (data & 0x0f); +} + +void rpunch_state::videoram_w(offs_t offset, u16 data, u16 mem_mask) +{ + const int tmap = offset >> 12; + const int tile_index = offset & 0xfff; + COMBINE_DATA(&m_videoram[offset]); m_background[tmap]->mark_tile_dirty(tile_index); } -WRITE16_MEMBER(rpunch_state::rpunch_videoreg_w) +void rpunch_state::videoreg_w(offs_t offset, u16 data, u16 mem_mask) { - int oldword = m_videoflags; + const int oldword = m_videoflags; COMBINE_DATA(&m_videoflags); if (m_videoflags != oldword) @@ -128,7 +139,7 @@ WRITE16_MEMBER(rpunch_state::rpunch_videoreg_w) } -WRITE16_MEMBER(rpunch_state::rpunch_scrollreg_w) +void rpunch_state::scrollreg_w(offs_t offset, u16 data, u16 mem_mask) { if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15) switch (offset) @@ -152,13 +163,13 @@ WRITE16_MEMBER(rpunch_state::rpunch_scrollreg_w) } -WRITE8_MEMBER(rpunch_state::rpunch_gga_w) +WRITE8_MEMBER(rpunch_state::gga_w) { m_gga->write(space, offset >> 5, data & 0xff); } -WRITE8_MEMBER(rpunch_state::rpunch_gga_data_w) +WRITE8_MEMBER(rpunch_state::gga_data_w) { switch (offset) { @@ -174,20 +185,17 @@ WRITE8_MEMBER(rpunch_state::rpunch_gga_data_w) } -WRITE16_MEMBER(rpunch_state::rpunch_ins_w) +void rpunch_state::sprite_ctrl_w(offs_t offset, u8 data) { - if (ACCESSING_BITS_0_7) + if (offset == 0) { - if (offset == 0) - { - m_gins = data & 0x3f; - logerror("GINS = %02X\n", data & 0x3f); - } - else - { - m_bins = data & 0x3f; - logerror("BINS = %02X\n", data & 0x3f); - } + m_sprite_num = data & 0x3f; + logerror("Number of sprites = %02X\n", data & 0x3f); + } + else + { + m_sprite_pri = data & 0x3f; + logerror("Sprite priority point = %02X\n", data & 0x3f); } } @@ -198,33 +206,36 @@ WRITE16_MEMBER(rpunch_state::rpunch_ins_w) * *************************************/ -void rpunch_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int start, int stop) +void rpunch_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint16_t *spriteram16 = m_spriteram; - int offs; - - start *= 4; - stop *= 4; - /* draw the sprites */ - for (offs = start; offs < stop; offs += 4) + int offs = m_sprite_num; + while (offs > 0) { - int data1 = spriteram16[offs + 1]; - int code = data1 & 0x7ff; + offs--; + const u32 ram = offs << 2; + u32 pri = 0; // above everything except direct mapped bitmap + /* this seems like the most plausible explanation */ + if (offs < m_sprite_pri) + pri |= GFX_PMASK_2; // behind foreground - int data0 = spriteram16[offs + 0]; - int data2 = spriteram16[offs + 2]; + const u16 data1 = m_spriteram[ram + 1]; + const u32 code = data1 & 0x7ff; + + const u16 data0 = m_spriteram[ram + 0]; + const u16 data2 = m_spriteram[ram + 2]; int x = (data2 & 0x1ff) + 8; int y = 513 - (data0 & 0x1ff); - int xflip = data1 & 0x1000; - int yflip = data1 & 0x0800; - int color = ((data1 >> 13) & 7) | ((m_videoflags & 0x0040) >> 3); + const bool xflip = data1 & 0x1000; + const bool yflip = data1 & 0x0800; + const u32 color = ((data1 >> 13) & 7) | ((m_videoflags & 0x0040) >> 3); - if (x >= BITMAP_WIDTH) x -= 512; - if (y >= BITMAP_HEIGHT) y -= 512; + if (x > cliprect.max_x) x -= 512; + if (y > cliprect.max_y) y -= 512; - m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, - code, color + (m_sprite_palette / 16), xflip, yflip, x+m_sprite_xoffs, y, 15); + m_gfxdecode->gfx(2)->prio_transpen(bitmap,cliprect, + code, color + (m_sprite_palette / 16), xflip, yflip, x + m_sprite_xoffs, y, + m_screen->priority(), pri, 15); } } @@ -237,25 +248,17 @@ void rpunch_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, void rpunch_state::draw_bitmap(bitmap_ind16 &bitmap, const rectangle &cliprect) { - int colourbase; - int xxx=512/4; - int yyy=256; - int x,y,count; + const u32 colourbase = 512 + ((m_videoflags & 0x000f) << 4); - colourbase = 512 + ((m_videoflags & 15) * 16); - - count = 0; - - for (y=0;ypix16(y & 0xff); + u16 *dst = &bitmap.pix16(y); + for(int x = cliprect.min_x / 4; x <= cliprect.max_x; x++) { - int coldat; - coldat = (m_bitmapram[count]>>12)&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+0)-4)&0x1ff) = coldat+colourbase; - coldat = (m_bitmapram[count]>>8 )&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+1)-4)&0x1ff) = coldat+colourbase; - coldat = (m_bitmapram[count]>>4 )&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+2)-4)&0x1ff) = coldat+colourbase; - coldat = (m_bitmapram[count]>>0 )&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+3)-4)&0x1ff) = coldat+colourbase; - count++; + const u16 pix = src[(x + 4) & 0x1ff]; + if ((pix & 0xf) != 0xf) + dst[x] = colourbase + pix; } } } @@ -267,18 +270,12 @@ void rpunch_state::draw_bitmap(bitmap_ind16 &bitmap, const rectangle &cliprect) * *************************************/ -uint32_t rpunch_state::screen_update_rpunch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 rpunch_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int effbins; - - /* this seems like the most plausible explanation */ - effbins = (m_bins > m_gins) ? m_gins : m_bins; - - m_background[0]->draw(screen, bitmap, cliprect, 0,0); - draw_sprites(bitmap, cliprect, 0, effbins); - m_background[1]->draw(screen, bitmap, cliprect, 0,0); - draw_sprites(bitmap, cliprect, effbins, m_gins); - if (m_bitmapram) - draw_bitmap(bitmap, cliprect); + screen.priority().fill(0, cliprect); + m_background[0]->draw(screen, bitmap, cliprect, 0,1); + m_background[1]->draw(screen, bitmap, cliprect, 0,2); + draw_sprites(bitmap, cliprect); + draw_bitmap(bitmap, cliprect); return 0; }