mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
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/wd33c93.h"
|
||||
#include "machine/z80scc.h"
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
|
||||
#define ENABLE_ENTRY_GFX (0)
|
||||
#define ENABLE_ENTRY_GFX (1)
|
||||
|
||||
#define LOG_UNKNOWN (1 << 0)
|
||||
#define LOG_INT (1 << 1)
|
||||
@ -67,6 +68,7 @@ public:
|
||||
, m_pit(*this, "pit")
|
||||
, m_rtc(*this, "rtc")
|
||||
, m_dsp_ram(*this, "dspram")
|
||||
, m_palette(*this, "palette")
|
||||
{
|
||||
}
|
||||
|
||||
@ -106,6 +108,8 @@ protected:
|
||||
static void cdrom_config(device_t *device);
|
||||
void indigo_map(address_map &map);
|
||||
|
||||
uint32_t screen_update(screen_device &device, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
enum
|
||||
{
|
||||
LOCAL0_FIFO_GIO0 = 0x01,
|
||||
@ -125,6 +129,52 @@ protected:
|
||||
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
|
||||
{
|
||||
uint8_t m_misc_status;
|
||||
@ -146,6 +196,18 @@ protected:
|
||||
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
|
||||
{
|
||||
HPC_DMACTRL_RESET = 0x01,
|
||||
@ -161,8 +223,10 @@ protected:
|
||||
required_device<pit8254_device> m_pit;
|
||||
required_device<dp8573_device> m_rtc;
|
||||
required_shared_ptr<uint32_t> m_dsp_ram;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
hpc_t m_hpc;
|
||||
lg1_t m_lg1;
|
||||
uint8_t m_duart_int_status;
|
||||
|
||||
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_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));
|
||||
}
|
||||
|
||||
void indigo_state::machine_reset()
|
||||
{
|
||||
memset(&m_hpc, 0, sizeof(hpc_t));
|
||||
memset(&m_lg1, 0, sizeof(lg1_t));
|
||||
m_duart_int_status = 0;
|
||||
}
|
||||
|
||||
@ -786,17 +860,101 @@ WRITE32_MEMBER(indigo_state::dsp_ram_w)
|
||||
READ32_MEMBER(indigo_state::entry_r)
|
||||
{
|
||||
uint32_t ret = 0;
|
||||
#if ENABLE_ENTRY_GFX
|
||||
if (offset == 0x0014/4)
|
||||
switch (offset)
|
||||
{
|
||||
case 0x0014/4:
|
||||
ret = 0x033c0000;
|
||||
#endif
|
||||
LOGMASKED(LOG_GFX, "%s: Entry Graphics(?) Read: %08x = %08x & %08x\n", machine().describe_context(), 0x1f3f0000 + offset*4, ret, mem_mask);
|
||||
LOGMASKED(LOG_GFX, "%s: LG1 Read: Presence Detect(?) %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;
|
||||
}
|
||||
|
||||
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)
|
||||
@ -837,6 +995,16 @@ void indigo_state::cdrom_config(device_t *device)
|
||||
|
||||
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();
|
||||
|
||||
SCC8530N(config, m_scc[0], SCC_PCLK);
|
||||
|
Loading…
Reference in New Issue
Block a user