Introduce PSX encoder to handle lba calculation better and improve many things

This commit is contained in:
Jaby
2022-10-20 21:28:34 +02:00
committed by Jaby
parent 80d7673050
commit 081baa5b51
5 changed files with 154 additions and 127 deletions

View File

@@ -1,5 +1,70 @@
use super::{*, Sector, SectorWriter, {CDDesc, Error}};
use super::super::types::{layout::Layout, SystemArea};
use super::super::types::{layout::Layout, *};
use cdtypes::types::helper::sector_count_mode2_form1;
const SYSTEM_AREA_SECTOR_COUNT:usize = 16;
const PVD_SECTOR_COUNT:usize = 2;
pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) {
let path_table_size = PathTable::calculate_size_for(cd_desc.root.clone());
let mut cur_lba = 0;
CDDesc::for_each_dir_mut(cd_desc.root.clone(), &|dir| {dir.update_content_size();});
for element in cd_desc.get_memory_layout() {
fn update_lba(properties: &mut Properties, cur_lba: usize, content_sector_size: usize) -> usize {
properties.track_rel_lba = cur_lba;
cur_lba + content_sector_size
}
match element {
Layout::SystemArea(system_area) => {
let mut system_area = system_area.borrow_mut();
system_area.track_rel_lba = cur_lba;
cur_lba += SYSTEM_AREA_SECTOR_COUNT;
},
Layout::PVD(pvd) => {
let mut pvd = pvd.borrow_mut();
pvd.track_rel_lba = cur_lba;
cur_lba += PVD_SECTOR_COUNT;
},
Layout::PathTables(path_table) => {
let mut path_table = path_table.borrow_mut();
path_table.track_rel_lba = cur_lba;
path_table.single_sector_size = sector_count_mode2_form1(path_table_size);
cur_lba += path_table.single_sector_size*4;
},
Layout::Directory(dir) => {
let sector_count = sector_count_mode2_form1(dir.borrow().get_size());
let mut dir = dir.borrow_mut();
cur_lba = update_lba(&mut dir.properties, cur_lba, sector_count)
},
Layout::File(file) => {
let sector_count = {
let file = file.borrow();
let fake_size = file.get_size();
sector_count_mode2_form1(fake_size)
};
let mut file = file.borrow_mut();
cur_lba = update_lba(&mut file.properties, cur_lba, sector_count);
}
}
println!("cur_lba: {}", cur_lba);
}
}
pub fn encode_psx_image(cd_desc: CDDesc, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
for element in cd_desc.get_memory_layout() {
@@ -13,8 +78,19 @@ pub fn encode_psx_image(cd_desc: CDDesc, sec_writer: &mut dyn SectorWriter) -> R
Ok(())
}
fn process_system_area(_: &SystemArea, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
let system_area_lba = system_area.track_rel_lba;
if system_area_lba != 0 {
return Err(Error::from_text(format!("System Area required to start at sector 0 of Track - found LBA: {}", system_area_lba)));
}
sec_writer.write(Sector::CDXAData(builder::create_xa_data_zero()))?;
for _ in 0..SYSTEM_AREA_SECTOR_COUNT {
sec_writer.write(Sector::CDXAData(builder::create_xa_data_zero()))?;
}
Ok(())
}
}
fn _process_pvd(_pvd: &PrimaryVolumeDescriptor, _sec_writer: &mut dyn SectorWriter) {
}