From b5b25a85d7505412ca74c24621c7d513bab1ee5f Mon Sep 17 00:00:00 2001 From: jaby Date: Wed, 26 Oct 2022 21:43:54 +0200 Subject: [PATCH] Write DirectoryRecord --- src/Tools/psxcdgen_ex/src/encoder/psx.rs | 33 ++++++++++++++---------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/Tools/psxcdgen_ex/src/encoder/psx.rs b/src/Tools/psxcdgen_ex/src/encoder/psx.rs index 09ee0c53..381c833d 100644 --- a/src/Tools/psxcdgen_ex/src/encoder/psx.rs +++ b/src/Tools/psxcdgen_ex/src/encoder/psx.rs @@ -45,8 +45,8 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) { }, Layout::Directory(dir) => { - let sector_count = sector_count_mode2_form1(dir.borrow().properties.borrow().get_extended_size()); - let mut dir = dir.borrow_mut(); + let sector_count = sector_count_mode2_form1(dir.borrow().properties.borrow().get_extended_size()); + let dir = dir.borrow_mut(); cd_desc.vol_sector_count += sector_count; cur_lba = update_lba(&mut dir.properties.borrow_mut(), cur_lba, sector_count); @@ -176,20 +176,32 @@ fn process_path_table(path_table: &PathTable, root_dir: SharedPtr, se Ok(()) } -fn process_directory_record(dir: &Directory, _sec_writer: &mut dyn SectorWriter) -> Result<(), Error> { +fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> { let mut dir_record = vec![0u8; dir.properties.borrow().get_real_size()]; let dir_length = dir_record.len(); let mut raw_data = &mut dir_record[0..dir_length]; - for _member in dir.collect_member() { + for member in dir.collect_member() { let raw_data_len = raw_data.len(); - let bytes_written = { - 0 - }; + let bytes_written = write_dir_record(raw_data, &member, true)?; raw_data = &mut raw_data[bytes_written..raw_data_len]; } + let dir_record_sector_count = sector_count_mode2_form1(raw_data.len()); + if dir_record_sector_count > 1 { + return Err(Error::from_text(format!("Directory Record for {} spans {} sectors but PSX doesn't support more then one sector", dir.name.as_str().unwrap_or(""), dir_record_sector_count))); + } + + for sector in builder::create_xa_data_for_vec(None, dir_record) { + sec_writer.write_cd_xa_data(sector)?; + } + + let extended_sector_count = sector_count_mode2_form1(dir.properties.borrow().get_extended_size()) - dir_record_sector_count; + for _ in 0..extended_sector_count { + sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?; + } + Ok(()) } @@ -257,13 +269,6 @@ fn create_dir_record_raw<'a>(dst: &'a mut [u8], name: &str, track_rel_lba: u32, } fn write_dir_record(dir_record: &mut [u8], dir_member: &DirectoryRecordMember, has_system_use: bool) -> Result { - fn create_file_system_use() -> CDXASystemUse { - let mut system_use = CDXASystemUse::default(); - - system_use.file_attribute.set_mode2(); - system_use - } - match dir_member { DirectoryRecordMember::Directory{name, track_rel_lba, real_size} => { let system_use = {