Support dynamic correction of LBA
This commit is contained in:
parent
6aecc8d9c2
commit
b4dcf8d4e7
|
@ -35,13 +35,14 @@ pub fn calculate_psx_length_for(element: &Layout) -> LengthInfo {
|
|||
|
||||
pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -352,27 +352,37 @@ fn dstring_as_str<const SIZE: usize>(string: &DString<SIZE>, len: usize) -> Opti
|
|||
}
|
||||
|
||||
pub struct LBA {
|
||||
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}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue