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)
This commit is contained in:
Dirk Best 2018-12-20 12:41:36 +01:00
parent 7ba9c79cdd
commit 15eab04d0f

View File

@ -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<int C> 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<cpu_device> m_maincpu;
required_device<i8035_device> m_kbdcpu;
required_device<ram_device> m_ram;
required_memory_bank m_rombank;
required_memory_bank m_rambank;
required_device<palette_device> m_palette;
void maincpu_mem(address_map &map);
void maincpu_io(address_map &map);
void kbdcpu_mem(address_map &map);
std::unique_ptr<std::array<uint8_t, 3>[]> 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<int C>
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<std::array<uint8_t, 3>[]>(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))