1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-08-08 14:25:05 +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) : DiskROM::DiskROM(const std::vector<uint8_t> &rom) :
WD1770(P1793), WD1770(P1793),
rom_(rom) { 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); set_is_double_density(true);
} }
@@ -23,16 +25,16 @@ void DiskROM::write(uint16_t address, uint8_t value, bool pc_is_outside_bios) {
break; break;
case 0x7ffc: case 0x7ffc:
selected_head_ = value & 1; selected_head_ = value & 1;
if(drives_[0]) drives_[0]->set_head(selected_head_); drives_[0]->set_head(selected_head_);
if(drives_[1]) drives_[1]->set_head(selected_head_); drives_[1]->set_head(selected_head_);
break; break;
case 0x7ffd: { case 0x7ffd: {
selected_drive_ = value & 1; selected_drive_ = value & 1;
set_drive(drives_[selected_drive_]); set_drive(drives_[selected_drive_]);
bool drive_motor = !!(value & 0x80); bool drive_motor = !!(value & 0x80);
if(drives_[0]) drives_[0]->set_motor_on(drive_motor); drives_[0]->set_motor_on(drive_motor);
if(drives_[1]) drives_[1]->set_motor_on(drive_motor); drives_[1]->set_motor_on(drive_motor);
} break; } 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) { 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); 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) { void DiskROM::set_activity_observer(Activity::Observer *observer) {
size_t c = 0; size_t c = 1;
observer_ = observer;
for(auto &drive: drives_) { 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; ++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_; std::array<std::shared_ptr<Storage::Disk::Drive>, 2> drives_;
void set_head_load_request(bool head_load) override; void set_head_load_request(bool head_load) override;
std::string drive_name(size_t index);
Activity::Observer *observer_ = nullptr;
}; };
} }