summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/indigo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/indigo.cpp')
-rw-r--r--src/mame/drivers/indigo.cpp132
1 files changed, 125 insertions, 7 deletions
diff --git a/src/mame/drivers/indigo.cpp b/src/mame/drivers/indigo.cpp
index aab5e8def12..30d224ecb05 100644
--- a/src/mame/drivers/indigo.cpp
+++ b/src/mame/drivers/indigo.cpp
@@ -105,6 +105,8 @@ protected:
void advance_chain(address_space &space);
void scsi_dma();
+ void do_rex_command(uint32_t command);
+
static void cdrom_config(device_t *device);
void indigo_map(address_map &map);
@@ -201,6 +203,18 @@ protected:
uint32_t m_config_sel;
uint32_t m_write_addr;
uint32_t m_control;
+
+ uint32_t m_x_start_i;
+ uint32_t m_y_start_i;
+ uint32_t m_xy_move;
+ uint32_t m_color_red_i;
+ uint32_t m_color_green_i;
+ uint32_t m_color_blue_i;
+ uint32_t m_color_back;
+ uint32_t m_z_pattern;
+ uint32_t m_x_end_i;
+ uint32_t m_y_end_i;
+
uint8_t m_palette_idx;
uint8_t m_palette_channel;
uint8_t m_palette_entry[3];
@@ -227,6 +241,7 @@ protected:
hpc_t m_hpc;
lg1_t m_lg1;
+ std::unique_ptr<uint8_t[]> m_framebuffer;
uint8_t m_duart_int_status;
static char const *const RS232A_TAG;
@@ -278,6 +293,8 @@ protected:
void indigo_state::machine_start()
{
+ m_framebuffer = std::make_unique<uint8_t[]>(1024*768);
+
save_item(NAME(m_hpc.m_misc_status));
save_item(NAME(m_hpc.m_cpu_aux_ctrl));
save_item(NAME(m_hpc.m_parbuf_ptr));
@@ -300,6 +317,16 @@ void indigo_state::machine_start()
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_x_start_i));
+ save_item(NAME(m_lg1.m_y_start_i));
+ save_item(NAME(m_lg1.m_xy_move));
+ save_item(NAME(m_lg1.m_color_red_i));
+ save_item(NAME(m_lg1.m_color_green_i));
+ save_item(NAME(m_lg1.m_color_blue_i));
+ save_item(NAME(m_lg1.m_color_back));
+ save_item(NAME(m_lg1.m_z_pattern));
+ save_item(NAME(m_lg1.m_x_end_i));
+ save_item(NAME(m_lg1.m_y_end_i));
save_item(NAME(m_lg1.m_palette_idx));
save_item(NAME(m_lg1.m_palette_channel));
save_item(NAME(m_lg1.m_palette_entry));
@@ -307,12 +334,15 @@ void indigo_state::machine_start()
save_item(NAME(m_lg1.m_pix_read_mask));
save_item(NAME(m_duart_int_status));
+
+ save_pointer(NAME(&m_framebuffer[0]), 1024*768);
}
void indigo_state::machine_reset()
{
memset(&m_hpc, 0, sizeof(hpc_t));
memset(&m_lg1, 0, sizeof(lg1_t));
+ memset(&m_framebuffer[0], 0, 1024*768);
m_duart_int_status = 0;
}
@@ -873,11 +903,98 @@ READ32_MEMBER(indigo_state::entry_r)
return ret;
}
+void indigo_state::do_rex_command(uint32_t command)
+{
+ /*
+ 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,
+ */
+ if (command == 0x30000329)
+ {
+ for (uint32_t y = m_lg1.m_y_start_i; y <= m_lg1.m_y_end_i; y++)
+ {
+ for (uint32_t x = m_lg1.m_x_start_i; x <= m_lg1.m_x_end_i; x++)
+ {
+ m_framebuffer[y*1024 + x] = m_lg1.m_color_red_i;
+ }
+ }
+ }
+ else
+ {
+ LOGMASKED(LOG_GFX, "%s: Unknown LG1 command: %08x\n", command);
+ }
+}
+
WRITE32_MEMBER(indigo_state::entry_w)
{
switch (offset)
{
+ case (REX15_PAGE0_SET+REX15_P0REG_COMMAND)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COMMAND)/4:
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 Command Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ do_rex_command(data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_XSTARTI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_XSTARTI)/4:
+ m_lg1.m_x_start_i = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 XStartI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_YSTARTI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_YSTARTI)/4:
+ m_lg1.m_y_start_i = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 YStartI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_XYMOVE)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_XYMOVE)/4:
+ m_lg1.m_xy_move = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 XYMove Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORREDI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORREDI)/4:
+ m_lg1.m_color_red_i = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorRedI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORGREENI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORGREENI)/4:
+ m_lg1.m_color_green_i = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorGreenI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORBLUEI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORBLUEI)/4:
+ m_lg1.m_color_blue_i = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorBlueI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_COLORBACK)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_COLORBACK)/4:
+ m_lg1.m_color_back = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ColorBlueI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_ZPATTERN)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_ZPATTERN)/4:
+ m_lg1.m_z_pattern = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 ZPattern Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_XENDI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_XENDI)/4:
+ m_lg1.m_x_end_i = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 XEndI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+ case (REX15_PAGE0_SET+REX15_P0REG_YENDI)/4:
+ case (REX15_PAGE0_GO+REX15_P0REG_YENDI)/4:
+ m_lg1.m_y_end_i = data;
+ LOGMASKED(LOG_GFX, "%s: LG1 REX1.5 YEndI Write (%s) = %08x\n", machine().describe_context(), (offset & 0x200) ? "Go" : "Set", data);
+ break;
+
case (REX15_PAGE1_SET+REX15_P1REG_CFGSEL)/4:
+ case (REX15_PAGE1_GO+REX15_P1REG_CFGSEL)/4:
m_lg1.m_config_sel = data;
switch (data)
{
@@ -899,6 +1016,9 @@ WRITE32_MEMBER(indigo_state::entry_w)
}
break;
case (REX15_PAGE1_SET+REX15_P1REG_CFGDATA)/4:
+ case (REX15_PAGE1_GO+REX15_P1REG_CFGDATA)/4:
+ if (offset & 0x200) // Ignore 'Go' writes for now
+ break;
switch (m_lg1.m_config_sel)
{
case REX15_WRITE_ADDR:
@@ -943,15 +1063,13 @@ uint32_t indigo_state::screen_update(screen_device &device, bitmap_rgb32 &bitmap
{
const rgb_t *pens = m_palette->palette()->entry_list_raw();
- for (int y = 0; y < 256; y++)
+ for (int y = 0; y < 768; y++)
{
- for (int suby = 0; suby < 3; suby++)
+ uint32_t *dst = &bitmap.pix32(y);
+ uint8_t *src = &m_framebuffer[y*1024];
+ for (int x = 0; x < 1024; x++)
{
- uint32_t *dst = &bitmap.pix32(y*3 + suby);
- for (int x = 0; x < 1024; x++)
- {
- *dst++ = pens[y];
- }
+ *dst++ = pens[*src++];
}
}
return 0;