- some fixes in PU and cleanup MMU;
This commit is contained in:
mtabachenko 2010-01-21 23:29:00 +00:00
parent 5f49036c2a
commit 2e4fb2384c
2 changed files with 88 additions and 56 deletions

View File

@ -2139,10 +2139,10 @@ static INLINE void write_auxspicnt(const int proc, const int size, const int adr
//================================================= MMU write 08 //================================================= MMU write 08
void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val) void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
{ {
mmu_log_debug_ARM9(adr, "(write08) 0x%02X", val);
adr &= 0x0FFFFFFF; adr &= 0x0FFFFFFF;
mmu_log_debug_ARM9(adr, "(write08) 0x%02X", val);
if(adr < 0x02000000) if(adr < 0x02000000)
{ {
T1WriteByte(MMU.ARM9_ITCM, adr&0x7FFF, val); T1WriteByte(MMU.ARM9_ITCM, adr&0x7FFF, val);
@ -2369,10 +2369,10 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
//================================================= MMU ARM9 write 16 //================================================= MMU ARM9 write 16
void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val) void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
{ {
mmu_log_debug_ARM9(adr, "(write16) 0x%04X", val);
adr &= 0x0FFFFFFE; adr &= 0x0FFFFFFE;
mmu_log_debug_ARM9(adr, "(write16) 0x%04X", val);
if (adr < 0x02000000) if (adr < 0x02000000)
{ {
T1WriteWord(MMU.ARM9_ITCM, adr&0x7FFF, val); T1WriteWord(MMU.ARM9_ITCM, adr&0x7FFF, val);
@ -2857,10 +2857,10 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
//================================================= MMU ARM9 write 32 //================================================= MMU ARM9 write 32
void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
{ {
mmu_log_debug_ARM9(adr, "(write32) 0x%08X", val);
adr &= 0x0FFFFFFC; adr &= 0x0FFFFFFC;
mmu_log_debug_ARM9(adr, "(write32) 0x%08X", val);
if(adr<0x02000000) if(adr<0x02000000)
{ {
T1WriteLong(MMU.ARM9_ITCM, adr&0x7FFF, val); T1WriteLong(MMU.ARM9_ITCM, adr&0x7FFF, val);
@ -3283,9 +3283,9 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
//================================================= MMU ARM9 read 08 //================================================= MMU ARM9 read 08
u8 FASTCALL _MMU_ARM9_read08(u32 adr) u8 FASTCALL _MMU_ARM9_read08(u32 adr)
{ {
mmu_log_debug_ARM9(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]);
adr &= 0x0FFFFFFF; adr &= 0x0FFFFFFF;
mmu_log_debug_ARM9(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]);
if(adr<0x02000000) if(adr<0x02000000)
return T1ReadByte(MMU.ARM9_ITCM, adr&0x7FFF); return T1ReadByte(MMU.ARM9_ITCM, adr&0x7FFF);
@ -3324,10 +3324,10 @@ u8 FASTCALL _MMU_ARM9_read08(u32 adr)
//================================================= MMU ARM9 read 16 //================================================= MMU ARM9 read 16
u16 FASTCALL _MMU_ARM9_read16(u32 adr) u16 FASTCALL _MMU_ARM9_read16(u32 adr)
{ {
mmu_log_debug_ARM9(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF], adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]));
adr &= 0x0FFFFFFE; adr &= 0x0FFFFFFE;
mmu_log_debug_ARM9(adr, "(read16) 0x%04X", T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]));
if(adr<0x02000000) if(adr<0x02000000)
return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, adr & 0x7FFE); return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, adr & 0x7FFE);
@ -3402,10 +3402,6 @@ u16 FASTCALL _MMU_ARM9_read16(u32 adr)
//not sure whether these should trigger from byte reads //not sure whether these should trigger from byte reads
LagFrameFlag=0; LagFrameFlag=0;
break; break;
case REG_POSTFLG :
return 1;
} }
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]); return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);
@ -3422,10 +3418,10 @@ u16 FASTCALL _MMU_ARM9_read16(u32 adr)
//================================================= MMU ARM9 read 32 //================================================= MMU ARM9 read 32
u32 FASTCALL _MMU_ARM9_read32(u32 adr) u32 FASTCALL _MMU_ARM9_read32(u32 adr)
{ {
mmu_log_debug_ARM9(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF], adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]));
adr &= 0x0FFFFFFC; adr &= 0x0FFFFFFC;
mmu_log_debug_ARM9(adr, "(read32) 0x%08X", T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]));
if(adr<0x02000000) if(adr<0x02000000)
return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, adr&0x7FFC); return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, adr&0x7FFC);
@ -3532,11 +3528,11 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr)
//================================================= MMU ARM7 write 08 //================================================= MMU ARM7 write 08
void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val) void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)
{ {
mmu_log_debug_ARM7(adr, "(write08) 0x%02X", val);
adr &= 0x0FFFFFFF; adr &= 0x0FFFFFFF;
if (adr < 0x4001) return; // PU BIOS mmu_log_debug_ARM7(adr, "(write08) 0x%02X", val);
if (adr < 0x4000) return; // PU BIOS
if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) if ( (adr >= 0x08000000) && (adr < 0x0A010000) )
{ {
@ -3573,16 +3569,27 @@ void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)
switch(adr) switch(adr)
{ {
case REG_RTC: case REG_HALTCNT:
rtcWrite(val); //printf("halt 0x%02X\n", val);
return; switch(val)
{
case 0xC0: NDS_Sleep(); break;
// TODO: its break firmware booting? but BIG speedup with ext. SWI
//case 0x80: NDS_ARM7.waitIRQ = 1; break;
default: break;
}
break;
case REG_RTC:
rtcWrite(val);
return;
case REG_AUXSPICNT: case REG_AUXSPICNT:
write_auxspicnt(9,8,0,val); write_auxspicnt(9,8,0,val);
return; return;
case REG_AUXSPICNT+1: case REG_AUXSPICNT+1:
write_auxspicnt(9,8,1,val); write_auxspicnt(9,8,1,val);
return; return;
} }
MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val; MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val;
return; return;
@ -3599,11 +3606,11 @@ void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)
//================================================= MMU ARM7 write 16 //================================================= MMU ARM7 write 16
void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val) void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
{ {
mmu_log_debug_ARM7(adr, "(write16) 0x%04X", val);
adr &= 0x0FFFFFFE; adr &= 0x0FFFFFFE;
if (adr < 0x4001) return; // PU BIOS mmu_log_debug_ARM7(adr, "(write16) 0x%04X", val);
if (adr < 0x4000) return; // PU BIOS
if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) if ( (adr >= 0x08000000) && (adr < 0x0A010000) )
{ {
@ -3910,11 +3917,11 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
//================================================= MMU ARM7 write 32 //================================================= MMU ARM7 write 32
void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val) void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
{ {
mmu_log_debug_ARM7(adr, "(write32) 0x%08X", val);
adr &= 0x0FFFFFFC; adr &= 0x0FFFFFFC;
if (adr < 0x4001) return; // PU BIOS mmu_log_debug_ARM7(adr, "(write32) 0x%08X", val);
if (adr < 0x4000) return; // PU BIOS
if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) if ( (adr >= 0x08000000) && (adr < 0x0A010000) )
{ {
@ -4028,9 +4035,17 @@ void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
//================================================= MMU ARM7 read 08 //================================================= MMU ARM7 read 08
u8 FASTCALL _MMU_ARM7_read08(u32 adr) u8 FASTCALL _MMU_ARM7_read08(u32 adr)
{ {
adr &= 0x0FFFFFFF;
mmu_log_debug_ARM7(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]]); mmu_log_debug_ARM7(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]]);
adr &= 0x0FFFFFFF; if (adr < 0x4000)
{
//u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);
//if (prot) INFO("MMU7 read 08 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\n", adr, NDS_ARM7.R[15], prot);
if (NDS_ARM7.R[15] > 0x3FFF)
return 0xFF;
}
// wifi mac access // wifi mac access
if ((adr>=0x04800000)&&(adr<0x05000000)) if ((adr>=0x04800000)&&(adr<0x05000000))
@ -4064,9 +4079,17 @@ u8 FASTCALL _MMU_ARM7_read08(u32 adr)
//================================================= MMU ARM7 read 16 //================================================= MMU ARM7 read 16
u16 FASTCALL _MMU_ARM7_read16(u32 adr) u16 FASTCALL _MMU_ARM7_read16(u32 adr)
{ {
adr &= 0x0FFFFFFE;
mmu_log_debug_ARM7(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); mmu_log_debug_ARM7(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]));
adr &= 0x0FFFFFFE; if (adr < 0x4000)
{
//u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);
//if (prot) INFO("MMU7 read 16 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\n", adr, NDS_ARM7.R[15], prot);
if (NDS_ARM7.R[15] > 0x3FFF)
return 0xFFFF;
}
//wifi mac access //wifi mac access
if ((adr>=0x04800000)&&(adr<0x05000000)) if ((adr>=0x04800000)&&(adr<0x05000000))
@ -4129,9 +4152,6 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr)
else ret |= 64; else ret |= 64;
return ret; return ret;
} }
case REG_POSTFLG:
return 1;
} }
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]); return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]);
} }
@ -4147,9 +4167,17 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr)
//================================================= MMU ARM7 read 32 //================================================= MMU ARM7 read 32
u32 FASTCALL _MMU_ARM7_read32(u32 adr) u32 FASTCALL _MMU_ARM7_read32(u32 adr)
{ {
adr &= 0x0FFFFFFC;
mmu_log_debug_ARM7(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); mmu_log_debug_ARM7(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]));
adr &= 0x0FFFFFFC; if (adr < 0x4000)
{
//u32 prot = T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x04000308 & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);
//if (prot) INFO("MMU7 read 32 at 0x%08X (PC 0x%08X) BIOSPROT address 0x%08X\n", adr, NDS_ARM7.R[15], prot);
if (NDS_ARM7.R[15] > 0x3FFF)
return 0xFFFFFFFF;
}
//wifi mac access //wifi mac access
if ((adr>=0x04800000)&&(adr<0x05000000)) if ((adr>=0x04800000)&&(adr<0x05000000))

