MSXTurboRPause.cc 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "MSXTurboRPause.hh"
  2. #include "LedStatus.hh"
  3. #include "MSXMotherBoard.hh"
  4. #include "serialize.hh"
  5. namespace openmsx {
  6. MSXTurboRPause::MSXTurboRPause(const DeviceConfig& config)
  7. : MSXDevice(config)
  8. , pauseSetting(
  9. getCommandController(), "turborpause",
  10. "status of the TurboR pause", false)
  11. , status(255)
  12. , pauseLed(false)
  13. , turboLed(false)
  14. , hwPause(false)
  15. {
  16. pauseSetting.attach(*this);
  17. reset(EmuTime::dummy());
  18. }
  19. MSXTurboRPause::~MSXTurboRPause()
  20. {
  21. powerDown(EmuTime::dummy());
  22. pauseSetting.detach(*this);
  23. }
  24. void MSXTurboRPause::powerDown(EmuTime::param time)
  25. {
  26. writeIO(0, 0, time); // send LED OFF events (if needed)
  27. }
  28. void MSXTurboRPause::reset(EmuTime::param time)
  29. {
  30. pauseSetting.setBoolean(false);
  31. writeIO(0, 0, time);
  32. }
  33. byte MSXTurboRPause::readIO(word port, EmuTime::param time)
  34. {
  35. return peekIO(port, time);
  36. }
  37. byte MSXTurboRPause::peekIO(word /*port*/, EmuTime::param /*time*/) const
  38. {
  39. return pauseSetting.getBoolean() ? 1 : 0;
  40. }
  41. void MSXTurboRPause::writeIO(word /*port*/, byte value, EmuTime::param /*time*/)
  42. {
  43. status = value;
  44. bool newTurboLed = (status & 0x80) != 0;
  45. if (newTurboLed != turboLed) {
  46. turboLed = newTurboLed;
  47. getLedStatus().setLed(LedStatus::TURBO, turboLed);
  48. }
  49. updatePause();
  50. }
  51. void MSXTurboRPause::update(const Setting& /*setting*/)
  52. {
  53. updatePause();
  54. }
  55. void MSXTurboRPause::updatePause()
  56. {
  57. bool newHwPause = (status & 0x02) && pauseSetting.getBoolean();
  58. if (newHwPause != hwPause) {
  59. hwPause = newHwPause;
  60. if (hwPause) {
  61. getMotherBoard().pause();
  62. } else {
  63. getMotherBoard().unpause();
  64. }
  65. }
  66. bool newPauseLed = (status & 0x01) || hwPause;
  67. if (newPauseLed != pauseLed) {
  68. pauseLed = newPauseLed;
  69. getLedStatus().setLed(LedStatus::PAUSE, pauseLed);
  70. }
  71. }
  72. template<typename Archive>
  73. void MSXTurboRPause::serialize(Archive& ar, unsigned /*version*/)
  74. {
  75. ar.template serializeBase<MSXDevice>(*this);
  76. ar.serialize("status", status);
  77. if (ar.isLoader()) {
  78. writeIO(0, status, EmuTime::dummy());
  79. }
  80. }
  81. INSTANTIATE_SERIALIZE_METHODS(MSXTurboRPause);
  82. REGISTER_MSXDEVICE(MSXTurboRPause, "TurboRPause");
  83. } // namespace openmsx