Introduce PSX encoder to handle lba calculation better and improve many things
This commit is contained in:
@@ -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) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user