summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-02-03 13:12:12 -0500
committer AJR <ajrhacker@users.noreply.github.com>2019-02-03 13:13:30 -0500
commit44f375b47d7f750ff5eb8f249eeb066291796738 (patch)
tree366ece3e1bc16d1ae57cb86546a00998f740f239
parent3cc0f27d8951c3aebc5d43d22862f8f812c8b167 (diff)
Add skeleton CRT9028 device (nw)
-rw-r--r--scripts/src/video.lua12
-rw-r--r--scripts/target/mame/arcade.lua1
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/video/crt9028.cpp220
-rw-r--r--src/devices/video/crt9028.h127
-rw-r--r--src/mame/drivers/cardinal.cpp33
6 files changed, 377 insertions, 17 deletions
diff --git a/scripts/src/video.lua b/scripts/src/video.lua
index 3f78a2a154a..3508f260eff 100644
--- a/scripts/src/video.lua
+++ b/scripts/src/video.lua
@@ -115,6 +115,18 @@ end
--------------------------------------------------
--
+--@src/devices/video/crt9028.h,VIDEOS["CRT9028"] = true
+--------------------------------------------------
+
+if (VIDEOS["CRT9028"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/video/crt9028.cpp",
+ MAME_DIR .. "src/devices/video/crt9028.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/devices/video/crt9212.h,VIDEOS["CRT9212"] = true
--------------------------------------------------
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index e4c869bcce5..5466a7607ea 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -285,6 +285,7 @@ VIDEOS["BUFSPRITE"] = true
VIDEOS["CESBLIT"] = true
--VIDEOS["CRT9007"] = true
--VIDEOS["CRT9021"] = true
+--VIDEOS["CRT9028"] = true
--VIDEOS["CRT9212"] = true
VIDEOS["CRTC_EGA"] = true
--VIDEOS["DL1416"] = true
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index acc06d6625a..f3bd95d3a5a 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -297,6 +297,7 @@ VIDEOS["CDP1862"] = true
--VIDEOS["CESBLIT"] = true
VIDEOS["CRT9007"] = true
VIDEOS["CRT9021"] = true
+VIDEOS["CRT9028"] = true
VIDEOS["CRT9212"] = true
VIDEOS["CRTC_EGA"] = true
VIDEOS["DL1416"] = true
diff --git a/src/devices/video/crt9028.cpp b/src/devices/video/crt9028.cpp
new file mode 100644
index 00000000000..342449a54d5
--- /dev/null
+++ b/src/devices/video/crt9028.cpp
@@ -0,0 +1,220 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/**********************************************************************
+
+ Standard Microsystems CRT9028/9128 Video Terminal Logic Controller
+
+ The CRT 9028 and CRT 9128 are single-chip terminal-oriented video
+ processors. The two differ from each other in their bus protocol
+ for accessing the address, data and status registers: the 9028 has
+ separate RD and WR strobes for an 8051 or similar microcontroller,
+ while the 9128 replaces these with DS and R/W inputs that are more
+ Z8-oriented. A separate address/data bus connects to a 2Kx8 static
+ RAM or similar as display memory.
+
+ The internal 128-character set is mask-programmed, as are all
+ screen timings, with alternate vertical timings to allow operation
+ at either 60 Hz or 50 Hz. Mask parameters also determine the
+ polarity of the sync signals, the positioning of the underline
+ attribute and cursor and the dot patterns used for 6-segment wide
+ (block) graphics and 4-segment thin (line) graphics.
+
+ TODO: implement timing and display functions
+
+**********************************************************************/
+
+#include "emu.h"
+#include "video/crt9028.h"
+#include "screen.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(CRT9028_000, crt9028_000_device, "crt9028_000", "CRT9028-000 VTLC")
+
+//**************************************************************************
+// DEVICE IMPLEMENTATION
+//**************************************************************************
+
+//-------------------------------------------------
+// crt9028_device - constructor
+//-------------------------------------------------
+
+crt9028_device::crt9028_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock,
+ int dots_per_char, int chars_per_row, int horiz_blanking, int hsync_delay, int hsync_width, bool hsync_active,
+ int char_rows, int scans_per_char, bool vsync_active,
+ int vert_blanking, int vsync_delay, bool vsync_width,
+ int alt_vert_blanking, int alt_vsync_delay, bool alt_vsync_width,
+ int csync_delay, int csync_width, int underline,
+ u16 wide_gfx_seg1_4, u16 wide_gfx_seg2_5, u16 wide_gfx_seg3_6, u8 wide_gfx_pattern,
+ u16 thin_gfx_seg1, u16 thin_gfx_seg2, u16 thin_gfx_seg3, u16 thin_gfx_seg4,
+ u8 thin_gfx_dots1, u8 thin_gfx_dots2, u8 thin_gfx_dots3, u8 thin_gfx_dots4)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_memory_interface(mconfig, *this)
+ , device_video_interface(mconfig, *this)
+ , m_space_config("charram", ENDIANNESS_LITTLE, 8, 11, 0)
+ , m_charset(*this, "charset")
+ , m_hsync_callback(*this)
+ , m_vsync_callback(*this)
+ , m_dots_per_char(dots_per_char)
+ , m_chars_per_row(chars_per_row)
+ , m_horiz_blanking(horiz_blanking)
+ , m_hsync_delay(hsync_delay)
+ , m_hsync_width(hsync_width)
+ , m_hsync_active(hsync_active)
+ , m_char_rows(char_rows)
+ , m_scans_per_char(scans_per_char)
+ , m_vsync_active(vsync_active)
+ , m_vert_blanking{vert_blanking, alt_vert_blanking}
+ , m_vsync_delay{vsync_delay, alt_vsync_delay}
+ , m_vsync_width{vsync_width, alt_vsync_width}
+ , m_csync_delay(csync_delay)
+ , m_csync_width(csync_width)
+ , m_underline(underline)
+ , m_wide_gfx_seg{wide_gfx_seg1_4, wide_gfx_seg2_5, wide_gfx_seg3_6}
+ , m_wide_gfx_pattern(wide_gfx_pattern)
+ , m_thin_gfx_seg{thin_gfx_seg1, thin_gfx_seg2, thin_gfx_seg3, thin_gfx_seg4}
+ , m_thin_gfx_dots{thin_gfx_dots1, thin_gfx_dots2, thin_gfx_dots3, thin_gfx_dots4}
+{
+ // Mostly unused now
+ (void)m_hsync_delay;
+ (void)m_hsync_width;
+ (void)m_hsync_active;
+ (void)m_vsync_active;
+ (void)m_vsync_delay;
+ (void)m_vsync_width;
+ (void)m_csync_delay;
+ (void)m_csync_width;
+ (void)m_underline;
+ (void)m_wide_gfx_seg;
+ (void)m_wide_gfx_pattern;
+ (void)m_thin_gfx_seg;
+ (void)m_thin_gfx_dots;
+}
+
+
+//-------------------------------------------------
+// crt9028_000_device - constructor
+//-------------------------------------------------
+
+crt9028_000_device::crt9028_000_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : crt9028_device(mconfig, CRT9028_000, tag, owner, clock,
+ 7, 80, 20, 4, 8, false,
+ 24, 10, false,
+ 20, 4, 8,
+ 72, 30, 10,
+ 2, 8, 9,
+ 0x3c0, 0x038, 0x007, 0x0f,
+ 0x3e0, 0x020, 0x03f, 0x020,
+ 0x10, 0xff, 0x10, 0xff)
+{
+}
+
+
+//-------------------------------------------------
+// device_config_complete - finalise device
+// configuration
+//-------------------------------------------------
+
+void crt9028_device::device_config_complete()
+{
+ if (!has_screen())
+ return;
+
+ if (screen().refresh_attoseconds() == 0)
+ {
+ int visible_scan_lines = m_char_rows * m_scans_per_char;
+ screen().set_raw(clock(), m_dots_per_char * (m_chars_per_row + m_horiz_blanking), 0, m_dots_per_char * m_chars_per_row,
+ visible_scan_lines + m_vert_blanking[0], 0, visible_scan_lines);
+ }
+
+ if (!screen().has_screen_update())
+ screen().set_screen_update(screen_update_rgb32_delegate(FUNC(crt9028_device::screen_update), this));
+}
+
+
+//-------------------------------------------------
+// memory_space_config - return the configuration
+// for the address spaces
+//-------------------------------------------------
+
+device_memory_interface::space_config_vector crt9028_device::memory_space_config() const
+{
+ return space_config_vector{std::make_pair(0, &m_space_config)};
+}
+
+
+//-------------------------------------------------
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
+//-------------------------------------------------
+
+void crt9028_device::device_resolve_objects()
+{
+ m_hsync_callback.resolve_safe();
+ m_vsync_callback.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void crt9028_device::device_start()
+{
+ m_space = &space(0);
+}
+
+
+//-------------------------------------------------
+// screen_update - screen update method
+//-------------------------------------------------
+
+u32 crt9028_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+
+//-------------------------------------------------
+// read - read from data or status register
+//-------------------------------------------------
+
+u8 crt9028_device::read(offs_t offset)
+{
+ return 0xff;
+}
+
+
+//-------------------------------------------------
+// write - write to data or address register
+//-------------------------------------------------
+
+void crt9028_device::write(offs_t offset, u8 data)
+{
+ logerror("%s: Writing %02X to %s register\n", machine().describe_context(), data, BIT(offset, 0) ? "address" : "data");
+}
+
+
+//**************************************************************************
+// INTERNAL ROM
+//**************************************************************************
+
+ROM_START(crt9028_000)
+ ROM_REGION(0x400, "charset", 0)
+ ROM_LOAD("crt9028_000.bin", 0x000, 0x400, NO_DUMP)
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - return a pointer to the implicit
+// rom region description for this device
+//-------------------------------------------------
+
+const tiny_rom_entry *crt9028_000_device::device_rom_region() const
+{
+ return ROM_NAME(crt9028_000);
+}
diff --git a/src/devices/video/crt9028.h b/src/devices/video/crt9028.h
new file mode 100644
index 00000000000..229314045be
--- /dev/null
+++ b/src/devices/video/crt9028.h
@@ -0,0 +1,127 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/**********************************************************************
+
+ Standard Microsystems CRT9028/9128 Video Terminal Logic Controller
+
+***********************************************************************
+ _____ _____
+ DA8 1 |* \__/ | 40 DA7
+ DA9 2 | | 39 DA6
+ DA10 3 | | 38 DA5
+ GND 4 | | 37 DA4
+ XTAL2 5 | | 36 DA3
+ XTAL1 6 | | 35 DA2
+ /VIDEO 7 | | 34 DA1
+ INTOUT 8 | | 33 DA0
+ /DWR 9 | | 32 DB7
+ DD0 10 | CRT 9028 | 31 DB6
+ DD1 11 | CRT 9128 | 30 DB5
+ DD2 12 | | 29 DB4
+ DD3 13 | | 28 DB3
+ DD4 14 | | 27 DB2
+ DD5 15 | | 26 DB1
+ DD6 16 | | 25 DB0
+ DD7 17 | | 24 A/D
+ HSYNC 18 | | 23 /RD or /DS
+ VSYNC 19 | | 22 /WR or R/W
+ CSYNC 20 |______________| 21 VCC
+
+**********************************************************************/
+
+#ifndef MAME_VIDEO_CRT9028_H
+#define MAME_VIDEO_CRT9028_H
+
+#pragma once
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> crt9028_device
+
+class crt9028_device : public device_t, public device_memory_interface, public device_video_interface
+{
+public:
+ // device configuration
+ auto hsync_callback() { return m_hsync_callback.bind(); }
+ auto vsync_callback() { return m_hsync_callback.bind(); }
+
+ // read/write handlers
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
+
+ // screen update method
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+protected:
+ // base type constructor
+ crt9028_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock,
+ int dots_per_char, int chars_per_row, int horiz_blanking, int hsync_delay, int hsync_width, bool hsync_active,
+ int char_rows, int scans_per_char, bool vsync_active,
+ int vert_blanking, int vsync_delay, bool vsync_width,
+ int alt_vert_blanking, int alt_vsync_delay, bool alt_vsync_width,
+ int csync_delay, int csync_width, int underline,
+ u16 wide_gfx_seg1_4, u16 wide_gfx_seg2_5, u16 wide_gfx_seg3_6, u8 wide_gfx_pattern,
+ u16 thin_gfx_seg1, u16 thin_gfx_seg2, u16 thin_gfx_seg3, u16 thin_gfx_seg4,
+ u8 thin_gfx_dots1, u8 thin_gfx_dots2, u8 thin_gfx_dots3, u8 thin_gfx_dots4);
+
+ // device-specific overrides
+ virtual void device_config_complete() override;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+
+private:
+ // address space for display memory
+ const address_space_config m_space_config;
+ address_space *m_space;
+
+ // internal character set
+ required_region_ptr<u8> m_charset;
+
+ // timing callbacks
+ devcb_write_line m_hsync_callback;
+ devcb_write_line m_vsync_callback;
+
+ // mask parameters
+ const int m_dots_per_char;
+ const int m_chars_per_row;
+ const int m_horiz_blanking;
+ const int m_hsync_delay;
+ const int m_hsync_width;
+ const bool m_hsync_active;
+ const int m_char_rows;
+ const int m_scans_per_char;
+ const bool m_vsync_active;
+ const int m_vert_blanking[2];
+ const int m_vsync_delay[2];
+ const int m_vsync_width[2];
+ const int m_csync_delay;
+ const int m_csync_width;
+ const int m_underline;
+ const u16 m_wide_gfx_seg[3];
+ const u8 m_wide_gfx_pattern;
+ const u16 m_thin_gfx_seg[4];
+ const u8 m_thin_gfx_dots[4];
+};
+
+// ======================> crt9028_000_device
+
+class crt9028_000_device : public crt9028_device
+{
+public:
+ // device constructor
+ crt9028_000_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-specific overrides
+ virtual const tiny_rom_entry *device_rom_region() const;
+};
+
+// device type declarations
+DECLARE_DEVICE_TYPE(CRT9028_000, crt9028_000_device)
+
+#endif // MAME_VIDEO_CRT9028_H
diff --git a/src/mame/drivers/cardinal.cpp b/src/mame/drivers/cardinal.cpp
index 36d553e1545..30890c3299f 100644
--- a/src/mame/drivers/cardinal.cpp
+++ b/src/mame/drivers/cardinal.cpp
@@ -19,7 +19,7 @@
#include "bus/rs232/rs232.h"
#include "machine/eepromser.h"
#include "sound/spkrdev.h"
-//#include "video/crt9028.h"
+#include "video/crt9028.h"
#include "screen.h"
#include "speaker.h"
@@ -29,6 +29,7 @@ public:
cardinal_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_eeprom(*this, "eeprom")
+ , m_vtlc(*this, "vtlc")
, m_speaker(*this, "speaker")
, m_rs232(*this, "rs232")
, m_address_select(false)
@@ -41,8 +42,6 @@ protected:
virtual void machine_start() override;
private:
- u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
-
u8 p1_r();
void p1_w(u8 data);
@@ -51,9 +50,10 @@ private:
void prog_map(address_map &map);
void ext_map(address_map &map);
+ void ram_map(address_map &map);
required_device<eeprom_serial_93cxx_device> m_eeprom;
- //required_device<crt9028_device> m_vtlc;
+ required_device<crt9028_device> m_vtlc;
required_device<speaker_sound_device> m_speaker;
required_device<rs232_port_device> m_rs232;
@@ -66,11 +66,6 @@ void cardinal_state::machine_start()
save_item(NAME(m_address_select));
}
-u32 cardinal_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- return 0;
-}
-
u8 cardinal_state::p1_r()
{
return 0x9f | (m_eeprom->do_read() << 5) | (0 /*m_rs232->cts_r()*/ << 6);
@@ -90,12 +85,12 @@ void cardinal_state::p1_w(u8 data)
u8 cardinal_state::vtlc_r()
{
- return 0xff;
+ return m_vtlc->read(m_address_select);
}
void cardinal_state::vtlc_w(u8 data)
{
- logerror("%s: Writing %02X to CRT9028 %s register\n", machine().describe_context(), data, m_address_select ? "address" : "data");
+ m_vtlc->write(m_address_select, data);
}
void cardinal_state::prog_map(address_map &map)
@@ -108,6 +103,11 @@ void cardinal_state::ext_map(address_map &map)
map(0, 0).mirror(0xffff).rw(FUNC(cardinal_state::vtlc_r), FUNC(cardinal_state::vtlc_w));
}
+void cardinal_state::ram_map(address_map &map)
+{
+ map(0x000, 0x7ff).ram();
+}
+
static INPUT_PORTS_START(cardinal)
PORT_START("P3")
@@ -133,13 +133,12 @@ void cardinal_state::cardinal(machine_config &config)
EEPROM_93C06_16BIT(config, m_eeprom);
- //CRT9028_000(config, m_vtlc, 10.92_MHz_XTAL);
- //m_vtlc->set_screen("screen");
- //m_vtlc->vsync_callback().set_inputline("maincpu", MCS51_INT0_LINE);
+ CRT9028_000(config, m_vtlc, 10.92_MHz_XTAL);
+ m_vtlc->set_screen("screen");
+ m_vtlc->set_addrmap(0, &cardinal_state::ram_map);
+ m_vtlc->vsync_callback().set_inputline("maincpu", MCS51_INT0_LINE).invert();
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_raw(10.92_MHz_XTAL, 700, 0, 560, 260, 0, 240);
- screen.set_screen_update(FUNC(cardinal_state::screen_update));
+ SCREEN(config, "screen", SCREEN_TYPE_RASTER);
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.05);