1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
#include "emu.h"
#include "fp1020fd.h"
#define VERBOSE 1
//#define LOG_OUTPUT_FUNC osd_printf_info
#include "logmacro.h"
DEFINE_DEVICE_TYPE(FP1020FD, fp1020fd_device, "fp1020fd", "FP-1020FD FDCPACK")
fp1020fd_device::fp1020fd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: fp1060io_exp_device(mconfig, FP1020FD, tag, owner, clock)
, m_fdc(*this, "fdc")
, m_floppy(*this, "fdc:%u", 0)
{
}
void fp1020fd_device::io_map(address_map &map)
{
map(0x0000, 0x0000).mirror(0xfef9).unmapr().lw8(
NAME([this](offs_t offset, u8 data) {
(void)data;
for (auto floppy : m_floppy)
{
floppy_image_device *fl = floppy->get_device();
fl->mon_w(0);
}
m_motor_timer->adjust(attotime::from_seconds(60));
})
);
map(0x0002, 0x0002).mirror(0xfef9).unmapr().lw8(
NAME([this](offs_t offset, u8 data) {
(void)data;
m_fdc->tc_w(true);
m_fdc->tc_w(false);
})
);
map(0x0004, 0x0004).mirror(0xfef8).r(m_fdc, FUNC(upd765a_device::msr_r));
map(0x0005, 0x0005).mirror(0xfef8).rw(m_fdc, FUNC(upd765a_device::fifo_r), FUNC(upd765a_device::fifo_w));
map(0x0006, 0x0006).mirror(0xfef8).rw(m_fdc, FUNC(upd765a_device::dma_r), FUNC(upd765a_device::dma_w));
map(0x0007, 0x0007).mirror(0xfef8).unmaprw();
}
static void fd1020fd_floppies(device_slot_interface &device)
{
device.option_add("525dsdd", FLOPPY_525_DD);
}
void fp1020fd_device::intrq_w(int state)
{
// LOG("intrq_w %d\n",state);
fp1060io_exp_device::intb_w(state);
}
void fp1020fd_device::drq_w(int state)
{
// LOG("drq_w %d\n",state);
fp1060io_exp_device::inta_w(state);
}
void fp1020fd_device::device_add_mconfig(machine_config &config)
{
// UPD765AC
// TODO: verify clock
// ready and select lines = true verified (pukes any floppy bootstrap if either is false)
UPD765A(config, m_fdc, 8'000'000, true, true);
m_fdc->intrq_wr_callback().set(FUNC(fp1020fd_device::intrq_w));
m_fdc->drq_wr_callback().set(FUNC(fp1020fd_device::drq_w));
FLOPPY_CONNECTOR(config, "fdc:0", fd1020fd_floppies, "525dsdd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, "fdc:1", fd1020fd_floppies, "525dsdd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
}
void fp1020fd_device::device_start()
{
m_motor_timer = timer_alloc(FUNC(fp1020fd_device::motor_timeout_cb), this);
}
void fp1020fd_device::device_reset()
{
}
TIMER_CALLBACK_MEMBER(fp1020fd_device::motor_timeout_cb)
{
for (auto floppy : m_floppy)
{
floppy_image_device *fl = floppy->get_device();
fl->mon_w(1);
}
}
|