mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +00:00
Command 05 - 02 WIP
This commit is contained in:
parent
f0bbfbc84e
commit
02e84b90f2
|
@ -3,6 +3,7 @@
|
||||||
* Incomplete!
|
* Incomplete!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include "GLideN64.h"
|
#include "GLideN64.h"
|
||||||
#include "DebugDump.h"
|
#include "DebugDump.h"
|
||||||
#include "F3D.h"
|
#include "F3D.h"
|
||||||
|
@ -57,7 +58,14 @@ void F3DSWRS_MoveMem(u32 _w0, u32)
|
||||||
|
|
||||||
void F3DSWRS_Vtx(u32 _w0, u32 _w1)
|
void F3DSWRS_Vtx(u32 _w0, u32 _w1)
|
||||||
{
|
{
|
||||||
gSPSWVertex( _w1, _SHIFTR( _w0, 10, 6 ), 0 );
|
const u32 address = RSP_SegmentToPhysical(_w1);
|
||||||
|
const u32 n = _SHIFTR(_w0, 10, 6);
|
||||||
|
|
||||||
|
if ((address + sizeof(SWVertex)* n) > RDRAMSize)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const SWVertex * vertex = (const SWVertex*)&RDRAM[address];
|
||||||
|
gSPSWVertex(vertex, n, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void F3DSWRS_Jump2(u32, u32)
|
void F3DSWRS_Jump2(u32, u32)
|
||||||
|
@ -67,8 +75,57 @@ void F3DSWRS_Jump2(u32, u32)
|
||||||
RSP.swDL[RSP.PCi].SWOtherDL = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4], 0, 24);
|
RSP.swDL[RSP.PCi].SWOtherDL = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4], 0, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void Jump3_2(u32 * _result) {
|
||||||
|
typedef std::array<s16, 4> Vector;
|
||||||
|
u32 params[10];
|
||||||
|
for (u32 i = 1; i < 10; ++i)
|
||||||
|
params[i] = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + i * 4];
|
||||||
|
Vector v0{ 0, 0, 0, 0 };
|
||||||
|
Vector v1{ 0, 0, 0, 0 };
|
||||||
|
Vector v2{ 0, 0, 0, 0 };
|
||||||
|
Vector v3{ 0, 0, 0, 0 };
|
||||||
|
s16 V0 = _SHIFTR(params[9], 0, 16);
|
||||||
|
s16 V1 = _SHIFTR(params[8], 0, 16);
|
||||||
|
V1 <<= 4;
|
||||||
|
v0[0] = _SHIFTR(params[8], 16, 16);
|
||||||
|
v0[1] = V1;
|
||||||
|
v0[2] = _SHIFTR(params[9], 16, 16);
|
||||||
|
v2[0] = V0;
|
||||||
|
v3[2] = V0;
|
||||||
|
v1[1] = _SHIFTR(params[2], 16, 16);
|
||||||
|
_result[0] = ((v0[0] + v1[0]) << 16) | (v0[1] + v1[1]);
|
||||||
|
_result[1] = ((v0[2] + v1[2]) << 16) | (v0[3] + v1[3]);
|
||||||
|
v1 = v2;
|
||||||
|
v1[1] = _SHIFTR(params[2], 0, 16);
|
||||||
|
_result[2] = ((v0[0] + v1[0]) << 16) | (v0[1] + v1[1]);
|
||||||
|
_result[3] = ((v0[2] + v1[2]) << 16) | (v0[3] + v1[3]);
|
||||||
|
v1 = v3;
|
||||||
|
v1[1] = _SHIFTR(params[1], 16, 16);
|
||||||
|
_result[4] = ((v0[0] + v1[0]) << 16) | (v0[1] + v1[1]);
|
||||||
|
_result[5] = ((v0[2] + v1[2]) << 16) | (v0[3] + v1[3]);
|
||||||
|
for (u32 i = 0; i < 4; ++i)
|
||||||
|
v1[i] = v2[i] + v3[i];
|
||||||
|
v1[1] = _SHIFTR(params[1], 0, 16);
|
||||||
|
_result[6] = ((v0[0] + v1[0]) << 16) | (v0[1] + v1[1]);
|
||||||
|
_result[7] = ((v0[2] + v1[2]) << 16) | (v0[3] + v1[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void F3DSWRS_Jump3(u32 _w0, u32 _w1)
|
void F3DSWRS_Jump3(u32 _w0, u32 _w1)
|
||||||
{
|
{
|
||||||
|
const u32 mode = _SHIFTR(_w0, 8, 8);
|
||||||
|
switch (mode) {
|
||||||
|
case 0x02: {
|
||||||
|
u32 vecdata[8];
|
||||||
|
Jump3_2(vecdata);
|
||||||
|
const SWVertex * vertex = (const SWVertex*)&vecdata[0];
|
||||||
|
gSPSWVertex(vertex, 4, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
RSP.PC[RSP.PCi] = RSP.swDL[RSP.PCi].SWOtherDL;
|
RSP.PC[RSP.PCi] = RSP.swDL[RSP.PCi].SWOtherDL;
|
||||||
RSP.swDL[RSP.PCi].SWStartDL = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi]], 0, 24);
|
RSP.swDL[RSP.PCi].SWStartDL = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi]], 0, 24);
|
||||||
RSP.swDL[RSP.PCi].SWOtherDL = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4], 0, 24);
|
RSP.swDL[RSP.PCi].SWOtherDL = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4], 0, 24);
|
||||||
|
|
|
@ -15,7 +15,7 @@ typedef struct
|
||||||
struct {
|
struct {
|
||||||
u32 SWStartDL;
|
u32 SWStartDL;
|
||||||
u32 SWOtherDL;
|
u32 SWOtherDL;
|
||||||
} swDL[18];
|
} swDL[10];
|
||||||
} RSPInfo;
|
} RSPInfo;
|
||||||
|
|
||||||
extern RSPInfo RSP;
|
extern RSPInfo RSP;
|
||||||
|
|
|
@ -1440,15 +1440,8 @@ void gSPF3DAMVertex(u32 a, u32 n, u32 v0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gSPSWVertex(u32 a, u32 n, u32 v0)
|
void gSPSWVertex(const SWVertex * vertex, u32 n, u32 v0)
|
||||||
{
|
{
|
||||||
u32 address = RSP_SegmentToPhysical(a);
|
|
||||||
|
|
||||||
if ((address + sizeof(SWVertex)* n) > RDRAMSize)
|
|
||||||
return;
|
|
||||||
|
|
||||||
SWVertex *vertex = (SWVertex*)&RDRAM[address];
|
|
||||||
|
|
||||||
GraphicsDrawer & drawer = dwnd().getDrawer();
|
GraphicsDrawer & drawer = dwnd().getDrawer();
|
||||||
if ((n + v0) <= INDEXMAP_SIZE) {
|
if ((n + v0) <= INDEXMAP_SIZE) {
|
||||||
unsigned int i = v0;
|
unsigned int i = v0;
|
||||||
|
|
|
@ -160,7 +160,7 @@ void gSPDMAVertex( u32 v, u32 n, u32 v0 );
|
||||||
void gSPCBFDVertex( u32 v, u32 n, u32 v0 );
|
void gSPCBFDVertex( u32 v, u32 n, u32 v0 );
|
||||||
void gSPT3DUXVertex(u32 v, u32 n, u32 ci);
|
void gSPT3DUXVertex(u32 v, u32 n, u32 ci);
|
||||||
void gSPF3DAMVertex( u32 v, u32 n, u32 v0 );
|
void gSPF3DAMVertex( u32 v, u32 n, u32 v0 );
|
||||||
void gSPSWVertex(u32 a, u32 n, u32 v0);
|
void gSPSWVertex(const SWVertex * vertex, u32 n, u32 v0);
|
||||||
void gSPDisplayList(u32 dl);
|
void gSPDisplayList(u32 dl);
|
||||||
void gSPSWDisplayList(u32 dl);
|
void gSPSWDisplayList(u32 dl);
|
||||||
void gSPBranchList( u32 dl );
|
void gSPBranchList( u32 dl );
|
||||||
|
|
Loading…
Reference in New Issue
Block a user