Load TIM files (broken currently)

This commit is contained in:
Jaby 2023-04-01 11:57:48 +02:00
parent 658d092315
commit 8b94760130
2 changed files with 34 additions and 21 deletions

View File

@ -30,7 +30,7 @@ namespace JabyEngine {
LZ4Decompressor lz4_decomp;
JobArray jobs;
const AutoLBAEntry* lba = nullptr;
uint32_t*const tmp_area = nullptr; //< The start of the area to copy data to for the file processor
uint32_t* tmp_area = nullptr;
void start_cur_job();
bool process_data();
@ -39,7 +39,14 @@ namespace JabyEngine {
CDFileProcessor() = default;
void setup(const volatile AutoLBAEntry* lba, JobArray jobs, uint32_t* tmp_area = &__heap_base);
template<size_t N>
void setup(const volatile AutoLBAEntry* lba, const CDFile (&file_array)[N], uint32_t* tmp_area = &__heap_base) {
CDFileProcessor::setup(lba, JobArray{file_array, N}, tmp_area);
}
Progress process();
bool next() {
if(this->jobs.next()) {
CDFileProcessor::start_cur_job();

View File

@ -8,34 +8,41 @@ namespace JabyEngine {
void CDFileProcessor :: start_cur_job() {
using CD::internal::FileInfo;
using CD::internal::SectorBufferAllocator;
const auto configurate_for = [this](const CDFile& file) -> SectorBufferAllocator {
static const auto circular_buffer_callback = [](void* ctx) -> CD_IO::DataSector* {
CDFileProcessor &self = *reinterpret_cast<CDFileProcessor*>(ctx);
return self.circular_buffer.allocate();
const auto configurate_for = [this](const CDFile& file) {
const auto disable_lz4 = [this](uint32_t* work_area, size_t size) -> uint32_t* {
uint8_t* dst_adr = reinterpret_cast<uint8_t*>(this->circular_buffer.setup(reinterpret_cast<CD_IO::DataSector*>(work_area), size));
this->lz4_decomp.disable();
return reinterpret_cast<uint32_t*>(dst_adr);
};
const auto enable_lz4 = [this](uint32_t* work_area, size_t size) -> uint32_t* {
uint8_t* dst_adr = reinterpret_cast<uint8_t*>(this->circular_buffer.setup(reinterpret_cast<CD_IO::DataSector*>(work_area), size));
this->lz4_decomp.setup(dst_adr);
return reinterpret_cast<uint32_t*>(dst_adr);
};
switch(file.type) {
case CDFileType::SimpleTIM:
printf("CDFileProcessor: SimpleTIM not supported yet\n");
return SectorBufferAllocator::invalid();
this->file_state = FileProcessor::create(enable_lz4(this->tmp_area, NormalCircularBufferSize), file.payload.simple_tim);
break;
case CDFileType::CopyTo:
this->circular_buffer.setup(reinterpret_cast<CD_IO::DataSector*>(file.payload.copy_to.dst), 512);
this->lz4_decomp.disable();
this->file_state = FileProcessor::create(this->tmp_area, Nothing());
return SectorBufferAllocator::create(this, circular_buffer_callback);
default:
return SectorBufferAllocator::invalid();
this->file_state = FileProcessor::create(disable_lz4(file.payload.copy_to.dst, 512), Nothing());
break;
}
};
const auto& cur_job = *this->jobs.files;
const auto& cur_lba = this->lba[cur_job.rel_lba_idx];
const auto cfg = configurate_for(cur_job);
CD::internal::read_file(FileInfo::from(cur_lba), cfg);
configurate_for(cur_job);
CD::internal::read_file(FileInfo::from(cur_lba), SectorBufferAllocator::create(this,
[](void* ctx) -> CD_IO::DataSector* {
CDFileProcessor &self = *reinterpret_cast<CDFileProcessor*>(ctx);
return self.circular_buffer.allocate();
}));
printf(">>> CD needs to load LBA: %i -> %i\n", cur_lba.lba, cur_lba.size_words);
}
@ -66,8 +73,7 @@ namespace JabyEngine {
this->lba = const_cast<const AutoLBAEntry*>(lba);
this->jobs = jobs;
// Setsup the circular buffer and determines where to place the temp area in
const_cast<uint32_t*&>(this->tmp_area) = reinterpret_cast<uint32_t*>(this->circular_buffer.setup(reinterpret_cast<CD_IO::DataSector*>(tmp_area), NormalCircularBufferSize));
this->tmp_area = tmp_area;
CDFileProcessor::start_cur_job();
}