openMSX
I8251.hh
Go to the documentation of this file.
1 // This class implements the Intel 8251 chip (UART)
2 
3 #ifndef I8251_HH
4 #define I8251_HH
5 
6 #include "ClockPin.hh"
7 #include "SerialDataInterface.hh"
8 #include "Schedulable.hh"
9 #include "openmsx.hh"
10 
11 namespace openmsx {
12 
14 {
15 public:
16  virtual ~I8251Interface() {}
17  virtual void setRxRDY(bool status, EmuTime::param time) = 0;
18  virtual void setDTR(bool status, EmuTime::param time) = 0;
19  virtual void setRTS(bool status, EmuTime::param time) = 0;
20  virtual bool getDSR(EmuTime::param time) = 0;
21  virtual bool getCTS(EmuTime::param time) = 0; // TODO use this
22  virtual void signal(EmuTime::param time) = 0;
23 };
24 
25 class I8251 : public SerialDataInterface, public Schedulable
26 {
27 public:
28  I8251(Scheduler& scheduler, I8251Interface& interf, EmuTime::param time);
29 
30  void reset(EmuTime::param time);
31  byte readIO(word port, EmuTime::param time);
32  byte peekIO(word port, EmuTime::param time) const;
33  void writeIO(word port, byte value, EmuTime::param time);
35  bool isRecvReady();
36  bool isRecvEnabled();
37 
38  // SerialDataInterface
39  virtual void setDataBits(DataBits bits);
40  virtual void setStopBits(StopBits bits);
41  virtual void setParityBit(bool enable, ParityBit parity);
42  virtual void recvByte(byte value, EmuTime::param time);
43 
44  // Schedulable
45  virtual void executeUntil(EmuTime::param time, int userData);
46 
47  template<typename Archive>
48  void serialize(Archive& ar, unsigned version);
49 
50  // public for serialize
51  enum CmdFaze {
53  };
54 
55 private:
56  void setMode(byte mode);
57  void writeCommand(byte value, EmuTime::param time);
58  byte readStatus(EmuTime::param time);
59  byte readTrans(EmuTime::param time);
60  void writeTrans(byte value, EmuTime::param time);
61  void send(byte value, EmuTime::param time);
62 
63  I8251Interface& interf;
64  ClockPin clock;
65  unsigned charLength;
66 
67  CmdFaze cmdFaze;
68  SerialDataInterface::DataBits recvDataBits;
69  SerialDataInterface::StopBits recvStopBits;
70  SerialDataInterface::ParityBit recvParityBit;
71  bool recvParityEnabled;
72  byte recvBuf;
73  bool recvReady;
74 
75  byte sendByte;
76  byte sendBuffer;
77 
78  byte status;
79  byte command;
80  byte mode;
81  byte sync1, sync2;
82 };
83 
84 } // namespace openmsx
85 
86 #endif
virtual void setDataBits(DataBits bits)
Definition: I8251.cc:302
virtual void setParityBit(bool enable, ParityBit parity)
Definition: I8251.cc:312
virtual void signal(EmuTime::param time)=0
bool isRecvEnabled()
Definition: I8251.cc:340
unsigned char byte
8 bit unsigned integer
Definition: openmsx.hh:33
virtual bool getCTS(EmuTime::param time)=0
I8251(Scheduler &scheduler, I8251Interface &interf, EmuTime::param time)
Definition: I8251.cc:53
bool isRecvReady()
Definition: I8251.cc:336
void serialize(Archive &ar, unsigned version)
Definition: I8251.cc:411
virtual void setDTR(bool status, EmuTime::param time)=0
virtual void recvByte(byte value, EmuTime::param time)
Definition: I8251.cc:318
Every class that wants to get scheduled at some point must inherit from this class.
Definition: Schedulable.hh:16
ClockPin & getClockPin()
Definition: I8251.cc:296
void writeIO(word port, byte value, EmuTime::param time)
Definition: I8251.cc:110
virtual void setRTS(bool status, EmuTime::param time)=0
byte readIO(word port, EmuTime::param time)
Definition: I8251.cc:81
unsigned short word
16 bit unsigned integer
Definition: openmsx.hh:38
virtual void executeUntil(EmuTime::param time, int userData)
When the previously registered syncPoint is reached, this method gets called.
Definition: I8251.cc:355
virtual ~I8251Interface()
Definition: I8251.hh:16
void reset(EmuTime::param time)
Definition: I8251.cc:59
virtual void setStopBits(StopBits bits)
Definition: I8251.cc:307
byte peekIO(word port, EmuTime::param time) const
Definition: I8251.cc:97
virtual void setRxRDY(bool status, EmuTime::param time)=0
virtual bool getDSR(EmuTime::param time)=0