@@ -96,8 +96,40 @@ impl Memory {
9696 let addr_base = aligned_addr & 0x0F000000 ;
9797 let addr_offset = aligned_addr & !0xFF000000 ;
9898
99+ if CPU == ARM9 && TCM {
100+ let cp15 = get_cp15 ! ( emu, ARM9 ) ;
101+ if unlikely ( aligned_addr >= cp15. dtcm_addr && aligned_addr < cp15. dtcm_addr + cp15. dtcm_size && cp15. dtcm_state == TcmState :: RW ) {
102+ let addr = aligned_addr - cp15. dtcm_addr ;
103+ let ret: T = utils:: read_from_mem ( & self . shm , regions:: DTCM_REGION . shm_offset as u32 + ( addr & ( regions:: DTCM_SIZE - 1 ) ) ) ;
104+ debug_println ! ( "{:?} dtcm read at {:x} with value {:x}" , CPU , aligned_addr, ret. into( ) ) ;
105+ return ret;
106+ }
107+ }
108+
99109 let ret = match addr_base {
100- regions:: ITCM_OFFSET | regions:: ITCM_OFFSET2 => T :: from ( 0 ) ,
110+ regions:: ITCM_OFFSET | regions:: ITCM_OFFSET2 => match CPU {
111+ ARM9 => {
112+ let mut ret = T :: from ( 0 ) ;
113+ if TCM {
114+ let cp15 = get_cp15 ! ( emu, ARM9 ) ;
115+ if aligned_addr < cp15. itcm_size && cp15. itcm_state == TcmState :: RW {
116+ debug_println ! ( "{:?} itcm read at {:x}" , CPU , aligned_addr) ;
117+ ret = utils:: read_from_mem ( & self . shm , regions:: ITCM_REGION . shm_offset as u32 + ( aligned_addr & ( regions:: ITCM_SIZE - 1 ) ) ) ;
118+ }
119+ }
120+ ret
121+ }
122+ // Bios of arm7 has same offset as itcm on arm9
123+ ARM7 => {
124+ if aligned_addr < regions:: ARM7_BIOS_SIZE {
125+ T :: from ( 0 )
126+ } else {
127+ unsafe { unreachable_unchecked ( ) }
128+ }
129+ }
130+ } ,
131+ regions:: MAIN_OFFSET => utils:: read_from_mem ( & self . shm , regions:: MAIN_REGION . shm_offset as u32 + ( aligned_addr & ( regions:: MAIN_SIZE - 1 ) ) ) ,
132+ regions:: SHARED_WRAM_OFFSET => utils:: read_from_mem ( & self . shm , self . wram . get_shm_offset :: < CPU > ( aligned_addr) as u32 ) ,
101133 regions:: IO_PORTS_OFFSET => match CPU {
102134 ARM9 => self . io_arm9 . read ( addr_offset, emu) ,
103135 ARM7 => {
@@ -117,7 +149,10 @@ impl Memory {
117149 regions:: VRAM_OFFSET => self . vram . read :: < CPU , _ > ( addr_offset) ,
118150 regions:: OAM_OFFSET => self . oam . read ( addr_offset) ,
119151 regions:: GBA_ROM_OFFSET | regions:: GBA_ROM_OFFSET2 | regions:: GBA_RAM_OFFSET => T :: from ( 0xFFFFFFFF ) ,
120- 0x0F000000 => T :: from ( 0 ) ,
152+ 0x0F000000 => match CPU {
153+ ARM9 => T :: from ( 0 ) ,
154+ ARM7 => unsafe { unreachable_unchecked ( ) } ,
155+ } ,
121156 _ => {
122157 if IS_DEBUG {
123158 unreachable ! ( "{CPU:?} {aligned_addr:x} tcm: {TCM}" )
@@ -143,9 +178,7 @@ impl Memory {
143178 fn write_internal < const CPU : CpuType , const TCM : bool , T : Convert > ( & mut self , addr : u32 , value : T , emu : & mut Emu ) {
144179 debug_println ! ( "{:?} memory write at {:x} with value {:x}" , CPU , addr, value. into( ) ) ;
145180 let aligned_addr = addr & !( size_of :: < T > ( ) as u32 - 1 ) ;
146-
147- let addr_base = aligned_addr & 0x0F000000 ;
148- let addr_offset = aligned_addr & !0xFF000000 ;
181+ let aligned_addr = aligned_addr & 0x0FFFFFFF ;
149182
150183 let mmu = {
151184 let mmu = get_mem_mmu ! ( self , CPU ) ;
@@ -179,6 +212,9 @@ impl Memory {
179212 }
180213 }
181214
215+ let addr_base = aligned_addr & 0x0F000000 ;
216+ let addr_offset = aligned_addr & !0xFF000000 ;
217+
182218 match addr_base {
183219 regions:: ITCM_OFFSET | regions:: ITCM_OFFSET2 => match CPU {
184220 ARM9 => {
0 commit comments