1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-10-02 19:54:35 +00:00

Makes the Apple II an activity source.

This commit is contained in:
Thomas Harte 2018-05-10 22:17:13 -04:00
parent 9089bf6535
commit a43ca0db35
6 changed files with 33 additions and 4 deletions

View File

@ -236,3 +236,7 @@ uint8_t DiskII::trigger_address(int address, uint8_t value) {
return 0xff;
}
void DiskII::set_activity_observer(Activity::Observer *observer) {
drives_[0].set_activity_observer(observer, "Drive 1", true);
drives_[1].set_activity_observer(observer, "Drive 2", true);
}

View File

@ -15,6 +15,8 @@
#include "../../Storage/Disk/Disk.hpp"
#include "../../Storage/Disk/Drive.hpp"
#include "../../Activity/Observer.hpp"
#include <array>
#include <cstdint>
#include <vector>
@ -40,6 +42,8 @@ class DiskII:
void set_disk(const std::shared_ptr<Storage::Disk::Disk> &disk, int drive);
bool is_sleeping() override;
void set_activity_observer(Activity::Observer *observer);
private:
enum class Control {
P0, P1, P2, P3,

View File

@ -8,6 +8,7 @@
#include "AppleII.hpp"
#include "../../Activity/Source.hpp"
#include "../ConfigurationTarget.hpp"
#include "../CRTMachine.hpp"
#include "../KeyboardMachine.hpp"
@ -24,6 +25,7 @@
#include "../../Analyser/Static/AppleII/Target.hpp"
#include <array>
#include <memory>
namespace {
@ -34,7 +36,8 @@ class ConcreteMachine:
public KeyboardMachine::Machine,
public CPU::MOS6502::BusHandler,
public Inputs::Keyboard,
public AppleII::Machine {
public AppleII::Machine,
public Activity::Source {
private:
struct VideoBusHandler : public AppleII::Video::BusHandler {
public:
@ -62,8 +65,8 @@ class ConcreteMachine:
speaker_.run_for(audio_queue_, cycles_since_audio_update_.divide(Cycles(audio_divider)));
}
void update_cards() {
for(int c = 0; c < 7; ++c) {
if(cards_[c]) cards_[c]->run_for(cycles_since_card_update_, stretched_cycles_since_card_update_);
for(const auto &card : cards_) {
if(card) card->run_for(cycles_since_card_update_, stretched_cycles_since_card_update_);
}
cycles_since_card_update_ = 0;
stretched_cycles_since_card_update_ = 0;
@ -80,7 +83,7 @@ class ConcreteMachine:
Cycles cycles_since_audio_update_;
ROMMachine::ROMFetcher rom_fetcher_;
std::unique_ptr<AppleII::Card> cards_[7];
std::array<std::unique_ptr<AppleII::Card>, 7> cards_;
Cycles cycles_since_card_update_;
int stretched_cycles_since_card_update_ = 0;
@ -372,6 +375,13 @@ class ConcreteMachine:
}
return true;
}
// MARK: Activity::Source
void set_activity_observer(Activity::Observer *observer) override {
for(const auto &card: cards_) {
if(card) card->set_activity_observer(observer);
}
}
};
}

View File

@ -11,6 +11,7 @@
#include "../../Processors/6502/6502.hpp"
#include "../../ClockReceiver/ClockReceiver.hpp"
#include "../../Activity/Observer.hpp"
namespace AppleII {
@ -21,6 +22,9 @@ class Card {
/*! Performs a bus operation; the card is implicitly selected. */
virtual void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) = 0;
/*! Supplies a target for observers. */
virtual void set_activity_observer(Activity::Observer *observer) {}
};
}

View File

@ -40,3 +40,7 @@ void DiskIICard::run_for(Cycles cycles, int stretches) {
void DiskIICard::set_disk(const std::shared_ptr<Storage::Disk::Disk> &disk, int drive) {
diskii_.set_disk(disk, drive);
}
void DiskIICard::set_activity_observer(Activity::Observer *observer) {
diskii_.set_activity_observer(observer);
}

View File

@ -24,8 +24,11 @@ namespace AppleII {
class DiskIICard: public Card {
public:
DiskIICard(const ROMMachine::ROMFetcher &rom_fetcher, bool is_16_sector);
void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) override;
void run_for(Cycles cycles, int stretches) override;
void set_activity_observer(Activity::Observer *observer) override;
void set_disk(const std::shared_ptr<Storage::Disk::Disk> &disk, int drive);
private: