jackal.cpp: avoided allocating memory in ROM regions, general cleanups. Needs proper K005885 device for further cleanup

This commit is contained in:
Ivan Vangelista 2021-05-26 19:32:36 +02:00
parent b838ee7153
commit 4c3db1d280
3 changed files with 181 additions and 240 deletions

View File

@ -18,6 +18,7 @@ TODO:
beginning of the game. This is kludged by overclocking the sound CPU. This
looks like a CPU communication timing issue however fiddling with the
interleave factor has no effect.
- create a K005885 device shared with other drivers.
Memory Map
@ -86,41 +87,21 @@ Address Dir Data Description
*
*************************************/
uint8_t jackal_state::jackalr_rotary_r(offs_t offset)
uint8_t jackal_state::rotary_r(offs_t offset)
{
return (1 << m_dials[offset].read_safe(0x00)) ^ 0xff;
}
void jackal_state::jackal_flipscreen_w(uint8_t data)
void jackal_state::flipscreen_w(uint8_t data)
{
m_irq_enable = data & 0x02;
flip_screen_set(data & 0x08);
m_irq_enable = BIT(data, 1);
flip_screen_set(BIT(data, 3));
}
uint8_t jackal_state::jackal_zram_r(offs_t offset)
void jackal_state::rambank_w(uint8_t data)
{
return m_rambank[0x0020 + offset];
}
uint8_t jackal_state::jackal_voram_r(offs_t offset)
{
return m_rambank[0x2000 + offset];
}
uint8_t jackal_state::jackal_spriteram_r(offs_t offset)
{
return m_spritebank[0x3000 + offset];
}
void jackal_state::jackal_rambank_w(uint8_t data)
{
uint8_t *rgn = memregion("master")->base();
if (data & 0x04)
popmessage("jackal_rambank_w %02x", data);
popmessage("rambank_w %02x", data);
// all revisions flips the coin counter bit between 1 -> 0 five times, causing the bookkeeping to report 5 coins inserted.
// most likely solution in HW is a f/f that disables coin counters when any of the other bits are enabled.
@ -130,56 +111,48 @@ void jackal_state::jackal_rambank_w(uint8_t data)
machine().bookkeeping().coin_counter_w(1, data & 0x02);
}
m_spritebank = &rgn[((data & 0x08) << 13)];
m_rambank = &rgn[((data & 0x10) << 12)];
membank("bank1")->set_entry((data & 0x20) ? 1 : 0);
m_spritebank->set_entry(BIT(data, 3));
m_scrollbank->set_entry(BIT(data, 4));
m_videoview.select(BIT(data, 4));
m_mainbank->set_entry(BIT(data, 5));
}
void jackal_state::jackal_zram_w(offs_t offset, uint8_t data)
{
m_rambank[0x0020 + offset] = data;
}
void jackal_state::jackal_voram_w(offs_t offset, uint8_t data)
template <uint8_t Which>
void jackal_state::voram_w(offs_t offset, uint8_t data)
{
if ((offset & 0xf800) == 0)
jackal_mark_tile_dirty(offset & 0x3ff);
m_bg_tilemap->mark_tile_dirty(offset & 0x3ff);
m_rambank[0x2000 + offset] = data;
m_videoram[Which][offset] = data;
}
void jackal_state::jackal_spriteram_w(offs_t offset, uint8_t data)
{
m_spritebank[0x3000 + offset] = data;
}
/*************************************
*
* Address maps
*
*************************************/
void jackal_state::master_map(address_map &map)
void jackal_state::main_map(address_map &map)
{
map(0x0000, 0x0003).ram().share("videoctrl"); // scroll + other things
map(0x0004, 0x0004).w(FUNC(jackal_state::jackal_flipscreen_w));
map(0x0000, 0x0003).ram().share(m_videoctrl); // scroll + other things
map(0x0004, 0x0004).w(FUNC(jackal_state::flipscreen_w));
map(0x0010, 0x0010).portr("DSW1");
map(0x0011, 0x0011).portr("IN1");
map(0x0012, 0x0012).portr("IN2");
map(0x0013, 0x0013).portr("IN0");
map(0x0014, 0x0015).r(FUNC(jackal_state::jackalr_rotary_r));
map(0x0014, 0x0015).r(FUNC(jackal_state::rotary_r));
map(0x0018, 0x0018).portr("DSW2");
map(0x0019, 0x0019).w("watchdog", FUNC(watchdog_timer_device::reset_w));
map(0x001c, 0x001c).w(FUNC(jackal_state::jackal_rambank_w));
map(0x0020, 0x005f).rw(FUNC(jackal_state::jackal_zram_r), FUNC(jackal_state::jackal_zram_w)); // MAIN Z RAM,SUB Z RAM
map(0x0060, 0x1fff).ram().share("share1"); // M COMMON RAM,S COMMON RAM
map(0x2000, 0x2fff).rw(FUNC(jackal_state::jackal_voram_r), FUNC(jackal_state::jackal_voram_w)); // MAIN V O RAM,SUB V O RAM
map(0x3000, 0x3fff).rw(FUNC(jackal_state::jackal_spriteram_r), FUNC(jackal_state::jackal_spriteram_w)); // MAIN V O RAM,SUB V O RAM
map(0x4000, 0xbfff).bankr("bank1");
map(0xc000, 0xffff).rom();
map(0x001c, 0x001c).w(FUNC(jackal_state::rambank_w));
map(0x0020, 0x005f).bankrw(m_scrollbank); // MAIN Z RAM,SUB Z RAM
map(0x0060, 0x1fff).ram().share("mainsub"); // M COMMON RAM,S COMMON RAM
map(0x2000, 0x2fff).view(m_videoview);
m_videoview[0](0x2000, 0x2fff).ram().share(m_videoram[0]).w(FUNC(jackal_state::voram_w<0>)); // MAIN V O RAM,SUB V O RAM
m_videoview[1](0x2000, 0x2fff).ram().share(m_videoram[1]).w(FUNC(jackal_state::voram_w<1>)); // MAIN V O RAM,SUB V O RAM
map(0x3000, 0x3fff).bankrw(m_spritebank); // MAIN V O RAM,SUB V O RAM
map(0x4000, 0xbfff).bankr(m_mainbank);
map(0xc000, 0xffff).rom().region("maincpu", 0);
}
void jackal_state::slave_map(address_map &map)
@ -187,8 +160,8 @@ void jackal_state::slave_map(address_map &map)
map(0x2000, 0x2001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0x4000, 0x43ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette"); // self test only checks 0x4000-0x423f, 007327 should actually go up to 4fff
map(0x6000, 0x605f).ram(); // SOUND RAM (Self test check 0x6000-605f, 0x7c00-0x7fff)
map(0x6060, 0x7fff).ram().share("share1");
map(0x8000, 0xffff).rom();
map(0x6060, 0x7fff).ram().share("mainsub");
map(0x8000, 0xffff).rom().region("slave", 0);
}
/*************************************
@ -200,7 +173,7 @@ void jackal_state::slave_map(address_map &map)
static INPUT_PORTS_START( jackal )
PORT_START("DSW1")
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
/* "No Coin B" = coins produce sound, but no effect on coin counter */
// "No Coin B" = coins produce sound, but no effect on coin counter
PORT_START("DSW2")
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION( "SW2:1,2" )
@ -253,10 +226,10 @@ static INPUT_PORTS_START( jackalr )
PORT_MODIFY("IN0")
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DIAL0") // player 1 8-way rotary control - converted in jackalr_rotary_r()
PORT_START("DIAL0") // player 1 8-way rotary control - converted in rotary_r()
PORT_BIT( 0xff, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(8) PORT_WRAPS PORT_SENSITIVITY(15) PORT_KEYDELTA(1) PORT_CODE_DEC(KEYCODE_Z) PORT_CODE_INC(KEYCODE_X) PORT_FULL_TURN_COUNT(8)
PORT_START("DIAL1") // player 2 8-way rotary control - converted in jackalr_rotary_r()
PORT_START("DIAL1") // player 2 8-way rotary control - converted in rotary_r()
PORT_BIT( 0xff, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(8) PORT_WRAPS PORT_SENSITIVITY(15) PORT_KEYDELTA(1) PORT_CODE_DEC(KEYCODE_N) PORT_CODE_INC(KEYCODE_M) PORT_PLAYER(2) PORT_FULL_TURN_COUNT(8)
INPUT_PORTS_END
@ -271,7 +244,7 @@ static const gfx_layout charlayout =
{
8, 8,
RGN_FRAC(1,4),
8, /* 8 bits per pixel (!) */
8, // 8 bits per pixel (!)
{ 0, 1, 2, 3, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+1, RGN_FRAC(1,2)+2, RGN_FRAC(1,2)+3 },
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
@ -320,7 +293,7 @@ WRITE_LINE_MEMBER(jackal_state::vblank_irq)
{
if (state && m_irq_enable)
{
m_mastercpu->set_input_line(0, HOLD_LINE);
m_maincpu->set_input_line(0, HOLD_LINE);
m_slavecpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
}
@ -334,62 +307,54 @@ WRITE_LINE_MEMBER(jackal_state::vblank_irq)
void jackal_state::machine_start()
{
uint8_t *ROM = memregion("master")->base();
membank("bank1")->configure_entry(0, &ROM[0x04000]);
membank("bank1")->configure_entry(1, &ROM[0x14000]);
membank("bank1")->set_entry(0);
m_mainbank->configure_entries(0, 2, memregion("maincpu")->base() + 0x4000, 0x8000);
m_mainbank->set_entry(0);
save_item(NAME(m_irq_enable));
}
void jackal_state::machine_reset()
{
uint8_t *rgn = memregion("master")->base();
// HACK: running at the nominal clock rate, music stops working
// at the beginning of the game. This fixes it.
m_slavecpu->set_clock_scale(1.5);
m_rambank = rgn;
m_spritebank = rgn;
m_irq_enable = 0;
}
void jackal_state::jackal(machine_config &config)
{
/* basic machine hardware */
MC6809E(config, m_mastercpu, MASTER_CLOCK/12); // verified on pcb
m_mastercpu->set_addrmap(AS_PROGRAM, &jackal_state::master_map);
// basic machine hardware
MC6809E(config, m_maincpu, 18.432_MHz_XTAL / 12); // verified on pcb
m_maincpu->set_addrmap(AS_PROGRAM, &jackal_state::main_map);
MC6809E(config, m_slavecpu, MASTER_CLOCK/12); // verified on pcb
MC6809E(config, m_slavecpu, 18.432_MHz_XTAL / 12); // verified on pcb
m_slavecpu->set_addrmap(AS_PROGRAM, &jackal_state::slave_map);
config.set_maximum_quantum(attotime::from_hz(6000));
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(jackal_state::screen_update_jackal));
screen.set_screen_update(FUNC(jackal_state::screen_update));
screen.set_palette(m_palette);
screen.screen_vblank().set(FUNC(jackal_state::vblank_irq));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_jackal);
PALETTE(config, m_palette, FUNC(jackal_state::jackal_palette));
PALETTE(config, m_palette, FUNC(jackal_state::palette));
m_palette->set_format(palette_device::xBGR_555, 0x300, 0x200);
m_palette->set_endianness(ENDIANNESS_LITTLE);
/* sound hardware */
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
YM2151(config, "ymsnd", SOUND_CLOCK).add_route(0, "lspeaker", 0.50).add_route(1, "rspeaker", 0.50); // verified on pcb
YM2151(config, "ymsnd", 3.579545_MHz_XTAL).add_route(0, "lspeaker", 0.50).add_route(1, "rspeaker", 0.50); // verified on pcb
}
/*************************************
@ -398,106 +363,102 @@ void jackal_state::jackal(machine_config &config)
*
*************************************/
ROM_START( jackal ) /* 8-Way Joystick: You can only shoot in one direction regardless of travel - up the screen */
ROM_REGION( 0x20000, "master", 0 ) /* Banked 64k for 1st CPU */
ROM_LOAD( "631_v02.15d", 0x04000, 0x8000, CRC(0b7e0584) SHA1(e4019463345a4c020d5a004c9a400aca4bdae07b) )
ROM_CONTINUE( 0x14000, 0x8000 )
ROM_LOAD( "631_v03.16d", 0x0c000, 0x4000, CRC(3e0dfb83) SHA1(5ba7073751eee33180e51143b348256597909516) )
ROM_START( jackal ) // 8-Way Joystick: You can only shoot in one direction regardless of travel - up the screen
ROM_REGION( 0x14000, "maincpu", 0 ) // Banked 64k for 1st CPU
ROM_LOAD( "631_v03.16d", 0x00000, 0x04000, CRC(3e0dfb83) SHA1(5ba7073751eee33180e51143b348256597909516) )
ROM_LOAD( "631_v02.15d", 0x04000, 0x10000, CRC(0b7e0584) SHA1(e4019463345a4c020d5a004c9a400aca4bdae07b) )
ROM_REGION( 0x10000, "slave", 0 ) /* 64k for 2nd cpu (Graphics & Sound)*/
ROM_LOAD( "631_t01.11d", 0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
ROM_REGION( 0x8000, "slave", 0 ) // 64k for 2nd cpu (Graphics & Sound)
ROM_LOAD( "631_t01.11d", 0x0000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD16_BYTE( "631t04.7h", 0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t05.8h", 0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t04.7h", 0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t05.8h", 0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) // Silkscreened MASK1M
ROM_REGION( 0x0200, "proms", 0 ) /* color lookup tables */
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_REGION( 0x0200, "proms", 0 ) // color lookup tables
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_END
ROM_START( jackalr ) /* Rotary Joystick: Shot direction is controlled via the rotary function of the joystick */
ROM_REGION( 0x20000, "master", 0 ) /* Banked 64k for 1st CPU */
ROM_LOAD( "631_q02.15d", 0x04000, 0x8000, CRC(ed2a7d66) SHA1(3d9b31fa8b31e509880d617feb0dd4bd9790d2d5) )
ROM_CONTINUE( 0x14000, 0x8000 )
ROM_LOAD( "631_q03.16d", 0x0c000, 0x4000, CRC(b9d34836) SHA1(af23a0c844fb9e60a757511ca898d73eef4c2e51) )
ROM_START( jackalr ) // Rotary Joystick: Shot direction is controlled via the rotary function of the joystick
ROM_REGION( 0x14000, "maincpu", 0 ) // Banked 64k for 1st CPU
ROM_LOAD( "631_q03.16d", 0x00000, 0x04000, CRC(b9d34836) SHA1(af23a0c844fb9e60a757511ca898d73eef4c2e51) )
ROM_LOAD( "631_q02.15d", 0x04000, 0x10000, CRC(ed2a7d66) SHA1(3d9b31fa8b31e509880d617feb0dd4bd9790d2d5) )
ROM_REGION( 0x10000, "slave", 0 ) /* 64k for 2nd cpu (Graphics & Sound)*/
ROM_LOAD( "631_q01.11d", 0x8000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) )
ROM_REGION( 0x8000, "slave", 0 ) // 64k for 2nd cpu (Graphics & Sound)
ROM_LOAD( "631_q01.11d", 0x0000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD16_BYTE( "631t04.7h", 0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t05.8h", 0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) /* Silkscreened MASK1M */
/* These roms are on a tiny riser board - two smaller roms instead of MASK1M roms */
ROM_LOAD16_BYTE( "631t04.7h", 0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t05.8h", 0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) // Silkscreened MASK1M
// These roms are on a tiny riser board - two smaller roms instead of MASK1M roms
// ROM_LOAD16_BYTE( "631_q04.7h", 0x20000, 0x10000, CRC(0) SHA1(0) )
// ROM_LOAD16_BYTE( "631_q05.7h", 0x00000, 0x10000, CRC(0) SHA1(0) )
// ROM_LOAD16_BYTE( "631_q06.8h", 0x20001, 0x10000, CRC(0) SHA1(0) )
// ROM_LOAD16_BYTE( "631_q07.8h", 0x00001, 0x10000, CRC(0) SHA1(0) ) /* 631 Q04 through 631 Q11 need to be redumped and verified. Should be the same data */
// ROM_LOAD16_BYTE( "631_q08.12h", 0x40000, 0x10000, CRC(0) SHA1(0) ) /* until then we are going to use the standard MASK1M roms - Will fixed when dumped */
// ROM_LOAD16_BYTE( "631_q07.8h", 0x00001, 0x10000, CRC(0) SHA1(0) ) // 631 Q04 through 631 Q11 need to be redumped and verified. Should be the same data
// ROM_LOAD16_BYTE( "631_q08.12h", 0x40000, 0x10000, CRC(0) SHA1(0) ) // until then we are going to use the standard MASK1M roms - Will fixed when dumped
// ROM_LOAD16_BYTE( "631_q09.12h", 0x60000, 0x10000, CRC(0) SHA1(0) )
// ROM_LOAD16_BYTE( "631_q10.13h", 0x40001, 0x10000, CRC(0) SHA1(0) )
// ROM_LOAD16_BYTE( "631_q11.13h", 0x60001, 0x10000, CRC(0) SHA1(0) )
ROM_REGION( 0x0200, "proms", 0 ) /* color lookup tables */
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_REGION( 0x0200, "proms", 0 ) // color lookup tables
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_END
ROM_START( topgunr ) /* 8-Way Joystick: You can only shoot in one direction regardless of travel - up the screen */
ROM_REGION( 0x20000, "master", 0 ) /* Banked 64k for 1st CPU */
ROM_LOAD( "631_u02.15d", 0x04000, 0x8000, CRC(f7e28426) SHA1(db2d5f252a574b8aa4d8406a8e93b423fd2a7fef) )
ROM_CONTINUE( 0x14000, 0x8000 )
ROM_LOAD( "631_u03.16d", 0x0c000, 0x4000, CRC(c086844e) SHA1(4d6f27ac3aabb4b2d673aa619e407e417ad89337) )
ROM_START( topgunr ) // 8-Way Joystick: You can only shoot in one direction regardless of travel - up the screen
ROM_REGION( 0x14000, "maincpu", 0 ) // Banked 64k for 1st CPU
ROM_LOAD( "631_u03.16d", 0x00000, 0x04000, CRC(c086844e) SHA1(4d6f27ac3aabb4b2d673aa619e407e417ad89337) )
ROM_LOAD( "631_u02.15d", 0x04000, 0x10000, CRC(f7e28426) SHA1(db2d5f252a574b8aa4d8406a8e93b423fd2a7fef) )
ROM_REGION( 0x10000, "slave", 0 ) /* 64k for 2nd cpu (Graphics & Sound)*/
ROM_LOAD( "631_t01.11d", 0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
ROM_REGION( 0x8000, "slave", 0 ) // 64k for 2nd cpu (Graphics & Sound)
ROM_LOAD( "631_t01.11d", 0x0000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD16_BYTE( "631u04.7h", 0x00000, 0x20000, CRC(50122a12) SHA1(c9e0132a3a40d9d28685c867c70231947d8a9cb7) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631u05.8h", 0x00001, 0x20000, CRC(6943b1a4) SHA1(40de2b434600ea4c8fb42e6b21be2c3705a55d67) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631u06.12h", 0x40000, 0x20000, CRC(37dbbdb0) SHA1(f94db780d69e7dd40231a75629af79469d957378) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631u07.13h", 0x40001, 0x20000, CRC(22effcc8) SHA1(4d174b0ce64def32050f87343c4b1424e0fef6f7) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631u04.7h", 0x00000, 0x20000, CRC(50122a12) SHA1(c9e0132a3a40d9d28685c867c70231947d8a9cb7) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631u05.8h", 0x00001, 0x20000, CRC(6943b1a4) SHA1(40de2b434600ea4c8fb42e6b21be2c3705a55d67) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631u06.12h", 0x40000, 0x20000, CRC(37dbbdb0) SHA1(f94db780d69e7dd40231a75629af79469d957378) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631u07.13h", 0x40001, 0x20000, CRC(22effcc8) SHA1(4d174b0ce64def32050f87343c4b1424e0fef6f7) ) // Silkscreened MASK1M
ROM_REGION( 0x0200, "proms", 0 ) /* color lookup tables */
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_REGION( 0x0200, "proms", 0 ) // color lookup tables
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_END
ROM_START( jackalj ) /* 8-Way Joystick: You can only shoot in the direction you're traveling */
ROM_REGION( 0x20000, "master", 0 ) /* Banked 64k for 1st CPU */
ROM_LOAD( "631_t02.15d", 0x04000, 0x8000, CRC(14db6b1a) SHA1(b469ea50aa94a2bda3bd0442300aa1272e5f30c4) )
ROM_CONTINUE( 0x14000, 0x8000 )
ROM_LOAD( "631_t03.16d", 0x0c000, 0x4000, CRC(fd5f9624) SHA1(2520c1ff54410ef498ecbf52877f011900baed4c) )
ROM_START( jackalj ) // 8-Way Joystick: You can only shoot in the direction you're traveling
ROM_REGION( 0x14000, "maincpu", 0 ) // Banked 64k for 1st CPU
ROM_LOAD( "631_t03.16d", 0x00000, 0x04000, CRC(fd5f9624) SHA1(2520c1ff54410ef498ecbf52877f011900baed4c) )
ROM_LOAD( "631_t02.15d", 0x04000, 0x10000, CRC(14db6b1a) SHA1(b469ea50aa94a2bda3bd0442300aa1272e5f30c4) )
ROM_REGION( 0x10000, "slave", 0 ) /* 64k for 2nd cpu (Graphics & Sound)*/
ROM_LOAD( "631_t01.11d", 0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
ROM_REGION( 0x8000, "slave", 0 ) // 64k for 2nd cpu (Graphics & Sound)
ROM_LOAD( "631_t01.11d", 0x0000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD16_BYTE( "631t04.7h", 0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t05.8h", 0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) /* Silkscreened MASK1M */
ROM_LOAD16_BYTE( "631t04.7h", 0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t05.8h", 0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) // Silkscreened MASK1M
ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) // Silkscreened MASK1M
ROM_REGION( 0x0200, "proms", 0 ) /* color lookup tables */
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
ROM_REGION( 0x0200, "proms", 0 ) // color lookup tables
ROM_LOAD( "631r08.9h", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) // MMI 63S141AN or compatible (silkscreened 6301)
ROM_END
ROM_START( jackalbl ) // This is based on jackalr. Was dumped from 2 different PCBs.
ROM_REGION( 0x20000, "master", 0 ) /* Banked 64k for 1st CPU */
ROM_LOAD( "epr-a-3.bin", 0x04000, 0x8000, CRC(5fffee27) SHA1(224d5fd26dd1e0f15a3c99fd2fffbb76f641416e) ) // also found labeled "3.17"
ROM_LOAD( "epr-a-2.bin", 0x0c000, 0x4000, CRC(ae2a290a) SHA1(e9bee75a02aef5cf330dccb9e7a45b0171a8c1d7) ) // also found labeled "2.20"
ROM_LOAD( "epr-a-4.bin", 0x14000, 0x8000, CRC(976c8431) SHA1(c199f57c25380d741aec85b0e0bfb6acf383e6a6) ) // also found labeled "4.18"
ROM_REGION( 0x14000, "maincpu", 0 ) // Banked 64k for 1st CPU
ROM_LOAD( "epr-a-2.bin", 0x00000, 0x04000, CRC(ae2a290a) SHA1(e9bee75a02aef5cf330dccb9e7a45b0171a8c1d7) ) // also found labeled "2.20"
ROM_LOAD( "epr-a-3.bin", 0x04000, 0x08000, CRC(5fffee27) SHA1(224d5fd26dd1e0f15a3c99fd2fffbb76f641416e) ) // also found labeled "3.17"
ROM_LOAD( "epr-a-4.bin", 0x0c000, 0x08000, CRC(976c8431) SHA1(c199f57c25380d741aec85b0e0bfb6acf383e6a6) ) // also found labeled "4.18"
ROM_REGION( 0x10000, "slave", 0 ) /* 64k for 2nd cpu (Graphics & Sound)*/
ROM_LOAD( "epr-a-1.bin", 0x8000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) ) // also found labeled "1.19"
ROM_REGION( 0x8000, "slave", 0 ) // 64k for 2nd cpu (Graphics & Sound)
ROM_LOAD( "epr-a-1.bin", 0x0000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) ) // also found labeled "1.19"
ROM_REGION( 0x80000, "gfx1", 0 )
/* same data, different layout */
// same data, different layout
ROM_LOAD16_WORD_SWAP( "epr-a-17.bin", 0x00000, 0x08000, CRC(a96720b6) SHA1(d3c2a1848fa9d9d1232e58e412bdd69032fe2c83) ) // also found labeled "17.5"
ROM_LOAD16_WORD_SWAP( "epr-a-18.bin", 0x08000, 0x08000, CRC(932d0ecb) SHA1(20bf789f45c5b3ba90012e1a945523236578a014) ) // also found labeled "18.6"
ROM_LOAD16_WORD_SWAP( "epr-a-19.bin", 0x10000, 0x08000, CRC(1e3412e7) SHA1(dc0be23d6c89b7b131c3bd5cd117123e5f9d971c) ) // also found labeled "19.7"
@ -515,11 +476,11 @@ ROM_START( jackalbl ) // This is based on jackalr. Was dumped from 2 different P
ROM_LOAD16_WORD_SWAP( "epr-a-11.bin", 0x70000, 0x08000, CRC(a48e9f60) SHA1(6d5af16c16b40fb092fdba6dce852b94ac4767f4) ) // also found labeled "11.15"
ROM_LOAD16_WORD_SWAP( "epr-a-12.bin", 0x78000, 0x08000, CRC(79b7c71c) SHA1(8510226114ab9098ec48e02840465fc8b69b5262) ) // also found labeled "12.16"
ROM_REGION( 0x0200, "proms", 0 ) /* color lookup tables */
ROM_REGION( 0x0200, "proms", 0 ) // color lookup tables
ROM_LOAD( "n82s129n.prom2", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
ROM_LOAD( "n82s129n.prom1", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
ROM_REGION( 0x1000, "pals", 0 ) /* currently not used by the emulation */
ROM_REGION( 0x1000, "pals", 0 ) // currently not used by the emulation
ROM_LOAD( "pal16r6cn.pal1", 0x0000, 0x0104, CRC(9bba948f) SHA1(5f42568489f16f8b3719eb2ec178e7c61d7ce25f) )
ROM_LOAD( "ampal16l8pc.pal2", 0x0200, 0x0104, CRC(17c9de2f) SHA1(2db42618f9ca1174bdcdbf92ea91ebc1a79bc6d2) )
ROM_LOAD( "ampal16r4pc.pal3", 0x0400, 0x0104, CRC(e54cd288) SHA1(5b8ae5a2a4a9ec3fab603b063fd18c96dd1fd0cf) )
@ -530,17 +491,17 @@ ROM_START( jackalbl ) // This is based on jackalr. Was dumped from 2 different P
ROM_LOAD( "d5c121.ep1200", 0x0e00, 0x0200, NO_DUMP ) // not dumped yet
ROM_END
ROM_START( topgunbl ) /* Rotary Joystick: Shot direction is controlled via the Rotary function of the joystick */
ROM_REGION( 0x20000, "master", 0 ) /* Banked 64k for 1st CPU */
ROM_LOAD( "t-3.c5", 0x04000, 0x8000, CRC(7826ad38) SHA1(875e87867924905b9b83bc203eb7ffe81cf72233) )
ROM_LOAD( "t-4.c4", 0x14000, 0x8000, CRC(976c8431) SHA1(c199f57c25380d741aec85b0e0bfb6acf383e6a6) ) /* == 2nd half of 631_q02.15d */
ROM_LOAD( "t-2.c6", 0x0c000, 0x4000, CRC(d53172e5) SHA1(44b7f180c17f9a121a2f06f2d3471920a8989e21) )
ROM_START( topgunbl ) // Rotary Joystick: Shot direction is controlled via the Rotary function of the joystick
ROM_REGION( 0x14000, "maincpu", 0 ) // Banked 64k for 1st CPU
ROM_LOAD( "t-2.c6", 0x00000, 0x04000, CRC(d53172e5) SHA1(44b7f180c17f9a121a2f06f2d3471920a8989e21) )
ROM_LOAD( "t-3.c5", 0x04000, 0x08000, CRC(7826ad38) SHA1(875e87867924905b9b83bc203eb7ffe81cf72233) )
ROM_LOAD( "t-4.c4", 0x0c000, 0x08000, CRC(976c8431) SHA1(c199f57c25380d741aec85b0e0bfb6acf383e6a6) ) // == 2nd half of 631_q02.15d
ROM_REGION( 0x10000, "slave", 0 ) /* 64k for 2nd cpu (Graphics & Sound)*/
ROM_LOAD( "t-1.c14", 0x8000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) ) /* == 631_q01.11d */
ROM_REGION( 0x8000, "slave", 0 ) // 64k for 2nd cpu (Graphics & Sound)
ROM_LOAD( "t-1.c14", 0x0000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) ) // == 631_q01.11d
ROM_REGION( 0x80000, "gfx1", 0 )
/* same data, different layout */
// same data, different layout
ROM_LOAD16_WORD_SWAP( "t-17.n12", 0x00000, 0x08000, CRC(e8875110) SHA1(73f4c47ab039dce8c285bf222253084c860c95bf) )
ROM_LOAD16_WORD_SWAP( "t-18.n13", 0x08000, 0x08000, CRC(cf14471d) SHA1(896aa8d7c93f837f6661d30bd0d6e19d16669107) )
ROM_LOAD16_WORD_SWAP( "t-19.n14", 0x10000, 0x08000, CRC(46ee5dd2) SHA1(1a910984a197af341f13b4683babee857aafb245) )
@ -558,7 +519,7 @@ ROM_START( topgunbl ) /* Rotary Joystick: Shot direction is controlled via the R
ROM_LOAD16_WORD_SWAP( "t-11.n6", 0x70000, 0x08000, CRC(7895c22d) SHA1(c81ae51116fb32ac99d37eb7c2000c990d089b8d) )
ROM_LOAD16_WORD_SWAP( "t-12.n7", 0x78000, 0x08000, CRC(15606dfc) SHA1(829492da49dbe70f81d15237803c5203aa011957) )
ROM_REGION( 0x0200, "proms", 0 ) /* color lookup tables */
ROM_REGION( 0x0200, "proms", 0 ) // color lookup tables
ROM_LOAD( "631r08.bpr", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
ROM_LOAD( "631r09.bpr", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
ROM_END

View File

@ -9,10 +9,6 @@
#include "emupal.h"
#include "tilemap.h"
#define MASTER_CLOCK XTAL(18'432'000)
#define SOUND_CLOCK XTAL(3'579'545)
class jackal_state : public driver_device
{
@ -20,8 +16,15 @@ public:
jackal_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoctrl(*this, "videoctrl"),
m_videoram(*this, "videoram%u", 0U),
m_scrollram(*this, "scrollram%u", 0U, 0x40U, ENDIANNESS_BIG),
m_mainbank(*this, "mainbank"),
m_videoview(*this, "videoview"),
m_spritebank(*this, "spritebank"),
m_spriteram(*this, "spriteram%u", 0U, 0x1000U, ENDIANNESS_BIG),
m_scrollbank(*this, "scrollbank"),
m_dials(*this, "DIAL%u", 0U),
m_mastercpu(*this, "master"),
m_maincpu(*this, "maincpu"),
m_slavecpu(*this, "slave"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
@ -29,47 +32,47 @@ public:
void jackal(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
/* memory pointers */
// memory pointers
required_shared_ptr<uint8_t> m_videoctrl;
uint8_t * m_scrollram;
required_shared_ptr_array<uint8_t, 2> m_videoram;
memory_share_array_creator<uint8_t, 2> m_scrollram;
required_memory_bank m_mainbank;
memory_view m_videoview;
required_memory_bank m_spritebank;
memory_share_array_creator<uint8_t, 2> m_spriteram;
required_memory_bank m_scrollbank;
/* video-related */
tilemap_t *m_bg_tilemap;
// video-related
tilemap_t *m_bg_tilemap;
/* misc */
int m_irq_enable;
uint8_t *m_rambank;
uint8_t *m_spritebank;
// misc
uint8_t m_irq_enable;
optional_ioport_array<2> m_dials;
/* devices */
required_device<cpu_device> m_mastercpu;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_slavecpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
uint8_t jackalr_rotary_r(offs_t offset);
void jackal_flipscreen_w(uint8_t data);
uint8_t jackal_zram_r(offs_t offset);
uint8_t jackal_voram_r(offs_t offset);
uint8_t jackal_spriteram_r(offs_t offset);
void jackal_rambank_w(uint8_t data);
void jackal_zram_w(offs_t offset, uint8_t data);
void jackal_voram_w(offs_t offset, uint8_t data);
void jackal_spriteram_w(offs_t offset, uint8_t data);
uint8_t rotary_r(offs_t offset);
void flipscreen_w(uint8_t data);
void rambank_w(uint8_t data);
template <uint8_t Which> void voram_w(offs_t offset, uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void jackal_palette(palette_device &palette) const;
uint32_t screen_update_jackal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
void jackal_mark_tile_dirty( int offset );
void draw_background( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect );
void draw_sprites_region( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *sram, int length, int bank );
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
void master_map(address_map &map);
void draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites_region(bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *sram, int length, int bank);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void main_map(address_map &map);
void slave_map(address_map &map);
};

View File

@ -3,7 +3,7 @@
// thanks-to:Kenneth Lin (original driver author)
/***************************************************************************
video.c
jackal.cpp
Functions to emulate the video hardware of the machine.
@ -13,7 +13,7 @@
#include "includes/jackal.h"
void jackal_state::jackal_palette(palette_device &palette) const
void jackal_state::palette(palette_device &palette) const
{
uint8_t const *const color_prom = memregion("proms")->base();
@ -36,18 +36,10 @@ void jackal_state::jackal_palette(palette_device &palette) const
}
}
void jackal_state::jackal_mark_tile_dirty( int offset )
{
m_bg_tilemap->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(jackal_state::get_bg_tile_info)
{
uint8_t *RAM = memregion("master")->base();
int attr = RAM[0x2000 + tile_index];
int code = RAM[0x2400 + tile_index] + ((attr & 0xc0) << 2) + ((attr & 0x30) << 6);
int attr = m_videoram[0][tile_index];
int code = m_videoram[0][0x400 + tile_index] + ((attr & 0xc0) << 2) + ((attr & 0x30) << 6);
int color = 0;//attr & 0x0f;
int flags = ((attr & 0x10) ? TILE_FLIPX : 0) | ((attr & 0x20) ? TILE_FLIPY : 0);
@ -57,15 +49,16 @@ TILE_GET_INFO_MEMBER(jackal_state::get_bg_tile_info)
void jackal_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(jackal_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_spritebank->configure_entry(0, m_spriteram[0]);
m_spritebank->configure_entry(1, m_spriteram[1]);
m_scrollbank->configure_entry(0, m_scrollram[0]);
m_scrollbank->configure_entry(1, m_scrollram[1]);
}
void jackal_state::draw_background( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
void jackal_state::draw_background(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *RAM = memregion("master")->base();
int i;
m_scrollram = &RAM[0x0020];
m_bg_tilemap->set_scroll_rows(1);
m_bg_tilemap->set_scroll_cols(1);
@ -78,16 +71,16 @@ void jackal_state::draw_background( screen_device &screen, bitmap_ind16 &bitmap,
{
m_bg_tilemap->set_scroll_rows(32);
for (i = 0; i < 32; i++)
m_bg_tilemap->set_scrollx(i, m_scrollram[i]);
for (int i = 0; i < 32; i++)
m_bg_tilemap->set_scrollx(i, m_scrollram[0][i]);
}
if (m_videoctrl[2] & 0x04)
{
m_bg_tilemap->set_scroll_cols(32);
for (i = 0; i < 32; i++)
m_bg_tilemap->set_scrolly(i, m_scrollram[i]);
for (int i = 0; i < 32; i++)
m_bg_tilemap->set_scrolly(i, m_scrollram[0][i]);
}
}
@ -96,11 +89,9 @@ void jackal_state::draw_background( screen_device &screen, bitmap_ind16 &bitmap,
#define DRAW_SPRITE(bank, code, sx, sy) m_gfxdecode->gfx(bank)->transpen(bitmap,cliprect, code, color, flipx, flipy, sx, sy, 0);
void jackal_state::draw_sprites_region( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *sram, int length, int bank )
void jackal_state::draw_sprites_region(bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *sram, int length, int bank)
{
int offs;
for (offs = 0; offs < length; offs += 5)
for (int offs = 0; offs < length; offs += 5)
{
int sn1 = sram[offs];
int sn2 = sram[offs + 1];
@ -124,7 +115,7 @@ void jackal_state::draw_sprites_region( bitmap_ind16 &bitmap, const rectangle &c
flipy = !flipy;
}
if (attr & 0xC) // half-size sprite
if (attr & 0xc) // half-size sprite
{
int spritenum = sn1 * 4 + ((sn2 & (8 + 4)) >> 2) + ((sn2 & (2 + 1)) << 10);
int mod = -8;
@ -136,20 +127,20 @@ void jackal_state::draw_sprites_region( bitmap_ind16 &bitmap, const rectangle &c
mod = 8;
}
if ((attr & 0x0C) == 0x0C)
if ((attr & 0x0c) == 0x0c)
{
if (flip_screen()) sy += 16;
DRAW_SPRITE(bank + 1, spritenum, sx, sy)
}
if ((attr & 0x0C) == 0x08)
if ((attr & 0x0c) == 0x08)
{
sy += 8;
DRAW_SPRITE(bank + 1, spritenum, sx, sy)
DRAW_SPRITE(bank + 1, spritenum - 2, sx, sy + mod)
}
if ((attr & 0x0C) == 0x04)
if ((attr & 0x0c) == 0x04)
{
DRAW_SPRITE(bank + 1, spritenum, sx, sy)
DRAW_SPRITE(bank + 1, spritenum + 1, sx + mod, sy)
@ -180,27 +171,13 @@ void jackal_state::draw_sprites_region( bitmap_ind16 &bitmap, const rectangle &c
}
}
void jackal_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
void jackal_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *RAM = memregion("master")->base();
uint8_t *sr, *ss;
if (m_videoctrl[0x03] & 0x08)
{
sr = &RAM[0x03800]; // Sprite 2
ss = &RAM[0x13800]; // Additional Sprite 2
}
else
{
sr = &RAM[0x03000]; // Sprite 1
ss = &RAM[0x13000]; // Additional Sprite 1
}
draw_sprites_region(bitmap, cliprect, ss, 0x0f5, 3);
draw_sprites_region(bitmap, cliprect, sr, 0x500, 1);
draw_sprites_region(bitmap, cliprect, &m_spriteram[1][BIT(m_videoctrl[0x03], 3) * 0x800], 0x0f5, 3);
draw_sprites_region(bitmap, cliprect, &m_spriteram[0][BIT(m_videoctrl[0x03], 3) * 0x800], 0x500, 1);
}
uint32_t jackal_state::screen_update_jackal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t jackal_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
draw_background(screen, bitmap, cliprect);
draw_sprites(bitmap, cliprect);