openMSX
IRQHelper.hh
Go to the documentation of this file.
1 #ifndef IRQHELPER_HH
2 #define IRQHELPER_HH
3 
4 #include "Probe.hh"
5 #include "MSXMotherBoard.hh"
6 #include "serialize.hh"
7 #include <string>
8 
9 namespace openmsx {
10 
11 class MSXCPU;
12 class DeviceConfig;
13 
21 // policy class for IRQ source
22 class IRQSource
23 {
24 protected:
25  explicit IRQSource(MSXCPU& cpu);
26  void raise();
27  void lower();
28 private:
29  MSXCPU& cpu;
30 };
31 
32 // supports <irq_connected> tag in hardware config
34 {
35 protected:
36  OptionalIRQ(MSXCPU& cpu, const DeviceConfig& config);
37  void raise();
38  void lower();
39 private:
40  MSXCPU& cpu;
41  enum Type { NotConnected, Maskable, NonMaskable };
42  const Type type;
43 };
44 
45 
46 // generic implementation
47 template<typename SOURCE> class IntHelper : public SOURCE
48 {
49 public:
50  IntHelper(const IntHelper&) = delete;
51  IntHelper& operator=(const IntHelper&) = delete;
52 
56  template<typename ...Args>
57  IntHelper(MSXMotherBoard& motherboard, const std::string& name,
58  Args&& ...args)
59  : SOURCE(motherboard.getCPU(), std::forward<Args>(args)...)
60  , request(motherboard.getDebugger(), name,
61  "Outgoing IRQ signal.", false)
62  {
63  }
64 
69  reset();
70  }
71 
74  inline void set() {
75  if (!request) {
76  request = true;
77  SOURCE::raise();
78  }
79  }
80 
83  inline void reset() {
84  if (request) {
85  request = false;
86  SOURCE::lower();
87  }
88  }
89 
92  inline void set(bool s) {
93  if (s) {
94  set();
95  } else {
96  reset();
97  }
98  }
99 
103  [[nodiscard]] inline bool getState() const {
104  return request;
105  }
106 
107  template<typename Archive>
108  void serialize(Archive& ar, unsigned /*version*/)
109  {
110  bool pending = request;
111  ar.serialize("pending", pending);
112  if constexpr (Archive::IS_LOADER) {
113  set(pending);
114  }
115  }
116 
117 private:
118  Probe<bool> request;
119 };
120 
121 // convenience types
124 
125 } // namespace openmsx
126 
127 #endif
Helper class for doing interrupt request (IRQ) administration.
Definition: IRQHelper.hh:23
IRQSource(MSXCPU &cpu)
Definition: IRQHelper.cc:12
void set()
Set the interrupt request on the bus.
Definition: IRQHelper.hh:74
IntHelper(const IntHelper &)=delete
IntHelper & operator=(const IntHelper &)=delete
void reset()
Reset the interrupt request on the bus.
Definition: IRQHelper.hh:83
~IntHelper()
Destroy this IntHelper.
Definition: IRQHelper.hh:68
void serialize(Archive &ar, unsigned)
Definition: IRQHelper.hh:108
bool getState() const
Get the interrupt state.
Definition: IRQHelper.hh:103
void set(bool s)
Convenience function: calls set() or reset().
Definition: IRQHelper.hh:92
IntHelper(MSXMotherBoard &motherboard, const std::string &name, Args &&...args)
Create a new IntHelper.
Definition: IRQHelper.hh:57
OptionalIRQ(MSXCPU &cpu, const DeviceConfig &config)
Definition: IRQHelper.cc:30
This file implemented 3 utility functions:
Definition: Autofire.cc:9