From 1e57f272edf91cbde785f7cdf1f68cd79de212fd Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Tue, 13 Nov 2018 21:04:14 +0100 Subject: indigo.cpp: Hooked up palette setup for LG1 graphics board. [Ryan Holtz] --- src/mame/drivers/indigo.cpp | 180 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 174 insertions(+), 6 deletions(-) diff --git a/src/mame/drivers/indigo.cpp b/src/mame/drivers/indigo.cpp index 619e7cfe8f0..aab5e8def12 100644 --- a/src/mame/drivers/indigo.cpp +++ b/src/mame/drivers/indigo.cpp @@ -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 m_pit; required_device m_rtc; required_shared_ptr m_dsp_ram; + required_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); -- cgit v1.2.3