1+ use std:: intrinsics:: likely;
2+
13use crate :: core:: emu:: Emu ;
2- use crate :: core:: memory:: io_arm9_lut:: { IoArm9ReadLut , IoArm9ReadLutUpper , IoArm9WriteLut } ;
4+ use crate :: core:: memory:: io_arm9_lut:: * ;
35use crate :: utils:: Convert ;
4- use std:: intrinsics:: likely;
56
67impl Emu {
78 pub fn io_arm9_read < T : Convert > ( & mut self , addr_offset : u32 ) -> T {
8- match addr_offset & 0xF00000 {
9- 0x0 if IoArm9ReadLut :: is_in_range ( addr_offset) => T :: from ( IoArm9ReadLut :: read ( addr_offset, size_of :: < T > ( ) as u8 , self ) ) ,
10- 0x100000 if IoArm9ReadLutUpper :: is_in_range ( addr_offset) => T :: from ( IoArm9ReadLutUpper :: read ( addr_offset, size_of :: < T > ( ) as u8 , self ) ) ,
11- _ => T :: from ( 0 ) ,
9+ unsafe {
10+ match addr_offset & 0xF00000 {
11+ 0x0 if likely ( io_arm9:: is_in_range ( addr_offset) ) => T :: from ( io_arm9:: read ( addr_offset, size_of :: < T > ( ) , self ) ) ,
12+ 0x100000 if likely ( io_arm9_upper:: is_in_range ( addr_offset) ) => T :: from ( io_arm9_upper:: read ( addr_offset, size_of :: < T > ( ) , self ) ) ,
13+ _ => T :: from ( 0 ) ,
14+ }
1215 }
1316 }
1417
@@ -23,4 +26,54 @@ impl Emu {
2326 IoArm9WriteLut :: write_fixed_slice ( addr_offset, slice, self ) ;
2427 }
2528 }
29+
30+ // pub fn io_arm9_read<T: Convert>(&mut self, addr_offset: u32) -> T {
31+ // let ret = unsafe {
32+ // let shifted_addr = addr_offset >> 8;
33+ // match shifted_addr & 0xF0FF {
34+
35+ // 0x1000 if likely(io_arm9_upper::is_in_range(addr_offset)) =>io_arm9_upper::read(addr_offset, size_of::<T>(), self),
36+ // _ => 0
37+ // }
38+ // match addr_offset & 0xF0FF00 {
39+ // 0x000000 if likely(io_arm9_0::is_in_range(addr_offset)) => io_arm9_0::read(addr_offset, size_of::<T>(), self),
40+ // 0x000100 if likely(io_arm9_1::is_in_range(addr_offset)) => io_arm9_1::read(addr_offset, size_of::<T>(), self),
41+ // 0x000200 if likely(io_arm9_2::is_in_range(addr_offset)) => io_arm9_2::read(addr_offset, size_of::<T>(), self),
42+ // 0x000300 if likely(io_arm9_3::is_in_range(addr_offset)) => io_arm9_3::read(addr_offset, size_of::<T>(), self),
43+ // 0x000600 if likely(io_arm9_6::is_in_range(addr_offset)) => io_arm9_6::read(addr_offset, size_of::<T>(), self),
44+ // 0x001000 if likely(io_arm9_gpu_b::is_in_range(addr_offset)) => io_arm9_gpu_b::read(addr_offset, size_of::<T>(), self),
45+ // 0x100000 if likely(io_arm9_upper::is_in_range(addr_offset)) => io_arm9_upper::read(addr_offset, size_of::<T>(), self),
46+ // _ => 0,
47+ // }
48+ // };
49+ // T::from(ret)
50+ // }
51+
52+ // pub fn io_arm9_write<T: Convert>(&mut self, addr_offset: u32, value: T) {
53+ // match addr_offset & 0xFF00 {
54+ // 0x0000 if likely(IoArm9Write0Lut::is_in_range(addr_offset)) => IoArm9Write0Lut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
55+ // 0x0100 if likely(IoArm9Write1Lut::is_in_range(addr_offset)) => IoArm9Write1Lut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
56+ // 0x0200 if likely(IoArm9Write2Lut::is_in_range(addr_offset)) => IoArm9Write2Lut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
57+ // 0x0300 if likely(IoArm9Write3Lut::is_in_range(addr_offset)) => IoArm9Write3Lut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
58+ // 0x0400 if likely(IoArm9Write4Lut::is_in_range(addr_offset)) => IoArm9Write4Lut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
59+ // 0x0500 if likely(IoArm9Write5Lut::is_in_range(addr_offset)) => IoArm9Write5Lut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
60+ // 0x0600 if likely(IoArm9Write6Lut::is_in_range(addr_offset)) => IoArm9Write6Lut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
61+ // 0x1000 if likely(IoArm9WriteGpuBLut::is_in_range(addr_offset)) => IoArm9WriteGpuBLut::write(value.into(), addr_offset, size_of::<T>() as u8, self),
62+ // _ => {}
63+ // }
64+ // }
65+
66+ // pub fn io_arm9_write_fixed_slice<T: Convert>(&mut self, addr_offset: u32, slice: &[T]) {
67+ // match addr_offset & 0xFF00 {
68+ // 0x0000 if likely(IoArm9Write0Lut::is_in_range(addr_offset)) => IoArm9Write0Lut::write_fixed_slice(addr_offset, slice, self),
69+ // 0x0100 if likely(IoArm9Write1Lut::is_in_range(addr_offset)) => IoArm9Write1Lut::write_fixed_slice(addr_offset, slice, self),
70+ // 0x0200 if likely(IoArm9Write2Lut::is_in_range(addr_offset)) => IoArm9Write2Lut::write_fixed_slice(addr_offset, slice, self),
71+ // 0x0300 if likely(IoArm9Write3Lut::is_in_range(addr_offset)) => IoArm9Write3Lut::write_fixed_slice(addr_offset, slice, self),
72+ // 0x0400 if likely(IoArm9Write4Lut::is_in_range(addr_offset)) => IoArm9Write4Lut::write_fixed_slice(addr_offset, slice, self),
73+ // 0x0500 if likely(IoArm9Write5Lut::is_in_range(addr_offset)) => IoArm9Write5Lut::write_fixed_slice(addr_offset, slice, self),
74+ // 0x0600 if likely(IoArm9Write6Lut::is_in_range(addr_offset)) => IoArm9Write6Lut::write_fixed_slice(addr_offset, slice, self),
75+ // 0x1000 if likely(IoArm9WriteGpuBLut::is_in_range(addr_offset)) => IoArm9WriteGpuBLut::write_fixed_slice(addr_offset, slice, self),
76+ // _ => {}
77+ // }
78+ // }
2679}
0 commit comments