From 93203b830a9e6eab292355536772c454dd83bc5e Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 15 Jan 2018 00:43:49 -0500 Subject: v100: Add 80-column/132-column display clock switch (nw) --- src/devices/video/tms9927.cpp | 25 +++++++++++++++++-------- src/devices/video/tms9927.h | 2 +- src/mame/drivers/v100.cpp | 13 +++++++++---- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/devices/video/tms9927.cpp b/src/devices/video/tms9927.cpp index 3ae83659fc3..78aa875f2b9 100644 --- a/src/devices/video/tms9927.cpp +++ b/src/devices/video/tms9927.cpp @@ -53,6 +53,7 @@ tms9927_device::tms9927_device(const machine_config &mconfig, device_type type, , m_overscan_bottom(0) , m_selfload(*this, finder_base::DUMMY_TAG) , m_reset(false) + , m_valid_config(false) { std::fill(std::begin(m_reg), std::end(m_reg), 0x00); } @@ -82,9 +83,6 @@ void tms9927_device::device_start() assert(clock() > 0); if (!(m_hpixels_per_column > 0)) fatalerror("TMS9927: number of pixels per column must be explicitly set using MCFG_TMS9927_CHAR_WIDTH()!\n"); - /* copy the initial parameters */ - m_clock = clock(); - // resolve callbacks m_write_vsyn.resolve_safe(); m_write_hsyn.resolve(); @@ -112,6 +110,17 @@ void tms9927_device::device_reset() m_start_datarow = 0; } +//------------------------------------------------- +// device_clock_changed - called when the +// device clock is altered in any way +//------------------------------------------------- + +void tms9927_device::device_clock_changed() +{ + if (m_valid_config && !m_reset) + recompute_parameters(false); +} + //------------------------------------------------- // device_stop - device-specific stop //------------------------------------------------- @@ -119,7 +128,7 @@ void tms9927_device::device_reset() void tms9927_device::device_stop() { osd_printf_debug("TMS9927: Final params: (%d, %d, %d, %d, %d, %d, %d)\n", - m_clock, + clock(), m_total_hpix, 0, m_visible_hpix, m_total_vpix, @@ -322,8 +331,6 @@ void tms9927_device::recompute_parameters(bool postload) m_vsyn_start = (m_total_vpix + m_overscan_top - VERTICAL_DATA_START) % m_total_vpix; m_vsyn_end = (m_vsyn_start + 3) % m_total_vpix; - osd_printf_debug("TMS9927: Total = %dx%d, Visible = %dx%d, HSync = %d-%d, VSync = %d-%d, Skew=%d, Upscroll=%d\n", m_total_hpix, m_total_vpix, m_visible_hpix, m_visible_vpix, m_hsyn_start, m_hsyn_end, m_vsyn_start, m_vsyn_end, SKEW_BITS, m_start_datarow); - /* see if it all makes sense */ m_valid_config = true; if ( (m_visible_hpix > m_total_hpix || m_visible_vpix > m_total_vpix) || (((m_visible_hpix-1)<=0) || ((m_visible_vpix-1)<=0)) || ((m_total_hpix * m_total_vpix) == 0) ) @@ -332,7 +339,7 @@ void tms9927_device::recompute_parameters(bool postload) logerror("tms9927: invalid visible size (%dx%d) versus total size (%dx%d)\n", m_visible_hpix, m_visible_vpix, m_total_hpix, m_total_vpix); } - if (m_clock == 0) + if (clock() == 0) { m_valid_config = false; // TODO: make the screen refresh never, and disable the vblank and odd/even interrupts here! @@ -347,7 +354,9 @@ void tms9927_device::recompute_parameters(bool postload) rectangle visarea(0, m_overscan_left + m_visible_hpix + m_overscan_right - 1, 0, m_overscan_top + m_visible_vpix + m_overscan_bottom - 1); - attoseconds_t refresh = HZ_TO_ATTOSECONDS(m_clock) * m_total_hpix * m_total_vpix; + attoseconds_t refresh = clocks_to_attotime(m_total_hpix * m_total_vpix).as_attoseconds(); + + osd_printf_debug("TMS9927: Total = %dx%d, Visible = %dx%d, HSync = %d-%d, VSync = %d-%d, Skew=%d, Upscroll=%d, Period=%f Hz\n", m_total_hpix, m_total_vpix, m_visible_hpix, m_visible_vpix, m_hsyn_start, m_hsyn_end, m_vsyn_start, m_vsyn_end, SKEW_BITS, m_start_datarow, ATTOSECONDS_TO_HZ(refresh)); screen().configure(m_total_hpix, m_total_vpix, visarea, refresh); diff --git a/src/devices/video/tms9927.h b/src/devices/video/tms9927.h index feb49a83be1..4108f015b71 100644 --- a/src/devices/video/tms9927.h +++ b/src/devices/video/tms9927.h @@ -59,6 +59,7 @@ protected: virtual void device_start() override; virtual void device_stop() override; virtual void device_reset() override; + virtual void device_clock_changed() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: @@ -85,7 +86,6 @@ private: optional_region_ptr m_selfload; /* live state */ - uint32_t m_clock; uint8_t m_reg[9]; uint8_t m_start_datarow; bool m_reset; diff --git a/src/mame/drivers/v100.cpp b/src/mame/drivers/v100.cpp index 852a879e9e2..bc6f9ccf199 100644 --- a/src/mame/drivers/v100.cpp +++ b/src/mame/drivers/v100.cpp @@ -31,6 +31,7 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_screen(*this, "screen") + , m_vtac(*this, "vtac") , m_brg(*this, "brg%u", 1) , m_earom(*this, "earom") , m_picu(*this, "picu") @@ -50,6 +51,7 @@ private: required_device m_maincpu; required_device m_screen; + required_device m_vtac; required_device_array m_brg; required_device m_earom; required_device m_picu; @@ -93,6 +95,9 @@ IRQ_CALLBACK_MEMBER(v100_state::irq_ack) WRITE8_MEMBER(v100_state::ppi_porta_w) { + m_vtac->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0); + m_screen->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0); + logerror("Writing %02X to PPI port A\n", data); } @@ -142,12 +147,12 @@ static MACHINE_CONFIG_START( v100 ) MCFG_COM8116_FT_HANDLER(DEVWRITELINE("usart2", i8251_device, write_txc)) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_RAW_PARAMS(XTAL_47_736MHz / 2, 102 * CHAR_WIDTH, 0, 80 * CHAR_WIDTH, 260, 0, 240) - //MCFG_SCREEN_RAW_PARAMS(XTAL_47_736MHz, 170 * CHAR_WIDTH, 0, 132 * CHAR_WIDTH, 312, 0, 240) + //MCFG_SCREEN_RAW_PARAMS(XTAL_47_736MHz / 2, 102 * CHAR_WIDTH, 0, 80 * CHAR_WIDTH, 260, 0, 240) + MCFG_SCREEN_RAW_PARAMS(XTAL_47_736MHz, 170 * CHAR_WIDTH, 0, 132 * CHAR_WIDTH, 312, 0, 240) MCFG_SCREEN_UPDATE_DRIVER(v100_state, screen_update) - // FIXME: dot clock should be divided by char width, and not divided by 2 for 132-column mode - MCFG_DEVICE_ADD("vtac", CRT5037, XTAL_47_736MHz / 2) + // FIXME: dot clock should be divided by char width + MCFG_DEVICE_ADD("vtac", CRT5037, XTAL_47_736MHz) MCFG_TMS9927_CHAR_WIDTH(CHAR_WIDTH) MCFG_VIDEO_SET_SCREEN("screen") -- cgit v1.2.3