- some cleanup (added template DMA & change send data to TOONTABLE implementation)

This commit is contained in:
mtabachenko 2009-01-21 11:30:54 +00:00
parent a645bdb1d9
commit 2affa600c1
5 changed files with 145 additions and 132 deletions

View File

@ -3,7 +3,7 @@
yopyop156.ifrance.com
Copyright (C) 2007 shash
Copyright (C) 2007-2008 DeSmuME team
Copyright (C) 2007-2009 DeSmuME team
This file is part of DeSmuME
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
//#define NEW_IRQ 1
@ -870,60 +870,61 @@ static void execdiv() {
MMU.divRunning = TRUE;
}
void FASTCALL MMU_doDMA(u32 proc, u32 num)
template<int PROCNUM>
void FASTCALL MMU_doDMA(u32 num)
{
u32 src = DMASrc[proc][num];
u32 dst = DMADst[proc][num];
u32 src = DMASrc[PROCNUM][num];
u32 dst = DMADst[PROCNUM][num];
u32 taille;
if(src==dst)
{
T1WriteLong(MMU.MMU_MEM[proc][0x40], 0xB8 + (0xC*num), T1ReadLong(MMU.MMU_MEM[proc][0x40], 0xB8 + (0xC*num)) & 0x7FFFFFFF);
T1WriteLong(MMU.MMU_MEM[PROCNUM][0x40], 0xB8 + (0xC*num), T1ReadLong(MMU.MMU_MEM[PROCNUM][0x40], 0xB8 + (0xC*num)) & 0x7FFFFFFF);
return;
}
if((!(MMU.DMACrt[proc][num]&(1<<31)))&&(!(MMU.DMACrt[proc][num]&(1<<25))))
if((!(MMU.DMACrt[PROCNUM][num]&(1<<31)))&&(!(MMU.DMACrt[PROCNUM][num]&(1<<25))))
{ /* not enabled and not to be repeated */
MMU.DMAStartTime[proc][num] = 0;
MMU.DMACycle[proc][num] = 0;
//MMU.DMAing[proc][num] = FALSE;
MMU.DMAStartTime[PROCNUM][num] = 0;
MMU.DMACycle[PROCNUM][num] = 0;
//MMU.DMAing[PROCNUM][num] = FALSE;
return;
}
/* word count */
taille = (MMU.DMACrt[proc][num]&0xFFFF);
taille = (MMU.DMACrt[PROCNUM][num]&0xFFFF);
// If we are in "Main memory display" mode just copy an entire
// screen (256x192 pixels).
// Reference: http://nocash.emubase.de/gbatek.htm#dsvideocaptureandmainmemorydisplaymode
// (under DISP_MMEM_FIFO)
if ((MMU.DMAStartTime[proc][num]==4) && // Must be in main memory display mode
if ((MMU.DMAStartTime[PROCNUM][num]==4) && // Must be in main memory display mode
(taille==4) && // Word must be 4
(((MMU.DMACrt[proc][num]>>26)&1) == 1)) // Transfer mode must be 32bit wide
(((MMU.DMACrt[PROCNUM][num]>>26)&1) == 1)) // Transfer mode must be 32bit wide
taille = 24576; //256*192/2;
if(MMU.DMAStartTime[proc][num] == 5)
if(MMU.DMAStartTime[PROCNUM][num] == 5)
taille *= 0x80;
MMU.DMACycle[proc][num] = taille + nds.cycles;
MMU.DMAing[proc][num] = TRUE;
MMU.CheckDMAs |= (1<<(num+(proc<<2)));
MMU.DMACycle[PROCNUM][num] = taille + nds.cycles;
MMU.DMAing[PROCNUM][num] = TRUE;
MMU.CheckDMAs |= (1<<(num+(PROCNUM<<2)));
DMALOG("proc %d, dma %d src %08X dst %08X start %d taille %d repeat %s %08X\r\n",
proc, num, src, dst, MMU.DMAStartTime[proc][num], taille,
(MMU.DMACrt[proc][num]&(1<<25))?"on":"off",MMU.DMACrt[proc][num]);
DMALOG("PROCNUM %d, dma %d src %08X dst %08X start %d taille %d repeat %s %08X\r\n",
PROCNUM, num, src, dst, MMU.DMAStartTime[PROCNUM][num], taille,
(MMU.DMACrt[PROCNUM][num]&(1<<25))?"on":"off",MMU.DMACrt[PROCNUM][num]);
if(!(MMU.DMACrt[proc][num]&(1<<25)))
MMU.DMAStartTime[proc][num] = 0;
if(!(MMU.DMACrt[PROCNUM][num]&(1<<25)))
MMU.DMAStartTime[PROCNUM][num] = 0;
// transfer
{
u32 i=0;
// 32 bit or 16 bit transfer ?
int sz = ((MMU.DMACrt[proc][num]>>26)&1)? 4 : 2;
int sz = ((MMU.DMACrt[PROCNUM][num]>>26)&1)? 4 : 2;
int dstinc,srcinc;
int u=(MMU.DMACrt[proc][num]>>21);
int u=(MMU.DMACrt[PROCNUM][num]>>21);
switch(u & 0x3) {
case 0 : dstinc = sz; break;
case 1 : dstinc = -sz; break;
@ -942,30 +943,25 @@ void FASTCALL MMU_doDMA(u32 proc, u32 num)
return;
}
#define DMA_LOOP(PROC) \
if ((MMU.DMACrt[proc][num]>>26)&1) \
for(; i < taille; ++i) \
{ \
_MMU_write32<PROC>(dst, _MMU_read32<PROC>(src)); \
dst += dstinc; \
src += srcinc; \
} \
else \
for(; i < taille; ++i) \
{ \
_MMU_write16<PROC>(dst, _MMU_read16<PROC>(src)); \
dst += dstinc; \
src += srcinc; \
} \
if(proc == ARMCPU_ARM9) { DMA_LOOP(ARMCPU_ARM9); }
else { DMA_LOOP(ARMCPU_ARM7); }
if ((MMU.DMACrt[PROCNUM][num]>>26)&1)
for(; i < taille; ++i)
{
_MMU_write32<PROCNUM>(dst, _MMU_read32<PROCNUM>(src));
dst += dstinc;
src += srcinc;
}
else
for(; i < taille; ++i)
{
_MMU_write16<PROCNUM>(dst, _MMU_read16<PROCNUM>(src));
dst += dstinc;
src += srcinc;
}
//write back the addresses
DMASrc[proc][num] = src;
DMASrc[PROCNUM][num] = src;
if((u & 0x3)!=3) //but dont write back dst if we were supposed to reload
DMADst[proc][num] = dst;
DMADst[PROCNUM][num] = dst;
}
}
@ -1734,15 +1730,18 @@ static void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
if((adr >> 24) == 4)
{
if(adr >= 0x04000380 && adr <= 0x040003BE)
switch (adr >> 4)
{
//toon table
((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr-0x04000000)>>1] = val;
gfx3d_UpdateToonTable(&((MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(0x380)]);
case 0x0400038:
case 0x0400039:
case 0x040003A:
case 0x040003B:
((u16 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF)>>1] = val;
gfx3d_UpdateToonTable((adr & 0x3F) >> 1, val);
return;
}
/* Address is an IO register */
// Address is an IO register
switch(adr)
{
case 0x0400035C:
@ -2163,7 +2162,7 @@ static void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
MMU.DMAStartTime[ARMCPU_ARM9][0] = (v>>27) & 0x7;
MMU.DMACrt[ARMCPU_ARM9][0] = v;
if(MMU.DMAStartTime[ARMCPU_ARM9][0] == 0)
MMU_doDMA(ARMCPU_ARM9, 0);
MMU_doDMA<ARMCPU_ARM9>(0);
#ifdef LOG_DMA2
//else
{
@ -2184,7 +2183,7 @@ static void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
MMU.DMAStartTime[ARMCPU_ARM9][1] = (v>>27) & 0x7;
MMU.DMACrt[ARMCPU_ARM9][1] = v;
if(MMU.DMAStartTime[ARMCPU_ARM9][1] == 0)
MMU_doDMA(ARMCPU_ARM9, 1);
MMU_doDMA<ARMCPU_ARM9>(1);
#ifdef LOG_DMA2
//else
{
@ -2205,7 +2204,7 @@ static void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
MMU.DMAStartTime[ARMCPU_ARM9][2] = (v>>27) & 0x7;
MMU.DMACrt[ARMCPU_ARM9][2] = v;
if(MMU.DMAStartTime[ARMCPU_ARM9][2] == 0)
MMU_doDMA(ARMCPU_ARM9, 2);
MMU_doDMA<ARMCPU_ARM9>(2);
#ifdef LOG_DMA2
//else
{
@ -2227,7 +2226,7 @@ static void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
MMU.DMACrt[ARMCPU_ARM9][3] = v;
if(MMU.DMAStartTime[ARMCPU_ARM9][3] == 0)
MMU_doDMA(ARMCPU_ARM9, 3);
MMU_doDMA<ARMCPU_ARM9>(3);
#ifdef LOG_DMA2
//else
{
@ -2314,13 +2313,15 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
case 0x400037:
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val;
return;
case 0x400038:
case 0x400039:
case 0x40003A:
case 0x40003B: //toon table
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val;
gfx3d_UpdateToonTable(&((MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(0x380)]);
gfx3d_UpdateToonTable((adr & 0x3F) >> 1, val);
return;
case 0x400040:
case 0x400041:
case 0x400042:
@ -2604,7 +2605,7 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xB8, val);
if( MMU.DMAStartTime[ARMCPU_ARM9][0] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM9][0] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM9, 0);
MMU_doDMA<ARMCPU_ARM9>(0);
#ifdef LOG_DMA2
else
{
@ -2622,7 +2623,7 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xC4, val);
if(MMU.DMAStartTime[ARMCPU_ARM9][1] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM9][1] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM9, 1);
MMU_doDMA<ARMCPU_ARM9>(1);
#ifdef LOG_DMA2
else
{
@ -2639,7 +2640,7 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xD0, val);
if(MMU.DMAStartTime[ARMCPU_ARM9][2] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM9][2] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM9, 2);
MMU_doDMA<ARMCPU_ARM9>(2);
#ifdef LOG_DMA2
else
{
@ -2656,7 +2657,7 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0xDC, val);
if( MMU.DMAStartTime[ARMCPU_ARM9][3] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM9][3] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM9, 3);
MMU_doDMA<ARMCPU_ARM9>(3);
#ifdef LOG_DMA2
else
{
@ -2697,22 +2698,22 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
/* launch DMA if start flag was set to "DS Cart" */
if(MMU.DMAStartTime[ARMCPU_ARM9][0] == 5)
{
MMU_doDMA(ARMCPU_ARM9, 0);
MMU_doDMA<ARMCPU_ARM9>(0);
return;
}
if(MMU.DMAStartTime[ARMCPU_ARM9][1] == 5)
{
MMU_doDMA(ARMCPU_ARM9, 1);
MMU_doDMA<ARMCPU_ARM9>(1);
return;
}
if(MMU.DMAStartTime[ARMCPU_ARM9][2] == 5)
{
MMU_doDMA(ARMCPU_ARM9, 2);
MMU_doDMA<ARMCPU_ARM9>(2);
return;
}
if(MMU.DMAStartTime[ARMCPU_ARM9][3] == 5)
{
MMU_doDMA(ARMCPU_ARM9, 3);
MMU_doDMA<ARMCPU_ARM9>(3);
return;
}
}
@ -3379,7 +3380,7 @@ static void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
MMU.DMAStartTime[ARMCPU_ARM7][0] = (v>>28) & 0x3;
MMU.DMACrt[ARMCPU_ARM7][0] = v;
if(MMU.DMAStartTime[ARMCPU_ARM7][0] == 0)
MMU_doDMA(ARMCPU_ARM7, 0);
MMU_doDMA<ARMCPU_ARM7>(0);
#ifdef LOG_DMA2
//else
{
@ -3400,7 +3401,7 @@ static void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
MMU.DMAStartTime[ARMCPU_ARM7][1] = (v>>28) & 0x3;
MMU.DMACrt[ARMCPU_ARM7][1] = v;
if(MMU.DMAStartTime[ARMCPU_ARM7][1] == 0)
MMU_doDMA(ARMCPU_ARM7, 1);
MMU_doDMA<ARMCPU_ARM7>(1);
#ifdef LOG_DMA2
//else
{
@ -3421,7 +3422,7 @@ static void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
MMU.DMAStartTime[ARMCPU_ARM7][2] = (v>>28) & 0x3;
MMU.DMACrt[ARMCPU_ARM7][2] = v;
if(MMU.DMAStartTime[ARMCPU_ARM7][2] == 0)
MMU_doDMA(ARMCPU_ARM7, 2);
MMU_doDMA<ARMCPU_ARM7>(2);
#ifdef LOG_DMA2
//else
{
@ -3443,7 +3444,7 @@ static void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
MMU.DMACrt[ARMCPU_ARM7][3] = v;
if(MMU.DMAStartTime[ARMCPU_ARM7][3] == 0)
MMU_doDMA(ARMCPU_ARM7, 3);
MMU_doDMA<ARMCPU_ARM7>(3);
#ifdef LOG_DMA2
//else
{
@ -3597,7 +3598,7 @@ static void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0xB8, val);
if( MMU.DMAStartTime[ARMCPU_ARM7][0] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM7][0] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM7, 0);
MMU_doDMA<ARMCPU_ARM7>(0);
#ifdef LOG_DMA2
else
{
@ -3615,7 +3616,7 @@ static void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0xC4, val);
if(MMU.DMAStartTime[ARMCPU_ARM7][1] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM7][1] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM7, 1);
MMU_doDMA<ARMCPU_ARM7>(1);
#ifdef LOG_DMA2
else
{
@ -3632,7 +3633,7 @@ static void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0xD0, val);
if(MMU.DMAStartTime[ARMCPU_ARM7][2] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM7][2] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM7, 2);
MMU_doDMA<ARMCPU_ARM7>(2);
#ifdef LOG_DMA2
else
{
@ -3649,7 +3650,7 @@ static void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0xDC, val);
if( MMU.DMAStartTime[ARMCPU_ARM7][3] == 0 ||
MMU.DMAStartTime[ARMCPU_ARM7][3] == 7) // Start Immediately
MMU_doDMA(ARMCPU_ARM7, 3);
MMU_doDMA<ARMCPU_ARM7>(3);
#ifdef LOG_DMA2
else
{
@ -3692,13 +3693,13 @@ static void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
if(MMU.DMAStartTime[ARMCPU_ARM7][2] == 2)
{
MMU_doDMA(ARMCPU_ARM7, 2);
MMU_doDMA<ARMCPU_ARM7>(2);
return;
}
else
if(MMU.DMAStartTime[ARMCPU_ARM7][3] == 2)
{
MMU_doDMA(ARMCPU_ARM7, 3);
MMU_doDMA<ARMCPU_ARM7>(3);
return;
}
return;

View File

@ -3,7 +3,7 @@
yopyop156.ifrance.com
Copyright (C) 2007 shash
Copyright (C) 2007-2008 DeSmuME team
Copyright (C) 2007-2009 DeSmuME team
This file is part of DeSmuME
@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MMU_H
@ -160,7 +160,7 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val);
void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val);
void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val);
void FASTCALL MMU_doDMA(u32 proc, u32 num);
template<int PROCNUM> void FASTCALL MMU_doDMA(u32 num);
/*
* The base ARM memory interfaces

View File

@ -2,6 +2,8 @@
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright (C) 2008-2009 DeSmuME team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
@ -16,7 +18,7 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <string.h>
@ -1117,13 +1119,13 @@ u32 NDS_exec(s32 nb)
GPU_ligne(&SubScreen, nds.VCount);
if(MMU.DMAStartTime[0][0] == 2)
MMU_doDMA(0, 0);
MMU_doDMA<ARMCPU_ARM9>(0);
if(MMU.DMAStartTime[0][1] == 2)
MMU_doDMA(0, 1);
MMU_doDMA<ARMCPU_ARM9>(1);
if(MMU.DMAStartTime[0][2] == 2)
MMU_doDMA(0, 2);
MMU_doDMA<ARMCPU_ARM9>(2);
if(MMU.DMAStartTime[0][3] == 2)
MMU_doDMA(0, 3);
MMU_doDMA<ARMCPU_ARM9>(3);
}
nds.lignerendu = TRUE;
}
@ -1137,54 +1139,54 @@ u32 NDS_exec(s32 nb)
T1WriteWord(MMU.ARM7_REG, 4, T1ReadWord(MMU.ARM7_REG, 4) & 0xFFFD);
if(MMU.DMAStartTime[0][0] == 3)
MMU_doDMA(0, 0);
MMU_doDMA<ARMCPU_ARM9>(0);
if(MMU.DMAStartTime[0][1] == 3)
MMU_doDMA(0, 1);
MMU_doDMA<ARMCPU_ARM9>(1);
if(MMU.DMAStartTime[0][2] == 3)
MMU_doDMA(0, 2);
MMU_doDMA<ARMCPU_ARM9>(2);
if(MMU.DMAStartTime[0][3] == 3)
MMU_doDMA(0, 3);
MMU_doDMA<ARMCPU_ARM9>(3);
// Main memory display
if(MMU.DMAStartTime[0][0] == 4)
{
MMU_doDMA(0, 0);
MMU_doDMA<ARMCPU_ARM9>(0);
MMU.DMAStartTime[0][0] = 0;
}
if(MMU.DMAStartTime[0][1] == 4)
{
MMU_doDMA(0, 1);
MMU_doDMA<ARMCPU_ARM9>(1);
MMU.DMAStartTime[0][1] = 0;
}
if(MMU.DMAStartTime[0][2] == 4)
{
MMU_doDMA(0, 2);
MMU_doDMA<ARMCPU_ARM9>(2);
MMU.DMAStartTime[0][2] = 0;
}
if(MMU.DMAStartTime[0][3] == 4)
{
MMU_doDMA(0, 3);
MMU_doDMA<ARMCPU_ARM9>(3);
MMU.DMAStartTime[0][3] = 0;
}
if(MMU.DMAStartTime[1][0] == 4)
{
MMU_doDMA(1, 0);
MMU_doDMA<ARMCPU_ARM7>(0);
MMU.DMAStartTime[1][0] = 0;
}
if(MMU.DMAStartTime[1][1] == 4)
{
MMU_doDMA(1, 1);
MMU_doDMA<ARMCPU_ARM7>(1);
MMU.DMAStartTime[0][1] = 0;
}
if(MMU.DMAStartTime[1][2] == 4)
{
MMU_doDMA(1, 2);
MMU_doDMA<ARMCPU_ARM7>(2);
MMU.DMAStartTime[1][2] = 0;
}
if(MMU.DMAStartTime[1][3] == 4)
{
MMU_doDMA(1, 3);
MMU_doDMA<ARMCPU_ARM7>(3);
MMU.DMAStartTime[1][3] = 0;
}
@ -1207,22 +1209,22 @@ u32 NDS_exec(s32 nb)
if(MMU.DMAStartTime[0][0] == 1)
MMU_doDMA(0, 0);
MMU_doDMA<ARMCPU_ARM9>(0);
if(MMU.DMAStartTime[0][1] == 1)
MMU_doDMA(0, 1);
MMU_doDMA<ARMCPU_ARM9>(1);
if(MMU.DMAStartTime[0][2] == 1)
MMU_doDMA(0, 2);
MMU_doDMA<ARMCPU_ARM9>(2);
if(MMU.DMAStartTime[0][3] == 1)
MMU_doDMA(0, 3);
MMU_doDMA<ARMCPU_ARM9>(3);
if(MMU.DMAStartTime[1][0] == 1)
MMU_doDMA(1, 0);
MMU_doDMA<ARMCPU_ARM7>(0);
if(MMU.DMAStartTime[1][1] == 1)
MMU_doDMA(1, 1);
MMU_doDMA<ARMCPU_ARM7>(1);
if(MMU.DMAStartTime[1][2] == 1)
MMU_doDMA(1, 2);
MMU_doDMA<ARMCPU_ARM7>(2);
if(MMU.DMAStartTime[1][3] == 1)
MMU_doDMA(1, 3);
MMU_doDMA<ARMCPU_ARM7>(3);
}
else if(nds.VCount==215) {
gfx3d_VBlankEndSignal();

View File

@ -1,5 +1,8 @@
/*
Copyright (C) 2008 DeSmuME team
/* Copyright (C) 2006 yopyop
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright (C) 2008-2009 DeSmuME team
This file is part of DeSmuME
@ -15,7 +18,7 @@
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
//This file implements the geometry engine hardware component.
@ -809,12 +812,15 @@ BOOL gfx3d_glShininess (unsigned long val)
return TRUE;
}
void gfx3d_UpdateToonTable(void* toonTable)
void gfx3d_UpdateToonTable(u8 offset, u16 val)
{
u16* u16toonTable = (u16*)toonTable;
int i;
for(i=0;i<32;i++)
gfx3d.rgbToonTable[i] = RGB15TO32(u16toonTable[i],255);
gfx3d.rgbToonTable[offset] = RGB15TO32(val, 255);
}
void gfx3d_UpdateToonTable(u8 offset, u32 val)
{
gfx3d.rgbToonTable[offset] = RGB15TO32(val & 0xFFFF, 255);
gfx3d.rgbToonTable[offset+1] = RGB15TO32(val >> 8, 255);
}
static void gfx3d_glTexImage_cache()

View File

@ -1,5 +1,8 @@
/*
Copyright (C) 2008 DeSmuME team
/* Copyright (C) 2006 yopyop
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright (C) 2008-2009 DeSmuME team
This file is part of DeSmuME
@ -15,7 +18,7 @@
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _GFX3D_H_
@ -187,7 +190,8 @@ void gfx3d_glPolygonAttrib (unsigned long val);
void gfx3d_glMaterial0(unsigned long val);
void gfx3d_glMaterial1(unsigned long val);
BOOL gfx3d_glShininess (unsigned long val);
void gfx3d_UpdateToonTable(void* toonTable);
void gfx3d_UpdateToonTable(u8 offset, u16 val);
void gfx3d_UpdateToonTable(u8 offset, u32 val);
void gfx3d_glTexImage(unsigned long val);
void gfx3d_glTexPalette(unsigned long val);
void gfx3d_glTexCoord(unsigned long val);