From e08c6a85e633996a0d188d1194698607e12efca6 Mon Sep 17 00:00:00 2001 From: jaby Date: Mon, 20 Feb 2023 12:47:56 +0100 Subject: [PATCH] Support dynamic correction of LBA --- src/Tools/psxcdgen_ex/src/encoder/psx.rs | 19 ++++++++++--------- src/Tools/psxcdgen_ex/src/types/mod.rs | 20 +++++++++++++++----- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/Tools/psxcdgen_ex/src/encoder/psx.rs b/src/Tools/psxcdgen_ex/src/encoder/psx.rs index 7da52ee6..7397e1ad 100644 --- a/src/Tools/psxcdgen_ex/src/encoder/psx.rs +++ b/src/Tools/psxcdgen_ex/src/encoder/psx.rs @@ -34,14 +34,15 @@ pub fn calculate_psx_length_for(element: &Layout) -> LengthInfo { } pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { - let mut cur_lba = 0; + let mut cur_lba = 0; + let track_offset = LBA::FIRST_TRACK_OFFSET; cd_desc.vol_sector_count = 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.set_track_rel(cur_lba); + fn update_lba(properties: &mut Properties, cur_lba: usize, track_offset: usize, content_sector_size: usize) -> usize { + properties.track_rel_lba.overwrite(cur_lba, track_offset); cur_lba + content_sector_size } @@ -50,21 +51,21 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { Layout::SystemArea(system_area) => { let mut system_area = system_area.borrow_mut(); - system_area.track_rel_lba.set_track_rel(cur_lba); + system_area.track_rel_lba.overwrite(cur_lba, track_offset); cur_lba += element_size_info.sectors; }, Layout::PVD(pvd) => { let mut pvd = pvd.borrow_mut(); - pvd.track_rel_lba.set_track_rel(cur_lba); + pvd.track_rel_lba.overwrite(cur_lba, track_offset); cur_lba += element_size_info.sectors; }, Layout::PathTables(_, path_table) => { let mut path_table = path_table.borrow_mut(); - path_table.track_rel_lba.set_track_rel(cur_lba); + path_table.track_rel_lba.overwrite(cur_lba, track_offset); path_table.size_bytes = element_size_info.bytes.unwrap_or(0); cur_lba += element_size_info.sectors*4; @@ -76,11 +77,11 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { cd_desc.vol_sector_count += element_size_info.sectors; if properties.is_hidden { - properties.track_rel_lba.set_track_rel(0); + properties.track_rel_lba.overwrite(0, 0); } else { - cur_lba = update_lba(&mut properties, cur_lba, element_size_info.sectors); + cur_lba = update_lba(&mut properties, cur_lba, track_offset, element_size_info.sectors); } }, @@ -88,7 +89,7 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { let mut file = file.borrow_mut(); cd_desc.vol_sector_count += element_size_info.sectors; - cur_lba = update_lba(&mut file.properties, cur_lba, element_size_info.sectors); + cur_lba = update_lba(&mut file.properties, cur_lba, track_offset, element_size_info.sectors); } } } diff --git a/src/Tools/psxcdgen_ex/src/types/mod.rs b/src/Tools/psxcdgen_ex/src/types/mod.rs index f61bc9b2..f0158ac5 100644 --- a/src/Tools/psxcdgen_ex/src/types/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/mod.rs @@ -352,27 +352,37 @@ fn dstring_as_str(string: &DString, len: usize) -> Opti } pub struct LBA { - track_rel: usize + track_offset: usize, + track_rel: usize } impl LBA { + pub const FIRST_TRACK_OFFSET:usize = cdtypes::types::time::Time::cd_start().to_lba(); + + pub fn set_track_offset(&mut self, offset: usize) { + self.track_offset = offset; + } + pub fn set_track_rel(&mut self, new_track_rel: usize) { self.track_rel = new_track_rel; } + pub fn overwrite(&mut self, rel_lba: usize, offset: usize) { + self.set_track_offset(offset); + self.set_track_rel(rel_lba); + } + pub fn get_for_cur_track(&self) -> usize { self.track_rel } pub fn get_for_track1(&self) -> usize { - const START_OFFSET: usize = cdtypes::types::time::Time::cd_start().to_lba(); - - self.track_rel + START_OFFSET + self.track_rel + self.track_offset } } impl std::default::Default for LBA { fn default() -> Self { - LBA{track_rel: 0} + LBA{track_offset: 0, track_rel: 0} } } \ No newline at end of file