OXYGENHUB
◆ main openmsx / src / ide / BeerIDE.hh
2.3 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#ifndef BEERIDE_HH
2
#define BEERIDE_HH
3
4
// Based on the blueMSX implementation:
5
//  Source: /cygdrive/d/Private/_SVNROOT/bluemsx/blueMSX/Src/Memory/romMapperBeerIDE.c,v Revision: 1.9 Date: 2008-03-31 19:42:22
6
7
/*
8
PPI    NAME   IDE PIN
9
---    ----   -------
10
PA0    HD0    17 D0
11
PA1    HD1    15 D1
12
PA2    HD2    13 D2
13
PA3    HD3    11 D3
14
PA4    HD4     9 D4
15
PA5    HD5     7 D5
16
PA6    HD6     5 D6
17
PA7    HD7     3 D7
18
19
PB0    HD8     4 D8
20
PB1    HD9     6 D9
21
PB2    HD10    8 D10
22
PB3    HD11   10 D11
23
PB4    HD12   12 D12
24
PB5    HD13   14 D13
25
PB6    HD14   16 D14
26
PB7    HD15   18 D15
27
28
PC0    HA0    35 A0
29
PC1    HA1    33 A1
30
PC2    HA2    36 A2
31
PC3    N/A
32
PC4    N/A
33
PC5    HCS    37 /CS0
34
PC6    HWR    23 /IOWR
35
PC7    HRD    25 /IORD
36
*/
37
38
#include "I8255.hh"
39
#include "I8255Interface.hh"
40
#include "MSXDevice.hh"
41
#include "Rom.hh"
42
43
#include <memory>
44
45
namespace openmsx {
46
47
class IDEDevice;
48
49
class BeerIDE final : public MSXDevice, public I8255Interface
50
{
51
public:
52
	explicit BeerIDE(DeviceConfig& config);
53
	~BeerIDE() override;
54
55
	void reset(EmuTime time) override;
56
57
	[[nodiscard]] uint8_t readMem(uint16_t address, EmuTime time) override;
58
	[[nodiscard]] const uint8_t* getReadCacheLine(uint16_t start) const override;
59
60
	[[nodiscard]] uint8_t peekIO(uint16_t port, EmuTime time) const override;
61
	[[nodiscard]] uint8_t readIO(uint16_t port, EmuTime time) override;
62
	void writeIO(uint16_t port, uint8_t value, EmuTime time) override;
63
64
	template<typename Archive>
65
	void serialize(Archive& ar, unsigned version);
66
67
private:
68
	void changeControl(uint8_t value, EmuTime time);
69
70
	// I8255Interface
71
	[[nodiscard]] uint8_t readA (EmuTime time) override;
72
	[[nodiscard]] uint8_t readB (EmuTime time) override;
73
	[[nodiscard]] uint4_t readC0(EmuTime time) override;
74
	[[nodiscard]] uint4_t readC1(EmuTime time) override;
75
	[[nodiscard]] uint8_t peekA (EmuTime time) const override;
76
	[[nodiscard]] uint8_t peekB (EmuTime time) const override;
77
	[[nodiscard]] uint4_t peekC0(EmuTime time) const override;
78
	[[nodiscard]] uint4_t peekC1(EmuTime time) const override;
79
	void writeA (uint8_t value, EmuTime time) override;
80
	void writeB (uint8_t value, EmuTime time) override;
81
	void writeC0(uint4_t value, EmuTime time) override;
82
	void writeC1(uint4_t value, EmuTime time) override;
83
84
private:
85
	I8255 i8255;
86
	Rom rom;
87
	std::unique_ptr<IDEDevice> device;
88
	uint16_t dataReg;
89
	uint8_t controlReg;
90
};
91
92
} // namespace openmsx
93
94
#endif