1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-02-23 03:29:04 +00:00

Ensures the MSX reports the proper number of drives.

This commit is contained in:
Thomas Harte 2018-06-18 22:15:52 -04:00
parent 685a80f95b
commit 1bdc718527
2 changed files with 8 additions and 19 deletions

View File

@ -13,6 +13,8 @@ using namespace MSX;
DiskROM::DiskROM(const std::vector<uint8_t> &rom) :
WD1770(P1793),
rom_(rom) {
drives_[0].reset(new Storage::Disk::Drive(8000000, 300, 2));
drives_[1].reset(new Storage::Disk::Drive(8000000, 300, 2));
set_is_double_density(true);
}
@ -23,16 +25,16 @@ void DiskROM::write(uint16_t address, uint8_t value, bool pc_is_outside_bios) {
break;
case 0x7ffc:
selected_head_ = value & 1;
if(drives_[0]) drives_[0]->set_head(selected_head_);
if(drives_[1]) drives_[1]->set_head(selected_head_);
drives_[0]->set_head(selected_head_);
drives_[1]->set_head(selected_head_);
break;
case 0x7ffd: {
selected_drive_ = value & 1;
set_drive(drives_[selected_drive_]);
bool drive_motor = !!(value & 0x80);
if(drives_[0]) drives_[0]->set_motor_on(drive_motor);
if(drives_[1]) drives_[1]->set_motor_on(drive_motor);
drives_[0]->set_motor_on(drive_motor);
drives_[1]->set_motor_on(drive_motor);
} break;
}
}
@ -57,12 +59,6 @@ void DiskROM::run_for(HalfCycles half_cycles) {
}
void DiskROM::set_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive) {
if(!drives_[drive]) {
drives_[drive].reset(new Storage::Disk::Drive(8000000, 300, 2));
drives_[drive]->set_head(selected_head_);
if(drive == selected_drive_) set_drive(drives_[drive]);
drives_[drive]->set_activity_observer(observer_, drive_name(drive), true);
}
drives_[drive]->set_disk(disk);
}
@ -72,14 +68,9 @@ void DiskROM::set_head_load_request(bool head_load) {
}
void DiskROM::set_activity_observer(Activity::Observer *observer) {
size_t c = 0;
observer_ = observer;
size_t c = 1;
for(auto &drive: drives_) {
if(drive) drive->set_activity_observer(observer, drive_name(c), true);
drive->set_activity_observer(observer, "Drive " + std::to_string(c), true);
++c;
}
}
std::string DiskROM::drive_name(size_t index) {
return "Drive " + std::to_string(index);
}

View File

@ -41,8 +41,6 @@ class DiskROM: public ROMSlotHandler, public WD::WD1770 {
std::array<std::shared_ptr<Storage::Disk::Drive>, 2> drives_;
void set_head_load_request(bool head_load) override;
std::string drive_name(size_t index);
Activity::Observer *observer_ = nullptr;
};
}