@@ -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,58 +147,43 @@ impl Memory {
134147 let addr_base = aligned_addr & 0x0F000000 ;
135148 let addr_offset = aligned_addr & !0xFF000000 ;
136149
137- let vmem = {
150+ let mmu = {
138151 let mmu = get_mem_mmu ! ( self , CPU ) ;
139152 if CPU == ARM9 && TCM {
140- mmu. get_base_tcm_ptr ( )
153+ mmu. get_mmu_write_tcm ( )
141154 } else {
142- mmu. get_base_ptr ( )
155+ mmu. get_mmu_write ( )
143156 }
144157 } ;
145158
146- if CPU == ARM9 && TCM {
147- let cp15 = get_cp15 ! ( emu, ARM9 ) ;
148- 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) }
150- debug_println ! ( "{:?} dtcm write at {:x} with value {:x}" , CPU , aligned_addr, value. into( ) , ) ;
151- return ;
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+ } ,
152174 }
175+ return ;
153176 }
154177
155178 match addr_base {
156- regions:: ITCM_OFFSET | regions:: ITCM_OFFSET2 => match CPU {
157- ARM9 => {
158- if TCM {
159- let cp15 = get_cp15 ! ( emu, ARM9 ) ;
160- if aligned_addr < cp15. itcm_size && cp15. itcm_state != TcmState :: Disabled {
161- unsafe { ( vmem. add ( aligned_addr as usize ) as * mut T ) . write ( value) }
162- debug_println ! ( "{:?} itcm write at {:x} with value {:x}" , CPU , aligned_addr, value. into( ) , ) ;
163- self . jit . invalidate_block :: < { JitRegion :: Itcm } > ( aligned_addr, size_of :: < T > ( ) ) ;
164- }
165- }
166- }
167- // Bios of arm7 has same offset as itcm on arm9
168- ARM7 => {
169- // todo!("{:x} {:x}", aligned_addr, addr_base)
170- }
171- } ,
172- regions:: MAIN_OFFSET => {
173- unsafe { ( vmem. add ( aligned_addr as usize ) as * mut T ) . write ( value) } ;
174- self . jit . invalidate_block :: < { JitRegion :: Main } > ( aligned_addr, size_of :: < T > ( ) ) ;
175- }
176- regions:: SHARED_WRAM_OFFSET => {
177- unsafe { ( vmem. add ( aligned_addr as usize ) as * mut T ) . write ( value) } ;
178- if CPU == ARM7 {
179- self . jit . invalidate_block :: < { JitRegion :: Wram } > ( aligned_addr, size_of :: < T > ( ) ) ;
180- }
181- }
179+ regions:: ITCM_OFFSET | regions:: ITCM_OFFSET2 => { }
182180 regions:: IO_PORTS_OFFSET => match CPU {
183181 ARM9 => self . io_arm9 . write ( addr_offset, value, emu) ,
184182 ARM7 => {
185183 if unlikely ( addr_offset >= 0x800000 ) {
186184 let addr_offset = addr_offset & !0x8000 ;
187185 if unlikely ( addr_offset >= 0x804000 && addr_offset < 0x806000 ) {
188- unsafe { ( vmem . add ( aligned_addr as usize ) as * mut T ) . write ( value) } ;
186+ self . wifi . write ( addr_offset , value) ;
189187 } else {
190188 self . io_arm7 . write ( addr_offset, value, emu) ;
191189 }
0 commit comments