openMSX
MSXMidi.hh
Go to the documentation of this file.
1 #ifndef MSXMIDI_HH
2 #define MSXMIDI_HH
3 
4 #include "MSXDevice.hh"
5 #include "IRQHelper.hh"
6 #include "MidiInConnector.hh"
7 
8 namespace openmsx {
9 
10 class MSXMidiCounter0;
11 class MSXMidiCounter2;
12 class MSXMidiI8251Interf;
13 class ClockPin;
14 class I8254;
15 class I8251;
16 class MidiOutConnector;
17 
18 class MSXMidi: public MSXDevice, public MidiInConnector
19 {
20 public:
21  explicit MSXMidi(const DeviceConfig& config);
22  virtual ~MSXMidi();
23 
24  virtual void reset(EmuTime::param time);
25  virtual byte readIO(word port, EmuTime::param time);
26  virtual byte peekIO(word port, EmuTime::param time) const;
27  virtual void writeIO(word port, byte value, EmuTime::param time);
28 
29  // MidiInConnector
30  virtual bool ready();
31  virtual bool acceptsData();
32  virtual void setDataBits(DataBits bits);
33  virtual void setStopBits(StopBits bits);
34  virtual void setParityBit(bool enable, ParityBit parity);
35  virtual void recvByte(byte value, EmuTime::param time);
36 
37  template<typename Archive>
38  void serialize(Archive& ar, unsigned version);
39 
40 private:
41  void setTimerIRQ(bool status, EmuTime::param time);
42  void enableTimerIRQ(bool enabled, EmuTime::param time);
43  void updateEdgeEvents(EmuTime::param time);
44  void setRxRDYIRQ(bool status);
45  void enableRxRDYIRQ(bool enabled);
46 
47  void registerIOports(byte value);
48  void registerRange(byte port, unsigned num);
49  void unregisterRange(byte port, unsigned num);
50 
51  const std::unique_ptr<MSXMidiCounter0> cntr0; // counter 0 clock pin
52  const std::unique_ptr<MSXMidiCounter2> cntr2; // counter 2 clock pin
53  const std::unique_ptr<MSXMidiI8251Interf> interf;
54 
55  IRQHelper timerIRQ;
56  IRQHelper rxrdyIRQ;
57  bool timerIRQlatch;
58  bool timerIRQenabled;
59  bool rxrdyIRQlatch;
60  bool rxrdyIRQenabled;
61 
62  const bool isExternalMSXMIDI;
63  bool isEnabled; /* EN bit */
64  bool isLimitedTo8251; /* inverse of E8 bit */
65 
66  // must come last
67  const std::unique_ptr<MidiOutConnector> outConnector;
68  const std::unique_ptr<I8251> i8251;
69  const std::unique_ptr<I8254> i8254;
70 
71  friend class MSXMidiCounter0;
72  friend class MSXMidiCounter2;
73  friend class MSXMidiI8251Interf;
74 };
76 
77 } // namespace openmsx
78 
79 #endif