summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/fp1000/fp1020fd.cpp
blob: 1907de05a052485b1d39f54f5f63cf5c4807f5dd (plain) (blame)
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);
	}
}