summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Andrew Gardner <andrew-gardner@users.noreply.github.com>2009-01-21 06:28:44 +0000
committer Andrew Gardner <andrew-gardner@users.noreply.github.com>2009-01-21 06:28:44 +0000
commit8b2e89df457e8fc1911a82cbb5c5c73e5bf41028 (patch)
tree15e7b2f27c5b1549fde49f66a36d8d5c3196f858
parent517c33a847e0a5902dec82126b216ac1385eb70a (diff)
Virtual Combat and Shadow Fighters update. [Phil Bennett]
* Fixed framebuffer handling & screen parameters. * Added sound. * Corrected RAM sizes to match what is present on the PCBs. * Hooked up NVRAM. (Thanks Phil!)
-rw-r--r--src/mame/drivers/vcombat.c297
-rw-r--r--src/mame/mamedriv.c2
2 files changed, 195 insertions, 104 deletions
diff --git a/src/mame/drivers/vcombat.c b/src/mame/drivers/vcombat.c
index 64e6ec57519..1887305493f 100644
--- a/src/mame/drivers/vcombat.c
+++ b/src/mame/drivers/vcombat.c
@@ -1,7 +1,7 @@
/*
Virtual Combat hardware games.
-Driver by Jason Eckhardt and Andrew Gardner.
+Driver by Jason Eckhardt, Andrew Gardner and Phil Bennett.
----
@@ -11,7 +11,7 @@ Kyle Hodgetts.
Virtual Combat (c) VR8 Inc. 1993
http://arcade.sonzogni.com/VRCombat/
-Shadow Fighters (German) (c) Sega? 1989?
+Shadow Fighters (German) (c) Dutech 1993
----
@@ -66,12 +66,6 @@ TODO : This is a partially working driver. Most of the memory maps for
- Most of the memory maps and input ports are complete now.
For "main", the only I/O locations that seem to be left
mysterious are:
- 0x600010,
- 0x60000C: Only written; maybe mc6845? Often accessed
- together, and 16 consecutive words of data are
- written to 0x60000C, making me think it might be
- 6845-related. May or may not be important for
- reasonable emulation.
0x60001C: Only read; might be a latch of some sort. It is
read each time M0's interrupt service routine syncs
with the i860's to have them update the frame buffer.
@@ -82,86 +76,73 @@ TODO : This is a partially working driver. Most of the memory maps for
0x600018: ? No info yet.
0x704000: (VC only) Likely analog axis for VR headset
0x703000: (VC only) Likely analog axis for VR headset
- 0x702000: (Shadow only). I think this is another IN port. It
- is always read at the same time as the other two
- ports.
-
- - Assuming a single framebuffer, as I think we are at the moment,
- how are all the CPUs writes to the framebuffer prioritized,
- if at all? The zero values written by the 68k side erase
- the i860-generated FB data (i.e., zero maps to black in the
- pallette). On the other hand, treating the zero values as
- transparent doesn't quite look right either. Could just the
- i860s each have their own framebuffers? After
- all, since each eye of the binocular sees a slightly different
- picture, the i860's might just maintain their own. Then maybe
- the 68k shares with each of the two, since I think it just
- generates a single picture (not sure about that either).
+
----------------------------------------------
*/
-#include <stdio.h>
#include "driver.h"
+#include "rendlay.h"
#include "cpu/m68000/m68000.h"
#include "cpu/i860/i860.h"
#include "video/generic.h"
#include "video/tlc34076.h"
+#include "video/mc6845.h"
+#include "sound/dac.h"
+
+
+static UINT16* m68k_framebuffer[2];
+static UINT16* i860_framebuffer[2][2];
+static UINT16* framebuffer_ctrl;
-static UINT16* framebuffer_main;
-static UINT16* framebuffer_secondary;
static UINT16* vid_0_shared_RAM;
static UINT16* vid_1_shared_RAM;
+static int crtc_select;
+
static VIDEO_UPDATE( vcombat )
{
- int x, y;
- int count = 0;
- const rgb_t *pens = tlc34076_get_pens();
+ int y;
+ const rgb_t *const pens = tlc34076_get_pens();
+ const device_config *aux = device_list_find_by_tag(screen->machine->config->devicelist, VIDEO_SCREEN, "aux");
+
+ UINT16 *m68k_buf = m68k_framebuffer[(*framebuffer_ctrl & 0x20) ? 1 : 0];
+ UINT16 *i860_buf = i860_framebuffer[(screen == aux) ? 1 : 0][0];
/* TODO: It looks like the leftmost chunk of the ground should really be on the right side? */
/* But the i860 draws the background correctly, so it may be an original game issue. */
/* There's also some garbage in the upper-left corner. Might be related to this 'wraparound'. */
/* Or maybe it's related to the 68k's alpha? It might come from the 68k side of the house. */
- /* Main eye */
- for(y = 0; y < 256; y++)
+ for (y = cliprect->min_y; y <= cliprect->max_y; ++y)
{
- for(x = 384; x < 640; x++)
- {
- UINT32 color;
- if (x % 2) color = (framebuffer_main[count] & 0xff00) >> 8;
- else color = framebuffer_main[count] & 0x00ff;
+ int x;
+ int src_addr = 256/2 * y;
+ const UINT16 *m68k_src = &m68k_buf[src_addr];
+ const UINT16 *i860_src = &i860_buf[src_addr];
+ UINT32 *dst = BITMAP_ADDR32(bitmap, y, cliprect->min_x);
- /* Vcombat's screen renders 'flopped' - very likely because VR headset displays may reflect off mirrors.
- Shadfgtr isn't flopped, so it's not a constant feature of the hardware. */
- if(x < video_screen_get_visible_area(screen)->max_x && y < video_screen_get_visible_area(screen)->max_y)
- *BITMAP_ADDR32(bitmap, y, x) = pens[color];
-
- if (x % 2) count++;
- }
- }
-
- /* Early out for shadow fighters */
- if (!framebuffer_secondary)
- return 0;
-
- /* Secondary eye */
- count = 0;
- for(y = 0; y < 256; y++)
- {
- for(x = 0; x < 256; x++)
+ for (x = cliprect->min_x; x <= cliprect->max_x; x += 2)
{
- UINT32 color;
- if (x % 2) color = (framebuffer_secondary[count] & 0xff00) >> 8;
- else color = framebuffer_secondary[count] & 0x00ff;
-
- /* Vcombat's screen renders 'flopped' - very likely because VR headset displays may reflect off mirrors.
- Shadfgtr isn't flopped, so it's not a constant feature of the hardware. */
- if(x < video_screen_get_visible_area(screen)->max_x && y < video_screen_get_visible_area(screen)->max_y)
- *BITMAP_ADDR32(bitmap, y, x) = pens[color];
-
- if (x % 2) count++;
+ int i;
+ UINT16 m68k_pix = *m68k_src++;
+ UINT16 i860_pix = *i860_src++;
+
+ /* Draw two pixels */
+ for (i = 0; i < 2; ++i)
+ {
+ /* Vcombat's screen renders 'flopped' - very likely because VR headset displays may reflect off mirrors.
+ Shadfgtr isn't flopped, so it's not a constant feature of the hardware. */
+
+ /* Combine the two layers */
+ if ((m68k_pix & 0xff) == 0)
+ *dst++ = pens[i860_pix & 0xff];
+ else
+ *dst++ = pens[m68k_pix & 0xff];
+
+ m68k_pix >>= 8;
+ i860_pix >>= 8;
+ }
}
}
@@ -169,13 +150,27 @@ static VIDEO_UPDATE( vcombat )
}
-/* Maybe there's a blend chip between the 68k and the framebuffer? */
static WRITE16_HANDLER( main_video_write )
{
- /* Doesn't seem to make sense for shadow fighters. Maybe some of that factory rework disables this? */
- /* Doesn't always seem to work for vcombat either. More testing needed. */
- if (data != 0x00000000) {
- framebuffer_main[offset] = data;
+ int fb = (*framebuffer_ctrl & 0x20) ? 0 : 1;
+ UINT16 old_data = m68k_framebuffer[fb][offset];
+
+ /* Transparency mode? */
+ if (*framebuffer_ctrl & 0x40)
+ {
+ if (data == 0x0000)
+ return;
+
+ if ((data & 0x00ff) == 0)
+ data = (data & 0xff00) | (old_data & 0x00ff);
+ if ((data & 0xff00) == 0)
+ data = (data & 0x00ff) | (old_data & 0xff00);
+
+ COMBINE_DATA(&m68k_framebuffer[fb][offset]);
+ }
+ else
+ {
+ COMBINE_DATA(&m68k_framebuffer[fb][offset]);
}
}
@@ -189,6 +184,11 @@ static READ16_HANDLER( control_2_r )
return (input_port_read(space->machine, "IN1") << 8);
}
+static READ16_HANDLER( control_3_r )
+{
+ return (input_port_read(space->machine, "IN2") << 8);
+}
+
static void wiggle_i860_common(int n, UINT16 data, const device_config *device)
{
int bus_hold = (data & 0x03) == 0x03;
@@ -245,7 +245,7 @@ static WRITE64_HANDLER( v0_fb_w )
{
/* The frame buffer seems to sit on a 32-bit data bus, while the
i860 uses a 64-bit data bus. Adjust accordingly. */
- char *p = (char *)framebuffer_main;
+ char *p = (char *)(i860_framebuffer[0][0]);
int m = mem_mask;
int o = (offset << 2);
if (m & 0xff000000) {
@@ -268,7 +268,7 @@ static WRITE64_HANDLER( v1_fb_w )
{
/* The frame buffer seems to sit on a 32-bit data bus, while the
i860 uses a 64-bit data bus. Adjust accordingly. */
- char *p = (char *)framebuffer_secondary;
+ char *p = (char *)(i860_framebuffer[1][0]);
int m = mem_mask;
int o = (offset << 2);
if (m & 0xff000000) {
@@ -285,11 +285,31 @@ static WRITE64_HANDLER( v1_fb_w )
}
}
+static WRITE16_HANDLER( crtc_w )
+{
+ const device_config *crtc = device_list_find_by_tag(space->machine->config->devicelist, MC6845, "crtc");
+
+ if (crtc == NULL)
+ return;
+
+ if (crtc_select == 0)
+ mc6845_address_w(crtc, 0, data >> 8);
+ else
+ mc6845_register_w(crtc, 0, data >> 8);
+
+ crtc_select ^= 1;
+}
+
+static WRITE16_HANDLER( dac_w )
+{
+ INT16 newval = ((INT16)data - 0x6000) << 2;
+ dac_signed_data_16_w(0, newval + 0x8000);
+}
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM
- AM_RANGE(0x200000, 0x2fffff) AM_RAM
- AM_RANGE(0x300000, 0x30ffff) AM_RAM_WRITE(main_video_write)
+ AM_RANGE(0x200000, 0x20ffff) AM_RAM
+ AM_RANGE(0x300000, 0x30ffff) AM_WRITE(main_video_write)
AM_RANGE(0x400000, 0x43ffff) AM_RAM AM_BASE(&vid_0_shared_RAM) AM_SHARE(2) /* First i860 shared RAM */
AM_RANGE(0x440000, 0x440003) AM_RAM AM_SHARE(6) /* M0->P0 i860 #1 com 1 */
@@ -304,10 +324,13 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x600000, 0x600001) AM_READ(control_1_r) /* IN0 port */
AM_RANGE(0x600004, 0x600005) AM_RAM AM_SHARE(5) /* M0<-M1 */
AM_RANGE(0x600008, 0x600009) AM_READ(control_2_r) /* IN1 port */
- /* AM_RANGE(0x60000c, 0x60000d) See notes at top of driver. */
- /* AM_RANGE(0x600010, 0x600011) See notes at top of driver. */
- AM_RANGE(0x700000, 0x7007ff) AM_RAM /* TODO: Non-volatile RAM */
+ AM_RANGE(0x60001c, 0x60001d) AM_NOP
+
+ AM_RANGE(0x60000c, 0x60000d) AM_WRITE(crtc_w)
+ AM_RANGE(0x600010, 0x600011) AM_RAM AM_BASE(&framebuffer_ctrl)
+ AM_RANGE(0x700000, 0x7007ff) AM_RAM AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
AM_RANGE(0x701000, 0x701001) AM_READ(main_irqiack_r)
+ AM_RANGE(0x702000, 0x702001) AM_READ(control_3_r)
AM_RANGE(0x705000, 0x705001) AM_RAM AM_SHARE(4) /* M1->M0 */
//AM_RANGE(0x703000, 0x703001) /* Headset rotation axis? */
@@ -342,10 +365,12 @@ ADDRESS_MAP_END
/* Sound CPU */
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
- AM_RANGE(0x081000, 0x081fff) AM_RAM
+ AM_RANGE(0x080000, 0x08ffff) AM_RAM
+ AM_RANGE(0x0c0000, 0x0c0001) AM_WRITE(dac_w)
AM_RANGE(0x140000, 0x140001) AM_READ(sound_resetmain_r) /* Ping M0's reset line */
AM_RANGE(0x180000, 0x180001) AM_RAM AM_SHARE(4) /* M1<-M0 */
- AM_RANGE(0x1C0000, 0x1C0001) AM_RAM AM_SHARE(5) /* M1->M0 */
+ AM_RANGE(0x1c0000, 0x1c0001) AM_RAM AM_SHARE(5) /* M1->M0 */
+ AM_RANGE(0x200000, 0x37ffff) AM_ROM AM_REGION("samples", 0)
ADDRESS_MAP_END
@@ -356,6 +381,8 @@ static MACHINE_RESET( vcombat )
i860_set_pin(cputag_get_cpu(machine, "vid_0")->token, DEC_PIN_BUS_HOLD, 1);
i860_set_pin(cputag_get_cpu(machine, "vid_1")->token, DEC_PIN_BUS_HOLD, 1);
+
+ crtc_select = 0;
}
static MACHINE_RESET( shadfgtr )
@@ -364,6 +391,8 @@ static MACHINE_RESET( shadfgtr )
tlc34076_reset(6);
i860_set_pin(cputag_get_cpu(machine, "vid_0")->token, DEC_PIN_BUS_HOLD, 1);
+
+ crtc_select = 0;
}
@@ -396,9 +425,17 @@ static DRIVER_INIT( vcombat )
memory_set_direct_update_handler(cputag_get_address_space(machine, "vid_0", ADDRESS_SPACE_PROGRAM), vid_0_direct_handler);
memory_set_direct_update_handler(cputag_get_address_space(machine, "vid_1", ADDRESS_SPACE_PROGRAM), vid_1_direct_handler);
- /* Allocate the two framebuffers */
- framebuffer_main = auto_malloc(0x10000 * sizeof(UINT16));
- framebuffer_secondary = auto_malloc(0x10000 * sizeof(UINT16));
+ /* Allocate the 68000 framebuffers */
+ m68k_framebuffer[0] = auto_malloc(0x8000 * sizeof(UINT16));
+ m68k_framebuffer[1] = auto_malloc(0x8000 * sizeof(UINT16));
+
+ /* First i860 */
+ i860_framebuffer[0][0] = auto_malloc(0x8000 * sizeof(UINT16));
+ i860_framebuffer[0][1] = auto_malloc(0x8000 * sizeof(UINT16));
+
+ /* Second i860 */
+ i860_framebuffer[1][0] = auto_malloc(0x8000 * sizeof(UINT16));
+ i860_framebuffer[1][1] = auto_malloc(0x8000 * sizeof(UINT16));
/* pc==4016 : jump 4038 ... There's something strange about how it waits at 402e (interrupts all masked out)
I think what is happening here is that M0 snags the first time
@@ -418,9 +455,15 @@ static DRIVER_INIT( vcombat )
static DRIVER_INIT( shadfgtr )
{
- /* Allocate just one framebuffer */
- framebuffer_main = auto_malloc(0x10000 * sizeof(UINT16));
- framebuffer_secondary = NULL;
+ /* Allocate th 68000 frame buffers */
+ m68k_framebuffer[0] = auto_malloc(0x8000 * sizeof(UINT16));
+ m68k_framebuffer[1] = auto_malloc(0x8000 * sizeof(UINT16));
+
+ /* Only one i860 */
+ i860_framebuffer[0][0] = auto_malloc(0x8000 * sizeof(UINT16));
+ i860_framebuffer[0][1] = auto_malloc(0x8000 * sizeof(UINT16));
+ i860_framebuffer[1][0] = NULL;
+ i860_framebuffer[1][1] = NULL;
/* The i860 executes out of RAM */
memory_set_direct_update_handler(cputag_get_address_space(machine, "vid_0", ADDRESS_SPACE_PROGRAM), vid_0_direct_handler);
@@ -451,15 +494,16 @@ INPUT_PORTS_END
static INPUT_PORTS_START( shadfgtr )
+ /* Check me */
PORT_START("IN0")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY /* ? */
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY /* ? */
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
@@ -470,9 +514,39 @@ static INPUT_PORTS_START( shadfgtr )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ /* Check me */
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 )
INPUT_PORTS_END
+static MC6845_ON_HSYNC_CHANGED(sound_update)
+{
+ /* Seems reasonable */
+ cpu_set_input_line(cputag_get_cpu(device->machine, "sound"), M68K_IRQ_1, hsync ? ASSERT_LINE : CLEAR_LINE);
+}
+
+static const mc6845_interface mc6845_intf =
+{
+ "main", /* screen we are acting on */
+ 16, /* number of pixels per video memory address */
+ NULL, /* before pixel update callback */
+ NULL, /* row update callback */
+ NULL, /* after pixel update callback */
+ NULL, /* callback for display state changes */
+ sound_update, /* HSYNC callback */
+ NULL /* VSYNC callback */
+};
+
+
static MACHINE_DRIVER_START( vcombat )
MDRV_CPU_ADD("main", M68000, XTAL_12MHz)
MDRV_CPU_PROGRAM_MAP(main_map,0)
@@ -489,7 +563,9 @@ static MACHINE_DRIVER_START( vcombat )
/* Sound CPU */
MDRV_CPU_ADD("sound", M68000, XTAL_12MHz)
MDRV_CPU_PROGRAM_MAP(sound_map,0)
+ MDRV_CPU_PERIODIC_INT(irq1_line_hold, 15000) /* Remove this if MC6845 is enabled */
+ MDRV_NVRAM_HANDLER(generic_0fill)
MDRV_MACHINE_RESET(vcombat)
/* Temporary hack for experimenting with timing. */
@@ -498,14 +574,24 @@ static MACHINE_DRIVER_START( vcombat )
MDRV_QUANTUM_PERFECT_CPU("main")
#endif
+ /* Disabled for now as it can't handle multiple screens */
+// MDRV_MC6845_ADD("crtc", MC6845, 6000000 / 16, mc6845_intf)
+ MDRV_DEFAULT_LAYOUT(layout_dualhsxs)
+
MDRV_SCREEN_ADD("main", RASTER)
- MDRV_SCREEN_REFRESH_RATE(50)
- MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
- MDRV_SCREEN_SIZE(640, 480)
- MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
+ MDRV_SCREEN_RAW_PARAMS(XTAL_12MHz / 2, 400, 0, 256, 291, 0, 208)
+
+ MDRV_SCREEN_ADD("aux", RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MDRV_SCREEN_RAW_PARAMS(XTAL_12MHz / 2, 400, 0, 256, 291, 0, 208)
MDRV_VIDEO_UPDATE(vcombat)
+
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD("dac", DAC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_DRIVER_END
@@ -522,16 +608,21 @@ static MACHINE_DRIVER_START( shadfgtr )
MDRV_CPU_ADD("sound", M68000, XTAL_12MHz)
MDRV_CPU_PROGRAM_MAP(sound_map,0)
+ MDRV_NVRAM_HANDLER(generic_0fill)
MDRV_MACHINE_RESET(shadfgtr)
+ MDRV_MC6845_ADD("crtc", MC6845, XTAL_20MHz / 4 / 16, mc6845_intf)
+
MDRV_SCREEN_ADD("main", RASTER)
- MDRV_SCREEN_REFRESH_RATE(60)
- MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
- MDRV_SCREEN_SIZE(640, 480)
- MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
+ MDRV_SCREEN_RAW_PARAMS(XTAL_20MHz / 4, 320, 0, 256, 277, 0, 224)
MDRV_VIDEO_UPDATE(vcombat)
+
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD("dac", DAC, 0)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_DRIVER_END
@@ -577,7 +668,7 @@ ROM_START( shadfgtr )
ROM_LOAD16_BYTE( "shadfgtr.b42", 0x00000, 0x20000, CRC(f8605dcd) SHA1(1b29f47856ccc757bc96674682ae48f87e6b0e54) )
ROM_LOAD16_BYTE( "shadfgtr.b33", 0x00001, 0x20000, CRC(291d59ac) SHA1(cc4904c2ac8ef6a12033c10893246a438ac44014) )
- ROM_REGION( 0x100000, "samples", 0 )
+ ROM_REGION( 0x180000, "samples", 0 )
ROM_LOAD16_BYTE( "shadfgtr.b41", 0x00000, 0x80000, CRC(9e4b4df3) SHA1(8101197275e9f728acdeef85737eecbdec132b27) )
ROM_LOAD16_BYTE( "shadfgtr.b37", 0x00001, 0x80000, CRC(98446ba2) SHA1(1c8cc0d9c5de54d9e53699a5ab281579d15edc96) )
@@ -596,5 +687,5 @@ ROM_START( shadfgtr )
ROM_END
/* YEAR NAME PARENT MACHINE INPUT INIT MONITOR COMPANY FULLNAME FLAGS */
-GAME( 1993, vcombat, 0, vcombat, vcombat, vcombat, ORIENTATION_FLIP_X, "VR8 Inc.", "Virtual Combat", GAME_NOT_WORKING | GAME_NO_SOUND )
-GAME( 1989, shadfgtr, 0, shadfgtr, shadfgtr, shadfgtr, ROT0, "DUTECH Inc.", "Shadow Fighters", GAME_NOT_WORKING | GAME_NO_SOUND )
+GAME( 1993, vcombat, 0, vcombat, vcombat, vcombat, ORIENTATION_FLIP_X, "VR8 Inc.", "Virtual Combat", GAME_NOT_WORKING )
+GAME( 1993, shadfgtr, 0, shadfgtr, shadfgtr, shadfgtr, ROT0, "DUTECH Inc.", "Shadow Fighters", GAME_NOT_WORKING )
diff --git a/src/mame/mamedriv.c b/src/mame/mamedriv.c
index 51056313d66..74e147bfab3 100644
--- a/src/mame/mamedriv.c
+++ b/src/mame/mamedriv.c
@@ -8438,7 +8438,7 @@ Other Sun games
DRIVER( blazlaz ) /* (c) 1989 Hudson Soft */
DRIVER( paranoia ) /* (c) 1990 Naxat Soft */
DRIVER( vcombat ) /* (c) 1993 VR8 Inc. */
- DRIVER( shadfgtr ) /* (c) 1989 DUTECH Inc. */
+ DRIVER( shadfgtr ) /* (c) 1993 DUTECH Inc. */
DRIVER( blackt96 ) /* (c) 1996 D.G.R.M. of Korea */
DRIVER( magictg ) /* (c) 199? Acclaim */
DRIVER( magictga ) /* (c) 199? Acclaim */