Skip to content

Commit 4d1ffa2

Browse files
committed
WIP
1 parent 30fb6d6 commit 4d1ffa2

File tree

16 files changed

+520
-254
lines changed

16 files changed

+520
-254
lines changed

build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ fn main() {
1616
if target != "armv7-sony-vita-newlibeabihf" {
1717
// Running IDE on anything other than linux will fail, so ignore compile error
1818
let _ = cc::Build::new().file("builtins/cache.c").try_compile("cache").ok();
19+
return;
1920
}
2021

2122
let num_jobs = env::var("NUM_JOBS").unwrap();

src/core/cp15.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ impl Cp15 {
134134
debug_println!("Set itcm with size {:x}", self.itcm_size);
135135
}
136136

137-
pub fn write(&mut self, reg: u32, value: u32, emu: &Emu) {
137+
pub fn write(&mut self, reg: u32, value: u32, emu: &mut Emu) {
138138
debug_println!("Writing to cp15 reg {:x} {:x}", reg, value);
139139

140140
match reg {

src/core/memory/mem.rs

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ use crate::core::cp15::TcmState;
22
use crate::core::emu::{get_cp15, Emu};
33
use crate::core::memory::io_arm7::IoArm7;
44
use 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};
66
use crate::core::memory::oam::Oam;
77
use crate::core::memory::palettes::Palettes;
88
use crate::core::memory::regions;
99
use crate::core::memory::vram::Vram;
10+
use crate::core::memory::wifi::Wifi;
1011
use crate::core::memory::wram::Wram;
1112
use crate::core::spu::SoundSampler;
1213
use crate::core::CpuType;
@@ -15,6 +16,7 @@ use crate::jit::jit_memory::{JitMemory, JitRegion};
1516
use crate::logging::debug_println;
1617
use crate::mmap::Shm;
1718
use crate::utils::Convert;
19+
use crate::{utils, IS_DEBUG};
1820
use std::hint::unreachable_unchecked;
1921
use std::intrinsics::{likely, unlikely};
2022
use 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

Comments
 (0)