BeerIDE.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "BeerIDE.hh"
  2. #include "IDEDeviceFactory.hh"
  3. #include "IDEDevice.hh"
  4. #include "GlobalSettings.hh"
  5. #include "serialize.hh"
  6. namespace openmsx {
  7. BeerIDE::BeerIDE(const DeviceConfig& config)
  8. : MSXDevice(config)
  9. , i8255(*this, getCurrentTime(), config.getGlobalSettings().getInvalidPpiModeSetting())
  10. , rom(getName() + " ROM", "rom", config)
  11. {
  12. device = IDEDeviceFactory::create(
  13. DeviceConfig(config, config.findChild("idedevice")));
  14. powerUp(getCurrentTime());
  15. }
  16. BeerIDE::~BeerIDE() = default;
  17. void BeerIDE::reset(EmuTime::param time)
  18. {
  19. controlReg = 0;
  20. dataReg = 0;
  21. device->reset(time);
  22. i8255.reset(time);
  23. }
  24. byte BeerIDE::readMem(word address, EmuTime::param /*time*/)
  25. {
  26. if (0x4000 <= address && address < 0x8000) {
  27. return rom[address & 0x3FFF];
  28. }
  29. return 0xFF;
  30. }
  31. const byte* BeerIDE::getReadCacheLine(word start) const
  32. {
  33. if (0x4000 <= start && start < 0x8000) {
  34. return &rom[start & 0x3FFF];
  35. }
  36. return unmappedRead;
  37. }
  38. byte BeerIDE::readIO(word port, EmuTime::param time)
  39. {
  40. return i8255.read(port & 0x03, time);
  41. }
  42. byte BeerIDE::peekIO(word port, EmuTime::param time) const
  43. {
  44. return i8255.peek(port & 0x03, time);
  45. }
  46. void BeerIDE::writeIO(word port, byte value, EmuTime::param time)
  47. {
  48. i8255.write(port & 0x03, value, time);
  49. }
  50. // I8255Interface
  51. byte BeerIDE::readA(EmuTime::param time)
  52. {
  53. return peekA(time);
  54. }
  55. byte BeerIDE::peekA(EmuTime::param /*time*/) const
  56. {
  57. return (dataReg & 0xFF);
  58. }
  59. void BeerIDE::writeA(byte value, EmuTime::param /*time*/)
  60. {
  61. dataReg &= 0xFF00;
  62. dataReg |= value;
  63. }
  64. byte BeerIDE::readB(EmuTime::param time)
  65. {
  66. return peekB(time);
  67. }
  68. byte BeerIDE::peekB(EmuTime::param /*time*/) const
  69. {
  70. return (dataReg >> 8);
  71. }
  72. void BeerIDE::writeB(byte value, EmuTime::param /*time*/)
  73. {
  74. dataReg &= 0x00FF;
  75. dataReg |= (value << 8);
  76. }
  77. nibble BeerIDE::readC1(EmuTime::param time)
  78. {
  79. return peekC1(time);
  80. }
  81. nibble BeerIDE::peekC1(EmuTime::param /*time*/) const
  82. {
  83. return 0; // TODO check this
  84. }
  85. nibble BeerIDE::readC0(EmuTime::param time)
  86. {
  87. return peekC0(time);
  88. }
  89. nibble BeerIDE::peekC0(EmuTime::param /*time*/) const
  90. {
  91. return 0; // TODO check this
  92. }
  93. void BeerIDE::writeC1(nibble value, EmuTime::param time)
  94. {
  95. changeControl((controlReg & 0x0F) | (value << 4), time);
  96. }
  97. void BeerIDE::writeC0(nibble value, EmuTime::param time)
  98. {
  99. changeControl((controlReg & 0xF0) | value, time);
  100. }
  101. void BeerIDE::changeControl(byte value, EmuTime::param time)
  102. {
  103. byte diff = controlReg ^ value;
  104. controlReg = value;
  105. if ((diff & 0xE7) == 0) return; // nothing relevant changed
  106. byte address = controlReg & 7;
  107. switch (value & 0xE0) {
  108. case 0x40: // read /IORD=0, /IOWR=1, /CS0=0
  109. if (address == 0) {
  110. dataReg = device->readData(time);
  111. } else {
  112. dataReg = device->readReg(address, time);
  113. }
  114. break;
  115. case 0x80: // write /IORD=1, /IOWR=0, /CS0=0
  116. if (address == 0) {
  117. device->writeData(dataReg, time);
  118. } else {
  119. device->writeReg(address, dataReg & 0xFF, time);
  120. }
  121. break;
  122. default: // all (6) other cases, nothing
  123. break;
  124. }
  125. }
  126. template<typename Archive>
  127. void BeerIDE::serialize(Archive& ar, unsigned /*version*/)
  128. {
  129. ar.template serializeBase<MSXDevice>(*this);
  130. ar.serialize("i8255", i8255);
  131. ar.serializePolymorphic("device", *device);
  132. ar.serialize("dataReg", dataReg,
  133. "controlReg", controlReg);
  134. }
  135. INSTANTIATE_SERIALIZE_METHODS(BeerIDE);
  136. REGISTER_MSXDEVICE(BeerIDE, "BeerIDE");
  137. } // namespace openmsx