From fa848df2e172b1032b78fa24f2a6144082192118 Mon Sep 17 00:00:00 2001 From: Jaby Date: Sun, 23 Oct 2022 14:39:51 +0200 Subject: [PATCH] Write PathTable infos, publisher name and more --- src/Tools/psxcdgen_ex/planschi.bin | Bin 42336 -> 42336 bytes src/Tools/psxcdgen_ex/src/encoder/psx.rs | 58 +++++++++++++++-------- src/Tools/psxcdgen_ex/src/types/mod.rs | 27 +++++++---- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/Tools/psxcdgen_ex/planschi.bin b/src/Tools/psxcdgen_ex/planschi.bin index baf0845d234a51eec449276f904eca3883a84d66..b1b2e1f5014fee48db7436ddc73d22cf1cfe19a8 100644 GIT binary patch delta 443 zcmaEGis`{ArVR>{xdVJ0BZEU6Lp=TcCM!-BWey0A0MfFP6DD(Ta4>)Y$3#Vi$rC2? zNT@;hYC=F-7{V3-Qlb+Tl@?!{%qZsN=oIPd=kDp}ssJ>`*~Q(}FWxm`^25nlDAqij z{6x^mz{tqZz{uFp#Mr{b+}wg=a{4r-%@xxYu+;O`>P{S5>-zc5TCF=fl~=QHHA^Y1_I+wTQOLY{X~)+q*QeF}+jh&OAn=vOY>n)9CC$sPo{LuWG@IpYz`m&F zvH#JZYZ_xjo>a~2J$wI@dSv!Y9V>CeJ7O2*xZ5U6ua};&S<0W)^DK*@D(8Xcr}x(X XUBC0(*?pf9??>2p#BMg2W55Xj8~(S) delta 340 zcmaEGis`{ArVR>{CqJC*Fgal|$3#ty$rC2?OjNR3d~Gu0fZsg1gUrbxE{iRl2U|AL_|bA5JP}+M1->P{rgMq zD=6HD18+DB%+Qe8+%CP~@gilW3=acRnhln z3g|vBFU!cdv{%*6(D#o>Lg>sJkwzJ;rV=}LEL}SLZdP-Y(S}`JU7ns&AWbvVpY;n} aO$d|L>D|MaslWeqp5Y1R(#-~Q3^)M { 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); + path_table.track_rel_lba = cur_lba; + path_table.size_bytes = path_table_size; - cur_lba += path_table.single_sector_size*4; + cur_lba += sector_count_mode2_form1(path_table.size_bytes)*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) + cd_desc.vol_sector_count += sector_count; + cur_lba = update_lba(&mut dir.properties, cur_lba, sector_count); }, Layout::File(file) => { @@ -59,6 +61,7 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { let mut file = file.borrow_mut(); + cd_desc.vol_sector_count += sector_count; cur_lba = update_lba(&mut file.properties, cur_lba, sector_count); } } @@ -68,10 +71,12 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { } pub fn encode_psx_image(cd_desc: CDDesc, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> { + let vol_sector_count = cd_desc.vol_sector_count; + for element in cd_desc.get_memory_layout() { match element { Layout::SystemArea(system_area) => process_system_area(&system_area.borrow(), sec_writer)?, - Layout::PVD(pvd) => process_pvd(&pvd.borrow(), cd_desc.path_table.clone(), sec_writer)?, + Layout::PVD(pvd) => process_pvd(&pvd.borrow(), cd_desc.path_table.clone(), sec_writer, vol_sector_count)?, _ => () } } @@ -92,33 +97,36 @@ fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWrit Ok(()) } -fn process_pvd(pvd: &PrimaryVolumeDescriptor, path_table: SharedPtr, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> { +fn process_pvd(pvd: &PrimaryVolumeDescriptor, path_table: SharedPtr, sec_writer: &mut dyn SectorWriter, vol_sector_count: usize) -> Result<(), Error> { const PLAYSATATION_STR:&'static str = "PLAYSTATION"; - let path_table = path_table.borrow(); + + let path_table = validate_path_table(&path_table)?; + let pvd_lba = pvd.track_rel_lba; - if pvd.track_rel_lba != 16 { - return Err(Error::from_text(format!("PVD required to start at sector 16 of Track - found LBA: {}", pvd.track_rel_lba))); + if pvd_lba != 16 { + return Err(Error::from_text(format!("PVD required to start at sector 16 of Track - found LBA: {}", pvd_lba))); } + let mut cd_pvd = cd_pvd::PrimaryVolumeDescriptor::new(); let now = Date::now(); //Config pvd here cd_pvd.system_id = AString::from_str(PLAYSATATION_STR)?; cd_pvd.volume_id = DString::from_str("PSX")?; - &cd_pvd.vol_space_size; + cd_pvd.vol_space_size.write(vol_sector_count as u32); - &cd_pvd.path_table_size; - &cd_pvd.path_table_1; - &cd_pvd.path_table_2; - &cd_pvd.path_table_3; - &cd_pvd.path_table_4; + cd_pvd.path_table_size.write(path_table.size_bytes as u32); + cd_pvd.path_table_1.write(path_table.get_track_rel_lba_for(1, sector_count_mode2_form1) as u32); + cd_pvd.path_table_2.write(path_table.get_track_rel_lba_for(2, sector_count_mode2_form1) as u32); + cd_pvd.path_table_3.write(path_table.get_track_rel_lba_for(3, sector_count_mode2_form1) as u32); + cd_pvd.path_table_4.write(path_table.get_track_rel_lba_for(4, sector_count_mode2_form1) as u32); &cd_pvd.root_dir_record; - &cd_pvd.publisher_id; //< Company name - &cd_pvd.data_preparer; - cd_pvd.app_id = AString::from_str(PLAYSATATION_STR)?; + cd_pvd.publisher_id = AString::from_str(pvd.publisher.as_str())?; + cd_pvd.data_preparer = AString::from_str("JABYENGINE PSXCDGEN_EX")?; + cd_pvd.app_id = AString::from_str(PLAYSATATION_STR)?; cd_pvd.vol_create_time = now; @@ -129,3 +137,13 @@ fn process_pvd(pvd: &PrimaryVolumeDescriptor, path_table: SharedPtr, Ok(()) } +fn validate_path_table(path_table: &SharedPtr) -> Result, Error> { + let path_table = path_table.borrow(); + if path_table.size_bytes > Mode2Form1::DATA_SIZE { + Err(Error::from_text(format!("Path Tables are not allowed to be bigger then {} bytes - Path Table has {} bytes", Mode2Form1::DATA_SIZE, path_table.size_bytes))) + } + + else { + Ok(path_table) + } +} \ No newline at end of file diff --git a/src/Tools/psxcdgen_ex/src/types/mod.rs b/src/Tools/psxcdgen_ex/src/types/mod.rs index 61759810..9eebbb7f 100644 --- a/src/Tools/psxcdgen_ex/src/types/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/mod.rs @@ -14,16 +14,17 @@ pub fn new_shared_ptr(value: T) -> SharedPtr { } pub struct CDDesc { - pub(super) system_area: SharedPtr, - pub(super) path_table: SharedPtr, - pub(super) pvd: SharedPtr, - pub(super) root: SharedPtr + pub(super) system_area: SharedPtr, + pub(super) path_table: SharedPtr, + pub(super) pvd: SharedPtr, + pub(super) root: SharedPtr, + pub(super) vol_sector_count: usize, } impl CDDesc { pub fn new() -> CDDesc { match Directory::new("root") { - Ok(root) => CDDesc{system_area: new_shared_ptr(SystemArea::new()), path_table: new_shared_ptr(PathTable::new()), pvd: new_shared_ptr(PrimaryVolumeDescriptor::new()), root: new_shared_ptr(root)}, + Ok(root) => CDDesc{system_area: new_shared_ptr(SystemArea::new()), path_table: new_shared_ptr(PathTable::new()), pvd: new_shared_ptr(PrimaryVolumeDescriptor::new()), root: new_shared_ptr(root), vol_sector_count: 0}, Err(error) => panic!("Creating root directory failed with: {}", error) } } @@ -65,13 +66,13 @@ impl SystemArea { } pub struct PathTable { - pub(super) track_rel_lba: usize, - pub(super) single_sector_size: usize, + pub(super) track_rel_lba: usize, + pub(super) size_bytes: usize, } impl PathTable { pub fn new() -> PathTable { - PathTable{track_rel_lba: 0, single_sector_size: 0} + PathTable{track_rel_lba: 0, size_bytes: 0} } pub fn calculate_size_for(root: SharedPtr) -> usize { @@ -84,15 +85,21 @@ impl PathTable { size_bytes } + + pub fn get_track_rel_lba_for(&self, table_num: usize, sector_count_func: fn(data_size: usize) -> usize) -> usize { + let table_num = table_num - 1; + self.track_rel_lba + (table_num*sector_count_func(self.size_bytes)) + } } pub struct PrimaryVolumeDescriptor { - pub(in super) track_rel_lba: usize + pub(super) track_rel_lba: usize, + pub(super) publisher: String, } impl PrimaryVolumeDescriptor { pub fn new() -> PrimaryVolumeDescriptor { - PrimaryVolumeDescriptor{track_rel_lba: 0} + PrimaryVolumeDescriptor{track_rel_lba: 0, publisher: String::new()} } }