diff options
Diffstat (limited to 'trunk/src/mame/drivers/deco156.c')
-rw-r--r-- | trunk/src/mame/drivers/deco156.c | 660 |
1 files changed, 660 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/deco156.c b/trunk/src/mame/drivers/deco156.c new file mode 100644 index 00000000000..6464b4e0983 --- /dev/null +++ b/trunk/src/mame/drivers/deco156.c @@ -0,0 +1,660 @@ +/* + (Some) Data East 32 bit 156 CPU ARM based games: + + Heavy Smash + World Cup Volleyball 95 + + See also deco32.c, deco_mlc.c, backfire.c + + Todo: + complete co-processor emulation for wcvol95 + + Emulation by Bryan McPhail, mish@tendril.co.uk +*/ + +#define DE156CPU ARM + +#include "emu.h" +#include "cpu/arm/arm.h" +#include "includes/decocrpt.h" +#include "machine/eeprom.h" +#include "sound/okim6295.h" +#include "sound/ymz280b.h" +#include "video/deco16ic.h" +#include "video/decospr.h" + +class deco156_state : public driver_device +{ +public: + deco156_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_deco_tilegen1(*this, "tilegen1"), + m_oki2(*this, "oki2") { } + + /* devices */ + required_device<arm_device> m_maincpu; + required_device<deco16ic_device> m_deco_tilegen1; + optional_device<okim6295_device> m_oki2; + + /* memory */ + UINT16 m_pf1_rowscroll[0x800/2]; + UINT16 m_pf2_rowscroll[0x800/2]; + UINT16* m_spriteram; + DECLARE_WRITE32_MEMBER(hvysmsh_eeprom_w); + DECLARE_WRITE32_MEMBER(wcvol95_nonbuffered_palette_w); + DECLARE_WRITE32_MEMBER(deco156_nonbuffered_palette_w); + DECLARE_READ32_MEMBER(wcvol95_pf1_rowscroll_r); + DECLARE_READ32_MEMBER(wcvol95_pf2_rowscroll_r); + DECLARE_READ32_MEMBER(wcvol95_spriteram_r); + DECLARE_WRITE32_MEMBER(wcvol95_pf1_rowscroll_w); + DECLARE_WRITE32_MEMBER(wcvol95_pf2_rowscroll_w); + DECLARE_WRITE32_MEMBER(wcvol95_spriteram_w); +}; + + +static VIDEO_START( wcvol95 ) +{ + deco156_state *state = machine.driver_data<deco156_state>(); + state->m_spriteram = auto_alloc_array(machine, UINT16, 0x2000/2); + + /* and register the allocated ram so that save states still work */ + state->save_item(NAME(state->m_pf1_rowscroll)); + state->save_item(NAME(state->m_pf2_rowscroll)); + state->save_pointer(NAME(state->m_spriteram), 0x2000/2); +} + + +static SCREEN_UPDATE_RGB32( wcvol95 ) +{ + //FIXME: flip_screen_x should not be written! + deco156_state *state = screen.machine().driver_data<deco156_state>(); + state->flip_screen_set_no_update(1); + + screen.machine().priority_bitmap.fill(0); + bitmap.fill(0); + + deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); + + deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + screen.machine().device<decospr_device>("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x800); + deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); + return 0; +} + +/***************************************************************************/ + +WRITE32_MEMBER(deco156_state::hvysmsh_eeprom_w) +{ + if (ACCESSING_BITS_0_7) + { + m_oki2->set_bank_base(0x40000 * (data & 0x7)); + ioport("EEPROMOUT")->write(data, 0xff); + } +} + +static WRITE32_DEVICE_HANDLER( hvysmsh_oki_0_bank_w ) +{ + okim6295_device *oki = downcast<okim6295_device *>(device); + oki->set_bank_base((data & 1) * 0x40000); +} + +WRITE32_MEMBER(deco156_state::wcvol95_nonbuffered_palette_w) +{ + COMBINE_DATA(&m_generic_paletteram_32[offset]); + palette_set_color_rgb(machine(),offset,pal5bit(m_generic_paletteram_32[offset] >> 0),pal5bit(m_generic_paletteram_32[offset] >> 5),pal5bit(m_generic_paletteram_32[offset] >> 10)); +} + +/* This is the same as deco32_nonbuffered_palette_w in video/deco32.c */ +WRITE32_MEMBER(deco156_state::deco156_nonbuffered_palette_w) +{ + int r,g,b; + + COMBINE_DATA(&m_generic_paletteram_32[offset]); + + b = (m_generic_paletteram_32[offset] >>16) & 0xff; + g = (m_generic_paletteram_32[offset] >> 8) & 0xff; + r = (m_generic_paletteram_32[offset] >> 0) & 0xff; + + palette_set_color(machine(),offset,MAKE_RGB(r,g,b)); +} + +READ32_MEMBER(deco156_state::wcvol95_pf1_rowscroll_r){ return m_pf1_rowscroll[offset] ^ 0xffff0000; } +READ32_MEMBER(deco156_state::wcvol95_pf2_rowscroll_r){ return m_pf2_rowscroll[offset] ^ 0xffff0000; } +READ32_MEMBER(deco156_state::wcvol95_spriteram_r){ return m_spriteram[offset] ^ 0xffff0000; } +WRITE32_MEMBER(deco156_state::wcvol95_pf1_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf1_rowscroll[offset]); } +WRITE32_MEMBER(deco156_state::wcvol95_pf2_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf2_rowscroll[offset]); } +WRITE32_MEMBER(deco156_state::wcvol95_spriteram_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_spriteram[offset]); } + + +static ADDRESS_MAP_START( hvysmsh_map, AS_PROGRAM, 32, deco156_state ) + AM_RANGE(0x000000, 0x0fffff) AM_ROM + AM_RANGE(0x100000, 0x107fff) AM_RAM + AM_RANGE(0x120000, 0x120003) AM_READ_PORT("INPUTS") + AM_RANGE(0x120000, 0x120003) AM_WRITENOP // Volume control in low byte + AM_RANGE(0x120004, 0x120007) AM_WRITE(hvysmsh_eeprom_w) + AM_RANGE(0x120008, 0x12000b) AM_WRITENOP // IRQ ack? + AM_RANGE(0x12000c, 0x12000f) AM_DEVWRITE_LEGACY("oki1", hvysmsh_oki_0_bank_w) + AM_RANGE(0x140000, 0x140003) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x000000ff) + AM_RANGE(0x160000, 0x160003) AM_DEVREADWRITE8("oki2", okim6295_device, read, write, 0x000000ff) + AM_RANGE(0x180000, 0x18001f) AM_DEVREADWRITE_LEGACY("tilegen1", deco16ic_pf_control_dword_r, deco16ic_pf_control_dword_w) + AM_RANGE(0x190000, 0x191fff) AM_DEVREADWRITE_LEGACY("tilegen1", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) + AM_RANGE(0x194000, 0x195fff) AM_DEVREADWRITE_LEGACY("tilegen1", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) + AM_RANGE(0x1a0000, 0x1a0fff) AM_READWRITE(wcvol95_pf1_rowscroll_r, wcvol95_pf1_rowscroll_w) + AM_RANGE(0x1a4000, 0x1a4fff) AM_READWRITE(wcvol95_pf2_rowscroll_r, wcvol95_pf2_rowscroll_w) + AM_RANGE(0x1c0000, 0x1c0fff) AM_RAM_WRITE(deco156_nonbuffered_palette_w) AM_SHARE("paletteram") + AM_RANGE(0x1d0010, 0x1d002f) AM_READNOP // Check for DMA complete? + AM_RANGE(0x1e0000, 0x1e1fff) AM_READWRITE(wcvol95_spriteram_r, wcvol95_spriteram_w) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( wcvol95_map, AS_PROGRAM, 32, deco156_state ) + AM_RANGE(0x000000, 0x0fffff) AM_ROM + AM_RANGE(0x100000, 0x10001f) AM_DEVREADWRITE_LEGACY("tilegen1", deco16ic_pf_control_dword_r, deco16ic_pf_control_dword_w) + AM_RANGE(0x110000, 0x111fff) AM_DEVREADWRITE_LEGACY("tilegen1", deco16ic_pf1_data_dword_r, deco16ic_pf1_data_dword_w) + AM_RANGE(0x114000, 0x115fff) AM_DEVREADWRITE_LEGACY("tilegen1", deco16ic_pf2_data_dword_r, deco16ic_pf2_data_dword_w) + AM_RANGE(0x120000, 0x120fff) AM_READWRITE(wcvol95_pf1_rowscroll_r, wcvol95_pf1_rowscroll_w) + AM_RANGE(0x124000, 0x124fff) AM_READWRITE(wcvol95_pf2_rowscroll_r, wcvol95_pf2_rowscroll_w) + AM_RANGE(0x130000, 0x137fff) AM_RAM + AM_RANGE(0x140000, 0x140003) AM_READ_PORT("INPUTS") + AM_RANGE(0x150000, 0x150003) AM_WRITE_PORT("EEPROMOUT") + AM_RANGE(0x160000, 0x161fff) AM_READWRITE(wcvol95_spriteram_r, wcvol95_spriteram_w) + AM_RANGE(0x170000, 0x170003) AM_NOP // Irq ack? + AM_RANGE(0x180000, 0x180fff) AM_RAM_WRITE(wcvol95_nonbuffered_palette_w) AM_SHARE("paletteram") + AM_RANGE(0x1a0000, 0x1a0007) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x000000ff) +ADDRESS_MAP_END + + +/***************************************************************************/ + +static INPUT_PORTS_START( hvysmsh ) + PORT_START("INPUTS") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_SERVICE_NO_TOGGLE( 0x00080000, IP_ACTIVE_LOW ) + PORT_BIT( 0x00100000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") + PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) + PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) + PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) + PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) + PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) + PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START( "EEPROMOUT" ) + PORT_BIT( 0x00000010, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, write_bit) + PORT_BIT( 0x00000020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_clock_line) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_cs_line) +INPUT_PORTS_END + +static INPUT_PORTS_START( wcvol95 ) + PORT_START("INPUTS") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_SERVICE_NO_TOGGLE( 0x00080000, IP_ACTIVE_LOW ) + PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") + PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_UNUSED ) /* 'soundmask' */ + PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01000000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) + PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) + PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) + PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) + PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) + PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START( "EEPROMOUT" ) + PORT_BIT( 0x00000001, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, write_bit) + PORT_BIT( 0x00000002, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_clock_line) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_device, set_cs_line) +INPUT_PORTS_END + + +/**********************************************************************************/ + +static const gfx_layout charlayout = +{ + 8,8, + RGN_FRAC(1,2), + 4, + { RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, + 16*8 /* every char takes 8 consecutive bytes */ +}; + +static const gfx_layout spritelayout = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { 16, 0, 24, 8 }, + { 64*8+0, 64*8+1, 64*8+2, 64*8+3, 64*8+4, 64*8+5, 64*8+6, 64*8+7, + 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, + 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 }, + 128*8 +}; + +static const gfx_layout tilelayout = +{ + 16,16, + RGN_FRAC(1,2), + 4, + { RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 }, + { 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7, + 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16, + 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 }, + 64*8 +}; + +static GFXDECODE_START( hvysmsh ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 32 ) /* Characters 8x8 */ + GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 32 ) /* Tiles 16x16 */ + GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 512, 32 ) /* Sprites 16x16 */ +GFXDECODE_END + + +/**********************************************************************************/ + +static void sound_irq_gen(device_t *device, int state) +{ + logerror("sound irq\n"); +} + +static const ymz280b_interface ymz280b_intf = +{ + sound_irq_gen +}; + +static INTERRUPT_GEN( deco32_vbl_interrupt ) +{ + device_set_input_line(device, ARM_IRQ_LINE, HOLD_LINE); +} + +static int deco156_bank_callback(const int bank) +{ + return ((bank >> 4) & 0x7) * 0x1000; +} + +static const deco16ic_interface deco156_deco16ic_tilegen1_intf = +{ + "screen", + 0, 1, + 0x0f, 0x0f, /* trans masks (default values) */ + 0, 16, /* color base (default values) */ + 0x0f, 0x0f, /* color masks (default values) */ + deco156_bank_callback, + deco156_bank_callback, + 0,1, +}; + +UINT16 deco156_pri_callback(UINT16 x) +{ + switch (x & 0xc000) + { + case 0x0000: return 0; + case 0x4000: return 0xf0; + case 0x8000: return 0xf0 | 0xcc; + case 0xc000: return 0xf0 | 0xcc; + } + + return 0; +} + + +static MACHINE_CONFIG_START( hvysmsh, deco156_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", ARM, 28000000) /* Unconfirmed */ + MCFG_CPU_PROGRAM_MAP(hvysmsh_map) + MCFG_CPU_VBLANK_INT("screen", deco32_vbl_interrupt) + + MCFG_EEPROM_93C46_ADD("eeprom") + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(58) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) + MCFG_SCREEN_SIZE(40*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) + MCFG_SCREEN_UPDATE_STATIC(wcvol95) + + MCFG_GFXDECODE(hvysmsh) + MCFG_PALETTE_LENGTH(1024) + + MCFG_VIDEO_START(wcvol95) + + MCFG_DECO16IC_ADD("tilegen1", deco156_deco16ic_tilegen1_intf) + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 2); + decospr_device::set_pri_callback(*device, deco156_pri_callback); + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + + MCFG_OKIM6295_ADD("oki1", 28000000/28, OKIM6295_PIN7_HIGH) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) + + MCFG_OKIM6295_ADD("oki2", 28000000/14, OKIM6295_PIN7_HIGH) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.35) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.35) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( wcvol95, deco156_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", ARM, 28000000) /* Unconfirmed */ + MCFG_CPU_PROGRAM_MAP(wcvol95_map) + MCFG_CPU_VBLANK_INT("screen", deco32_vbl_interrupt) + + MCFG_EEPROM_93C46_ADD("eeprom") + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(58) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) + MCFG_SCREEN_SIZE(40*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) + MCFG_SCREEN_UPDATE_STATIC(wcvol95) + + MCFG_GFXDECODE(hvysmsh) + MCFG_PALETTE_LENGTH(1024) + + MCFG_VIDEO_START(wcvol95) + + MCFG_DECO16IC_ADD("tilegen1", deco156_deco16ic_tilegen1_intf) + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 2); + decospr_device::set_pri_callback(*device, deco156_pri_callback); + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + + MCFG_SOUND_ADD("ymz", YMZ280B, 28000000 / 2) + MCFG_SOUND_CONFIG(ymz280b_intf) + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) +MACHINE_CONFIG_END + + +/**********************************************************************************/ + +/* + +Heavy Smash +Data East, 1993 + +PCB Layout + +DE-0385-2 DEC-22VO +|----------------------------------------------| +| 28MHz DE52 | +| MBG-04.13J MBG-02.11A| +| M6295(1) MBG-03.10K VL-02 MBG-01.10A| +| M6295(2) DE153 MBG-00.9A | +| | +| | +|J | +|A 93C46.8K | +|M | +|M DE141 | +|A VL-01 VL-00 | +| 6264 | +| DE153 6264 | +| | +| | +|TEST_SW DE156 | +| LP01-2.3J 6264 6264 | +| LP00-2.2J 6264 6264 | +| | +|----------------------------------------------| + +Notes: + - CPU is unknown. It's chip DE156. The clock input is 7.000MHz on pin 90 + It's thought to be a custom-made encrypted ARM7-based CPU. + The package is a Quad Flat Pack and has 100 pins. + - OKI M6295(1) clock: 1.000MHz (28 / 28), sample rate = 1000000 / 132 + - OKI M6295(2) clock: 2.000MHz (28 / 14), sample rate = 2000000 / 132 + - VSync: 58Hz + - VL-00 (PAL16R8), VL-01 (PAL16L8), VL-02 (PAL16R6) + - On the Data East boards of this type (using DE156) that use an EEPROM, the EEPROM contains the + country/region code also. It has been proven by comparing the dumps of Osman and Cannon Dancer.... + they were identical and there are no region jumper pads on the PCB. Therefore the EEPROM must + hold the region code. + + ROMs + ---- + - MBG-00, MBG-01, MBG-02 - 16M MASK Graphics + - LP00, LP01 - 27C4096 Main program + - MBG-03 - 4M MASK Sound (samples, linked to M6295(1) + - MBG-04 - 16M MASK Sound (samples, linked to M6295(2) + - 93C46 - 128 bytes EEPROM (Note! this chip has identical halves and fixed + bits, but the dump is correct!) + +*/ + +ROM_START( hvysmsh ) /* Europe -2 1993/06/30 */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* DE156 code (encrypted) */ + ROM_LOAD32_WORD( "lt00-2.2j", 0x000002, 0x080000, CRC(f6e10fc0) SHA1(76189260ca0a79500d62c4aa8e3aed6cfca3e102) ) + ROM_LOAD32_WORD( "lt01-2.3j", 0x000000, 0x080000, CRC(ce2a75e2) SHA1(4119a3175d7c394041197f01523a6eaa3d9ba398) ) + + ROM_REGION( 0x200000, "gfx1", 0 ) + ROM_LOAD( "mbg-00.9a", 0x000000, 0x080000, CRC(7d94eb16) SHA1(31cf5302eba37e935865822aebd76c700bc51eaf) ) + ROM_CONTINUE( 0x100000, 0x080000) + ROM_CONTINUE( 0x080000, 0x080000) + ROM_CONTINUE( 0x180000, 0x080000) + + ROM_REGION( 0x800000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "mbg-01.10a", 0x000000, 0x200000, CRC(bcd7fb29) SHA1(a54a813b5adcb4df0bfdd58285b1f8e17fbbb7a2) ) + ROM_LOAD16_BYTE( "mbg-02.11a", 0x000001, 0x200000, CRC(0cc16440) SHA1(1cbf620a9d875ec87dd28a97a256584b6ef277cd) ) + + ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples */ + ROM_LOAD( "mbg-03.10k", 0x00000, 0x80000, CRC(4b809420) SHA1(ad0278745002320804a31af0b772f9ab5f075027) ) + + ROM_REGION( 0x200000, "oki2", 0 ) /* Oki samples */ + ROM_LOAD( "mbg-04.11k", 0x00000, 0x200000, CRC(2281c758) SHA1(934691b4002ecd6bc9a09b8970ff18a09451d492) ) + +// ROM_REGION( 0x80, "user1", 0 ) /* eeprom */ +// ROM_LOAD( "93c46.8k", 0x00, 0x80, CRC(d31fbd5b) SHA1(bf044408c637f6b39afd30ccb86af183ec0acc02) ) +ROM_END + +ROM_START( hvysmshj ) /* Japan -2 1993/06/30 */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* DE156 code (encrypted) */ + ROM_LOAD32_WORD( "lp00-2.2j", 0x000002, 0x080000, CRC(3f8fd724) SHA1(8efb27b96dbdc58715eb44c7846f30d485e1ded4) ) + ROM_LOAD32_WORD( "lp01-2.3j", 0x000000, 0x080000, CRC(a6fe282a) SHA1(10295b740ced35b3bb1f48ca3af2e985912405ec) ) + + ROM_REGION( 0x200000, "gfx1", 0 ) + ROM_LOAD( "mbg-00.9a", 0x000000, 0x080000, CRC(7d94eb16) SHA1(31cf5302eba37e935865822aebd76c700bc51eaf) ) + ROM_CONTINUE( 0x100000, 0x080000) + ROM_CONTINUE( 0x080000, 0x080000) + ROM_CONTINUE( 0x180000, 0x080000) + + ROM_REGION( 0x800000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "mbg-01.10a", 0x000000, 0x200000, CRC(bcd7fb29) SHA1(a54a813b5adcb4df0bfdd58285b1f8e17fbbb7a2) ) + ROM_LOAD16_BYTE( "mbg-02.11a", 0x000001, 0x200000, CRC(0cc16440) SHA1(1cbf620a9d875ec87dd28a97a256584b6ef277cd) ) + + ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples */ + ROM_LOAD( "mbg-03.10k", 0x00000, 0x80000, CRC(4b809420) SHA1(ad0278745002320804a31af0b772f9ab5f075027) ) + + ROM_REGION( 0x200000, "oki2", 0 ) /* Oki samples */ + ROM_LOAD( "mbg-04.11k", 0x00000, 0x200000, CRC(2281c758) SHA1(934691b4002ecd6bc9a09b8970ff18a09451d492) ) + +// ROM_REGION( 0x80, "user1", 0 ) /* eeprom */ +// ROM_LOAD( "93c46.8k", 0x00, 0x80, CRC(d31fbd5b) SHA1(bf044408c637f6b39afd30ccb86af183ec0acc02) ) +ROM_END + +ROM_START( hvysmsha ) /* Asia -4 1993/09/06 */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* DE156 code (encrypted) */ + ROM_LOAD32_WORD( "xx00-4.2j", 0x000002, 0x080000, CRC(333a92c1) SHA1(b7e174ea081febb765298aa1c6533b2f9f162bce) ) /* "xx" is NOT the correct region code, this needs */ + ROM_LOAD32_WORD( "xx01-4.3j", 0x000000, 0x080000, CRC(8c24c5ed) SHA1(ab9689530f4f4a6015ce0a6f8e0d796b0618cd79) ) /* to be verified and corrected at some point */ + + ROM_REGION( 0x200000, "gfx1", 0 ) + ROM_LOAD( "mbg-00.9a", 0x000000, 0x080000, CRC(7d94eb16) SHA1(31cf5302eba37e935865822aebd76c700bc51eaf) ) + ROM_CONTINUE( 0x100000, 0x080000) + ROM_CONTINUE( 0x080000, 0x080000) + ROM_CONTINUE( 0x180000, 0x080000) + + ROM_REGION( 0x800000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "mbg-01.10a", 0x000000, 0x200000, CRC(bcd7fb29) SHA1(a54a813b5adcb4df0bfdd58285b1f8e17fbbb7a2) ) + ROM_LOAD16_BYTE( "mbg-02.11a", 0x000001, 0x200000, CRC(0cc16440) SHA1(1cbf620a9d875ec87dd28a97a256584b6ef277cd) ) + + ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples */ + ROM_LOAD( "mbg-03.10k", 0x00000, 0x80000, CRC(4b809420) SHA1(ad0278745002320804a31af0b772f9ab5f075027) ) + + ROM_REGION( 0x200000, "oki2", 0 ) /* Oki samples */ + ROM_LOAD( "mbg-04.11k", 0x00000, 0x200000, CRC(2281c758) SHA1(934691b4002ecd6bc9a09b8970ff18a09451d492) ) + +// ROM_REGION( 0x80, "user1", 0 ) /* eeprom */ +// ROM_LOAD( "93c46.8k", 0x00, 0x80, CRC(d31fbd5b) SHA1(bf044408c637f6b39afd30ccb86af183ec0acc02) ) +ROM_END + +/* +World Cup Volley '95 +Data East, 1995 + +PCB Layout + +DE-0430-2 +|----------------------------------------------| +| MBX-03.13J MBX-02.13A| +| LC7881 28MHz DE52 | +| YMZ280B-F MBX-01.12A| +| CY7C185 | +| CY7C185 MBX-00.9A | +| WE-02 | +|J | +|A | +|M 6264 | +|M DE141 | +|A DE223 6264 | +| | +| WE-00 | +| WE-01 | +| | +|TEST_SW PN01-0.4F 6264 | +| 93C46.3K 6264 | +| PN00-0.2F 6264 DE156 | +| 6264 | +|----------------------------------------------| + +Notes: + - CPU is unknown. It's chip DE156. The clock input is 7.000MHz on pin 90 + It's thought to be a custom-made encrypted ARM7-based CPU. + The package is a Quad Flat Pack and has 100 pins. + - YMZ280B-F clock: 14.000MHz (28 / 2) + SANYO LC7881 clock: 2.3333MHz (28 / 12) + - VSync: 58Hz + - WE-00, WE-01 and WE-02 are PALs type GAL16V8 + +*/ + +ROM_START( wcvol95 ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* DE156 code (encrypted) */ + ROM_LOAD32_WORD( "pn00-0.2f", 0x000002, 0x080000, CRC(c9ed2006) SHA1(cee93eafc42c4de7a1453c85e7d6bca8d62cdc7b) ) + ROM_LOAD32_WORD( "pn01-0.4f", 0x000000, 0x080000, CRC(1c3641c3) SHA1(60dddc3585e4dedb485f7505fee03495f615c0c0) ) + + ROM_REGION( 0x080000, "gfx1", 0 ) + ROM_LOAD( "mbx-00.9a", 0x000000, 0x080000, CRC(a0b24204) SHA1(cec8089c6c635f23b3a4aeeef2c43f519568ad70) ) + + ROM_REGION( 0x200000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "mbx-01.12a", 0x000000, 0x100000, CRC(73deb3f1) SHA1(c0cabecfd88695afe0f27c5bb115b4973907207d) ) + ROM_LOAD16_BYTE( "mbx-02.13a", 0x000001, 0x100000, CRC(3204d324) SHA1(44102f71bae44bf3a9bd2de7e5791d959a2c9bdd) ) + + ROM_REGION( 0x200000, "ymz", 0 ) /* YMZ280B-F samples */ + ROM_LOAD( "mbx-03.13j", 0x00000, 0x200000, CRC(061632bc) SHA1(7900ac56e59f4a4e5768ce72f4a4b7c5875f5ae8) ) + +// ROM_REGION( 0x80, "user1", 0 ) /* eeprom */ +// ROM_LOAD( "93c46.3k", 0x00, 0x80, CRC(88f8e270) SHA1(cb82203ad38e0c12ea998562b7b785979726afe5) ) +ROM_END + +/**********************************************************************************/ + +static void descramble_sound( running_machine &machine, const char *tag ) +{ + UINT8 *rom = machine.root_device().memregion(tag)->base(); + int length = machine.root_device().memregion(tag)->bytes(); + UINT8 *buf1 = auto_alloc_array(machine, UINT8, length); + UINT32 x; + + for (x = 0; x < length; x++) + { + UINT32 addr; + + addr = BITSWAP24 (x,23,22,21,0, 20, + 19,18,17,16, + 15,14,13,12, + 11,10,9, 8, + 7, 6, 5, 4, + 3, 2, 1 ); + + buf1[addr] = rom[x]; + } + + memcpy(rom,buf1,length); + + auto_free(machine, buf1); +} + +static DRIVER_INIT( hvysmsh ) +{ + deco56_decrypt_gfx(machine, "gfx1"); /* 141 */ + deco156_decrypt(machine); + descramble_sound(machine, "oki2"); +} + +static DRIVER_INIT( wcvol95 ) +{ + deco56_decrypt_gfx(machine, "gfx1"); /* 141 */ + deco156_decrypt(machine); + descramble_sound(machine, "ymz"); +} + + +/**********************************************************************************/ + +GAME( 1993, hvysmsh, 0, hvysmsh, hvysmsh, hvysmsh, ROT0, "Data East Corporation", "Heavy Smash (Europe version -2)", GAME_SUPPORTS_SAVE ) +GAME( 1993, hvysmsha, hvysmsh, hvysmsh, hvysmsh, hvysmsh, ROT0, "Data East Corporation", "Heavy Smash (Asia version -4)", GAME_SUPPORTS_SAVE ) +GAME( 1993, hvysmshj, hvysmsh, hvysmsh, hvysmsh, hvysmsh, ROT0, "Data East Corporation", "Heavy Smash (Japan version -2)", GAME_SUPPORTS_SAVE ) +GAME( 1995, wcvol95, 0, wcvol95, wcvol95, wcvol95, ROT0, "Data East Corporation", "World Cup Volley '95 (Japan v1.0)", GAME_SUPPORTS_SAVE ) |