@@ -2,7 +2,7 @@ use crate::core::cp15::TcmState;
22use crate :: core:: emu:: { get_cp15, Emu } ;
33use crate :: core:: memory:: io_arm7:: IoArm7 ;
44use crate :: core:: memory:: io_arm9:: IoArm9 ;
5- use crate :: core:: memory:: mmu:: { MmuArm7 , MmuArm9 } ;
5+ use crate :: core:: memory:: mmu:: { MmuArm7 , MmuArm9 , MMU_PAGE_SHIFT } ;
66use crate :: core:: memory:: oam:: Oam ;
77use crate :: core:: memory:: palettes:: Palettes ;
88use crate :: core:: memory:: regions;
@@ -15,7 +15,8 @@ use crate::jit::jit_memory::{JitMemory, JitRegion};
1515use crate :: logging:: debug_println;
1616use crate :: mmap:: Shm ;
1717use crate :: utils:: Convert ;
18- use std:: intrinsics:: unlikely;
18+ use std:: hint:: unreachable_unchecked;
19+ use std:: intrinsics:: { likely, unlikely} ;
1920use std:: sync:: atomic:: AtomicU16 ;
2021use std:: sync:: Arc ;
2122use CpuType :: ARM7 ;
@@ -71,47 +72,27 @@ impl Memory {
7172 pub fn read_with_options < const CPU : CpuType , const TCM : bool , T : Convert > ( & mut self , addr : u32 , emu : & mut Emu ) -> T {
7273 debug_println ! ( "{:?} memory read at {:x}" , CPU , addr) ;
7374 let aligned_addr = addr & !( size_of :: < T > ( ) as u32 - 1 ) ;
75+ let aligned_addr = aligned_addr & 0x0FFFFFFF ;
7476
75- let addr_base = aligned_addr & 0x0F000000 ;
76- let addr_offset = aligned_addr & !0xFF000000 ;
77-
78- let vmem = {
77+ let ( vmem, mmu) = {
7978 let mmu = get_mem_mmu ! ( self , CPU ) ;
8079 if CPU == ARM9 && TCM {
81- mmu. get_base_tcm_ptr ( )
80+ ( mmu. get_base_tcm_ptr ( ) , mmu . get_mmu_read_tcm ( ) )
8281 } else {
83- mmu. get_base_ptr ( )
82+ ( mmu. get_base_ptr ( ) , mmu . get_mmu_read ( ) )
8483 }
8584 } ;
8685
87- if CPU == ARM9 && TCM {
88- let cp15 = get_cp15 ! ( emu, ARM9 ) ;
89- if unlikely ( aligned_addr >= cp15. dtcm_addr && aligned_addr < cp15. dtcm_addr + cp15. dtcm_size && cp15. dtcm_state == TcmState :: RW ) {
90- let ret = unsafe { ( vmem. add ( aligned_addr as usize ) as * const T ) . read ( ) } ;
91- debug_println ! ( "{:?} dtcm read at {:x} with value {:x}" , CPU , aligned_addr, ret. into( ) ) ;
92- return ret;
93- }
86+ let mapped = unsafe { * mmu. get_unchecked ( ( aligned_addr as usize ) >> MMU_PAGE_SHIFT ) } ;
87+ if likely ( mapped) {
88+ return unsafe { ( vmem. add ( aligned_addr as usize ) as * const T ) . read ( ) } ;
9489 }
9590
91+ let addr_base = aligned_addr & 0x0F000000 ;
92+ let addr_offset = aligned_addr & !0xFF000000 ;
93+
9694 let ret = match addr_base {
97- regions:: ITCM_OFFSET | regions:: ITCM_OFFSET2 => match CPU {
98- ARM9 => {
99- let mut ret = T :: from ( 0 ) ;
100- if TCM {
101- let cp15 = get_cp15 ! ( emu, ARM9 ) ;
102- if aligned_addr < cp15. itcm_size && cp15. itcm_state == TcmState :: RW {
103- debug_println ! ( "{:?} itcm read at {:x}" , CPU , aligned_addr) ;
104- ret = unsafe { ( vmem. add ( aligned_addr as usize ) as * const T ) . read ( ) }
105- }
106- }
107- ret
108- }
109- // Bios of arm7 has same offset as itcm on arm9
110- ARM7 => unsafe { ( vmem. add ( aligned_addr as usize ) as * const T ) . read ( ) } ,
111- } ,
112- regions:: MAIN_OFFSET | regions:: SHARED_WRAM_OFFSET | regions:: GBA_ROM_OFFSET | regions:: GBA_ROM_OFFSET2 | 0x0F000000 => unsafe {
113- ( vmem. add ( ( aligned_addr & 0x0FFFFFFF ) as usize ) as * const T ) . read ( )
114- } ,
95+ regions:: ITCM_OFFSET | regions:: ITCM_OFFSET2 => T :: from ( 0 ) ,
11596 regions:: IO_PORTS_OFFSET => match CPU {
11697 ARM9 => self . io_arm9 . read ( addr_offset, emu) ,
11798 ARM7 => {
@@ -130,8 +111,7 @@ impl Memory {
130111 regions:: STANDARD_PALETTES_OFFSET => self . palettes . read ( addr_offset) ,
131112 regions:: VRAM_OFFSET => self . vram . read :: < CPU , _ > ( addr_offset) ,
132113 regions:: OAM_OFFSET => self . oam . read ( addr_offset) ,
133- regions:: GBA_RAM_OFFSET => T :: from ( 0xFFFFFFFF ) ,
134- _ => unreachable ! ( ) ,
114+ _ => unsafe { unreachable_unchecked ( ) } ,
135115 } ;
136116
137117 debug_println ! ( "{:?} memory read at {:x} with value {:x}" , CPU , addr, ret. into( ) ) ;
@@ -223,7 +203,7 @@ impl Memory {
223203 }
224204 regions:: OAM_OFFSET => self . oam . write ( addr_offset, value) ,
225205 regions:: GBA_ROM_OFFSET => { }
226- _ => unreachable ! ( ) ,
206+ _ => unsafe { unreachable_unchecked ( ) } ,
227207 } ;
228208 }
229209}
0 commit comments