New working game - Bandit (Data East USA, 1989)

Please credit CoolMod, Phil Bennett, Bryan McPhail, Moffitt, rtw, gamezfan, Dane Biegert, Candy Wolff, Henrique Areias Pontes, Sean Sutton, Surgeville, Evan Korzon, Charles MacDonald, Smitdogg, The Dumping Union
This commit is contained in:
bmcphail 2019-02-22 14:47:12 -05:00
parent ffa3e054f6
commit 779b762626
6 changed files with 228 additions and 14 deletions

View File

@ -26,11 +26,16 @@
* Midnight Resistance (USA set)
* Midnight Resistance (Japanese set)
* Boulderdash (World set)
* Bandit (USA set)
Heavy Barrel, Bad Dudes, Robocop, Birdie Try & Hippodrome use the 'MEC-M1'
motherboard and varying game boards. Sly Spy, Midnight Resistance and
Boulderdash use the same graphics chips but are different pcbs.
Bandit (USA) is almost certainly a field test prototype, the software runs
on a Heavy Barrel board including the original Heavy Barrel MCU (which is effectively
not used). There is also Japanese version known to run on a DE-0321-1 top board.
There are Secret Agent (bootleg) and Robocop (bootleg) sets to add.
Thanks to Gouky & Richard Bush for information along the way, especially
@ -455,8 +460,12 @@ void dec0_state::dec0_map(address_map &map)
map(0x30c018, 0x30c019).nopr(); // clr.w for irq ack
map(0x310000, 0x3107ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x314000, 0x3147ff).ram().w(m_palette, FUNC(palette_device::write16_ext)).share("palette_ext");
map(0x318000, 0x31bfff).ram().share("ram"); // Bandit uses 318000/31c000 which are mirrors but exact mirror patten is unclear
map(0x31c000, 0x31c7ff).ram().share("spriteram");
map(0xff8000, 0xffbfff).ram().share("ram"); /* Main ram */
map(0xffc000, 0xffc7ff).ram().share("spriteram"); /* Sprites */
map(0xffc000, 0xffc7ff).ram().share("spriteram");
}
void dec0_state::robocop_map(address_map &map)
@ -676,9 +685,9 @@ void dec0_state::midresb_map(address_map &map)
void dec0_state::dec0_s_map(address_map &map)
{
map(0x0000, 0x05ff).ram();
map(0x0800, 0x0801).w("ym1", FUNC(ym2203_device::write));
map(0x1000, 0x1001).w("ym2", FUNC(ym3812_device::write));
map(0x0000, 0x07ff).ram();
map(0x0800, 0x0801).rw("ym1", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0x1000, 0x1001).rw("ym2", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x3000, 0x3000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0x3800, 0x3800).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x8000, 0xffff).rom();
@ -1029,6 +1038,100 @@ static INPUT_PORTS_START( hbarrel )
PORT_INCLUDE( rotary_ports )
INPUT_PORTS_END
static INPUT_PORTS_START( bandit )
PORT_INCLUDE( dec0 )
PORT_MODIFY("INPUTS")
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Fire")
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 Bomb")
PORT_BIT( 0x00c0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire")
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Bomb")
PORT_BIT( 0xc000, IP_ACTIVE_LOW, IPT_UNUSED )
#if 0
PORT_DIPNAME( 0x0001, 0x0001, "UNK_0" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPNAME( 0x0002, 0x0002, "UNK_1" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPNAME( 0x0004, 0x0004, "UNK_2" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPNAME( 0x0008, 0x0008, "UNK_3" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPNAME( 0x0010, 0x0010, "UNK_4" ) // Gun
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPNAME( 0x0020, 0x0020, "UNK_5" ) // Missile
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPNAME( 0x0040, 0x0040, "UNK_6" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPNAME( 0x0080, 0x0080, "UNK_7" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
#endif
PORT_MODIFY("SYSTEM")
PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW")
PORT_DIPNAME( 0x0001, 0x0001, "Analog controls?" ) // ?
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPNAME( 0x0002, 0x0002, "L/R control related (keep off)" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPNAME( 0x0004, 0x0004, "DSUNK_2" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPNAME( 0x0008, 0x0000, "Road select (debug)" ) // Debug mode
PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPNAME( 0x0020, 0x0020, "DSUNK_5" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPNAME( 0x0040, 0x0040, "DSUNK_6" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPNAME( 0x0080, 0x0000, "Enable enemies" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPNAME( 0x0100, 0x0100, "DSUNK_8" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
PORT_DIPNAME( 0x0200, 0x0200, "DSUNK_9" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
PORT_DIPNAME( 0x0400, 0x0400, "DSUNK_A" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
PORT_DIPNAME( 0x0800, 0x0800, "DSUNK_B" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPNAME( 0x1000, 0x1000, "DSUNK_C" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
PORT_DIPNAME( 0x2000, 0x2000, "DSUNK_D" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
PORT_DIPNAME( 0x4000, 0x4000, "DSUNK_E" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPNAME( 0x8000, 0x8000, "DSUNK_F" )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_INCLUDE( rotary_ports )
INPUT_PORTS_END
static INPUT_PORTS_START( birdtry )
PORT_INCLUDE( dec0 )
@ -1665,6 +1768,7 @@ void dec0_state::dec0(machine_config &config)
ym1.add_route(1, "mono", 0.90);
ym1.add_route(2, "mono", 0.90);
ym1.add_route(3, "mono", 0.35);
ym1.irq_handler().set_inputline(m_audiocpu, 0); // Schematics show both ym2203 and ym3812 can trigger IRQ, but Bandit is only game to program 2203 to do so
ym3812_device &ym2(YM3812(config, "ym2", XTAL(12'000'000) / 4));
ym2.irq_handler().set_inputline(m_audiocpu, 0);
@ -1898,6 +2002,21 @@ void dec0_state::hbarrel(machine_config &config)
m_screen->set_screen_update(FUNC(dec0_state::screen_update_hbarrel));
}
void dec0_state::bandit(machine_config &config)
{
dec0(config);
i8751_device &mcu(I8751(config, m_mcu, XTAL(8'000'000)));
mcu.port_in_cb<0>().set(FUNC(dec0_state::dec0_mcu_port0_r));
mcu.port_out_cb<0>().set(FUNC(dec0_state::dec0_mcu_port0_w));
mcu.port_out_cb<1>().set(FUNC(dec0_state::dec0_mcu_port1_w));
mcu.port_out_cb<2>().set(FUNC(dec0_state::dec0_mcu_port2_w));
mcu.port_out_cb<3>().set(FUNC(dec0_state::dec0_mcu_port3_w));
/* video hardware */
m_screen->set_screen_update(FUNC(dec0_state::screen_update_bandit));
}
void dec0_state::baddudes(machine_config &config)
{
dec0(config);
@ -2836,6 +2955,51 @@ ROM_START( automat )
ROM_LOAD( "19.bin", 0x70000, 0x08000, CRC(118e7fc7) SHA1(fa6d8eef9da873579e19a9bf982643e061b8ca26) )
ROM_END
ROM_START( bandit )
ROM_REGION( 0x60000, "maincpu", 0 ) /* 6*64k for 68000 code */
ROM_LOAD16_BYTE( "4.4", 0x00000, 0x10000, CRC(01a29133) SHA1(6a8e9b959828f82333ca17dbc751a9fbafae6935) )
ROM_LOAD16_BYTE( "1.1", 0x00001, 0x10000, CRC(dc61b11f) SHA1(3178a1247d2ef4d30f9c6c55b53db658214d2861) )
ROM_LOAD16_BYTE( "5.5", 0x20000, 0x10000, CRC(7dbfa088) SHA1(7046d84f0a00f86cfa0c4d77e43118adda111001) )
ROM_LOAD16_BYTE( "2.2", 0x20001, 0x10000, CRC(3e81e138) SHA1(b2eb57900fe110d64852a5c4c9d12c060ecb54e5) )
ROM_LOAD16_BYTE( "6.6", 0x40000, 0x10000, CRC(b12e33cc) SHA1(b551cc09d25bb8ae198415f75ac2a150f2789849) )
ROM_LOAD16_BYTE( "3.3", 0x40001, 0x10000, CRC(30bf52cf) SHA1(f45d3028d0e4e8c8f2c5968b52399a4e7eb9255f) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 Sound */
ROM_LOAD( "7.7", 0x8000, 0x8000, CRC(69259ca4) SHA1(ce014836c71e269569279a09abef20cf03d46e31) )
ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
ROM_LOAD( "hb31.9a", 0x0000, 0x1000, CRC(239d726f) SHA1(969f38ae981ffde6053ece93cc51614d492edbbb) )
ROM_REGION( 0x20000, "gfx1", 0 ) /* chars */
ROM_LOAD( "25.25", 0x00000, 0x10000, CRC(4047ff81) SHA1(56a82c7694e6dbbdb9b42ed134120a76f848f7a5) )
ROM_LOAD( "26.26", 0x10000, 0x10000, CRC(3a0a2f1e) SHA1(f06b44e4a8c29ee2c0a6e8f786fbee144138ba72) )
ROM_REGION( 0x80000, "gfx2", 0 ) /* tiles */
ROM_LOAD( "18.18", 0x00000, 0x10000, CRC(ac38e585) SHA1(c1a6fb083c096d119351883dea121ee6358d9298) )
ROM_LOAD( "20.20", 0x20000, 0x10000, CRC(2194f737) SHA1(fbe2f7d0d6b80bf62fb9c38f9f2a001a728f3b7c) )
ROM_LOAD( "22.22", 0x40000, 0x10000, CRC(fcc6cb4d) SHA1(548bd8688b255cdd1eef82e4fbec3d88e1d0ab53) )
ROM_LOAD( "24.24", 0x60000, 0x10000, CRC(aa3c33b6) SHA1(f7770daedb5c1d5dd5099f1378c5c292c68a6a12) )
ROM_REGION( 0x40000, "gfx3", 0 ) /* tiles */
ROM_LOAD( "29.29", 0x00000, 0x10000, CRC(32218c8a) SHA1(33e922ffd7000a03a8fa8bbe61483cd8e916ebd6) )
ROM_LOAD( "30.30", 0x10000, 0x10000, CRC(6a5fe9a9) SHA1(a750373e9fb1a0ad81d63a19bbac7a6079d3372f) )
ROM_LOAD( "27.27", 0x20000, 0x10000, CRC(62970304) SHA1(57606bedfd83429629593bbea50fb25db1f2d874) )
ROM_LOAD( "28.28", 0x30000, 0x10000, CRC(e018459f) SHA1(136ce96523988173425fa791742dab62ecaef5c9) )
ROM_REGION( 0x80000, "gfx4", 0 ) /* sprites */
ROM_LOAD( "15.15", 0x00000, 0x10000, CRC(84c03235) SHA1(3b5a8e24dd0aba1d1530d37685aaa46a35b0249a) )
ROM_LOAD( "16.16", 0x10000, 0x10000, CRC(eaa35477) SHA1(08763d7937a6fa76f6029974d5b909ba05c69d81) )
ROM_LOAD( "11.11", 0x20000, 0x10000, CRC(c9e6b57f) SHA1(9c12e0e7e25d48c7679ea65c3dfeaca9fdfdcbb3) )
ROM_LOAD( "12.12", 0x30000, 0x10000, CRC(317f7e4a) SHA1(7d20722e75d69ef4f408e1995a29338c452b63c9) )
ROM_LOAD( "13.13", 0x40000, 0x10000, CRC(0c063bec) SHA1(e9808d20dc9e450c6a880ca1d8383246aff1ab36) )
ROM_LOAD( "14.14", 0x50000, 0x10000, CRC(2ebf06d3) SHA1(6381f978c0e719bf80d2c16a8355a0892473720a) )
ROM_LOAD( "9.9", 0x60000, 0x10000, CRC(046f9d58) SHA1(a3078c13d27f365f900be3b55d1a917a8cd712f8) )
ROM_LOAD( "10.10", 0x70000, 0x10000, CRC(3d2d704e) SHA1(3dcf3dd8cc91c5629e014bc6e2ccce234cf549a5) )
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */
ROM_LOAD( "8.8", 0x0000, 0x10000, CRC(b0e79b9f) SHA1(6613c41234b8305d8959d06d6b4e9127bfc5eebe) )
ROM_END
ROM_START( hippodrm )
ROM_REGION( 0x60000, "maincpu", 0 ) /* 4*64k for 68000 code */
@ -3769,6 +3933,7 @@ GAME( 1988, robocop, 0, robocop, robocop, dec0_state, empty_init
GAME( 1988, robocopw, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (World revision 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopj, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East Corporation", "Robocop (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopu, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East USA", "Robocop (US revision 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, bandit, 0, bandit, bandit, dec0_state, init_hbarrel, ROT90, "Data East USA", "Bandit (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopu0, robocop, robocop, robocop, dec0_state, empty_init, ROT0, "Data East USA", "Robocop (US revision 0)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, hippodrm, 0, hippodrm, hippodrm, dec0_state, init_hippodrm, ROT0, "Data East USA", "Hippodrome (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1989, ffantasy, hippodrm, hippodrm, ffantasy, dec0_state, init_hippodrm, ROT0, "Data East Corporation", "Fighting Fantasy (Japan revision 3)", MACHINE_SUPPORTS_SAVE )

View File

@ -51,6 +51,7 @@ public:
void midresbj(machine_config &config);
void slyspy(machine_config &config);
void hbarrel(machine_config &config);
void bandit(machine_config &config);
void midresb(machine_config &config);
void ffantasybl(machine_config &config);
void drgninjab(machine_config &config);
@ -141,6 +142,7 @@ private:
DECLARE_VIDEO_START(dec0);
uint32_t screen_update_hbarrel(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_bandit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_baddudes(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_birdtry(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_robocop(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);

View File

@ -11308,6 +11308,7 @@ ffantasyb // EX (c) 1989 Data East Corporation (World)
ffantasybl // bootleg
hbarrel // (c) 1987 Data East USA (US)
hbarrelw // (c) 1987 Data East Corporation (World)
bandit // (c) 1989 Data East USA (US)
hippodrm // EW (c) 1989 Data East USA (US)
midres // (c) 1989 Data East Corporation (World)
midresb // bootleg

View File

@ -36,6 +36,33 @@ uint32_t dec0_state::screen_update_hbarrel(screen_device &screen, bitmap_ind16 &
/******************************************************************************/
uint32_t dec0_state::screen_update_bandit(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bool flip = m_tilegen[0]->get_flip_state();
m_tilegen[0]->set_flip_screen(flip);
m_tilegen[1]->set_flip_screen(flip);
m_tilegen[2]->set_flip_screen(flip);
m_spritegen->set_flip_screen(flip);
if (m_pri==0)
{
m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f);
m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
}
else
{
m_tilegen[2]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
m_tilegen[1]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00);
m_spritegen->draw_sprites(bitmap, cliprect, m_buffered_spriteram, 0x00, 0x00, 0x0f);
}
return 0;
}
/******************************************************************************/
uint32_t dec0_state::screen_update_baddudes(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bool flip = m_tilegen[0]->get_flip_state();

View File

@ -25,7 +25,7 @@ configuration is 2 chips of 16*16 tiles, 1 of 8*8.
bank 0:
0:
bit 0 (0x1) set = 8*8 tiles, else 16*16 tiles
Bit 1 (0x2) unknown
Bit 1 (0x2) set = row major tile layout, else column major*
bit 2 (0x4) set enables rowscroll
bit 3 (0x8) set enables colscroll
bit 7 (0x80) set in playfield 1 is reverse screen (set via dip-switch)
@ -44,6 +44,9 @@ configuration is 2 chips of 16*16 tiles, 1 of 8*8.
The shift register controls the granularity of the scroll offsets
(more details given later).
* Bandit is the only game known to use column major tile layout, when in this
mode X scrolling is also inverted, and tile character data is flipped on X.
Playfield priority (Bad Dudes, etc):
In the bottommost playfield, pens 8-15 can have priority over the next playfield.
In that next playfield, pens 8-15 can have priority over sprites.
@ -60,6 +63,8 @@ Priority word (Midres):
Bit 2
Bit 3 set = ...
Note that priority mixing is handled outside of the BAC-06 chip.
*/
#include "emu.h"
@ -139,31 +144,43 @@ void deco_bac06_device::set_flip_screen(bool flip)
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape0_scan)
{
if ((m_pf_control_0[0]&2)==0)
return (row & 0xf) + ((0x3f - (col & 0x3f)) << 4);
return (col & 0xf) + ((row & 0xf) << 4) + ((col & 0x1f0) << 4);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape1_scan)
{
//if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
// return (row & 0xf) + ((col & 0x1f) << 4) + ((col & 0xf0) << 5);
return (col & 0xf) + ((row & 0x1f) << 4) + ((col & 0xf0) << 5);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape2_scan)
{
//if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
// return (col & 0xf) + ((row & 0x3f) << 4) + ((row & 0x70) << 6);
return (col & 0xf) + ((row & 0x3f) << 4) + ((col & 0x70) << 6);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape0_8x8_scan)
{
//if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
// return (col & 0x1f) + ((row & 0x1f) << 5) + ((row & 0x60) << 5);
return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x60) << 5);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape1_8x8_scan)
{
//if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
// return (row & 0x1f) + ((col & 0x1f) << 5) + ((col & 0x20) << 5) + ((row & 0x20) << 6);
return (col & 0x1f) + ((row & 0x1f) << 5) + ((row & 0x20) << 5) + ((col & 0x20) << 6);
}
TILEMAP_MAPPER_MEMBER(deco_bac06_device::tile_shape2_8x8_scan)
{
//if (m_pf_control_0[0]&2) // Needs testing on real hardware, not used by any game
// return (row & 0x1f) + ((col & 0x7f) << 5);
return (col & 0x1f) + ((row & 0x7f) << 5);
}
@ -172,7 +189,8 @@ TILE_GET_INFO_MEMBER(deco_bac06_device::get_pf8x8_tile_info)
if (m_rambank&1) tile_index+=0x1000;
int tile=m_pf_data[tile_index];
int colourpri=(tile>>12);
SET_TILE_INFO_MEMBER(m_tile_region_8,tile&0xfff,0,0);
int flags=(m_pf_control_0[0]&2) ? 0 : TILE_FLIPX;
SET_TILE_INFO_MEMBER(m_tile_region_8,tile&0xfff,0,flags);
tileinfo.category = colourpri;
}
@ -181,7 +199,8 @@ TILE_GET_INFO_MEMBER(deco_bac06_device::get_pf16x16_tile_info)
if (m_rambank&1) tile_index+=0x1000;
int tile=m_pf_data[tile_index];
int colourpri=(tile>>12);
SET_TILE_INFO_MEMBER(m_tile_region_16,tile&0xfff,0,0);
int flags=(m_pf_control_0[0]&2) ? 0 : TILE_FLIPX;
SET_TILE_INFO_MEMBER(m_tile_region_16,tile&0xfff,0,flags);
tileinfo.category = colourpri;
}
@ -238,7 +257,10 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
if (control1)
{
scrollx = control1[0];
if ((control0 && control0[0]&2)==0) // Use of column major mode inverts scroll direction
scrollx = -control1[0] - 0x100;
else
scrollx = control1[0];
scrolly = control1[1];
}

View File

@ -61,7 +61,7 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli
offs = 0;
while (offs < m_ramsize / 2)
{
int sx, sy, code, color, w, h, flipx, flipy, incy, flash, mult, x, y;
int sx, sy, code, color, w, h, flipx, flipy, incy, flash, mult, x, y, parentFlipY;
sy = spriteram[offs];
sx = spriteram[offs + 2];
@ -70,12 +70,9 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli
flash = sx & 0x800;
flipx = sy & 0x2000;
flipy = sy & 0x4000;
parentFlipY = flipy = sy & 0x4000;
h = (1 << ((sy & 0x1800) >> 11)); /* 1x, 2x, 4x, 8x height */
w = (1 << ((sy & 0x0600) >> 9)); /* 1x, 2x, 4x, 8x width */
/* multi width used only on the title screen? */
sx = sx & 0x01ff;
sy = sy & 0x01ff;
@ -112,7 +109,7 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli
code &= ~(h - 1);
// not affected by flipscreen
if (spriteram[offs] & 0x4000)
if (parentFlipY) // in the case of multi-width sprites the y flip bit is set by the parent
incy = -1;
else
{