Support dynamic correction of LBA
This commit is contained in:
parent
4327358d52
commit
795be5bb82
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue