summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/vmetal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/vmetal.c')
-rw-r--r--src/mame/drivers/vmetal.c499
1 files changed, 499 insertions, 0 deletions
diff --git a/src/mame/drivers/vmetal.c b/src/mame/drivers/vmetal.c
new file mode 100644
index 00000000000..2c69fe5aa11
--- /dev/null
+++ b/src/mame/drivers/vmetal.c
@@ -0,0 +1,499 @@
+/*
+
+Varia Metal
+Excellent System Ltd, 1995
+
+PCB Layout
+----------
+This game runs on Metro hardware.
+
+ES-9309B-B
+|--------------------------------------------|
+| TA7222 8.U9 DSW1(8) DSW2(8) |
+|VOL M6295 1.000MHz |
+| |------------| |
+| 7.U12 | 68000 | |
+| uPC3403 |------------| |
+|J 640kHz ES-8712 |
+|A M6585 EPM7032 6B.U18 5B.U19 |
+|M MM1035 |
+|M 26.666MHz 16MHz 62256 62256 |
+|A |
+| |--------| 1.U29 |
+| 62256 |Imagetek| |
+| 62256 |14220 | 2.U31 |
+| | | |
+| |--------| 3.U28 |
+| |
+| 6264 4.U30 |
+|--------------------------------------------|
+Notes:
+ 68000 - clock 16.000MHz
+ ES-8712 - ES-8712 Single Channel ADPCM Samples Player. Clock ?? seems to be 16kHz?
+ This chip is branded 'EXCELLENT', may be (or not??) manufactured by Ensonic (SDIP48)
+ M6295 - clock 1.000MHz. Sample rate = 1000000/132
+ M6585 - Oki M6585 ADPCM Voice Synthesizer IC (DIP18). Clock 640kHz.
+ Sample rate = 16kHz (selection - pin 1 LOW, pin 2 HIGH = 16kHz)
+ This is a version-up to the previous M5205 with some additional
+ capabilies and improvements.
+ MM1035 - Mitsumi Monolithic IC MM1035 System Reset and Watchdog Timer (DIP8)
+ uPC3403 - NEC uPC3403 High Performance Quad Operational Amplifier (DIP14)
+ 62256 - 32k x8 SRAM (DIP28)
+ 6264 - 8k x8 SRAM (DIP28)
+ TA7222 - Toshiba TA7222 5.8 Watt Audio Power Amplifier (SIP10)
+ EPM7032 - Altera EPM7032LC44-15T High Performance EEPROM-based Programmable Logic Device (PLCC44)
+ Custom - Imagetek 14220 Graphics Controller (QFP208)
+ VSync - 58.2328Hz
+ HSync - 15.32kHz
+ ROMs -
+ 6B & 5B are 27C040 EPROM (DIP32)
+ 8 is 4M MaskROM (DIP32)
+ All other ROMs are 16M MaskROM (DIP42)
+
+
+
+
+Varia Metal
+
+Notes:
+
+*****
+i should fully merge video with metro.c, it uses the same imagetek chip (although with 16x16 tiles)
+this should fix most of the remaining gfx glitches
+*****
+
+
+It has Sega and Taito logos in the roms ?!
+
+whats going on with the dipswitches
+
+ES8712 sound may not be quite right. Samples are currently looped, but
+whether they should and how, is unknown.
+
+cleanup
+
+
+*/
+
+#include "driver.h"
+#include "sound/okim6295.h"
+#include "sound/es8712.h"
+
+static UINT16 *vmetal_texttileram;
+static UINT16 *vmetal_mid1tileram;
+static UINT16 *vmetal_mid2tileram;
+static UINT16 *vmetal_tlookup;
+static UINT16 *vmetal_videoregs;
+
+
+static tilemap *vmetal_texttilemap;
+static tilemap *vmetal_mid1tilemap;
+static tilemap *vmetal_mid2tilemap;
+
+/* video/metro.c */
+extern UINT16 *metro_videoregs;
+void metro_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect);
+WRITE16_HANDLER( metro_paletteram_w );
+
+static READ16_HANDLER ( varia_crom_read )
+{
+ /* game reads the cgrom, result is 7772, verified to be correct on the real board */
+
+ UINT8 *cgrom = memory_region(REGION_GFX1);
+ UINT16 retdat;
+ offset = offset << 1;
+ offset |= (vmetal_videoregs[0x0ab/2]&0x7f) << 16;
+ retdat = ((cgrom[offset] <<8)| (cgrom[offset+1]))^0xffff; // invert because we inverted the data..
+// popmessage("varia romread offset %06x data %04x",offset, retdat);
+
+ return retdat;
+}
+
+
+static READ16_HANDLER ( varia_random )
+{
+// return mame_rand(Machine); // dips etc.. weird
+ return 0xffff;
+}
+
+
+
+static void get_vmetal_tlookup(UINT16 data, UINT16 *tileno, UINT16 *color)
+{
+ int idx = ((data & 0x7fff) >> 4)*2;
+ UINT32 lookup = (vmetal_tlookup[idx]<<16) | vmetal_tlookup[idx+1];
+ *tileno = (data & 0xf) | ((lookup>>2) & 0xfff0);
+ *color = (lookup>>20) & 0xff;
+}
+
+
+static WRITE16_HANDLER( vmetal_texttileram_w )
+{
+ COMBINE_DATA(&vmetal_texttileram[offset]);
+ tilemap_mark_tile_dirty(vmetal_texttilemap,offset);
+}
+
+static WRITE16_HANDLER( vmetal_mid1tileram_w )
+{
+ COMBINE_DATA(&vmetal_mid1tileram[offset]);
+ tilemap_mark_tile_dirty(vmetal_mid1tilemap,offset);
+}
+static WRITE16_HANDLER( vmetal_mid2tileram_w )
+{
+ COMBINE_DATA(&vmetal_mid2tileram[offset]);
+ tilemap_mark_tile_dirty(vmetal_mid2tilemap,offset);
+}
+
+
+static READ16_HANDLER ( varia_dips_bit8_r ) { return ((readinputport(3) & 0x80) << 0) | ((readinputport(2) & 0x80) >> 1); }
+static READ16_HANDLER ( varia_dips_bit7_r ) { return ((readinputport(3) & 0x40) << 1) | ((readinputport(2) & 0x40) >> 0); }
+static READ16_HANDLER ( varia_dips_bit6_r ) { return ((readinputport(3) & 0x20) << 2) | ((readinputport(2) & 0x20) << 1); }
+static READ16_HANDLER ( varia_dips_bit5_r ) { return ((readinputport(3) & 0x10) << 3) | ((readinputport(2) & 0x10) << 2); }
+static READ16_HANDLER ( varia_dips_bit4_r ) { return ((readinputport(3) & 0x08) << 4) | ((readinputport(2) & 0x08) << 3); }
+static READ16_HANDLER ( varia_dips_bit3_r ) { return ((readinputport(3) & 0x04) << 5) | ((readinputport(2) & 0x04) << 4); }
+static READ16_HANDLER ( varia_dips_bit2_r ) { return ((readinputport(3) & 0x02) << 6) | ((readinputport(2) & 0x02) << 5); }
+static READ16_HANDLER ( varia_dips_bit1_r ) { return ((readinputport(3) & 0x01) << 7) | ((readinputport(2) & 0x01) << 6); }
+
+static WRITE16_HANDLER( vmetal_control_w )
+{
+ /* Lower nibble is the coin control bits shown in
+ service mode, but in game mode they're different */
+ coin_counter_w(0,data & 0x04);
+ coin_counter_w(1,data & 0x08); /* 2nd coin schute activates coin 0 counter in game mode?? */
+// coin_lockout_w(0,data & 0x01); /* always on in game mode?? */
+ coin_lockout_w(1,data & 0x02); /* never activated in game mode?? */
+
+ if ((data & 0x40) == 0)
+ sndti_reset(SOUND_ES8712, 0);
+ else
+ ES8712_play(0);
+
+ if (data & 0x10)
+ ES8712_set_bank_base(0, 0x100000);
+ else
+ ES8712_set_bank_base(0, 0x000000);
+
+ if (data & 0xa0)
+ logerror("PC:%06x - Writing unknown bits %04x to $200000\n",activecpu_get_previouspc(),data);
+}
+
+static WRITE16_HANDLER( vmetal_es8712_w )
+{
+ /* Many samples in the ADPCM ROM are actually not used.
+
+ Snd Offset Writes Sample Range
+ 0000 0004 0002 0006 000a 0008 000c
+ -- ---------------------------------- -------------
+ 00 006e 0001 00ab 003c 0002 003a 003a 01ab6e-023a3c
+ 01 003d 0002 003a 001d 0002 007e 007e 023a3d-027e1d
+ 02 00e2 0003 0005 002e 0003 00f3 00f3 0305e2-03f32e
+ 03 000a 0005 001e 00f6 0005 00ec 00ec 051e0a-05ecf6
+ 04 00f7 0005 00ec 008d 0006 0060 0060 05ecf7-06608d
+ 05 0016 0008 002e 0014 0009 0019 0019 082e16-091914
+ 06 0015 0009 0019 0094 000b 0015 0015 091915-0b1594
+ 07 0010 000d 0012 00bf 000d 0035 0035 0d1210-0d35bf
+ 08 00ce 000e 002f 0074 000f 0032 0032 0e2fce-0f3274
+ 09 0000 0000 0000 003a 0000 007d 007d 000000-007d3a
+ 0a 0077 0000 00fa 008d 0001 00b6 00b6 00fa77-01b68d
+ 0b 008e 0001 00b6 00b3 0002 0021 0021 01b68e-0221b3
+ 0c 0062 0002 00f7 0038 0003 00de 00de 02f762-03de38
+ 0d 00b9 0005 00ab 00ef 0006 0016 0016 05abb9-0616ef
+ 0e 00dd 0007 0058 00db 0008 001a 001a 0758dd-081adb
+ 0f 00dc 0008 001a 002e 0008 008a 008a 081adc-088a2e
+ 10 00db 0009 00d7 00ff 000a 0046 0046 09d7db-0a46ff
+ 11 0077 000c 0003 006d 000c 0080 0080 0c0377-0c806d
+ 12 006e 000c 0080 006c 000d 0002 0002 0c806e-0d026c
+ 13 006d 000d 0002 002b 000d 0041 0041 0d026d-0d412b
+ 14 002c 000d 0041 002a 000d 00be 00be 0d412c-0dbe2a
+ 15 002b 000d 00be 0029 000e 0083 0083 0dbe2b-0e8329
+ 16 002a 000e 0083 00ee 000f 0069 0069 0e832a-0f69ee
+ */
+
+ ES8712_data_0_lsb_w(offset, data, mem_mask);
+ logerror("PC:%06x - Writing %04x to ES8712 offset %02x\n",activecpu_get_previouspc(),data,offset);
+}
+
+
+static ADDRESS_MAP_START( varia_program_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x0fffff) AM_ROM
+ AM_RANGE(0x100000, 0x11ffff) AM_READWRITE(MRA16_RAM, vmetal_texttileram_w) AM_BASE(&vmetal_texttileram)
+ AM_RANGE(0x120000, 0x13ffff) AM_READWRITE(MRA16_RAM, vmetal_mid1tileram_w) AM_BASE(&vmetal_mid1tileram)
+ AM_RANGE(0x140000, 0x15ffff) AM_READWRITE(MRA16_RAM, vmetal_mid2tileram_w) AM_BASE(&vmetal_mid2tileram)
+
+ AM_RANGE(0x160000, 0x16ffff) AM_READ(varia_crom_read) // cgrom read window ..
+
+ AM_RANGE(0x170000, 0x173fff) AM_READWRITE(MRA16_RAM,metro_paletteram_w) AM_BASE(&paletteram16 ) // Palette
+ AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ AM_RANGE(0x175000, 0x177fff) AM_RAM
+ AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE(&vmetal_tlookup)
+ AM_RANGE(0x178800, 0x1796ff) AM_RAM AM_BASE(&vmetal_videoregs)
+ AM_RANGE(0x179700, 0x179713) AM_WRITE(MWA16_RAM) AM_BASE(&metro_videoregs ) // Video Registers
+
+ AM_RANGE(0x200000, 0x200001) AM_READWRITE(input_port_0_word_r, vmetal_control_w)
+ AM_RANGE(0x200002, 0x200003) AM_READ(input_port_1_word_r )
+
+ /* i have no idea whats meant to be going on here .. it seems to read one bit of the dips from some of them, protection ??? */
+ AM_RANGE(0x30fffe, 0x30ffff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x317ffe, 0x317fff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x31bffe, 0x31bfff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x31dffe, 0x31dfff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x31effe, 0x31efff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x31f7fe, 0x31f7ff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x31fbfe, 0x31fbff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x31fdfe, 0x31fdff) AM_READ(varia_random ) // nothing?
+ AM_RANGE(0x31fefe, 0x31feff) AM_READ(varia_dips_bit8_r ) // 0x40 = dip1-8 , 0x80 = dip2-8
+ AM_RANGE(0x31ff7e, 0x31ff7f) AM_READ(varia_dips_bit7_r ) // 0x40 = dip1-7 , 0x80 = dip2-7
+ AM_RANGE(0x31ffbe, 0x31ffbf) AM_READ(varia_dips_bit6_r ) // 0x40 = dip1-6 , 0x80 = dip2-6
+ AM_RANGE(0x31ffde, 0x31ffdf) AM_READ(varia_dips_bit5_r ) // 0x40 = dip1-5 , 0x80 = dip2-5
+ AM_RANGE(0x31ffee, 0x31ffef) AM_READ(varia_dips_bit4_r ) // 0x40 = dip1-4 , 0x80 = dip2-4
+ AM_RANGE(0x31fff6, 0x31fff7) AM_READ(varia_dips_bit3_r ) // 0x40 = dip1-3 , 0x80 = dip2-3
+ AM_RANGE(0x31fffa, 0x31fffb) AM_READ(varia_dips_bit2_r ) // 0x40 = dip1-2 , 0x80 = dip2-2
+ AM_RANGE(0x31fffc, 0x31fffd) AM_READ(varia_dips_bit1_r ) // 0x40 = dip1-1 , 0x80 = dip2-1
+ AM_RANGE(0x31fffe, 0x31ffff) AM_READ(varia_random ) // nothing?
+
+ AM_RANGE(0x400000, 0x400001) AM_READWRITE(OKIM6295_status_0_lsb_r, OKIM6295_data_0_lsb_w )
+ AM_RANGE(0x400002, 0x400003) AM_WRITE(OKIM6295_data_0_lsb_w ) // Volume/channel info
+ AM_RANGE(0x500000, 0x50000d) AM_WRITE(vmetal_es8712_w)
+
+ AM_RANGE(0xff0000, 0xffffff) AM_RAM
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( varia )
+ PORT_START /* IN0 */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START /* IN1 */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_TILT )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SERVICE2 ) // 'Test'
+ PORT_BIT( 0xffe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) // unused?
+
+ PORT_START /* Dips 1 */
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x0005, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0003, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START /* Dips 2 */
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ))
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x000c, 0x000c, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x0008, "0" )
+ PORT_DIPSETTING( 0x0004, "1" )
+ PORT_DIPSETTING( 0x000c, "2" )
+ PORT_DIPSETTING( 0x0000, "3" )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_SERVICE( 0x0080, IP_ACTIVE_LOW )
+INPUT_PORTS_END
+
+
+
+static const gfx_layout char16x16layout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 4,
+ { 0,1,2,3 },
+ { 4, 0, 12, 8, 20, 16, 28, 24, 36, 32, 44, 40, 52, 48, 60, 56 },
+ { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
+ 16*64
+};
+
+static const gfx_layout char8x8layout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 4,
+ { 0,1,2,3 },
+ { 4, 0, 12, 8, 20, 16, 28, 24 },
+ { 0*32,1*32,2*32,3*32,4*32,5*32,6*32,7*32 },
+ 8*32
+};
+
+static GFXDECODE_START( vmetal )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, char16x16layout, 0x1000, 512 ) /* bg tiles */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, char8x8layout, 0x1000, 512 ) /* bg tiles */
+GFXDECODE_END
+
+
+static TILE_GET_INFO( get_vmetal_texttilemap_tile_info )
+{
+ UINT32 tile;
+ UINT16 color, data = vmetal_texttileram[tile_index];
+ int idx = ((data & 0x7fff) >> 4)*2;
+ UINT32 lookup = (vmetal_tlookup[idx]<<16) | vmetal_tlookup[idx+1];
+ tile = (data & 0xf) | (lookup & 0x7fff0);
+ color = ((lookup>>20) & 0x1f)+0xe0;
+ if (data & 0x8000) tile = 0;
+ SET_TILE_INFO(1, tile, color^0xf, TILE_FLIPYX(0x0));
+}
+
+
+static TILE_GET_INFO( get_vmetal_mid1tilemap_tile_info )
+{
+ UINT16 tile, color, data = vmetal_mid1tileram[tile_index];
+ get_vmetal_tlookup(data, &tile, &color);
+ if (data & 0x8000) tile = 0;
+ SET_TILE_INFO(0, tile, color^0xf, TILE_FLIPYX(0x0));
+}
+static TILE_GET_INFO( get_vmetal_mid2tilemap_tile_info )
+{
+ UINT16 tile, color, data = vmetal_mid2tileram[tile_index];
+ get_vmetal_tlookup(data, &tile, &color);
+ if (data & 0x8000) tile = 0;
+ SET_TILE_INFO(0, tile, color^0xf, TILE_FLIPYX(0x0));
+}
+
+static VIDEO_START(varia)
+{
+ vmetal_texttilemap = tilemap_create(get_vmetal_texttilemap_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8, 256,256);
+ vmetal_mid1tilemap = tilemap_create(get_vmetal_mid1tilemap_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16, 256,256);
+ vmetal_mid2tilemap = tilemap_create(get_vmetal_mid2tilemap_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16,16, 256,256);
+ tilemap_set_transparent_pen(vmetal_texttilemap,0);
+ tilemap_set_transparent_pen(vmetal_mid1tilemap,0);
+ tilemap_set_transparent_pen(vmetal_mid2tilemap,0);
+}
+
+static VIDEO_UPDATE(varia)
+{
+ fillbitmap(bitmap, get_black_pen(machine), cliprect);
+ fillbitmap(priority_bitmap,0,cliprect);
+
+ tilemap_set_scrollx(vmetal_mid2tilemap,0, vmetal_videoregs[0x06a/2]-64 /*+ vmetal_videoregs[0x066/2]*/);
+ tilemap_set_scrollx(vmetal_mid1tilemap,0, vmetal_videoregs[0x07a/2]-64 /*+ vmetal_videoregs[0x076/2]*/);
+ tilemap_set_scrollx(vmetal_texttilemap,0, -64 /*+ vmetal_videoregs[0x076/2]*/);
+
+ tilemap_set_scrolly(vmetal_mid2tilemap,0, -64 );
+ tilemap_set_scrolly(vmetal_mid1tilemap,0, -64 );
+ tilemap_set_scrolly(vmetal_texttilemap,0, -64 );
+
+ tilemap_draw(bitmap,cliprect,vmetal_mid1tilemap,0,0);
+ tilemap_draw(bitmap,cliprect,vmetal_mid2tilemap,0,0);
+ metro_draw_sprites(machine, bitmap,cliprect);
+ tilemap_draw(bitmap,cliprect,vmetal_texttilemap,0,0);
+ return 0;
+}
+
+static MACHINE_DRIVER_START( varia )
+ MDRV_CPU_ADD(M68000, 16000000)
+ MDRV_CPU_PROGRAM_MAP(varia_program_map, 0)
+ MDRV_CPU_VBLANK_INT(irq1_line_hold,1) // also level 3
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(2048, 2048)
+ MDRV_SCREEN_VISIBLE_AREA(0+64, 319+64, 0+64, 223+64)
+ MDRV_GFXDECODE(vmetal)
+ MDRV_PALETTE_LENGTH(0x4000)
+
+ MDRV_VIDEO_START(varia)
+ MDRV_VIDEO_UPDATE(varia)
+
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(OKIM6295, 1320000)
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high) // clock frequency & pin 7 not verified
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.75)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.75)
+
+ MDRV_SOUND_ADD(ES8712, 12000)
+ MDRV_SOUND_CONFIG(es8712_interface_region_2)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.50)
+MACHINE_DRIVER_END
+
+
+ROM_START( vmetal )
+ ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "5b.u19", 0x00001, 0x80000, CRC(4933ac6c) SHA1(1a3303e32fcb08854d4d6e13f36ca99d92aed4cc) )
+ ROM_LOAD16_BYTE( "6b.u18", 0x00000, 0x80000, CRC(4eb939d5) SHA1(741ab05043fc3bd886162d878630e45da9359718) )
+
+ ROM_REGION( 0x800000, REGION_GFX1, ROMREGION_INVERT )
+ ROMX_LOAD( "1.u29", 0x000004, 0x200000, CRC(b470c168) SHA1(c30462dc134da1e71a94b36ef96ecd65c325b07e) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "2.u31", 0x000000, 0x200000, CRC(b36f8d60) SHA1(1676859d0fee4eb9897ce1601a2c9fd9a6dc4a43) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "3.u28", 0x000006, 0x200000, CRC(00fca765) SHA1(ca9010bd7f59367e483868018db9a9abf871386e) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "4.u30", 0x000002, 0x200000, CRC(5a25a49c) SHA1(c30781202ec882e1ec6adfb560b0a1075b3cce55) , ROM_GROUPWORD | ROM_SKIP(6))
+
+ ROM_REGION( 0x080000, REGION_SOUND1, 0 ) /* OKI6295 Samples */
+ /* Second half is junk */
+ ROM_LOAD( "8.u9", 0x00000, 0x80000, CRC(c14c001c) SHA1(bad96b5cd40d1c34ef8b702262168ecab8192fb6) )
+
+ ROM_REGION( 0x200000, REGION_SOUND2, 0 ) /* Samples */
+ ROM_LOAD( "7.u12", 0x00000, 0x200000, CRC(a88c52f1) SHA1(d74a5a11f84ba6b1042b33a2c156a1071b6fbfe1) )
+ROM_END
+
+ROM_START( vmetaln )
+ ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "vm5.bin", 0x00001, 0x80000, CRC(43ef844e) SHA1(c673f34fcc9e406282c9008795b52d01a240099a) )
+ ROM_LOAD16_BYTE( "vm6.bin", 0x00000, 0x80000, CRC(cb292ab1) SHA1(41fdfe67e6cb848542fd5aa0dfde3b1936bb3a28) )
+
+ ROM_REGION( 0x800000, REGION_GFX1, ROMREGION_INVERT )
+ ROMX_LOAD( "1.u29", 0x000004, 0x200000, CRC(b470c168) SHA1(c30462dc134da1e71a94b36ef96ecd65c325b07e) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "2.u31", 0x000000, 0x200000, CRC(b36f8d60) SHA1(1676859d0fee4eb9897ce1601a2c9fd9a6dc4a43) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "3.u28", 0x000006, 0x200000, CRC(00fca765) SHA1(ca9010bd7f59367e483868018db9a9abf871386e) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "4.u30", 0x000002, 0x200000, CRC(5a25a49c) SHA1(c30781202ec882e1ec6adfb560b0a1075b3cce55) , ROM_GROUPWORD | ROM_SKIP(6))
+
+ ROM_REGION( 0x080000, REGION_SOUND1, 0 ) /* OKI6295 Samples */
+ /* Second half is junk */
+ ROM_LOAD( "8.u9", 0x00000, 0x80000, CRC(c14c001c) SHA1(bad96b5cd40d1c34ef8b702262168ecab8192fb6) )
+
+ ROM_REGION( 0x200000, REGION_SOUND2, 0 ) /* Samples */
+ ROM_LOAD( "7.u12", 0x00000, 0x200000, CRC(a88c52f1) SHA1(d74a5a11f84ba6b1042b33a2c156a1071b6fbfe1) )
+ROM_END
+
+GAME( 1995, vmetal, 0, varia, varia, 0, ROT270, "Excellent Systems", "Varia Metal", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS )
+GAME( 1995, vmetaln, vmetal, varia, varia, 0, ROT270, "[Excellent Systems] New Ways Trading Co.", "Varia Metal (New Ways Trading Co.)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS )