OXYGENHUB
◆ main openmsx / src / ide / GoudaSCSI.cc
1.6 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "GoudaSCSI.hh"
2
3
#include "serialize.hh"
4
5
#include "unreachable.hh"
6
7
namespace openmsx {
8
9
GoudaSCSI::GoudaSCSI(DeviceConfig& config)
10
	: MSXDevice(config)
11
	, rom(getName() + " ROM", "rom", config)
12
	, wd33c93(config)
13
{
14
	reset(EmuTime::dummy());
15
}
16
17
void GoudaSCSI::reset(EmuTime /*time*/)
18
{
19
	wd33c93.reset(true);
20
}
21
22
byte GoudaSCSI::readIO(uint16_t port, EmuTime /*time*/)
23
{
24
	switch (port & 0x03) {
25
	case 0:
26
		return wd33c93.readAuxStatus();
27
	case 1:
28
		return wd33c93.readCtrl();
29
	case 2:
30
		return 0xb0; // bit 4: 1 = Halt on SCSI parity error
31
	default:
32
		UNREACHABLE;
33
	}
34
}
35
36
byte GoudaSCSI::peekIO(uint16_t port, EmuTime /*time*/) const
37
{
38
	switch (port & 0x03) {
39
	case 0:
40
		return wd33c93.peekAuxStatus();
41
	case 1:
42
		return wd33c93.peekCtrl();
43
	case 2:
44
		return 0xb0; // bit 4: 1 = Halt on SCSI parity error
45
	default:
46
		UNREACHABLE;
47
	}
48
}
49
50
void GoudaSCSI::writeIO(uint16_t port, byte value, EmuTime time)
51
{
52
	switch (port & 0x03) {
53
	case 0:
54
		wd33c93.writeAdr(value);
55
		break;
56
	case 1:
57
		wd33c93.writeCtrl(value);
58
		break;
59
	case 2:
60
		reset(time);
61
		break;
62
	default:
63
		UNREACHABLE;
64
	}
65
}
66
67
byte GoudaSCSI::readMem(uint16_t address, EmuTime /*time*/)
68
{
69
	return *GoudaSCSI::getReadCacheLine(address);
70
}
71
72
const byte* GoudaSCSI::getReadCacheLine(uint16_t start) const
73
{
74
	return &rom[start & (rom.size() - 1)];
75
}
76
77
78
template<typename Archive>
79
void GoudaSCSI::serialize(Archive& ar, unsigned /*version*/)
80
{
81
	ar.template serializeBase<MSXDevice>(*this);
82
	ar.serialize("WD33C93", wd33c93);
83
}
84
INSTANTIATE_SERIALIZE_METHODS(GoudaSCSI);
85
REGISTER_MSXDEVICE(GoudaSCSI, "GoudaSCSI");
86
87
} // namespace openmsx