diff options
author | Dirk Best <mail@dirk-best.de> | 2021-08-09 17:40:12 +0200 |
---|---|---|
committer | Dirk Best <mail@dirk-best.de> | 2021-08-09 17:40:49 +0200 |
commit | 8770a480fb016f9cd2ea6a030ac5c4f9e8a51908 (patch) | |
tree | f50097daf5aff58bb84b43d1cdda4fc972a5789e | |
parent | 5c7388e7490ce1e444c0fd3f45f7f1afb77f7134 (diff) |
apxen: Hook up DMA and FDC, system can boot from floppy now
-rw-r--r-- | src/mame/drivers/apxen.cpp | 100 |
1 files changed, 96 insertions, 4 deletions
diff --git a/src/mame/drivers/apxen.cpp b/src/mame/drivers/apxen.cpp index 32b2f896872..4b475a9b873 100644 --- a/src/mame/drivers/apxen.cpp +++ b/src/mame/drivers/apxen.cpp @@ -35,6 +35,7 @@ #include "machine/mm58274c.h" #include "machine/pic8259.h" #include "machine/pit8253.h" +#include "machine/upd71071.h" #include "machine/wd_fdc.h" #include "machine/z80daisy.h" #include "machine/z80sio.h" @@ -104,13 +105,17 @@ public: m_maincpu(*this, "maincpu"), m_mem(*this, "mem"), m_io(*this, "io"), + m_dmac(*this, "dma"), m_eeprom(*this, "eeprom"), m_pic(*this, "pic%u", 0U), m_daisy(*this, "daisy"), m_pit(*this, "pit"), m_cio(*this, "cio"), m_sio(*this, "sio"), - m_video(*this, "video") + m_fdc(*this, "fdc"), + m_floppy(*this, "fdc:%u", 0U), + m_video(*this, "video"), + m_cur_floppy(nullptr) { } void apxen(machine_config &config); @@ -123,12 +128,15 @@ private: required_device<i80286_cpu_device> m_maincpu; required_device<address_map_bank_device> m_mem; required_device<address_map_bank_device> m_io; + required_device<upd71071_device> m_dmac; required_device<eeprom_serial_93cxx_device> m_eeprom; required_device_array<pic8259_device, 2> m_pic; required_device<xen_daisy_device> m_daisy; required_device<pit8253_device> m_pit; required_device<z8536_device> m_cio; required_device<z80sio_device> m_sio; + required_device<wd2797_device> m_fdc; + required_device_array<floppy_connector, 2> m_floppy; required_device<apricot_video_slot_device> m_video; void mem_map_base(address_map &map); @@ -136,6 +144,8 @@ private: void io_map_base(address_map &map); void io_map(address_map &map); + static void floppy_formats(format_registration &fr); + DECLARE_WRITE_LINE_MEMBER(apvid_w); uint16_t mem_r(offs_t offset, uint16_t mem_mask); @@ -149,10 +159,12 @@ private: void cpu_control_w(uint8_t data); void cpu_reset_w(uint8_t data); + uint8_t cio_porta_r(); void cio_porta_w(uint8_t data); void cio_portb_w(uint8_t data); void cio_portc_w(uint8_t data); + floppy_image_device *m_cur_floppy; bool m_apvid; uint8_t m_cpu_control; }; @@ -189,13 +201,13 @@ void apxen_state::io_map(address_map &map) map(0xc40, 0xc47).rw(m_cio, FUNC(z8536_device::read), FUNC(z8536_device::write)).umask16(0x00ff); map(0xc50, 0xc57).rw(m_sio, FUNC(z80sio_device::ba_cd_r), FUNC(z80sio_device::ba_cd_w)).umask16(0x00ff); map(0xc60, 0xc7f).rw("rtc", FUNC(mm58274c_device::read), FUNC(mm58274c_device::write)).umask16(0x00ff); -// map(0xc80, 0xc87) FDC + map(0xc80, 0xc87).rw(m_fdc, FUNC(wd2797_device::read), FUNC(wd2797_device::write)).umask16(0x00ff); // map(0xc90, 0xc93) uPD7261 HDC map(0xca0, 0xca3).rw(m_pic[0], FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0xca4, 0xca7).rw(m_pic[1], FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); map(0xcb0, 0xcb7).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff); -// map(0xcc0, 0xccf) uPD71071 DMA 1 -// map(0xcd0, 0xcdf) uPD71071 DMA 2 + map(0xcc0, 0xccf).rw(m_dmac, FUNC(upd71071_device::read), FUNC(upd71071_device::write)); +// map(0xcd0, 0xcdf) uPD71071 DMA 2 (optional, with XP box) map(0xce0, 0xce0).rw(FUNC(apxen_state::cpu_control_r), FUNC(apxen_state::cpu_control_w)); map(0xcf0, 0xcf0).w(FUNC(apxen_state::cpu_reset_w)); } @@ -210,6 +222,22 @@ INPUT_PORTS_END //************************************************************************** +// FLOPPY +//************************************************************************** + +void apxen_state::floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + fr.add(FLOPPY_APRIDISK_FORMAT); +} + +static void apricot_floppies(device_slot_interface &device) +{ + device.option_add("d32w", SONY_OA_D32W); +} + + +//************************************************************************** // VIDEO EMULATION //************************************************************************** @@ -357,20 +385,69 @@ void apxen_state::cpu_reset_w(uint8_t data) m_maincpu->reset(); } +uint8_t apxen_state::cio_porta_r() +{ + uint8_t data = 0x00; + + data |= m_cur_floppy ? m_cur_floppy->dskchg_r() : 0; + + logerror("cio_porta_r: %02x\n", data); + + return data; +} + void apxen_state::cio_porta_w(uint8_t data) { logerror("cio_porta_w: %02x\n", data); + + // 7------- hdc interrupt (input) + // -6------ floppy/tape select + // --5----- winchester select + // ---4---- floppy select + // ----3--- floppy disk change (input) + // -----2-- floppy disk head load + // ------10 floppy drive select + + if (BIT(data, 4) == 0) + { + if ((data & 0x03) < 2) + m_cur_floppy = m_floppy[data & 0x03]->get_device(); + else + m_cur_floppy = nullptr; + + m_fdc->set_floppy(m_cur_floppy); + + // motor always active for now + if (m_cur_floppy) + m_cur_floppy->mon_w(0); + } } void apxen_state::cio_portb_w(uint8_t data) { logerror("cio_portb_w: %02x\n", data); + + // 7------- rs232 dts (input) + // -65----- rs232 baud select + // ---4---- track 43 precomp + // ----3--- centronics busy (input) + // -----2-- centronics select (input) + // ------1- centronics fault (input) + // -------0 centronics paper empty (input) } void apxen_state::cio_portc_w(uint8_t data) { logerror("cio_portc_w: %02x\n", data); + // 3--- centronics strobe + // -2-- eeprom clock + // --1- winchester head select 3 + // ---0 floppy disk change reset + + if (BIT(data, 0) && m_cur_floppy) + m_cur_floppy->dskchg_w(0); + m_eeprom->clk_write(BIT(data, 2)); } @@ -396,6 +473,13 @@ void apxen_state::apxen(machine_config &config) m_io->set_data_width(16); m_io->set_addr_width(16); + UPD71071(config, m_dmac, 8000000); + m_dmac->set_cpu_tag("maincpu"); + m_dmac->set_clock(8000000); + m_dmac->out_eop_callback().set(m_pic[1], FUNC(pic8259_device::ir2_w)); + m_dmac->dma_read_callback<1>().set(m_fdc, FUNC(wd2797_device::data_r)); + m_dmac->dma_write_callback<1>().set(m_fdc, FUNC(wd2797_device::data_w)); + EEPROM_93C06_16BIT(config, m_eeprom); // NMC9306 m_eeprom->do_callback().set(m_sio, FUNC(z80sio_device::ctsb_w)); @@ -421,6 +505,7 @@ void apxen_state::apxen(machine_config &config) Z8536(config, m_cio, 4000000); m_cio->irq_wr_cb().set(m_pic[0], FUNC(pic8259_device::ir1_w)); + m_cio->pa_rd_cb().set(FUNC(apxen_state::cio_porta_r)); m_cio->pa_wr_cb().set(FUNC(apxen_state::cio_porta_w)); m_cio->pb_wr_cb().set(FUNC(apxen_state::cio_portb_w)); m_cio->pc_wr_cb().set(FUNC(apxen_state::cio_portc_w)); @@ -432,6 +517,13 @@ void apxen_state::apxen(machine_config &config) MM58274C(config, "rtc", 32.768_kHz_XTAL); + // floppy + WD2797(config, m_fdc, 2000000); + m_fdc->intrq_wr_callback().set(m_pic[1], FUNC(pic8259_device::ir1_w)); + m_fdc->drq_wr_callback().set([this](int state) { m_dmac->dmarq(state, 1); }); + FLOPPY_CONNECTOR(config, "fdc:0", apricot_floppies, "d32w", apxen_state::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", apricot_floppies, "d32w", apxen_state::floppy_formats); + // video hardware APRICOT_VIDEO_SLOT(config, m_video, apricot_video_cards, "mono"); m_video->apvid_handler().set(FUNC(apxen_state::apvid_w)); |