mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
spc1000_fdd_exp: General cleanup; correct XTAL value
This commit is contained in:
parent
6a2a743e21
commit
584cca5a97
@ -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);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user