From 0a1bcfacb17166cb58c249d4583e1f9299055765 Mon Sep 17 00:00:00 2001 From: Jaby Date: Tue, 20 Aug 2024 22:45:21 +0200 Subject: [PATCH] Encode TMD logo and string --- src/Tools/psxcdgen_ex/src/encoder/builder.rs | 4 ++-- src/Tools/psxcdgen_ex/src/encoder/cd.rs | 25 +++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/Tools/psxcdgen_ex/src/encoder/builder.rs b/src/Tools/psxcdgen_ex/src/encoder/builder.rs index 5b47dc6b..b1586fee 100644 --- a/src/Tools/psxcdgen_ex/src/encoder/builder.rs +++ b/src/Tools/psxcdgen_ex/src/encoder/builder.rs @@ -66,7 +66,7 @@ pub fn create_xa_data_for(sub_mode: SubMode, data: &T) -> Mode2Form1 { create_xa_data_for_raw(sub_mode, unsafe {std::mem::transmute::<&T, &[u8; Mode2Form1::DATA_SIZE]>(data)}) } -pub fn create_xa_data_for_vec(sub_mode: Option, data: &RawData) -> Vec { +pub fn create_xa_data_for_vec(sub_mode: Option, data: &RawData, fill_bytes: u8) -> Vec { let sectors_to_parse = sector_count_mode2_form1(data.len()); let mut data = &data[0..data.len()]; let mut sectors = vec![Mode2Form1::new(); sectors_to_parse]; @@ -81,7 +81,7 @@ pub fn create_xa_data_for_vec(sub_mode: Option, data: &RawData) -> Vec< }; for cur_sector in 0..sectors_to_parse { - let mut raw_data = [0u8; Mode2Form1::DATA_SIZE]; + let mut raw_data = [fill_bytes; Mode2Form1::DATA_SIZE]; let sub_mode = { let mut sub_mode = sub_mode.clone(); diff --git a/src/Tools/psxcdgen_ex/src/encoder/cd.rs b/src/Tools/psxcdgen_ex/src/encoder/cd.rs index b4983d01..60bd328a 100644 --- a/src/Tools/psxcdgen_ex/src/encoder/cd.rs +++ b/src/Tools/psxcdgen_ex/src/encoder/cd.rs @@ -253,18 +253,19 @@ fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWrit } fn write_license_logo(sec_writer: &mut dyn SectorWriter, mut tmd_file: BufferedInputFile) -> Result<(), Error> { + const SECTOR_COUNT:usize = 11 - 5 + 1; + let bytes = { let mut bytes = vec![]; tmd_file.read_to_end(&mut bytes)?; bytes }; - let mut sectors = builder::create_xa_data_for_vec(Some(SubModeBuilder::new_mode1().create()), &bytes); - // TODO: Buhu magic number!! - if sectors.len() > 8 { + let mut sectors = builder::create_xa_data_for_vec(Some(SubModeBuilder::new_mode1().create()), &bytes, 0xFFu8); + if sectors.len() > SECTOR_COUNT { return Err(Error::from_str("Provided TMD file for alt-license is larger then 8 sectors of data")); } - while sectors.len() < 8 { + while sectors.len() < SECTOR_COUNT { sectors.push(builder::create_xa_data_zero()); } @@ -275,7 +276,7 @@ fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWrit } format_if_error!(write_data_zeros(sec_writer), "Writing alt-license data zeros failed with: {error_text}")?; - format_if_error!(write_license_string(sec_writer, "Not licensed by Sony"), "Writing alt-license string from file failed with: {error_text}")?; + format_if_error!(write_license_string(sec_writer, " Not licensed by Sony Will not work on all hardware/software"), "Writing alt-license string from file failed with: {error_text}")?; format_if_error!(write_license_logo(sec_writer, tmd_file), "Writing alt-license logo from file failed with: {error_text}")?; format_if_error!(write_audio_zeros(sec_writer), "Writing alt-license audio zeros failed with: {error_text}") } @@ -285,18 +286,20 @@ fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWrit return Err(Error::from_text(format!("System Area required to start at sector 0 of Track - found LBA: {}", system_area_lba))); } - match &system_area.license_file { + const NOT_BOOTING_CD_STR:&'static str = "Some emulators (No$PSX) and some consoles (japanese/some european PS1; All PS3) will not boot this CD."; + match &system_area.license_file { LicenseFile::Authentic(license_path) => { let license_file = format_if_error!(open_input_file_buffered(license_path), "Loading license file from {} failed with: {error_text}", license_path.to_string_lossy())?; write_license_file(sec_writer, license_file) }, LicenseFile::TMD(tmd_path) => { + print_warning(format!("WARNING: An alternative license file was provided. {}", NOT_BOOTING_CD_STR)); let tmd_file = format_if_error!(open_input_file_buffered(tmd_path), "Loading TMD file from {} failed with: {error_text}", tmd_path.to_string_lossy())?; write_tmd_file(sec_writer, tmd_file) }, LicenseFile::None => { // No license specified - filling it with zeros - print_warning("WARNING: No license file provided. Some emulators (like No$PSX) will not boot this CD.".to_owned()); + print_warning(format!("WARNING: No license file provided. {}", NOT_BOOTING_CD_STR)); write_dummy(sec_writer, size_of::SYSTEM_AREA_SECTOR_COUNT) }, } @@ -369,8 +372,8 @@ fn process_path_table(path_table: &PathTable, root_dir: SharedPtr, se bytes_used += unsafe{update_path_table_entry(std::mem::transmute::<&mut u8, &mut PathTableL>(&mut path_table_raw_l[bytes_used]), std::mem::transmute::<&mut u8, &mut PathTableB>(&mut path_table_raw_b[bytes_used]), entry)?}; } - let path_table_l = builder::create_xa_data_for_vec(None, &path_table_raw_l); - let path_table_b = builder::create_xa_data_for_vec(None, &path_table_raw_b); + let path_table_l = builder::create_xa_data_for_vec(None, &path_table_raw_l, 0x0u8); + let path_table_b = builder::create_xa_data_for_vec(None, &path_table_raw_b, 0x0u8); write_path_table_twice!(path_table_l); write_path_table_twice!(path_table_b); @@ -399,7 +402,7 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter) raw_data = &mut raw_data[bytes_written..raw_data_len]; } - let dir_record_sectors = builder::create_xa_data_for_vec(None, &dir_record); + let dir_record_sectors = builder::create_xa_data_for_vec(None, &dir_record, 0x0u8); let dir_record_sector_count = dir_record_sectors.len(); if dir_record_sector_count > 1 { @@ -416,7 +419,7 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter) fn process_file(file: &File, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> { fn process_regular_file(content: &RawData, sec_writer: &mut dyn SectorWriter, padded_size: usize) -> Result<(), Error> { - let content_sectors = builder::create_xa_data_for_vec(None, content); + let content_sectors = builder::create_xa_data_for_vec(None, content, 0x0u8); let content_sector_count = content_sectors.len(); for sector in content_sectors {