mirror of
https://github.com/holub/mame
synced 2025-05-23 14:19:01 +03:00
cubeqst changes:
* removed custom sound in favor of individual DACs * simplified palette management logic * hooked up the "disc on" signal
This commit is contained in:
parent
5120786ad1
commit
da7c14f848
@ -19,6 +19,7 @@
|
||||
|
||||
#include "driver.h"
|
||||
#include "cpu/cubeqcpu/cubeqcpu.h"
|
||||
#include "sound/dac.h"
|
||||
#include "deprecat.h"
|
||||
#include "sound/custom.h"
|
||||
#include "streams.h"
|
||||
@ -35,8 +36,6 @@
|
||||
#define CUBEQST_HBLANK 320
|
||||
#define CUBEQST_VCOUNT 280
|
||||
|
||||
#define ALPHA_PEN 8192
|
||||
|
||||
enum cpu_indices
|
||||
{
|
||||
MAIN_CPU = 0,
|
||||
@ -52,15 +51,16 @@ enum cpu_indices
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static UINT16 *palette_ram;
|
||||
static UINT8 *depth_buffer;
|
||||
static int video_field;
|
||||
|
||||
static UINT8 io_latch;
|
||||
static UINT8 reset_latch;
|
||||
|
||||
static int disk_on;
|
||||
static const device_config *laserdisc;
|
||||
static rgb_t *colormap;
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
@ -70,13 +70,6 @@ static const device_config *laserdisc;
|
||||
|
||||
static const rectangle overlay_clip = { 0, 320-1, 0, 256-8 };
|
||||
|
||||
/* Get a pen number from a palette RAM entry */
|
||||
INLINE int get_output_color(UINT16 a)
|
||||
{
|
||||
return ((a & 0xf000) >> 3) | ((a & 0x700) >> 2) | ((a & 0x70) >> 1) | (a & 0x7);
|
||||
}
|
||||
|
||||
|
||||
static VIDEO_START( cubeqst )
|
||||
{
|
||||
video_field = 0;
|
||||
@ -88,20 +81,25 @@ static PALETTE_INIT( cubeqst )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8192; ++i)
|
||||
colormap = auto_malloc(65536 * sizeof(colormap[0]));
|
||||
for (i = 0; i < 65536; ++i)
|
||||
{
|
||||
UINT8 r, g, b, y;
|
||||
UINT8 a, r, g, b, y;
|
||||
|
||||
b = i & 7;
|
||||
g = (i >> 3) & 7;
|
||||
r = (i >> 6) & 7;
|
||||
y = ((i >> 9) & 0xf) * 2;
|
||||
a = (i >> 3) & 1;
|
||||
b = (i >> 0) & 7;
|
||||
g = (i >> 4) & 7;
|
||||
r = (i >> 8) & 7;
|
||||
y = ((i >> 12) & 0xf) * 2;
|
||||
|
||||
palette_set_color_rgb(machine, i, y*r, y*g, y*b);
|
||||
colormap[i] = MAKE_ARGB(a ? 0 : 255, y*r, y*g, y*b);
|
||||
}
|
||||
}
|
||||
|
||||
/* use pen 8192 for transparent */
|
||||
palette_set_color(machine, 8192, MAKE_ARGB(0,0,0,0));
|
||||
static WRITE16_HANDLER( palette_w )
|
||||
{
|
||||
video_screen_update_now(machine->primary_screen);
|
||||
COMBINE_DATA(&paletteram16[offset]);
|
||||
}
|
||||
|
||||
/* TODO: This is a simplified version of what actually happens */
|
||||
@ -109,18 +107,13 @@ static VIDEO_UPDATE( cubeqst )
|
||||
{
|
||||
int y;
|
||||
|
||||
int palentry = palette_ram[255];
|
||||
|
||||
/*
|
||||
* Clear the display with palette RAM entry 0xff
|
||||
* This will be either transparent or an actual colour
|
||||
*/
|
||||
|
||||
/* Bit 3 selects LD/#GRAPHICS */
|
||||
if ((palentry & (1 << 3)) && disk_on)
|
||||
fillbitmap(bitmap, ALPHA_PEN, cliprect);
|
||||
else
|
||||
fillbitmap(bitmap, screen->machine->pens[get_output_color(palentry)], cliprect);
|
||||
fillbitmap(bitmap, colormap[255], cliprect);
|
||||
|
||||
cpuintrf_push_context(LINE_CPU);
|
||||
|
||||
@ -130,7 +123,8 @@ static VIDEO_UPDATE( cubeqst )
|
||||
int i;
|
||||
int num_entries = get_ptr_ram_val(y);
|
||||
UINT32 *stk_ram = get_stack_ram();
|
||||
UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0);
|
||||
UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0);
|
||||
UINT32 pen;
|
||||
|
||||
/* Zap the depth buffer */
|
||||
memset(depth_buffer, 0xff, 512);
|
||||
@ -145,9 +139,6 @@ static VIDEO_UPDATE( cubeqst )
|
||||
int entry1 = stk_ram[(y << 7) | ((i + 0) & 0x7f)];
|
||||
int entry2 = stk_ram[(y << 7) | ((i + 1) & 0x7f)];
|
||||
|
||||
UINT16 palram;
|
||||
UINT16 pen;
|
||||
|
||||
/* Determine which entry is the start point and which is the stop */
|
||||
if ( entry1 & (1 << 19) )
|
||||
{
|
||||
@ -170,17 +161,8 @@ static VIDEO_UPDATE( cubeqst )
|
||||
// Shouldn't happen...
|
||||
}
|
||||
|
||||
/* Get the 16-bit palette RAM entry */
|
||||
palram = palette_ram[color];
|
||||
|
||||
if (palram & (1 << 3))
|
||||
/* If transparent, draw using our special alpha pen */
|
||||
pen = ALPHA_PEN;
|
||||
else
|
||||
/* Otherwise map the entry to a MAME pen */
|
||||
pen = screen->machine->pens[get_output_color(palram)];
|
||||
|
||||
/* Draw the span, testing for depth */
|
||||
pen = colormap[paletteram16[color]];
|
||||
for (x = h1; x <= h2; ++x)
|
||||
{
|
||||
if (!(depth_buffer[x] < depth))
|
||||
@ -255,7 +237,7 @@ static WRITE16_HANDLER( ldaud_w )
|
||||
*/
|
||||
static WRITE16_HANDLER( control_w )
|
||||
{
|
||||
disk_on = data & 1;
|
||||
laserdisc_video_enable(laserdisc, data & 1);
|
||||
}
|
||||
|
||||
|
||||
@ -412,10 +394,10 @@ static ADDRESS_MAP_START( m68k_program_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||
AM_RANGE(0x038002, 0x038003) AM_READWRITE(chop_r, ldaud_w)
|
||||
AM_RANGE(0x038008, 0x038009) AM_READWRITE(line_r, reset_w)
|
||||
AM_RANGE(0x03800e, 0x03800f) AM_READWRITE(laserdisc_r, laserdisc_w)
|
||||
AM_RANGE(0x03c800, 0x03c9ff) AM_RAM AM_BASE(&palette_ram)
|
||||
AM_RANGE(0x03c800, 0x03c9ff) AM_RAM_WRITE(palette_w) AM_BASE(&paletteram16)
|
||||
AM_RANGE(0x03cc00, 0x03cc01) AM_WRITE(control_w)
|
||||
AM_RANGE(0x03e000, 0x03efff) AM_RAM AM_MIRROR(0xfc0000) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
|
||||
AM_RANGE(0x03f000, 0x03ffff) AM_RAM AM_MIRROR(0xfc0000)
|
||||
AM_RANGE(0x03e000, 0x03efff) AM_RAM AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
|
||||
AM_RANGE(0x03f000, 0x03ffff) AM_RAM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
@ -457,69 +439,18 @@ static MACHINE_RESET( cubeqst )
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static sound_stream *cquest_stream;
|
||||
|
||||
/*
|
||||
* The sound CPU outputs to a 12-bit 7521 DAC
|
||||
* The DAC output is multiplexed between
|
||||
* 16 channels (8 per side).
|
||||
*/
|
||||
|
||||
static struct
|
||||
{
|
||||
INT16 sample[2][8];
|
||||
} cquest_sound;
|
||||
|
||||
/* Called by the sound CPU emulation */
|
||||
static void sound_dac_w(UINT16 data)
|
||||
{
|
||||
int side = data & 1;
|
||||
int chan = (data >> 1) & 7;
|
||||
int value = ((data >> 4) & 0xfff);
|
||||
|
||||
/* Sign extend 12-bit to 16-bit */
|
||||
int finalvalue = (value & 0x7ff) - (value & 0x800);
|
||||
if (cquest_sound.sample[side][chan] != finalvalue)
|
||||
{
|
||||
stream_update(cquest_stream);
|
||||
cquest_sound.sample[side][chan] = finalvalue;
|
||||
}
|
||||
dac_signed_data_16_w(data & 15, (data & 0xfff0) ^ 0x8000);
|
||||
}
|
||||
|
||||
static void cquest_stream_update(void *param, stream_sample_t **inputs, stream_sample_t **buffer, int length)
|
||||
{
|
||||
int side;
|
||||
|
||||
/* Clear the buffers */
|
||||
memset(buffer[0], 0, length * sizeof(*buffer[0]));
|
||||
memset(buffer[1], 0, length * sizeof(*buffer[1]));
|
||||
|
||||
for (side = 0; side < 2; ++side)
|
||||
{
|
||||
int chan;
|
||||
for (chan = 0; chan < 8; ++chan)
|
||||
{
|
||||
int samp;
|
||||
for (samp = 0; samp < length; ++samp)
|
||||
buffer[side][samp] += (cquest_sound.sample[side][chan]) * 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void *cquest_sh_start(int clock, const custom_sound_interface *config)
|
||||
{
|
||||
/* Allocate the stream */
|
||||
cquest_stream = stream_create(0, 2, Machine->sample_rate, NULL, cquest_stream_update);
|
||||
|
||||
return auto_malloc(1);
|
||||
}
|
||||
|
||||
static const custom_sound_interface custom_interface =
|
||||
{
|
||||
cquest_sh_start
|
||||
};
|
||||
|
||||
|
||||
static const cubeqst_snd_config snd_config =
|
||||
{
|
||||
sound_dac_w,
|
||||
@ -554,14 +485,13 @@ static MACHINE_DRIVER_START( cubeqst )
|
||||
MDRV_MACHINE_RESET(cubeqst)
|
||||
MDRV_NVRAM_HANDLER(generic_0fill)
|
||||
|
||||
MDRV_LASERDISC_SCREEN_ADD_NTSC("main", BITMAP_FORMAT_INDEXED16)
|
||||
MDRV_LASERDISC_SCREEN_ADD_NTSC("main", BITMAP_FORMAT_RGB32)
|
||||
MDRV_VIDEO_START(cubeqst)
|
||||
|
||||
MDRV_PALETTE_LENGTH(8192 + 1)
|
||||
MDRV_PALETTE_INIT(cubeqst)
|
||||
|
||||
MDRV_LASERDISC_ADD("laserdisc", SIMUTREK_SPECIAL, "main", "ldsound")
|
||||
MDRV_LASERDISC_OVERLAY(cubeqst, CUBEQST_HBLANK, CUBEQST_VCOUNT, BITMAP_FORMAT_INDEXED16)
|
||||
MDRV_LASERDISC_OVERLAY(cubeqst, CUBEQST_HBLANK, CUBEQST_VCOUNT, BITMAP_FORMAT_RGB32)
|
||||
MDRV_LASERDISC_OVERLAY_CLIP(0, 320-1, 0, 256-8)
|
||||
MDRV_LASERDISC_OVERLAY_POSITION(0.002, -0.018)
|
||||
MDRV_LASERDISC_OVERLAY_SCALE(1.0, 1.030)
|
||||
@ -573,10 +503,38 @@ static MACHINE_DRIVER_START( cubeqst )
|
||||
MDRV_SOUND_ROUTE(0, "left", 1.0)
|
||||
MDRV_SOUND_ROUTE(1, "right", 1.0)
|
||||
|
||||
MDRV_SOUND_ADD("cubeqst", CUSTOM, 1)
|
||||
MDRV_SOUND_CONFIG(custom_interface)
|
||||
MDRV_SOUND_ROUTE(1, "left", 1.0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 1.0)
|
||||
MDRV_SOUND_ADD("rdac0", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac0", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MDRV_SOUND_ADD("rdac1", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac1", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MDRV_SOUND_ADD("rdac2", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac2", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MDRV_SOUND_ADD("rdac3", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac3", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MDRV_SOUND_ADD("rdac4", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac4", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MDRV_SOUND_ADD("rdac5", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac5", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MDRV_SOUND_ADD("rdac6", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac6", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MDRV_SOUND_ADD("rdac7", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 0.125)
|
||||
MDRV_SOUND_ADD("ldac7", DAC, 0)
|
||||
MDRV_SOUND_ROUTE(0, "left", 0.125)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user