From fa92ed8a371e114cc4a1fa0534a8b9041c2fcedd Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 11 Oct 2022 17:13:07 +0200 Subject: advision: add confsetting for the interpolation --- src/mame/entex/advision.cpp | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/mame/entex/advision.cpp b/src/mame/entex/advision.cpp index d9c1b7c1fc4..0b94bc839f6 100644 --- a/src/mame/entex/advision.cpp +++ b/src/mame/entex/advision.cpp @@ -2,12 +2,12 @@ // copyright-holders:Dan Boris, hap /******************************************************************************* -Entex Adventure Vision, tabletop video game console +Entex Adventure Vision, tabletop game console Hardware notes: - INS8048-11 @ 11MHz (1KB internal ROM) - COP411 for the sound, 1-bit speaker with volume control -- molex socket for 4KB cartridges +- Molex socket for 4KB cartridges - 1KB external RAM (2*MM2114N) - 40 small rectangular red LEDs, a motor with a fast spinning mirror gives the illusion of a 150*40 screen @@ -19,7 +19,8 @@ A game cartridge is basically an EPROM chip wearing a jacket, there is no dedicated cartridge slot as is common on other consoles. Only 4 games were released in total. -The mirror rotates at around 7Hz, the motor speed is not controlled by software. +The mirror rotates at around 7Hz, the motor speed is not controlled by software, +and it differs a bit per console. This can be adjusted after enabling -cheat. There's a mirror on both sides so the display refreshes at around 14Hz. A similar technology was later used in the Nintendo Virtual Boy. @@ -28,6 +29,9 @@ width of 150 is specified by the BIOS, but it's possible to update the leds at a different rate, hence MAME configures a larger screen. In fact, the homebrew demo Code Red doesn't use the BIOS for it, and runs at 50*40 to save some RAM. +It's recommended to leave bilinear filtering on (it's the default for most of +MAME's video backends). + TODO: - EA banking is ugly, it can be turd-polished but the real issue is in mcs48 - display refresh is actually ~14Hz, but doing that will make MAME very sluggish @@ -72,6 +76,7 @@ public: , m_cart(*this, "cartslot") , m_ea_bank(*this, "ea_bank") , m_joy(*this, "JOY") + , m_conf(*this, "CONF") { } void advision(machine_config &config); @@ -92,6 +97,7 @@ private: required_device m_cart; required_memory_bank m_ea_bank; required_ioport m_joy; + required_ioport m_conf; void io_map(address_map &map); void program_map(address_map &map); @@ -137,6 +143,8 @@ private: u32 advision_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { + bool hint_enable = bool(m_conf->read() & 1); + for (int y = 0; y < 40; y++) { u8 *src = &m_display[y * DISPLAY_WIDTH]; @@ -148,17 +156,11 @@ u32 advision_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c if (cliprect.contains(dx, dy)) { - u8 red = 0xff; + u8 red = src[x] ? 0xff : 0; - if (src[x] == 0) - { - // do some horizontal interpolation - int prev = 0; - for (int i = 1; i < 5; i++) - prev += ((x - i) < 0) ? 0 : src[x - i]; - - red = (prev * 0xff) / 4; - } + // do some horizontal interpolation + if (hint_enable && red == 0 && dx > 0) + red = (bitmap.pix(dy, dx - 1) >> 16 & 0xff) * 0.75; u8 green = red / 16; u8 blue = red / 12; @@ -177,8 +179,9 @@ void advision_state::av_control_w(u8 data) m_video_bank = data >> 5 & 7; // disable led outputs (there is some delay before it takes effect) + // see for example codered twister and anime girl, gaps between the 'pixels' should be visible but minimal if (m_video_bank == 0) - m_led_off->adjust(attotime::from_usec(50)); + m_led_off->adjust(attotime::from_usec(39)); // P24 rising edge: transfer led latches to outputs if (!m_video_strobe && bool(data & 0x10)) @@ -348,6 +351,11 @@ static INPUT_PORTS_START( advision ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY + + PORT_START("CONF") + PORT_CONFNAME( 0x01, 0x01, "H Interpolation" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) INPUT_PORTS_END @@ -414,7 +422,7 @@ void advision_state::advision(machine_config &config) m_maincpu->p2_out_cb().set(FUNC(advision_state::av_control_w)); m_maincpu->t1_in_cb().set(FUNC(advision_state::vsync_r)); - COP411(config, m_soundcpu, 210000); // COP411L-KCN/N, R11=82k, C8=56pF + COP411(config, m_soundcpu, 200000); // COP411L-KCN/N, R11=82k, C8=56pF m_soundcpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_RAM_POWER_SUPPLY, false); m_soundcpu->read_l().set(FUNC(advision_state::sound_cmd_r)); m_soundcpu->write_g().set(FUNC(advision_state::sound_g_w)); -- cgit v1.2.3