View File

@ -2056,6 +2056,9 @@ void NDS_Reset()
armcpu_init(&NDS_ARM7, firmware->ARM7bootAddr); armcpu_init(&NDS_ARM7, firmware->ARM7bootAddr);
armcpu_init(&NDS_ARM9, firmware->ARM9bootAddr); armcpu_init(&NDS_ARM9, firmware->ARM9bootAddr);
} }
_MMU_write08<ARMCPU_ARM9>(0x04000300, 0);
_MMU_write08<ARMCPU_ARM7>(0x04000300, 0);
} }
else else
{ {
@ -2081,23 +2084,24 @@ void NDS_Reset()
armcpu_init(&NDS_ARM7, header->ARM7exe); armcpu_init(&NDS_ARM7, header->ARM7exe);
armcpu_init(&NDS_ARM9, header->ARM9exe); armcpu_init(&NDS_ARM9, header->ARM9exe);
//bitbox 4k demo is so stripped down it relies on default stack values _MMU_write08<ARMCPU_ARM9>(0x04000300, 1);
//otherwise the arm7 will crash before making a sound _MMU_write08<ARMCPU_ARM7>(0x04000300, 1);
//(these according to gbatek softreset bios docs)
NDS_ARM7.R13_svc = 0x0380FFDC;
NDS_ARM7.R13_irq = 0x0380FFB0;
NDS_ARM7.R13_usr = 0x0380FF00;
NDS_ARM7.R[13] = NDS_ARM7.R13_usr;
//and let's set these for the arm9 while we're at it, though we have no proof
NDS_ARM9.R13_svc = 0x00803FC0;
NDS_ARM9.R13_irq = 0x00803FA0;
NDS_ARM9.R13_usr = 0x00803EC0;
NDS_ARM9.R[13] = NDS_ARM9.R13_usr;
//n.b.: im not sure about all these, I dont know enough about arm9 svc/irq/etc modes
//and how theyre named in desmume to match them up correctly. i just guessed.
} }
//bitbox 4k demo is so stripped down it relies on default stack values
//otherwise the arm7 will crash before making a sound
//(these according to gbatek softreset bios docs)
NDS_ARM7.R13_svc = 0x0380FFDC;
NDS_ARM7.R13_irq = 0x0380FFB0;
NDS_ARM7.R13_usr = 0x0380FF00;
NDS_ARM7.R[13] = NDS_ARM7.R13_usr;
//and let's set these for the arm9 while we're at it, though we have no proof
NDS_ARM9.R13_svc = 0x00803FC0;
NDS_ARM9.R13_irq = 0x00803FA0;
NDS_ARM9.R13_usr = 0x00803EC0;
NDS_ARM9.R[13] = NDS_ARM9.R13_usr;
//n.b.: im not sure about all these, I dont know enough about arm9 svc/irq/etc modes
//and how theyre named in desmume to match them up correctly. i just guessed.
nds.wifiCycle = 0; nds.wifiCycle = 0;
memset(nds.timerCycle, 0, sizeof(u64) * 2 * 4); memset(nds.timerCycle, 0, sizeof(u64) * 2 * 4);