From 15eab04d0fb84f5855263a70e2c6e1b588e67f81 Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Thu, 20 Dec 2018 12:41:36 +0100 Subject: mupid2: Meat to the bones - Add SIO to memory map - Improve ROM/RAM mapping and banking - Add periodic NMI - Add palette (16 fixed colors + 16 out of 4096) --- src/mame/drivers/mupid2.cpp | 137 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 130 insertions(+), 7 deletions(-) diff --git a/src/mame/drivers/mupid2.cpp b/src/mame/drivers/mupid2.cpp index a884380e8f2..b8101c119c2 100644 --- a/src/mame/drivers/mupid2.cpp +++ b/src/mame/drivers/mupid2.cpp @@ -17,7 +17,10 @@ #include "cpu/z80/z80.h" #include "cpu/mcs48/mcs48.h" #include "machine/adc0808.h" +#include "machine/ram.h" +#include "machine/timer.h" #include "machine/z80sio.h" +#include "emupal.h" //************************************************************************** @@ -30,23 +33,42 @@ public: mupid2_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_kbdcpu(*this, "kbdcpu") + m_kbdcpu(*this, "kbdcpu"), + m_ram(*this, "ram"), + m_rombank(*this, "rombank"), + m_rambank(*this, "rambank"), + m_palette(*this, "palette") { } - void c2a2(machine_config &config); + void c2a2(machine_config &config); + +protected: + virtual void machine_start() override; private: + TIMER_DEVICE_CALLBACK_MEMBER(nmi); + DECLARE_WRITE8_MEMBER(port_a0_w); + DECLARE_WRITE8_MEMBER(port_c0_w); + template DECLARE_WRITE8_MEMBER(palette_w); DECLARE_READ8_MEMBER(kbd_bus_r); DECLARE_READ8_MEMBER(kbd_p1_r); DECLARE_WRITE8_MEMBER(kbd_p1_w); DECLARE_WRITE8_MEMBER(kbd_p2_w); + void palette_init(palette_device &palette); + required_device m_maincpu; required_device m_kbdcpu; + required_device m_ram; + required_memory_bank m_rombank; + required_memory_bank m_rambank; + required_device m_palette; void maincpu_mem(address_map &map); void maincpu_io(address_map &map); void kbdcpu_mem(address_map &map); + + std::unique_ptr[]> m_color_ram; }; @@ -57,14 +79,20 @@ private: void mupid2_state::maincpu_mem(address_map &map) { map(0x0000, 0x3fff).rom(); - map(0x4000, 0xffff).ram(); + map(0x4000, 0x5fff).bankr(m_rombank); + map(0x6000, 0x7fff).ram(); + map(0x8000, 0xffff).bankrw(m_rambank); } void mupid2_state::maincpu_io(address_map &map) { map.global_mask(0xff); -// map(0xa0, 0xa0) -// map(0xc0, 0xc0) + map(0x00, 0x03).rw("sio", FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w)); + map(0xa0, 0xa0).w(FUNC(mupid2_state::port_a0_w)); + map(0xc0, 0xc0).w(FUNC(mupid2_state::port_c0_w)); + map(0xe0, 0xe0).w(FUNC(mupid2_state::palette_w<0>)); + map(0xe8, 0xe8).w(FUNC(mupid2_state::palette_w<1>)); + map(0xf0, 0xf0).w(FUNC(mupid2_state::palette_w<2>)); } void mupid2_state::kbdcpu_mem(address_map &map) @@ -103,6 +131,91 @@ WRITE8_MEMBER(mupid2_state::kbd_p2_w) } +//************************************************************************** +// VIDEO +//************************************************************************** + +void mupid2_state::palette_init(palette_device &palette) +{ + // first 16 colors are fixed (arbitrary, colors unknown) + for (int i = 0; i < 16; i++) + { + int r = (i >> 0) & 1; + int g = (i >> 1) & 1; + int b = (i >> 2) & 3; + palette.set_pen_color(i, rgb_t(pal1bit(r), pal1bit(g), pal2bit(b))); + } +} + +template +WRITE8_MEMBER(mupid2_state::palette_w) +{ + int i = data & 0x0f; + m_color_ram[i][C] = data >> 4; + m_palette->set_pen_color(16 + i, rgb_t( + pal4bit(m_color_ram[i][0]), + pal4bit(m_color_ram[i][1]), + pal4bit(m_color_ram[i][2]) + )); +} + + +//************************************************************************** +// MACHINE +//************************************************************************** + +void mupid2_state::machine_start() +{ + // additional rom space + m_rombank->configure_entries(0, 4, memregion("maincpu")->base() + 0x4000, 0x2000); + m_rombank->set_entry(0); + + // 128k memory + m_rambank->configure_entries(0, 4, m_ram->pointer(), 0x8000); + m_rambank->set_entry(0); + + // allocate space for colors + m_color_ram = make_unique_clear[]>(16); + + // register for save states + save_pointer(NAME(m_color_ram), 16); +} + +TIMER_DEVICE_CALLBACK_MEMBER(mupid2_state::nmi) +{ + m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); +} + +WRITE8_MEMBER(mupid2_state::port_a0_w) +{ + logerror("port_a0_w: %02x\n", data); + + // 7------- unknown + // -6------ unknown + // --5----- unknown + // ---4---- unknown + // ----3--- unknown + // -----2-- unknown + // ------1- unknown + // -------0 unknown +} + +WRITE8_MEMBER(mupid2_state::port_c0_w) +{ + logerror("port_c0_w: %02x\n", data); + + // 7------- unknown + // -6------ unknown + // --5----- unknown + // ---4---- unknown + // ----32-- ram bank? + // ------1- unknown + // -------0 unknown + + m_rambank->set_entry((data >> 2) & 0x03); +} + + //************************************************************************** // MACHINE DEFINITIONS //************************************************************************** @@ -113,6 +226,11 @@ void mupid2_state::c2a2(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &mupid2_state::maincpu_mem); m_maincpu->set_addrmap(AS_IO, &mupid2_state::maincpu_io); + RAM(config, m_ram).set_default_size("128K"); + + // timing unknown + TIMER(config, "nmi_timer").configure_periodic(FUNC(mupid2_state::nmi), attotime::from_hz(5000)); + Z80SIO(config, "sio", 4000000); I8035(config, m_kbdcpu, 4000000); @@ -123,6 +241,9 @@ void mupid2_state::c2a2(machine_config &config) m_kbdcpu->p2_out_cb().set(FUNC(mupid2_state::kbd_p2_w)); M58990(config, "adc", 1000000); + + PALETTE(config, m_palette, 32); + m_palette->set_init(DEVICE_SELF, FUNC(mupid2_state::palette_init)); } @@ -131,9 +252,10 @@ void mupid2_state::c2a2(machine_config &config) //************************************************************************** ROM_START( mupid2 ) - ROM_REGION(0x8000, "maincpu", 0) + ROM_REGION(0xc000, "maincpu", 0) ROM_LOAD("0090.7012.40.02_27.09.85.u40", 0x0000, 0x4000, CRC(0b320f46) SHA1(064e1b1697b9b767f89be7c1e3d20e1157324791)) ROM_LOAD("0090.7012.39.02_27.09.85.u39", 0x4000, 0x4000, CRC(b2fb634c) SHA1(70ced48d0a27a661ddd7fbc529a891bd0bcec926)) + ROM_RELOAD(0x8000, 0x4000) ROM_REGION(0x800, "kbdcpu", 0) ROM_LOAD("motronic_0090.6820.06.00", 0x000, 0x400, CRC(78b6d827) SHA1(200f2b33c518a889f8c6a5f4dd4443ac76884b21)) @@ -151,9 +273,10 @@ ROM_START( mupid2i ) ROM_END ROM_START( ptc100 ) - ROM_REGION(0x8000, "maincpu", 0) + ROM_REGION(0xc000, "maincpu", 0) ROM_LOAD("mup.u40", 0x0000, 0x4000, CRC(b4ac8ccb) SHA1(01bc818ec571d099176b6f69aaa736bb5410dd8e)) ROM_LOAD("mup.u39", 0x4000, 0x4000, CRC(9812fefc) SHA1(bb4e69eba504dae6065094d9668be2b0478b0433)) + ROM_RELOAD(0x8000, 0x4000) ROM_REGION(0x800, "kbdcpu", 0) ROM_LOAD("kbc.bin", 0x000, 0x400, CRC(72502f02) SHA1(4adb5c55691e1c53a3364d97e64d194be4886b52)) -- cgit v1.2.3