summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-03-07 15:50:11 +0100
committer couriersud <couriersud@gmx.org>2020-03-07 15:50:11 +0100
commit7501b2e74242b6b5e8cf84a70f92cc1207389b5f (patch)
tree67175eb3acbe95159c225217250966770a2ded09 /src/mame
parent103d50f29628fea5054850c7e079cea87d136e13 (diff)
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.
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/williams.cpp28
-rw-r--r--src/mame/includes/williams.h4
-rw-r--r--src/mame/video/williams.cpp53
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();
}