SVIPrinterPort.cc 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // $Id:$
  2. #include "SVIPrinterPort.hh"
  3. #include "DummyPrinterPortDevice.hh"
  4. #include "checked_cast.hh"
  5. #include "serialize.hh"
  6. #include "unreachable.hh"
  7. #include <memory>
  8. // Centronics interface
  9. //
  10. // DAT0-DAT7 Printer data write port, output (10H)
  11. // /STB Printer strobe port, output (11H)
  12. // BUSY Printer status port, input (12H)
  13. namespace openmsx {
  14. SVIPrinterPort::SVIPrinterPort(const DeviceConfig& config)
  15. : MSXDevice(config)
  16. , Connector(MSXDevice::getPluggingController(), "printerport",
  17. std::make_unique<DummyPrinterPortDevice>())
  18. {
  19. data = 255; // != 0;
  20. strobe = false; // != true;
  21. reset(getCurrentTime());
  22. }
  23. void SVIPrinterPort::reset(EmuTime::param time)
  24. {
  25. writeData(0, time); // TODO check this
  26. setStrobe(true, time); // TODO check this
  27. }
  28. byte SVIPrinterPort::readIO(word port, EmuTime::param time)
  29. {
  30. return peekIO(port, time);
  31. }
  32. byte SVIPrinterPort::peekIO(word /*port*/, EmuTime::param time) const
  33. {
  34. // bit 1 = status / other bits always 1
  35. return getPluggedPrintDev().getStatus(time) ? 0xFF : 0xFE;
  36. }
  37. void SVIPrinterPort::writeIO(word port, byte value, EmuTime::param time)
  38. {
  39. switch (port & 0x01) {
  40. case 0:
  41. writeData(value, time);
  42. break;
  43. case 1:
  44. setStrobe(value & 1, time); // bit 0 = strobe
  45. break;
  46. default:
  47. UNREACHABLE;
  48. }
  49. }
  50. void SVIPrinterPort::setStrobe(bool newStrobe, EmuTime::param time)
  51. {
  52. if (newStrobe != strobe) {
  53. strobe = newStrobe;
  54. getPluggedPrintDev().setStrobe(strobe, time);
  55. }
  56. }
  57. void SVIPrinterPort::writeData(byte newData, EmuTime::param time)
  58. {
  59. if (newData != data) {
  60. data = newData;
  61. getPluggedPrintDev().writeData(data, time);
  62. }
  63. }
  64. const std::string SVIPrinterPort::getDescription() const
  65. {
  66. return "Spectravideo SVI-328 Printer port";
  67. }
  68. string_view SVIPrinterPort::getClass() const
  69. {
  70. return "Printer Port";
  71. }
  72. void SVIPrinterPort::plug(Pluggable& dev, EmuTime::param time)
  73. {
  74. Connector::plug(dev, time);
  75. getPluggedPrintDev().writeData(data, time);
  76. getPluggedPrintDev().setStrobe(strobe, time);
  77. }
  78. PrinterPortDevice& SVIPrinterPort::getPluggedPrintDev() const
  79. {
  80. return *checked_cast<PrinterPortDevice*>(&getPlugged());
  81. }
  82. template<typename Archive>
  83. void SVIPrinterPort::serialize(Archive& ar, unsigned /*version*/)
  84. {
  85. ar.template serializeBase<MSXDevice>(*this);
  86. ar.template serializeBase<Connector>(*this);
  87. ar.serialize("strobe", strobe);
  88. ar.serialize("data", data);
  89. // TODO force writing data to port??
  90. }
  91. INSTANTIATE_SERIALIZE_METHODS(SVIPrinterPort);
  92. REGISTER_MSXDEVICE(SVIPrinterPort, "SVI-328 PrinterPort");
  93. } // namespace openmsx