1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-08-13 15:25:56 +00:00

The MSX is now an activity source.

Completing the set.
This commit is contained in:
Thomas Harte
2018-05-12 17:32:53 -04:00
parent 3ba6b6f1ee
commit d0fd4dd4db
5 changed files with 54 additions and 13 deletions

View File

@@ -56,11 +56,12 @@ void DiskROM::run_for(HalfCycles half_cycles) {
controller_cycles_ %= 715909; controller_cycles_ %= 715909;
} }
void DiskROM::set_disk(std::shared_ptr<Storage::Disk::Disk> disk, int drive) { void DiskROM::set_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive) {
if(!drives_[drive]) { if(!drives_[drive]) {
drives_[drive].reset(new Storage::Disk::Drive(8000000, 300, 2)); drives_[drive].reset(new Storage::Disk::Drive(8000000, 300, 2));
drives_[drive]->set_head(selected_head_); drives_[drive]->set_head(selected_head_);
if(drive == selected_drive_) set_drive(drives_[drive]); 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);
} }
@@ -69,3 +70,16 @@ void DiskROM::set_head_load_request(bool head_load) {
// Magic! // Magic!
set_head_loaded(head_load); set_head_loaded(head_load);
} }
void DiskROM::set_activity_observer(Activity::Observer *observer) {
size_t c = 0;
observer_ = observer;
for(auto &drive: drives_) {
if(drive) drive->set_activity_observer(observer, drive_name(c), true);
++c;
}
}
std::string DiskROM::drive_name(size_t index) {
return "Drive " + std::to_string(index);
}

View File

@@ -11,9 +11,12 @@
#include "ROMSlotHandler.hpp" #include "ROMSlotHandler.hpp"
#include "../../Activity/Source.hpp"
#include "../../Components/1770/1770.hpp" #include "../../Components/1770/1770.hpp"
#include <array>
#include <cstdint> #include <cstdint>
#include <string>
#include <vector> #include <vector>
namespace MSX { namespace MSX {
@@ -26,17 +29,20 @@ class DiskROM: public ROMSlotHandler, public WD::WD1770 {
uint8_t read(uint16_t address) override; uint8_t read(uint16_t address) override;
void run_for(HalfCycles half_cycles) override; void run_for(HalfCycles half_cycles) override;
void set_disk(std::shared_ptr<Storage::Disk::Disk> disk, int drive); void set_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive);
void set_activity_observer(Activity::Observer *observer);
private: private:
const std::vector<uint8_t> &rom_; const std::vector<uint8_t> &rom_;
long int controller_cycles_ = 0; long int controller_cycles_ = 0;
int selected_drive_ = 0; size_t selected_drive_ = 0;
int selected_head_ = 0; int selected_head_ = 0;
std::shared_ptr<Storage::Disk::Drive> drives_[4]; 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;
}; };
} }

View File

@@ -30,6 +30,7 @@
#include "../../Storage/Tape/Parsers/MSX.hpp" #include "../../Storage/Tape/Parsers/MSX.hpp"
#include "../../Storage/Tape/Tape.hpp" #include "../../Storage/Tape/Tape.hpp"
#include "../../Activity/Source.hpp"
#include "../CRTMachine.hpp" #include "../CRTMachine.hpp"
#include "../ConfigurationTarget.hpp" #include "../ConfigurationTarget.hpp"
#include "../KeyboardMachine.hpp" #include "../KeyboardMachine.hpp"
@@ -87,7 +88,8 @@ class ConcreteMachine:
public KeyboardMachine::Machine, public KeyboardMachine::Machine,
public Configurable::Device, public Configurable::Device,
public MemoryMap, public MemoryMap,
public Sleeper::SleepObserver { public Sleeper::SleepObserver,
public Activity::Source {
public: public:
ConcreteMachine(): ConcreteMachine():
z80_(*this), z80_(*this),
@@ -200,14 +202,16 @@ class ConcreteMachine:
} }
if(!media.disks.empty()) { if(!media.disks.empty()) {
DiskROM *disk_rom = dynamic_cast<DiskROM *>(memory_slots_[2].handler.get()); DiskROM *disk_rom = get_disk_rom();
int drive = 0; if(disk_rom) {
size_t drive = 0;
for(auto &disk : media.disks) { for(auto &disk : media.disks) {
disk_rom->set_disk(disk, drive); disk_rom->set_disk(disk, drive);
drive++; drive++;
if(drive == 2) break; if(drive == 2) break;
} }
} }
}
set_use_fast_tape(); set_use_fast_tape();
@@ -556,7 +560,18 @@ class ConcreteMachine:
set_use_fast_tape(); set_use_fast_tape();
} }
// MARK: - Activity::Source
void set_activity_observer(Activity::Observer *observer) override {
DiskROM *disk_rom = get_disk_rom();
if(disk_rom) {
disk_rom->set_activity_observer(observer);
}
}
private: private:
DiskROM *get_disk_rom() {
return dynamic_cast<DiskROM *>(memory_slots_[2].handler.get());
}
void update_audio() { void update_audio() {
speaker_.run_for(audio_queue_, time_since_ay_update_.divide_cycles(Cycles(2))); speaker_.run_for(audio_queue_, time_since_ay_update_.divide_cycles(Cycles(2)));
} }

View File

@@ -26,7 +26,7 @@ void Microdisc::set_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive
if(!drives_[drive]) { if(!drives_[drive]) {
drives_[drive].reset(new Storage::Disk::Drive(8000000, 300, 2)); drives_[drive].reset(new Storage::Disk::Drive(8000000, 300, 2));
if(drive == selected_drive_) set_drive(drives_[drive]); if(drive == selected_drive_) set_drive(drives_[drive]);
drives_[drive]->set_activity_observer(observer_, "Drive" + std::to_string(drive), false); drives_[drive]->set_activity_observer(observer_, drive_name(drive), false);
} }
drives_[drive]->set_disk(disk); drives_[drive]->set_disk(disk);
} }
@@ -132,7 +132,11 @@ void Microdisc::set_activity_observer(Activity::Observer *observer) {
} }
size_t c = 0; size_t c = 0;
for(auto &drive : drives_) { for(auto &drive : drives_) {
if(drive) drive->set_activity_observer(observer, "Drive" + std::to_string(c), false); if(drive) drive->set_activity_observer(observer, drive_name(c), false);
++c; ++c;
} }
} }
std::string Microdisc::drive_name(size_t index) {
return "Drive " + std::to_string(index);
}

View File

@@ -57,6 +57,8 @@ class Microdisc: public WD::WD1770 {
Delegate *delegate_ = nullptr; Delegate *delegate_ = nullptr;
uint8_t last_control_ = 0; uint8_t last_control_ = 0;
Activity::Observer *observer_ = nullptr; Activity::Observer *observer_ = nullptr;
std::string drive_name(size_t index);
}; };
} }