From ca592eda9a72119d2019e8efe106233d593d70d3 Mon Sep 17 00:00:00 2001 From: Jaby Date: Fri, 7 Jun 2024 15:24:31 +0200 Subject: [PATCH] The end 07.06.2024 --- .../internal-include/CD/cd_internal.hpp | 39 ++++++++++++++----- src/Library/src/CD/cd.cpp | 13 ++++++- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/Library/internal-include/CD/cd_internal.hpp b/src/Library/internal-include/CD/cd_internal.hpp index db5ecbbb..f449dc49 100644 --- a/src/Library/internal-include/CD/cd_internal.hpp +++ b/src/Library/internal-include/CD/cd_internal.hpp @@ -2,6 +2,8 @@ #include "cd_types.hpp" #include +#include + namespace JabyEngine { namespace CD { namespace internal { @@ -17,13 +19,14 @@ namespace JabyEngine { }; extern State current_state; - extern uint8_t cmd_interrupt_bit; + extern volatile uint8_t cmd_interrupt_bit; + extern uint8_t rel_last_send_cmd; extern uint8_t last_send_cmd; struct Command { struct Internal { static void wait_completed(CD_IO::Interrupt::Type irq) { - while(bit::is_set(const_cast(cmd_interrupt_bit), irq)); + while(!bit::is_set(cmd_interrupt_bit, irq)); } static void wait_completed_irq(CD_IO::Interrupt::Type irq) { @@ -32,9 +35,12 @@ namespace JabyEngine { do { cur_irq = CD_IO::Interrupt::get_type(CD_IO::PortIndex1::InterruptFlag); + if(cur_irq == CD_IO::Interrupt::Acknowledge) { + printf("Rand ACK for 0x%X\n", last_send_cmd); + } } while(cur_irq == CD_IO::Interrupt::None); CD_IO::Interrupt::ack_extended(CD_IO::PortIndex1::InterruptFlag); - cmd_interrupt_bit = bit::clear(cmd_interrupt_bit, cur_irq); + cmd_interrupt_bit = bit::set(cmd_interrupt_bit, cur_irq); return cur_irq; }; @@ -47,27 +53,42 @@ namespace JabyEngine { static void send(IOPort& cmd_fifo, IOPort& parameter_fifo, CD_IO::Command::Desc cmd, ARGS...args) { while(CD_IO::IndexStatus.read().is_set(CD_IO::IndexStatus::IsTransmissionBusy)); - cmd_interrupt_bit = bit::set(cmd_interrupt_bit, cmd.complete_irq); + SysCall::EnterCriticalSection(); + cmd_interrupt_bit = 0; + CD_IO::PortIndex0::change_to(); + ((parameter_fifo.write(CD_IO::ParameterFifo{args})),...); + cmd_fifo.write(CD_IO::CommandFifo{cmd.id}); + //printf(">>> 0x%X send @%i\n", cmd.id, CD_IO::IndexStatus.read().raw&0b111); + + rel_last_send_cmd = cmd.id; + last_send_cmd = cmd.id; + SysCall::ExitCriticalSection(); + } + + template + static void send_irq(IOPort& cmd_fifo, IOPort& parameter_fifo, CD_IO::Command::Desc cmd, ARGS...args) { + while(CD_IO::IndexStatus.read().is_set(CD_IO::IndexStatus::IsTransmissionBusy)); + + CD_IO::PortIndex0::change_to(); ((parameter_fifo.write(CD_IO::ParameterFifo{args})),...); cmd_fifo.write(CD_IO::CommandFifo{cmd.id}); - last_send_cmd = cmd.id; + rel_last_send_cmd = cmd.id; + last_send_cmd = cmd.id; } }; // Requires Index 0 template static void send_wait(CD_IO::Command::Desc cmd, ARGS...args) { - SysCall::EnterCriticalSection(); - Internal::send(CD_IO::PortIndex0::CommandFifo, CD_IO::PortIndex0::ParameterFifo, cmd, args...); - SysCall::ExitCriticalSection(); + Internal::send(CD_IO::PortIndex0::CommandFifo, CD_IO::PortIndex0::ParameterFifo, cmd, args...); Internal::wait_completed(cmd.complete_irq); } // Requires Index 0 template static void send_wait_irq(CD_IO::Command::Desc cmd, ARGS...args) { - Internal::send(CD_IO::PortIndex0::CommandFifo, CD_IO::PortIndex0::ParameterFifo, cmd, args...); + Internal::send_irq(CD_IO::PortIndex0::CommandFifo, CD_IO::PortIndex0::ParameterFifo, cmd, args...); Internal::wait_completed_irq(cmd.complete_irq); } }; diff --git a/src/Library/src/CD/cd.cpp b/src/Library/src/CD/cd.cpp index dc2f6aaf..49a6330b 100644 --- a/src/Library/src/CD/cd.cpp +++ b/src/Library/src/CD/cd.cpp @@ -38,7 +38,8 @@ namespace JabyEngine { static SectorBufferAllocator sector_allocator; static File cur_file; - uint8_t cmd_interrupt_bit = 0; + volatile uint8_t cmd_interrupt_bit = 0; + uint8_t rel_last_send_cmd = 0; uint8_t last_send_cmd = 0; State current_state = State::Ready; auto irq_callback = SysCall::InterruptCallback::from(IRQ::verifier, IRQ::handler); @@ -102,7 +103,7 @@ namespace JabyEngine { CD_IO::PortIndex0::change_to(); //printf("Before: %i (IRQ: %i)\n", cmd_interrupt_bit, cur_irq); - cmd_interrupt_bit = bit::clear(cmd_interrupt_bit, cur_irq); + cmd_interrupt_bit = bit::set(cmd_interrupt_bit, cur_irq); //printf("After: %i (IRQ: %i)\n", cmd_interrupt_bit, cur_irq); if(current_state != State::XAMode) { @@ -126,6 +127,13 @@ namespace JabyEngine { } } break; + case CD_IO::Interrupt::Acknowledge: { + if(last_send_cmd != 0x0) { + printf("ACK 0x%X\n", last_send_cmd); + last_send_cmd = 0x0; + } + } break; + case CD_IO::Interrupt::DataEnd: { // TODO: Fix this!! This is a freaking static time resume_at0(BCDTimeStamp{.min = 0x0, .sec = 0x09, .sector = 0x0}); @@ -133,6 +141,7 @@ namespace JabyEngine { } break; case CD_IO::Interrupt::DiskError: { + printf("CD ERROR\n"); current_state = State::Error; } break; }