summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-01-17 12:45:41 -0500
committer AJR <ajrhacker@users.noreply.github.com>2018-01-17 12:45:41 -0500
commit14282a25fecb617781f514c6cc0c054637f44846 (patch)
treeca2b1e976fc9fa274ef454544a362743cbc27be0
parentdb2c7d652e428ec1ae1a756768e4bf2513006f82 (diff)
tv912.cpp: Add TMS9927 and refresh rate switch (nw)
-rw-r--r--src/mame/drivers/tv912.cpp66
1 files changed, 64 insertions, 2 deletions
diff --git a/src/mame/drivers/tv912.cpp b/src/mame/drivers/tv912.cpp
index d0efaa834d2..75eb5549149 100644
--- a/src/mame/drivers/tv912.cpp
+++ b/src/mame/drivers/tv912.cpp
@@ -17,7 +17,7 @@
//#include "bus/rs232/rs232.h"
//#include "machine/ay31015.h"
#include "machine/bankdev.h"
-//#include "video/tms9927.h"
+#include "video/tms9927.h"
#include "screen.h"
#define CHAR_WIDTH 14
@@ -28,12 +28,18 @@ public:
tv912_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_crtc(*this, "crtc")
, m_bankdev(*this, "bankdev")
, m_dispram_bank(*this, "dispram")
, m_p_chargen(*this, "chargen")
+ , m_sw2(*this, "SW2")
{ }
DECLARE_WRITE8_MEMBER(p2_w);
+ DECLARE_READ8_MEMBER(crtc_r);
+ DECLARE_WRITE8_MEMBER(crtc_w);
+ DECLARE_READ8_MEMBER(keyboard_r);
+ DECLARE_WRITE8_MEMBER(output_40c);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -43,16 +49,56 @@ private:
virtual void machine_reset() override;
required_device<cpu_device> m_maincpu;
+ required_device<tms9927_device> m_crtc;
required_device<address_map_bank_device> m_bankdev;
required_memory_bank m_dispram_bank;
required_region_ptr<u8> m_p_chargen;
+ required_ioport m_sw2;
std::unique_ptr<u8[]> m_dispram;
};
WRITE8_MEMBER(tv912_state::p2_w)
{
+ // P20-P23: Address Signals (4MSBS)
m_bankdev->set_bank(data & 0x0f);
+
+ // P24: +4Hz Flasher
+ // P25: -DCR
+ // P26: -PTR RDY
+ // P27: -HALF DUPLEX
+}
+
+READ8_MEMBER(tv912_state::crtc_r)
+{
+ return m_crtc->read(space, bitswap<4>(offset, 5, 4, 1, 0));
+}
+
+WRITE8_MEMBER(tv912_state::crtc_w)
+{
+ m_crtc->write(space, bitswap<4>(offset, 5, 4, 1, 0), data);
+}
+
+READ8_MEMBER(tv912_state::keyboard_r)
+{
+ u8 result = 0xff;
+
+ if (!BIT(m_sw2->read(), 0))
+ result &= 0x7f;
+
+ return result;
+}
+
+WRITE8_MEMBER(tv912_state::output_40c)
+{
+ // Bit 5: +FORCE BLANK
+ // Bit 4: +SEL LPT
+ // Bit 3: -BREAK
+ // Bit 2: -RQS
+ // Bit 1: +BEEP
+
+ // Bit 0: +PG SEL
+ m_dispram_bank->set_entry(BIT(data, 0));
}
u32 tv912_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
@@ -83,14 +129,25 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bank_map, 0, 8, tv912_state )
AM_RANGE(0x000, 0x0ff) AM_MIRROR(0x300) AM_RAM
- //AM_RANGE(0x400, 0x403) AM_MIRROR(0x3c0) AM_SELECT(0x030) AM_READWRITE(crtc_r, crtc_w)
+ AM_RANGE(0x400, 0x403) AM_MIRROR(0x3c0) AM_SELECT(0x030) AM_READWRITE(crtc_r, crtc_w)
+ AM_RANGE(0x40c, 0x40f) AM_MIRROR(0x3f0) AM_READ(keyboard_r)
+ AM_RANGE(0x40c, 0x40c) AM_MIRROR(0x3f0) AM_WRITE(output_40c)
AM_RANGE(0x800, 0xfff) AM_RAMBANK("dispram")
ADDRESS_MAP_END
+static INPUT_PORTS_START( switches )
+ PORT_START("SW2")
+ PORT_DIPNAME(0x01, 0x01, "Refresh Rate") PORT_DIPLOCATION("S2:4")
+ PORT_DIPSETTING(0x00, "50 Hz")
+ PORT_DIPSETTING(0x01, "60 Hz")
+ADDRESS_MAP_END
+
static INPUT_PORTS_START( tv912b )
+ PORT_INCLUDE(switches)
INPUT_PORTS_END
static INPUT_PORTS_START( tv912c )
+ PORT_INCLUDE(switches)
INPUT_PORTS_END
MACHINE_CONFIG_START(tv912_state::tv912)
@@ -98,6 +155,7 @@ MACHINE_CONFIG_START(tv912_state::tv912)
MCFG_CPU_PROGRAM_MAP(prog_map)
MCFG_CPU_IO_MAP(io_map)
MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(tv912_state, p2_w))
+ MCFG_MCS48_PORT_T1_IN_CB(DEVREADLINE("crtc", tms9927_device, bl_r))
MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(bank_map)
@@ -108,6 +166,10 @@ MACHINE_CONFIG_START(tv912_state::tv912)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_23_814MHz, 105 * CHAR_WIDTH, 0, 80 * CHAR_WIDTH, 270, 0, 240)
MCFG_SCREEN_UPDATE_DRIVER(tv912_state, screen_update)
+
+ MCFG_DEVICE_ADD("crtc", TMS9927, XTAL_23_814MHz)
+ MCFG_TMS9927_CHAR_WIDTH(CHAR_WIDTH)
+ MCFG_TMS9927_VSYN_CALLBACK(INPUTLINE("maincpu", MCS48_INPUT_IRQ))
MACHINE_CONFIG_END
/**************************************************************************************************************