Support CD IO and start removing old IOPort
This commit is contained in:
@@ -31,7 +31,7 @@ namespace JabyEngine {
|
||||
static constexpr uint8_t Max = 0xFF;
|
||||
};
|
||||
|
||||
__declare_io_type(Mode, uint8_t,
|
||||
__new_declare_io_value(Mode, uint8_t) {
|
||||
static constexpr auto DoubleSpeed = Bit(7);
|
||||
static constexpr auto SingleSpeed = !DoubleSpeed;
|
||||
static constexpr auto XADPCM = Bit(6);
|
||||
@@ -41,9 +41,13 @@ namespace JabyEngine {
|
||||
static constexpr auto AudioPlayIRQ = Bit(2);
|
||||
static constexpr auto AutoPauseTrack = Bit(1);
|
||||
static constexpr auto CDDA = Bit(0);
|
||||
);
|
||||
|
||||
__declare_io_type(IndexStatus, uint8_t,
|
||||
operator uint8_t() const {
|
||||
return this->raw;
|
||||
}
|
||||
};
|
||||
|
||||
__new_declare_io_value(IndexStatus, uint8_t) {
|
||||
static constexpr auto PortIndex = BitRange::from_to(0, 1);
|
||||
static constexpr auto HasXAFifoData = Bit(2);
|
||||
static constexpr auto IsParameterFifoEmpty = Bit(3);
|
||||
@@ -51,30 +55,31 @@ namespace JabyEngine {
|
||||
static constexpr auto HasResponseFifoData = Bit(5);
|
||||
static constexpr auto HasDataFifoData = Bit(6);
|
||||
static constexpr auto IsTransmissionBusy = Bit(7);
|
||||
);
|
||||
};
|
||||
|
||||
__declare_io_type(InterruptEnable, uint8_t,
|
||||
__new_declare_io_value(InterruptEnable, uint8_t) {
|
||||
static constexpr auto InterruptTypValue = BitRange::from_to(0, 2);
|
||||
static constexpr auto InterruptExtended = BitRange::from_to(0, 4);
|
||||
static constexpr auto UnknownIRQ = Bit(3);
|
||||
static constexpr auto CommandStartIRQ = Bit(4);
|
||||
);
|
||||
typedef InterruptEnable_v InterruptFlag_v;
|
||||
};
|
||||
using InterruptFlag = InterruptEnable;
|
||||
|
||||
__declare_io_type(Request, uint8_t,
|
||||
|
||||
__new_declare_io_value(Request, uint8_t) {
|
||||
static constexpr auto WantCommandStartIRQ = Bit(5);
|
||||
static constexpr auto WantData = Bit(7);
|
||||
|
||||
void want_data() {
|
||||
this->raw_value = static_cast<uint8_t>(Self::WantData);
|
||||
static Request want_data() {
|
||||
return Request{static_cast<uint8_t>(Request::WantData)};
|
||||
}
|
||||
|
||||
void reset() {
|
||||
this->raw_value = 0;
|
||||
static Request reset() {
|
||||
return Request{0};
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
__declare_io_type(SoundMapCoding, uint8_t,
|
||||
__new_declare_io_value(SoundMapCoding, uint8_t) {
|
||||
static constexpr auto Stereo = Bit(0);
|
||||
static constexpr auto Mono = !Stereo;
|
||||
static constexpr auto SampleRate_18900hz = Bit(2);
|
||||
@@ -82,23 +87,33 @@ namespace JabyEngine {
|
||||
static constexpr auto BitsPerSample8 = Bit(4);
|
||||
static constexpr auto BitsPerSample4 = !BitsPerSample8;
|
||||
static constexpr auto Emphasis = Bit(6);
|
||||
);
|
||||
};
|
||||
|
||||
__declare_io_type(AudioVolumeApply, uint8_t,
|
||||
__new_declare_io_value(AudioVolumeApply, uint8_t) {
|
||||
static constexpr auto Mute = Bit(0);
|
||||
static constexpr auto ApplyChanges = Bit(5);
|
||||
);
|
||||
};
|
||||
|
||||
__declare_io_type(ResponseFifo, uint8_t,);
|
||||
__declare_io_type(CommandFifo, uint8_t,);
|
||||
__declare_io_type(DataFifo, uint8_t,);
|
||||
__declare_io_type(DataFifo16, uint16_t,);
|
||||
__declare_io_type(ParameterFifo, uint8_t,);
|
||||
__declare_io_type(SoundMapDataOut, uint8_t,);
|
||||
__declare_io_type(LeftCD2LeftSPU, CDDAVolume::Type,);
|
||||
__declare_io_type(LeftCD2RightSPU, CDDAVolume::Type,);
|
||||
__declare_io_type(RightCD2RightSPU,CDDAVolume::Type,);
|
||||
__declare_io_type(RightCD2LeftSPU, CDDAVolume::Type,);
|
||||
__new_declare_io_value(ResponseFifo, uint8_t) {
|
||||
};
|
||||
__new_declare_io_value(CommandFifo, uint8_t) {
|
||||
};
|
||||
__new_declare_io_value(DataFifo, uint8_t) {
|
||||
};
|
||||
__new_declare_io_value(DataFifo16, uint16_t) {
|
||||
};
|
||||
__new_declare_io_value(ParameterFifo, uint8_t) {
|
||||
};
|
||||
__new_declare_io_value(SoundMapDataOut, uint8_t) {
|
||||
};
|
||||
__new_declare_io_value(LeftCD2LeftSPU, CDDAVolume::Type) {
|
||||
};
|
||||
__new_declare_io_value(LeftCD2RightSPU, CDDAVolume::Type) {
|
||||
};
|
||||
__new_declare_io_value(RightCD2RightSPU, CDDAVolume::Type) {
|
||||
};
|
||||
__new_declare_io_value(RightCD2LeftSPU, CDDAVolume::Type) {
|
||||
};
|
||||
|
||||
struct Interrupt {
|
||||
enum Type : uint8_t {
|
||||
@@ -110,24 +125,24 @@ namespace JabyEngine {
|
||||
DiskError = 5
|
||||
};
|
||||
|
||||
static void enable(InterruptEnable_v& port) {
|
||||
port.set(InterruptEnable_t::InterruptTypValue.range_max<uint8_t>());
|
||||
static void enable(New::IOPort<InterruptEnable>& port) {
|
||||
port.write(port.read().set2(InterruptEnable::InterruptTypValue.range_max<uint8_t>()));
|
||||
}
|
||||
|
||||
static void enable_extended(InterruptEnable_v& port) {
|
||||
port = InterruptEnable_t::from(InterruptEnable_t::InterruptTypValue.range_max<uint8_t>(), InterruptEnable_t::UnknownIRQ, InterruptEnable_t::CommandStartIRQ);
|
||||
static void enable_extended(New::IOPort<InterruptEnable>& port) {
|
||||
port.write(InterruptEnable::from(InterruptEnable::InterruptTypValue.range_max<uint8_t>(), InterruptEnable::UnknownIRQ, InterruptEnable::CommandStartIRQ));
|
||||
}
|
||||
|
||||
static Type get_type(const InterruptFlag_v& port) {
|
||||
return static_cast<Type>(port.get(InterruptFlag_v::InterruptTypValue));
|
||||
static Type get_type(const New::IOPort<InterruptFlag>& port) {
|
||||
return static_cast<Type>(port.read().get2(InterruptFlag::InterruptTypValue));
|
||||
}
|
||||
|
||||
static void ack(InterruptFlag_v& port) {
|
||||
port.set(InterruptFlag_v::InterruptTypValue.range_max<uint8_t>());
|
||||
static void ack(New::IOPort<InterruptFlag>& port) {
|
||||
port.write(port.read().set2(InterruptFlag::InterruptTypValue.range_max<uint8_t>()));
|
||||
}
|
||||
|
||||
static void ack_extended(InterruptFlag_v& port) {
|
||||
port = InterruptFlag_v::from(InterruptFlag_v::InterruptTypValue.range_max<uint8_t>(), InterruptEnable_v::UnknownIRQ, InterruptEnable_v::CommandStartIRQ);
|
||||
static void ack_extended(New::IOPort<InterruptFlag>& port) {
|
||||
port.write(InterruptFlag::from(InterruptFlag::InterruptTypValue.range_max<uint8_t>(), InterruptEnable::UnknownIRQ, InterruptEnable::CommandStartIRQ));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -149,71 +164,71 @@ namespace JabyEngine {
|
||||
static constexpr auto IORegister2Adr = 0x1F801802;
|
||||
static constexpr auto IORegister3Adr = 0x1F801803;
|
||||
|
||||
__declare_new_io_port(IndexStatus, 0x1F801800);
|
||||
__new_declare_io_port(, IndexStatus, 0x1F801800);
|
||||
|
||||
#define __declare_index_io_port(type, name, adr) __cast_io_adr_with_type(inline, type, name, adr)
|
||||
#define __declare_index_io_port_const(type, name, adr) __cast_io_adr_with_type(const inline, type, name, adr)
|
||||
//#define __declare_index_io_port(type, name, adr) __cast_io_adr_with_type(inline, type, name, adr)
|
||||
//#define __declare_index_io_port_const(type, name, adr) __cast_io_adr_with_type(const inline, type, name, adr)
|
||||
|
||||
struct PortIndex0 {
|
||||
__declare_new_const_io_port(ResponseFifo, IORegister1Adr);
|
||||
__declare_new_io_port(CommandFifo, IORegister1Adr);
|
||||
__new_declare_io_port(inline const, ResponseFifo, IORegister1Adr);
|
||||
__new_declare_io_port(inline, CommandFifo, IORegister1Adr);
|
||||
|
||||
__declare_new_const_io_port(DataFifo, IORegister2Adr);
|
||||
__declare_new_const_io_port(DataFifo16, IORegister2Adr);
|
||||
__declare_new_io_port(ParameterFifo, IORegister2Adr);
|
||||
__new_declare_io_port(inline const, DataFifo, IORegister2Adr);
|
||||
__new_declare_io_port(inline const, DataFifo16, IORegister2Adr);
|
||||
__new_declare_io_port(inline, ParameterFifo, IORegister2Adr);
|
||||
|
||||
__declare_new_const_io_port(InterruptEnable, IORegister3Adr);
|
||||
__declare_new_io_port(Request, IORegister3Adr);
|
||||
__new_declare_io_port(inline const, InterruptEnable, IORegister3Adr);
|
||||
__new_declare_io_port(inline, Request, IORegister3Adr);
|
||||
|
||||
static void change_to() {
|
||||
IndexStatus = Index::Index0;
|
||||
IndexStatus.write({Index::Index0});
|
||||
}
|
||||
};
|
||||
|
||||
struct PortIndex1 {
|
||||
__declare_new_const_io_port(ResponseFifo, IORegister1Adr);
|
||||
__declare_new_io_port(SoundMapDataOut, IORegister1Adr);
|
||||
__new_declare_io_port(inline const, ResponseFifo, IORegister1Adr);
|
||||
__new_declare_io_port(inline, SoundMapDataOut, IORegister1Adr);
|
||||
|
||||
__declare_new_const_io_port(DataFifo, IORegister2Adr);
|
||||
__declare_new_const_io_port(DataFifo16, IORegister2Adr);
|
||||
__declare_new_io_port(InterruptEnable, IORegister2Adr);
|
||||
__new_declare_io_port(inline const, DataFifo, IORegister2Adr);
|
||||
__new_declare_io_port(inline const, DataFifo16, IORegister2Adr);
|
||||
__new_declare_io_port(inline, InterruptEnable, IORegister2Adr);
|
||||
|
||||
__declare_new_io_port(InterruptFlag, IORegister3Adr);
|
||||
__new_declare_io_port_w_type(inline, struct InterruptEnable, InterruptFlag, IORegister3Adr);
|
||||
|
||||
static void change_to() {
|
||||
IndexStatus = Index::Index1;
|
||||
}
|
||||
IndexStatus.write({Index::Index1});
|
||||
}
|
||||
};
|
||||
|
||||
struct PortIndex2 {
|
||||
__declare_new_const_io_port(ResponseFifo, IORegister1Adr);
|
||||
__declare_new_io_port(SoundMapCoding, IORegister1Adr);
|
||||
__new_declare_io_port(inline const, ResponseFifo, IORegister1Adr);
|
||||
__new_declare_io_port(inline, SoundMapCoding, IORegister1Adr);
|
||||
|
||||
__declare_new_const_io_port(DataFifo, IORegister2Adr);
|
||||
__declare_new_const_io_port(DataFifo16, IORegister2Adr);
|
||||
__declare_new_io_port(LeftCD2LeftSPU, IORegister2Adr);
|
||||
__new_declare_io_port(inline const, DataFifo, IORegister2Adr);
|
||||
__new_declare_io_port(inline const, DataFifo16, IORegister2Adr);
|
||||
__new_declare_io_port(inline, LeftCD2LeftSPU, IORegister2Adr);
|
||||
|
||||
__declare_new_const_io_port(InterruptEnable, IORegister3Adr);
|
||||
__declare_new_io_port(LeftCD2RightSPU, IORegister3Adr);
|
||||
__new_declare_io_port(inline const, InterruptEnable, IORegister3Adr);
|
||||
__new_declare_io_port(inline, LeftCD2RightSPU, IORegister3Adr);
|
||||
|
||||
static void change_to() {
|
||||
IndexStatus = Index::Index2;
|
||||
IndexStatus.write({Index::Index2});
|
||||
}
|
||||
};
|
||||
|
||||
struct PortIndex3 {
|
||||
__declare_new_const_io_port(ResponseFifo, IORegister1Adr);
|
||||
__declare_new_io_port(RightCD2RightSPU, IORegister1Adr);
|
||||
__new_declare_io_port(inline const, ResponseFifo, IORegister1Adr);
|
||||
__new_declare_io_port(inline, RightCD2RightSPU, IORegister1Adr);
|
||||
|
||||
__declare_new_const_io_port(DataFifo, IORegister2Adr);
|
||||
__declare_new_const_io_port(DataFifo16, IORegister2Adr);
|
||||
__declare_new_io_port(RightCD2LeftSPU, IORegister1Adr);
|
||||
__new_declare_io_port(inline const, DataFifo, IORegister2Adr);
|
||||
__new_declare_io_port(inline const, DataFifo16, IORegister2Adr);
|
||||
__new_declare_io_port(inline, RightCD2LeftSPU, IORegister1Adr);
|
||||
|
||||
__declare_new_const_io_port(InterruptFlag, IORegister3Adr);
|
||||
__declare_new_io_port(AudioVolumeApply, IORegister3Adr);
|
||||
__new_declare_io_port_w_type(inline const, struct InterruptEnable, InterruptFlag, IORegister3Adr);
|
||||
__new_declare_io_port(inline, AudioVolumeApply, IORegister3Adr);
|
||||
|
||||
static void change_to() {
|
||||
IndexStatus = Index::Index3;
|
||||
IndexStatus.write({Index::Index3});
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user