summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit8770a480fb016f9cd2ea6a030ac5c4f9e8a51908 (patch)
treef50097daf5aff58bb84b43d1cdda4fc972a5789e
parent5c7388e7490ce1e444c0fd3f45f7f1afb77f7134 (diff)
apxen: Hook up DMA and FDC, system can boot from floppy now
-rw-r--r--src/mame/drivers/apxen.cpp100
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));