mirror of
https://github.com/holub/mame
synced 2025-05-22 13:48:55 +03:00
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!)
This commit is contained in:
parent
517c33a847
commit
8b2e89df45
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Virtual Combat hardware games.
|
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
|
Virtual Combat (c) VR8 Inc. 1993
|
||||||
http://arcade.sonzogni.com/VRCombat/
|
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.
|
- Most of the memory maps and input ports are complete now.
|
||||||
For "main", the only I/O locations that seem to be left
|
For "main", the only I/O locations that seem to be left
|
||||||
mysterious are:
|
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
|
0x60001C: Only read; might be a latch of some sort. It is
|
||||||
read each time M0's interrupt service routine syncs
|
read each time M0's interrupt service routine syncs
|
||||||
with the i860's to have them update the frame buffer.
|
with the i860's to have them update the frame buffer.
|
||||||
@ -82,100 +76,101 @@ TODO : This is a partially working driver. Most of the memory maps for
|
|||||||
0x600018: ? No info yet.
|
0x600018: ? No info yet.
|
||||||
0x704000: (VC only) Likely analog axis for VR headset
|
0x704000: (VC only) Likely analog axis for VR headset
|
||||||
0x703000: (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 "driver.h"
|
||||||
|
#include "rendlay.h"
|
||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "cpu/i860/i860.h"
|
#include "cpu/i860/i860.h"
|
||||||
#include "video/generic.h"
|
#include "video/generic.h"
|
||||||
#include "video/tlc34076.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_0_shared_RAM;
|
||||||
static UINT16* vid_1_shared_RAM;
|
static UINT16* vid_1_shared_RAM;
|
||||||
|
|
||||||
|
static int crtc_select;
|
||||||
|
|
||||||
|
|
||||||
static VIDEO_UPDATE( vcombat )
|
static VIDEO_UPDATE( vcombat )
|
||||||
{
|
{
|
||||||
int x, y;
|
int y;
|
||||||
int count = 0;
|
const rgb_t *const pens = tlc34076_get_pens();
|
||||||
const rgb_t *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? */
|
/* 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. */
|
/* 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'. */
|
/* 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. */
|
/* Or maybe it's related to the 68k's alpha? It might come from the 68k side of the house. */
|
||||||
|
|
||||||
/* Main eye */
|
for (y = cliprect->min_y; y <= cliprect->max_y; ++y)
|
||||||
for(y = 0; y < 256; y++)
|
|
||||||
{
|
{
|
||||||
for(x = 384; x < 640; x++)
|
int x;
|
||||||
{
|
int src_addr = 256/2 * y;
|
||||||
UINT32 color;
|
const UINT16 *m68k_src = &m68k_buf[src_addr];
|
||||||
if (x % 2) color = (framebuffer_main[count] & 0xff00) >> 8;
|
const UINT16 *i860_src = &i860_buf[src_addr];
|
||||||
else color = framebuffer_main[count] & 0x00ff;
|
UINT32 *dst = BITMAP_ADDR32(bitmap, y, cliprect->min_x);
|
||||||
|
|
||||||
|
for (x = cliprect->min_x; x <= cliprect->max_x; x += 2)
|
||||||
|
{
|
||||||
|
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.
|
/* 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. */
|
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++;
|
/* 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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++)
|
|
||||||
{
|
|
||||||
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++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Maybe there's a blend chip between the 68k and the framebuffer? */
|
|
||||||
static WRITE16_HANDLER( main_video_write )
|
static WRITE16_HANDLER( main_video_write )
|
||||||
{
|
{
|
||||||
/* Doesn't seem to make sense for shadow fighters. Maybe some of that factory rework disables this? */
|
int fb = (*framebuffer_ctrl & 0x20) ? 0 : 1;
|
||||||
/* Doesn't always seem to work for vcombat either. More testing needed. */
|
UINT16 old_data = m68k_framebuffer[fb][offset];
|
||||||
if (data != 0x00000000) {
|
|
||||||
framebuffer_main[offset] = data;
|
/* 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);
|
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)
|
static void wiggle_i860_common(int n, UINT16 data, const device_config *device)
|
||||||
{
|
{
|
||||||
int bus_hold = (data & 0x03) == 0x03;
|
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
|
/* The frame buffer seems to sit on a 32-bit data bus, while the
|
||||||
i860 uses a 64-bit data bus. Adjust accordingly. */
|
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 m = mem_mask;
|
||||||
int o = (offset << 2);
|
int o = (offset << 2);
|
||||||
if (m & 0xff000000) {
|
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
|
/* The frame buffer seems to sit on a 32-bit data bus, while the
|
||||||
i860 uses a 64-bit data bus. Adjust accordingly. */
|
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 m = mem_mask;
|
||||||
int o = (offset << 2);
|
int o = (offset << 2);
|
||||||
if (m & 0xff000000) {
|
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 )
|
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM
|
AM_RANGE(0x000000, 0x0fffff) AM_ROM
|
||||||
AM_RANGE(0x200000, 0x2fffff) AM_RAM
|
AM_RANGE(0x200000, 0x20ffff) AM_RAM
|
||||||
AM_RANGE(0x300000, 0x30ffff) AM_RAM_WRITE(main_video_write)
|
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(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 */
|
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(0x600000, 0x600001) AM_READ(control_1_r) /* IN0 port */
|
||||||
AM_RANGE(0x600004, 0x600005) AM_RAM AM_SHARE(5) /* M0<-M1 */
|
AM_RANGE(0x600004, 0x600005) AM_RAM AM_SHARE(5) /* M0<-M1 */
|
||||||
AM_RANGE(0x600008, 0x600009) AM_READ(control_2_r) /* IN1 port */
|
AM_RANGE(0x600008, 0x600009) AM_READ(control_2_r) /* IN1 port */
|
||||||
/* AM_RANGE(0x60000c, 0x60000d) See notes at top of driver. */
|
AM_RANGE(0x60001c, 0x60001d) AM_NOP
|
||||||
/* AM_RANGE(0x600010, 0x600011) See notes at top of driver. */
|
|
||||||
AM_RANGE(0x700000, 0x7007ff) AM_RAM /* TODO: Non-volatile RAM */
|
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(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(0x705000, 0x705001) AM_RAM AM_SHARE(4) /* M1->M0 */
|
||||||
|
|
||||||
//AM_RANGE(0x703000, 0x703001) /* Headset rotation axis? */
|
//AM_RANGE(0x703000, 0x703001) /* Headset rotation axis? */
|
||||||
@ -342,10 +365,12 @@ ADDRESS_MAP_END
|
|||||||
/* Sound CPU */
|
/* Sound CPU */
|
||||||
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 16 )
|
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||||
AM_RANGE(0x000000, 0x03ffff) AM_ROM
|
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(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(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
|
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_0")->token, DEC_PIN_BUS_HOLD, 1);
|
||||||
i860_set_pin(cputag_get_cpu(machine, "vid_1")->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 )
|
static MACHINE_RESET( shadfgtr )
|
||||||
@ -364,6 +391,8 @@ static MACHINE_RESET( shadfgtr )
|
|||||||
tlc34076_reset(6);
|
tlc34076_reset(6);
|
||||||
|
|
||||||
i860_set_pin(cputag_get_cpu(machine, "vid_0")->token, DEC_PIN_BUS_HOLD, 1);
|
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_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);
|
memory_set_direct_update_handler(cputag_get_address_space(machine, "vid_1", ADDRESS_SPACE_PROGRAM), vid_1_direct_handler);
|
||||||
|
|
||||||
/* Allocate the two framebuffers */
|
/* Allocate the 68000 framebuffers */
|
||||||
framebuffer_main = auto_malloc(0x10000 * sizeof(UINT16));
|
m68k_framebuffer[0] = auto_malloc(0x8000 * sizeof(UINT16));
|
||||||
framebuffer_secondary = auto_malloc(0x10000 * 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)
|
/* 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
|
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 )
|
static DRIVER_INIT( shadfgtr )
|
||||||
{
|
{
|
||||||
/* Allocate just one framebuffer */
|
/* Allocate th 68000 frame buffers */
|
||||||
framebuffer_main = auto_malloc(0x10000 * sizeof(UINT16));
|
m68k_framebuffer[0] = auto_malloc(0x8000 * sizeof(UINT16));
|
||||||
framebuffer_secondary = NULL;
|
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 */
|
/* 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);
|
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 )
|
static INPUT_PORTS_START( shadfgtr )
|
||||||
|
/* Check me */
|
||||||
PORT_START("IN0")
|
PORT_START("IN0")
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
|
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY /* ? */
|
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY /* ? */
|
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
|
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
|
||||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
|
||||||
|
|
||||||
PORT_START("IN1")
|
PORT_START("IN1")
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
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( 0x20, IP_ACTIVE_LOW, IPT_SERVICE )
|
||||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||||
PORT_BIT( 0x80, 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
|
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 )
|
static MACHINE_DRIVER_START( vcombat )
|
||||||
MDRV_CPU_ADD("main", M68000, XTAL_12MHz)
|
MDRV_CPU_ADD("main", M68000, XTAL_12MHz)
|
||||||
MDRV_CPU_PROGRAM_MAP(main_map,0)
|
MDRV_CPU_PROGRAM_MAP(main_map,0)
|
||||||
@ -489,7 +563,9 @@ static MACHINE_DRIVER_START( vcombat )
|
|||||||
/* Sound CPU */
|
/* Sound CPU */
|
||||||
MDRV_CPU_ADD("sound", M68000, XTAL_12MHz)
|
MDRV_CPU_ADD("sound", M68000, XTAL_12MHz)
|
||||||
MDRV_CPU_PROGRAM_MAP(sound_map,0)
|
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)
|
MDRV_MACHINE_RESET(vcombat)
|
||||||
|
|
||||||
/* Temporary hack for experimenting with timing. */
|
/* Temporary hack for experimenting with timing. */
|
||||||
@ -498,14 +574,24 @@ static MACHINE_DRIVER_START( vcombat )
|
|||||||
MDRV_QUANTUM_PERFECT_CPU("main")
|
MDRV_QUANTUM_PERFECT_CPU("main")
|
||||||
#endif
|
#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_ADD("main", RASTER)
|
||||||
MDRV_SCREEN_REFRESH_RATE(50)
|
|
||||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
|
||||||
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
|
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
|
||||||
MDRV_SCREEN_SIZE(640, 480)
|
MDRV_SCREEN_RAW_PARAMS(XTAL_12MHz / 2, 400, 0, 256, 291, 0, 208)
|
||||||
MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
|
|
||||||
|
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_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
|
MACHINE_DRIVER_END
|
||||||
|
|
||||||
|
|
||||||
@ -522,16 +608,21 @@ static MACHINE_DRIVER_START( shadfgtr )
|
|||||||
MDRV_CPU_ADD("sound", M68000, XTAL_12MHz)
|
MDRV_CPU_ADD("sound", M68000, XTAL_12MHz)
|
||||||
MDRV_CPU_PROGRAM_MAP(sound_map,0)
|
MDRV_CPU_PROGRAM_MAP(sound_map,0)
|
||||||
|
|
||||||
|
MDRV_NVRAM_HANDLER(generic_0fill)
|
||||||
MDRV_MACHINE_RESET(shadfgtr)
|
MDRV_MACHINE_RESET(shadfgtr)
|
||||||
|
|
||||||
|
MDRV_MC6845_ADD("crtc", MC6845, XTAL_20MHz / 4 / 16, mc6845_intf)
|
||||||
|
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
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_FORMAT(BITMAP_FORMAT_RGB32)
|
||||||
MDRV_SCREEN_SIZE(640, 480)
|
MDRV_SCREEN_RAW_PARAMS(XTAL_20MHz / 4, 320, 0, 256, 277, 0, 224)
|
||||||
MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
|
|
||||||
|
|
||||||
MDRV_VIDEO_UPDATE(vcombat)
|
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
|
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.b42", 0x00000, 0x20000, CRC(f8605dcd) SHA1(1b29f47856ccc757bc96674682ae48f87e6b0e54) )
|
||||||
ROM_LOAD16_BYTE( "shadfgtr.b33", 0x00001, 0x20000, CRC(291d59ac) SHA1(cc4904c2ac8ef6a12033c10893246a438ac44014) )
|
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.b41", 0x00000, 0x80000, CRC(9e4b4df3) SHA1(8101197275e9f728acdeef85737eecbdec132b27) )
|
||||||
ROM_LOAD16_BYTE( "shadfgtr.b37", 0x00001, 0x80000, CRC(98446ba2) SHA1(1c8cc0d9c5de54d9e53699a5ab281579d15edc96) )
|
ROM_LOAD16_BYTE( "shadfgtr.b37", 0x00001, 0x80000, CRC(98446ba2) SHA1(1c8cc0d9c5de54d9e53699a5ab281579d15edc96) )
|
||||||
|
|
||||||
@ -596,5 +687,5 @@ ROM_START( shadfgtr )
|
|||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
/* YEAR NAME PARENT MACHINE INPUT INIT MONITOR COMPANY FULLNAME FLAGS */
|
/* 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( 1993, vcombat, 0, vcombat, vcombat, vcombat, ORIENTATION_FLIP_X, "VR8 Inc.", "Virtual Combat", GAME_NOT_WORKING )
|
||||||
GAME( 1989, shadfgtr, 0, shadfgtr, shadfgtr, shadfgtr, ROT0, "DUTECH Inc.", "Shadow Fighters", GAME_NOT_WORKING | GAME_NO_SOUND )
|
GAME( 1993, shadfgtr, 0, shadfgtr, shadfgtr, shadfgtr, ROT0, "DUTECH Inc.", "Shadow Fighters", GAME_NOT_WORKING )
|
||||||
|
@ -8438,7 +8438,7 @@ Other Sun games
|
|||||||
DRIVER( blazlaz ) /* (c) 1989 Hudson Soft */
|
DRIVER( blazlaz ) /* (c) 1989 Hudson Soft */
|
||||||
DRIVER( paranoia ) /* (c) 1990 Naxat Soft */
|
DRIVER( paranoia ) /* (c) 1990 Naxat Soft */
|
||||||
DRIVER( vcombat ) /* (c) 1993 VR8 Inc. */
|
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( blackt96 ) /* (c) 1996 D.G.R.M. of Korea */
|
||||||
DRIVER( magictg ) /* (c) 199? Acclaim */
|
DRIVER( magictg ) /* (c) 199? Acclaim */
|
||||||
DRIVER( magictga ) /* (c) 199? Acclaim */
|
DRIVER( magictga ) /* (c) 199? Acclaim */
|
||||||
|
Loading…
Reference in New Issue
Block a user