From 04af01a1ef6db71e234d436d5f7f0019f0d106a8 Mon Sep 17 00:00:00 2001 From: zeromus Date: Fri, 3 Jul 2009 09:52:32 +0000 Subject: [PATCH] core: emulate dma access to TCM by reading 0 and discarding writes. also fix a bug in the newer (extremely verbose) instruction logging --- desmume/src/MMU.cpp | 16 +++++++---- desmume/src/MMU.h | 60 ++++++++++++++++++++++++++++++++++----- desmume/src/NDSSystem.cpp | 4 +-- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/desmume/src/MMU.cpp b/desmume/src/MMU.cpp index 1787056f1..10563d238 100644 --- a/desmume/src/MMU.cpp +++ b/desmume/src/MMU.cpp @@ -1198,28 +1198,34 @@ void FASTCALL MMU_doDMA(u32 num) return; } + //if these do not use MMU_AT_DMA and the corresponding code in the read/write routines, + //then danny phantom title screen will be filled with a garbage char which is made by + //dmaing from 0x00000000 to 0x06000000 if ((MMU.DMACrt[PROCNUM][num]>>26)&1) for(; i < taille; ++i) { - _MMU_write32(dst, _MMU_read32(src)); + _MMU_write32(dst, _MMU_read32(src)); dst += dstinc; src += srcinc; } else for(; i < taille; ++i) { - _MMU_write16(dst, _MMU_read16(src)); + _MMU_write16(dst, _MMU_read16(src)); dst += dstinc; src += srcinc; } - //this is necessary for repeating DMA such as to scroll registers for NSMB level backdrop scrolling effect -//#if 0 //write back the addresses DMASrc[PROCNUM][num] = src; if((u & 0x3)!=3) //but dont write back dst if we were supposed to reload DMADst[PROCNUM][num] = dst; -//#endif + + //this is probably not the best place to do it, but the dma code in ndssystem is so bad i didnt want to touch it + //until it all gets rewritten. so this is here as a reminder, at least. + //(there is no proof for this code, but it is reasonable) + T1WriteLong(MMU.MMU_MEM[PROCNUM][0x40], 0xB0+12*num, DMASrc[PROCNUM][num]); + T1WriteLong(MMU.MMU_MEM[PROCNUM][0x40], 0xB4+12*num, DMADst[PROCNUM][num]); } } diff --git a/desmume/src/MMU.h b/desmume/src/MMU.h index a07983f1c..1c6d4c901 100644 --- a/desmume/src/MMU.h +++ b/desmume/src/MMU.h @@ -222,7 +222,7 @@ FORCEINLINE void* MMU_gpu_map(u32 vram_addr) enum MMU_ACCESS_TYPE { - MMU_AT_CODE, MMU_AT_DATA, MMU_AT_GPU + MMU_AT_CODE, MMU_AT_DATA, MMU_AT_GPU, MMU_AT_DMA }; template u8 _MMU_read08(u32 addr); @@ -265,7 +265,15 @@ inline void SetupMMU(bool debugConsole) { //T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr >> 20) & 0xFF], // adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr >> 20) & 0xFF]); -FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { +FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) +{ + //special handling for DMA: read 0 from TCM + if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) + { + if(addr<0x02000000) return 0; //itcm + if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { @@ -280,7 +288,14 @@ FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u3 else return _MMU_ARM7_read08(addr); } -FORCEINLINE u16 _MMU_read16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { +FORCEINLINE u16 _MMU_read16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) +{ + //special handling for DMA: read 0 from TCM + if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) + { + if(addr<0x02000000) return 0; //itcm + if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm + } //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) @@ -309,7 +324,14 @@ dunno: else return _MMU_ARM7_read16(addr); } -FORCEINLINE u32 _MMU_read32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { +FORCEINLINE u32 _MMU_read32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) +{ + //special handling for DMA: read 0 from TCM + if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) + { + if(addr<0x02000000) return 0; //itcm + if((addr&(~0x3FFF)) == MMU.DTCMRegion) return 0; //dtcm + } //special handling for execution from arm9, since we spend so much time in there if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_CODE) @@ -353,7 +375,15 @@ dunno: else return _MMU_ARM7_read32(addr); } -FORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u8 val) { +FORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u8 val) +{ + //special handling for DMA: discard writes to TCM + if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) + { + if(addr<0x02000000) return; //itcm + if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { @@ -370,7 +400,15 @@ FORCEINLINE void _MMU_write08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const else _MMU_ARM7_write08(addr,val); } -FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u16 val) { +FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u16 val) +{ + //special handling for DMA: discard writes to TCM + if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) + { + if(addr<0x02000000) return; //itcm + if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { @@ -387,7 +425,15 @@ FORCEINLINE void _MMU_write16(const int PROCNUM, const MMU_ACCESS_TYPE AT, const else _MMU_ARM7_write16(addr,val); } -FORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u32 val) { +FORCEINLINE void _MMU_write32(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr, u32 val) +{ + //special handling for DMA: discard writes to TCM + if(PROCNUM==ARMCPU_ARM9 && AT == MMU_AT_DMA) + { + if(addr<0x02000000) return; //itcm + if((addr&(~0x3FFF)) == MMU.DTCMRegion) return; //dtcm + } + if(PROCNUM==ARMCPU_ARM9) if((addr&(~0x3FFF)) == MMU.DTCMRegion) { diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index 28f0c8100..7fd265cfc 100644 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -1654,7 +1654,7 @@ void NDS_exec(s32 nb) else des_arm_instructions_set[INDEX(NDS_ARM9.instruction)](NDS_ARM9.instruct_adr, NDS_ARM9.instruction, dasmbuf); - printf("%05d %08d 9:%08X %08X %-30s %08X R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", + printf("%05d %08d 9:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", currFrameCounter, nds.cycles, NDS_ARM9.instruct_adr,NDS_ARM9.instruction, dasmbuf, NDS_ARM9.R[0], NDS_ARM9.R[1], NDS_ARM9.R[2], NDS_ARM9.R[3], NDS_ARM9.R[4], NDS_ARM9.R[5], NDS_ARM9.R[6], NDS_ARM9.R[7], @@ -1712,7 +1712,7 @@ void NDS_exec(s32 nb) des_thumb_instructions_set[((NDS_ARM7.instruction)>>6)&1023](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); else des_arm_instructions_set[INDEX(NDS_ARM7.instruction)](NDS_ARM7.instruct_adr, NDS_ARM7.instruction, dasmbuf); - printf("%05d %08d 7:%08X %08X %-30s %08X R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", + printf("%05d %08d 7:%08X %08X %-30s R00:%08X R01:%08X R02:%08X R03:%08X R04:%08X R05:%08X R06:%08X R07:%08X R08:%08X R09:%08X R10:%08X R11:%08X R12:%08X R13:%08X R14:%08X R15:%08X\n", currFrameCounter, nds.cycles, NDS_ARM7.instruct_adr,NDS_ARM7.instruction, dasmbuf, NDS_ARM7.R[0], NDS_ARM7.R[1], NDS_ARM7.R[2], NDS_ARM7.R[3], NDS_ARM7.R[4], NDS_ARM7.R[5], NDS_ARM7.R[6], NDS_ARM7.R[7],