Merge pull request #4521 from cam900/homerun

homerun.cpp : Cleanups / Updates
This commit is contained in:
R. Belmont 2019-01-18 20:09:18 -05:00 committed by GitHub
commit c907852448
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 127 additions and 124 deletions

View File

@ -66,7 +66,7 @@ Notes:
***************************************************************************/ ***************************************************************************/
WRITE8_MEMBER(homerun_state::homerun_control_w) void homerun_state::control_w(u8 data)
{ {
// d0, d1: somehow related to port $40? // d0, d1: somehow related to port $40?
@ -95,7 +95,7 @@ WRITE8_MEMBER(homerun_state::homerun_control_w)
m_control = data; m_control = data;
} }
WRITE8_MEMBER(homerun_state::homerun_d7756_sample_w) void homerun_state::d7756_sample_w(u8 data)
{ {
m_sample = data; m_sample = data;
@ -103,21 +103,21 @@ WRITE8_MEMBER(homerun_state::homerun_d7756_sample_w)
m_d7756->port_w(data); m_d7756->port_w(data);
} }
void homerun_state::homerun_memmap(address_map &map) void homerun_state::mem_map(address_map &map)
{ {
map(0x0000, 0x3fff).rom(); map(0x0000, 0x3fff).rom();
map(0x4000, 0x7fff).bankr("bank1"); map(0x4000, 0x7fff).bankr("mainbank");
map(0x8000, 0x9fff).ram().w(FUNC(homerun_state::homerun_videoram_w)).share("videoram"); map(0x8000, 0x9fff).ram().w(FUNC(homerun_state::videoram_w)).share("videoram");
map(0xa000, 0xa0ff).ram().share("spriteram"); map(0xa000, 0xa0ff).ram().share("spriteram");
map(0xb000, 0xb03f).ram().w(FUNC(homerun_state::homerun_color_w)).share("colorram"); map(0xb000, 0xb03f).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xc000, 0xdfff).ram(); map(0xc000, 0xdfff).ram();
} }
void homerun_state::homerun_iomap(address_map &map) void homerun_state::io_map(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map(0x10, 0x10).w(FUNC(homerun_state::homerun_d7756_sample_w)); map(0x10, 0x10).w(FUNC(homerun_state::d7756_sample_w));
map(0x20, 0x20).w(FUNC(homerun_state::homerun_control_w)); map(0x20, 0x20).w(FUNC(homerun_state::control_w));
map(0x30, 0x33).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x30, 0x33).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x40, 0x40).portr("IN0"); map(0x40, 0x40).portr("IN0");
map(0x50, 0x50).portr("IN2"); map(0x50, 0x50).portr("IN2");
@ -152,7 +152,7 @@ CUSTOM_INPUT_MEMBER(homerun_state::ganjaja_hopper_status_r)
static INPUT_PORTS_START( homerun ) static INPUT_PORTS_START( homerun )
PORT_START("IN0") PORT_START("IN0")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_sprite0_r, nullptr) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, sprite0_r, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_d7756_busy_r, nullptr) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_d7756_busy_r, nullptr)
PORT_BIT( 0x37, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x37, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@ -189,7 +189,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( dynashot ) static INPUT_PORTS_START( dynashot )
PORT_START("IN0") PORT_START("IN0")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_sprite0_r, nullptr) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, sprite0_r, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) // doesn't have d7756 PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) // doesn't have d7756
PORT_BIT( 0x37, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x37, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@ -227,7 +227,7 @@ static INPUT_PORTS_START( ganjaja )
PORT_START("IN0") PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // ? PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // ?
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, homerun_sprite0_r, nullptr) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, sprite0_r, nullptr)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, ganjaja_d7756_busy_r, nullptr) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, homerun_state, ganjaja_d7756_busy_r, nullptr)
PORT_BIT( 0x36, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x36, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@ -301,8 +301,8 @@ static const gfx_layout gfxlayout =
RGN_FRAC(1,1), RGN_FRAC(1,1),
2, 2,
{ 8*8,0}, { 8*8,0},
{ 0, 1, 2, 3, 4, 5, 6, 7}, { STEP8(0,1) },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8}, { STEP8(0,8) },
8*8*2 8*8*2
}; };
@ -312,8 +312,8 @@ static const gfx_layout spritelayout =
RGN_FRAC(1,1), RGN_FRAC(1,1),
2, 2,
{ 8*8,0 }, { 8*8,0 },
{ 0, 1, 2, 3, 4, 5, 6, 7,0+8*8*2,1+8*8*2,2+8*8*2,3+8*8*2,4+8*8*2,5+8*8*2,6+8*8*2,7+8*8*2}, { STEP8(0,1), STEP8(8*8*2,1) },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 0*8+2*8*8*2,1*8+2*8*8*2,2*8+2*8*8*2,3*8+2*8*8*2,4*8+2*8*8*2,5*8+2*8*8*2,6*8+2*8*8*2,7*8+2*8*8*2}, { STEP8(0,8), STEP8(8*8*2*2,8) },
8*8*2*4 8*8*2*4
}; };
@ -327,23 +327,19 @@ GFXDECODE_END
void homerun_state::machine_start() void homerun_state::machine_start()
{ {
uint8_t *ROM = memregion("maincpu")->base(); u8 *ROM = memregion("maincpu")->base();
membank("bank1")->configure_entry(0, &ROM[0x00000]); m_mainbank->configure_entries(0, 8, &ROM[0x00000], 0x4000);
membank("bank1")->configure_entries(1, 7, &ROM[0x10000], 0x4000);
save_item(NAME(m_control)); save_item(NAME(m_control));
save_item(NAME(m_sample)); save_item(NAME(m_sample));
save_item(NAME(m_gfx_ctrl));
save_item(NAME(m_scrolly));
save_item(NAME(m_scrollx));
} }
void homerun_state::machine_reset() void homerun_state::machine_reset()
{ {
m_control = 0; control_w(0);
m_sample = 0; d7756_sample_w(0);
m_gfx_ctrl = 0; banking_w(0);
m_scrolly = 0; m_scrolly = 0;
m_scrollx = 0; m_scrollx = 0;
} }
@ -354,30 +350,30 @@ void homerun_state::dynashot(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
Z80(config, m_maincpu, XTAL(20'000'000)/4); Z80(config, m_maincpu, XTAL(20'000'000)/4);
m_maincpu->set_addrmap(AS_PROGRAM, &homerun_state::homerun_memmap); m_maincpu->set_addrmap(AS_PROGRAM, &homerun_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &homerun_state::homerun_iomap); m_maincpu->set_addrmap(AS_IO, &homerun_state::io_map);
m_maincpu->set_vblank_int("screen", FUNC(homerun_state::irq0_line_hold)); m_maincpu->set_vblank_int("screen", FUNC(homerun_state::irq0_line_hold));
i8255_device &ppi(I8255A(config, "ppi8255")); i8255_device &ppi(I8255A(config, "ppi8255"));
ppi.out_pa_callback().set(FUNC(homerun_state::homerun_scrollhi_w)); ppi.out_pa_callback().set(FUNC(homerun_state::scrollhi_w));
ppi.out_pb_callback().set(FUNC(homerun_state::homerun_scrolly_w)); ppi.out_pb_callback().set(FUNC(homerun_state::scrolly_w));
ppi.out_pc_callback().set(FUNC(homerun_state::homerun_scrollx_w)); ppi.out_pc_callback().set(FUNC(homerun_state::scrollx_w));
/* video hardware */ /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(XTAL(20'000'000)/4,328,0,256,253,0,240); m_screen->set_raw(XTAL(20'000'000)/4,328,0,256,253,0,240);
m_screen->set_screen_update(FUNC(homerun_state::screen_update_homerun)); m_screen->set_screen_update(FUNC(homerun_state::screen_update));
m_screen->set_palette(m_palette); m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_homerun); GFXDECODE(config, m_gfxdecode, m_palette, gfx_homerun);
PALETTE(config, m_palette).set_entries(16*4); PALETTE(config, m_palette).set_format(1, &homerun_state::homerun_RGB332, 16*4);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
ym2203_device &ymsnd(YM2203(config, "ymsnd", XTAL(20'000'000)/8)); ym2203_device &ymsnd(YM2203(config, "ymsnd", XTAL(20'000'000)/8));
ymsnd.port_a_read_callback().set_ioport("DSW"); ymsnd.port_a_read_callback().set_ioport("DSW");
ymsnd.port_b_write_callback().set(FUNC(homerun_state::homerun_banking_w)); ymsnd.port_b_write_callback().set(FUNC(homerun_state::banking_w));
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.50); ymsnd.add_route(ALL_OUTPUTS, "mono", 0.50);
} }
@ -412,9 +408,8 @@ void homerun_state::ganjaja(machine_config &config)
/**************************************************************************/ /**************************************************************************/
ROM_START( homerun ) ROM_START( homerun )
ROM_REGION( 0x30000, "maincpu", 0 ) ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "homerun.ic43", 0x00000, 0x04000, CRC(e759e476) SHA1(ad4f356ff26209033320a3e6353e4d4d9beb59c1) ) ROM_LOAD( "homerun.ic43", 0x00000, 0x20000, CRC(e759e476) SHA1(ad4f356ff26209033320a3e6353e4d4d9beb59c1) )
ROM_CONTINUE( 0x10000, 0x1c000)
ROM_REGION( 0x10000, "gfx1", 0 ) ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "homerun.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) ) ROM_LOAD( "homerun.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) )
@ -427,9 +422,8 @@ ROM_START( homerun )
ROM_END ROM_END
ROM_START( nhomerun ) ROM_START( nhomerun )
ROM_REGION( 0x30000, "maincpu", 0 ) ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "1.ic43", 0x00000, 0x04000, CRC(aed96d6d) SHA1(5cb3932f4cfa3f6c0134ac20a1747c562db31a65) ) ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(aed96d6d) SHA1(5cb3932f4cfa3f6c0134ac20a1747c562db31a65) )
ROM_CONTINUE( 0x10000, 0x1c000)
ROM_REGION( 0x10000, "gfx1", 0 ) ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) ) ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(69a720d1) SHA1(0f0a4877578f358e9e829ece8c31e23f01adcf83) )
@ -442,9 +436,8 @@ ROM_START( nhomerun )
ROM_END ROM_END
ROM_START( dynashot ) ROM_START( dynashot )
ROM_REGION( 0x30000, "maincpu", 0 ) ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "1.ic43", 0x00000, 0x04000, CRC(bf3c9586) SHA1(439effbda305f5fa265e5897c81dc1447e5d867d) ) ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(bf3c9586) SHA1(439effbda305f5fa265e5897c81dc1447e5d867d) )
ROM_CONTINUE( 0x10000, 0x1c000)
ROM_REGION( 0x10000, "gfx1", 0 ) ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(77d6a608) SHA1(a31ff343a5d4d6f20301c030ecc2e252149bcf9d) ) ROM_LOAD( "3.ic60", 0x00000, 0x10000, CRC(77d6a608) SHA1(a31ff343a5d4d6f20301c030ecc2e252149bcf9d) )
@ -455,9 +448,8 @@ ROM_END
ROM_START( ganjaja ) ROM_START( ganjaja )
ROM_REGION( 0x30000, "maincpu", 0 ) ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "1.ic43", 0x00000, 0x04000, CRC(dad57543) SHA1(dbd8b5cee33756ee5e3c41bf84c0f7141d3466dc) ) ROM_LOAD( "1.ic43", 0x00000, 0x20000, CRC(dad57543) SHA1(dbd8b5cee33756ee5e3c41bf84c0f7141d3466dc) )
ROM_CONTINUE( 0x10000, 0x1c000)
ROM_REGION( 0x10000, "gfx1", 0 ) ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "ic60", 0x00000, 0x10000, CRC(855f6b28) SHA1(386411e88cf9bed54fe2073f0828d579cb1d04ee) ) ROM_LOAD( "ic60", 0x00000, 0x10000, CRC(855f6b28) SHA1(386411e88cf9bed54fe2073f0828d579cb1d04ee) )

