openMSX
MSXPrinterPort.cc
Go to the documentation of this file.
1 #include "MSXPrinterPort.hh"
3 #include "checked_cast.hh"
4 #include "serialize.hh"
5 #include "memory.hh"
6 #include "unreachable.hh"
7 
8 using std::string;
9 
10 namespace openmsx {
11 
13  : MSXDevice(config)
14  , Connector(MSXDevice::getPluggingController(), "printerport",
16 {
17  data = 255; // != 0;
18  strobe = false; // != true;
20 }
21 
23 {
24 }
25 
27 {
28  writeData(0, time); // TODO check this
29  setStrobe(true, time); // TODO check this
30 }
31 
33 {
34  return peekIO(port, time);
35 }
36 
38 {
39  // bit 1 = status / other bits always 1
40  return getPluggedPrintDev().getStatus(time)
41  ? 0xFF : 0xFD;
42 }
43 
45 {
46  switch (port & 0x01) {
47  case 0:
48  setStrobe(value & 1, time); // bit 0 = strobe
49  break;
50  case 1:
51  writeData(value, time);
52  break;
53  default:
55  }
56 }
57 
58 void MSXPrinterPort::setStrobe(bool newStrobe, EmuTime::param time)
59 {
60  if (newStrobe != strobe) {
61  strobe = newStrobe;
62  getPluggedPrintDev().setStrobe(strobe, time);
63  }
64 }
65 void MSXPrinterPort::writeData(byte newData, EmuTime::param time)
66 {
67  if (newData != data) {
68  data = newData;
69  getPluggedPrintDev().writeData(data, time);
70  }
71 }
72 
73 const string MSXPrinterPort::getDescription() const
74 {
75  return "MSX Printer port";
76 }
77 
79 {
80  return "Printer Port";
81 }
82 
84 {
85  Connector::plug(dev, time);
86  getPluggedPrintDev().writeData(data, time);
87  getPluggedPrintDev().setStrobe(strobe, time);
88 }
89 
91 {
92  return *checked_cast<PrinterPortDevice*>(&getPlugged());
93 }
94 
95 template<typename Archive>
96 void MSXPrinterPort::serialize(Archive& ar, unsigned /*version*/)
97 {
98  ar.template serializeBase<MSXDevice>(*this);
99  ar.template serializeBase<Connector>(*this);
100  ar.serialize("strobe", strobe);
101  ar.serialize("data", data);
102  // TODO force writing data to port??
103 }
105 REGISTER_MSXDEVICE(MSXPrinterPort, "PrinterPort");
106 
107 } // namespace openmsx