apxen: Hook up DMA and FDC, system can boot from floppy now

This commit is contained in:
Dirk Best 2021-08-09 17:40:12 +02:00
parent 5c7388e749
commit 8770a480fb

View File

@ -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));
}
@ -209,6 +221,22 @@ static INPUT_PORTS_START( apxen )
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));