View File

@ -14,62 +14,65 @@
class homerun_state : public driver_device class homerun_state : public driver_device
{ {
public: public:
homerun_state(const machine_config &mconfig, device_type type, const char *tag) homerun_state(const machine_config &mconfig, device_type type, const char *tag) :
: driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_videoram(*this, "videoram"), m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"), m_spriteram(*this, "spriteram"),
m_colorram(*this, "colorram"),
m_d7756(*this, "d7756"), m_d7756(*this, "d7756"),
m_samples(*this, "samples"), m_samples(*this, "samples"),
m_gfxdecode(*this, "gfxdecode"), m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"), m_screen(*this, "screen"),
m_palette(*this, "palette") m_palette(*this, "palette"),
m_mainbank(*this, "mainbank")
{ } { }
void ganjaja(machine_config &config); void ganjaja(machine_config &config);
void dynashot(machine_config &config); void dynashot(machine_config &config);
void homerun(machine_config &config); void homerun(machine_config &config);
DECLARE_CUSTOM_INPUT_MEMBER(homerun_sprite0_r); DECLARE_CUSTOM_INPUT_MEMBER(sprite0_r);
DECLARE_CUSTOM_INPUT_MEMBER(homerun_d7756_busy_r); DECLARE_CUSTOM_INPUT_MEMBER(homerun_d7756_busy_r);
DECLARE_CUSTOM_INPUT_MEMBER(ganjaja_d7756_busy_r); DECLARE_CUSTOM_INPUT_MEMBER(ganjaja_d7756_busy_r);
DECLARE_CUSTOM_INPUT_MEMBER(ganjaja_hopper_status_r); DECLARE_CUSTOM_INPUT_MEMBER(ganjaja_hopper_status_r);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private: private:
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_videoram; required_shared_ptr<u8> m_videoram;
required_shared_ptr<uint8_t> m_spriteram; required_shared_ptr<u8> m_spriteram;
required_shared_ptr<uint8_t> m_colorram;
optional_device<upd7756_device> m_d7756; optional_device<upd7756_device> m_d7756;
optional_device<samples_device> m_samples; optional_device<samples_device> m_samples;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen; required_device<screen_device> m_screen;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
uint8_t m_control; required_memory_bank m_mainbank;
uint8_t m_sample;
u8 m_control;
u8 m_sample;
tilemap_t *m_tilemap; tilemap_t *m_tilemap;
int m_gfx_ctrl; int m_gfx_ctrl;
int m_scrollx; int m_scrollx;
int m_scrolly; int m_scrolly;
DECLARE_WRITE8_MEMBER(homerun_control_w); void control_w(u8 data);
DECLARE_WRITE8_MEMBER(homerun_d7756_sample_w); void d7756_sample_w(u8 data);
DECLARE_WRITE8_MEMBER(homerun_videoram_w); DECLARE_WRITE8_MEMBER(videoram_w);
DECLARE_WRITE8_MEMBER(homerun_color_w); DECLARE_WRITE8_MEMBER(scrollhi_w);
DECLARE_WRITE8_MEMBER(homerun_scrollhi_w); DECLARE_WRITE8_MEMBER(scrolly_w);
DECLARE_WRITE8_MEMBER(homerun_scrolly_w); DECLARE_WRITE8_MEMBER(scrollx_w);
DECLARE_WRITE8_MEMBER(homerun_scrollx_w);
TILE_GET_INFO_MEMBER(get_homerun_tile_info); static rgb_t homerun_RGB332(u32 raw);
virtual void machine_start() override; TILE_GET_INFO_MEMBER(get_tile_info);
virtual void machine_reset() override; u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void video_start() override; void banking_w(u8 data);
uint32_t screen_update_homerun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE8_MEMBER(homerun_banking_w);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void homerun_iomap(address_map &map); void io_map(address_map &map);
void homerun_memmap(address_map &map); void mem_map(address_map &map);
}; };

