Encode TMD logo and string
This commit is contained in:
parent
b50fee186a
commit
0a1bcfacb1
|
@ -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();
|
||||
|
||||
|
|
|
@ -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<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 {
|
||||
|
|
Loading…
Reference in New Issue