Compare commits
No commits in common. "master" and "v1.0.0" have entirely different histories.
127
src/cdrom.rs
127
src/cdrom.rs
@ -20,8 +20,6 @@
|
|||||||
|
|
||||||
use libc;
|
use libc;
|
||||||
|
|
||||||
use std::convert::TryInto;
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static mut CDROM_crc: [libc::c_uint; 256] = [0; 256];
|
static mut CDROM_crc: [libc::c_uint; 256] = [0; 256];
|
||||||
@ -341,6 +339,60 @@ unsafe fn CDROM_Put_ECC_Q(mut source: *mut libc::c_char, mut target: *mut libc::
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe fn Check_Image(mut sector: &[u8], mut length: *mut libc::c_int, mut offset: *mut libc::c_int, mut position: *mut libc::c_int) -> libc::c_int {
|
||||||
|
let mut buffer: [u8; 8192] = [0; 8192];
|
||||||
|
let mut i: libc::c_int = 0;
|
||||||
|
let mut n: libc::c_int = 0;
|
||||||
|
let mut tabla: [[libc::c_int; 3]; 8] = [
|
||||||
|
[0 as libc::c_int, 0x800 as libc::c_int, 0 as libc::c_int],
|
||||||
|
[1 as libc::c_int, 0x930 as libc::c_int, 0x10 as libc::c_int],
|
||||||
|
[21 as libc::c_int, 0x930 as libc::c_int, 0x18 as libc::c_int],
|
||||||
|
[1 as libc::c_int, 0x990 as libc::c_int, 0x10 as libc::c_int],
|
||||||
|
[21 as libc::c_int, 0x990 as libc::c_int, 0x18 as libc::c_int],
|
||||||
|
[1 as libc::c_int, 0x940 as libc::c_int, 0x10 as libc::c_int],
|
||||||
|
[21 as libc::c_int, 0x940 as libc::c_int, 0x18 as libc::c_int],
|
||||||
|
[-(1 as libc::c_int), -(1 as libc::c_int), -(1 as libc::c_int)],
|
||||||
|
];
|
||||||
|
n = 0 as libc::c_int;
|
||||||
|
while n < 2 as libc::c_int {
|
||||||
|
i = 0 as libc::c_int;
|
||||||
|
while tabla[i as usize][0 as libc::c_int as usize] != -(1 as libc::c_int) {
|
||||||
|
*length = tabla[i as usize][1 as libc::c_int as usize];
|
||||||
|
*position = tabla[i as usize][2 as libc::c_int as usize];
|
||||||
|
loop {
|
||||||
|
*offset = *length * 150 as libc::c_int * n;
|
||||||
|
//fseek(fp, *offset + 0x000010 * *length, SEEK_SET);
|
||||||
|
//if (fread(buffer, 2, *length, fp) != *length) return -1;
|
||||||
|
// manually implement above fseek+fread
|
||||||
|
{
|
||||||
|
let copy_start = (*offset + 0x000010 * *length) as usize;
|
||||||
|
let copy_end = copy_start + (2 * *length) as usize;
|
||||||
|
if copy_start >= sector.len() || copy_end >= sector.len() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
let src = §or[copy_start..copy_end];
|
||||||
|
&buffer[0..src.len()].copy_from_slice(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
if *(buffer.as_mut_ptr().offset(*position as isize) as *mut libc::c_int) == 0x30444301 as libc::c_int {
|
||||||
|
if *(buffer.as_mut_ptr().offset(*position as isize).offset(4 as libc::c_int as isize) as *mut libc::c_int) == 0x13130 as libc::c_int {
|
||||||
|
if *(buffer.as_mut_ptr().offset(*position as isize).offset(*length as isize).offset(1 as libc::c_int as isize) as *mut libc::c_int) == 0x30304443 as libc::c_int {
|
||||||
|
return tabla[i as usize][0 as libc::c_int as usize];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if *position < 0x10 as libc::c_int {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*length -= 0x10 as libc::c_int;
|
||||||
|
*position -= 0x10 as libc::c_int
|
||||||
|
}
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
return -(1 as libc::c_int);
|
||||||
|
}
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
/*-- EOF Copyright (C) 2012 CUE --*/
|
/*-- EOF Copyright (C) 2012 CUE --*/
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
@ -351,10 +403,6 @@ unsafe fn CDROM_Put_ECC_Q(mut source: *mut libc::c_char, mut target: *mut libc::
|
|||||||
|
|
||||||
use anyhow::{bail, Result};
|
use anyhow::{bail, Result};
|
||||||
|
|
||||||
pub fn i32(slice: &[u8], offset: usize) -> Result<i32> {
|
|
||||||
Ok(i32::from_le_bytes(slice[offset..(offset + 4)].try_into()?))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct CDRomImage {
|
pub struct CDRomImage {
|
||||||
mode: i32,
|
mode: i32,
|
||||||
length: usize,
|
length: usize,
|
||||||
@ -363,59 +411,24 @@ pub struct CDRomImage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl CDRomImage {
|
impl CDRomImage {
|
||||||
pub fn new(sector: &[u8]) -> Result<CDRomImage> {
|
pub fn new(bytes: &[u8]) -> Result<CDRomImage> {
|
||||||
let mut length = 0usize;
|
let mode: i32;
|
||||||
let mut offset = 0usize;
|
let mut length = 0;
|
||||||
let mut position = 0usize;
|
let mut offset = 0;
|
||||||
|
let mut position = 0;
|
||||||
|
|
||||||
let mut slice = §or[..];
|
unsafe {
|
||||||
let mut i = 0usize;
|
mode = Check_Image(&bytes, &mut length, &mut offset, &mut position);
|
||||||
let mut n = 0usize;
|
|
||||||
let mut tabla: [[usize; 3]; 8] = [
|
|
||||||
[0, 0x800, 0],
|
|
||||||
[1, 0x930, 0x10],
|
|
||||||
[21, 0x930, 0x18],
|
|
||||||
[1, 0x990, 0x10],
|
|
||||||
[21, 0x990, 0x18],
|
|
||||||
[1, 0x940, 0x10],
|
|
||||||
[21, 0x940, 0x18],
|
|
||||||
[usize::MAX, usize::MAX, usize::MAX],
|
|
||||||
];
|
|
||||||
n = 0;
|
|
||||||
while n < 2 {
|
|
||||||
i = 0;
|
|
||||||
while tabla[i as usize][0 as usize] != usize::MAX {
|
|
||||||
length = tabla[i as usize][1 as usize];
|
|
||||||
position = tabla[i as usize][2 as usize];
|
|
||||||
loop {
|
|
||||||
offset = length * 150 * n;
|
|
||||||
{
|
|
||||||
let copy_start = (offset + 0x000010 * length) as usize;
|
|
||||||
let copy_end = copy_start + (2 * length) as usize;
|
|
||||||
if copy_start >= sector.len() || copy_end >= sector.len() {
|
|
||||||
bail!("File not supported or invalid");
|
|
||||||
}
|
|
||||||
slice = §or[copy_start..copy_end];
|
|
||||||
}
|
|
||||||
if i32(slice, position)? == 0x30444301 && i32(slice, position + 4)? == 0x13130 && i32(slice, position + length + 1)? == 0x30304443 {
|
|
||||||
return Ok(CDRomImage {
|
|
||||||
mode: tabla[i as usize][0 as usize] as i32,
|
|
||||||
length: length as usize,
|
|
||||||
offset: offset as usize,
|
|
||||||
position: position as usize,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if position < 0x10 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
length -= 0x10;
|
|
||||||
position -= 0x10
|
|
||||||
}
|
|
||||||
i += 1
|
|
||||||
}
|
|
||||||
n += 1
|
|
||||||
}
|
}
|
||||||
bail!("File not supported or invalid")
|
if mode == -1 {
|
||||||
|
bail!("File not supported or invalid");
|
||||||
|
}
|
||||||
|
Ok(CDRomImage {
|
||||||
|
mode,
|
||||||
|
length: length as usize,
|
||||||
|
offset: offset as usize,
|
||||||
|
position: position as usize,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_sectors(&self, bytes: &mut [u8]) {
|
pub fn update_sectors(&self, bytes: &mut [u8]) {
|
||||||
|
Loading…
Reference in New Issue
Block a user