View File

@ -12,13 +12,13 @@
/**************************************************************************/ /**************************************************************************/
CUSTOM_INPUT_MEMBER(homerun_state::homerun_sprite0_r) CUSTOM_INPUT_MEMBER(homerun_state::sprite0_r)
{ {
// sprite-0 vs background collision status, similar to NES // sprite-0 vs background collision status, similar to NES
return (m_screen->vpos() > (m_spriteram[0] - 16 + 1)) ? 1 : 0; return (m_screen->vpos() > (m_spriteram[0] - 16 + 1)) ? 1 : 0;
} }
WRITE8_MEMBER(homerun_state::homerun_scrollhi_w) WRITE8_MEMBER(homerun_state::scrollhi_w)
{ {
// d0: scroll y high bit // d0: scroll y high bit
// d1: scroll x high bit // d1: scroll x high bit
@ -27,40 +27,49 @@ WRITE8_MEMBER(homerun_state::homerun_scrollhi_w)
m_scrollx = (m_scrollx & 0xff) | (data << 7 & 0x100); m_scrollx = (m_scrollx & 0xff) | (data << 7 & 0x100);
} }
WRITE8_MEMBER(homerun_state::homerun_scrolly_w) WRITE8_MEMBER(homerun_state::scrolly_w)
{ {
m_scrolly = (m_scrolly & 0xff00) | data; m_scrolly = (m_scrolly & 0xff00) | data;
} }
WRITE8_MEMBER(homerun_state::homerun_scrollx_w) WRITE8_MEMBER(homerun_state::scrollx_w)
{ {
m_scrollx = (m_scrollx & 0xff00) | data; m_scrollx = (m_scrollx & 0xff00) | data;
} }
WRITE8_MEMBER(homerun_state::homerun_banking_w) void homerun_state::banking_w(u8 data)
{
u8 const old = m_gfx_ctrl;
if (old ^ data)
{
if ((old ^ data) & 3)
{ {
// games do mid-screen gfx bank switching // games do mid-screen gfx bank switching
int vpos = m_screen->vpos(); int vpos = m_screen->vpos();
m_screen->update_partial(vpos); m_screen->update_partial(vpos);
}
// d0-d1: gfx bank // d0-d1: gfx bank
// d2-d4: ? // d2-d4: ?
// d5-d7: prg bank // d5-d7: prg bank
m_gfx_ctrl = data; m_gfx_ctrl = data;
if ((old ^ m_gfx_ctrl) & 1)
m_tilemap->mark_all_dirty(); m_tilemap->mark_all_dirty();
membank("bank1")->set_entry(data >> 5 & 7);
if ((old ^ m_gfx_ctrl) >> 5 & 7)
m_mainbank->set_entry(m_gfx_ctrl >> 5 & 7);
}
} }
WRITE8_MEMBER(homerun_state::homerun_videoram_w) WRITE8_MEMBER(homerun_state::videoram_w)
{ {
m_videoram[offset] = data; m_videoram[offset] = data;
m_tilemap->mark_tile_dirty(offset & 0xfff); m_tilemap->mark_tile_dirty(offset & 0xfff);
} }
WRITE8_MEMBER(homerun_state::homerun_color_w) rgb_t homerun_state::homerun_RGB332(u32 raw)
{ {
m_colorram[offset] = data;
/* from PCB photo: /* from PCB photo:
bit 7: 470 ohm resistor \ bit 7: 470 ohm resistor \
bit 6: 220 ohm resistor - --> 470 ohm resistor --> blue bit 6: 220 ohm resistor - --> 470 ohm resistor --> blue
@ -73,32 +82,30 @@ WRITE8_MEMBER(homerun_state::homerun_color_w)
*/ */
// let's implement it the old fashioned way until it's found out how exactly the resnet is hooked up // let's implement it the old fashioned way until it's found out how exactly the resnet is hooked up
int r, g, b; u8 bit0, bit1, bit2;
int bit0, bit1, bit2;
bit0 = (data >> 0) & 0x01; bit0 = (raw >> 0) & 0x01;
bit1 = (data >> 1) & 0x01; bit1 = (raw >> 1) & 0x01;
bit2 = (data >> 2) & 0x01; bit2 = (raw >> 2) & 0x01;
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; int r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
bit0 = (data >> 3) & 0x01; bit0 = (raw >> 3) & 0x01;
bit1 = (data >> 4) & 0x01; bit1 = (raw >> 4) & 0x01;
bit2 = (data >> 5) & 0x01; bit2 = (raw >> 5) & 0x01;
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; int g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
bit0 = 0; bit0 = 0;
bit1 = (data >> 6) & 0x01; bit1 = (raw >> 6) & 0x01;
bit2 = (data >> 7) & 0x01; bit2 = (raw >> 7) & 0x01;
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; int b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
m_palette->set_pen_color(offset, rgb_t(r,g,b)); return rgb_t(r, g, b);
} }
/**************************************************************************/ /**************************************************************************/
TILE_GET_INFO_MEMBER(homerun_state::get_homerun_tile_info) TILE_GET_INFO_MEMBER(homerun_state::get_tile_info)
{ {
int tileno = (m_videoram[tile_index]) | ((m_videoram[tile_index | 0x1000] & 0x38) << 5) | ((m_gfx_ctrl & 1) << 11); u32 const tileno = (m_videoram[tile_index]) | ((m_videoram[tile_index | 0x1000] & 0x38) << 5) | ((m_gfx_ctrl & 1) << 11);
int palno = (m_videoram[tile_index | 0x1000] & 0x07); u16 const palno = (m_videoram[tile_index | 0x1000] & 0x07);
SET_TILE_INFO_MEMBER(0, tileno, palno, 0); SET_TILE_INFO_MEMBER(0, tileno, palno, 0);
} }
@ -106,26 +113,27 @@ TILE_GET_INFO_MEMBER(homerun_state::get_homerun_tile_info)
void homerun_state::video_start() void homerun_state::video_start()
{ {
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(homerun_state::get_homerun_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(homerun_state::get_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
save_item(NAME(m_gfx_ctrl));
save_item(NAME(m_scrolly));
save_item(NAME(m_scrollx));
} }
void homerun_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) void homerun_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
uint8_t *spriteram = m_spriteram; for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
int offs;
for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{ {
if (spriteram[offs + 0] == 0) if (m_spriteram[offs + 0] == 0)
continue; continue;
int sy = spriteram[offs + 0] - 16 + 1; int const sy = m_spriteram[offs + 0] - 16 + 1;
int sx = spriteram[offs + 3]; int const sx = m_spriteram[offs + 3];
int code = (spriteram[offs + 1]) | ((spriteram[offs + 2] & 0x8) << 5) | ((m_gfx_ctrl & 3) << 9); u32 const code = (m_spriteram[offs + 1]) | ((m_spriteram[offs + 2] & 0x8) << 5) | ((m_gfx_ctrl & 3) << 9);
int color = (spriteram[offs + 2] & 0x07) | 8; u32 const color = (m_spriteram[offs + 2] & 0x07) | 8;
int flipx = (spriteram[offs + 2] & 0x40) >> 6; bool const flipx = (m_spriteram[offs + 2] & 0x40) >> 6;
int flipy = (spriteram[offs + 2] & 0x80) >> 7; bool const flipy = (m_spriteram[offs + 2] & 0x80) >> 7;
if (sy >= 0) if (sy >= 0)
{ {
@ -137,7 +145,7 @@ void homerun_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec
} }
} }
uint32_t homerun_state::screen_update_homerun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) u32 homerun_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
m_tilemap->set_scrolly(0, m_scrolly); m_tilemap->set_scrolly(0, m_scrolly);
m_tilemap->set_scrollx(0, m_scrollx); m_tilemap->set_scrollx(0, m_scrollx);