indigo.cpp: Hooked up palette setup for LG1 graphics board. [Ryan Holtz]
This commit is contained in:
parent
349d0be4e9
commit
1e57f272ed
@ -31,10 +31,11 @@
|
|||||||
#include "machine/sgi.h"
|
#include "machine/sgi.h"
|
||||||
#include "machine/wd33c93.h"
|
#include "machine/wd33c93.h"
|
||||||
#include "machine/z80scc.h"
|
#include "machine/z80scc.h"
|
||||||
|
#include "emupal.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
#define ENABLE_ENTRY_GFX (0)
|
#define ENABLE_ENTRY_GFX (1)
|
||||||
|
|
||||||
#define LOG_UNKNOWN (1 << 0)
|
#define LOG_UNKNOWN (1 << 0)
|
||||||
#define LOG_INT (1 << 1)
|
#define LOG_INT (1 << 1)
|
||||||
@ -67,6 +68,7 @@ public:
|
|||||||
, m_pit(*this, "pit")
|
, m_pit(*this, "pit")
|
||||||
, m_rtc(*this, "rtc")
|
, m_rtc(*this, "rtc")
|
||||||
, m_dsp_ram(*this, "dspram")
|
, m_dsp_ram(*this, "dspram")
|
||||||
|
, m_palette(*this, "palette")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,6 +108,8 @@ protected:
|
|||||||
static void cdrom_config(device_t *device);
|
static void cdrom_config(device_t *device);
|
||||||
void indigo_map(address_map &map);
|
void indigo_map(address_map &map);
|
||||||
|
|
||||||
|
uint32_t screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
LOCAL0_FIFO_GIO0 = 0x01,
|
LOCAL0_FIFO_GIO0 = 0x01,
|
||||||
@ -125,6 +129,52 @@ protected:
|
|||||||
LOCAL1_RETRACE_GIO2 = 0x80
|
LOCAL1_RETRACE_GIO2 = 0x80
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
REX15_PAGE0_SET = 0x00000000,
|
||||||
|
REX15_PAGE0_GO = 0x00000800,
|
||||||
|
REX15_PAGE1_SET = 0x00004790,
|
||||||
|
REX15_PAGE1_GO = 0x00004f90,
|
||||||
|
|
||||||
|
REX15_P0REG_COMMAND = 0x00000000,
|
||||||
|
REX15_P0REG_XSTARTI = 0x0000000c,
|
||||||
|
REX15_P0REG_YSTARTI = 0x0000001c,
|
||||||
|
REX15_P0REG_XYMOVE = 0x00000034,
|
||||||
|
REX15_P0REG_COLORREDI = 0x00000038,
|
||||||
|
REX15_P0REG_COLORGREENI = 0x00000040,
|
||||||
|
REX15_P0REG_COLORBLUEI = 0x00000048,
|
||||||
|
REX15_P0REG_COLORBACK = 0x0000005c,
|
||||||
|
REX15_P0REG_ZPATTERN = 0x00000060,
|
||||||
|
REX15_P0REG_XENDI = 0x00000084,
|
||||||
|
REX15_P0REG_YENDI = 0x00000088,
|
||||||
|
|
||||||
|
REX15_P1REG_WCLOCKREV = 0x00000054,
|
||||||
|
REX15_P1REG_CFGDATA = 0x00000058,
|
||||||
|
REX15_P1REG_CFGSEL = 0x0000005c,
|
||||||
|
REX15_P1REG_VC1_ADDRDATA = 0x00000060,
|
||||||
|
REX15_P1REG_CFGMODE = 0x00000068,
|
||||||
|
REX15_P1REG_XYOFFSET = 0x0000006c,
|
||||||
|
|
||||||
|
REX15_OP_NOP = 0x00000000,
|
||||||
|
REX15_OP_DRAW = 0x00000001,
|
||||||
|
|
||||||
|
REX15_OP_FLAG_BLOCK = 0x00000008,
|
||||||
|
REX15_OP_FLAG_LENGTH32 = 0x00000010,
|
||||||
|
REX15_OP_FLAG_QUADMODE = 0x00000020,
|
||||||
|
REX15_OP_FLAG_XYCONTINUE = 0x00000080,
|
||||||
|
REX15_OP_FLAG_STOPONX = 0x00000100,
|
||||||
|
REX15_OP_FLAG_STOPONY = 0x00000200,
|
||||||
|
REX15_OP_FLAG_ENZPATTERN = 0x00000400,
|
||||||
|
REX15_OP_FLAG_LOGICSRC = 0x00080000,
|
||||||
|
REX15_OP_FLAG_ZOPAQUE = 0x00800000,
|
||||||
|
REX15_OP_FLAG_ZCONTINUE = 0x01000000,
|
||||||
|
|
||||||
|
REX15_WRITE_ADDR = 0x00,
|
||||||
|
REX15_PALETTE_RAM = 0x01,
|
||||||
|
REX15_PIXEL_READ_MASK = 0x02,
|
||||||
|
REX15_CONTROL = 0x06
|
||||||
|
};
|
||||||
|
|
||||||
struct hpc_t
|
struct hpc_t
|
||||||
{
|
{
|
||||||
uint8_t m_misc_status;
|
uint8_t m_misc_status;
|
||||||
@ -146,6 +196,18 @@ protected:
|
|||||||
bool m_scsi0_dma_end;
|
bool m_scsi0_dma_end;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct lg1_t
|
||||||
|
{
|
||||||
|
uint32_t m_config_sel;
|
||||||
|
uint32_t m_write_addr;
|
||||||
|
uint32_t m_control;
|
||||||
|
uint8_t m_palette_idx;
|
||||||
|
uint8_t m_palette_channel;
|
||||||
|
uint8_t m_palette_entry[3];
|
||||||
|
bool m_waiting_for_palette_addr;
|
||||||
|
uint8_t m_pix_read_mask[256];
|
||||||
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
HPC_DMACTRL_RESET = 0x01,
|
HPC_DMACTRL_RESET = 0x01,
|
||||||
@ -161,8 +223,10 @@ protected:
|
|||||||
required_device<pit8254_device> m_pit;
|
required_device<pit8254_device> m_pit;
|
||||||
required_device<dp8573_device> m_rtc;
|
required_device<dp8573_device> m_rtc;
|
||||||
required_shared_ptr<uint32_t> m_dsp_ram;
|
required_shared_ptr<uint32_t> m_dsp_ram;
|
||||||
|
required_device<palette_device> m_palette;
|
||||||
|
|
||||||
hpc_t m_hpc;
|
hpc_t m_hpc;
|
||||||
|
lg1_t m_lg1;
|
||||||
uint8_t m_duart_int_status;
|
uint8_t m_duart_int_status;
|
||||||
|
|
||||||
static char const *const RS232A_TAG;
|
static char const *const RS232A_TAG;
|
||||||
@ -233,12 +297,22 @@ void indigo_state::machine_start()
|
|||||||
save_item(NAME(m_hpc.m_scsi0_dma_active));
|
save_item(NAME(m_hpc.m_scsi0_dma_active));
|
||||||
save_item(NAME(m_hpc.m_scsi0_dma_end));
|
save_item(NAME(m_hpc.m_scsi0_dma_end));
|
||||||
|
|
||||||
|
save_item(NAME(m_lg1.m_config_sel));
|
||||||
|
save_item(NAME(m_lg1.m_write_addr));
|
||||||
|
save_item(NAME(m_lg1.m_control));
|
||||||
|
save_item(NAME(m_lg1.m_palette_idx));
|
||||||
|
save_item(NAME(m_lg1.m_palette_channel));
|
||||||
|
save_item(NAME(m_lg1.m_palette_entry));
|
||||||
|
save_item(NAME(m_lg1.m_waiting_for_palette_addr));
|
||||||
|
save_item(NAME(m_lg1.m_pix_read_mask));
|
||||||
|
|
||||||
save_item(NAME(m_duart_int_status));
|
save_item(NAME(m_duart_int_status));
|
||||||
}
|
}
|
||||||
|
|
||||||
void indigo_state::machine_reset()
|
void indigo_state::machine_reset()
|
||||||
{
|
{
|
||||||
memset(&m_hpc, 0, sizeof(hpc_t));
|
memset(&m_hpc, 0, sizeof(hpc_t));
|
||||||
|
memset(&m_lg1, 0, sizeof(lg1_t));
|
||||||
m_duart_int_status = 0;
|
m_duart_int_status = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -786,17 +860,101 @@ WRITE32_MEMBER(indigo_state::dsp_ram_w)
|
|||||||
READ32_MEMBER(indigo_state::entry_r)
|
READ32_MEMBER(indigo_state::entry_r)
|
||||||
{
|
{
|
||||||
uint32_t ret = 0;
|
uint32_t ret = 0;
|
||||||
#if ENABLE_ENTRY_GFX
|
switch (offset)
|
||||||
if (offset == 0x0014/4)
|
{
|
||||||
|
case 0x0014/4:
|
||||||
ret = 0x033c0000;
|
ret = 0x033c0000;
|
||||||
#endif
|
LOGMASKED(LOG_GFX, "%s: LG1 Read: Presence Detect(?) %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
|
||||||
LOGMASKED(LOG_GFX, "%s: Entry Graphics(?) Read: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
|
break;
|
||||||
|
default:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: Unknown LG1 Read: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
|
||||||
|
break;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE32_MEMBER(indigo_state::entry_w)
|
WRITE32_MEMBER(indigo_state::entry_w)
|
||||||
{
|
{
|
||||||
LOGMASKED(LOG_GFX, "%s: Entry Graphics(?) Write: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, data, mem_mask);
|
switch (offset)
|
||||||
|
{
|
||||||
|
case (REX15_PAGE1_SET+REX15_P1REG_CFGSEL)/4:
|
||||||
|
m_lg1.m_config_sel = data;
|
||||||
|
switch (data)
|
||||||
|
{
|
||||||
|
case REX15_WRITE_ADDR:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Write Addr)\n", machine().describe_context(), data);
|
||||||
|
break;
|
||||||
|
case REX15_PALETTE_RAM:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Palette RAM)\n", machine().describe_context(), data);
|
||||||
|
break;
|
||||||
|
case REX15_CONTROL:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Control)\n", machine().describe_context(), data);
|
||||||
|
break;
|
||||||
|
case REX15_PIXEL_READ_MASK:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Pixel Read Mask)\n", machine().describe_context(), data);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Unknown)\n", machine().describe_context(), data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (REX15_PAGE1_SET+REX15_P1REG_CFGDATA)/4:
|
||||||
|
switch (m_lg1.m_config_sel)
|
||||||
|
{
|
||||||
|
case REX15_WRITE_ADDR:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write: Setting WriteAddr to %08x\n", machine().describe_context(), data);
|
||||||
|
m_lg1.m_write_addr = data;
|
||||||
|
if (m_lg1.m_control == 0xf)
|
||||||
|
{
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 about to set palette entry %02x\n", machine().describe_context(), (uint8_t)data);
|
||||||
|
m_lg1.m_palette_idx = (uint8_t)data;
|
||||||
|
m_lg1.m_palette_channel = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case REX15_PALETTE_RAM:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write: Setting Palette RAM %02x entry %d to %02x\n", machine().describe_context(),
|
||||||
|
m_lg1.m_palette_idx, m_lg1.m_palette_channel, (uint8_t)data);
|
||||||
|
m_lg1.m_palette_entry[m_lg1.m_palette_channel++] = (uint8_t)data;
|
||||||
|
if (m_lg1.m_palette_channel == 3)
|
||||||
|
{
|
||||||
|
m_palette->set_pen_color(m_lg1.m_palette_idx, m_lg1.m_palette_entry[0], m_lg1.m_palette_entry[1], m_lg1.m_palette_entry[2]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case REX15_CONTROL:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write: Setting Control to %08x\n", machine().describe_context(), data);
|
||||||
|
m_lg1.m_control = data;
|
||||||
|
break;
|
||||||
|
case REX15_PIXEL_READ_MASK:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 ConfigSel Write = %08x (Pixel Read Mask, entry %02x)\n", machine().describe_context(), data, m_lg1.m_palette_idx);
|
||||||
|
m_lg1.m_pix_read_mask[m_lg1.m_palette_idx] = (uint8_t)data;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: LG1 Unknown ConfigData Write = %08x\n", machine().describe_context(), data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOGMASKED(LOG_GFX, "%s: Unknown LG1 Write: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, data, mem_mask);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t indigo_state::screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
|
{
|
||||||
|
const rgb_t *pens = m_palette->palette()->entry_list_raw();
|
||||||
|
|
||||||
|
for (int y = 0; y < 256; y++)
|
||||||
|
{
|
||||||
|
for (int suby = 0; suby < 3; suby++)
|
||||||
|
{
|
||||||
|
uint32_t *dst = &bitmap.pix32(y*3 + suby);
|
||||||
|
for (int x = 0; x < 1024; x++)
|
||||||
|
{
|
||||||
|
*dst++ = pens[y];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void indigo_state::indigo_map(address_map &map)
|
void indigo_state::indigo_map(address_map &map)
|
||||||
@ -837,6 +995,16 @@ void indigo_state::cdrom_config(device_t *device)
|
|||||||
|
|
||||||
void indigo_state::indigo_base(machine_config &config)
|
void indigo_state::indigo_base(machine_config &config)
|
||||||
{
|
{
|
||||||
|
/* video hardware */
|
||||||
|
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||||
|
screen.set_refresh_hz(60);
|
||||||
|
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
|
||||||
|
screen.set_size(1024, 768);
|
||||||
|
screen.set_visarea(0, 1024-1, 0, 768-1);
|
||||||
|
screen.set_screen_update(FUNC(indigo_state::screen_update));
|
||||||
|
|
||||||
|
PALETTE(config, m_palette, 256);
|
||||||
|
|
||||||
SPEAKER(config, "mono").front_center();
|
SPEAKER(config, "mono").front_center();
|
||||||
|
|
||||||
SCC8530N(config, m_scc[0], SCC_PCLK);
|
SCC8530N(config, m_scc[0], SCC_PCLK);
|
||||||
|
Loading…
Reference in New Issue
Block a user