summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-01-15 00:43:49 -0500
committer AJR <ajrhacker@users.noreply.github.com>2018-01-15 00:44:47 -0500
commit93203b830a9e6eab292355536772c454dd83bc5e (patch)
treef84f1233844ca218b87cc0483388688ff00ebaf1
parent90e652db43fae7300de4f6953e945da9661652c9 (diff)
v100: Add 80-column/132-column display clock switch (nw)
-rw-r--r--src/devices/video/tms9927.cpp25
-rw-r--r--src/devices/video/tms9927.h2
-rw-r--r--src/mame/drivers/v100.cpp13
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();
@@ -113,13 +111,24 @@ void tms9927_device::device_reset()
}
//-------------------------------------------------
+// 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
//-------------------------------------------------
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<uint8_t> 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<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
+ required_device<crt5037_device> m_vtac;
required_device_array<com8116_device, 2> m_brg;
required_device<er1400_device> m_earom;
required_device<i8214_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")