Support dynamic correction of LBA

This commit is contained in:
Jaby 2023-02-20 12:47:56 +01:00
parent 6aecc8d9c2
commit b4dcf8d4e7
2 changed files with 25 additions and 14 deletions

View File

@ -35,13 +35,14 @@ pub fn calculate_psx_length_for(element: &Layout) -> LengthInfo {
pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { 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; cd_desc.vol_sector_count = 0;
CDDesc::for_each_dir_mut(cd_desc.root.clone(), &|dir| {dir.update_content_size();}); CDDesc::for_each_dir_mut(cd_desc.root.clone(), &|dir| {dir.update_content_size();});
for element in cd_desc.get_memory_layout() { for element in cd_desc.get_memory_layout() {
fn update_lba(properties: &mut Properties, cur_lba: usize, content_sector_size: usize) -> usize { fn update_lba(properties: &mut Properties, cur_lba: usize, track_offset: usize, content_sector_size: usize) -> usize {
properties.track_rel_lba.set_track_rel(cur_lba); properties.track_rel_lba.overwrite(cur_lba, track_offset);
cur_lba + content_sector_size cur_lba + content_sector_size
} }
@ -50,21 +51,21 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) {
Layout::SystemArea(system_area) => { Layout::SystemArea(system_area) => {
let mut system_area = system_area.borrow_mut(); 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; cur_lba += element_size_info.sectors;
}, },
Layout::PVD(pvd) => { Layout::PVD(pvd) => {
let mut pvd = pvd.borrow_mut(); 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; cur_lba += element_size_info.sectors;
}, },
Layout::PathTables(_, path_table) => { Layout::PathTables(_, path_table) => {
let mut path_table = path_table.borrow_mut(); 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); path_table.size_bytes = element_size_info.bytes.unwrap_or(0);
cur_lba += element_size_info.sectors*4; 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; cd_desc.vol_sector_count += element_size_info.sectors;
if properties.is_hidden { if properties.is_hidden {
properties.track_rel_lba.set_track_rel(0); properties.track_rel_lba.overwrite(0, 0);
} }
else { 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(); let mut file = file.borrow_mut();
cd_desc.vol_sector_count += element_size_info.sectors; 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);
} }
} }
} }

View File

@ -352,27 +352,37 @@ fn dstring_as_str<const SIZE: usize>(string: &DString<SIZE>, len: usize) -> Opti
} }
pub struct LBA { pub struct LBA {
track_offset: usize,
track_rel: usize track_rel: usize
} }
impl LBA { 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) { pub fn set_track_rel(&mut self, new_track_rel: usize) {
self.track_rel = new_track_rel; 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 { pub fn get_for_cur_track(&self) -> usize {
self.track_rel self.track_rel
} }
pub fn get_for_track1(&self) -> usize { pub fn get_for_track1(&self) -> usize {
const START_OFFSET: usize = cdtypes::types::time::Time::cd_start().to_lba(); self.track_rel + self.track_offset
self.track_rel + START_OFFSET
} }
} }
impl std::default::Default for LBA { impl std::default::Default for LBA {
fn default() -> Self { fn default() -> Self {
LBA{track_rel: 0} LBA{track_offset: 0, track_rel: 0}
} }
} }