2017-03-19 01:01:58 +00:00
|
|
|
//
|
|
|
|
// Bus.h
|
|
|
|
// Clock Signal
|
|
|
|
//
|
|
|
|
// Created by Thomas Harte on 18/03/2017.
|
2018-05-13 19:19:52 +00:00
|
|
|
// Copyright 2017 Thomas Harte. All rights reserved.
|
2017-03-19 01:01:58 +00:00
|
|
|
//
|
|
|
|
|
2024-01-17 04:34:46 +00:00
|
|
|
#pragma once
|
2017-03-19 01:01:58 +00:00
|
|
|
|
2017-04-04 01:16:39 +00:00
|
|
|
#include "Atari2600.hpp"
|
2017-03-19 01:01:58 +00:00
|
|
|
#include "PIA.hpp"
|
2017-04-04 01:16:39 +00:00
|
|
|
#include "TIA.hpp"
|
2017-12-18 02:26:06 +00:00
|
|
|
#include "TIASound.hpp"
|
2017-07-26 00:20:55 +00:00
|
|
|
|
2019-11-09 20:31:41 +00:00
|
|
|
#include "../../../Analyser/Dynamic/ConfidenceCounter.hpp"
|
|
|
|
#include "../../../ClockReceiver/ClockReceiver.hpp"
|
|
|
|
#include "../../../Outputs/Speaker/Implementation/LowpassSpeaker.hpp"
|
2017-03-19 01:01:58 +00:00
|
|
|
|
|
|
|
namespace Atari2600 {
|
|
|
|
|
|
|
|
class Bus {
|
2024-12-02 02:44:14 +00:00
|
|
|
public:
|
|
|
|
Bus() :
|
|
|
|
tia_sound_(audio_queue_),
|
|
|
|
speaker_(tia_sound_) {}
|
2017-03-19 01:01:58 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
virtual ~Bus() {
|
|
|
|
audio_queue_.flush();
|
|
|
|
}
|
2018-03-23 01:59:19 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
virtual void run_for(const Cycles cycles) = 0;
|
|
|
|
virtual void apply_confidence(Analyser::Dynamic::ConfidenceCounter &confidence_counter) = 0;
|
|
|
|
virtual void set_reset_line(bool state) = 0;
|
|
|
|
virtual void flush() = 0;
|
2017-03-19 01:01:58 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
// the RIOT, TIA and speaker
|
|
|
|
PIA mos6532_;
|
|
|
|
TIA tia_;
|
2017-12-18 02:26:06 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
Concurrency::AsyncTaskQueue<false> audio_queue_;
|
|
|
|
TIASound tia_sound_;
|
|
|
|
Outputs::Speaker::PullLowpass<TIASound> speaker_;
|
2017-03-19 01:01:58 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
// joystick state
|
|
|
|
uint8_t tia_input_value_[2] = {0xff, 0xff};
|
2017-03-19 01:01:58 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
protected:
|
|
|
|
// speaker backlog accumlation counter
|
|
|
|
Cycles cycles_since_speaker_update_;
|
|
|
|
inline void update_audio() {
|
|
|
|
speaker_.run_for(audio_queue_, cycles_since_speaker_update_.divide(Cycles(CPUTicksPerAudioTick * 3)));
|
|
|
|
}
|
2017-03-19 01:01:58 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
// video backlog accumulation counter
|
|
|
|
Cycles cycles_since_video_update_;
|
|
|
|
inline void update_video() {
|
|
|
|
tia_.run_for(cycles_since_video_update_.flush<Cycles>());
|
|
|
|
}
|
2017-03-19 01:01:58 +00:00
|
|
|
|
2024-12-02 02:44:14 +00:00
|
|
|
// RIOT backlog accumulation counter
|
|
|
|
Cycles cycles_since_6532_update_;
|
|
|
|
inline void update_6532() {
|
|
|
|
mos6532_.run_for(cycles_since_6532_update_.flush<Cycles>());
|
|
|
|
}
|
2017-03-19 01:01:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|