Skip to content

Commit 0731472

Browse files
committed
Fix dtcm mapping
1 parent f4be5f4 commit 0731472

File tree

3 files changed

+58
-15
lines changed

3 files changed

+58
-15
lines changed

src/core/memory/mem.rs

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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 => {

src/core/memory/mmu.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,24 @@ impl MmuArm9Inner {
200200
*mmu_read = ITCM_REGION.shm_offset + addr_offset;
201201
*mmu_write = ITCM_REGION.shm_offset + addr_offset;
202202
self.vmem_tcm
203-
.create_page_map(shm, ITCM_REGION.shm_offset, base_addr as usize, ITCM_REGION.size, addr as usize, MMU_PAGE_SIZE, ITCM_REGION.allow_write)
203+
.create_page_map(shm, ITCM_REGION.shm_offset, base_addr as usize, ITCM_REGION.size, addr as usize, MMU_PAGE_SIZE, true)
204204
.unwrap();
205205
}
206-
} else if addr >= cp15.dtcm_addr && addr < cp15.dtcm_addr + cp15.dtcm_size && cp15.dtcm_state == TcmState::RW {
207-
let addr_offset = (addr as usize) & (DTCM_REGION.size - 1);
208-
*mmu_read = DTCM_REGION.shm_offset + addr_offset;
209-
*mmu_write = DTCM_REGION.shm_offset + addr_offset;
210-
self.vmem_tcm.destroy_map(base_addr as usize, MMU_PAGE_SIZE);
211-
self.vmem_tcm
212-
.create_page_map(shm, DTCM_REGION.shm_offset, base_addr as usize, DTCM_REGION.size, addr as usize, MMU_PAGE_SIZE, DTCM_REGION.allow_write)
213-
.unwrap();
206+
} else if addr >= cp15.dtcm_addr && addr < cp15.dtcm_addr + cp15.dtcm_size {
207+
if cp15.dtcm_state == TcmState::RW {
208+
let base_addr = addr - cp15.dtcm_addr;
209+
let addr_offset = (base_addr as usize) & (DTCM_REGION.size - 1);
210+
*mmu_read = DTCM_REGION.shm_offset + addr_offset;
211+
*mmu_write = DTCM_REGION.shm_offset + addr_offset;
212+
self.vmem_tcm.destroy_map(addr as usize, MMU_PAGE_SIZE);
213+
self.vmem_tcm
214+
.create_page_map(shm, DTCM_REGION.shm_offset, addr_offset, DTCM_REGION.size, addr as usize, MMU_PAGE_SIZE, true)
215+
.unwrap();
216+
} else if cp15.dtcm_state == TcmState::W {
217+
*mmu_read = 0;
218+
*mmu_write = 0;
219+
self.vmem_tcm.destroy_map(addr as usize, MMU_PAGE_SIZE);
220+
}
214221
}
215222
}
216223

src/jit/jit_asm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ fn emit_code_block_internal<const CPU: CpuType, const THUMB: bool>(asm: &mut Jit
200200
asm.jit_buf.current_pc = guest_pc + (i << if THUMB { 1 } else { 2 }) as u32;
201201
debug_println!("{CPU:?} emitting {:?} at pc: {:x}", asm.jit_buf.current_inst(), asm.jit_buf.current_pc);
202202

203-
// if asm.jit_buf.current_pc == 0x23801b8 {
203+
// if asm.jit_buf.current_pc == 0x2005dc0 {
204204
// block_asm.bkpt(1);
205205
// }
206206

0 commit comments

Comments
 (0)