From b838ee71532a41d379f939c533d5763b9b6b3b93 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 26 May 2021 19:19:45 +0200 Subject: combatsc.cpp: converted to sublasses, views and (array of) finders --- src/mame/drivers/combatsc.cpp | 488 ++++++++++++++++++++---------------------- src/mame/includes/combatsc.h | 193 ++++++++++------- src/mame/video/combatsc.cpp | 176 +++++++-------- 3 files changed, 432 insertions(+), 425 deletions(-) diff --git a/src/mame/drivers/combatsc.cpp b/src/mame/drivers/combatsc.cpp index b8e06cdd8ad..e117e5bb410 100644 --- a/src/mame/drivers/combatsc.cpp +++ b/src/mame/drivers/combatsc.cpp @@ -75,14 +75,14 @@ a800 OKIM5205? fffc-ffff ??? - Notes about the sound systsem of the bootleg: + Notes about the sound system of the bootleg: --------------------------------------------- The positions 0x87f0-0x87ff are very important, it does work similar to a semaphore (same as a lot of vblank bits). For example in the init code, it writes - zero to 0x87fa, then it waits to it 'll be different + zero to 0x87fa, then it waits until it'll be different to zero, but it isn't written by this cpu. (shareram?) - I have tried put here a K007232 chip, but it didn't + I have tried to put here a K007232 chip, but it didn't work. Sound chips: OKI M5205 & YM2203 @@ -136,7 +136,7 @@ Dip location and recommended settings verified with the US manual * *************************************/ -void combatsc_state::combatsc_vreg_w(uint8_t data) +void combatsc_base_state::vreg_w(uint8_t data) { if (data != m_vreg) { @@ -149,76 +149,61 @@ void combatsc_state::combatsc_vreg_w(uint8_t data) } } -uint8_t combatsc_state::combatscb_io_r(offs_t offset) -{ - static const char *const portnames[] = { "IN0", "IN1", "DSW1", "DSW2" }; - - return ioport(portnames[offset])->read(); -} - -void combatsc_state::combatscb_priority_w(uint8_t data) +void combatscb_state::priority_w(uint8_t data) { if (data & 0x40) { m_video_circuit = 1; - m_videoram = m_page[1]; - m_scrollram = m_scrollram1; + m_video_view.select(1); } else { m_video_circuit = 0; - m_videoram = m_page[0]; - m_scrollram = m_scrollram0; + m_video_view.select(0); } m_priority = data & 0x20; } -void combatsc_state::combatsc_bankselect_w(uint8_t data) +void combatsc_state::bankselect_w(uint8_t data) { m_priority = data & 0x20; if (data & 0x40) { m_video_circuit = 1; - m_videoram = m_page[1]; - m_scrollram = m_scrollram1; + m_video_view.select(1); + m_scroll_view.select(1); } else { m_video_circuit = 0; - m_videoram = m_page[0]; - m_scrollram = m_scrollram0; + m_video_view.select(0); + m_scroll_view.select(0); } if (data & 0x10) - membank("bank1")->set_entry((data & 0x0e) >> 1); + m_mainbank->set_entry((data & 0x0e) >> 1); else - membank("bank1")->set_entry(8 + (data & 1)); + m_mainbank->set_entry(8 + (data & 1)); } -void combatsc_state::combatscb_io_w(offs_t offset, uint8_t data) +void combatscb_state::io_w(offs_t offset, uint8_t data) { - switch (offset) - { - case 0x400: combatscb_priority_w(data); break; - case 0x800: m_soundlatch->write(data); break; - case 0xc00: combatsc_vreg_w(data); break; - default: m_io_ram[offset] = data; break; - } + m_io_ram[offset] = data; } -void combatsc_state::combatscb_bankselect_w(address_space &space, uint8_t data) +void combatscb_state::bankselect_w(uint8_t data) { if (data & 0x40) { m_video_circuit = 1; - m_videoram = m_page[1]; + m_video_view.select(1); } else { m_video_circuit = 0; - m_videoram = m_page[0]; + m_video_view.select(0); } data = data & 0x1f; @@ -228,31 +213,27 @@ void combatsc_state::combatscb_bankselect_w(address_space &space, uint8_t data) m_bank_select = data; if (data & 0x10) - membank("bank1")->set_entry((data & 0x0e) >> 1); + m_mainbank->set_entry((data & 0x0e) >> 1); else - membank("bank1")->set_entry(8 + (data & 1)); + m_mainbank->set_entry(8 + (data & 1)); if (data == 0x1f) { - membank("bank1")->set_entry(8 + (data & 1)); - space.install_write_handler(0x4000, 0x7fff, write8sm_delegate(*this, FUNC(combatsc_state::combatscb_io_w))); - space.install_read_handler(0x4400, 0x4403, read8sm_delegate(*this, FUNC(combatsc_state::combatscb_io_r))); // IO RAM & Video Registers + m_mainbank->set_entry(8 + (data & 1)); + m_bank_io_view.select(0); } else - { - space.install_read_bank(0x4000, 0x7fff, membank("bank1")); /* banked ROM */ - space.unmap_write(0x4000, 0x7fff); /* banked ROM */ - } + m_bank_io_view.disable(); } } /****************************************************************************/ -void combatsc_state::combatsc_coin_counter_w(uint8_t data) +void combatsc_state::coin_counter_w(uint8_t data) { - /* b7-b3: unused? */ - /* b1: coin counter 2 */ - /* b0: coin counter 1 */ + // b7-b3: unused? + // b1: coin counter 2 + // b0: coin counter 1 machine().bookkeeping().coin_counter_w(0, data & 0x01); machine().bookkeeping().coin_counter_w(1, data & 0x02); @@ -266,16 +247,14 @@ uint8_t combatsc_state::trackball_r(offs_t offset) for (i = 0; i < 4; i++) { - uint8_t curr; - - curr = m_track_ports[i].read_safe(0xff); + uint8_t curr = m_track_ports[i].read_safe(0xff); dir[i] = curr - m_pos[i]; m_sign[i] = dir[i] & 0x80; m_pos[i] = curr; } - /* fix sign for orthogonal movements */ + // fix sign for orthogonal movements if (dir[0] || dir[1]) { if (!dir[0]) m_sign[0] = m_sign[1] ^ 0x80; @@ -294,29 +273,29 @@ uint8_t combatsc_state::trackball_r(offs_t offset) /****************************************************************************/ -void combatsc_state::combatsc_sh_irqtrigger_w(uint8_t data) +void combatsc_state::sh_irqtrigger_w(uint8_t data) { m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80 } -uint8_t combatsc_state::combatsc_busy_r() +uint8_t combatsc_state::busy_r() { return m_upd7759->busy_r() ? 1 : 0; } -void combatsc_state::combatsc_play_w(uint8_t data) +void combatsc_state::play_w(uint8_t data) { m_upd7759->start_w(data & 2); } -void combatsc_state::combatsc_voice_reset_w(uint8_t data) +void combatsc_state::voice_reset_w(uint8_t data) { m_upd7759->reset_w(data & 1); } -void combatsc_state::combatsc_portA_w(uint8_t data) +void combatsc_state::portA_w(uint8_t data) { - /* unknown. always write 0 */ + // unknown. always write 0 } // causes scores to disappear during fire ranges, either sprite busy flag or screen frame number related @@ -331,82 +310,97 @@ uint8_t combatsc_state::unk_r() * *************************************/ -void combatsc_state::combatsc_map(address_map &map) +void combatsc_state::main_map(address_map &map) { - map(0x0000, 0x0007).w(FUNC(combatsc_state::combatsc_pf_control_w)); + map(0x0000, 0x0007).w(FUNC(combatsc_state::pf_control_w)); map(0x001f, 0x001f).r(FUNC(combatsc_state::unk_r)); - map(0x0020, 0x005f).rw(FUNC(combatsc_state::combatsc_scrollram_r), FUNC(combatsc_state::combatsc_scrollram_w)); -// map(0x0060, 0x00ff).writeonly(); /* RAM */ + map(0x0020, 0x005f).view(m_scroll_view); + m_scroll_view[0](0x0020, 0x005f).ram().share(m_scrollram[0]); + m_scroll_view[1](0x0020, 0x005f).ram().share(m_scrollram[1]); +// map(0x0060, 0x00ff).writeonly(); // RAM map(0x0200, 0x0207).rw("k007452", FUNC(k007452_device::read), FUNC(k007452_device::write)); map(0x0400, 0x0400).portr("IN0"); - map(0x0401, 0x0401).portr("DSW3"); /* DSW #3 */ - map(0x0402, 0x0402).portr("DSW1"); /* DSW #1 */ - map(0x0403, 0x0403).portr("DSW2"); /* DSW #2 */ - map(0x0404, 0x0407).r(FUNC(combatsc_state::trackball_r)); /* 1P & 2P controls / trackball */ - map(0x0408, 0x0408).w(FUNC(combatsc_state::combatsc_coin_counter_w)); /* coin counters */ - map(0x040c, 0x040c).w(FUNC(combatsc_state::combatsc_vreg_w)); - map(0x0410, 0x0410).nopr().w(FUNC(combatsc_state::combatsc_bankselect_w)); // read is clr a (discarded) + map(0x0401, 0x0401).portr("DSW3"); + map(0x0402, 0x0402).portr("DSW1"); + map(0x0403, 0x0403).portr("DSW2"); + map(0x0404, 0x0407).r(FUNC(combatsc_state::trackball_r)); // 1P & 2P controls / trackball + map(0x0408, 0x0408).w(FUNC(combatsc_state::coin_counter_w)); + map(0x040c, 0x040c).w(FUNC(combatsc_state::vreg_w)); + map(0x0410, 0x0410).nopr().w(FUNC(combatsc_state::bankselect_w)); // read is clr a (discarded) map(0x0414, 0x0414).w(m_soundlatch, FUNC(generic_latch_8_device::write)); - map(0x0418, 0x0418).w(FUNC(combatsc_state::combatsc_sh_irqtrigger_w)); - map(0x041c, 0x041c).w("watchdog", FUNC(watchdog_timer_device::reset_w)); /* watchdog reset? */ + map(0x0418, 0x0418).w(FUNC(combatsc_state::sh_irqtrigger_w)); + map(0x041c, 0x041c).w("watchdog", FUNC(watchdog_timer_device::reset_w)); // watchdog reset? map(0x0600, 0x06ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette"); - map(0x0800, 0x1fff).ram(); /* RAM */ - map(0x2000, 0x3fff).rw(FUNC(combatsc_state::combatsc_video_r), FUNC(combatsc_state::combatsc_video_w)); - map(0x4000, 0x7fff).bankr("bank1"); /* banked ROM area */ - map(0x8000, 0xffff).rom(); /* ROM */ + map(0x0800, 0x1fff).ram(); + map(0x2000, 0x3fff).view(m_video_view); + m_video_view[0](0x2000, 0x3fff).ram().share(m_videoram[0]).w(FUNC(combatsc_state::videoview0_w)); + m_video_view[1](0x2000, 0x3fff).ram().share(m_videoram[1]).w(FUNC(combatsc_state::videoview1_w)); + map(0x4000, 0x7fff).bankr(m_mainbank); + map(0x8000, 0xffff).rom().region("maincpu", 0x28000); } -void combatsc_state::combatscb_map(address_map &map) +void combatscb_state::main_map(address_map &map) { map(0x0000, 0x04ff).ram(); - map(0x0500, 0x0500).w(FUNC(combatsc_state::combatscb_bankselect_w)); + map(0x0500, 0x0500).w(FUNC(combatscb_state::bankselect_w)); map(0x0600, 0x06ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette"); map(0x0800, 0x1fff).ram(); - map(0x2000, 0x3fff).rw(FUNC(combatsc_state::combatsc_video_r), FUNC(combatsc_state::combatsc_video_w)); - map(0x4000, 0x7fff).bankr("bank1"); /* banked ROM/RAM area */ - map(0x8000, 0xffff).rom(); /* ROM */ + map(0x2000, 0x3fff).view(m_video_view); + m_video_view[0](0x2000, 0x3fff).ram().share(m_videoram[0]).w(FUNC(combatscb_state::videoview0_w)); + m_video_view[1](0x2000, 0x3fff).ram().share(m_videoram[1]).w(FUNC(combatscb_state::videoview1_w)); + map(0x4000, 0x7fff).bankr(m_mainbank); + map(0x4000, 0x7fff).view(m_bank_io_view); + m_bank_io_view[0](0x4000, 0x7fff).w(FUNC(combatscb_state::io_w)); + m_bank_io_view[0](0x4400, 0x4400).w(FUNC(combatscb_state::priority_w)); + m_bank_io_view[0](0x4800, 0x4800).w(m_soundlatch, FUNC(generic_latch_8_device::write)); + m_bank_io_view[0](0x4c00, 0x4c00).w(FUNC(combatscb_state::vreg_w)); + m_bank_io_view[0](0x4400, 0x4400).portr("IN0"); + m_bank_io_view[0](0x4401, 0x4401).portr("IN1"); + m_bank_io_view[0](0x4402, 0x4402).portr("DSW1"); + m_bank_io_view[0](0x4403, 0x4403).portr("DSW2"); + map(0x8000, 0xffff).rom().region("maincpu", 0x28000); } -void combatsc_state::combatsc_sound_map(address_map &map) +void combatsc_state::sound_map(address_map &map) { - map(0x0000, 0x7fff).rom(); /* ROM */ - map(0x8000, 0x87ff).ram(); /* RAM */ + map(0x0000, 0x7fff).rom(); + map(0x8000, 0x87ff).ram(); - map(0x9000, 0x9000).w(FUNC(combatsc_state::combatsc_play_w)); /* upd7759 play voice */ - map(0xa000, 0xa000).w(m_upd7759, FUNC(upd7759_device::port_w)); /* upd7759 voice select */ - map(0xb000, 0xb000).r(FUNC(combatsc_state::combatsc_busy_r)); /* upd7759 busy? */ - map(0xc000, 0xc000).w(FUNC(combatsc_state::combatsc_voice_reset_w)); /* upd7759 reset? */ + map(0x9000, 0x9000).w(FUNC(combatsc_state::play_w)); // upd7759 play voice + map(0xa000, 0xa000).w(m_upd7759, FUNC(upd7759_device::port_w)); // upd7759 voice select + map(0xb000, 0xb000).r(FUNC(combatsc_state::busy_r)); // upd7759 busy? + map(0xc000, 0xc000).w(FUNC(combatsc_state::voice_reset_w)); // upd7759 reset? - map(0xd000, 0xd000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); /* soundlatch read? */ - map(0xe000, 0xe001).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); /* YM 2203 intercepted */ + map(0xd000, 0xd000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); // soundlatch read? + map(0xe000, 0xe001).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); // YM 2203 intercepted } -void combatsc_state::combatscb_msm_w(uint8_t data) +void combatscb_state::msm_w(uint8_t data) { - membank("bl_abank")->set_entry(BIT(data, 7)); + m_soundbank->set_entry(BIT(data, 7)); m_msm->reset_w(BIT(data, 4)); m_msm->data_w(data & 0x0f); } -void combatsc_state::combatscb_sound_irq_ack(uint8_t data) +void combatscb_state::sound_irq_ack(uint8_t data) { m_audiocpu->set_input_line(0, CLEAR_LINE); } -void combatsc_state::combatscb_sound_map(address_map &map) +void combatscb_state::sound_map(address_map &map) { - map(0x0000, 0x7fff).rom(); /* ROM */ - map(0x8000, 0x87ff).ram(); /* RAM */ - map(0x9000, 0x9001).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); /* YM 2203 */ - map(0x9008, 0x9009).r("ymsnd", FUNC(ym2203_device::read)); /* ??? */ - map(0x9800, 0x9800).w(FUNC(combatsc_state::combatscb_msm_w)); - map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); /* soundlatch read? */ - map(0xa800, 0xa800).w(FUNC(combatsc_state::combatscb_sound_irq_ack)); - map(0xc000, 0xffff).bankr("bl_abank"); + map(0x0000, 0x7fff).rom(); + map(0x8000, 0x87ff).ram(); + map(0x9000, 0x9001).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); + map(0x9008, 0x9009).r("ymsnd", FUNC(ym2203_device::read)); // ??? + map(0x9800, 0x9800).w(FUNC(combatscb_state::msm_w)); + map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); // soundlatch read? + map(0xa800, 0xa800).w(FUNC(combatscb_state::sound_irq_ack)); + map(0xc000, 0xffff).bankr(m_soundbank); } /************************************* @@ -434,9 +428,9 @@ static INPUT_PORTS_START( common_inputs ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x00, "SW3:2" ) /* Not Used according to the manual */ + PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x00, "SW3:2" ) // Not Used according to the manual PORT_SERVICE_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:3" ) - PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x00, "SW3:4" ) /* Not Used according to the manual */ + PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x00, "SW3:4" ) // Not Used according to the manual INPUT_PORTS_END static INPUT_PORTS_START( dips ) @@ -475,16 +469,16 @@ static INPUT_PORTS_START( dips ) PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) - /* None = coin slot B disabled */ + // None = coin slot B disabled PORT_START("DSW2") - PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW2:1" ) /* Not Used according to the manual */ - PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW2:2" ) /* Not Used according to the manual */ + PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW2:1" ) // Not Used according to the manual + PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW2:2" ) // Not Used according to the manual PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW2:4" ) /* Not Used according to the manual */ - PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW2:5" ) /* Not Used according to the manual */ + PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW2:4" ) // Not Used according to the manual + PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW2:5" ) // Not Used according to the manual PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) @@ -516,14 +510,14 @@ static INPUT_PORTS_START( combatsct ) PORT_INCLUDE( common_inputs ) - /* trackball 1P */ + // trackball 1P PORT_START("TRACK0_Y") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_REVERSE PORT_PLAYER(1) PORT_START("TRACK0_X") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_PLAYER(1) - /* trackball 2P (not implemented yet) */ + // trackball 2P (not implemented yet) PORT_START("TRACK1_Y") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(10) PORT_REVERSE PORT_PLAYER(2) @@ -583,9 +577,9 @@ static const gfx_layout gfxlayout = static const gfx_layout tile_layout = { 8,8, - 0x2000, /* number of tiles */ - 4, /* bitplanes */ - { 0*0x10000*8, 1*0x10000*8, 2*0x10000*8, 3*0x10000*8 }, /* plane offsets */ + 0x2000, // number of tiles + 4, // bitplanes + { 0*0x10000*8, 1*0x10000*8, 2*0x10000*8, 3*0x10000*8 }, // plane offsets { 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 @@ -594,9 +588,9 @@ static const gfx_layout tile_layout = static const gfx_layout sprite_layout = { 16,16, - 0x800, /* number of sprites */ - 4, /* bitplanes */ - { 3*0x10000*8, 2*0x10000*8, 1*0x10000*8, 0*0x10000*8 }, /* plane offsets */ + 0x800, // number of sprites + 4, // bitplanes + { 3*0x10000*8, 2*0x10000*8, 1*0x10000*8, 0*0x10000*8 }, // plane offsets { 0,1,2,3,4,5,6,7, 16*8+0,16*8+1,16*8+2,16*8+3,16*8+4,16*8+5,16*8+6,16*8+7 @@ -627,46 +621,40 @@ GFXDECODE_END * *************************************/ -MACHINE_START_MEMBER(combatsc_state,combatsc) +void combatsc_base_state::machine_start() { - uint8_t *MEM = memregion("maincpu")->base() + 0x38000; - - m_io_ram = MEM + 0x0000; - m_page[0] = MEM + 0x4000; - m_page[1] = MEM + 0x6000; - - m_interleave_timer = machine().scheduler().timer_alloc(timer_expired_delegate()); - - membank("bank1")->configure_entries(0, 10, memregion("maincpu")->base() + 0x10000, 0x4000); + m_mainbank->configure_entries(0, 10, memregion("maincpu")->base(), 0x4000); save_item(NAME(m_priority)); save_item(NAME(m_vreg)); - save_item(NAME(m_bank_select)); save_item(NAME(m_video_circuit)); - save_item(NAME(m_boost)); +} + +void combatsc_state::machine_start() +{ + combatsc_base_state::machine_start(); + save_item(NAME(m_pos)); save_item(NAME(m_sign)); - save_pointer(NAME(m_page[0]),0x2000); - save_pointer(NAME(m_page[1]),0x2000); - save_pointer(NAME(m_scrollram0), 0x40); - save_pointer(NAME(m_scrollram1), 0x40); } -MACHINE_START_MEMBER(combatsc_state,combatscb) +void combatscb_state::machine_start() +{ + combatsc_base_state::machine_start(); + + m_soundbank->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000); + + save_item(NAME(m_bank_select)); +} + +void combatsc_base_state::machine_reset() { - MACHINE_START_CALL_MEMBER( combatsc ); - membank("bl_abank")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000); + m_vreg = -1; } void combatsc_state::machine_reset() { - memset(m_io_ram, 0x00, 0x4000); - memset(m_page[0], 0x00, 0x2000); - memset(m_page[1], 0x00, 0x2000); - - m_vreg = -1; - m_boost = 1; - m_bank_select = -1; + combatsc_base_state::machine_reset(); for (int i = 0; i < 4; i++) { @@ -674,94 +662,96 @@ void combatsc_state::machine_reset() m_sign[i] = 0; } - combatsc_bankselect_w(0); + bankselect_w(0); +} + +void combatscb_state::machine_reset() +{ + combatsc_base_state::machine_reset(); + + m_bank_select = -1; + + bankselect_w(0); } -/* combat school (original) */ + +// Combat School (original) void combatsc_state::combatsc(machine_config &config) { - /* basic machine hardware */ - HD6309(config, m_maincpu, 3000000*4); /* 3 MHz? */ - m_maincpu->set_addrmap(AS_PROGRAM, &combatsc_state::combatsc_map); + // basic machine hardware + HD6309(config, m_maincpu, 3000000*4); // 3 MHz? + m_maincpu->set_addrmap(AS_PROGRAM, &combatsc_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(combatsc_state::irq0_line_hold)); - Z80(config, m_audiocpu, 3579545); /* 3.579545 MHz */ - m_audiocpu->set_addrmap(AS_PROGRAM, &combatsc_state::combatsc_sound_map); + Z80(config, m_audiocpu, 3579545); // 3.579545 MHz + m_audiocpu->set_addrmap(AS_PROGRAM, &combatsc_state::sound_map); config.set_maximum_quantum(attotime::from_hz(1200)); - MCFG_MACHINE_START_OVERRIDE(combatsc_state,combatsc) - WATCHDOG_TIMER(config, "watchdog"); KONAMI_007452_MATH(config, "k007452"); - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // m_screen->set_refresh_hz(60); -// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ +// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate // m_screen->set_size(32*8, 32*8); // m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1); m_screen->set_raw(XTAL(24'000'000)/3, 528, 0, 256, 256, 16, 240); // not accurate, assuming same to other Konami games (59.17) - m_screen->set_screen_update(FUNC(combatsc_state::screen_update_combatsc)); + m_screen->set_screen_update(FUNC(combatsc_state::screen_update)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_combatsc); - PALETTE(config, m_palette, FUNC(combatsc_state::combatsc_palette)); + PALETTE(config, m_palette, FUNC(combatsc_state::palette)); m_palette->set_format(palette_device::xBGR_555, 8 * 16 * 16, 128); m_palette->set_endianness(ENDIANNESS_LITTLE); - MCFG_VIDEO_START_OVERRIDE(combatsc_state,combatsc) - - K007121(config, m_k007121_1, 0); - m_k007121_1->set_palette_tag(m_palette); - K007121(config, m_k007121_2, 0); - m_k007121_2->set_palette_tag(m_palette); + K007121(config, m_k007121[0], 0); + m_k007121[0]->set_palette_tag(m_palette); + K007121(config, m_k007121[1], 0); + m_k007121[1]->set_palette_tag(m_palette); - /* sound hardware */ + // sound hardware SPEAKER(config, "mono").front_center(); GENERIC_LATCH_8(config, m_soundlatch); ym2203_device &ymsnd(YM2203(config, "ymsnd", 3000000)); - ymsnd.port_a_write_callback().set(FUNC(combatsc_state::combatsc_portA_w)); + ymsnd.port_a_write_callback().set(FUNC(combatsc_state::portA_w)); ymsnd.add_route(ALL_OUTPUTS, "mono", 0.20); UPD7759(config, m_upd7759).add_route(ALL_OUTPUTS, "mono", 0.70); } -/* combat school (bootleg on different hardware) */ -void combatsc_state::combatscb(machine_config &config) +// Combat School (bootleg on different hardware) +void combatscb_state::combatscb(machine_config &config) { - /* basic machine hardware */ - HD6309(config, m_maincpu, 3000000*4); /* 3 MHz? */ - m_maincpu->set_addrmap(AS_PROGRAM, &combatsc_state::combatscb_map); + // basic machine hardware + HD6309(config, m_maincpu, 3000000*4); // 3 MHz? + m_maincpu->set_addrmap(AS_PROGRAM, &combatscb_state::main_map); m_maincpu->set_vblank_int("screen", FUNC(combatsc_state::irq0_line_hold)); - Z80(config, m_audiocpu, 3579545); /* 3.579545 MHz */ - m_audiocpu->set_addrmap(AS_PROGRAM, &combatsc_state::combatscb_sound_map); + Z80(config, m_audiocpu, 3579545); // 3.579545 MHz + m_audiocpu->set_addrmap(AS_PROGRAM, &combatscb_state::sound_map); config.set_maximum_quantum(attotime::from_hz(1200)); - MCFG_MACHINE_START_OVERRIDE(combatsc_state,combatscb) - - /* video hardware */ + // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate m_screen->set_size(32*8, 32*8); m_screen->set_visarea(0*8, 32*8-1, 2*8, 30*8-1); - m_screen->set_screen_update(FUNC(combatsc_state::screen_update_combatscb)); + m_screen->set_screen_update(FUNC(combatscb_state::screen_update)); m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_combatscb); - PALETTE(config, m_palette, FUNC(combatsc_state::combatscb_palette)); + PALETTE(config, m_palette, FUNC(combatscb_state::palette)); m_palette->set_format(palette_device::xBGR_555, 8 * 16 * 16, 128); m_palette->set_endianness(ENDIANNESS_LITTLE); - MCFG_VIDEO_START_OVERRIDE(combatsc_state,combatscb) - SPEAKER(config, "mono").front_center(); GENERIC_LATCH_8(config, m_soundlatch); @@ -784,13 +774,11 @@ void combatsc_state::combatscb(machine_config &config) *************************************/ ROM_START( combatsc ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "611g01.rom", 0x30000, 0x08000, CRC(857ffffe) SHA1(de7566d58314df4b7fdc07eb31a3f9bdd12d1a73) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) - /* extra 0x8000 for banked RAM */ + ROM_REGION( 0x30000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "611g02.rom", 0x00000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) + ROM_LOAD( "611g01.rom", 0x20000, 0x10000, CRC(857ffffe) SHA1(de7566d58314df4b7fdc07eb31a3f9bdd12d1a73) ) - ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000 , "audiocpu", 0 ) ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) ROM_REGION( 0x80000, "gfx1", 0 ) @@ -802,28 +790,26 @@ ROM_START( combatsc ) ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) ) ROM_REGION( 0x0400, "proms", 0 ) - ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ - ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ + ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table + ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table - ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */ + ROM_REGION( 0x20000, "upd", 0 ) ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) ROM_REGION( 0x0600, "plds", 0 ) ROM_LOAD( "ampal16l8.e7", 0x0000, 0x0104, CRC(300a9936) SHA1(a4a87e93f41392fc7d7d8601d7187d87b9f9ab01) ) - ROM_LOAD( "pal16r6.16d", 0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */ - ROM_LOAD( "pal20l8.8h", 0x0400, 0x0144, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "pal16r6.16d", 0x0200, 0x0104, NO_DUMP ) // PAL is read protected + ROM_LOAD( "pal20l8.8h", 0x0400, 0x0144, NO_DUMP ) // PAL is read protected ROM_END ROM_START( combatsct ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "g01.rom", 0x30000, 0x08000, CRC(489c132f) SHA1(c717195f89add4be4a21ecc1ddd58361b0ab4a74) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) - /* extra 0x8000 for banked RAM */ + ROM_REGION( 0x30000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "611g02.rom", 0x00000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) + ROM_LOAD( "g01.rom", 0x20000, 0x10000, CRC(489c132f) SHA1(c717195f89add4be4a21ecc1ddd58361b0ab4a74) ) - ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000 , "audiocpu", 0 ) ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) ROM_REGION( 0x80000, "gfx1", 0 ) @@ -835,23 +821,21 @@ ROM_START( combatsct ) ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) ) ROM_REGION( 0x0400, "proms", 0 ) - ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ - ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ + ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table + ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table - ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */ + ROM_REGION( 0x20000, "upd", 0 ) ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) ROM_END ROM_START( combatscj ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "611p01.a14", 0x30000, 0x08000, CRC(d748268e) SHA1(91588b6a0d3af47065204b980a56544a9f29b6d9) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) - /* extra 0x8000 for banked RAM */ + ROM_REGION( 0x30000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "611g02.rom", 0x00000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) + ROM_LOAD( "611p01.a14", 0x20000, 0x10000, CRC(d748268e) SHA1(91588b6a0d3af47065204b980a56544a9f29b6d9) ) - ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000 , "audiocpu", 0 ) ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) ROM_REGION( 0x80000, "gfx1", 0 ) @@ -863,23 +847,21 @@ ROM_START( combatscj ) ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) ) ROM_REGION( 0x0400, "proms", 0 ) - ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ - ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ + ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table + ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table - ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */ + ROM_REGION( 0x20000, "upd", 0 ) ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) ROM_END ROM_START( bootcamp ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "xxx-v01.12a", 0x30000, 0x08000, CRC(c10dca64) SHA1(f34de26e998b1501e430d46e96cdc58ebc68481e) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) - /* extra 0x8000 for banked RAM */ + ROM_REGION( 0x30000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "611g02.rom", 0x00000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) + ROM_LOAD( "xxx-v01.12a", 0x20000, 0x10000, CRC(c10dca64) SHA1(f34de26e998b1501e430d46e96cdc58ebc68481e) ) - ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000 , "audiocpu", 0 ) ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) ROM_REGION( 0x80000, "gfx1", 0 ) @@ -891,23 +873,21 @@ ROM_START( bootcamp ) ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) ) ROM_REGION( 0x0400, "proms", 0 ) - ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ - ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ + ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table + ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table - ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */ + ROM_REGION( 0x20000, "upd", 0 ) ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) ROM_END ROM_START( bootcampa ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 6309 code */ - ROM_LOAD( "611x01.a-14", 0x30000, 0x08000, CRC(98ffc6ed) SHA1(ab02532333272683d889f209d3fc01235871d909) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "611g02.rom", 0x10000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) - /* extra 0x8000 for banked RAM */ + ROM_REGION( 0x30000, "maincpu", 0 ) // 6309 code + ROM_LOAD( "611g02.rom", 0x00000, 0x20000, CRC(9ba05327) SHA1(ea03845fb49d18ac4fca97cfffce81db66b9967b) ) + ROM_LOAD( "611x01.a-14", 0x20000, 0x10000, CRC(98ffc6ed) SHA1(ab02532333272683d889f209d3fc01235871d909) ) - ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x10000 , "audiocpu", 0 ) ROM_LOAD( "611g03.rom", 0x00000, 0x08000, CRC(2a544db5) SHA1(94a97c3c54bf13ccc665aa5057ac6b1d700fae2d) ) ROM_REGION( 0x80000, "gfx1", 0 ) @@ -919,49 +899,47 @@ ROM_START( bootcampa ) ROM_LOAD16_BYTE( "611g12.rom", 0x00001, 0x40000, CRC(9c6bf898) SHA1(eafc227b4e7df0c652ec7d78784c039c35965fdc) ) ROM_REGION( 0x0400, "proms", 0 ) - ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ - ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) /* sprites lookup table */ - ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) /* chars lookup table */ + ROM_LOAD( "611g06.h14", 0x0000, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g05.h15", 0x0100, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table + ROM_LOAD( "611g10.h6", 0x0200, 0x0100, CRC(f916129a) SHA1(d5e4a8a3baab8fcdac86ef5182858cede1abf040) ) // sprites lookup table + ROM_LOAD( "611g09.h7", 0x0300, 0x0100, CRC(207a7b07) SHA1(f4e638e7f182e5228a062b243406d0ceaaa5bfdc) ) // chars lookup table - ROM_REGION( 0x20000, "upd", 0 ) /* uPD7759 data */ + ROM_REGION( 0x20000, "upd", 0 ) ROM_LOAD( "611g04.rom", 0x00000, 0x20000, CRC(2987e158) SHA1(87c5129161d3be29a339083349807e60b625c3f7) ) ROM_END ROM_START( combatscb ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 6809 code */ - ROM_LOAD( "combat.002", 0x30000, 0x08000, CRC(0996755d) SHA1(bb6bbbf7ab3b5fab5e1c6cebc7b3f0d720493c3b) ) - ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "combat.003", 0x10000, 0x10000, CRC(229c93b2) SHA1(ac3fd3df1bb5f6a461d0d1423c50568348ef69df) ) - ROM_LOAD( "combat.004", 0x20000, 0x10000, CRC(a069cb84) SHA1(f49f70afb17df46b16f5801ef42edb0706730723) ) - /* extra 0x8000 for banked RAM */ - - ROM_REGION( 0x10000 , "audiocpu", 0 ) /* sound CPU */ + ROM_REGION( 0x30000, "maincpu", 0 ) // 6809 code + ROM_LOAD( "combat.003", 0x00000, 0x10000, CRC(229c93b2) SHA1(ac3fd3df1bb5f6a461d0d1423c50568348ef69df) ) + ROM_LOAD( "combat.004", 0x10000, 0x10000, CRC(a069cb84) SHA1(f49f70afb17df46b16f5801ef42edb0706730723) ) + ROM_LOAD( "combat.002", 0x20000, 0x10000, CRC(0996755d) SHA1(bb6bbbf7ab3b5fab5e1c6cebc7b3f0d720493c3b) ) + + ROM_REGION( 0x10000 , "audiocpu", 0 ) ROM_LOAD( "combat.001", 0x00000, 0x10000, CRC(61456b3b) SHA1(320db628283dd1bec465e95020d1a1158e6d6ae4) ) ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT ) - ROM_LOAD( "combat.006", 0x00000, 0x10000, CRC(8dc29a1f) SHA1(564dd7c6acff34db93b8e300dda563f5f38ba159) ) /* tiles, bank 0 */ + ROM_LOAD( "combat.006", 0x00000, 0x10000, CRC(8dc29a1f) SHA1(564dd7c6acff34db93b8e300dda563f5f38ba159) ) // tiles, bank 0 ROM_LOAD( "combat.008", 0x10000, 0x10000, CRC(61599f46) SHA1(cfd79a88bb496773daf207552c67f595ee696bc4) ) ROM_LOAD( "combat.010", 0x20000, 0x10000, CRC(d5cda7cd) SHA1(140db6270c3f358aa27013db3bb819a48ceb5142) ) ROM_LOAD( "combat.012", 0x30000, 0x10000, CRC(ca0a9f57) SHA1(d6b3daf7c34345bb2f64068d480bd51d7bb36e4d) ) - ROM_LOAD( "combat.005", 0x40000, 0x10000, CRC(0803a223) SHA1(67d4162385dd56d5396e181070bfa6760521eb45) ) /* tiles, bank 1 */ + ROM_LOAD( "combat.005", 0x40000, 0x10000, CRC(0803a223) SHA1(67d4162385dd56d5396e181070bfa6760521eb45) ) // tiles, bank 1 ROM_LOAD( "combat.007", 0x50000, 0x10000, CRC(23caad0c) SHA1(0544cde479c6d4192da5bb4b6f0e2e75d09663c3) ) ROM_LOAD( "combat.009", 0x60000, 0x10000, CRC(5ac80383) SHA1(1e89c371a92afc000d593daebda4156952a15244) ) ROM_LOAD( "combat.011", 0x70000, 0x10000, CRC(cda83114) SHA1(12d2a9f694287edb3bb0ee7a8ba0e0724dad8e1f) ) ROM_REGION( 0x80000, "gfx2", ROMREGION_INVERT ) - ROM_LOAD( "combat.013", 0x00000, 0x10000, CRC(4bed2293) SHA1(3369de47d4ba041d9f17a18dcca2af7ac9f8bc0c) ) /* sprites, bank 0 */ + ROM_LOAD( "combat.013", 0x00000, 0x10000, CRC(4bed2293) SHA1(3369de47d4ba041d9f17a18dcca2af7ac9f8bc0c) ) // sprites, bank 0 ROM_LOAD( "combat.015", 0x10000, 0x10000, CRC(26c41f31) SHA1(f8eb7d0729a21a0dd92ce99c9cda0cde9526b861) ) ROM_LOAD( "combat.017", 0x20000, 0x10000, CRC(6071e6da) SHA1(ba5f8e83b07faaffc564d3568630e17efdb5a09f) ) ROM_LOAD( "combat.019", 0x30000, 0x10000, CRC(3b1cf1b8) SHA1(ff4de37c051bcb374c44d1b99006ff6ff5e1f927) ) - ROM_LOAD( "combat.014", 0x40000, 0x10000, CRC(82ea9555) SHA1(59bf7836938ce9e3242d1cca754de8dbe85bbfb7) ) /* sprites, bank 1 */ + ROM_LOAD( "combat.014", 0x40000, 0x10000, CRC(82ea9555) SHA1(59bf7836938ce9e3242d1cca754de8dbe85bbfb7) ) // sprites, bank 1 ROM_LOAD( "combat.016", 0x50000, 0x10000, CRC(2e39bb70) SHA1(a6c4acd93cc803e987de6e18fbdc5ce4634b14a8) ) ROM_LOAD( "combat.018", 0x60000, 0x10000, CRC(575db729) SHA1(6b1676da4f24fc90c77262789b6cc116184ab912) ) ROM_LOAD( "combat.020", 0x70000, 0x10000, CRC(8d748a1a) SHA1(4386e14e19b91e053033dde2a13019bc6d8e1d5a) ) ROM_REGION( 0x0200, "proms", 0 ) - ROM_LOAD( "prom.d10", 0x0000, 0x0100, CRC(265f4c97) SHA1(76f1b75a593d3d77ef6173a1948f842d5b27d418) ) /* sprites lookup table */ - ROM_LOAD( "prom.c11", 0x0100, 0x0100, CRC(a7a5c0b4) SHA1(48bfc3af40b869599a988ebb3ed758141bcfd4fc) ) /* priority? */ + ROM_LOAD( "prom.d10", 0x0000, 0x0100, CRC(265f4c97) SHA1(76f1b75a593d3d77ef6173a1948f842d5b27d418) ) // sprites lookup table + ROM_LOAD( "prom.c11", 0x0100, 0x0100, CRC(a7a5c0b4) SHA1(48bfc3af40b869599a988ebb3ed758141bcfd4fc) ) // priority? ROM_END @@ -973,7 +951,7 @@ ROM_END void combatsc_state::init_combatsc() { - /* joystick instead of trackball */ + // joystick instead of trackball m_maincpu->space(AS_PROGRAM).install_read_port(0x0404, 0x0404, "IN1"); } @@ -984,9 +962,9 @@ void combatsc_state::init_combatsc() * *************************************/ -GAME( 1988, combatsc, 0, combatsc, combatsc, combatsc_state, init_combatsc, ROT0, "Konami", "Combat School (joystick)", 0 ) -GAME( 1987, combatsct, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Combat School (trackball)", MACHINE_NOT_WORKING ) -GAME( 1987, combatscj, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Combat School (Japan trackball)", MACHINE_NOT_WORKING ) -GAME( 1987, bootcamp, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Boot Camp (set 1)", MACHINE_NOT_WORKING ) -GAME( 1987, bootcampa, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Boot Camp (set 2)", MACHINE_NOT_WORKING ) -GAME( 1988, combatscb, combatsc, combatscb, combatscb, combatsc_state, empty_init, ROT0, "bootleg", "Combat School (bootleg)", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND ) +GAME( 1988, combatsc, 0, combatsc, combatsc, combatsc_state, init_combatsc, ROT0, "Konami", "Combat School (joystick)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, combatsct, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Combat School (trackball)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, combatscj, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Combat School (Japan trackball)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, bootcamp, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Boot Camp (set 1)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, bootcampa, combatsc, combatsc, combatsct, combatsc_state, empty_init, ROT0, "Konami", "Boot Camp (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, combatscb, combatsc, combatscb, combatscb, combatscb_state, empty_init, ROT0, "bootleg (Datsu)", "Combat School (bootleg)", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/combatsc.h b/src/mame/includes/combatsc.h index 6cd256c1454..231dab18262 100644 --- a/src/mame/includes/combatsc.h +++ b/src/mame/includes/combatsc.h @@ -11,68 +11,51 @@ #pragma once #include "machine/gen_latch.h" -#include "sound/upd7759.h" +#include "machine/k007452.h" #include "sound/msm5205.h" +#include "sound/upd7759.h" #include "video/k007121.h" -#include "machine/k007452.h" #include "emupal.h" #include "screen.h" #include "tilemap.h" -class combatsc_state : public driver_device +class combatsc_base_state : public driver_device { public: - combatsc_state(const machine_config &mconfig, device_type type, const char *tag) : + combatsc_base_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_videoram(*this, "videoram%u", 0U), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_k007121_1(*this, "k007121_1"), - m_k007121_2(*this, "k007121_2"), - m_k007452(*this, "k007452"), - m_upd7759(*this, "upd"), - m_msm(*this, "msm"), m_screen(*this, "screen"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_soundlatch(*this, "soundlatch"), - m_track_ports(*this, {"TRACK0_Y", "TRACK0_X", "TRACK1_Y", "TRACK1_X"}) + m_track_ports(*this, {"TRACK0_Y", "TRACK0_X", "TRACK1_Y", "TRACK1_X"}), + m_mainbank(*this, "mainbank"), + m_video_view(*this, "video_view") { } - /* memory pointers */ - uint8_t * m_videoram; - uint8_t * m_scrollram; - uint8_t * m_io_ram; - std::unique_ptr m_spriteram[2]; +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // memory pointers + required_shared_ptr_array m_videoram; + std::unique_ptr m_spriteram[2]; - /* video-related */ + // video-related tilemap_t *m_bg_tilemap[2]; tilemap_t *m_textlayer; - uint8_t m_scrollram0[0x40]; - uint8_t m_scrollram1[0x40]; - int m_priority; - - int m_vreg; - int m_bank_select; /* 0x00..0x1f */ - int m_video_circuit; /* 0 or 1 */ - bool m_textflip; - uint8_t *m_page[2]; - - /* misc */ - uint8_t m_pos[4]; - uint8_t m_sign[4]; - int m_boost; - emu_timer *m_interleave_timer; + uint8_t m_priority; + uint8_t m_vreg; + uint8_t m_video_circuit; // 0 or 1 - /* devices */ + // devices required_device m_maincpu; required_device m_audiocpu; - optional_device m_k007121_1; - optional_device m_k007121_2; - optional_device m_k007452; - optional_device m_upd7759; - optional_device m_msm; required_device m_screen; required_device m_gfxdecode; required_device m_palette; @@ -80,51 +63,109 @@ public: optional_ioport_array<4> m_track_ports; - void combatsc_vreg_w(uint8_t data); - uint8_t combatscb_io_r(offs_t offset); - void combatscb_priority_w(uint8_t data); - void combatsc_bankselect_w(uint8_t data); - void combatscb_io_w(offs_t offset, uint8_t data); - void combatscb_bankselect_w(address_space &space, uint8_t data); - void combatsc_coin_counter_w(uint8_t data); + required_memory_bank m_mainbank; + memory_view m_video_view; + + void vreg_w(uint8_t data); + void videoview0_w(offs_t offset, uint8_t data); + void videoview1_w(offs_t offset, uint8_t data); +}; + +class combatsc_state : public combatsc_base_state +{ +public: + combatsc_state(const machine_config &mconfig, device_type type, const char *tag) : + combatsc_base_state(mconfig, type, tag), + m_k007121(*this, "k007121_%u", 1U), + m_k007452(*this, "k007452"), + m_upd7759(*this, "upd"), + m_scrollram(*this, "scrollram%u", 0U), + m_scroll_view(*this, "scrollview") + { + } + + void combatsc(machine_config &config); + + void init_combatsc(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + +private: + required_device_array m_k007121; + required_device m_k007452; + required_device m_upd7759; + required_shared_ptr_array m_scrollram; + memory_view m_scroll_view; + + bool m_textflip; + + // misc + uint8_t m_pos[4]; + uint8_t m_sign[4]; + + void bankselect_w(uint8_t data); + void coin_counter_w(uint8_t data); uint8_t trackball_r(offs_t offset); uint8_t unk_r(); - void combatsc_sh_irqtrigger_w(uint8_t data); - uint8_t combatsc_video_r(offs_t offset); - void combatsc_video_w(offs_t offset, uint8_t data); - void combatsc_pf_control_w(offs_t offset, uint8_t data); - uint8_t combatsc_scrollram_r(offs_t offset); - void combatsc_scrollram_w(offs_t offset, uint8_t data); - uint8_t combatsc_busy_r(); - void combatsc_play_w(uint8_t data); - void combatsc_voice_reset_w(uint8_t data); - void combatsc_portA_w(uint8_t data); - void combatscb_msm_w(uint8_t data); - void combatscb_sound_irq_ack(uint8_t data); - void init_combatsc(); + void sh_irqtrigger_w(uint8_t data); + void pf_control_w(offs_t offset, uint8_t data); + uint8_t busy_r(); + void play_w(uint8_t data); + void voice_reset_w(uint8_t data); + void portA_w(uint8_t data); TILE_GET_INFO_MEMBER(get_tile_info0); TILE_GET_INFO_MEMBER(get_tile_info1); TILE_GET_INFO_MEMBER(get_text_info); - TILE_GET_INFO_MEMBER(get_tile_info0_bootleg); - TILE_GET_INFO_MEMBER(get_tile_info1_bootleg); - TILE_GET_INFO_MEMBER(get_text_info_bootleg); - virtual void machine_reset() override; - DECLARE_MACHINE_START(combatsc); - DECLARE_VIDEO_START(combatsc); - void combatsc_palette(palette_device &palette) const; - DECLARE_MACHINE_START(combatscb); - DECLARE_VIDEO_START(combatscb); - void combatscb_palette(palette_device &palette) const; - uint32_t screen_update_combatsc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_combatscb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit, bitmap_ind8 &priority_bitmap, uint32_t pri_mask ); - void bootleg_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit ); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit, bitmap_ind8 &priority_bitmap, uint32_t pri_mask); + void main_map(address_map &map); + void sound_map(address_map &map); +}; + +class combatscb_state : public combatsc_base_state +{ +public: + combatscb_state(const machine_config &mconfig, device_type type, const char *tag) : + combatsc_base_state(mconfig, type, tag), + m_msm(*this, "msm"), + m_soundbank(*this, "soundbank"), + m_io_ram(*this, "io_ram", 0x4000, ENDIANNESS_BIG), + m_bank_io_view(*this, "bank_io_view") + { + } + void combatscb(machine_config &config); - void combatsc(machine_config &config); - void combatsc_map(address_map &map); - void combatsc_sound_map(address_map &map); - void combatscb_map(address_map &map); - void combatscb_sound_map(address_map &map); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + +private: + required_device m_msm; + required_memory_bank m_soundbank; + memory_share_creator m_io_ram; + memory_view m_bank_io_view; + + uint8_t m_bank_select; // 0x00..0x1f + + void priority_w(uint8_t data); + void io_w(offs_t offset, uint8_t data); + void bankselect_w(uint8_t data); + void msm_w(uint8_t data); + void sound_irq_ack(uint8_t data); + TILE_GET_INFO_MEMBER(get_tile_info0); + TILE_GET_INFO_MEMBER(get_tile_info1); + TILE_GET_INFO_MEMBER(get_text_info); + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit); + void main_map(address_map &map); + void sound_map(address_map &map); }; #endif // MAME_INCLUDES_COMBATSC_H diff --git a/src/mame/video/combatsc.cpp b/src/mame/video/combatsc.cpp index a77789f9e71..b2f65c0e42e 100644 --- a/src/mame/video/combatsc.cpp +++ b/src/mame/video/combatsc.cpp @@ -2,7 +2,7 @@ // copyright-holders:Phil Stroffolino, Manuel Abadia /*************************************************************************** - video.c + combatsc.cpp Functions to emulate the video hardware of the machine. @@ -12,7 +12,7 @@ #include "includes/combatsc.h" -void combatsc_state::combatsc_palette(palette_device &palette) const +void combatsc_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -59,7 +59,7 @@ void combatsc_state::combatsc_palette(palette_device &palette) const } -void combatsc_state::combatscb_palette(palette_device &palette) const +void combatscb_state::palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); @@ -91,8 +91,8 @@ void combatsc_state::combatscb_palette(palette_device &palette) const TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0) { - uint8_t ctrl_6 = m_k007121_1->ctrlram_r(6); - uint8_t attributes = m_page[0][tile_index]; + uint8_t ctrl_6 = m_k007121[0]->ctrlram_r(6); + uint8_t attributes = m_videoram[0][tile_index]; int bank = 4 * ((m_vreg & 0x0f) - 1); int number, color; @@ -100,7 +100,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0) bank = 0; if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ + bank = 0; // text bank if (attributes & 0x80) bank += 1; @@ -113,7 +113,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0) color = ((ctrl_6 & 0x10) * 2 + 16) + (attributes & 0x0f); - number = m_page[0][tile_index + 0x400] + 256 * bank; + number = m_videoram[0][tile_index + 0x400] + 256 * bank; tileinfo.set(0, number, @@ -124,8 +124,8 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0) TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1) { - uint8_t ctrl_6 = m_k007121_2->ctrlram_r(6); - uint8_t attributes = m_page[1][tile_index]; + uint8_t ctrl_6 = m_k007121[1]->ctrlram_r(6); + uint8_t attributes = m_videoram[1][tile_index]; int bank = 4 * ((m_vreg >> 4) - 1); int number, color; @@ -133,7 +133,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1) bank = 0; if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ + bank = 0; // text bank if (attributes & 0x80) bank += 1; @@ -146,7 +146,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1) color = ((ctrl_6 & 0x10) * 2 + 16 + 4 * 16) + (attributes & 0x0f); - number = m_page[1][tile_index + 0x400] + 256 * bank; + number = m_videoram[1][tile_index + 0x400] + 256 * bank; tileinfo.set(1, number, @@ -157,8 +157,8 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1) TILE_GET_INFO_MEMBER(combatsc_state::get_text_info) { - uint8_t attributes = m_page[0][tile_index + 0x800]; - int number = m_page[0][tile_index + 0xc00]; + uint8_t attributes = m_videoram[0][tile_index + 0x800]; + int number = m_videoram[0][tile_index + 0xc00]; int color = 16 + (attributes & 0x0f); tileinfo.set(0, @@ -168,9 +168,9 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_text_info) } -TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0_bootleg) +TILE_GET_INFO_MEMBER(combatscb_state::get_tile_info0) { - uint8_t attributes = m_page[0][tile_index]; + uint8_t attributes = m_videoram[0][tile_index]; int bank = 4 * ((m_vreg & 0x0f) - 1); int number, pal, color; @@ -178,7 +178,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0_bootleg) bank = 0; if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ + bank = 0; // text bank if (attributes & 0x80) bank += 1; @@ -191,7 +191,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0_bootleg) pal = (bank == 0 || bank >= 0x1c || (attributes & 0x40)) ? 1 : 3; color = pal*16;// + (attributes & 0x0f); - number = m_page[0][tile_index + 0x400] + 256 * bank; + number = m_videoram[0][tile_index + 0x400] + 256 * bank; tileinfo.set(0, number, @@ -199,9 +199,9 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0_bootleg) 0); } -TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1_bootleg) +TILE_GET_INFO_MEMBER(combatscb_state::get_tile_info1) { - uint8_t attributes = m_page[1][tile_index]; + uint8_t attributes = m_videoram[1][tile_index]; int bank = 4*((m_vreg >> 4) - 1); int number, pal, color; @@ -209,7 +209,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1_bootleg) bank = 0; if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ + bank = 0; // text bank if (attributes & 0x80) bank += 1; @@ -222,7 +222,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1_bootleg) pal = (bank == 0 || bank >= 0x1c || (attributes & 0x40)) ? 5 : 7; color = pal * 16;// + (attributes & 0x0f); - number = m_page[1][tile_index + 0x400] + 256 * bank; + number = m_videoram[1][tile_index + 0x400] + 256 * bank; tileinfo.set(1, number, @@ -230,10 +230,10 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1_bootleg) 0); } -TILE_GET_INFO_MEMBER(combatsc_state::get_text_info_bootleg) +TILE_GET_INFO_MEMBER(combatscb_state::get_text_info) { -// uint8_t attributes = m_page[0][tile_index + 0x800]; - int number = m_page[0][tile_index + 0xc00]; +// uint8_t attributes = m_videoram[0][tile_index + 0x800]; + int number = m_videoram[0][tile_index + 0xc00]; int color = 16;// + (attributes & 0x0f); tileinfo.set(1, @@ -248,7 +248,7 @@ TILE_GET_INFO_MEMBER(combatsc_state::get_text_info_bootleg) ***************************************************************************/ -VIDEO_START_MEMBER(combatsc_state,combatsc) +void combatsc_state::video_start() { m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info0)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info1)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); @@ -265,13 +265,14 @@ VIDEO_START_MEMBER(combatsc_state,combatsc) save_pointer(NAME(m_spriteram[0]), 0x800); save_pointer(NAME(m_spriteram[1]), 0x800); + save_item(NAME(m_textflip)); } -VIDEO_START_MEMBER(combatsc_state,combatscb) +void combatscb_state::video_start() { - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info0_bootleg)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info1_bootleg)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_textlayer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_text_info_bootleg)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatscb_state::get_tile_info0)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatscb_state::get_tile_info1)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_textlayer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatscb_state::get_text_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); m_spriteram[0] = make_unique_clear(0x800); m_spriteram[1] = make_unique_clear(0x800); @@ -293,37 +294,39 @@ VIDEO_START_MEMBER(combatsc_state,combatscb) ***************************************************************************/ -uint8_t combatsc_state::combatsc_video_r(offs_t offset) +void combatsc_base_state::videoview0_w(offs_t offset, uint8_t data) { - return m_videoram[offset]; -} - -void combatsc_state::combatsc_video_w(offs_t offset, uint8_t data) -{ - m_videoram[offset] = data; + m_videoram[0][offset] = data; if (offset < 0x800) { - if (m_video_circuit) - m_bg_tilemap[1]->mark_tile_dirty(offset & 0x3ff); - else - m_bg_tilemap[0]->mark_tile_dirty(offset & 0x3ff); + m_bg_tilemap[0]->mark_tile_dirty(offset & 0x3ff); } - else if (offset < 0x1000 && m_video_circuit == 0) + else if (offset < 0x1000) { m_textlayer->mark_tile_dirty(offset & 0x3ff); } } -void combatsc_state::combatsc_pf_control_w(offs_t offset, uint8_t data) +void combatsc_base_state::videoview1_w(offs_t offset, uint8_t data) +{ + m_videoram[1][offset] = data; + + if (offset < 0x800) + { + m_bg_tilemap[1]->mark_tile_dirty(offset & 0x3ff); + } +} + +void combatsc_state::pf_control_w(offs_t offset, uint8_t data) { - k007121_device *k007121 = m_video_circuit ? m_k007121_2 : m_k007121_1; + k007121_device *k007121 = m_video_circuit ? m_k007121[1] : m_k007121[0]; k007121->ctrl_w(offset, data); if (offset == 7) { m_bg_tilemap[m_video_circuit]->set_flip((data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - if(m_video_circuit == 0) + if (m_video_circuit == 0) { m_textflip = (data & 0x08) == 0x08; m_textlayer->set_flip((data & 0x08) ? TILEMAP_FLIPY | TILEMAP_FLIPX : 0); @@ -332,69 +335,55 @@ void combatsc_state::combatsc_pf_control_w(offs_t offset, uint8_t data) if (offset == 3) { if (data & 0x08) - memcpy(m_spriteram[m_video_circuit].get(), m_page[m_video_circuit] + 0x1000, 0x800); + memcpy(m_spriteram[m_video_circuit].get(), m_videoram[m_video_circuit] + 0x1000, 0x800); else - memcpy(m_spriteram[m_video_circuit].get(), m_page[m_video_circuit] + 0x1800, 0x800); + memcpy(m_spriteram[m_video_circuit].get(), m_videoram[m_video_circuit] + 0x1800, 0x800); } } -uint8_t combatsc_state::combatsc_scrollram_r(offs_t offset) -{ - return m_scrollram[offset]; -} - -void combatsc_state::combatsc_scrollram_w(offs_t offset, uint8_t data) -{ - m_scrollram[offset] = data; -} - - - /*************************************************************************** Display Refresh ***************************************************************************/ -void combatsc_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit, bitmap_ind8 &priority_bitmap, uint32_t pri_mask ) +void combatsc_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit, bitmap_ind8 &priority_bitmap, uint32_t pri_mask) { - k007121_device *k007121 = circuit ? m_k007121_2 : m_k007121_1; + k007121_device *k007121 = circuit ? m_k007121[1] : m_k007121[0]; int base_color = (circuit * 4) * 16 + (k007121->ctrlram_r(6) & 0x10) * 2; k007121->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(circuit), *m_palette, source, base_color, 0, 0, priority_bitmap, pri_mask); } -uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t combatsc_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int i; - - if (m_k007121_1->ctrlram_r(1) & 0x02) + if (m_k007121[0]->ctrlram_r(1) & 0x02) { m_bg_tilemap[0]->set_scroll_rows(32); - for (i = 0; i < 32; i++) - m_bg_tilemap[0]->set_scrollx(i, m_scrollram0[i]); + for (int i = 0; i < 32; i++) + m_bg_tilemap[0]->set_scrollx(i, m_scrollram[0][i]); } else { m_bg_tilemap[0]->set_scroll_rows(1); - m_bg_tilemap[0]->set_scrollx(0, m_k007121_1->ctrlram_r(0) | ((m_k007121_1->ctrlram_r(1) & 0x01) << 8)); + m_bg_tilemap[0]->set_scrollx(0, m_k007121[0]->ctrlram_r(0) | ((m_k007121[0]->ctrlram_r(1) & 0x01) << 8)); } - if (m_k007121_2->ctrlram_r(1) & 0x02) + if (m_k007121[1]->ctrlram_r(1) & 0x02) { m_bg_tilemap[1]->set_scroll_rows(32); - for (i = 0; i < 32; i++) - m_bg_tilemap[1]->set_scrollx(i, m_scrollram1[i]); + for (int i = 0; i < 32; i++) + m_bg_tilemap[1]->set_scrollx(i, m_scrollram[1][i]); } else { m_bg_tilemap[1]->set_scroll_rows(1); - m_bg_tilemap[1]->set_scrollx(0, m_k007121_2->ctrlram_r(0) | ((m_k007121_2->ctrlram_r(1) & 0x01) << 8)); + m_bg_tilemap[1]->set_scrollx(0, m_k007121[1]->ctrlram_r(0) | ((m_k007121[1]->ctrlram_r(1) & 0x01) << 8)); } - m_bg_tilemap[0]->set_scrolly(0, m_k007121_1->ctrlram_r(2)); - m_bg_tilemap[1]->set_scrolly(0, m_k007121_2->ctrlram_r(2)); + m_bg_tilemap[0]->set_scrolly(0, m_k007121[0]->ctrlram_r(2)); + m_bg_tilemap[1]->set_scrolly(0, m_k007121[1]->ctrlram_r(2)); screen.priority().fill(0, cliprect); @@ -405,7 +394,7 @@ uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_in m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, 1); m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 1, 2); - /* we use the priority buffer so sprites are drawn front to back */ + // we use the priority buffer so sprites are drawn front to back draw_sprites(bitmap, cliprect, m_spriteram[1].get(), 1, screen.priority(), 0x0f00); draw_sprites(bitmap, cliprect, m_spriteram[0].get(), 0, screen.priority(), 0x4444); } @@ -414,7 +403,7 @@ uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_in m_bg_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 0, 1); m_bg_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 2); - /* we use the priority buffer so sprites are drawn front to back */ + // we use the priority buffer so sprites are drawn front to back // drill sergeant ribbons goes here, MT #06259 draw_sprites(bitmap, cliprect, m_spriteram[1].get(), 1, screen.priority(), 0x0f00); // guess: move the face as well (should go behind hands but it isn't tested) @@ -424,16 +413,17 @@ uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_in m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 8); } - //if (m_k007121_1->ctrlram_r(1) & 0x08) + //if (m_k007121[0]->ctrlram_r(1) & 0x08) { rectangle clip; clip = cliprect; - for (i = 0; i < 32; i++) + for (int i = 0; i < 32; i++) { // scrollram [0x20]-[0x3f]: char enable (presumably bit 0 only) uint8_t base_scroll = m_textflip == true ? (0x3f - i) : (0x20 + i); - if(m_scrollram[base_scroll] == 0) + auto slot = m_scroll_view.entry(); + if (m_scrollram[*slot][base_scroll] == 0) continue; @@ -441,12 +431,12 @@ uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_in clip.max_y = clip.min_y + 7; // bit 3 of reg [1] selects if tiles are opaque or have transparent pen. - m_textlayer->draw(screen, bitmap, clip, m_k007121_1->ctrlram_r(1) & 0x08 ? TILEMAP_DRAW_OPAQUE : 0, 0); + m_textlayer->draw(screen, bitmap, clip, m_k007121[0]->ctrlram_r(1) & 0x08 ? TILEMAP_DRAW_OPAQUE : 0, 0); } } - /* chop the extreme columns if necessary */ - if (m_k007121_1->ctrlram_r(3) & 0x40) + // chop the extreme columns if necessary + if (m_k007121[0]->ctrlram_r(3) & 0x40) { rectangle clip; @@ -489,7 +479,7 @@ byte #4: ***************************************************************************/ -void combatsc_state::bootleg_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit ) +void combatscb_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit) { address_space &space = m_maincpu->space(AS_PROGRAM); gfx_element *gfx = m_gfxdecode->gfx(circuit + 2); @@ -507,12 +497,12 @@ void combatsc_state::bootleg_draw_sprites( bitmap_ind16 &bitmap, const rectangle while (source > finish) { - uint8_t attributes = source[3]; /* PBxF ?xxX */ + uint8_t attributes = source[3]; // PBxF ?xxX { int number = source[0]; int x = source[2] - 71 + (attributes & 0x01)*256; int y = 242 - source[1]; - uint8_t color = source[4]; /* CCCC xxBB */ + uint8_t color = source[4]; // CCCC xxBB int bank = (color & 0x03) | ((attributes & 0x40) >> 4); @@ -521,25 +511,23 @@ void combatsc_state::bootleg_draw_sprites( bitmap_ind16 &bitmap, const rectangle color = (circuit * 4) * 16 + (color >> 4); - /* hacks to select alternate palettes */ + // hacks to select alternate palettes // if(m_vreg == 0x40 && (attributes & 0x40)) color += 1*16; // if(m_vreg == 0x23 && (attributes & 0x02)) color += 1*16; // if(m_vreg == 0x66 ) color += 2*16; gfx->transpen(bitmap,cliprect, number, color, - attributes & 0x10,0, /* flip */ + attributes & 0x10,0, // flip x, y, 15 ); } source -= 8; } } -uint32_t combatsc_state::screen_update_combatscb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t combatscb_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int i; - - for (i = 0; i < 32; i++) + for (int i = 0; i < 32; i++) { m_bg_tilemap[0]->set_scrollx(i, m_io_ram[0x040 + i] + 5); m_bg_tilemap[1]->set_scrollx(i, m_io_ram[0x060 + i] + 3); @@ -550,16 +538,16 @@ uint32_t combatsc_state::screen_update_combatscb(screen_device &screen, bitmap_i if (m_priority == 0) { m_bg_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - bootleg_draw_sprites(bitmap,cliprect, m_page[0], 0); + draw_sprites(bitmap, cliprect, m_videoram[0], 0); m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0 ,0); - bootleg_draw_sprites(bitmap,cliprect, m_page[1], 1); + draw_sprites(bitmap, cliprect, m_videoram[1], 1); } else { m_bg_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - bootleg_draw_sprites(bitmap,cliprect, m_page[0], 0); + draw_sprites(bitmap, cliprect, m_videoram[0], 0); m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); - bootleg_draw_sprites(bitmap,cliprect, m_page[1], 1); + draw_sprites(bitmap, cliprect, m_videoram[1], 1); } m_textlayer->draw(screen, bitmap, cliprect, 0, 0); -- cgit v1.2.3