Prepare filling in PVD
This commit is contained in:
parent
bae6140007
commit
9f8b7f4ebe
|
@ -54,7 +54,7 @@ pub struct VolumeDescriptorTerminator {
|
|||
}
|
||||
|
||||
impl PrimaryVolumeDescriptor {
|
||||
pub fn new() -> PrimaryVolumeDescriptor {
|
||||
pub fn psx_default() -> PrimaryVolumeDescriptor {
|
||||
PrimaryVolumeDescriptor{
|
||||
volume_type: [1],
|
||||
std_id: ['C' as u8, 'D' as u8, '0' as u8, '0' as u8, '1' as u8],
|
||||
|
|
|
@ -123,7 +123,7 @@ pub fn write_pvd(mut desc: PVDDesc, sectors: &mut Vec<IntermediateSector>, conte
|
|||
|
||||
let sectors_size = sectors.len();
|
||||
let now_date = Date::now();
|
||||
let mut raw_pvd = PrimaryVolumeDescriptor::new();
|
||||
let mut raw_pvd = PrimaryVolumeDescriptor::psx_default();
|
||||
|
||||
raw_pvd.system_id = AString::from_str("PLAYSTATION")?;
|
||||
if desc.volume_identifier.len() > 8 {
|
||||
|
|
Binary file not shown.
|
@ -1,13 +1,43 @@
|
|||
use cdtypes::types::sector::*;
|
||||
|
||||
pub fn create_xa_data_for_data(data: &[u8; Mode2Form1::DATA_SIZE]) -> Mode2Form1 {
|
||||
pub struct SubModeBuilder {
|
||||
sub_mode: SubMode
|
||||
}
|
||||
|
||||
impl SubModeBuilder {
|
||||
pub fn new_mode1() -> Self {
|
||||
SubModeBuilder{sub_mode: SubMode::default_form1()}
|
||||
}
|
||||
|
||||
pub fn set_eor(mut self) -> Self {
|
||||
self.sub_mode.set_eor();
|
||||
self
|
||||
}
|
||||
|
||||
pub fn set_eof(mut self) -> Self {
|
||||
self.sub_mode.set_eof();
|
||||
self
|
||||
}
|
||||
|
||||
pub fn create(self) -> SubMode {
|
||||
self.sub_mode
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_xa_data_for_raw(mut sub_mode: SubMode, data: &[u8; Mode2Form1::DATA_SIZE]) -> Mode2Form1 {
|
||||
let mut sector = Mode2Form1::new();
|
||||
|
||||
sector.sub_header.sub_mode.set_data();
|
||||
sub_mode.set_data();
|
||||
|
||||
sector.sub_header.sub_mode = sub_mode;
|
||||
sector.data = *data;
|
||||
sector
|
||||
}
|
||||
|
||||
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_zero() -> Mode2Form1 {
|
||||
create_xa_data_for_data(&[0u8; Mode2Form1::DATA_SIZE])
|
||||
create_xa_data_for_raw(SubMode::default_form1(), &[0u8; Mode2Form1::DATA_SIZE])
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
use super::{*, Sector, SectorWriter, {CDDesc, Error}};
|
||||
use super::super::types::{layout::Layout, *};
|
||||
use cdtypes::types::helper::sector_count_mode2_form1;
|
||||
use builder::SubModeBuilder;
|
||||
use cdtypes::types::{helper::sector_count_mode2_form1, pvd as cd_pvd};
|
||||
|
||||
const SYSTEM_AREA_SECTOR_COUNT:usize = 16;
|
||||
const PVD_SECTOR_COUNT:usize = 2;
|
||||
|
@ -70,6 +71,7 @@ pub fn encode_psx_image(cd_desc: CDDesc, sec_writer: &mut dyn SectorWriter) -> R
|
|||
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)?,
|
||||
_ => ()
|
||||
}
|
||||
}
|
||||
|
@ -90,7 +92,19 @@ fn process_system_area(system_area: &SystemArea, sec_writer: &mut dyn SectorWrit
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn _process_pvd(_pvd: &PrimaryVolumeDescriptor, _sec_writer: &mut dyn SectorWriter) {
|
||||
fn process_pvd(pvd: &PrimaryVolumeDescriptor, path_table: SharedPtr<PathTable>, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
|
||||
let path_table = path_table.borrow();
|
||||
|
||||
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)));
|
||||
}
|
||||
|
||||
let mut cd_pvd = cd_pvd::PrimaryVolumeDescriptor::psx_default();
|
||||
|
||||
//Config pvd here
|
||||
|
||||
sec_writer.write(Sector::CDXAData(builder::create_xa_data_for(SubModeBuilder::new_mode1().set_eor().create(), &cd_pvd)))?;
|
||||
sec_writer.write(Sector::CDXAData(builder::create_xa_data_for(SubModeBuilder::new_mode1().set_eor().set_eof().create(), &cd_pvd::VolumeDescriptorTerminator::new())))?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
|
@ -14,9 +14,9 @@ pub fn new_shared_ptr<T>(value: T) -> SharedPtr<T> {
|
|||
}
|
||||
|
||||
pub struct CDDesc {
|
||||
system_area: SharedPtr<SystemArea>,
|
||||
path_table: SharedPtr<PathTable>,
|
||||
pvd: SharedPtr<PrimaryVolumeDescriptor>,
|
||||
pub(super) system_area: SharedPtr<SystemArea>,
|
||||
pub(super) path_table: SharedPtr<PathTable>,
|
||||
pub(super) pvd: SharedPtr<PrimaryVolumeDescriptor>,
|
||||
pub(super) root: SharedPtr<Directory>
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue