Encode TMD logo and string

This commit is contained in:
Jaby 2024-08-20 22:45:21 +02:00
parent b50fee186a
commit 0a1bcfacb1
2 changed files with 16 additions and 13 deletions

View File

@ -66,7 +66,7 @@ pub fn create_xa_data_for<T>(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<SubMode>, data: &RawData) -> Vec<Mode2Form1> {
pub fn create_xa_data_for_vec(sub_mode: Option<SubMode>, data: &RawData, fill_bytes: u8) -> Vec<Mode2Form1> {
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<SubMode>, 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();

View File

@ -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)));
}
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<Directory>, 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 {