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:
@@ -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);
|
|
||||||
}
|
|
||||||
|
@@ -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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user