diff options
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 |
commit | 90e2a51097e4eba4a37520f982bf8de4381816af (patch) | |
tree | b6a0d1a11c0a9064a27f1cd5b863aa48fc49d827 /src/mame | |
parent | a71285fbbb45dd9bcfafffea4f42450224838b35 (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.cpp | 83 |
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) } |