summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2020-10-21 21:18:07 -0400
committer AJR <ajrhacker@users.noreply.github.com>2020-10-21 21:18:07 -0400
commita63bc543aad058326bf6c18a9486ca56717f95da (patch)
treee34e8c4160ed2c5a1687d8e5dd77a2eabfe8513d
parent5a545f9d9a22872b9e755a0802b548d1c9de8dd4 (diff)
emax.cpp: Add some peripherals
-rw-r--r--src/mame/drivers/emax.cpp124
1 files changed, 102 insertions, 22 deletions
diff --git a/src/mame/drivers/emax.cpp b/src/mame/drivers/emax.cpp
index c08718c9646..fefad123da5 100644
--- a/src/mame/drivers/emax.cpp
+++ b/src/mame/drivers/emax.cpp
@@ -10,6 +10,8 @@
#include "cpu/ns32000/ns32000.h"
#include "machine/6850acia.h"
#include "machine/eepromser.h"
+#include "machine/pit8253.h"
+#include "machine/wd_fdc.h"
#include "video/hd44780.h"
#include "emupal.h"
#include "screen.h"
@@ -20,6 +22,8 @@ public:
emax_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_ctc(*this, "ctc")
+ , m_fdc(*this, "fdc")
, m_lcdc(*this, "lcdc")
{
}
@@ -31,13 +35,21 @@ public:
private:
HD44780_PIXEL_UPDATE(pixel_update);
+ u8 timer_r(offs_t offset);
+ void timer_w(offs_t offset, u8 data);
+ void mux_w(u8 data);
+ void dac_w(u8 data);
+
void palette_init(palette_device &palette);
+ void emax_periphs(address_map &map);
void emax_map(address_map &map);
void emaxp_map(address_map &map);
void emax2_map(address_map &map);
required_device<cpu_device> m_maincpu;
+ required_device<pit8254_device> m_ctc;
+ required_device<wd1772_device> m_fdc;
required_device<hd44780_device> m_lcdc;
};
@@ -48,18 +60,55 @@ HD44780_PIXEL_UPDATE(emax_state::pixel_update)
}
-void emax_state::emax_map(address_map &map)
+u8 emax_state::timer_r(offs_t offset)
{
- map(0x000000, 0x000fff).rom().region("bootprom", 0);
- map(0x008100, 0x0081ff).ram();
- map(0x010000, 0x017fff).ram();
- map(0x822400, 0x822400).nopr();
- map(0x824004, 0x824004).nopw();
- map(0x824006, 0x824006).nopw();
+ return m_ctc->read(offset >> 1);
+}
+
+void emax_state::timer_w(offs_t offset, u8 data)
+{
+ m_ctc->write(offset >> 1, data);
+}
+
+void emax_state::mux_w(u8 data)
+{
+}
+
+void emax_state::dac_w(u8 data)
+{
+}
+
+void emax_state::emax_periphs(address_map &map)
+{
+ map(0x2c0000, 0x2c0000).select(6).rw(FUNC(emax_state::timer_r), FUNC(emax_state::timer_w));
+ map(0x818048, 0x818048).w("acia", FUNC(acia6850_device::control_w));
+ map(0x81804a, 0x81804a).r("acia", FUNC(acia6850_device::status_r));
+ map(0x81804c, 0x81804c).w("acia", FUNC(acia6850_device::data_w));
+ map(0x81804e, 0x81804e).r("acia", FUNC(acia6850_device::data_r));
+ map(0x822000, 0x822000).w(m_fdc, FUNC(wd1772_device::cmd_w));
+ map(0x822400, 0x822400).r(m_fdc, FUNC(wd1772_device::status_r));
+ map(0x822800, 0x822800).w(m_fdc, FUNC(wd1772_device::track_w));
+ map(0x822c00, 0x822c00).r(m_fdc, FUNC(wd1772_device::track_r));
+ map(0x823000, 0x823000).w(m_fdc, FUNC(wd1772_device::sector_w));
+ map(0x823400, 0x823400).r(m_fdc, FUNC(wd1772_device::sector_r));
+ map(0x823800, 0x823800).w(m_fdc, FUNC(wd1772_device::data_w));
+ map(0x823c00, 0x823c00).r(m_fdc, FUNC(wd1772_device::data_r));
+ map(0x824004, 0x824004).w(FUNC(emax_state::mux_w));
+ map(0x824006, 0x824006).w(FUNC(emax_state::dac_w));
map(0x890000, 0x890000).w(m_lcdc, FUNC(hd44780_device::control_w));
map(0x890002, 0x890002).r(m_lcdc, FUNC(hd44780_device::control_r));
map(0x890004, 0x890004).w(m_lcdc, FUNC(hd44780_device::data_w));
map(0x890006, 0x890006).r(m_lcdc, FUNC(hd44780_device::data_r));
+ //map(0xaa2000, 0xaa2000).select(0x800).w(FUNC(emax_state::echip_w));
+ //map(0xaa2400, 0xaa2400).select(0x800).r(FUNC(emax_state::echip_r));
+}
+
+void emax_state::emax_map(address_map &map)
+{
+ map(0x000000, 0x000fff).rom().region("bootprom", 0);
+ map(0x008100, 0x0081ff).ram();
+ map(0x010000, 0x017fff).ram();
+ emax_periphs(map);
}
void emax_state::emaxp_map(address_map &map)
@@ -67,26 +116,35 @@ void emax_state::emaxp_map(address_map &map)
map(0x000000, 0x001fff).rom().region("bootprom", 0);
map(0x008100, 0x0081ff).ram();
map(0x010000, 0x017fff).ram();
- map(0x822400, 0x822400).nopr();
- map(0x824004, 0x824004).nopw();
- map(0x824006, 0x824006).nopw();
- map(0x890000, 0x890000).w(m_lcdc, FUNC(hd44780_device::control_w));
- map(0x890002, 0x890002).r(m_lcdc, FUNC(hd44780_device::control_r));
- map(0x890004, 0x890004).w(m_lcdc, FUNC(hd44780_device::data_w));
- map(0x890006, 0x890006).r(m_lcdc, FUNC(hd44780_device::data_r));
+ emax_periphs(map);
}
void emax_state::emax2_map(address_map &map)
{
map(0x000000, 0x003fff).rom().region("bootprom", 0);
map(0x008000, 0x01ffff).ram();
- map(0x0a8018, 0x0a801b).rw("acia", FUNC(acia6850_device::read), FUNC(acia6850_device::write)).umask16(0x00ff);
- map(0x0a801e, 0x0a801f).nopr();
+ map(0x0a8018, 0x0a8018).w("acia1", FUNC(acia6850_device::control_w));
+ map(0x0a801a, 0x0a801a).r("acia1", FUNC(acia6850_device::status_r));
+ map(0x0a801c, 0x0a801c).w("acia1", FUNC(acia6850_device::data_w));
+ map(0x0a801e, 0x0a801e).r("acia1", FUNC(acia6850_device::data_r));
+ map(0x0a8028, 0x0a8028).w("acia2", FUNC(acia6850_device::control_w));
+ map(0x0a802a, 0x0a802a).r("acia2", FUNC(acia6850_device::status_r));
+ map(0x0a802c, 0x0a802c).w("acia2", FUNC(acia6850_device::data_w));
+ map(0x0a802e, 0x0a802e).r("acia2", FUNC(acia6850_device::data_r));
map(0x0b0000, 0x0b0000).w(m_lcdc, FUNC(hd44780_device::control_w));
map(0x0b0002, 0x0b0002).r(m_lcdc, FUNC(hd44780_device::control_r));
map(0x0b0004, 0x0b0004).w(m_lcdc, FUNC(hd44780_device::data_w));
map(0x0b0006, 0x0b0006).r(m_lcdc, FUNC(hd44780_device::data_r));
+ map(0x3f8000, 0x3f8007).rw(m_ctc, FUNC(pit8254_device::read), FUNC(pit8254_device::write)).umask16(0x00ff);
map(0x8e8000, 0x8e82ff).ram();
+ map(0xae2000, 0xae2000).w(m_fdc, FUNC(wd1772_device::cmd_w));
+ map(0xae2400, 0xae2400).r(m_fdc, FUNC(wd1772_device::status_r));
+ map(0xae2800, 0xae2800).w(m_fdc, FUNC(wd1772_device::track_w));
+ map(0xae2c00, 0xae2c00).r(m_fdc, FUNC(wd1772_device::track_r));
+ map(0xae3000, 0xae3000).w(m_fdc, FUNC(wd1772_device::sector_w));
+ map(0xae3400, 0xae3400).r(m_fdc, FUNC(wd1772_device::sector_r));
+ map(0xae3800, 0xae3800).w(m_fdc, FUNC(wd1772_device::data_w));
+ map(0xae3c00, 0xae3c00).r(m_fdc, FUNC(wd1772_device::data_r));
}
@@ -104,9 +162,20 @@ void emax_state::palette_init(palette_device &palette)
void emax_state::emax(machine_config &config)
{
- NS32008(config, m_maincpu, 8'000'000); // NS32008D-8
+ NS32008(config, m_maincpu, 16_MHz_XTAL / 2); // NS32008D-8 + NS32C201D-10
m_maincpu->set_addrmap(AS_PROGRAM, &emax_state::emax_map);
+ //R6500_11(config, "scannercpu", 16_MHz_XTAL / 4);
+
+ PIT8254(config, m_ctc);
+ m_ctc->set_clk<0>(16_MHz_XTAL / 2);
+ m_ctc->set_clk<1>(16_MHz_XTAL / 2);
+ m_ctc->set_clk<2>(16_MHz_XTAL / 32);
+
+ WD1772(config, m_fdc, 16_MHz_XTAL / 2); // WD1772-PA
+
+ ACIA6850(config, "acia"); // MC68A50P
+
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(50);
screen.set_screen_update(m_lcdc, FUNC(hd44780_device::screen_update));
@@ -120,7 +189,7 @@ void emax_state::emax(machine_config &config)
PALETTE(config, "palette", FUNC(emax_state::palette_init), 2);
- // TODO: add other peripherals
+ //EMU_IM374(config, "echip", 16_MHz_XTAL / 2);
}
void emax_state::emaxp(machine_config &config)
@@ -138,7 +207,12 @@ void emax_state::emax2(machine_config &config)
EEPROM_93C06_16BIT(config, "eeprom"); // NMC93C06N
- ACIA6850(config, "acia");
+ PIT8254(config, m_ctc);
+
+ WD1772(config, m_fdc, 8'000'000);
+
+ ACIA6850(config, "acia1");
+ ACIA6850(config, "acia2");
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(50);
@@ -160,19 +234,25 @@ ROM_START(emax)
ROM_REGION(0x1000, "bootprom", 0) // v2, Rev C mainboard, non-SE/HD version
ROM_LOAD("emax.bin", 0x0000, 0x1000, CRC(b55210aa) SHA1(9b02dfc28700e07be5e044d53035041a54732927))
+ ROM_REGION(0xc00, "scannercpu", 0)
+ ROM_LOAD("im368-1_ba__r1129-11.ic7", 0x000, 0xc00, NO_DUMP)
+
ROM_REGION(0x104, "cspal", 0)
- ROM_LOAD("ip345c.bin", 0x000, 0x104, CRC(7bae1347) SHA1(a49ab0bae41132e60c113d2117c5a042c2a1e44d))
+ ROM_LOAD("ip345c.bin", 0x000, 0x104, CRC(7bae1347) SHA1(a49ab0bae41132e60c113d2117c5a042c2a1e44d)) // PAL16R4
ROM_END
ROM_START(emaxp)
ROM_REGION(0x2000, "bootprom", 0) // SCSI upgrade
ROM_LOAD("ip424a3089.bin", 0x0000, 0x2000, CRC(3abd3a16) SHA1(8d7ac39c8147bdc2ead9fedee463d1bbe94332c5))
+ ROM_REGION(0xc00, "scannercpu", 0)
+ ROM_LOAD("im368-1_ba__r1129-11.ic7", 0x000, 0xc00, NO_DUMP)
+
ROM_REGION(0x104, "cspal", 0)
- ROM_LOAD("ip345c.bin", 0x000, 0x104, CRC(7bae1347) SHA1(a49ab0bae41132e60c113d2117c5a042c2a1e44d))
+ ROM_LOAD("ip345c.bin", 0x000, 0x104, CRC(7bae1347) SHA1(a49ab0bae41132e60c113d2117c5a042c2a1e44d)) // PAL16R4
ROM_REGION(0x104, "timpal", 0)
- ROM_LOAD("ip379a.bin", 0x000, 0x104, CRC(fb50f8bd) SHA1(5b8b7904736188c4cf8b36a4bf5ad685422ec760))
+ ROM_LOAD("ip379a.bin", 0x000, 0x104, CRC(fb50f8bd) SHA1(5b8b7904736188c4cf8b36a4bf5ad685422ec760)) // PAL16R4
ROM_END
ROM_START(emax2)