diff options
author | 2020-11-27 19:29:03 -0500 | |
---|---|---|
committer | 2020-11-27 19:29:03 -0500 | |
commit | 584cca5a971d68c68db83bfdd11ae11ac107c459 (patch) | |
tree | 38b0d6a9d102c005ba2ee94e0982c25a9ee4cbec | |
parent | 6a2a743e218e54881a3812792cdfc15a2a8ae1bc (diff) |
spc1000_fdd_exp: General cleanup; correct XTAL value
-rw-r--r-- | src/devices/bus/spc1000/fdd.cpp | 47 | ||||
-rw-r--r-- | src/devices/bus/spc1000/fdd.h | 7 |
2 files changed, 21 insertions, 33 deletions
diff --git a/src/devices/bus/spc1000/fdd.cpp b/src/devices/bus/spc1000/fdd.cpp index 60c2f4197af..15025d7cf76 100644 --- a/src/devices/bus/spc1000/fdd.cpp +++ b/src/devices/bus/spc1000/fdd.cpp @@ -52,17 +52,19 @@ void spc1000_fdd_exp_device::control_w(uint8_t data) logerror("%s: control_w(%02x)\n", machine().describe_context(), data); // bit 0, motor on signal - if (m_fd0) - m_fd0->mon_w(!BIT(data, 0)); - if (m_fd1) - m_fd1->mon_w(!BIT(data, 0)); + for (auto &fd : m_fd) + { + floppy_image_device *img = fd->get_device(); + if (img) + img->mon_w(!BIT(data, 0)); + } } void spc1000_fdd_exp_device::sd725_mem(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x1fff).rom(); - map(0x2000, 0xffff).ram(); + map(0x0000, 0x0fff).rom().region("fdccpu", 0); + map(0x4000, 0x7fff).ram(); // 16K dynamic RAM (2x TMS4416-15NL) } void spc1000_fdd_exp_device::sd725_io(address_map &map) @@ -80,15 +82,16 @@ static void sd725_floppies(device_slot_interface &device) } //------------------------------------------------- -// device_add_mconfig +// device_add_mconfigfloppy_image //------------------------------------------------- void spc1000_fdd_exp_device::device_add_mconfig(machine_config &config) { - // sub CPU (5 inch floppy drive) - Z80(config, m_cpu, XTAL(4'000'000)); + // Z80A sub CPU (5 inch floppy drive) + Z80(config, m_cpu, 8_MHz_XTAL / 2); m_cpu->set_addrmap(AS_PROGRAM, &spc1000_fdd_exp_device::sd725_mem); m_cpu->set_addrmap(AS_IO, &spc1000_fdd_exp_device::sd725_io); + m_cpu->set_irq_acknowledge_callback(NAME([](device_t &, int) { return 0xcf; })); // vector to 0008 in IM 0 I8255(config, m_ppi); m_ppi->in_pa_callback().set(m_ppi, FUNC(i8255_device::pb_r)); @@ -98,7 +101,7 @@ void spc1000_fdd_exp_device::device_add_mconfig(machine_config &config) m_ppi->out_pc_callback().set(FUNC(spc1000_fdd_exp_device::i8255_c_w)); // floppy disk controller - UPD765A(config, m_fdc, 4'000'000, true, true); + UPD765A(config, m_fdc, 8_MHz_XTAL / 2, true, true); m_fdc->intrq_wr_callback().set_inputline(m_cpu, INPUT_LINE_IRQ0); // floppy drives @@ -107,7 +110,7 @@ void spc1000_fdd_exp_device::device_add_mconfig(machine_config &config) } ROM_START( spc1000_fdd ) - ROM_REGION(0x10000, "fdccpu", 0) + ROM_REGION(0x1000, "fdccpu", 0) ROM_LOAD("sd725a.bin", 0x0000, 0x1000, CRC(96ac2eb8) SHA1(8e9d8f63a7fb87af417e95603e71cf537a6e83f1)) ROM_END @@ -141,7 +144,8 @@ spc1000_fdd_exp_device::spc1000_fdd_exp_device(const machine_config &mconfig, co m_cpu(*this, "fdccpu"), m_fdc(*this, "upd765"), m_ppi(*this, "d8255_master"), - m_fd0(nullptr), m_fd1(nullptr), m_timer_tc(nullptr), m_i8255_0_pc(0), m_i8255_1_pc(0), m_i8255_portb(0) + m_fd(*this, "upd765:%u", 0U), + m_timer_tc(nullptr), m_i8255_0_pc(0), m_i8255_1_pc(0), m_i8255_portb(0) { } @@ -152,11 +156,7 @@ spc1000_fdd_exp_device::spc1000_fdd_exp_device(const machine_config &mconfig, co void spc1000_fdd_exp_device::device_start() { - m_timer_tc = timer_alloc(TIMER_TC); - m_timer_tc->adjust(attotime::never); - - m_fd0 = subdevice<floppy_connector>("upd765:0")->get_device(); - m_fd1 = subdevice<floppy_connector>("upd765:1")->get_device(); + m_timer_tc = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(spc1000_fdd_exp_device::tc_off), this)); } //------------------------------------------------- @@ -165,20 +165,11 @@ void spc1000_fdd_exp_device::device_start() void spc1000_fdd_exp_device::device_reset() { - m_cpu->set_input_line_vector(0, 0); // Z80 - - // enable rom (is this really needed? it does not seem necessary for FDD to work) - m_cpu->space(AS_PROGRAM).install_rom(0x0000, 0x0fff, 0x2000, memregion("fdccpu")->base()); } -void spc1000_fdd_exp_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +TIMER_CALLBACK_MEMBER(spc1000_fdd_exp_device::tc_off) { - switch (id) - { - case TIMER_TC: - m_fdc->tc_w(false); - break; - } + m_fdc->tc_w(false); } /*------------------------------------------------- diff --git a/src/devices/bus/spc1000/fdd.h b/src/devices/bus/spc1000/fdd.h index f8dac7aaedf..1275f1b9bfb 100644 --- a/src/devices/bus/spc1000/fdd.h +++ b/src/devices/bus/spc1000/fdd.h @@ -29,21 +29,18 @@ protected: virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual uint8_t read(offs_t offset) override; virtual void write(offs_t offset, uint8_t data) override; private: - static constexpr device_timer_id TIMER_TC = 0; + TIMER_CALLBACK_MEMBER(tc_off); // internal state required_device<z80_device> m_cpu; required_device<upd765a_device> m_fdc; required_device<i8255_device> m_ppi; - - floppy_image_device *m_fd0; - floppy_image_device *m_fd1; + required_device_array<floppy_connector, 2> m_fd; emu_timer *m_timer_tc; |