OXYGENHUB
◆ main openmsx / src / I8255.hh
2.0 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
// This class implements the Intel 8255 chip
2
//
3
// * Only the 8255 is emulated, no surrounding hardware.
4
//   Use the class I8255Interface to do that.
5
// * Only mode 0 (basic input/output) is implemented
6
7
#ifndef I8255_HH
8
#define I8255_HH
9
10
#include "EmuTime.hh"
11
#include "TclCallback.hh"
12
13
#include <cstdint>
14
15
namespace openmsx {
16
17
class I8255Interface;
18
class StringSetting;
19
20
class I8255
21
{
22
public:
23
	I8255(I8255Interface& interface, EmuTime time,
24
	      StringSetting& invalidPpiModeSetting);
25
26
	// CPU side
27
	void reset(EmuTime time);
28
	[[nodiscard]] uint8_t read(uint8_t port, EmuTime time);
29
	[[nodiscard]] uint8_t peek(uint8_t port, EmuTime time) const;
30
	void write(uint8_t port, uint8_t value, EmuTime time);
31
32
	// Peripheral side, pull-interface
33
	// (the I8255Interface class implements the push-interface)
34
	uint8_t getPortA() const;
35
	uint8_t getPortB() const;
36
	uint8_t getPortC() const;
37
38
	template<typename Archive>
39
	void serialize(Archive& ar, unsigned version);
40
41
private:
42
	[[nodiscard]] uint8_t readPortA(EmuTime time);
43
	[[nodiscard]] uint8_t readPortB(EmuTime time);
44
	[[nodiscard]] uint8_t readPortC(EmuTime time);
45
	[[nodiscard]] uint8_t readControlPort(EmuTime time) const;
46
	[[nodiscard]] uint8_t peekPortA(EmuTime time) const;
47
	[[nodiscard]] uint8_t peekPortB(EmuTime time) const;
48
	[[nodiscard]] uint8_t peekPortC(EmuTime time) const;
49
	void writePortA(uint8_t value, EmuTime time);
50
	void writePortB(uint8_t value, EmuTime time);
51
	void writePortC(uint8_t value, EmuTime time);
52
	void writeControlPort(uint8_t value, EmuTime time);
53
54
	[[nodiscard]] uint8_t readC0(EmuTime time);
55
	[[nodiscard]] uint8_t readC1(EmuTime time);
56
	[[nodiscard]] uint8_t peekC0(EmuTime time) const;
57
	[[nodiscard]] uint8_t peekC1(EmuTime time) const;
58
	void outputPortA(uint8_t value, EmuTime time);
59
	void outputPortB(uint8_t value, EmuTime time);
60
	void outputPortC(uint8_t value, EmuTime time);
61
62
private:
63
	I8255Interface& interface;
64
65
	uint8_t control;
66
	uint8_t latchPortA;
67
	uint8_t latchPortB;
68
	uint8_t latchPortC;
69
70
	TclCallback ppiModeCallback;
71
};
72
73
} // namespace openmsx
74
75
#endif