@@ -2,11 +2,12 @@ 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 , MMU_PAGE_SHIFT } ;
5+ use crate :: core:: memory:: mmu:: { MmuArm7 , MmuArm9 , MMU_PAGE_SHIFT , MMU_PAGE_SIZE } ;
66use crate :: core:: memory:: oam:: Oam ;
77use crate :: core:: memory:: palettes:: Palettes ;
88use crate :: core:: memory:: regions;
99use crate :: core:: memory:: vram:: Vram ;
10+ use crate :: core:: memory:: wifi:: Wifi ;
1011use crate :: core:: memory:: wram:: Wram ;
1112use crate :: core:: spu:: SoundSampler ;
1213use crate :: core:: CpuType ;
@@ -15,6 +16,7 @@ use crate::jit::jit_memory::{JitMemory, JitRegion};
1516use crate :: logging:: debug_println;
1617use crate :: mmap:: Shm ;
1718use crate :: utils:: Convert ;
19+ use crate :: { utils, IS_DEBUG } ;
1820use std:: hint:: unreachable_unchecked;
1921use std:: intrinsics:: { likely, unlikely} ;
2022use std:: sync:: atomic:: AtomicU16 ;
@@ -26,6 +28,7 @@ pub struct Memory {
2628 pub wram : Wram ,
2729 pub io_arm7 : IoArm7 ,
2830 pub io_arm9 : IoArm9 ,
31+ pub wifi : Wifi ,
2932 pub palettes : Palettes ,
3033 pub vram : Vram ,
3134 pub oam : Oam ,
@@ -51,6 +54,7 @@ impl Memory {
5154 wram : Wram :: new ( ) ,
5255 io_arm7 : IoArm7 :: new ( touch_points, sound_sampler) ,
5356 io_arm9 : IoArm9 :: new ( ) ,
57+ wifi : Wifi :: new ( ) ,
5458 palettes : Palettes :: new ( ) ,
5559 vram : Vram :: new ( ) ,
5660 oam : Oam :: new ( ) ,
@@ -74,18 +78,19 @@ impl Memory {
7478 let aligned_addr = addr & !( size_of :: < T > ( ) as u32 - 1 ) ;
7579 let aligned_addr = aligned_addr & 0x0FFFFFFF ;
7680
77- let ( vmem , mmu) = {
81+ let mmu = {
7882 let mmu = get_mem_mmu ! ( self , CPU ) ;
7983 if CPU == ARM9 && TCM {
80- ( mmu. get_base_tcm_ptr ( ) , mmu . get_mmu_read_tcm ( ) )
84+ mmu. get_mmu_read_tcm ( )
8185 } else {
82- ( mmu. get_base_ptr ( ) , mmu . get_mmu_read ( ) )
86+ mmu. get_mmu_read ( )
8387 }
8488 } ;
8589
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 ( ) } ;
90+ let shm_offset = unsafe { * mmu. get_unchecked ( ( aligned_addr as usize ) >> MMU_PAGE_SHIFT ) } ;
91+ if likely ( shm_offset != 0 ) {
92+ let offset = aligned_addr & ( MMU_PAGE_SIZE as u32 - 1 ) ;
93+ return utils:: read_from_mem ( & self . shm , shm_offset as u32 + offset) ;
8994 }
9095
9196 let addr_base = aligned_addr & 0x0F000000 ;
@@ -99,7 +104,7 @@ impl Memory {
99104 if unlikely ( addr_offset >= 0x800000 ) {
100105 let addr_offset = addr_offset & !0x8000 ;
101106 if unlikely ( addr_offset >= 0x804000 && addr_offset < 0x806000 ) {
102- unsafe { ( vmem . add ( aligned_addr as usize ) as * const T ) . read ( ) }
107+ self . wifi . read ( addr_offset )
103108 } else {
104109 self . io_arm7 . read ( addr_offset, emu)
105110 }
@@ -111,7 +116,15 @@ impl Memory {
111116 regions:: STANDARD_PALETTES_OFFSET => self . palettes . read ( addr_offset) ,
112117 regions:: VRAM_OFFSET => self . vram . read :: < CPU , _ > ( addr_offset) ,
113118 regions:: OAM_OFFSET => self . oam . read ( addr_offset) ,
114- _ => unsafe { unreachable_unchecked ( ) } ,
119+ regions:: GBA_ROM_OFFSET | regions:: GBA_ROM_OFFSET2 | regions:: GBA_RAM_OFFSET => T :: from ( 0xFFFFFFFF ) ,
120+ 0x0F000000 => T :: from ( 0 ) ,
121+ _ => {
122+ if IS_DEBUG {
123+ unreachable ! ( "{CPU:?} {aligned_addr:x}" )
124+ } else {
125+ unsafe { unreachable_unchecked ( ) }
126+ }
127+ }
115128 } ;
116129
117130 debug_println ! ( "{:?} memory read at {:x} with value {:x}" , CPU , addr, ret. into( ) ) ;
@@ -134,19 +147,43 @@ impl Memory {
134147 let addr_base = aligned_addr & 0x0F000000 ;
135148 let addr_offset = aligned_addr & !0xFF000000 ;
136149
137- let vmem = {
138- let mmu = get_mem_mmu ! ( self , CPU ) ;
139- if CPU == ARM9 && TCM {
140- mmu. get_base_tcm_ptr ( )
141- } else {
142- mmu. get_base_ptr ( )
143- }
150+ // let mmu = {
151+ // let mmu = get_mem_mmu!(self, CPU);
152+ // if CPU == ARM9 && TCM {
153+ // mmu.get_mmu_write_tcm()
154+ // } else {
155+ // mmu.get_mmu_write()
156+ // }
157+ // };
158+ //
159+ // let shm_offset = unsafe { *mmu.get_unchecked((aligned_addr as usize) >> MMU_PAGE_SHIFT) };
160+ // if likely(shm_offset != 0) {
161+ // let offset = aligned_addr & (MMU_PAGE_SIZE as u32 - 1);
162+ // utils::write_to_mem(&mut self.shm, shm_offset as u32 + offset, value);
163+ // match CPU {
164+ // ARM9 => match addr_base {
165+ // regions::ITCM_OFFSET | regions::ITCM_OFFSET2 => self.jit.invalidate_block::<{ JitRegion::Itcm }>(aligned_addr, size_of::<T>()),
166+ // regions::MAIN_OFFSET => self.jit.invalidate_block::<{ JitRegion::Main }>(aligned_addr, size_of::<T>()),
167+ // _ => {}
168+ // },
169+ // ARM7 => match addr_base {
170+ // regions::MAIN_OFFSET => self.jit.invalidate_block::<{ JitRegion::Main }>(aligned_addr, size_of::<T>()),
171+ // regions::SHARED_WRAM_OFFSET => self.jit.invalidate_block::<{ JitRegion::Wram }>(aligned_addr, size_of::<T>()),
172+ // _ => {}
173+ // },
174+ // }
175+ // return;
176+ // }
177+
178+ let mut write_to_shm = |shm_offset : usize , addr_offset : u32 , size : u32 | {
179+ let offset = addr_offset & ( size - 1 ) ;
180+ utils:: write_to_mem ( & mut self . shm , shm_offset as u32 + offset, value) ;
144181 } ;
145182
146183 if CPU == ARM9 && TCM {
147184 let cp15 = get_cp15 ! ( emu, ARM9 ) ;
148185 if unlikely ( aligned_addr >= cp15. dtcm_addr && aligned_addr < cp15. dtcm_addr + cp15. dtcm_size && cp15. dtcm_state != TcmState :: Disabled ) {
149- unsafe { ( vmem . add ( aligned_addr as usize ) as * mut T ) . write ( value ) }
186+ write_to_shm ( regions :: DTCM_REGION . shm_offset , aligned_addr - cp15 . dtcm_addr , regions :: DTCM_SIZE ) ;
150187 debug_println ! ( "{:?} dtcm write at {:x} with value {:x}" , CPU , aligned_addr, value. into( ) , ) ;
151188 return ;
152189 }
@@ -158,7 +195,7 @@ impl Memory {
158195 if TCM {
159196 let cp15 = get_cp15 ! ( emu, ARM9 ) ;
160197 if aligned_addr < cp15. itcm_size && cp15. itcm_state != TcmState :: Disabled {
161- unsafe { ( vmem . add ( aligned_addr as usize ) as * mut T ) . write ( value ) }
198+ write_to_shm ( regions :: ITCM_REGION . shm_offset , addr_offset , regions :: ITCM_SIZE ) ;
162199 debug_println ! ( "{:?} itcm write at {:x} with value {:x}" , CPU , aligned_addr, value. into( ) , ) ;
163200 self . jit . invalidate_block :: < { JitRegion :: Itcm } > ( aligned_addr, size_of :: < T > ( ) ) ;
164201 }
@@ -170,11 +207,12 @@ impl Memory {
170207 }
171208 } ,
172209 regions:: MAIN_OFFSET => {
173- unsafe { ( vmem . add ( aligned_addr as usize ) as * mut T ) . write ( value ) } ;
210+ write_to_shm ( regions :: MAIN_REGION . shm_offset , addr_offset , regions :: MAIN_SIZE ) ;
174211 self . jit . invalidate_block :: < { JitRegion :: Main } > ( aligned_addr, size_of :: < T > ( ) ) ;
175212 }
176213 regions:: SHARED_WRAM_OFFSET => {
177- unsafe { ( vmem. add ( aligned_addr as usize ) as * mut T ) . write ( value) } ;
214+ let shm_offset = self . wram . get_shm_offset :: < CPU > ( aligned_addr) ;
215+ write_to_shm ( shm_offset, 0 , 1 ) ;
178216 if CPU == ARM7 {
179217 self . jit . invalidate_block :: < { JitRegion :: Wram } > ( aligned_addr, size_of :: < T > ( ) ) ;
180218 }
@@ -185,7 +223,7 @@ impl Memory {
185223 if unlikely ( addr_offset >= 0x800000 ) {
186224 let addr_offset = addr_offset & !0x8000 ;
187225 if unlikely ( addr_offset >= 0x804000 && addr_offset < 0x806000 ) {
188- unsafe { ( vmem . add ( aligned_addr as usize ) as * mut T ) . write ( value) } ;
226+ self . wifi . write ( addr_offset , value) ;
189227 } else {
190228 self . io_arm7 . write ( addr_offset, value, emu) ;
191229 }
0 commit comments