Add SignalReady to APU init
This commit is contained in:
@@ -27,7 +27,7 @@ void APU::Init() {
|
|||||||
[this](int16_t sample) { this->PushToAudioBuffer(sample); });
|
[this](int16_t sample) { this->PushToAudioBuffer(sample); });
|
||||||
|
|
||||||
// Initialize registers
|
// Initialize registers
|
||||||
// ...
|
SignalReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
void APU::Reset() {
|
void APU::Reset() {
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ const int apuClocksPerSample = 64; // 64 clocks per sample
|
|||||||
class APU : public Observer {
|
class APU : public Observer {
|
||||||
public:
|
public:
|
||||||
// Initializes the APU with the necessary resources and dependencies
|
// Initializes the APU with the necessary resources and dependencies
|
||||||
APU(Memory &memory, AudioRam &aram, Clock &clock)
|
APU(MemoryImpl &memory, AudioRam &aram, Clock &clock)
|
||||||
: memory_(memory), aram_(aram), clock_(clock) {}
|
: aram_(aram), clock_(clock), memory_(memory) {}
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
|
|
||||||
@@ -68,7 +68,9 @@ class APU : public Observer {
|
|||||||
void UpdateClock(int delta_time) { clock_.UpdateClock(delta_time); }
|
void UpdateClock(int delta_time) { clock_.UpdateClock(delta_time); }
|
||||||
|
|
||||||
// Method to fetch a sample from AudioRam
|
// Method to fetch a sample from AudioRam
|
||||||
uint8_t FetchSampleFromRam(uint16_t address) { return aram_.read(address); }
|
uint8_t FetchSampleFromRam(uint16_t address) const {
|
||||||
|
return aram_.read(address);
|
||||||
|
}
|
||||||
|
|
||||||
// Method to push a processed sample to the audio buffer
|
// Method to push a processed sample to the audio buffer
|
||||||
void PushToAudioBuffer(int16_t sample) { audioSamples_.push_back(sample); }
|
void PushToAudioBuffer(int16_t sample) { audioSamples_.push_back(sample); }
|
||||||
@@ -94,13 +96,15 @@ class APU : public Observer {
|
|||||||
// Set Port 0 = $AA and Port 1 = $BB
|
// Set Port 0 = $AA and Port 1 = $BB
|
||||||
ports_[0] = READY_SIGNAL_0;
|
ports_[0] = READY_SIGNAL_0;
|
||||||
ports_[1] = READY_SIGNAL_1;
|
ports_[1] = READY_SIGNAL_1;
|
||||||
|
memory_.WriteByte(0x2140, READY_SIGNAL_0);
|
||||||
|
memory_.WriteByte(0x2141, READY_SIGNAL_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsReadySignalReceived() const {
|
bool IsReadySignalReceived() const {
|
||||||
return ports_[0] == READY_SIGNAL_0 && ports_[1] == READY_SIGNAL_1;
|
return ports_[0] == READY_SIGNAL_0 && ports_[1] == READY_SIGNAL_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaitForSignal() {
|
void WaitForSignal() const {
|
||||||
// This might be an active wait or a passive state where APU does nothing
|
// This might be an active wait or a passive state where APU does nothing
|
||||||
// until it's externally triggered by the main CPU writing to its ports.
|
// until it's externally triggered by the main CPU writing to its ports.
|
||||||
while (ports_[0] != BEGIN_SIGNAL)
|
while (ports_[0] != BEGIN_SIGNAL)
|
||||||
@@ -178,7 +182,7 @@ class APU : public Observer {
|
|||||||
// Member variables to store internal APU state and resources
|
// Member variables to store internal APU state and resources
|
||||||
AudioRam &aram_;
|
AudioRam &aram_;
|
||||||
Clock &clock_;
|
Clock &clock_;
|
||||||
Memory &memory_;
|
MemoryImpl &memory_;
|
||||||
|
|
||||||
DigitalSignalProcessor dsp_;
|
DigitalSignalProcessor dsp_;
|
||||||
SPC700 spc700_{aram_};
|
SPC700 spc700_{aram_};
|
||||||
|
|||||||
@@ -1530,7 +1530,7 @@ void CPU::LDA(uint16_t address, bool isImmediate) {
|
|||||||
SetZeroFlag(A == 0);
|
SetZeroFlag(A == 0);
|
||||||
SetNegativeFlag(A & 0x80);
|
SetNegativeFlag(A & 0x80);
|
||||||
} else {
|
} else {
|
||||||
A = isImmediate ? memory.ReadWord(PC) : memory.ReadWord(address);
|
A = isImmediate ? address : memory.ReadWord(address);
|
||||||
SetZeroFlag(A == 0);
|
SetZeroFlag(A == 0);
|
||||||
SetNegativeFlag(A & 0x8000);
|
SetNegativeFlag(A & 0x8000);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "app/emu/clock.h"
|
#include "app/emu/clock.h"
|
||||||
#include "app/emu/log.h"
|
#include "app/emu/debug/log.h"
|
||||||
#include "app/emu/mem.h"
|
#include "app/emu/mem.h"
|
||||||
|
|
||||||
namespace yaze {
|
namespace yaze {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "app/emu/log.h"
|
#include "app/emu/debug/log.h"
|
||||||
|
|
||||||
// LoROM (Mode 20):
|
// LoROM (Mode 20):
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ class Memory {
|
|||||||
|
|
||||||
class MemoryImpl : public Memory, public Loggable {
|
class MemoryImpl : public Memory, public Loggable {
|
||||||
public:
|
public:
|
||||||
void Initialize(const std::vector<uint8_t> romData) {
|
void Initialize(const std::vector<uint8_t>& romData) {
|
||||||
const size_t ROM_CHUNK_SIZE = 0x8000; // 32 KB
|
const size_t ROM_CHUNK_SIZE = 0x8000; // 32 KB
|
||||||
const size_t SRAM_SIZE = 0x10000; // 64 KB
|
const size_t SRAM_SIZE = 0x10000; // 64 KB
|
||||||
const size_t SYSTEM_RAM_SIZE = 0x20000; // 128 KB
|
const size_t SYSTEM_RAM_SIZE = 0x20000; // 128 KB
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ void SNES::Init(ROM& rom) {
|
|||||||
apu.Init();
|
apu.Init();
|
||||||
|
|
||||||
// Initialize SDL_Mixer to play the audio samples
|
// Initialize SDL_Mixer to play the audio samples
|
||||||
Mix_HookMusic(audio_callback, &apu);
|
// Mix_HookMusic(audio_callback, &apu);
|
||||||
|
|
||||||
// Disable interrupts and rendering
|
// Disable interrupts and rendering
|
||||||
memory_.WriteByte(0x4200, 0x00); // NMITIMEN
|
memory_.WriteByte(0x4200, 0x00); // NMITIMEN
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ class SNES : public DMA {
|
|||||||
std::atomic<uint32_t> frame_counter_;
|
std::atomic<uint32_t> frame_counter_;
|
||||||
|
|
||||||
// Other private member variables
|
// Other private member variables
|
||||||
bool running_;
|
bool running_ = false;
|
||||||
int scanline;
|
int scanline;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user