From 7501b2e74242b6b5e8cf84a70f92cc1207389b5f Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 7 Mar 2020 15:50:11 +0100 Subject: [PATCH] Williams2: Improve color processing. [Couriersud] offsets now cut off before gain is applied. This is how the "cutoff" monitor controls on arcade monitors worked. Adjusted R,G,B gains and offsets. --- src/mame/drivers/williams.cpp | 28 ++++++------------ src/mame/includes/williams.h | 4 +-- src/mame/video/williams.cpp | 53 +++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/mame/drivers/williams.cpp b/src/mame/drivers/williams.cpp index 74eebb30243..a045d60be41 100644 --- a/src/mame/drivers/williams.cpp +++ b/src/mame/drivers/williams.cpp @@ -484,19 +484,9 @@ 0 0 1 x x x x x x x x x x x x x 2000-3FFF CS PIA IC4 1 1 1 x x x x x x x x x x x x x E000-FFFF 8K ROM -TODO: -Mystic Marathon colors are very likely incorrectly derived from schematics. - -The video DAC is in the lower right corner of the schematic on page 11 of the Mystic Marathon Drawing Set, -or page 19 of the Turkey Shoot Service Manual (both are identical as far can be seen). Both schematics -are available at http://arcarc.xmission.com/PDF_Arcade_Williams/ - -It's a RAM-based palette with 4 bit red, green, blue and brightness/intensity components. It looks like the -brightness component (from IC76, the uppermost of the four 2148 SRAMs) should be combined with the color -components in a more complicated way than simply multiplying them like MAME does. - -Reference video: https://www.youtube.com/watch?v=R5OeC6Wc_yI - +Reference videos: https://www.youtube.com/watch?v=R5OeC6Wc_yI + https://www.youtube.com/watch?v=3J_EZ1OXlww + https://www.youtube.com/watch?v=zxZ48iJShSU ***************************************************************************/ @@ -767,17 +757,17 @@ void williams2_state::sound_map(address_map &map) static INPUT_PORTS_START( monitor_controls ) PORT_START("REDG") - PORT_ADJUSTER( 85, "Monitor Gain Red" ) PORT_MINMAX(0, 250) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 0) + PORT_ADJUSTER( 80, "Monitor Gain Red" ) PORT_MINMAX(0, 250) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 0) PORT_START("GREENG") - PORT_ADJUSTER( 135, "Monitor Gain Green" ) PORT_MINMAX(0, 250) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 1) + PORT_ADJUSTER( 73, "Monitor Gain Green" ) PORT_MINMAX(0, 250) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 1) PORT_START("BLUEG") - PORT_ADJUSTER( 76, "Monitor Gain Blue" ) PORT_MINMAX(0, 250) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 2) + PORT_ADJUSTER( 81, "Monitor Gain Blue" ) PORT_MINMAX(0, 250) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 2) PORT_START("REDO") - PORT_ADJUSTER( 100, "Monitor Offset Red" ) PORT_MINMAX(0, 200) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 3) + PORT_ADJUSTER( 73, "Monitor Offset Red" ) PORT_MINMAX(0, 200) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 3) PORT_START("GREENO") PORT_ADJUSTER( 100, "Monitor Offset Green" ) PORT_MINMAX(0, 200) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 4) PORT_START("BLUEO") - PORT_ADJUSTER( 100, "Monitor Offset Blue" ) PORT_MINMAX(0, 200) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 5) + PORT_ADJUSTER( 78, "Monitor Offset Blue" ) PORT_MINMAX(0, 200) PORT_CHANGED_MEMBER(DEVICE_SELF, mysticm_state, rgb_gain, 5) INPUT_PORTS_END @@ -1517,7 +1507,7 @@ static const gfx_layout williams2_layout = static GFXDECODE_START( gfx_williams2 ) - GFXDECODE_ENTRY( "gfx1", 0, williams2_layout, 0, 8 ) + GFXDECODE_ENTRY( "gfx1", 0, williams2_layout, 0, 64 ) GFXDECODE_END diff --git a/src/mame/includes/williams.h b/src/mame/includes/williams.h index bef9c03f2db..22948219698 100644 --- a/src/mame/includes/williams.h +++ b/src/mame/includes/williams.h @@ -315,8 +315,8 @@ public: m_bank8000(*this, "bank8000"), m_gfxdecode(*this, "gfxdecode"), m_tileram(*this, "williams2_tile"), - m_gain({0.85f, 1.35f, 0.76f}), - m_offset({0.0f, 0.0f, 0.0f}) + m_gain({0.8f, 0.73f, 0.81f}), + m_offset({-0.27f, 0.0f, -0.22f}) { } void williams2_base(machine_config &config); diff --git a/src/mame/video/williams.cpp b/src/mame/video/williams.cpp index 0e84d259be7..049b42ebf47 100644 --- a/src/mame/video/williams.cpp +++ b/src/mame/video/williams.cpp @@ -311,7 +311,7 @@ uint32_t mysticm_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma /* draw the background */ //printf("y %d %d %d\n", cliprect.min_y, cliprect.max_y, m_screen->vpos()); m_bg_tilemap->mark_all_dirty(); - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); /* loop over rows */ for (int y = cliprect.min_y; y <= cliprect.max_y; y++) @@ -375,6 +375,11 @@ rgb_t williams2_state::calc_col(uint16_t lo, uint16_t hi) * src/lib/netlist/examples/turkey_shoot.cpp * Instructions to create the table are found in turkey_shoot.cpp * + * Reference videos: https://www.youtube.com/watch?v=R5OeC6Wc_yI + * https://www.youtube.com/watch?v=3J_EZ1OXlww + * https://www.youtube.com/watch?v=zxZ48iJShSU + * + * * FIXME: The long term plan is to include the functionality of * nltool/nlwav into the netlist core, launch a netlist run and * create the table on the fly. This however needs some significant @@ -646,14 +651,25 @@ rgb_t williams2_state::calc_col(uint16_t lo, uint16_t hi) float r, g, b; /* update the palette entry */ + i = (hi >> 4) & 15; ub = (hi >> 0) & 15; - ur = (lo >> 0) & 15; ug = (lo >> 4) & 15; + ur = (lo >> 0) & 15; + + // normalize + r = frgb[i * 16 + ur] / 4.22f; + g = frgb[i * 16 + ug] / 4.22f; + b = frgb[i * 16 + ub] / 4.22f; + // cut off + r = std::max(r + m_offset[0], 0.0f); + g = std::max(g + m_offset[1], 0.0f); + b = std::max(b + m_offset[2], 0.0f); + // drive + r = std::min(r * m_gain[0] / 0.25f, 1.0f); + g = std::min(g * m_gain[1] / 0.25f, 1.0f); + b = std::min(b * m_gain[2] / 0.25f, 1.0f); - r = std::min(1.0f, frgb[i * 16 + ur] * m_gain[0] / 0.5f / 4.22f + m_offset[0]); - g = std::min(1.0f, frgb[i * 16 + ug] * m_gain[1] / 0.5f / 4.22f + m_offset[1]); - b = std::min(1.0f, frgb[i * 16 + ub] * m_gain[2] / 0.5f / 4.22f + m_offset[2]); return rgb_t((int) (r * 255), (int) (g * 255), (int) (b * 255)); } @@ -731,11 +747,19 @@ int mysticm_state::color_decode(uint8_t base_col, int sig_J1, int y) int sig_W12 = (v >> 12) & 1; int sig_W13 = (v >> 13) & 1; - // J1 connected to BACKSEL + // There are four "jumpers" in the schematics. + // J3 and J4 allow to turn off background tilemaps completely. + // BACKSEL (active low) in this case is forced to high. + // J1 and J2 allow to turn on/off "sky" processing. In this case, + // for sky (up to ~1/3 of vertical resolution an alternative palette + // is used. For mysticm it is connected to BACKSEL. // Cascading inputs ">" and "=" are set to "H", thus // cascading input "<" (connected to W11) has no effect - // according to truthtable for 7485. + // according to truthtable for 7485. Thus there are two possibilities: + // a. A real 7485 works different to the datasheet + // b. input "=" on the real board is connected to GND. + // FIXME: Investigate further. /* IC79 is a 74LS85 comparator that controls the low bit */ @@ -743,6 +767,10 @@ int mysticm_state::color_decode(uint8_t base_col, int sig_J1, int y) int b = (sig_W12 << 0) | (sig_W13 << 1) | (0 << 2) | (sig_J1 << 3); int color = (a > b) || ((a == b) && !sig_W11); + // mysticm schematics show Page1 and Page2 crossed, i.e. + // Page1 -> B2 (IC80) and Page2 -> B1 (IC80) + // This does not produce colors observed on real hardware. + // FIXME: Verify Page1 and Page2 connections. //return ((base_col & 0x04) >> 1) | ((base_col & 0x02) << 1) | (base_col & 0x38) | color; return (base_col & 0x3e) | color; } @@ -754,10 +782,13 @@ TILE_GET_INFO_MEMBER(mysticm_state::get_tile_info) int mask = m_gfxdecode->gfx(0)->elements() - 1; int data = m_tileram[tile_index]; - //SET_TILE_INFO_MEMBER(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0); + //m_bg_tilemap->set_palette_offset((color & 0x3e) << 4); + //SET_TILE_INFO_MEMBER(0, data & mask, color & 1, (data & ~mask) ? TILE_FLIPX : 0); + m_bg_tilemap->set_palette_offset(0); + SET_TILE_INFO_MEMBER(0, data & mask, (color & 0x3f), (data & ~mask) ? TILE_FLIPX : 0); - m_bg_tilemap->set_palette_offset((color & 0x3e) << 4); - SET_TILE_INFO_MEMBER(0, data & mask, color & 1, (data & ~mask) ? TILE_FLIPX : 0); + //gfx_element *gfx = tileinfo.decoder->gfx(0); + //printf("%d %d %d %d\n", gfx->elements(), gfx->colorbase(), gfx->granularity(), gfx->colors()); } @@ -784,9 +815,7 @@ void williams2_state::bg_select_w(u8 data) void mysticm_state::bg_select_w(u8 data) { /* IC79 is a 74LS85 comparator that controls the low bit */ - //printf("bg %d %d\n", data, data & 1); m_bg_color = data; - //m_bg_tilemap->set_palette_offset((data & 0x3e) << 4); m_bg_tilemap->mark_all_dirty(); }