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.
This commit is contained in:
couriersud 2020-03-07 15:50:11 +01:00
parent 103d50f296
commit 7501b2e742
3 changed files with 52 additions and 33 deletions

View File

@ -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

View File

@ -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);

View File

@ -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();
}