diff options
Diffstat (limited to 'src/mame/drivers/mikromik.cpp')
-rw-r--r-- | src/mame/drivers/mikromik.cpp | 233 |
1 files changed, 108 insertions, 125 deletions
diff --git a/src/mame/drivers/mikromik.cpp b/src/mame/drivers/mikromik.cpp index f122675dd3c..043c2c50188 100644 --- a/src/mame/drivers/mikromik.cpp +++ b/src/mame/drivers/mikromik.cpp @@ -54,6 +54,7 @@ #include "emu.h" #include "includes/mikromik.h" +#include "machine/74259.h" #include "softlist.h" //#define VERBOSE 1 @@ -89,43 +90,7 @@ READ8_MEMBER( mm1_state::read ) if (mmu & MMU_IOEN) { - switch ((offset >> 4) & 0x07) - { - case 0: - data = m_dmac->read(offset & 0x0f); - break; - - case 1: - data = m_mpsc->cd_ba_r(space, offset & 0x03); - break; - - case 2: - data = m_crtc->read(space, offset & 0x01); - break; - - case 3: - data = m_pit->read(offset & 0x03); - break; - - case 4: - data = m_iop->read(space, 0); - break; - - case 5: - if (BIT(offset, 0)) - { - data = m_fdc->fifo_r(); - } - else - { - data = m_fdc->msr_r(); - } - break; - - case 7: - data = m_hgdc->read(offset & 0x01); - break; - } + data = m_io->read8(offset & 0x7f); } else { @@ -158,43 +123,7 @@ WRITE8_MEMBER( mm1_state::write ) if (mmu & MMU_IOEN) { - switch ((offset >> 4) & 0x07) - { - case 0: - m_dmac->write(offset & 0x0f, data); - break; - - case 1: - m_mpsc->cd_ba_w(space, offset & 0x03, data); - break; - - case 2: - m_crtc->write(space, offset & 0x01, data); - break; - - case 3: - m_pit->write(offset & 0x03, data); - break; - - case 4: - m_iop->write(space, 0, data); - break; - - case 5: - if (BIT(offset, 0)) - { - m_fdc->fifo_w(data); - } - break; - - case 6: - ls259_w(space, offset & 0x07, data); - break; - - case 7: - m_hgdc->write(offset & 0x01, data); - break; - } + m_io->write8(offset & 0x7f, data); } else { @@ -207,53 +136,88 @@ WRITE8_MEMBER( mm1_state::write ) //------------------------------------------------- -// ls259_w - +// a8_w - //------------------------------------------------- -WRITE8_MEMBER( mm1_state::ls259_w ) +WRITE_LINE_MEMBER( mm1_state::a8_w ) { - int d = BIT(data, 0); + LOG("IC24 A8 %u\n", state); + m_a8 = state; +} - switch (offset) - { - case 0: // IC24 A8 - LOG("IC24 A8 %u\n", d); - m_a8 = d; - break; - - case 1: // RECALL - LOG("RECALL %u\n", d); - m_recall = d; - if (d) m_fdc->soft_reset(); - break; - - case 2: // _RV28/RX21 - m_rx21 = d; - break; - - case 3: // _TX21 - m_tx21 = d; - break; - - case 4: // _RCL - m_rcl = d; - break; - - case 5: // _INTC - m_intc = d; - break; - - case 6: // LLEN - LOG("LLEN %u\n", d); - m_llen = d; - break; - - case 7: // MOTOR ON - LOG("MOTOR %u\n", d); - m_floppy0->mon_w(!d); - m_floppy1->mon_w(!d); - break; - } + +//------------------------------------------------- +// recall_w - +//------------------------------------------------- + +WRITE_LINE_MEMBER( mm1_state::recall_w ) +{ + LOG("RECALL %u\n", state); + m_recall = state; + if (state) m_fdc->soft_reset(); +} + + +//------------------------------------------------- +// rx21_w - +//------------------------------------------------- + +WRITE_LINE_MEMBER( mm1_state::rx21_w ) +{ + m_rx21 = state; +} + + +//------------------------------------------------- +// tx21_w - +//------------------------------------------------- + +WRITE_LINE_MEMBER( mm1_state::tx21_w ) +{ + m_tx21 = state; +} + + +//------------------------------------------------- +// rcl_w - +//------------------------------------------------- + +WRITE_LINE_MEMBER( mm1_state::rcl_w ) +{ + m_rcl = state; +} + + +//------------------------------------------------- +// intc_w - +//------------------------------------------------- + +WRITE_LINE_MEMBER( mm1_state::intc_w ) +{ + m_intc = state; +} + + +//------------------------------------------------- +// llen_w - +//------------------------------------------------- + +WRITE_LINE_MEMBER( mm1_state::llen_w ) +{ + LOG("LLEN %u\n", state); + m_llen = state; +} + + +//------------------------------------------------- +// motor_on_w - +//------------------------------------------------- + +WRITE_LINE_MEMBER( mm1_state::motor_on_w ) +{ + LOG("MOTOR %u\n", state); + m_floppy0->mon_w(!state); + m_floppy1->mon_w(!state); } @@ -271,6 +235,18 @@ void mm1_state::mm1_map(address_map &map) map(0x0000, 0xffff).rw(FUNC(mm1_state::read), FUNC(mm1_state::write)); } +void mm1_state::mmu_io_map(address_map &map) +{ + map(0x00, 0x0f).rw(m_dmac, FUNC(am9517a_device::read), FUNC(am9517a_device::write)); + map(0x10, 0x13).mirror(0x0c).rw(m_mpsc, FUNC(upd7201_device::cd_ba_r), FUNC(upd7201_device::cd_ba_w)); + map(0x20, 0x21).mirror(0x0e).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); + map(0x30, 0x33).mirror(0x0c).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + map(0x40, 0x40).mirror(0x0f).rw(m_iop, FUNC(i8212_device::read), FUNC(i8212_device::write)); + map(0x50, 0x51).mirror(0x0e).m(m_fdc, FUNC(upd765a_device::map)); + map(0x60, 0x67).mirror(0x08).w("outlatch", FUNC(ls259_device::write_d0)); + map(0x70, 0x71).mirror(0x0e).rw(m_hgdc, FUNC(upd7220_device::read), FUNC(upd7220_device::write)); +} + //************************************************************************** @@ -437,14 +413,6 @@ void mm1_state::machine_start() void mm1_state::machine_reset() { - address_space &program = m_maincpu->space(AS_PROGRAM); - - // reset LS259 - for (int i = 0; i < 8; i++) - { - ls259_w(program, i, 0); - } - // reset FDC m_fdc->reset(); } @@ -470,10 +438,25 @@ void mm1_state::mm1(machine_config &config) config.m_perfect_cpu_quantum = subtag(I8085A_TAG); // peripheral hardware + ADDRESS_MAP_BANK(config, m_io); + m_io->set_addrmap(0, &mm1_state::mmu_io_map); + m_io->set_data_width(8); + m_io->set_addr_width(7); + I8212(config, m_iop, 0); m_iop->int_wr_callback().set_inputline(m_maincpu, I8085_RST65_LINE); m_iop->di_rd_callback().set(KB_TAG, FUNC(mm1_keyboard_device::read)); + ls259_device &outlatch(LS259(config, "outlatch")); + outlatch.q_out_cb<0>().set(FUNC(mm1_state::a8_w)); // IC24 A8 + outlatch.q_out_cb<1>().set(FUNC(mm1_state::recall_w)); // RECALL + outlatch.q_out_cb<2>().set(FUNC(mm1_state::rx21_w)); // _RV28/RX21 + outlatch.q_out_cb<3>().set(FUNC(mm1_state::tx21_w)); // _TX21 + outlatch.q_out_cb<4>().set(FUNC(mm1_state::rcl_w)); // _RCL + outlatch.q_out_cb<5>().set(FUNC(mm1_state::intc_w)); // _INTC + outlatch.q_out_cb<6>().set(FUNC(mm1_state::llen_w)); // LLEN + outlatch.q_out_cb<7>().set(FUNC(mm1_state::motor_on_w)); // MOTOR ON + AM9517A(config, m_dmac, 6.144_MHz_XTAL/2); m_dmac->out_hreq_callback().set(FUNC(mm1_state::dma_hrq_w)); m_dmac->out_eop_callback().set(FUNC(mm1_state::dma_eop_w)); |