Files
P3DS-test/third_party/teakra/src/icu.h
wheremyfoodat 78002be334 Vendor Teakra, make emulator own DSP RAM and add DSP RAM to fastmem (#806)
* DSP: Own DSP RAM and add it to fastmem

* Vendor Teakra

* Add MacOS support to fastmem

* Fix MacOS fastmem paths

* Fix iOS build
2025-08-22 02:12:21 +03:00

90 lines
2.4 KiB
C++

#pragma once
#include <array>
#include <bitset>
#include <functional>
#include <mutex>
#include <utility>
#include "common_types.h"
namespace Teakra {
class ICU {
public:
using IrqBits = std::bitset<16>;
u16 GetRequest() const {
std::lock_guard lock(mutex);
return (u16)request.to_ulong();
}
void Acknowledge(u16 irq_bits) {
std::lock_guard lock(mutex);
request &= ~IrqBits(irq_bits);
}
u16 GetAcknowledge() {
return 0;
}
void Trigger(u16 irq_bits) {
std::lock_guard lock(mutex);
IrqBits bits(irq_bits);
request |= bits;
for (u32 irq = 0; irq < 16; ++irq) {
if (bits[irq]) {
for (u32 interrupt = 0; interrupt < enabled.size(); ++interrupt) {
if (enabled[interrupt][irq]) {
on_interrupt(interrupt);
}
}
if (vectored_enabled[irq]) {
on_vectored_interrupt(GetVector(irq), vector_context_switch[irq] != 0);
}
}
}
}
u16 GetTrigger() {
return 0;
}
void TriggerSingle(u32 irq) {
Trigger(1 << irq);
}
void SetEnable(u32 interrupt_index, u16 irq_bits) {
std::lock_guard lock(mutex);
enabled[interrupt_index] = IrqBits(irq_bits);
}
void SetEnableVectored(u16 irq_bits) {
std::lock_guard lock(mutex);
vectored_enabled = IrqBits(irq_bits);
}
u16 GetEnable(u32 interrupt_index) const {
std::lock_guard lock(mutex);
return (u16)enabled[interrupt_index].to_ulong();
}
u16 GetEnableVectored() const {
std::lock_guard lock(mutex);
return (u16)vectored_enabled.to_ulong();
}
u32 GetVector(u32 irq) const {
return vector_low[irq] | ((u32)vector_high[irq] << 16);
}
void SetInterruptHandler(std::function<void(u32)> interrupt,
std::function<void(u32, bool)> vectored_interrupt) {
on_interrupt = std::move(interrupt);
on_vectored_interrupt = std::move(vectored_interrupt);
}
std::array<u16, 16> vector_low, vector_high;
std::array<u16, 16> vector_context_switch;
private:
std::function<void(u32)> on_interrupt;
std::function<void(u32, bool)> on_vectored_interrupt;
IrqBits request;
std::array<IrqBits, 3> enabled;
IrqBits vectored_enabled;
mutable std::mutex mutex;
};
} // namespace Teakra