core:
- fixed in 3D render and added simulation Geometry FIFO;
This commit is contained in:
parent
014f42d293
commit
cdcd88725c
|
@ -25,9 +25,10 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
// ========================================================= IPC FIFO
|
||||||
void IPC_FIFOclear(IPC_FIFO * fifo)
|
void IPC_FIFOclear(IPC_FIFO * fifo)
|
||||||
{
|
{
|
||||||
memset(fifo, 0, sizeof(fifo));
|
memset(fifo, 0, sizeof(IPC_FIFO));
|
||||||
|
|
||||||
fifo->empty = TRUE;
|
fifo->empty = TRUE;
|
||||||
//LOG("FIFO is cleared\n");
|
//LOG("FIFO is cleared\n");
|
||||||
|
@ -50,7 +51,6 @@ void IPC_FIFOadd(IPC_FIFO * fifo, u32 val)
|
||||||
fifo->empty = FALSE;
|
fifo->empty = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void NDS_Pause();
|
|
||||||
u32 IPC_FIFOget(IPC_FIFO * fifo)
|
u32 IPC_FIFOget(IPC_FIFO * fifo)
|
||||||
{
|
{
|
||||||
if (fifo->empty)
|
if (fifo->empty)
|
||||||
|
@ -70,3 +70,30 @@ u32 IPC_FIFOget(IPC_FIFO * fifo)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========================================================= GFX FIFO
|
||||||
|
void GFX_FIFOclear(GFX_FIFO * fifo)
|
||||||
|
{
|
||||||
|
memset(fifo, 0, sizeof(GFX_FIFO));
|
||||||
|
|
||||||
|
fifo->empty = TRUE;
|
||||||
|
fifo->half = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GFX_FIFOadd(GFX_FIFO * fifo)
|
||||||
|
{
|
||||||
|
if (fifo->full)
|
||||||
|
{
|
||||||
|
//INFO("GFX FIFO send is full\n");
|
||||||
|
fifo->error = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fifo->size++;
|
||||||
|
if (fifo->size > 128)
|
||||||
|
fifo->half = FALSE;
|
||||||
|
|
||||||
|
if (fifo->size == 256)
|
||||||
|
fifo->full = TRUE;
|
||||||
|
fifo->empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,9 +26,10 @@
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
//=================================================== IPC FIFO
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 buf[16]; // 16 words
|
u32 buf[16]; // 64K
|
||||||
u8 size; // tail
|
u8 size; // tail
|
||||||
|
|
||||||
BOOL empty;
|
BOOL empty;
|
||||||
|
@ -36,16 +37,33 @@ typedef struct
|
||||||
BOOL error;
|
BOOL error;
|
||||||
} IPC_FIFO;
|
} IPC_FIFO;
|
||||||
|
|
||||||
|
extern void IPC_FIFOclear(IPC_FIFO * fifo);
|
||||||
|
extern void IPC_FIFOadd(IPC_FIFO * fifo, u32 val);
|
||||||
|
extern u32 IPC_FIFOget(IPC_FIFO * fifo);
|
||||||
|
|
||||||
|
//=================================================== GFX FIFO
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 buf[16]; // 16 words
|
u32 size; // tail
|
||||||
u8 size; // tail
|
|
||||||
|
|
||||||
BOOL empty;
|
BOOL empty;
|
||||||
|
BOOL half;
|
||||||
BOOL full;
|
BOOL full;
|
||||||
BOOL error;
|
BOOL error;
|
||||||
} GFX_FIFO;
|
u8 irq;
|
||||||
|
|
||||||
|
u32 pipe[4]; // additional 4 entries
|
||||||
|
u8 pipe_size; // pipe tail
|
||||||
|
|
||||||
|
BOOL pipe_empty;
|
||||||
|
BOOL pipe_half;
|
||||||
|
BOOL pipe_full;
|
||||||
|
} GFX_FIFO;
|
||||||
|
extern void GFX_FIFOclear(GFX_FIFO * fifo);
|
||||||
|
extern void GFX_FIFOadd(GFX_FIFO * fifo);
|
||||||
|
|
||||||
|
//=================================================== Display memory FIFO
|
||||||
|
#if 0
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 buf[16]; // 16 words
|
u32 buf[16]; // 16 words
|
||||||
|
@ -56,12 +74,9 @@ typedef struct
|
||||||
BOOL error;
|
BOOL error;
|
||||||
} DISP_FIFO;
|
} DISP_FIFO;
|
||||||
|
|
||||||
extern void IPC_FIFOclear(IPC_FIFO * fifo);
|
extern void DISP_FIFOclear(DISP_FIFO * fifo);
|
||||||
extern void IPC_FIFOadd(IPC_FIFO * fifo, u32 val);
|
extern void DISP_FIFOadd(DISP_FIFO * fifo, u32 val);
|
||||||
extern u32 IPC_FIFOget(IPC_FIFO * fifo);
|
extern u32 DISP_FIFOget(DISP_FIFO * fifo);
|
||||||
|
#endif
|
||||||
//extern void GFX_FIFOclear(GFX_FIFO * fifo);
|
|
||||||
//extern void GFX_FIFOadd(GFX_FIFO * fifo, u32 val);
|
|
||||||
//extern u32 GFX_FIFOget(GFX_FIFO * fifo);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -266,8 +266,6 @@ TWaitState MMU_struct::MMU_WAIT32[2][16] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
u32 gxIRQ = 0;
|
|
||||||
|
|
||||||
// VRAM mapping
|
// VRAM mapping
|
||||||
u8 *LCDdst[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
|
u8 *LCDdst[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
|
||||||
u8 *EngineAddr[4] = { NULL, NULL, NULL, NULL };
|
u8 *EngineAddr[4] = { NULL, NULL, NULL, NULL };
|
||||||
|
@ -304,6 +302,7 @@ void MMU_Init(void) {
|
||||||
|
|
||||||
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM9]);
|
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM9]);
|
||||||
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM7]);
|
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM7]);
|
||||||
|
GFX_FIFOclear(&MMU.gfx_fifo);
|
||||||
|
|
||||||
mc_init(&MMU.fw, MC_TYPE_FLASH); /* init fw device */
|
mc_init(&MMU.fw, MC_TYPE_FLASH); /* init fw device */
|
||||||
mc_alloc(&MMU.fw, NDS_FW_SIZE_V1);
|
mc_alloc(&MMU.fw, NDS_FW_SIZE_V1);
|
||||||
|
@ -360,6 +359,7 @@ void MMU_clearMem()
|
||||||
|
|
||||||
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM9]);
|
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM9]);
|
||||||
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM7]);
|
IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM7]);
|
||||||
|
GFX_FIFOclear(&MMU.gfx_fifo);
|
||||||
|
|
||||||
MMU.DTCMRegion = 0x027C0000;
|
MMU.DTCMRegion = 0x027C0000;
|
||||||
MMU.ITCMRegion = 0x00000000;
|
MMU.ITCMRegion = 0x00000000;
|
||||||
|
@ -2084,13 +2084,6 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
|
||||||
|
|
||||||
if((adr>>24)==4)
|
if((adr>>24)==4)
|
||||||
{
|
{
|
||||||
if (adr >= 0x04000400 && adr < 0x04000440)
|
|
||||||
{
|
|
||||||
// Geometry commands (aka Dislay Lists) - Parameters:X
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x400>>2] = val;
|
|
||||||
gfx3d_glCallList(0xFFFFFFFF, val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(adr >= 0x04000380 && adr <= 0x040003BC)
|
if(adr >= 0x04000380 && adr <= 0x040003BC)
|
||||||
{
|
{
|
||||||
//toon table
|
//toon table
|
||||||
|
@ -2099,6 +2092,21 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (adr >= 0x04000400 && adr < 0x04000440)
|
||||||
|
{
|
||||||
|
// Geometry commands (aka Dislay Lists) - Parameters:X
|
||||||
|
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr-0x04000000)>>2] = val;
|
||||||
|
gfx3d_Add_Command(val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adr >= 0x04000440 && adr < 0x04000600)
|
||||||
|
{
|
||||||
|
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr-0x04000000)>>2] = val;
|
||||||
|
gfx3d_Add_Command_Direct((adr - 0x04000400) >> 2, val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch(adr)
|
switch(adr)
|
||||||
{
|
{
|
||||||
// Alpha test reference value - Parameters:1
|
// Alpha test reference value - Parameters:1
|
||||||
|
@ -2135,250 +2143,10 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
|
||||||
gfx3d_glFogOffset(val);
|
gfx3d_glFogOffset(val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Matrix mode - Parameters:1
|
|
||||||
case 0x04000440:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x440>>2] = val;
|
|
||||||
gfx3d_glMatrixMode(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Push matrix - Parameters:0
|
|
||||||
case 0x04000444:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x444>>2] = val;
|
|
||||||
gfx3d_glPushMatrix();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Pop matrix/es - Parameters:1
|
|
||||||
case 0x04000448:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x448>>2] = val;
|
|
||||||
gfx3d_glPopMatrix(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Store matrix in the stack - Parameters:1
|
|
||||||
case 0x0400044C:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x44C>>2] = val;
|
|
||||||
gfx3d_glStoreMatrix(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Restore matrix from the stack - Parameters:1
|
|
||||||
case 0x04000450:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x450>>2] = val;
|
|
||||||
gfx3d_glRestoreMatrix(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Load Identity matrix - Parameters:0
|
|
||||||
case 0x04000454:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x454>>2] = val;
|
|
||||||
gfx3d_glLoadIdentity();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Load 4x4 matrix - Parameters:16
|
|
||||||
case 0x04000458:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x458>>2] = val;
|
|
||||||
gfx3d_glLoadMatrix4x4(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Load 4x3 matrix - Parameters:12
|
|
||||||
case 0x0400045C:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x45C>>2] = val;
|
|
||||||
gfx3d_glLoadMatrix4x3(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Multiply 4x4 matrix - Parameters:16
|
|
||||||
case 0x04000460:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x460>>2] = val;
|
|
||||||
gfx3d_glMultMatrix4x4(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Multiply 4x3 matrix - Parameters:12
|
|
||||||
case 0x04000464:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x464>>2] = val;
|
|
||||||
gfx3d_glMultMatrix4x3(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Multiply 3x3 matrix - Parameters:9
|
|
||||||
case 0x04000468 :
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x468>>2] = val;
|
|
||||||
gfx3d_glMultMatrix3x3(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Multiply current matrix by scaling matrix - Parameters:3
|
|
||||||
case 0x0400046C:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x46C>>2] = val;
|
|
||||||
gfx3d_glScale(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Multiply current matrix by translation matrix - Parameters:3
|
|
||||||
case 0x04000470:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x470>>2] = val;
|
|
||||||
gfx3d_glTranslate(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex color - Parameters:1
|
|
||||||
case 0x04000480:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x480>>2] = val;
|
|
||||||
gfx3d_glColor3b(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex normal - Parameters:1
|
|
||||||
case 0x04000484:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x484>>2] = val;
|
|
||||||
gfx3d_glNormal(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex texture coordinate - Parameters:1
|
|
||||||
case 0x04000488:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x488>>2] = val;
|
|
||||||
gfx3d_glTexCoord(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex position 16b/coordinate - Parameters:2
|
|
||||||
case 0x0400048C:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x48C>>2] = val;
|
|
||||||
gfx3d_glVertex16b(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex position 10b/coordinate - Parameters:1
|
|
||||||
case 0x04000490:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x490>>2] = val;
|
|
||||||
gfx3d_glVertex10b(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex XY position - Parameters:1
|
|
||||||
case 0x04000494:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x494>>2] = val;
|
|
||||||
gfx3d_glVertex3_cord(0,1,val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex XZ position - Parameters:1
|
|
||||||
case 0x04000498:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x498>>2] = val;
|
|
||||||
gfx3d_glVertex3_cord(0,2,val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex YZ position - Parameters:1
|
|
||||||
case 0x0400049C:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x49C>>2] = val;
|
|
||||||
gfx3d_glVertex3_cord(1,2,val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set vertex difference position (offset from the last vertex) - Parameters:1
|
|
||||||
case 0x040004A0:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4A0>>2] = val;
|
|
||||||
gfx3d_glVertex_rel (val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set polygon attributes - Parameters:1
|
|
||||||
case 0x040004A4:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4A4>>2] = val;
|
|
||||||
gfx3d_glPolygonAttrib(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set texture parameteres - Parameters:1
|
|
||||||
case 0x040004A8:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4A8>>2] = val;
|
|
||||||
gfx3d_glTexImage(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set palette base address - Parameters:1
|
|
||||||
case 0x040004AC:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4AC>>2] = val&0x1FFF;
|
|
||||||
gfx3d_glTexPalette(val&0x1FFFF);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set material diffuse/ambient parameters - Parameters:1
|
|
||||||
case 0x040004C0:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4C0>>2] = val;
|
|
||||||
gfx3d_glMaterial0 (val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set material reflection/emission parameters - Parameters:1
|
|
||||||
case 0x040004C4:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4C4>>2] = val;
|
|
||||||
gfx3d_glMaterial1 (val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Light direction vector - Parameters:1
|
|
||||||
case 0x040004C8:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4C8>>2] = val;
|
|
||||||
gfx3d_glLightDirection(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Light color - Parameters:1
|
|
||||||
case 0x040004CC:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4CC>>2] = val;
|
|
||||||
gfx3d_glLightColor(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Material Shininess - Parameters:32
|
|
||||||
case 0x040004D0:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4D0>>2] = val;
|
|
||||||
gfx3d_glShininess(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Begin vertex list - Parameters:1
|
|
||||||
case 0x04000500:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x500>>2] = val;
|
|
||||||
gfx3d_glBegin(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// End vertex list - Parameters:0
|
|
||||||
case 0x04000504:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x504>>2] = val;
|
|
||||||
gfx3d_glEnd();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Swap rendering engine buffers - Parameters:1
|
|
||||||
case 0x04000540:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x540>>2] = val;
|
|
||||||
gfx3d_glFlush(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Set viewport coordinates - Parameters:1
|
|
||||||
case 0x04000580:
|
|
||||||
{
|
|
||||||
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x580>>2] = val;
|
|
||||||
gfx3d_glViewPort(val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================================================================== end 3D
|
|
||||||
|
|
||||||
case 0x04000600: // Geometry Engine Status Register (R and R/W)
|
case 0x04000600: // Geometry Engine Status Register (R and R/W)
|
||||||
{
|
{
|
||||||
gxIRQ = ((val >> 30) & 0x3);
|
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x600>>2] = val;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case REG_DISPA_WININ:
|
case REG_DISPA_WININ:
|
||||||
|
@ -2898,24 +2666,13 @@ static u32 FASTCALL _MMU_ARM9_read32(u32 adr)
|
||||||
|
|
||||||
adr &= 0x0FFFFFFF;
|
adr &= 0x0FFFFFFF;
|
||||||
|
|
||||||
|
// Address is an IO register
|
||||||
if((adr >> 24) == 4)
|
if((adr >> 24) == 4)
|
||||||
{
|
{
|
||||||
/* Address is an IO register */
|
|
||||||
switch(adr)
|
switch(adr)
|
||||||
{
|
{
|
||||||
// This is hacked due to the only current 3D core
|
|
||||||
case 0x04000600: // Geometry Engine Status Register (R and R/W)
|
case 0x04000600: // Geometry Engine Status Register (R and R/W)
|
||||||
{
|
return gfx3d_GetGXstatus();
|
||||||
/* u32 gxstat = ( 2 |
|
|
||||||
(MMU.fifos[ARMCPU_ARM9].full<<24)|
|
|
||||||
(MMU.fifos[ARMCPU_ARM9].half<<25)|
|
|
||||||
(MMU.fifos[ARMCPU_ARM9].empty<<26)|
|
|
||||||
(MMU.fifos[ARMCPU_ARM9].irq<<30)
|
|
||||||
);*/
|
|
||||||
u32 gxstat = (2 | (3 << 25) | (gxIRQ << 30));
|
|
||||||
|
|
||||||
return gxstat;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 0x04000640:
|
case 0x04000640:
|
||||||
case 0x04000644:
|
case 0x04000644:
|
||||||
|
|
|
@ -77,8 +77,11 @@ struct MMU_struct {
|
||||||
|
|
||||||
u8 ARM9_RW_MODE;
|
u8 ARM9_RW_MODE;
|
||||||
|
|
||||||
|
// IPC FIFO
|
||||||
IPC_FIFO ipc_fifo[2]; // 0 - ARM9 FIFO
|
IPC_FIFO ipc_fifo[2]; // 0 - ARM9 FIFO
|
||||||
// 1 - ARM7 FIFO*/
|
// 1 - ARM7 FIFO
|
||||||
|
// GFX FIFO
|
||||||
|
GFX_FIFO gfx_fifo;
|
||||||
|
|
||||||
static TWaitState MMU_WAIT16[2][16];
|
static TWaitState MMU_WAIT16[2][16];
|
||||||
static TWaitState MMU_WAIT32[2][16];
|
static TWaitState MMU_WAIT32[2][16];
|
||||||
|
|
|
@ -42,8 +42,6 @@
|
||||||
|
|
||||||
NDSSystem nds;
|
NDSSystem nds;
|
||||||
|
|
||||||
extern u32 gxIRQ;
|
|
||||||
|
|
||||||
static u32
|
static u32
|
||||||
calc_CRC16( u32 start, const u8 *data, int count) {
|
calc_CRC16( u32 start, const u8 *data, int count) {
|
||||||
int i,j;
|
int i,j;
|
||||||
|
@ -906,6 +904,8 @@ u32 NDS_exec(s32 nb)
|
||||||
LOG(logbuf);
|
LOG(logbuf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
NDS_makeARM9Int(21); // GX geometry
|
||||||
|
|
||||||
for (i = 0; i < INSTRUCTIONS_PER_BATCH && (!FORCE) && (execute); i++)
|
for (i = 0; i < INSTRUCTIONS_PER_BATCH && (!FORCE) && (execute); i++)
|
||||||
{
|
{
|
||||||
if(NDS_ARM9.waitIRQ) {
|
if(NDS_ARM9.waitIRQ) {
|
||||||
|
@ -1550,26 +1550,6 @@ u32 NDS_exec(s32 nb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*for (int tt=0; tt<24; tt++)
|
|
||||||
{
|
|
||||||
if (tt == 0) continue; //VBlank
|
|
||||||
if (tt == 1) continue; //HBlank
|
|
||||||
if (tt == 3) continue;
|
|
||||||
if (tt == 12) continue;
|
|
||||||
if (tt == 18) continue;
|
|
||||||
if (MMU.reg_IE[0]&(1<<tt)) INFO("wait IRQ%i\n", tt);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//if(MMU.reg_IE[0]&(1<<0)) gfx3d_VBlankSignal();
|
|
||||||
|
|
||||||
if(MMU.reg_IE[0]&(1<<21)) // IRQ21
|
|
||||||
{
|
|
||||||
// if (MMU.fifos[0].irq==1) NDS_makeARM9Int(21);
|
|
||||||
// if (MMU.fifos[0].irq==2) NDS_makeARM9Int(21);
|
|
||||||
if (gxIRQ == 1) NDS_makeARM9Int(21);
|
|
||||||
if (gxIRQ == 2) NDS_makeARM9Int(21);
|
|
||||||
}
|
|
||||||
|
|
||||||
if((MMU.reg_IF[0]&MMU.reg_IE[0]) && (MMU.reg_IME[0]))
|
if((MMU.reg_IF[0]&MMU.reg_IE[0]) && (MMU.reg_IME[0]))
|
||||||
{
|
{
|
||||||
#ifdef GDB_STUB
|
#ifdef GDB_STUB
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "armcpu.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "gfx3d.h"
|
#include "gfx3d.h"
|
||||||
#include "matrix.h"
|
#include "matrix.h"
|
||||||
|
@ -100,6 +101,9 @@ static int _t=0, _s=0;
|
||||||
static float last_t, last_s;
|
static float last_t, last_s;
|
||||||
static u32 clCmd = 0;
|
static u32 clCmd = 0;
|
||||||
static u32 clInd = 0;
|
static u32 clInd = 0;
|
||||||
|
static u32 BTind = 0;
|
||||||
|
static u32 PTind = 0;
|
||||||
|
static BOOL GFX_busy = FALSE;
|
||||||
|
|
||||||
//raw ds format poly attributes
|
//raw ds format poly attributes
|
||||||
static u32 polyAttr=0,textureFormat=0, texturePalette=0;
|
static u32 polyAttr=0,textureFormat=0, texturePalette=0;
|
||||||
|
@ -206,6 +210,23 @@ void gfx3d_reset()
|
||||||
MatrixInit (mtxCurrent[2]);
|
MatrixInit (mtxCurrent[2]);
|
||||||
MatrixInit (mtxCurrent[3]);
|
MatrixInit (mtxCurrent[3]);
|
||||||
MatrixInit (mtxTemporal);
|
MatrixInit (mtxTemporal);
|
||||||
|
|
||||||
|
clCmd = 0;
|
||||||
|
clInd = 0;
|
||||||
|
|
||||||
|
ML4x4ind = 0;
|
||||||
|
ML4x3ind = 0;
|
||||||
|
MM4x4ind = 0;
|
||||||
|
MM4x3ind = 0;
|
||||||
|
MM3x3ind = 0;
|
||||||
|
|
||||||
|
BTind = 0;
|
||||||
|
PTind = 0;
|
||||||
|
|
||||||
|
_t=0;
|
||||||
|
_s=0;
|
||||||
|
last_t = 0;
|
||||||
|
last_s = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfx3d_glViewPort(unsigned long v)
|
void gfx3d_glViewPort(unsigned long v)
|
||||||
|
@ -267,11 +288,11 @@ BOOL gfx3d_glLoadMatrix4x4(signed long v)
|
||||||
|
|
||||||
++ML4x4ind;
|
++ML4x4ind;
|
||||||
if(ML4x4ind<16) return FALSE;
|
if(ML4x4ind<16) return FALSE;
|
||||||
|
ML4x4ind = 0;
|
||||||
|
|
||||||
if (mode == 2)
|
if (mode == 2)
|
||||||
MatrixCopy (mtxCurrent[1], mtxCurrent[2]);
|
MatrixCopy (mtxCurrent[1], mtxCurrent[2]);
|
||||||
|
|
||||||
ML4x4ind = 0;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,9 +369,7 @@ BOOL gfx3d_glTranslate(signed long v)
|
||||||
|
|
||||||
++transind;
|
++transind;
|
||||||
|
|
||||||
if(transind<3)
|
if(transind<3) return FALSE;
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
transind = 0;
|
transind = 0;
|
||||||
|
|
||||||
MatrixTranslate (mtxCurrent[mode], trans);
|
MatrixTranslate (mtxCurrent[mode], trans);
|
||||||
|
@ -368,9 +387,7 @@ BOOL gfx3d_glScale(signed long v)
|
||||||
|
|
||||||
++scaleind;
|
++scaleind;
|
||||||
|
|
||||||
if(scaleind<3)
|
if(scaleind<3) return FALSE;
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
scaleind = 0;
|
scaleind = 0;
|
||||||
|
|
||||||
MatrixScale (mtxCurrent[mymode], scale);
|
MatrixScale (mtxCurrent[mymode], scale);
|
||||||
|
@ -435,7 +452,6 @@ BOOL gfx3d_glMultMatrix4x4(signed long v)
|
||||||
|
|
||||||
MM4x4ind++;
|
MM4x4ind++;
|
||||||
if(MM4x4ind<16) return FALSE;
|
if(MM4x4ind<16) return FALSE;
|
||||||
|
|
||||||
MM4x4ind = 0;
|
MM4x4ind = 0;
|
||||||
|
|
||||||
MatrixMultiply (mtxCurrent[mode], mtxTemporal);
|
MatrixMultiply (mtxCurrent[mode], mtxTemporal);
|
||||||
|
@ -906,20 +922,18 @@ void gfx3d_glAlphaFunc(unsigned long v)
|
||||||
|
|
||||||
BOOL gfx3d_glBoxTest(unsigned long v)
|
BOOL gfx3d_glBoxTest(unsigned long v)
|
||||||
{
|
{
|
||||||
static u8 cycles = 0;
|
BTind++;
|
||||||
cycles++;
|
if (BTind < 3) return FALSE;
|
||||||
if (cycles < 3) return FALSE;
|
BTind = 0;
|
||||||
cycles = 0;
|
|
||||||
//INFO("BoxTest=%i\n",val);
|
//INFO("BoxTest=%i\n",val);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL gfx3d_glPosTest(unsigned long v)
|
BOOL gfx3d_glPosTest(unsigned long v)
|
||||||
{
|
{
|
||||||
static u8 cycles = 0;
|
PTind++;
|
||||||
cycles++;
|
if (BTind < 2) return FALSE;
|
||||||
if (cycles < 2) return FALSE;
|
PTind = 0;
|
||||||
cycles = 0;
|
|
||||||
//INFO("PosTest=%i\n",val);
|
//INFO("PosTest=%i\n",val);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -941,304 +955,20 @@ void gfx3d_glGetVecRes(unsigned int index)
|
||||||
//return 0;
|
//return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfx3d_glCallList(u32 addr, u32 cmd)
|
|
||||||
{
|
|
||||||
if (addr != 0xFFFFFFFF)
|
|
||||||
{
|
|
||||||
clInd = 4;
|
|
||||||
clCmd = addr;
|
|
||||||
} // else FIFO commands
|
|
||||||
|
|
||||||
if (!clInd)
|
|
||||||
{
|
|
||||||
clInd = 4;
|
|
||||||
clCmd = cmd;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//INFO("3D command 0x%02X (full cmd = 0x%08X, val = 0x%08X)\n", clCmd&0xFF, clCmd, cmd);
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
switch (clCmd & 0xFF)
|
|
||||||
{
|
|
||||||
// 3D commands without parameters
|
|
||||||
case 0x00: // NOP - No Operation (for padding packed GXFIFO commands)
|
|
||||||
{
|
|
||||||
if (clInd > 0)
|
|
||||||
{
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W)
|
|
||||||
{
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x444) = cmd;
|
|
||||||
gfx3d_glPushMatrix();
|
|
||||||
clInd--;
|
|
||||||
clCmd >>= 8;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W)
|
|
||||||
{
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x454) = cmd;
|
|
||||||
gfx3d_glLoadIdentity();
|
|
||||||
clInd--;
|
|
||||||
clCmd >>= 8;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
case 0x41: // END_VTXS - End of Vertex List (W)
|
|
||||||
{
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x504) = cmd;
|
|
||||||
gfx3d_glEnd();
|
|
||||||
clInd--;
|
|
||||||
clCmd >>= 8;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if (addr != 0xFFFFFFFF)
|
|
||||||
{
|
|
||||||
if (!clInd)
|
|
||||||
{
|
|
||||||
clInd = 4;
|
|
||||||
clCmd = addr;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} // else FIFO commands
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!clInd)
|
|
||||||
{
|
|
||||||
clInd = 4;
|
|
||||||
clCmd = cmd;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (clCmd & 0xFF)
|
|
||||||
{
|
|
||||||
case 0x10: // MTX_MODE - Set Matrix Mode (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x440) = cmd;
|
|
||||||
gfx3d_glMatrixMode(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x12: // MTX_POP - Pop Current Matrix from Stack (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x448) = cmd;
|
|
||||||
gfx3d_glPopMatrix(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x13: // MTX_STORE - Store Current Matrix on Stack (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x44C) = cmd;
|
|
||||||
gfx3d_glStoreMatrix(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x450) = cmd;
|
|
||||||
gfx3d_glRestoreMatrix(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x458) = cmd;
|
|
||||||
if (!gfx3d_glLoadMatrix4x4(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x45C) = cmd;
|
|
||||||
if (!gfx3d_glLoadMatrix4x3(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x460) = cmd;
|
|
||||||
if (!gfx3d_glMultMatrix4x4(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x464) = cmd;
|
|
||||||
if (!gfx3d_glMultMatrix4x3(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x468) = cmd;
|
|
||||||
if (!gfx3d_glMultMatrix3x3(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x46C) = cmd;
|
|
||||||
if (!gfx3d_glScale(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x470) = cmd;
|
|
||||||
if (!gfx3d_glTranslate(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x20: // COLOR - Directly Set Vertex Color (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x480) = cmd;
|
|
||||||
gfx3d_glColor3b(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x21: // NORMAL - Set Normal Vector (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x484) = cmd;
|
|
||||||
gfx3d_glNormal(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x22: // TEXCOORD - Set Texture Coordinates (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x488) = cmd;
|
|
||||||
gfx3d_glTexCoord(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x48C) = cmd;
|
|
||||||
if (!gfx3d_glVertex16b(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x490) = cmd;
|
|
||||||
gfx3d_glVertex10b(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x25: // VTX_XY - Set Vertex XY Coordinates (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x494) = cmd;
|
|
||||||
gfx3d_glVertex3_cord(0, 1, cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x498) = cmd;
|
|
||||||
gfx3d_glVertex3_cord(0, 2, cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x49C) = cmd;
|
|
||||||
gfx3d_glVertex3_cord(1, 2, cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A0) = cmd;
|
|
||||||
gfx3d_glVertex_rel(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A4) = cmd;
|
|
||||||
gfx3d_glPolygonAttrib(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A8) = cmd;
|
|
||||||
gfx3d_glTexImage(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4AC) = cmd;
|
|
||||||
gfx3d_glTexPalette(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C0) = cmd;
|
|
||||||
gfx3d_glMaterial0(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C4) = cmd;
|
|
||||||
gfx3d_glMaterial1(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C8) = cmd;
|
|
||||||
gfx3d_glLightDirection(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x33: // LIGHT_COLOR - Set Light Color (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4CC) = cmd;
|
|
||||||
gfx3d_glLightColor(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x34: // SHININESS - Specular Reflection Shininess Table (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x4D0) = cmd;
|
|
||||||
if (!gfx3d_glShininess(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x40: // BEGIN_VTXS - Start of Vertex List (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x500) = cmd;
|
|
||||||
gfx3d_glBegin(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x540) = cmd;
|
|
||||||
gfx3d_glFlush(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x60: // VIEWPORT - Set Viewport (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x580) = cmd;
|
|
||||||
gfx3d_glViewPort(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C0) = cmd;
|
|
||||||
if (!gfx3d_glBoxTest(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x71: // POS_TEST - Set Position Coordinates for Test (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C4) = cmd;
|
|
||||||
if (!gfx3d_glPosTest(cmd)) break;
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
case 0x72: // VEC_TEST - Set Directional Vector for Test (W)
|
|
||||||
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C8) = cmd;
|
|
||||||
gfx3d_glVecTest(cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
INFO("Unknown 3D command 0x%02X in cmd=0x%02X\n", clCmd&0xFF, cmd);
|
|
||||||
clCmd >>= 8;
|
|
||||||
clInd--;
|
|
||||||
//NDS_Pause();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void gfx3d_glFlush(unsigned long v)
|
void gfx3d_glFlush(unsigned long v)
|
||||||
{
|
{
|
||||||
|
//INFO("FIFO size=%i\n", MMU.gfx_fifo.size);
|
||||||
|
GFX_busy = TRUE;
|
||||||
flushPending = TRUE;
|
flushPending = TRUE;
|
||||||
gfx3d.wbuffer = (v&1)!=0;
|
gfx3d.wbuffer = (v&1)!=0;
|
||||||
gfx3d.sortmode = ((v>>1)&1)!=0;
|
gfx3d.sortmode = ((v>>1)&1)!=0;
|
||||||
|
|
||||||
|
// reset
|
||||||
|
clInd = 0;
|
||||||
|
clCmd = 0;
|
||||||
|
GFX_FIFOclear(&MMU.gfx_fifo);
|
||||||
|
|
||||||
//the renderer wil lget the lists we just built
|
//the renderer wil lget the lists we just built
|
||||||
gfx3d.polylist = polylist;
|
gfx3d.polylist = polylist;
|
||||||
gfx3d.vertlist = vertlist;
|
gfx3d.vertlist = vertlist;
|
||||||
|
@ -1261,6 +991,8 @@ void gfx3d_glFlush(unsigned long v)
|
||||||
|
|
||||||
//switch to the new lists
|
//switch to the new lists
|
||||||
twiddleLists();
|
twiddleLists();
|
||||||
|
|
||||||
|
GFX_busy = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfx3d_VBlankSignal()
|
void gfx3d_VBlankSignal()
|
||||||
|
@ -1279,6 +1011,507 @@ void gfx3d_VBlankEndSignal()
|
||||||
gpu3D->NDS_3D_Render();
|
gpu3D->NDS_3D_Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 gfx3d_GetGXstatus()
|
||||||
|
{
|
||||||
|
u32 gxstat = ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x600>>2];
|
||||||
|
|
||||||
|
// 0 BoxTest,PositionTest,VectorTest Busy (0=Ready, 1=Busy)
|
||||||
|
gxstat |= 0x00;
|
||||||
|
// 1 BoxTest Result (0=All Outside View, 1=Parts or Fully Inside View)
|
||||||
|
gxstat |= 0x02;
|
||||||
|
// 2-7 Not used
|
||||||
|
//
|
||||||
|
// 8-12 Position & Vector Matrix Stack Level (0..31) (lower 5bit of 6bit value)
|
||||||
|
gxstat |= 0x00;
|
||||||
|
// 13 Projection Matrix Stack Level (0..1)
|
||||||
|
gxstat |= 0x00; // w
|
||||||
|
// 14 Matrix Stack Busy (0=No, 1=Yes; Currently executing a Push/Pop command)
|
||||||
|
gxstat |= 0x00;
|
||||||
|
// 15 Matrix Stack Overflow/Underflow Error (0=No, 1=Error/Acknowledge/Reset)
|
||||||
|
gxstat |= 0x00; // w
|
||||||
|
// 16-24 Number of 40bit-entries in Command FIFO (0..256)
|
||||||
|
gxstat |= (MMU.gfx_fifo.size & 0xFF) << 16;
|
||||||
|
// 24 Command FIFO Full (MSB of above) (0=No, 1=Yes; Full)
|
||||||
|
gxstat |= MMU.gfx_fifo.full << 24;
|
||||||
|
// 25 Command FIFO Less Than Half Full (0=No, 1=Yes; Less than Half-full)
|
||||||
|
gxstat |= MMU.gfx_fifo.half << 25;
|
||||||
|
// 26 Command FIFO Empty (0=No, 1=Yes; Empty)
|
||||||
|
gxstat |= MMU.gfx_fifo.empty << 26;
|
||||||
|
// 27 Geometry Engine Busy (0=No, 1=Yes; Busy; Commands are executing)
|
||||||
|
if (GFX_busy) gxstat |= 0x08000000;
|
||||||
|
// 28-29 Not used
|
||||||
|
//
|
||||||
|
// 30-31 Command FIFO IRQ (0=Never, 1=Less than half full, 2=Empty, 3=Reserved)
|
||||||
|
if (MMU.gfx_fifo.empty)
|
||||||
|
{
|
||||||
|
gxstat |= 2 << 30;
|
||||||
|
MMU.reg_IF[ARMCPU_ARM9] |= (1<<21);
|
||||||
|
}
|
||||||
|
if (MMU.gfx_fifo.half)
|
||||||
|
{
|
||||||
|
gxstat |= 1 << 30;
|
||||||
|
MMU.reg_IF[ARMCPU_ARM9] |= (1<<21);
|
||||||
|
}
|
||||||
|
|
||||||
|
//INFO("GFX FIFO read size=%i value 0x%X\n", MMU.gfx_fifo.size, gxstat);
|
||||||
|
return gxstat;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NOPARAMS() \
|
||||||
|
for (;;) \
|
||||||
|
{\
|
||||||
|
switch (clCmd & 0xFF)\
|
||||||
|
{\
|
||||||
|
case 0x00:\
|
||||||
|
{\
|
||||||
|
if (clInd > 0)\
|
||||||
|
{\
|
||||||
|
clCmd >>= 8;\
|
||||||
|
clInd--;\
|
||||||
|
continue;\
|
||||||
|
}\
|
||||||
|
clCmd = 0;\
|
||||||
|
break;\
|
||||||
|
}\
|
||||||
|
case 0x11:\
|
||||||
|
{\
|
||||||
|
GFX_FIFOadd(&MMU.gfx_fifo);\
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x444) = val;\
|
||||||
|
gfx3d_glPushMatrix();\
|
||||||
|
clCmd >>= 8;\
|
||||||
|
clInd--;\
|
||||||
|
continue;\
|
||||||
|
}\
|
||||||
|
case 0x15:\
|
||||||
|
{\
|
||||||
|
GFX_FIFOadd(&MMU.gfx_fifo);\
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x454) = val;\
|
||||||
|
gfx3d_glLoadIdentity();\
|
||||||
|
clCmd >>= 8;\
|
||||||
|
clInd--;\
|
||||||
|
continue;\
|
||||||
|
}\
|
||||||
|
case 0x41:\
|
||||||
|
{\
|
||||||
|
GFX_FIFOadd(&MMU.gfx_fifo);\
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x504) = val;\
|
||||||
|
gfx3d_glEnd();\
|
||||||
|
clCmd >>= 8;\
|
||||||
|
clInd--;\
|
||||||
|
continue;\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
break;\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SETCOUNTCOMMANDS() \
|
||||||
|
if (!clCmd) clInd = 0;\
|
||||||
|
else\
|
||||||
|
{\
|
||||||
|
u32 tmp_chk = 0xFF000000;\
|
||||||
|
for (int t = 4; t > 0; t--)\
|
||||||
|
{\
|
||||||
|
if ((clCmd & tmp_chk))\
|
||||||
|
{\
|
||||||
|
clInd = t;\
|
||||||
|
break;\
|
||||||
|
}\
|
||||||
|
tmp_chk >>= 8;\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfx3d_Add_Command(u32 val)
|
||||||
|
{
|
||||||
|
//INFO("3D command 0x%02X (full val = 0x%08X, val = 0x%08X, ind %i)\n", clCmd&0xFF, clCmd, val, clInd);
|
||||||
|
if (!clInd)
|
||||||
|
{
|
||||||
|
if (val == 0) return;
|
||||||
|
clCmd = val;
|
||||||
|
SETCOUNTCOMMANDS();
|
||||||
|
NOPARAMS();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (clCmd & 0xFF)
|
||||||
|
{
|
||||||
|
case 0x10: // MTX_MODE - Set Matrix Mode (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x440) = val;
|
||||||
|
gfx3d_glMatrixMode(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x12: // MTX_POP - Pop Current Matrix from Stack (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x448) = val;
|
||||||
|
gfx3d_glPopMatrix(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x13: // MTX_STORE - Store Current Matrix on Stack (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x44C) = val;
|
||||||
|
gfx3d_glStoreMatrix(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x450) = val;
|
||||||
|
gfx3d_glRestoreMatrix(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x458) = val;
|
||||||
|
if (!gfx3d_glLoadMatrix4x4(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x45C) = val;
|
||||||
|
if (!gfx3d_glLoadMatrix4x3(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x460) = val;
|
||||||
|
if (!gfx3d_glMultMatrix4x4(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x464) = val;
|
||||||
|
if (!gfx3d_glMultMatrix4x3(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x468) = val;
|
||||||
|
if (!gfx3d_glMultMatrix3x3(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x46C) = val;
|
||||||
|
if (!gfx3d_glScale(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x470) = val;
|
||||||
|
if (!gfx3d_glTranslate(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x20: // COLOR - Directly Set Vertex Color (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x480) = val;
|
||||||
|
gfx3d_glColor3b(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x21: // NORMAL - Set Normal Vector (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x484) = val;
|
||||||
|
gfx3d_glNormal(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x22: // TEXCOORD - Set Texture Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x488) = val;
|
||||||
|
gfx3d_glTexCoord(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x48C) = val;
|
||||||
|
if (!gfx3d_glVertex16b(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x490) = val;
|
||||||
|
gfx3d_glVertex10b(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x25: // VTX_XY - Set Vertex XY Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x494) = val;
|
||||||
|
gfx3d_glVertex3_cord(0, 1, val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x498) = val;
|
||||||
|
gfx3d_glVertex3_cord(0, 2, val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x49C) = val;
|
||||||
|
gfx3d_glVertex3_cord(1, 2, val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A0) = val;
|
||||||
|
gfx3d_glVertex_rel(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A4) = val;
|
||||||
|
gfx3d_glPolygonAttrib(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A8) = val;
|
||||||
|
gfx3d_glTexImage(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4AC) = val;
|
||||||
|
gfx3d_glTexPalette(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C0) = val;
|
||||||
|
gfx3d_glMaterial0(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C4) = val;
|
||||||
|
gfx3d_glMaterial1(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C8) = val;
|
||||||
|
gfx3d_glLightDirection(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x33: // LIGHT_COLOR - Set Light Color (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4CC) = val;
|
||||||
|
gfx3d_glLightColor(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x34: // SHININESS - Specular Reflection Shininess Table (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4D0) = val;
|
||||||
|
if (!gfx3d_glShininess(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x40: // BEGIN_VTXS - Start of Vertex List (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x500) = val;
|
||||||
|
gfx3d_glBegin(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x540) = val;
|
||||||
|
gfx3d_glFlush(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x60: // VIEWPORT - Set Viewport (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x580) = val;
|
||||||
|
gfx3d_glViewPort(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C0) = val;
|
||||||
|
if (!gfx3d_glBoxTest(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x71: // POS_TEST - Set Position Coordinates for Test (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C4) = val;
|
||||||
|
if (!gfx3d_glPosTest(val)) break;
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
case 0x72: // VEC_TEST - Set Directional Vector for Test (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C8) = val;
|
||||||
|
gfx3d_glVecTest(val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG("Unknown 3D command 0x%02X in cmd=0x%02X\n", clCmd&0xFF, val);
|
||||||
|
clCmd >>= 8;
|
||||||
|
clInd--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GFX_FIFOadd(&MMU.gfx_fifo);
|
||||||
|
NOPARAMS();
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfx3d_Add_Command_Direct(u32 cmd, u32 val)
|
||||||
|
{
|
||||||
|
if (cmd == 0) return;
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
// 3D commands without parameters
|
||||||
|
case 0x00: // NOP - No Operation (for padding packed GXFIFO commands)
|
||||||
|
break;
|
||||||
|
case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x444) = val;
|
||||||
|
gfx3d_glPushMatrix();
|
||||||
|
break;
|
||||||
|
case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x454) = val;
|
||||||
|
gfx3d_glLoadIdentity();
|
||||||
|
break;
|
||||||
|
case 0x41: // END_VTXS - End of Vertex List (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x504) = val;
|
||||||
|
gfx3d_glEnd();
|
||||||
|
break;
|
||||||
|
case 0x10: // MTX_MODE - Set Matrix Mode (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x440) = val;
|
||||||
|
gfx3d_glMatrixMode(val);
|
||||||
|
break;
|
||||||
|
case 0x12: // MTX_POP - Pop Current Matrix from Stack (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x448) = val;
|
||||||
|
gfx3d_glPopMatrix(val);
|
||||||
|
break;
|
||||||
|
case 0x13: // MTX_STORE - Store Current Matrix on Stack (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x44C) = val;
|
||||||
|
gfx3d_glStoreMatrix(val);
|
||||||
|
break;
|
||||||
|
case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x450) = val;
|
||||||
|
gfx3d_glRestoreMatrix(val);
|
||||||
|
break;
|
||||||
|
case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x458) = val;
|
||||||
|
if (!gfx3d_glLoadMatrix4x4(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x45C) = val;
|
||||||
|
if (!gfx3d_glLoadMatrix4x3(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x460) = val;
|
||||||
|
if (!gfx3d_glMultMatrix4x4(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x464) = val;
|
||||||
|
if (!gfx3d_glMultMatrix4x3(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x468) = val;
|
||||||
|
if (!gfx3d_glMultMatrix3x3(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x46C) = val;
|
||||||
|
if (!gfx3d_glScale(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x470) = val;
|
||||||
|
if (!gfx3d_glTranslate(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x20: // COLOR - Directly Set Vertex Color (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x480) = val;
|
||||||
|
gfx3d_glColor3b(val);
|
||||||
|
break;
|
||||||
|
case 0x21: // NORMAL - Set Normal Vector (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x484) = val;
|
||||||
|
gfx3d_glNormal(val);
|
||||||
|
break;
|
||||||
|
case 0x22: // TEXCOORD - Set Texture Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x488) = val;
|
||||||
|
gfx3d_glTexCoord(val);
|
||||||
|
break;
|
||||||
|
case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x48C) = val;
|
||||||
|
if (!gfx3d_glVertex16b(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x490) = val;
|
||||||
|
gfx3d_glVertex10b(val);
|
||||||
|
break;
|
||||||
|
case 0x25: // VTX_XY - Set Vertex XY Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x494) = val;
|
||||||
|
gfx3d_glVertex3_cord(0, 1, val);
|
||||||
|
break;
|
||||||
|
case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x498) = val;
|
||||||
|
gfx3d_glVertex3_cord(0, 2, val);
|
||||||
|
break;
|
||||||
|
case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x49C) = val;
|
||||||
|
gfx3d_glVertex3_cord(1, 2, val);
|
||||||
|
break;
|
||||||
|
case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A0) = val;
|
||||||
|
gfx3d_glVertex_rel(val);
|
||||||
|
break;
|
||||||
|
case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A4) = val;
|
||||||
|
gfx3d_glPolygonAttrib(val);
|
||||||
|
break;
|
||||||
|
case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4A8) = val;
|
||||||
|
gfx3d_glTexImage(val);
|
||||||
|
break;
|
||||||
|
case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4AC) = val;
|
||||||
|
gfx3d_glTexPalette(val);
|
||||||
|
break;
|
||||||
|
case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C0) = val;
|
||||||
|
gfx3d_glMaterial0(val);
|
||||||
|
break;
|
||||||
|
case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C4) = val;
|
||||||
|
gfx3d_glMaterial1(val);
|
||||||
|
break;
|
||||||
|
case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4C8) = val;
|
||||||
|
gfx3d_glLightDirection(val);
|
||||||
|
break;
|
||||||
|
case 0x33: // LIGHT_COLOR - Set Light Color (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4CC) = val;
|
||||||
|
gfx3d_glLightColor(val);
|
||||||
|
break;
|
||||||
|
case 0x34: // SHININESS - Specular Reflection Shininess Table (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x4D0) = val;
|
||||||
|
if (!gfx3d_glShininess(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x40: // BEGIN_VTXS - Start of Vertex List (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x500) = val;
|
||||||
|
gfx3d_glBegin(val);
|
||||||
|
break;
|
||||||
|
case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x540) = val;
|
||||||
|
gfx3d_glFlush(val);
|
||||||
|
break;
|
||||||
|
case 0x60: // VIEWPORT - Set Viewport (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x580) = val;
|
||||||
|
gfx3d_glViewPort(val);
|
||||||
|
break;
|
||||||
|
case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C0) = val;
|
||||||
|
if (!gfx3d_glBoxTest(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x71: // POS_TEST - Set Position Coordinates for Test (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C4) = val;
|
||||||
|
if (!gfx3d_glPosTest(val)) break;
|
||||||
|
break;
|
||||||
|
case 0x72: // VEC_TEST - Set Directional Vector for Test (W)
|
||||||
|
*(u32 *)(ARM9Mem.ARM9_REG + 0x5C8) = val;
|
||||||
|
gfx3d_glVecTest(val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG("Execute unknown 3D command 0x%02X in val=0x%02X\n", cmd, val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GFX_FIFOadd(&MMU.gfx_fifo);
|
||||||
|
}
|
||||||
|
|
||||||
static void gfx3d_Control_cache()
|
static void gfx3d_Control_cache()
|
||||||
{
|
{
|
||||||
u32 v = control;
|
u32 v = control;
|
||||||
|
@ -1343,8 +1576,6 @@ void gfx3d_glGetLightColor(unsigned int index, unsigned int* dest)
|
||||||
//talks about the state required to process verts in quadlists etc. helpful ideas.
|
//talks about the state required to process verts in quadlists etc. helpful ideas.
|
||||||
//consider building a little state structure that looks exactly like this describes
|
//consider building a little state structure that looks exactly like this describes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SFORMAT SF_GFX3D[]={
|
SFORMAT SF_GFX3D[]={
|
||||||
{ "GCTL", 4, 1, &control},
|
{ "GCTL", 4, 1, &control},
|
||||||
{ "GPAT", 4, 1, &polyAttr},
|
{ "GPAT", 4, 1, &polyAttr},
|
||||||
|
@ -1379,6 +1610,14 @@ SFORMAT SF_GFX3D[]={
|
||||||
{ "GL_S", 4, 1, &last_s},
|
{ "GL_S", 4, 1, &last_s},
|
||||||
{ "GLCM", 4, 1, &clCmd},
|
{ "GLCM", 4, 1, &clCmd},
|
||||||
{ "GLIN", 4, 1, &clInd},
|
{ "GLIN", 4, 1, &clInd},
|
||||||
|
{ "GLBT", 4, 1, &BTind},
|
||||||
|
{ "GLPT", 4, 1, &PTind},
|
||||||
|
{ "GLBS", 1, 1, &GFX_busy},
|
||||||
|
{ "GLF1", 1, 1, &MMU.gfx_fifo.empty},
|
||||||
|
{ "GLF1", 1, 1, &MMU.gfx_fifo.half},
|
||||||
|
{ "GLF1", 1, 1, &MMU.gfx_fifo.full},
|
||||||
|
{ "GLF1", 1, 1, &MMU.gfx_fifo.error},
|
||||||
|
{ "GLF1", 1, 1, &MMU.gfx_fifo.irq},
|
||||||
{ "GCOL", 1, 4, colorRGB},
|
{ "GCOL", 1, 4, colorRGB},
|
||||||
{ "GLCO", 4, 4, lightColor},
|
{ "GLCO", 4, 4, lightColor},
|
||||||
{ "GLDI", 4, 4, lightDirection},
|
{ "GLDI", 4, 4, lightDirection},
|
||||||
|
|
|
@ -183,11 +183,13 @@ BOOL gfx3d_glPosTest(unsigned long v);
|
||||||
void gfx3d_glVecTest(unsigned long v);
|
void gfx3d_glVecTest(unsigned long v);
|
||||||
void gfx3d_glGetPosRes(unsigned int index);
|
void gfx3d_glGetPosRes(unsigned int index);
|
||||||
void gfx3d_glGetVecRes(unsigned int index);
|
void gfx3d_glGetVecRes(unsigned int index);
|
||||||
void gfx3d_glCallList(u32 addr, u32 cmd);
|
|
||||||
void gfx3d_glFlush(unsigned long v);
|
void gfx3d_glFlush(unsigned long v);
|
||||||
void gfx3d_VBlankSignal();
|
void gfx3d_VBlankSignal();
|
||||||
void gfx3d_VBlankEndSignal();
|
void gfx3d_VBlankEndSignal();
|
||||||
void gfx3d_Control(unsigned long v);
|
void gfx3d_Control(unsigned long v);
|
||||||
|
u32 gfx3d_GetGXstatus();
|
||||||
|
void gfx3d_Add_Command_Direct(u32 addr, u32 val);
|
||||||
|
void gfx3d_Add_Command(u32 val);
|
||||||
|
|
||||||
//other misc stuff
|
//other misc stuff
|
||||||
void gfx3d_glGetMatrix(unsigned int mode, int index, float* dest);
|
void gfx3d_glGetMatrix(unsigned int mode, int index, float* dest);
|
||||||
|
|
Loading…
Reference in New Issue