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:
Aaron Giles 2008-10-13 04:32:54 +00:00
parent 5120786ad1
commit da7c14f848

View File

@ -19,6 +19,7 @@
#include "driver.h" #include "driver.h"
#include "cpu/cubeqcpu/cubeqcpu.h" #include "cpu/cubeqcpu/cubeqcpu.h"
#include "sound/dac.h"
#include "deprecat.h" #include "deprecat.h"
#include "sound/custom.h" #include "sound/custom.h"
#include "streams.h" #include "streams.h"
@ -35,8 +36,6 @@
#define CUBEQST_HBLANK 320 #define CUBEQST_HBLANK 320
#define CUBEQST_VCOUNT 280 #define CUBEQST_VCOUNT 280
#define ALPHA_PEN 8192
enum cpu_indices enum cpu_indices
{ {
MAIN_CPU = 0, MAIN_CPU = 0,
@ -52,15 +51,16 @@ enum cpu_indices
* *
*************************************/ *************************************/
static UINT16 *palette_ram;
static UINT8 *depth_buffer; static UINT8 *depth_buffer;
static int video_field; static int video_field;
static UINT8 io_latch; static UINT8 io_latch;
static UINT8 reset_latch; static UINT8 reset_latch;
static int disk_on;
static const device_config *laserdisc; 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 }; 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 ) static VIDEO_START( cubeqst )
{ {
video_field = 0; video_field = 0;
@ -88,20 +81,25 @@ static PALETTE_INIT( cubeqst )
{ {
int i; 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; a = (i >> 3) & 1;
g = (i >> 3) & 7; b = (i >> 0) & 7;
r = (i >> 6) & 7; g = (i >> 4) & 7;
y = ((i >> 9) & 0xf) * 2; 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 */ static WRITE16_HANDLER( palette_w )
palette_set_color(machine, 8192, MAKE_ARGB(0,0,0,0)); {
video_screen_update_now(machine->primary_screen);
COMBINE_DATA(&paletteram16[offset]);
} }
/* TODO: This is a simplified version of what actually happens */ /* TODO: This is a simplified version of what actually happens */
@ -109,18 +107,13 @@ static VIDEO_UPDATE( cubeqst )
{ {
int y; int y;
int palentry = palette_ram[255];
/* /*
* Clear the display with palette RAM entry 0xff * Clear the display with palette RAM entry 0xff
* This will be either transparent or an actual colour * This will be either transparent or an actual colour
*/ */
/* Bit 3 selects LD/#GRAPHICS */ /* Bit 3 selects LD/#GRAPHICS */
if ((palentry & (1 << 3)) && disk_on) fillbitmap(bitmap, colormap[255], cliprect);
fillbitmap(bitmap, ALPHA_PEN, cliprect);
else
fillbitmap(bitmap, screen->machine->pens[get_output_color(palentry)], cliprect);
cpuintrf_push_context(LINE_CPU); cpuintrf_push_context(LINE_CPU);
@ -130,7 +123,8 @@ static VIDEO_UPDATE( cubeqst )
int i; int i;
int num_entries = get_ptr_ram_val(y); int num_entries = get_ptr_ram_val(y);
UINT32 *stk_ram = get_stack_ram(); 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 */ /* Zap the depth buffer */
memset(depth_buffer, 0xff, 512); memset(depth_buffer, 0xff, 512);
@ -145,9 +139,6 @@ static VIDEO_UPDATE( cubeqst )
int entry1 = stk_ram[(y << 7) | ((i + 0) & 0x7f)]; int entry1 = stk_ram[(y << 7) | ((i + 0) & 0x7f)];
int entry2 = stk_ram[(y << 7) | ((i + 1) & 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 */ /* Determine which entry is the start point and which is the stop */
if ( entry1 & (1 << 19) ) if ( entry1 & (1 << 19) )
{ {
@ -170,17 +161,8 @@ static VIDEO_UPDATE( cubeqst )
// Shouldn't happen... // 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 */ /* Draw the span, testing for depth */
pen = colormap[paletteram16[color]];
for (x = h1; x <= h2; ++x) for (x = h1; x <= h2; ++x)
{ {
if (!(depth_buffer[x] < depth)) if (!(depth_buffer[x] < depth))
@ -255,7 +237,7 @@ static WRITE16_HANDLER( ldaud_w )
*/ */
static WRITE16_HANDLER( control_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(0x038002, 0x038003) AM_READWRITE(chop_r, ldaud_w)
AM_RANGE(0x038008, 0x038009) AM_READWRITE(line_r, reset_w) AM_RANGE(0x038008, 0x038009) AM_READWRITE(line_r, reset_w)
AM_RANGE(0x03800e, 0x03800f) AM_READWRITE(laserdisc_r, laserdisc_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(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(0x03e000, 0x03efff) AM_RAM AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
AM_RANGE(0x03f000, 0x03ffff) AM_RAM AM_MIRROR(0xfc0000) AM_RANGE(0x03f000, 0x03ffff) AM_RAM
ADDRESS_MAP_END 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 sound CPU outputs to a 12-bit 7521 DAC
* The DAC output is multiplexed between * The DAC output is multiplexed between
* 16 channels (8 per side). * 16 channels (8 per side).
*/ */
static struct
{
INT16 sample[2][8];
} cquest_sound;
/* Called by the sound CPU emulation */ /* Called by the sound CPU emulation */
static void sound_dac_w(UINT16 data) static void sound_dac_w(UINT16 data)
{ {
int side = data & 1; dac_signed_data_16_w(data & 15, (data & 0xfff0) ^ 0x8000);
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;
}
} }
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 = static const cubeqst_snd_config snd_config =
{ {
sound_dac_w, sound_dac_w,
@ -554,14 +485,13 @@ static MACHINE_DRIVER_START( cubeqst )
MDRV_MACHINE_RESET(cubeqst) MDRV_MACHINE_RESET(cubeqst)
MDRV_NVRAM_HANDLER(generic_0fill) 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_VIDEO_START(cubeqst)
MDRV_PALETTE_LENGTH(8192 + 1)
MDRV_PALETTE_INIT(cubeqst) MDRV_PALETTE_INIT(cubeqst)
MDRV_LASERDISC_ADD("laserdisc", SIMUTREK_SPECIAL, "main", "ldsound") 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_CLIP(0, 320-1, 0, 256-8)
MDRV_LASERDISC_OVERLAY_POSITION(0.002, -0.018) MDRV_LASERDISC_OVERLAY_POSITION(0.002, -0.018)
MDRV_LASERDISC_OVERLAY_SCALE(1.0, 1.030) 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(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0) MDRV_SOUND_ROUTE(1, "right", 1.0)
MDRV_SOUND_ADD("cubeqst", CUSTOM, 1) MDRV_SOUND_ADD("rdac0", DAC, 0)
MDRV_SOUND_CONFIG(custom_interface) MDRV_SOUND_ROUTE(0, "right", 0.125)
MDRV_SOUND_ROUTE(1, "left", 1.0) MDRV_SOUND_ADD("ldac0", DAC, 0)
MDRV_SOUND_ROUTE(0, "right", 1.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 MACHINE_DRIVER_END