From 93c54536a82c5eaf6d1ff00b97c29b4f970c9b9b Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Fri, 17 Nov 2017 10:38:18 +1300 Subject: fmtowns: Separate palette into a 256 colour palette, and two 16 colour palettes for each layer. Fixes colours in Abel. --- src/mame/drivers/fmtowns.cpp | 9 +++- src/mame/includes/fmtowns.h | 6 ++- src/mame/video/fmtowns.cpp | 110 ++++++++++++++++++++++++++----------------- 3 files changed, 79 insertions(+), 46 deletions(-) diff --git a/src/mame/drivers/fmtowns.cpp b/src/mame/drivers/fmtowns.cpp index 83cd95e392e..a7b8fb8411f 100644 --- a/src/mame/drivers/fmtowns.cpp +++ b/src/mame/drivers/fmtowns.cpp @@ -2670,6 +2670,9 @@ void towns_state::driver_start() m_towns_cd.buffer_ptr = -1; m_towns_cd.read_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(towns_state::towns_cdrom_read_byte),this), (void*)machine().device("dma_1")); + save_pointer(m_video.towns_crtc_reg,"CRTC registers",32); + save_pointer(m_video.towns_video_reg,"Video registers",2); + m_maincpu->space(AS_PROGRAM).install_ram(0x100000,m_ram->size()-1,nullptr); } @@ -2777,8 +2780,10 @@ static MACHINE_CONFIG_START( towns_base ) MCFG_SCREEN_VISIBLE_AREA(0, 768-1, 0, 512-1) MCFG_SCREEN_UPDATE_DRIVER(towns_state, screen_update) - MCFG_GFXDECODE_ADD("gfxdecode", "palette", towns) - MCFG_PALETTE_ADD("palette", 256) + MCFG_GFXDECODE_ADD("gfxdecode", "palette16_0", towns) + MCFG_PALETTE_ADD("palette256", 256) + MCFG_PALETTE_ADD("palette16_0", 16) + MCFG_PALETTE_ADD("palette16_1", 16) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/includes/fmtowns.h b/src/mame/includes/fmtowns.h index 7e6557146f6..ea04463de5f 100644 --- a/src/mame/includes/fmtowns.h +++ b/src/mame/includes/fmtowns.h @@ -95,7 +95,9 @@ class towns_state : public driver_device m_pit(*this, "pit"), m_dma_1(*this, "dma_1"), m_dma_2(*this, "dma_2"), - m_palette(*this, "palette"), + m_palette(*this, "palette256"), + m_palette16_0(*this, "palette16_0"), + m_palette16_1(*this, "palette16_1"), m_ram(*this, RAM_TAG), m_fdc(*this, "fdc"), m_flop0(*this, "fdc:0"), @@ -131,6 +133,8 @@ class towns_state : public driver_device required_device m_dma_1; required_device m_dma_2; required_device m_palette; + required_device m_palette16_0; + required_device m_palette16_1; required_device m_ram; required_device m_fdc; required_device m_flop0; diff --git a/src/mame/video/fmtowns.cpp b/src/mame/video/fmtowns.cpp index 30c27f5929d..881f5390a0a 100644 --- a/src/mame/video/fmtowns.cpp +++ b/src/mame/video/fmtowns.cpp @@ -60,16 +60,20 @@ * * Video registers: * - * 0: Graphic layer(s) type: (others likely exist) - * bit 4 = 2 layers + * 0: Control register: + * bit 4 = PMODE - enable 2 layers * bits 2-3 = layer 1 mode * bits 0-1 = layer 0 mode - * mode: 1 = 16 colours, 2 = 256 colours, 3 = highcolour (16-bit) - * 0 = disabled? + * mode: 1 = 16 colours (PMODE=1 only), 2 = 256 colours (PMODE=0 only), + * 3 = highcolour (16-bit), 0 = display off * - * 1: Layer reverse (priority?) (bit 0) - * YM (bit 2) - unknown - * peltype (bits 4 and 5) + * 1: Priority register (bit 0) + * bit 0: PR1 - layer priority (0 = layer 0 before) + * bit 2: YM - screen brightness (0 = high brightness) + * bit 3: YS - 0 = valid. Used for 256 colour external sync + * bits 4-5: Palette select + * 0 = layer 0, 16 colours, 1 or 3 = 256 colours + * 2 = layer 1, 16 colours * * * Sprite registers: @@ -487,31 +491,50 @@ void towns_state::towns_update_palette() uint8_t r = m_video.towns_palette_r[entry]; uint8_t g = m_video.towns_palette_g[entry]; uint8_t b = m_video.towns_palette_b[entry]; - m_palette->set_pen_color(entry, r, g, b); + switch(m_video.towns_video_reg[1] & 0x30) // Palette select + { + case 0x00: + m_palette16_0->set_pen_color(entry, r, g, b); + break; + case 0x20: + m_palette16_1->set_pen_color(entry, r, g, b); + break; + case 0x10: + case 0x30: + m_palette->set_pen_color(entry, r, g, b); + break; + } } /* Video/CRTC * * 0xfd90 - palette colour select * 0xfd92/4/6 - BRG value - * 0xfd98-9f - degipal(?) + * 0xfd98-9f - Digital palette registers (FMR-50 compatibility) */ READ8_MEMBER(towns_state::towns_video_fd90_r) { uint8_t ret = 0; uint16_t xpos; + palette_device* pal; + if(m_video.towns_video_reg[1] & 0x10) + pal = m_palette; + else if(m_video.towns_video_reg[1] & 0x20) + pal = m_palette16_1; + else + pal = m_palette16_0; // if(LOG_VID) logerror("VID: read port %04x\n",offset+0xfd90); switch(offset) { case 0x00: return m_video.towns_palette_select; case 0x02: - return m_video.towns_palette_b[m_video.towns_palette_select]; + return pal->pen_color(m_video.towns_palette_select).b(); case 0x04: - return m_video.towns_palette_r[m_video.towns_palette_select]; + return pal->pen_color(m_video.towns_palette_select).r(); case 0x06: - return m_video.towns_palette_g[m_video.towns_palette_select]; + return pal->pen_color(m_video.towns_palette_select).g(); case 0x08: case 0x09: case 0x0a: @@ -1249,7 +1272,8 @@ void towns_state::towns_crtc_draw_scan_layer_16(bitmap_rgb32 &bitmap,const recta int hzoom = 1; int linesize; uint32_t scroll; - + palette_device* pal = (layer == 0) ? m_palette16_0 : m_palette16_1; + if(m_video.towns_display_page_sel != 0) off = 0x20000; @@ -1301,12 +1325,12 @@ void towns_state::towns_crtc_draw_scan_layer_16(bitmap_rgb32 &bitmap,const recta colour = m_towns_gfxvram[off+(layer*0x40000)] >> 4; if(colour != 0) { - bitmap.pix32(scanline, x+1) = m_palette->pen(colour); + bitmap.pix32(scanline, x+1) = pal->pen(colour); } colour = m_towns_gfxvram[off+(layer*0x40000)] & 0x0f; if(colour != 0) { - bitmap.pix32(scanline, x) = m_palette->pen(colour); + bitmap.pix32(scanline, x) = pal->pen(colour); } off++; } @@ -1323,14 +1347,14 @@ void towns_state::towns_crtc_draw_scan_layer_16(bitmap_rgb32 &bitmap,const recta colour = m_towns_gfxvram[off+(layer*0x40000)] >> 4; if(colour != 0) { - bitmap.pix32(scanline, x+2) = m_palette->pen(colour); - bitmap.pix32(scanline, x+3) = m_palette->pen(colour); + bitmap.pix32(scanline, x+2) = pal->pen(colour); + bitmap.pix32(scanline, x+3) = pal->pen(colour); } colour = m_towns_gfxvram[off+(layer*0x40000)] & 0x0f; if(colour != 0) { - bitmap.pix32(scanline, x) = m_palette->pen(colour); - bitmap.pix32(scanline, x+1) = m_palette->pen(colour); + bitmap.pix32(scanline, x) = pal->pen(colour); + bitmap.pix32(scanline, x+1) = pal->pen(colour); } off++; } @@ -1347,16 +1371,16 @@ void towns_state::towns_crtc_draw_scan_layer_16(bitmap_rgb32 &bitmap,const recta colour = m_towns_gfxvram[off+(layer*0x40000)] >> 4; if(colour != 0) { - bitmap.pix32(scanline, x+3) = m_palette->pen(colour); - bitmap.pix32(scanline, x+4) = m_palette->pen(colour); - bitmap.pix32(scanline, x+5) = m_palette->pen(colour); + bitmap.pix32(scanline, x+3) = pal->pen(colour); + bitmap.pix32(scanline, x+4) = pal->pen(colour); + bitmap.pix32(scanline, x+5) = pal->pen(colour); } colour = m_towns_gfxvram[off+(layer*0x40000)] & 0x0f; if(colour != 0) { - bitmap.pix32(scanline, x) = m_palette->pen(colour); - bitmap.pix32(scanline, x+1) = m_palette->pen(colour); - bitmap.pix32(scanline, x+2) = m_palette->pen(colour); + bitmap.pix32(scanline, x) = pal->pen(colour); + bitmap.pix32(scanline, x+1) = pal->pen(colour); + bitmap.pix32(scanline, x+2) = pal->pen(colour); } off++; } @@ -1373,18 +1397,18 @@ void towns_state::towns_crtc_draw_scan_layer_16(bitmap_rgb32 &bitmap,const recta colour = m_towns_gfxvram[off+(layer*0x40000)] >> 4; if(colour != 0) { - bitmap.pix32(scanline, x+4) = m_palette->pen(colour); - bitmap.pix32(scanline, x+5) = m_palette->pen(colour); - bitmap.pix32(scanline, x+6) = m_palette->pen(colour); - bitmap.pix32(scanline, x+7) = m_palette->pen(colour); + bitmap.pix32(scanline, x+4) = pal->pen(colour); + bitmap.pix32(scanline, x+5) = pal->pen(colour); + bitmap.pix32(scanline, x+6) = pal->pen(colour); + bitmap.pix32(scanline, x+7) = pal->pen(colour); } colour = m_towns_gfxvram[off+(layer*0x40000)] & 0x0f; if(colour != 0) { - bitmap.pix32(scanline, x) = m_palette->pen(colour); - bitmap.pix32(scanline, x+1) = m_palette->pen(colour); - bitmap.pix32(scanline, x+2) = m_palette->pen(colour); - bitmap.pix32(scanline, x+3) = m_palette->pen(colour); + bitmap.pix32(scanline, x) = pal->pen(colour); + bitmap.pix32(scanline, x+1) = pal->pen(colour); + bitmap.pix32(scanline, x+2) = pal->pen(colour); + bitmap.pix32(scanline, x+3) = pal->pen(colour); } off++; } @@ -1401,20 +1425,20 @@ void towns_state::towns_crtc_draw_scan_layer_16(bitmap_rgb32 &bitmap,const recta colour = m_towns_gfxvram[off+(layer*0x40000)] >> 4; if(colour != 0) { - bitmap.pix32(scanline, x+5) = m_palette->pen(colour); - bitmap.pix32(scanline, x+6) = m_palette->pen(colour); - bitmap.pix32(scanline, x+7) = m_palette->pen(colour); - bitmap.pix32(scanline, x+8) = m_palette->pen(colour); - bitmap.pix32(scanline, x+9) = m_palette->pen(colour); + bitmap.pix32(scanline, x+5) = pal->pen(colour); + bitmap.pix32(scanline, x+6) = pal->pen(colour); + bitmap.pix32(scanline, x+7) = pal->pen(colour); + bitmap.pix32(scanline, x+8) = pal->pen(colour); + bitmap.pix32(scanline, x+9) = pal->pen(colour); } colour = m_towns_gfxvram[off+(layer*0x40000)] & 0x0f; if(colour != 0) { - bitmap.pix32(scanline, x) = m_palette->pen(colour); - bitmap.pix32(scanline, x+1) = m_palette->pen(colour); - bitmap.pix32(scanline, x+2) = m_palette->pen(colour); - bitmap.pix32(scanline, x+3) = m_palette->pen(colour); - bitmap.pix32(scanline, x+4) = m_palette->pen(colour); + bitmap.pix32(scanline, x) = pal->pen(colour); + bitmap.pix32(scanline, x+1) = pal->pen(colour); + bitmap.pix32(scanline, x+2) = pal->pen(colour); + bitmap.pix32(scanline, x+3) = pal->pen(colour); + bitmap.pix32(scanline, x+4) = pal->pen(colour); } off++; } -- cgit v1.2.3