diff --git a/include/PSX/File/cd_file_types.hpp b/include/PSX/File/cd_file_types.hpp index b6ff973f..67634209 100644 --- a/include/PSX/File/cd_file_types.hpp +++ b/include/PSX/File/cd_file_types.hpp @@ -7,7 +7,6 @@ namespace JabyEngine { enum struct CDFileType : uint8_t { SimpleTIM = 0, CopyTo, - Overlay, }; struct __no_align CDFile { @@ -35,7 +34,7 @@ namespace JabyEngine { } static constexpr CDFile overlay(uint8_t rel_lba_idx, uint32_t* overlay_dst) { - return CDFile{.rel_lba_idx = rel_lba_idx, .type = CDFileType::Overlay, .payload = {.overlay = Overlay{overlay_dst}}}; + return CDFile{.rel_lba_idx = rel_lba_idx, .type = CDFileType::CopyTo, .payload = {.overlay = Overlay{overlay_dst}}}; } }; } diff --git a/src/Library/src/File/Processor/cd_file_processor.cpp b/src/Library/src/File/Processor/cd_file_processor.cpp index e25b286c..5d62d3f7 100644 --- a/src/Library/src/File/Processor/cd_file_processor.cpp +++ b/src/Library/src/File/Processor/cd_file_processor.cpp @@ -8,44 +8,49 @@ namespace JabyEngine { void CDFileProcessor :: start_cur_job() { using CD::internal::SectorBufferAllocator; - const auto configurate_for = [this](const CDFile& file) { - const auto disable_lz4 = [this](uint32_t* work_area, size_t size, uint32_t* overwrite_dst = nullptr) -> uint32_t* { - uint8_t*const dst_adr = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(work_area), size)); + const auto configurate_for = [this](const CDFile& file, bool is_lz4) -> FileProcessor::State { + const uint32_t* data_adr = [this](const CDFile& file, bool is_lz4) -> const uint32_t* { + const auto disable_lz4 = [this](uint32_t* work_area, size_t size, uint32_t* overwrite_dst = nullptr) -> uint32_t* { + uint8_t*const dst_adr = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(work_area), size)); - this->lz4_decomp.disable(); - return overwrite_dst ? overwrite_dst : reinterpret_cast(dst_adr); - }; + this->lz4_decomp.disable(); + return overwrite_dst ? overwrite_dst : reinterpret_cast(dst_adr); + }; - const auto enable_lz4 = [this](uint32_t* work_area, size_t size, uint32_t* override_dst = nullptr) -> uint32_t* { - uint8_t* dst_adr = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(work_area), size)); - - if(override_dst) { - dst_adr = reinterpret_cast(override_dst); + const auto enable_lz4 = [this](uint32_t* work_area, size_t size, uint32_t* override_dst = nullptr) -> uint32_t* { + uint8_t* dst_adr = reinterpret_cast(this->circular_buffer.setup(reinterpret_cast(work_area), size)); + + if(override_dst) { + dst_adr = reinterpret_cast(override_dst); + } + + this->lz4_decomp.setup(dst_adr); + return reinterpret_cast(dst_adr); + }; + + if(file.type == CDFileType::CopyTo) { + return is_lz4 ? enable_lz4(this->tmp_area, NormalCircularBufferSize, file.payload.overlay.dst) : disable_lz4(file.payload.copy_to.dst, DisabledCircularBufferSize); } - - this->lz4_decomp.setup(dst_adr); - return reinterpret_cast(dst_adr); - }; + + else { + return is_lz4 ? enable_lz4(this->tmp_area, NormalCircularBufferSize) : disable_lz4(this->tmp_area, DisabledCircularBufferSize); + } + }(file, is_lz4); switch(file.type) { case CDFileType::SimpleTIM: - this->file_state = FileProcessor::create(enable_lz4(this->tmp_area, NormalCircularBufferSize), file.payload.simple_tim); - break; - + return FileProcessor::create(data_adr, file.payload.simple_tim); + case CDFileType::CopyTo: - this->file_state = FileProcessor::create(disable_lz4(file.payload.copy_to.dst, 512), Nothing()); - break; - - case CDFileType::Overlay: - this->file_state = FileProcessor::create(enable_lz4(this->tmp_area, NormalCircularBufferSize, file.payload.overlay.dst), Nothing()); - break; - } + default: + return FileProcessor::create(data_adr, Nothing()); + } }; const auto& cur_job = *this->jobs.files; const auto& cur_lba = this->lba[cur_job.rel_lba_idx]; - configurate_for(cur_job); + this->file_state = configurate_for(cur_job, cur_lba.is_lz4()); CD::internal::read_file(cur_lba, SectorBufferAllocator::create(this, [](void* ctx) -> CD_IO::DataSector* { CDFileProcessor &self = *reinterpret_cast(ctx);