summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-11-14 21:51:30 -0500
committer AJR <ajrhacker@users.noreply.github.com>2019-11-14 21:52:16 -0500
commit90e2a51097e4eba4a37520f982bf8de4381816af (patch)
treeb6a0d1a11c0a9064a27f1cd5b863aa48fc49d827 /src/mame
parenta71285fbbb45dd9bcfafffea4f42450224838b35 (diff)
mtd1256: Improve banking; add preliminary LCD display (nw)
hd44780: Make initialization procedure slightly less strict than datasheet implies (nw)
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/mtd1256.cpp83
1 files changed, 72 insertions, 11 deletions
diff --git a/src/mame/drivers/mtd1256.cpp b/src/mame/drivers/mtd1256.cpp
index 95864efc3fe..fdc73e30185 100644
--- a/src/mame/drivers/mtd1256.cpp
+++ b/src/mame/drivers/mtd1256.cpp
@@ -14,7 +14,9 @@
#include "machine/mm58274c.h"
#include "machine/mm74c922.h"
//#include "machine/nvram.h"
-//#include "screen.h"
+#include "video/hd44780.h"
+#include "emupal.h"
+#include "screen.h"
class mtd1256_state : public driver_device
{
@@ -23,12 +25,21 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_bank0(*this, "bank0")
+ , m_encoder(*this, "encoder")
+ , m_bankreg(0)
+ , m_portd(0xff)
{
}
void mtd1256(machine_config &config);
+protected:
+ virtual void machine_start() override;
+
private:
+ HD44780_PIXEL_UPDATE(pixel_update);
+
+ u8 porta_r();
void portd_w(u8 data);
void bank0_map(address_map &map);
@@ -36,24 +47,60 @@ private:
required_device<mc68hc11_cpu_device> m_maincpu;
required_device<address_map_bank_device> m_bank0;
+ required_device<mm74c923_device> m_encoder;
+
+ u8 m_bankreg;
+ u8 m_portd;
};
+void mtd1256_state::machine_start()
+{
+ save_item(NAME(m_bankreg));
+ save_item(NAME(m_portd));
+}
+
+HD44780_PIXEL_UPDATE(mtd1256_state::pixel_update)
+{
+ // Is this the right layout?
+ if (pos < 20)
+ bitmap.pix16(line * 16 + y, pos * 6 + x) = state;
+ else if (pos < 40)
+ bitmap.pix16(line * 16 + 8 + y, (pos - 20) * 6 + x) = state;
+}
+
+
+u8 mtd1256_state::porta_r()
+{
+ // FIXME: bit 2 should be ICL7109 busy output
+ return m_encoder->da_r() | (machine().rand() & 0x04);
+}
void mtd1256_state::portd_w(u8 data)
{
- m_bank0->set_bank(BIT(data, 5));
+ if (!BIT(m_portd, 4) && BIT(data, 4))
+ m_bankreg = (m_bankreg << 1) | BIT(data, 5);
+
+ m_bank0->set_bank(BIT(data, 5) ? m_bankreg : 0);
+
+ m_portd = data;
}
void mtd1256_state::bank0_map(address_map &map)
{
- map(0x0000, 0x0fff).ram();
- map(0x1000, 0x100f).rw("rtc", FUNC(mm58274c_device::read), FUNC(mm58274c_device::write));
+ map(0x000000, 0x007fff).ram();
+ map(0x040000, 0x047fff).ram();
+ map(0x080000, 0x087fff).ram();
+ map(0x0c0000, 0x0c000f).rw("rtc", FUNC(mm58274c_device::read), FUNC(mm58274c_device::write));
+ map(0x0c0020, 0x0c0020).nopw();
+ map(0x100000, 0x100000).r(m_encoder, FUNC(mm74c922_device::read));
+ map(0x100020, 0x100021).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write));
+ map(0x180000, 0x187fff).ram();
+ map(0x1c0000, 0x1dffff).ram();
}
void mtd1256_state::mem_map(address_map &map)
{
- map(0x0000, 0x0fff).m(m_bank0, FUNC(address_map_bank_device::amap8));
- map(0x1000, 0x1fff).ram();
+ map(0x0000, 0x1fff).m(m_bank0, FUNC(address_map_bank_device::amap8));
map(0x2000, 0xffff).rom().region("program", 0x2000); // partly overlaid by internal spaces
}
@@ -65,22 +112,36 @@ void mtd1256_state::mtd1256(machine_config &config)
{
MC68HC11A1(config, m_maincpu, 1.8432_MHz_XTAL); // yes, this appears to be the CPU XTAL
m_maincpu->set_addrmap(AS_PROGRAM, &mtd1256_state::mem_map);
+ m_maincpu->in_pa_callback().set(FUNC(mtd1256_state::porta_r));
m_maincpu->out_pd_callback().set(FUNC(mtd1256_state::portd_w));
ADDRESS_MAP_BANK(config, m_bank0);
m_bank0->set_addrmap(0, &mtd1256_state::bank0_map);
m_bank0->set_data_width(8);
m_bank0->set_endianness(ENDIANNESS_BIG);
- m_bank0->set_addr_width(13);
- m_bank0->set_stride(0x1000);
+ m_bank0->set_addr_width(21);
+ m_bank0->set_stride(0x2000);
+
+ // TODO: NVRAM is 4x NEC µPD431000AGW-70L 128Kx8 SRAMs + 3V lithium battery
MM58274C(config, "rtc", 32.768_kHz_XTAL); // TODO: 1 second interrupt output configured
- MM74C923(config, "encoder", 0); // timing parameters unknown
+ MM74C923(config, m_encoder, 0); // timing parameters unknown
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(50);
+ screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
+ screen.set_size(20*6, 32);
+ screen.set_visarea(0, 20*6-1, 0, 32-1);
+ screen.set_palette("palette");
+
+ hd44780_device &hd44780(HD44780(config, "lcdc"));
+ hd44780.set_lcd_size(2, 16);
+ hd44780.set_pixel_update_cb(FUNC(mtd1256_state::pixel_update));
+
+ PALETTE(config, "palette").set_entries(2);
- // TODO: add 4x NEC µPD431000AGW-70L 128Kx8 SRAMs + 3V lithium battery
// TODO: add Maxim ICL7109CQH 12-bit A/D converter
- // TODO: add STN LCD panel
// TODO: add RS232 port (through ADM202JRW)
}