diff --git a/projects/msvc/GLideN64.vcxproj b/projects/msvc/GLideN64.vcxproj
index 0be3fd30..9a885e1f 100644
--- a/projects/msvc/GLideN64.vcxproj
+++ b/projects/msvc/GLideN64.vcxproj
@@ -61,7 +61,7 @@
- DynamicLibrary
+ StaticLibrary
MultiByte
$(DefaultPlatformToolset)
@@ -78,7 +78,7 @@
AllRules.ruleset
- $(SolutionDir)bin\$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\..\external\$(Platform)\
$(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\
@@ -117,7 +117,7 @@
Disabled
EnableFastChecks
EditAndContinue
- MultiThreadedDebug
+ MultiThreadedDebugDLL
true
@@ -149,7 +149,7 @@
- WIN32_ASM;WIN32;%(PreprocessorDefinitions)
+ WIN32;%(PreprocessorDefinitions)
MachineX86
@@ -195,7 +195,7 @@
- GL_USE_UNIFORMBLOCK;%(PreprocessorDefinitions)
+ NATIVE;GL_USE_UNIFORMBLOCK;%(PreprocessorDefinitions)
ZILMAR_API;%(PreprocessorDefinitions)
@@ -217,7 +217,7 @@ copy /Y "$(OutDir)$(TargetName).*" "$(PJ64PluginsDirWTL_x64)")
- MUPENPLUSAPI;%(PreprocessorDefinitions)
+ MUPENPLUSAPI;NATIVE;%(PreprocessorDefinitions)
Copy result to plugins folder
@@ -355,6 +355,7 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")
true
+ true
true
@@ -369,6 +370,7 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")
true
+
@@ -378,9 +380,13 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")
true
+ false
+ false
true
+ true
+ true
@@ -433,6 +439,7 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")
true
+ true
diff --git a/projects/msvc/GLideN64.vcxproj.filters b/projects/msvc/GLideN64.vcxproj.filters
index aec78dbd..522ab0d2 100644
--- a/projects/msvc/GLideN64.vcxproj.filters
+++ b/projects/msvc/GLideN64.vcxproj.filters
@@ -443,6 +443,9 @@
Source Files\Graphics\OpenGL\GLSL
+
+ Source Files
+
diff --git a/projects/msvc/GLideNUI-wtl.vcxproj b/projects/msvc/GLideNUI-wtl.vcxproj
index 68777d96..22a11c76 100644
--- a/projects/msvc/GLideNUI-wtl.vcxproj
+++ b/projects/msvc/GLideNUI-wtl.vcxproj
@@ -42,7 +42,7 @@
- $(SolutionDir)bin\$(Platform)\$(Configuration)\lib\
+ $(SolutionDir)..\..\..\external\$(Platform)\
$(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\
$(ProjectName)
true
@@ -73,7 +73,7 @@
DEBUG_DUMP;_DEBUG;%(PreprocessorDefinitions)
ProgramDatabase
Disabled
- MultiThreadedDebug
+ MultiThreadedDebugDLL
true
stdcpp17
stdcpp17
diff --git a/projects/msvc/GLideNUI.vcxproj b/projects/msvc/GLideNUI.vcxproj
index 9fad79a5..d7ff5c26 100644
--- a/projects/msvc/GLideNUI.vcxproj
+++ b/projects/msvc/GLideNUI.vcxproj
@@ -76,7 +76,7 @@
DEBUG_DUMP;_DEBUG;%(PreprocessorDefinitions)
ProgramDatabase
Disabled
- MultiThreadedDebug
+ MultiThreadedDebugDLL
true
true
stdcpp17
diff --git a/projects/msvc/libGLideNHQ.vcxproj b/projects/msvc/libGLideNHQ.vcxproj
index bb1e04ed..1a79d9ed 100644
--- a/projects/msvc/libGLideNHQ.vcxproj
+++ b/projects/msvc/libGLideNHQ.vcxproj
@@ -63,7 +63,7 @@
- WIN32_ASM;%(PreprocessorDefinitions)
+ %(PreprocessorDefinitions)
@@ -73,7 +73,7 @@
ProgramDatabase
Disabled
Disabled
- MultiThreadedDebug
+ MultiThreadedDebugDLL
_DEBUG;DEBUG;%(PreprocessorDefinitions)
diff --git a/projects/msvc/osal.vcxproj b/projects/msvc/osal.vcxproj
index 29b11327..ba539033 100644
--- a/projects/msvc/osal.vcxproj
+++ b/projects/msvc/osal.vcxproj
@@ -47,7 +47,7 @@
- $(SolutionDir)bin\$(Platform)\$(Configuration)\lib\
+ $(SolutionDir)..\..\..\external\$(Platform)\
$(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\
@@ -63,7 +63,7 @@
Disabled
- MultiThreadedDebug
+ MultiThreadedDebugDLL
true
stdcpp17
true
diff --git a/projects/msvc/ticpp.vcxproj b/projects/msvc/ticpp.vcxproj
index e2424b16..1c7311db 100644
--- a/projects/msvc/ticpp.vcxproj
+++ b/projects/msvc/ticpp.vcxproj
@@ -71,6 +71,7 @@
TIXML_USE_TICPP;_WINDOWS;WIN32;_DEBUG;_LIB;TIXML_USE_TICPP;%(PreprocessorDefinitions)
true
stdcpp17
+ MultiThreadedDebugDLL
Windows
diff --git a/projects/msvc/ts2lang.vcxproj b/projects/msvc/ts2lang.vcxproj
index f7d4bc13..f81045da 100644
--- a/projects/msvc/ts2lang.vcxproj
+++ b/projects/msvc/ts2lang.vcxproj
@@ -65,6 +65,7 @@
_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;%(PreprocessorDefinitions)
true
stdcpp17
+ MultiThreadedDebugDLL
true
diff --git a/src/3DMath.h b/src/3DMath.h
index da191a11..38650747 100644
--- a/src/3DMath.h
+++ b/src/3DMath.h
@@ -42,8 +42,12 @@ inline float DotProduct(const float v0[3], const float v1[3])
inline float GetFloatMatrixElement(s16 _int, u16 _fract)
{
+#ifdef NATIVE
+ return (((u16)_int << 0x10) | (u16)_fract) * (1 / 65536.0f);
+#else
const s32 element = static_cast((static_cast(_int) << 16) | _fract);
return _FIXED2FLOAT(element, 16);
+#endif
}
inline std::pair GetIntMatrixElement(f32 _elem)
diff --git a/src/BufferCopy/DepthBufferToRDRAM.cpp b/src/BufferCopy/DepthBufferToRDRAM.cpp
index 8cf3913d..41a9cf65 100644
--- a/src/BufferCopy/DepthBufferToRDRAM.cpp
+++ b/src/BufferCopy/DepthBufferToRDRAM.cpp
@@ -19,6 +19,10 @@
#include
#include
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
using namespace graphics;
#define DEPTH_TEX_WIDTH 640
diff --git a/src/BufferCopy/RDRAMtoColorBuffer.cpp b/src/BufferCopy/RDRAMtoColorBuffer.cpp
index bb4fe0ec..8a1ced6d 100644
--- a/src/BufferCopy/RDRAMtoColorBuffer.cpp
+++ b/src/BufferCopy/RDRAMtoColorBuffer.cpp
@@ -13,6 +13,10 @@
#include
#include
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
using namespace graphics;
RDRAMtoColorBuffer::RDRAMtoColorBuffer()
@@ -179,7 +183,7 @@ u32 RGBA32ToABGR32(u32 col, bool _fullAlpha)
void RDRAMtoColorBuffer::_copyFromRDRAM(u32 _height, bool _fullAlpha)
{
Cleaner cleaner(this);
- const u32 address = m_pCurBuffer->m_startAddress;
+ const word address = m_pCurBuffer->m_startAddress;
const u32 width = m_pCurBuffer->m_width;
const u32 height = _height;
@@ -232,7 +236,7 @@ void RDRAMtoColorBuffer::_copyFromRDRAM(u32 _height, bool _fullAlpha)
if (!FBInfo::fbInfo.isSupported()) {
if (bUseAlpha && config.frameBufferEmulation.copyToRDRAM == Config::ctDisable) {
- u32 totalBytes = (width * height) << m_pCurBuffer->m_size >> 1;
+ word totalBytes = (width * height) << m_pCurBuffer->m_size >> 1;
if (address + totalBytes > RDRAMSize + 1)
totalBytes = RDRAMSize + 1 - address;
memset(RDRAM + address, 0, totalBytes);
diff --git a/src/DebugDump.cpp b/src/DebugDump.cpp
index 05ea066c..3a5be7ed 100644
--- a/src/DebugDump.cpp
+++ b/src/DebugDump.cpp
@@ -56,6 +56,9 @@ BufferedLog::~BufferedLog()
void BufferedLog::print(const char* _message)
{
m_log << _message;
+#ifdef _MSC_VER
+ OutputDebugStringA(_message);
+#endif
}
bool BufferedLog::needPrint(u32 _mode) const
diff --git a/src/Debugger.h b/src/Debugger.h
index 834e0ec9..98495b92 100644
--- a/src/Debugger.h
+++ b/src/Debugger.h
@@ -84,11 +84,11 @@ private:
struct TriInfo {
std::array vertices;
gDPCombine combine; // Combine mode at the time of rendering
- u32 cycle_type;
+ word cycle_type;
gDPInfo::OtherMode otherMode;
- u32 geometryMode; // geometry mode flags
- u32 frameBufferAddress;
- u32 tri_n; // Triangle number
+ word geometryMode; // geometry mode flags
+ word frameBufferAddress;
+ word tri_n; // Triangle number
TriangleType type; // 0-normal, 1-texrect, 2-fillrect
diff --git a/src/DepthBufferRender/DepthBufferRender.cpp b/src/DepthBufferRender/DepthBufferRender.cpp
index 801193a0..61e50fb3 100644
--- a/src/DepthBufferRender/DepthBufferRender.cpp
+++ b/src/DepthBufferRender/DepthBufferRender.cpp
@@ -21,6 +21,10 @@
#include "DepthBuffer.h"
#include "DepthBufferRender.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
static vertexi * max_vtx; // Max y vertex (ending vertex)
static vertexi * start_vtx, *end_vtx; // First and last vertex in array
static vertexi * right_vtx, *left_vtx; // Current right and left vertex
diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp
index 0d4b8ee4..2186923b 100644
--- a/src/FrameBuffer.cpp
+++ b/src/FrameBuffer.cpp
@@ -195,10 +195,13 @@ void FrameBuffer::updateEndAddress()
inline
u32 _cutHeight(u32 _address, u32 _height, u32 _stride)
{
+#ifndef NATIVE
if (_address > RDRAMSize)
return 0;
+
if (_address + _stride * _height > (RDRAMSize + 1))
return (RDRAMSize + 1 - _address) / _stride;
+#endif
return _height;
}
@@ -853,7 +856,7 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
if ((m_pCurrent->m_startAddress != _address)) {
if (isSubBuffer(m_pCurrent)) {
const u32 stride = _width << _size >> 1;
- const u32 addrOffset = _address - m_pCurrent->m_startAddress;
+ const word addrOffset = _address - m_pCurrent->m_startAddress;
m_pCurrent->m_originX = (addrOffset % stride) >> (_size - 1);
m_pCurrent->m_originY = addrOffset / stride;
gSP.changed |= CHANGED_VIEWPORT;
@@ -1498,7 +1501,7 @@ void FrameBufferList::renderBuffer()
const u32 vFullHeight = rdpRes.vi_ispal ? 288 : 240;
const f32 dstScaleY = m_overscan.getScaleY(vFullHeight);
- const u32 addrOffset = ((rdpRes.vi_origin - pBuffer->m_startAddress) << 1 >> pBuffer->m_size);
+ const word addrOffset = ((rdpRes.vi_origin - pBuffer->m_startAddress) << 1 >> pBuffer->m_size);
srcY0 = static_cast(addrOffset / pBuffer->m_width);
if ((addrOffset != 0) && (pBuffer->m_width == addrOffset * 2))
srcY0 = 1;
@@ -1747,7 +1750,9 @@ void FrameBuffer_ActivateBufferTextureBG(u32 t, u32 _frameBufferAddress)
void FrameBuffer_CopyToRDRAM(u32 _address, bool _sync)
{
+#ifndef NATIVE
ColorBufferToRDRAM::get().copyToRDRAM(_address, _sync);
+#endif
}
void FrameBuffer_CopyChunkToRDRAM(u32 _address)
@@ -1755,7 +1760,7 @@ void FrameBuffer_CopyChunkToRDRAM(u32 _address)
ColorBufferToRDRAM::get().copyChunkToRDRAM(_address);
}
-bool FrameBuffer_CopyDepthBuffer( u32 address )
+bool FrameBuffer_CopyDepthBuffer( word address )
{
FrameBufferList & fblist = frameBufferList();
FrameBuffer * pCopyBuffer = fblist.getCopyBuffer();
@@ -1775,17 +1780,17 @@ bool FrameBuffer_CopyDepthBuffer( u32 address )
return false;
}
-bool FrameBuffer_CopyDepthBufferChunk(u32 address)
+bool FrameBuffer_CopyDepthBufferChunk(word address)
{
return DepthBufferToRDRAM::get().copyChunkToRDRAM(address);
}
-void FrameBuffer_CopyFromRDRAM(u32 _address, bool _bCFB)
+void FrameBuffer_CopyFromRDRAM(word _address, bool _bCFB)
{
RDRAMtoColorBuffer::get().copyFromRDRAM(_address, _bCFB);
}
-void FrameBuffer_AddAddress(u32 address, u32 _size)
+void FrameBuffer_AddAddress(word address, u32 _size)
{
RDRAMtoColorBuffer::get().addAddress(address, _size);
}
diff --git a/src/FrameBuffer.h b/src/FrameBuffer.h
index 6e06dae4..f02ae614 100644
--- a/src/FrameBuffer.h
+++ b/src/FrameBuffer.h
@@ -241,10 +241,10 @@ void FrameBuffer_Init();
void FrameBuffer_Destroy();
void FrameBuffer_CopyToRDRAM( u32 _address , bool _sync );
void FrameBuffer_CopyChunkToRDRAM(u32 _address);
-void FrameBuffer_CopyFromRDRAM(u32 address, bool bUseAlpha);
-void FrameBuffer_AddAddress(u32 address, u32 _size);
-bool FrameBuffer_CopyDepthBuffer(u32 address);
-bool FrameBuffer_CopyDepthBufferChunk(u32 address);
+void FrameBuffer_CopyFromRDRAM(word address, bool bUseAlpha);
+void FrameBuffer_AddAddress(word address, u32 _size);
+bool FrameBuffer_CopyDepthBuffer(word address);
+bool FrameBuffer_CopyDepthBufferChunk(word address);
void FrameBuffer_ActivateBufferTexture(u32 t, u32 _frameBufferAddress);
void FrameBuffer_ActivateBufferTextureBG(u32 t, u32 _frameBufferAddress);
diff --git a/src/FrameBufferInfo.cpp b/src/FrameBufferInfo.cpp
index c12a9418..f775c9b8 100644
--- a/src/FrameBufferInfo.cpp
+++ b/src/FrameBufferInfo.cpp
@@ -36,9 +36,9 @@ namespace FBInfo {
}
- void FBInfo::Write(u32 addr, u32 size)
+ void FBInfo::Write(word addr, u32 size)
{
- const u32 address = RSP_SegmentToPhysical(addr);
+ const word address = RSP_SegmentToPhysical(addr);
const FrameBuffer* writeBuffer = frameBufferList().findBuffer(address);
if (writeBuffer == nullptr)
return;
@@ -53,9 +53,9 @@ namespace FBInfo {
LOG(LOG_WARNING, "FBWList size=%u", size);
}
- void FBInfo::Read(u32 addr)
+ void FBInfo::Read(word addr)
{
- const u32 address = RSP_SegmentToPhysical(addr);
+ const word address = RSP_SegmentToPhysical(addr);
FrameBuffer * pBuffer = frameBufferList().findBuffer(address);
if (pBuffer == nullptr || _findBuffer(m_writeBuffers, pBuffer).first)
diff --git a/src/FrameBufferInfo.h b/src/FrameBufferInfo.h
index 6cbba36b..8502435f 100644
--- a/src/FrameBufferInfo.h
+++ b/src/FrameBufferInfo.h
@@ -30,11 +30,11 @@ namespace FBInfo {
public:
FBInfo();
- void Write(u32 addr, u32 size);
+ void Write(word addr, u32 size);
void WriteList(FrameBufferModifyEntry *plist, u32 size);
- void Read(u32 addr);
+ void Read(word addr);
void GetInfo(void *pinfo);
diff --git a/src/GBI.cpp b/src/GBI.cpp
index 87c5af84..62134323 100644
--- a/src/GBI.cpp
+++ b/src/GBI.cpp
@@ -144,9 +144,9 @@ u32 G_MWO_aLIGHT_8, G_MWO_bLIGHT_8;
GBIInfo GBI;
-void GBI_Unknown( u32 w0, u32 w1 )
+void GBI_Unknown( const Gwords words )
{
- DebugMsg(DEBUG_NORMAL, "UNKNOWN GBI COMMAND 0x%02X", _SHIFTR(w0, 24, 8));
+ DebugMsg(DEBUG_NORMAL, "UNKNOWN GBI COMMAND 0x%02X", _SHIFTR(words.w0, 24, 8));
}
void GBIInfo::init()
@@ -338,7 +338,7 @@ void GBIInfo::_makeCurrent(MicrocodeInfo * _pCurrent)
m_pCurrent = _pCurrent;
}
-bool GBIInfo::_makeExistingMicrocodeCurrent(u32 uc_start, u32 uc_dstart, u32 uc_dsize)
+bool GBIInfo::_makeExistingMicrocodeCurrent(word uc_start, word uc_dstart, u32 uc_dsize)
{
auto iter = std::find_if(m_list.begin(), m_list.end(), [=](const MicrocodeInfo& info) {
return info.address == uc_start && info.dataAddress == uc_dstart && info.dataSize == uc_dsize;
@@ -351,7 +351,7 @@ bool GBIInfo::_makeExistingMicrocodeCurrent(u32 uc_start, u32 uc_dstart, u32 uc_
return true;
}
-void GBIInfo::loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize)
+void GBIInfo::loadMicrocode(word uc_start, word uc_dstart, u16 uc_dsize)
{
if (_makeExistingMicrocodeCurrent(uc_start, uc_dstart, uc_dsize))
return;
@@ -364,7 +364,11 @@ void GBIInfo::loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize)
current.type = NONE;
// See if we can identify it by CRC
+#ifdef NATIVE
+ const u32 uc_crc = CRC_Calculate_Strict( 0xFFFFFFFF, (void*)uc_start, 4096 );
+#else
const u32 uc_crc = CRC_Calculate_Strict( 0xFFFFFFFF, &RDRAM[uc_start & 0x1FFFFFFF], 4096 );
+#endif
SpecialMicrocodeInfo infoToSearch;
infoToSearch.crc = uc_crc;
auto it = std::lower_bound(specialMicrocodes.begin(), specialMicrocodes.end(), infoToSearch,
@@ -380,9 +384,13 @@ void GBIInfo::loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize)
return;
}
+#ifdef NATIVE
+ const char* uc_data = (const char*)uc_dstart;
+#else
// See if we can identify it by text
char uc_data[2048];
UnswapCopyWrap(RDRAM, uc_dstart & 0x1FFFFFFF, (u8*)uc_data, 0, 0x7FF, 2048);
+#endif
char uc_str[256];
strcpy(uc_str, "Not Found");
@@ -478,3 +486,20 @@ void GBIInfo::loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize)
assert(false && "unknown ucode!!!'n");
_makeCurrent(¤t);
}
+
+#ifdef EXTENDED_GFX
+Gwords::Gwords() : w0(0), w1(0), w2(0), w3(0) {
+}
+
+Gwords::Gwords(word _w0, word _w1) : w0(_w0), w1(_w1), w2(0), w3(0) {
+}
+
+Gwords::Gwords(word _w0, word _w1, word _w2, word _w3) : w0(_w0), w1(_w1), w2(_w2), w3(_w3) {
+}
+#else
+Gwords::Gwords() : w0(0), w1(0) {
+}
+
+Gwords::Gwords(word _w0, word _w1) : w0(_w0), w1(_w1) {
+}
+#endif
diff --git a/src/GBI.h b/src/GBI.h
index ee77ab1f..72f80fe3 100644
--- a/src/GBI.h
+++ b/src/GBI.h
@@ -253,6 +253,8 @@ extern u32 G_MWO_aLIGHT_8, G_MWO_bLIGHT_8;
#define G_TEXRECTFLIP 0xE5 /* -27 */
#define G_TEXRECT 0xE4 /* -28 */
+#define G_MARK_SEGMENT 0x30
+
#define G_RDPNOOP 0xC0
#define G_TRI_FILL 0xC8 /* fill triangle: 11001000 */
@@ -414,6 +416,33 @@ extern u32 G_ZOBJ, G_ZRDPCMD, G_ZWAITSIGNAL, G_ZMTXCAT, G_ZMULT_MPMTX, G_ZLIGHTI
#define G_DL_PUSH 0x00
#define G_DL_NOPUSH 0x01
+#ifdef NATIVE
+typedef struct {
+ s16 x;
+ s16 y;
+ s16 z;
+
+ u16 flag;
+
+ s16 s;
+ s16 t;
+
+ union {
+ struct {
+ u8 r;
+ u8 g;
+ u8 b;
+ u8 a;
+ } color;
+ struct {
+ s8 x;
+ s8 y; // r
+ s8 z; // g
+ s8 a; // b
+ } normal;
+ };
+} Vertex;
+#else
typedef struct
{
s16 y;
@@ -442,7 +471,17 @@ typedef struct
} normal;
};
} Vertex;
+#endif
+#ifdef NATIVE
+typedef struct
+{
+ s16 x, y;
+ s16 z;
+ u16 ci;
+ s16 s, t;
+} PDVertex;
+#else
typedef struct
{
s16 y, x;
@@ -450,7 +489,17 @@ typedef struct
s16 z;
s16 t, s;
} PDVertex;
+#endif
+#ifdef NATIVE
+typedef struct
+{
+ u8 v2, v1, v0, flag;
+ s16 s0, t0;
+ s16 s1, t1;
+ s16 s2, t2;
+} DKRTriangle;
+#else
typedef struct
{
u8 v2, v1, v0, flag;
@@ -458,28 +507,47 @@ typedef struct
s16 t1, s1;
s16 t2, s2;
} DKRTriangle;
+#endif
+#ifdef NATIVE
+typedef struct
+{
+ s16 x, y;
+ s16 z;
+ u16 flag;
+} SWVertex;
+#else
typedef struct
{
s16 y, x;
u16 flag;
s16 z;
} SWVertex;
+#endif
+#ifdef NATIVE
+struct Light
+{
+ u8 r, g, b, pad0;
+ u8 r2, g2, b2, pad1;
+ s8 x, y, z, pad2;
+};
+#else
struct Light
{
u8 pad0, b, g, r;
u8 pad1, b2, g2, r2;
s8 pad2, z, y, x;
};
+#endif
// GBI commands
-typedef void (*GBIFunc)( u32 w0, u32 w1 );
+typedef void (*GBIFunc)( const Gwords words );
struct MicrocodeInfo
{
- u32 address = 0;
- u32 dataAddress = 0;;
+ word address = 0;
+ word dataAddress = 0;;
u16 dataSize = 0;
u32 type = NONE;
bool NoN = false;
@@ -499,7 +567,7 @@ struct GBIInfo
void init();
void destroy();
- void loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize);
+ void loadMicrocode(word uc_start, word uc_dstart, u16 uc_dsize);
u32 getMicrocodeType() const {return m_pCurrent != nullptr ? m_pCurrent->type : NONE;}
bool isHWLSupported() const;
void setHWLSupported(bool _supported);
@@ -514,7 +582,7 @@ private:
void _flushCommands();
void _makeCurrent(MicrocodeInfo * _pCurrent);
- bool _makeExistingMicrocodeCurrent(u32 uc_start, u32 uc_dstart, u32 uc_dsize);
+ bool _makeExistingMicrocodeCurrent(word uc_start, word uc_dstart, u32 uc_dsize);
bool m_hwlSupported;
MicrocodeInfo * m_pCurrent;
diff --git a/src/Graphics/OpenGLContext/windows/WindowsWGL.cpp b/src/Graphics/OpenGLContext/windows/WindowsWGL.cpp
index 77df7bcb..b35b2477 100644
--- a/src/Graphics/OpenGLContext/windows/WindowsWGL.cpp
+++ b/src/Graphics/OpenGLContext/windows/WindowsWGL.cpp
@@ -1,3 +1,4 @@
+#define WGL_WGLEXT_PROTOTYPES
#include "WindowsWGL.h"
#include
#include
@@ -46,9 +47,9 @@ bool WindowsWGL::start()
}
if ((SetPixelFormat(hDC, pixelFormat, &pfd)) == FALSE) {
+ auto err = GetLastError();
+ auto currentFormat = GetPixelFormat(hDC);
MessageBoxW(hWnd, L"Error while setting pixel format!", pluginNameW, MB_ICONERROR | MB_OK);
- stop();
- return false;
}
if ((hRC = wglCreateContext(hDC)) == NULL) {
diff --git a/src/Graphics/OpenGLContext/windows/windows_DisplayWindow.cpp b/src/Graphics/OpenGLContext/windows/windows_DisplayWindow.cpp
index e138040e..b28518dc 100644
--- a/src/Graphics/OpenGLContext/windows/windows_DisplayWindow.cpp
+++ b/src/Graphics/OpenGLContext/windows/windows_DisplayWindow.cpp
@@ -175,6 +175,7 @@ bool DisplayWindowWindows::_resizeWindow()
m_heightOffset = 0;
_setBufferSize();
+ return true;
return (SetWindowPos(hWnd, NULL, 0, 0, m_screenWidth, m_screenHeight, SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW) == TRUE);
} else {
m_screenWidth = m_width = config.video.windowedWidth;
@@ -193,6 +194,7 @@ bool DisplayWindowWindows::_resizeWindow()
windowRect.right = windowRect.left + config.video.windowedWidth - 1;
windowRect.bottom = windowRect.top + config.video.windowedHeight - 1 + m_heightOffset;
+ return true;
AdjustWindowRect( &windowRect, GetWindowLong( hWnd, GWL_STYLE ), GetMenu( hWnd ) != NULL );
return (SetWindowPos( hWnd, NULL, 0, 0, windowRect.right - windowRect.left + 1,
diff --git a/src/GraphicsDrawer.cpp b/src/GraphicsDrawer.cpp
index 09411430..139c4eb1 100644
--- a/src/GraphicsDrawer.cpp
+++ b/src/GraphicsDrawer.cpp
@@ -25,6 +25,10 @@
#include "VI.h"
#include "Log.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
using namespace graphics;
GraphicsDrawer::GraphicsDrawer()
@@ -78,7 +82,7 @@ void GraphicsDrawer::addTriangle(u32 _v0, u32 _v1, u32 _v2)
}
else if ((gSP.geometryMode & G_SHADING_SMOOTH) == 0) {
// Flat shading
- SPVertex & vtx0 = triangles.vertices[triangles.elements[firstIndex + (((RSP.w1 >> 24) & 3) % 3)]];
+ SPVertex & vtx0 = triangles.vertices[triangles.elements[firstIndex + (((RSP.words.w1 >> 24) & 3) % 3)]];
for (u32 i = firstIndex; i < triangles.num; ++i) {
SPVertex & vtx = triangles.vertices[triangles.elements[i]];
vtx.r = vtx.flat_r = vtx0.r;
@@ -888,7 +892,7 @@ void GraphicsDrawer::_drawThickLine(u32 _v0, u32 _v1, float _width)
}
else if ((gSP.geometryMode & G_SHADING_SMOOTH) == 0) {
// Flat shading
- SPVertex & vtx0 = triangles.vertices[_v0 + ((RSP.w1 >> 24) & 3)];
+ SPVertex & vtx0 = triangles.vertices[_v0 + ((RSP.words.w1 >> 24) & 3)];
SPVertex & vtx1 = triangles.vertices[_v0];
vtx1.r = vtx1.flat_r = vtx0.r;
vtx1.g = vtx1.flat_g = vtx0.g;
@@ -1104,7 +1108,11 @@ bool texturedRectDepthBufferCopy(const GraphicsDrawer::TexturedRectParams & _par
u16 * pSrc = reinterpret_cast(TMEM) + _params.s/32;
u16 *pDst = reinterpret_cast(RDRAM + gDP.colorImage.address);
for (u32 x = 0; x < width; ++x)
+#ifdef NATIVE
+ pDst[(ulx + x) ^ 1] = pSrc[x];
+#else
pDst[(ulx + x) ^ 1] = swapword(pSrc[x]);
+#endif
return true;
}
diff --git a/src/N64.cpp b/src/N64.cpp
index dc91c4cc..65efa4b6 100644
--- a/src/N64.cpp
+++ b/src/N64.cpp
@@ -1,12 +1,16 @@
#include "N64.h"
-u8 *HEADER;
+#ifndef NATIVE
+u8* HEADER;
u8 *DMEM;
u8 *IMEM;
+#endif
u64 TMEM[512];
+#ifndef NATIVE
u8 *RDRAM;
+#endif
-u32 RDRAMSize = 0;
+word RDRAMSize = 0;
N64Regs REG;
diff --git a/src/N64.h b/src/N64.h
index 2b2a650c..16627659 100644
--- a/src/N64.h
+++ b/src/N64.h
@@ -3,16 +3,28 @@
#include "Types.h"
+/*
+#ifdef NATIVE
+#define RDRAM_PTR(a) ((u8*)a)
+#else
+#define RDRAM_PTR(a) RDRAM[a]
+#endif
+*/
+
#define MI_INTR_DP 0x20 // Bit 5: DP intr
struct N64Regs
{
+#ifdef NATIVE
+ N64Regs();
+ ~N64Regs();
+#endif
u32 *MI_INTR;
- u32 *DPC_START;
- u32 *DPC_END;
- u32 *DPC_CURRENT;
- u32 *DPC_STATUS;
+ word *DPC_START;
+ word *DPC_END;
+ word *DPC_CURRENT;
+ word *DPC_STATUS;
u32 *DPC_CLOCK;
u32 *DPC_BUFBUSY;
u32 *DPC_PIPEBUSY;
@@ -38,11 +50,17 @@ struct N64Regs
extern N64Regs REG;
extern u8 *HEADER;
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#define DMEM ((u8*)0)
+#define IMEM ((u8*)0)
+#else
extern u8 *DMEM;
extern u8 *IMEM;
extern u8 *RDRAM;
+#endif
extern u64 TMEM[512];
-extern u32 RDRAMSize;
+extern word RDRAMSize;
extern bool ConfigOpen;
#endif
diff --git a/src/Native.cpp b/src/Native.cpp
new file mode 100644
index 00000000..3653a0fb
--- /dev/null
+++ b/src/Native.cpp
@@ -0,0 +1,155 @@
+#include "PluginAPI.h"
+#include "N64.h"
+#include "RSP.h"
+#include "Native.h"
+#include "GLideNUI-wtl/GLideNUI.h"
+#include "GLideN64.h"
+#include "Config.h"
+#include "DebugDump.h"
+#include "Config.h"
+#include "DisplayWindow.h"
+#include
+
+#define START_WIDTH 1280
+#define START_HEIGHT 720
+
+static u64 g_width = START_WIDTH;
+static u64 g_height = START_HEIGHT;
+
+extern "C" {
+ u64 gfx_width()
+ {
+ return g_width;
+ }
+
+ u64 gfx_height()
+ {
+ return g_height;
+ }
+}
+
+#ifdef WTL_UI
+void ConfigInit(void* hinst);
+void ConfigCleanup(void);
+#endif
+
+N64Regs::N64Regs() {
+MI_INTR = new u32;
+DPC_START = new word;
+DPC_END = new word;
+DPC_CURRENT = new word;
+DPC_STATUS = new word;
+DPC_CLOCK = new u32;
+DPC_BUFBUSY = new u32;
+DPC_PIPEBUSY = new u32;
+DPC_TMEM = new u32;
+VI_STATUS = new u32;
+VI_ORIGIN = new u32;
+VI_WIDTH = new u32;
+VI_INTR = new u32;
+VI_V_CURRENT_LINE = new u32;
+VI_TIMING = new u32;
+VI_V_SYNC = new u32;
+VI_H_SYNC = new u32;
+VI_LEAP = new u32;
+VI_H_START = new u32;
+VI_V_START = new u32;
+VI_V_BURST = new u32;
+VI_X_SCALE = new u32;
+VI_Y_SCALE = new u32;
+SP_STATUS = new u32;
+
+*MI_INTR = 0;
+*DPC_START = 0;
+*DPC_END = 0;
+*DPC_CURRENT = 0;
+*DPC_STATUS = 0;
+*DPC_CLOCK = 0;
+*DPC_BUFBUSY = 0;
+*DPC_PIPEBUSY = 0;
+*DPC_TMEM = 0;
+*VI_STATUS = 0;
+*VI_ORIGIN = 0;
+*VI_WIDTH = 320;
+*VI_INTR = 0;
+*VI_V_CURRENT_LINE = 0;
+*VI_TIMING = 0;
+*VI_V_SYNC = 0;
+*VI_H_SYNC = 0;
+*VI_LEAP = 0;
+*VI_H_START = 0;
+*VI_V_START = 0;
+*VI_V_BURST = 0;
+*VI_X_SCALE = 1024;
+*VI_Y_SCALE = 512;
+*SP_STATUS = 0;
+}
+
+N64Regs::~N64Regs() {
+}
+
+extern "C"
+{
+ void gfx_resize(long width, long height)
+ {
+ g_width = width;
+ g_height = height;
+ config.video.windowedWidth = g_width;
+ config.video.windowedHeight = g_height;
+ dwnd().setWindowSize(g_width, g_height);
+ (*REG.VI_ORIGIN)++;
+ }
+}
+
+void _CheckInterrupts() {
+}
+
+
+
+extern "C" {
+ void gfx_init(const char* romName, OSViMode* viMode) {
+ REG.VI_STATUS = &viMode->comRegs.ctrl;
+ REG.VI_WIDTH = &viMode->comRegs.width;
+ REG.VI_TIMING = &viMode->comRegs.burst;
+ REG.VI_V_SYNC = &viMode->comRegs.vSync;
+ REG.VI_H_SYNC = &viMode->comRegs.hSync;
+ REG.VI_LEAP = &viMode->comRegs.leap;
+ REG.VI_H_START = &viMode->comRegs.hStart;
+ REG.VI_X_SCALE = &viMode->comRegs.xScale;
+ REG.VI_V_CURRENT_LINE = &viMode->comRegs.vCurrent;
+
+ REG.VI_ORIGIN = &viMode->fldRegs->origin;
+ REG.VI_Y_SCALE = &viMode->fldRegs->yScale;
+ REG.VI_V_START = &viMode->fldRegs->vStart;
+ REG.VI_V_BURST = &viMode->fldRegs->vBurst;
+ REG.VI_INTR = &viMode->fldRegs->vIntr;
+
+ CheckInterrupts = _CheckInterrupts;
+
+ //StartDump(DEBUG_LOW | DEBUG_NORMAL | DEBUG_DETAIL | DEBUG_IGNORED | DEBUG_ERROR);
+
+ REG.VI_STATUS;
+ RDRAMSize = (word)-1;
+
+ api().RomOpen(romName);
+
+ config.frameBufferEmulation.enable = 0;
+ config.frameBufferEmulation.aspect = Config::aAdjust;
+
+ }
+
+ void gfx_shutdown() {
+ RDRAMSize = 0;
+ api().RomClosed();
+ }
+
+ void gfx_run(OSTask_t* task, u32 sz) {
+ if(sizeof(OSTask_t) != sz)
+ {
+ return;
+ }
+ RSP_ProcessDList(task->data_ptr, task->data_size, task->ucode_boot, task->ucode_data, task->ucode_size);
+ api().UpdateScreen();
+ //Sleep(30);
+ }
+}
\ No newline at end of file
diff --git a/src/Native.h b/src/Native.h
new file mode 100644
index 00000000..d31a8c6e
--- /dev/null
+++ b/src/Native.h
@@ -0,0 +1,61 @@
+#pragma once
+
+typedef struct {
+ /* 0x00 */ u32 ctrl;
+ /* 0x04 */ u32 width;
+ /* 0x08 */ u32 burst;
+ /* 0x0C */ u32 vSync;
+ /* 0x10 */ u32 hSync;
+ /* 0x14 */ u32 leap;
+ /* 0x18 */ u32 hStart;
+ /* 0x1C */ u32 xScale;
+ /* 0x20 */ u32 vCurrent;
+} OSViCommonRegs; // size = 0x20
+
+typedef struct {
+ /* 0x00 */ u32 origin;
+ /* 0x04 */ u32 yScale;
+ /* 0x08 */ u32 vStart;
+ /* 0x0C */ u32 vBurst;
+ /* 0x10 */ u32 vIntr;
+} OSViFieldRegs; // size = 0x14
+
+typedef struct {
+ /* 0x00 */ u8 type;
+ /* 0x04 */ OSViCommonRegs comRegs;
+ /* 0x24 */ OSViFieldRegs fldRegs[2];
+} OSViMode; // size = 0x4C
+
+typedef struct {
+ /* 0x00 */ u32 type;
+ /* 0x04 */ u32 flags;
+
+ /* 0x08 */ u64* ucode_boot;
+ /* 0x0C */ u32 ucode_boot_size;
+
+ /* 0x10 */ u64* ucode;
+ /* 0x14 */ u32 ucode_size;
+
+ /* 0x18 */ u64* ucode_data;
+ /* 0x1C */ u32 ucode_data_size;
+
+ /* 0x20 */ u64* dram_stack;
+ /* 0x24 */ u32 dram_stack_size;
+
+ /* 0x28 */ u64* output_buff;
+ /* 0x2C */ u64* output_buff_size;
+
+ /* 0x30 */ u64* data_ptr;
+ /* 0x34 */ u32 data_size;
+
+ /* 0x38 */ u64* yield_data_ptr;
+ /* 0x3C */ u32 yield_data_size;
+} OSTask_t; // size = 0x40
+
+extern "C" {
+ void gfx_init(const char* romName, OSViMode* viMode);
+ void gfx_shutdown();
+ void gfx_start_frame();
+ void gfx_end_frame();
+ void gfx_run(OSTask_t* task, u32 sz);
+}
\ No newline at end of file
diff --git a/src/Neon/RSP_LoadMatrixNeon.cpp b/src/Neon/RSP_LoadMatrixNeon.cpp
index 167e39a4..d5633424 100644
--- a/src/Neon/RSP_LoadMatrixNeon.cpp
+++ b/src/Neon/RSP_LoadMatrixNeon.cpp
@@ -3,7 +3,7 @@
#include "arm_neon.h"
#include "GBI.h"
-void RSP_LoadMatrix( f32 mtx[4][4], u32 address )
+void RSP_LoadMatrix( f32 mtx[4][4], word address )
{
f32 recip = FIXED2FLOATRECIP16;
diff --git a/src/PaletteTexture.cpp b/src/PaletteTexture.cpp
index 372f5659..218ebe9d 100644
--- a/src/PaletteTexture.cpp
+++ b/src/PaletteTexture.cpp
@@ -88,7 +88,11 @@ void PaletteTexture::update()
u32 * palette = (u32*)m_pbuf;
u16 *src = (u16*)&TMEM[256];
for (int i = 0; i < 256; ++i)
+#ifdef NATIVE
+ palette[i] = src[i * 4];
+#else
palette[i] = swapword(src[i * 4]);
+#endif
const FramebufferTextureFormats & fbTexFormats = gfxContext.getFramebufferTextureFormats();
Context::UpdateTextureDataParams params;
diff --git a/src/PluginAPI.h b/src/PluginAPI.h
index 4a0ae4aa..e7be440a 100644
--- a/src/PluginAPI.h
+++ b/src/PluginAPI.h
@@ -36,7 +36,7 @@ public:
void ProcessDList();
void ProcessRDPList();
void RomClosed();
- int RomOpen();
+ int RomOpen(const char* romName = nullptr);
void ShowCFB();
void UpdateScreen();
int InitiateGFX(const GFX_INFO & _gfxInfo);
diff --git a/src/RDP.cpp b/src/RDP.cpp
index 882011d8..b5f94572 100644
--- a/src/RDP.cpp
+++ b/src/RDP.cpp
@@ -11,225 +11,240 @@
#include "DebugDump.h"
#include "DisplayWindow.h"
-void RDP_Unknown( u32 w0, u32 w1 )
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
+#define SIGN_MASK(n) (1 << (12 - 1))
+
+#define SIGN12(a) \
+(a & SIGN_MASK(12) ? \
+(((1 << 12) / 2 - (a & (SIGN_MASK(12) - 1))) * -1) \
+: (a))
+
+void RDP_Unknown( const Gwords words )
{
DebugMsg(DEBUG_NORMAL, "RDP_Unknown\r\n");
- DebugMsg(DEBUG_NORMAL, "\tUnknown RDP opcode %02X\r\n", _SHIFTR(w0, 24, 8));
+ DebugMsg(DEBUG_NORMAL, "\tUnknown RDP opcode %02X\r\n", _SHIFTR(words.w0, 24, 8));
}
-void RDP_NoOp( u32 w0, u32 w1 )
+void RDP_NoOp( const Gwords words )
{
- gDPNoOp();
+ gDPNoOp(words);
}
-void RDP_SetCImg( u32 w0, u32 w1 )
-{
- gDPSetColorImage( _SHIFTR( w0, 21, 3 ), // fmt
- _SHIFTR( w0, 19, 2 ), // siz
- _SHIFTR( w0, 0, 12 ) + 1, // width
- w1 ); // img
+void RDP_MarkSegment(const Gwords words) {
+ RSP.translateSegment = true;
}
-void RDP_SetZImg( u32 w0, u32 w1 )
+void RDP_SetCImg( const Gwords words )
{
- gDPSetDepthImage( w1 ); // img
+ gDPSetColorImage( _SHIFTR( words.w0, 21, 3 ), // fmt
+ _SHIFTR( words.w0, 19, 2 ), // siz
+ _SHIFTR( words.w0, 0, 12 ) + 1, // width
+ words.w1 ); // img
}
-void RDP_SetTImg( u32 w0, u32 w1 )
+void RDP_SetZImg( const Gwords words )
{
- gDPSetTextureImage( _SHIFTR( w0, 21, 3), // fmt
- _SHIFTR( w0, 19, 2 ), // siz
- _SHIFTR( w0, 0, 12 ) + 1, // width
- w1 ); // img
+ gDPSetDepthImage( words.w1 ); // img
}
-void RDP_SetCombine( u32 w0, u32 w1 )
+void RDP_SetTImg( const Gwords words )
{
- gDPSetCombine( _SHIFTR( w0, 0, 24 ), // muxs0
- w1 ); // muxs1
+ gDPSetTextureImage( _SHIFTR( words.w0, 21, 3), // fmt
+ _SHIFTR( words.w0, 19, 2 ), // siz
+ _SHIFTR( words.w0, 0, 12 ) + 1, // width
+ words.w1 ); // img
}
-void RDP_SetEnvColor( u32 w0, u32 w1 )
+void RDP_SetCombine( const Gwords words )
{
- gDPSetEnvColor( _SHIFTR( w1, 24, 8 ), // r
- _SHIFTR( w1, 16, 8 ), // g
- _SHIFTR( w1, 8, 8 ), // b
- _SHIFTR( w1, 0, 8 ) ); // a
+ gDPSetCombine( _SHIFTR( words.w0, 0, 24 ), // muxs0
+ words.w1 ); // muxs1
}
-void RDP_SetPrimColor( u32 w0, u32 w1 )
+void RDP_SetEnvColor( const Gwords words )
{
- gDPSetPrimColor( _SHIFTR( w0, 8, 5 ), // m
- _SHIFTR( w0, 0, 8 ), // l
- _SHIFTR( w1, 24, 8 ), // r
- _SHIFTR( w1, 16, 8 ), // g
- _SHIFTR( w1, 8, 8 ), // b
- _SHIFTR( w1, 0, 8 ) ); // a
+ gDPSetEnvColor( _SHIFTR( words.w1, 24, 8 ), // r
+ _SHIFTR( words.w1, 16, 8 ), // g
+ _SHIFTR( words.w1, 8, 8 ), // b
+ _SHIFTR( words.w1, 0, 8 ) ); // a
+}
+
+void RDP_SetPrimColor( const Gwords words )
+{
+ gDPSetPrimColor( _SHIFTR( words.w0, 8, 5 ), // m
+ _SHIFTR( words.w0, 0, 8 ), // l
+ _SHIFTR( words.w1, 24, 8 ), // r
+ _SHIFTR( words.w1, 16, 8 ), // g
+ _SHIFTR( words.w1, 8, 8 ), // b
+ _SHIFTR( words.w1, 0, 8 ) ); // a
}
-void RDP_SetBlendColor( u32 w0, u32 w1 )
+void RDP_SetBlendColor( const Gwords words )
{
- gDPSetBlendColor( _SHIFTR( w1, 24, 8 ), // r
- _SHIFTR( w1, 16, 8 ), // g
- _SHIFTR( w1, 8, 8 ), // b
- _SHIFTR( w1, 0, 8 ) ); // a
+ gDPSetBlendColor( _SHIFTR( words.w1, 24, 8 ), // r
+ _SHIFTR( words.w1, 16, 8 ), // g
+ _SHIFTR( words.w1, 8, 8 ), // b
+ _SHIFTR( words.w1, 0, 8 ) ); // a
}
-void RDP_SetFogColor( u32 w0, u32 w1 )
+void RDP_SetFogColor( const Gwords words )
{
- gDPSetFogColor( _SHIFTR( w1, 24, 8 ), // r
- _SHIFTR( w1, 16, 8 ), // g
- _SHIFTR( w1, 8, 8 ), // b
- _SHIFTR( w1, 0, 8 ) ); // a
+ gDPSetFogColor( _SHIFTR( words.w1, 24, 8 ), // r
+ _SHIFTR( words.w1, 16, 8 ), // g
+ _SHIFTR( words.w1, 8, 8 ), // b
+ _SHIFTR( words.w1, 0, 8 ) ); // a
}
-void RDP_SetFillColor( u32 w0, u32 w1 )
+void RDP_SetFillColor( const Gwords words )
{
- gDPSetFillColor( w1 );
+ gDPSetFillColor( words.w1 );
}
-void RDP_FillRect( u32 w0, u32 w1 )
+void RDP_FillRect( const Gwords words )
{
- const u32 ulx = _SHIFTR(w1, 14, 10);
- const u32 uly = _SHIFTR(w1, 2, 10);
- const u32 lrx = _SHIFTR(w0, 14, 10);
- const u32 lry = _SHIFTR(w0, 2, 10);
+ const u32 ulx = _SHIFTR(words.w1, 14, 10);
+ const u32 uly = _SHIFTR(words.w1, 2, 10);
+ const u32 lrx = _SHIFTR(words.w0, 14, 10);
+ const u32 lry = _SHIFTR(words.w0, 2, 10);
if (lrx < ulx || lry < uly)
return;
gDPFillRectangle(ulx, uly, lrx, lry);
}
-void RDP_SetTile( u32 w0, u32 w1 )
+void RDP_SetTile( const Gwords words )
{
- gDPSetTile( _SHIFTR( w0, 21, 3 ), // fmt
- _SHIFTR( w0, 19, 2 ), // siz
- _SHIFTR( w0, 9, 9 ), // line
- _SHIFTR( w0, 0, 9 ), // tmem
- _SHIFTR( w1, 24, 3 ), // tile
- _SHIFTR( w1, 20, 4 ), // palette
- _SHIFTR( w1, 18, 2 ), // cmt
- _SHIFTR( w1, 8, 2 ), // cms
- _SHIFTR( w1, 14, 4 ), // maskt
- _SHIFTR( w1, 4, 4 ), // masks
- _SHIFTR( w1, 10, 4 ), // shiftt
- _SHIFTR( w1, 0, 4 ) ); // shifts
+ gDPSetTile( _SHIFTR( words.w0, 21, 3 ), // fmt
+ _SHIFTR( words.w0, 19, 2 ), // siz
+ _SHIFTR( words.w0, 9, 9 ), // line
+ _SHIFTR( words.w0, 0, 9 ), // tmem
+ _SHIFTR( words.w1, 24, 3 ), // tile
+ _SHIFTR( words.w1, 20, 4 ), // palette
+ _SHIFTR( words.w1, 18, 2 ), // cmt
+ _SHIFTR( words.w1, 8, 2 ), // cms
+ _SHIFTR( words.w1, 14, 4 ), // maskt
+ _SHIFTR( words.w1, 4, 4 ), // masks
+ _SHIFTR( words.w1, 10, 4 ), // shiftt
+ _SHIFTR( words.w1, 0, 4 ) ); // shifts
}
-void RDP_LoadTile( u32 w0, u32 w1 )
+void RDP_LoadTile( const Gwords words )
{
- gDPLoadTile( _SHIFTR( w1, 24, 3 ), // tile
- _SHIFTR( w0, 12, 12 ), // uls
- _SHIFTR( w0, 0, 12 ), // ult
- _SHIFTR( w1, 12, 12 ), // lrs
- _SHIFTR( w1, 0, 12 ) ); // lrt
+ gDPLoadTile( _SHIFTR( words.w1, 24, 3 ), // tile
+ _SHIFTR( words.w0, 12, 12 ), // uls
+ _SHIFTR( words.w0, 0, 12 ), // ult
+ _SHIFTR( words.w1, 12, 12 ), // lrs
+ _SHIFTR( words.w1, 0, 12 ) ); // lrt
}
static u32 lbw0, lbw1;
-void RDP_LoadBlock( u32 w0, u32 w1 )
+void RDP_LoadBlock( const Gwords words )
{
- lbw0 = w0;
- lbw1 = w1;
- gDPLoadBlock( _SHIFTR( w1, 24, 3 ), // tile
- _SHIFTR( w0, 12, 12 ), // uls
- _SHIFTR( w0, 0, 12 ), // ult
- _SHIFTR( w1, 12, 12 ), // lrs
- _SHIFTR( w1, 0, 12 ) ); // dxt
+ lbw0 = words.w0;
+ lbw1 = words.w1;
+ gDPLoadBlock( _SHIFTR( words.w1, 24, 3 ), // tile
+ _SHIFTR( words.w0, 12, 12 ), // uls
+ _SHIFTR( words.w0, 0, 12 ), // ult
+ _SHIFTR( words.w1, 12, 12 ), // lrs
+ _SHIFTR( words.w1, 0, 12 ) ); // dxt
}
void RDP_RepeatLastLoadBlock()
{
- RDP_LoadBlock(lbw0, lbw1);
+ RDP_LoadBlock(Gwords(lbw0, lbw1));
}
-void RDP_SetTileSize( u32 w0, u32 w1 )
+void RDP_SetTileSize( const Gwords words )
{
- gDPSetTileSize( _SHIFTR( w1, 24, 3 ), // tile
- _SHIFTR( w0, 12, 12 ), // uls
- _SHIFTR( w0, 0, 12 ), // ult
- _SHIFTR( w1, 12, 12 ), // lrs
- _SHIFTR( w1, 0, 12 ) ); // lrt
+ gDPSetTileSize( _SHIFTR( words.w1, 24, 3 ), // tile
+ _SHIFTR( words.w0, 12, 12 ), // uls
+ _SHIFTR( words.w0, 0, 12 ), // ult
+ _SHIFTR( words.w1, 12, 12 ), // lrs
+ _SHIFTR( words.w1, 0, 12 ) ); // lrt
}
-void RDP_LoadTLUT( u32 w0, u32 w1 )
+void RDP_LoadTLUT( const Gwords words )
{
- gDPLoadTLUT( _SHIFTR( w1, 24, 3 ), // tile
- _SHIFTR( w0, 12, 12 ), // uls
- _SHIFTR( w0, 0, 12 ), // ult
- _SHIFTR( w1, 12, 12 ), // lrs
- _SHIFTR( w1, 0, 12 ) ); // lrt
+ gDPLoadTLUT( _SHIFTR( words.w1, 24, 3 ), // tile
+ _SHIFTR( words.w0, 12, 12 ), // uls
+ _SHIFTR( words.w0, 0, 12 ), // ult
+ _SHIFTR( words.w1, 12, 12 ), // lrs
+ _SHIFTR( words.w1, 0, 12 ) ); // lrt
}
-void RDP_SetOtherMode( u32 w0, u32 w1 )
+void RDP_SetOtherMode( const Gwords words )
{
- gDPSetOtherMode( _SHIFTR( w0, 0, 24 ), // mode0
- w1 ); // mode1
+ gDPSetOtherMode( _SHIFTR( words.w0, 0, 24 ), // mode0
+ words.w1 ); // mode1
}
-void RDP_SetPrimDepth( u32 w0, u32 w1 )
+void RDP_SetPrimDepth( const Gwords words )
{
- gDPSetPrimDepth( _SHIFTR( w1, 16, 16 ), // z
- _SHIFTR( w1, 0, 16 ) ); // dz
+ gDPSetPrimDepth( _SHIFTR( words.w1, 16, 16 ), // z
+ _SHIFTR( words.w1, 0, 16 ) ); // dz
}
-void RDP_SetScissor( u32 w0, u32 w1 )
+void RDP_SetScissor( const Gwords words )
{
- gDPSetScissor( _SHIFTR( w1, 24, 2 ), // mode
- _SHIFTR( w0, 12, 12 ), // ulx
- _SHIFTR( w0, 0, 12 ), // uly
- _SHIFTR( w1, 12, 12 ), // lrx
- _SHIFTR( w1, 0, 12 ) ); // lry
+ gDPSetScissor( _SHIFTR( words.w1, 24, 2 ), // mode
+ _SHIFTR( words.w0, 12, 12 ), // ulx
+ _SHIFTR( words.w0, 0, 12 ), // uly
+ _SHIFTR( words.w1, 12, 12 ), // lrx
+ _SHIFTR( words.w1, 0, 12 ) ); // lry
}
-void RDP_SetConvert( u32 w0, u32 w1 )
+void RDP_SetConvert( const Gwords words )
{
- gDPSetConvert( _SHIFTR( w0, 13, 9 ), // k0
- _SHIFTR( w0, 4, 9 ), // k1
- _SHIFTL( w0, 5, 4 ) | _SHIFTR( w1, 27, 5 ), // k2
- _SHIFTR( w1, 18, 9 ), // k3
- _SHIFTR( w1, 9, 9 ), // k4
- _SHIFTR( w1, 0, 9 ) ); // k5
+ gDPSetConvert( _SHIFTR( words.w0, 13, 9 ), // k0
+ _SHIFTR( words.w0, 4, 9 ), // k1
+ _SHIFTL( words.w0, 5, 4 ) | _SHIFTR( words.w1, 27, 5 ), // k2
+ _SHIFTR( words.w1, 18, 9 ), // k3
+ _SHIFTR( words.w1, 9, 9 ), // k4
+ _SHIFTR( words.w1, 0, 9 ) ); // k5
}
-void RDP_SetKeyR( u32 w0, u32 w1 )
+void RDP_SetKeyR( const Gwords words )
{
- gDPSetKeyR( _SHIFTR( w1, 8, 8 ), // cR
- _SHIFTR( w1, 0, 8 ), // sR
- _SHIFTR( w1, 16, 12 ) ); // wR
+ gDPSetKeyR( _SHIFTR( words.w1, 8, 8 ), // cR
+ _SHIFTR( words.w1, 0, 8 ), // sR
+ _SHIFTR( words.w1, 16, 12 ) ); // wR
}
-void RDP_SetKeyGB( u32 w0, u32 w1 )
+void RDP_SetKeyGB( const Gwords words )
{
- gDPSetKeyGB( _SHIFTR( w1, 24, 8 ), // cG
- _SHIFTR( w1, 16, 8 ), // sG
- _SHIFTR( w0, 12, 12 ), // wG
- _SHIFTR( w1, 8, 8 ), // cB
- _SHIFTR( w1, 0, 8 ), // SB
- _SHIFTR( w0, 0, 12 ) ); // wB
+ gDPSetKeyGB( _SHIFTR( words.w1, 24, 8 ), // cG
+ _SHIFTR( words.w1, 16, 8 ), // sG
+ _SHIFTR( words.w0, 12, 12 ), // wG
+ _SHIFTR( words.w1, 8, 8 ), // cB
+ _SHIFTR( words.w1, 0, 8 ), // SB
+ _SHIFTR( words.w0, 0, 12 ) ); // wB
}
-void RDP_FullSync( u32 w0, u32 w1 )
+void RDP_FullSync( const Gwords words )
{
gDPFullSync();
}
-void RDP_TileSync( u32 w0, u32 w1 )
+void RDP_TileSync( const Gwords words )
{
gDPTileSync();
}
-void RDP_PipeSync( u32 w0, u32 w1 )
+void RDP_PipeSync( const Gwords words )
{
- gDPPipeSync();
+ gDPPipeSync(words);
}
-void RDP_LoadSync( u32 w0, u32 w1 )
+void RDP_LoadSync( const Gwords words )
{
gDPLoadSync();
}
static
-bool _getTexRectParams(u32 & w2, u32 & w3)
+bool _getTexRectParams(word & w2, word & w3)
{
if (RSP.LLE) {
w2 = RDP.w2;
@@ -243,8 +258,8 @@ bool _getTexRectParams(u32 & w2, u32 & w3)
halfTexRect
} texRectMode = gdpTexRect;
- const u32 cmd1 = (*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 0]) >> 24;
- const u32 cmd2 = (*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 8]) >> 24;
+ const word cmd1 = (*(word*)&RDRAM[RSP.PC[RSP.PCi] + 0]) >> 24;
+ const word cmd2 = (*(word*)&RDRAM[RSP.PC[RSP.PCi] + sizeof(Gwords)]) >> 24;
if (cmd1 == G_RDPHALF_1) {
if (cmd2 == G_RDPHALF_2)
texRectMode = gspTexRect;
@@ -255,34 +270,34 @@ bool _getTexRectParams(u32 & w2, u32 & w3)
switch (texRectMode) {
case gspTexRect:
- w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
- RSP.PC[RSP.PCi] += 8;
+ w2 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
- w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
- RSP.PC[RSP.PCi] += 8;
+ w3 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
break;
case gdpTexRect:
if ((config.generalEmulation.hacks & hack_WinBack) != 0) {
- RSP.PC[RSP.PCi] += 8;
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
return false;
}
{
- const u32 ucode = GBI.getMicrocodeType();
+ const word ucode = GBI.getMicrocodeType();
if (ucode == F5Rogue || ucode == F5Indi_Naboo) {
- w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 8];
- w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 12];
- RSP.PC[RSP.PCi] += 8;
+ w2 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 8];
+ w3 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 12];
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
return true;
}
}
- w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 0];
- w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
- RSP.PC[RSP.PCi] += 8;
+ w2 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 0];
+ w3 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
break;
case halfTexRect:
w2 = 0;
- w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
- RSP.PC[RSP.PCi] += 8;
+ w3 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
break;
default:
assert(false && "Unknown texrect mode");
@@ -291,17 +306,17 @@ bool _getTexRectParams(u32 & w2, u32 & w3)
}
static
-void _TexRect( u32 w0, u32 w1, bool flip )
+void _TexRect( const Gwords words, bool flip )
{
- u32 w2, w3;
+ word w2, w3;
if (!_getTexRectParams(w2, w3))
return;
- RDP.w0 = w0;
- RDP.w1 = w1;
- const s32 ulx = _SHIFTR(w1, 12, 12);
- const s32 uly = _SHIFTR(w1, 0, 12);
- const s32 lrx = _SHIFTR(w0, 12, 12);
- const s32 lry = _SHIFTR(w0, 0, 12);
+ RDP.w0 = words.w0;
+ RDP.w1 = words.w1;
+ const s32 ulx = SIGN12(_SHIFTR(words.w1, 12, 12));
+ const s32 uly = _SHIFTR(words.w1, 0, 12);
+ const s32 lrx = SIGN12(_SHIFTR(words.w0, 12, 12));
+ const s32 lry = _SHIFTR(words.w0, 0, 12);
if (lrx < ulx || lry < uly)
return;
if (gDP.otherMode.cycleType == G_CYC_COPY)
@@ -310,7 +325,7 @@ void _TexRect( u32 w0, u32 w1, bool flip )
f32(uly >> 2),
f32(lrx >> 2),
f32(lry >> 2),
- _SHIFTR(w1, 24, 3), // tile
+ _SHIFTR(words.w1, 24, 3), // tile
(s16)_SHIFTR(w2, 16, 16), // s
(s16)_SHIFTR(w2, 0, 16), // t
_FIXED2FLOAT((s16)_SHIFTR(w3, 16, 16), 10), // dsdx
@@ -322,7 +337,7 @@ void _TexRect( u32 w0, u32 w1, bool flip )
_FIXED2FLOAT(uly, 2),
_FIXED2FLOAT(lrx, 2),
_FIXED2FLOAT(lry, 2),
- _SHIFTR(w1, 24, 3), // tile
+ _SHIFTR(words.w1, 24, 3), // tile
(s16)_SHIFTR(w2, 16, 16), // s
(s16)_SHIFTR(w2, 0, 16), // t
_FIXED2FLOAT((s16)_SHIFTR(w3, 16, 16), 10), // dsdx
@@ -330,54 +345,54 @@ void _TexRect( u32 w0, u32 w1, bool flip )
flip);
}
-void RDP_TexRectFlip( u32 w0, u32 w1 )
+void RDP_TexRectFlip( const Gwords words )
{
- _TexRect(w0, w1, true);
+ _TexRect(words, true);
}
-void RDP_TexRect( u32 w0, u32 w1 )
+void RDP_TexRect( const Gwords words )
{
- _TexRect(w0, w1, false);
+ _TexRect(words, false);
}
-void RDP_TriFill( u32 _w0, u32 _w1 )
+void RDP_TriFill(const Gwords words)
{
- gDPTriFill(_w0, _w1);
+ gDPTriFill(words.w0, words.w1);
}
-void RDP_TriShade( u32 _w0, u32 _w1 )
+void RDP_TriShade(const Gwords words)
{
- gDPTriShade(_w0, _w1);
+ gDPTriShade(words.w0, words.w1);
}
-void RDP_TriTxtr( u32 _w0, u32 _w1 )
+void RDP_TriTxtr(const Gwords words)
{
- gDPTriTxtr(_w0, _w1);
+ gDPTriTxtr(words.w0, words.w1);
}
-void RDP_TriShadeTxtr( u32 _w0, u32 _w1 )
+void RDP_TriShadeTxtr(const Gwords words)
{
- gDPTriShadeTxtr(_w0, _w1);
+ gDPTriShadeTxtr(words.w0, words.w1);
}
-void RDP_TriFillZ( u32 _w0, u32 _w1 )
+void RDP_TriFillZ(const Gwords words)
{
- gDPTriFillZ(_w0, _w1);
+ gDPTriFillZ(words.w0, words.w1);
}
-void RDP_TriShadeZ( u32 _w0, u32 _w1 )
+void RDP_TriShadeZ(const Gwords words)
{
- gDPTriShadeZ(_w0, _w1);
+ gDPTriShadeZ(words.w0, words.w1);
}
-void RDP_TriTxtrZ( u32 _w0, u32 _w1 )
+void RDP_TriTxtrZ(const Gwords words)
{
- gDPTriTxtrZ(_w0, _w1);
+ gDPTriTxtrZ(words.w0, words.w1);
}
-void RDP_TriShadeTxtrZ( u32 _w0, u32 _w1 )
+void RDP_TriShadeTxtrZ(const Gwords words)
{
- gDPTriShadeTxtrZ(_w0, _w1);
+ gDPTriShadeTxtrZ(words.w0, words.w1);
}
RDPInfo RDP;
@@ -422,6 +437,9 @@ void RDP_Init()
GBI.cmd[G_TEXRECTFLIP] = RDP_TexRectFlip;
GBI.cmd[G_TEXRECT] = RDP_TexRect;
GBI.cmd[G_RDPNOOP] = RDP_NoOp;
+#ifdef NATIVE
+ GBI.cmd[G_MARK_SEGMENT] = RDP_MarkSegment;
+#endif
RDP.w0 = RDP.w1 = RDP.w2 = RDP.w3 = 0;
RDP.cmd_ptr = RDP.cmd_cur = 0;
@@ -522,8 +540,8 @@ const u32 CmdLength[64] =
void RDP_Half_1( u32 _c )
{
- u32 w0 = 0, w1 = _c;
- u32 cmd = _SHIFTR( _c, 24, 8 );
+ word w0 = 0, w1 = _c;
+ word cmd = _SHIFTR( _c, 24, 8 );
if (cmd >= 0xc8 && cmd <=0xcf) {//triangle command
DebugMsg(DEBUG_NORMAL, "gDPHalf_1 LLE Triangle\n");
RDP.cmd_ptr = 0;
@@ -532,41 +550,52 @@ void RDP_Half_1( u32 _c )
RDP.cmd_data[RDP.cmd_ptr++] = w1;
RSP_CheckDLCounter();
- w0 = *(u32*)&RDRAM[RSP.PC[RSP.PCi]];
- w1 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
+ w0 = *(word*)&RDRAM[RSP.PC[RSP.PCi]];
+ w1 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + 4];
RSP.cmd = _SHIFTR( w0, 24, 8 );
- DebugMsg(DEBUG_NORMAL, "0x%08lX: CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR(w0, 24, 8), w0, w1);
+ DebugMsg(DEBUG_NORMAL, "0x%08lX: CMD=0x%02lX w0=0x%08lX w1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR(w0, 24, 8), w0, w1);
- RSP.PC[RSP.PCi] += 8;
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
// RSP.nextCmd = _SHIFTR( *(u32*)&RDRAM[RSP.PC[RSP.PCi]], 24, 8 );
} while (RSP.cmd != 0xb3);
RDP.cmd_data[RDP.cmd_ptr++] = w1;
RSP.cmd = (RDP.cmd_data[RDP.cmd_cur] >> 24) & 0x3f;
w0 = RDP.cmd_data[RDP.cmd_cur+0];
w1 = RDP.cmd_data[RDP.cmd_cur+1];
- LLEcmd[RSP.cmd](w0, w1);
+ LLEcmd[RSP.cmd](Gwords(w0, w1));
LLETriangle::get().flush(cmd);
} else {
DebugMsg(DEBUG_NORMAL | DEBUG_IGNORED, "gDPHalf_1()\n");
}
}
+#ifdef NATIVE
+#define rdram ((u32*)0)
+#define rsp_dmem ((u32*)0)
+#else
#define rdram ((u32*)RDRAM)
#define rsp_dmem ((u32*)DMEM)
+#endif
-#define dp_start (*(u32*)REG.DPC_START)
-#define dp_end (*(u32*)REG.DPC_END)
-#define dp_current (*(u32*)REG.DPC_CURRENT)
-#define dp_status (*(u32*)REG.DPC_STATUS)
+#define dp_start (*(word*)REG.DPC_START)
+#define dp_end (*(word*)REG.DPC_END)
+#define dp_current (*(word*)REG.DPC_CURRENT)
+#define dp_status (*(word*)REG.DPC_STATUS)
-inline u32 READ_RDP_DATA(u32 address)
+#ifdef NATIVE
+inline u32 READ_RDP_DATA(word address) {
+ return rsp_dmem[(address & 0xfff) >> 2];
+}
+#else
+inline u32 READ_RDP_DATA(word address)
{
if (dp_status & 0x1) // XBUS_DMEM_DMA enabled
return rsp_dmem[(address & 0xfff)>>2];
else
return rdram[(address & 0xffffff)>>2];
}
+#endif
void RDP_ProcessRDPList()
{
@@ -590,7 +619,7 @@ void RDP_ProcessRDPList()
bool setZero = true;
while (RDP.cmd_cur != RDP.cmd_ptr) {
- u32 cmd = (RDP.cmd_data[RDP.cmd_cur] >> 24) & 0x3f;
+ word cmd = (RDP.cmd_data[RDP.cmd_cur] >> 24) & 0x3f;
if ((((RDP.cmd_ptr - RDP.cmd_cur)&maxCMDMask) * 4) < CmdLength[cmd]) {
setZero = false;
@@ -607,10 +636,10 @@ void RDP_ProcessRDPList()
RDP.w3 = RDP.cmd_data[RDP.cmd_cur + 3];
RSP.cmd = cmd;
#ifdef DEBUG_DUMP
- DebugMsg(DEBUG_LOW, "CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", cmd, RDP.w0, RDP.w1);
+ DebugMsg(DEBUG_LOW, "CMD=0x%02lX words.w0=0x%08lX words.w1=0x%08lX\n", cmd, RDP.w0, RDP.w1);
#endif
LLETriangle::get().flush(cmd);
- LLEcmd[cmd](RDP.w0, RDP.w1);
+ LLEcmd[cmd](Gwords(RDP.w0, RDP.w1));
RDP.cmd_cur = (RDP.cmd_cur + CmdLength[cmd] / 4) & maxCMDMask;
}
diff --git a/src/RDP.h b/src/RDP.h
index 992548c7..05c97962 100644
--- a/src/RDP.h
+++ b/src/RDP.h
@@ -6,24 +6,24 @@ const unsigned int maxCMDMask = MAXCMD - 1;
typedef struct
{
- u32 w0, w1, w2, w3;
- u32 cmd_ptr;
- u32 cmd_cur;
- u32 cmd_data[MAXCMD + 32];
+ word w0, w1, w2, w3;
+ word cmd_ptr;
+ word cmd_cur;
+ word cmd_data[MAXCMD + 32];
} RDPInfo;
extern RDPInfo RDP;
void RDP_Init();
void RDP_Half_1(u32 _c);
-void RDP_TexRect(u32 w0, u32 w1);
+void RDP_TexRect(const Gwords words);
void RDP_ProcessRDPList();
void RDP_RepeatLastLoadBlock();
-void RDP_SetScissor(u32 w0, u32 w1);
-void RDP_SetTImg(u32 w0, u32 w1);
-void RDP_LoadBlock(u32 w0, u32 w1);
-void RDP_SetTile(u32 w0, u32 w1);
-void RDP_SetTileSize(u32 w0, u32 w1);
+void RDP_SetScissor(const Gwords words);
+void RDP_SetTImg(const Gwords words);
+void RDP_LoadBlock(const Gwords words);
+void RDP_SetTile(const Gwords words);
+void RDP_SetTileSize(const Gwords words);
#endif
diff --git a/src/RSP.cpp b/src/RSP.cpp
index 40aa8b8b..c1f2bf34 100644
--- a/src/RSP.cpp
+++ b/src/RSP.cpp
@@ -18,6 +18,10 @@
#include "TextureFilterHandler.h"
#include "DisplayWindow.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
using namespace std;
#define SP_STATUS_HALT 0x0001
@@ -30,7 +34,8 @@ static
void _ProcessDList()
{
while (!RSP.halt) {
- if ((RSP.PC[RSP.PCi] + 8) > RDRAMSize) {
+#ifndef NATIVE
+ if ((RSP.PC[RSP.PCi] + sizeof(Gwords)) > RDRAMSize) {
#ifdef DEBUG_DUMP
if ((config.debug.dumpMode & DEBUG_DETAIL) != 0)
DebugMsg(DEBUG_DETAIL | DEBUG_ERROR, "// Attempting to execute RSP command at invalid RDRAM location\n");
@@ -41,22 +46,27 @@ void _ProcessDList()
#endif
break;
}
-
- RSP.w0 = *(u32*)&RDRAM[RSP.PC[RSP.PCi]];
- RSP.w1 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
- RSP.cmd = _SHIFTR(RSP.w0, 24, 8);
-
-#ifdef DEBUG_DUMP
- DebugMsg(DEBUG_LOW, "0x%08lX: CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR(RSP.w0, 24, 8), RSP.w0, RSP.w1);
#endif
- RSP.PC[RSP.PCi] += 8;
- u32 pci = RSP.PCi;
+#ifdef NATIVE
+ RSP.words = *(Gwords*)(RSP.PC[RSP.PCi]);
+ RSP.cmd = _SHIFTR(RSP.words.w0, 24, 8);
+#else
+ RSP.words = *(Gwords*)&RDRAM[RSP.PC[RSP.PCi]];
+ RSP.cmd = _SHIFTR(RSP.words.w0, 24, 8);
+#endif
+
+#ifdef DEBUG_DUMP
+ DebugMsg(DEBUG_LOW, "0x%08lX: CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR(RSP.words.w0, 24, 8), RSP.words.w0, RSP.words.w1);
+#endif
+
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
+ auto pci = RSP.PCi;
if (RSP.count == 1)
--pci;
- RSP.nextCmd = _SHIFTR(*(u32*)&RDRAM[RSP.PC[pci]], 24, 8);
+ RSP.nextCmd = _SHIFTR(*(word*)&RDRAM[RSP.PC[pci]], 24, 8);
- GBI.cmd[RSP.cmd](RSP.w0, RSP.w1);
+ GBI.cmd[RSP.cmd](RSP.words);
RSP_CheckDLCounter();
}
}
@@ -65,32 +75,34 @@ static
void _ProcessDListFactor5()
{
// Lemmy's note: read first 64 bits of this dlist
- RSP.F5DL[0] = _SHIFTR(*(u32*)&RDRAM[RSP.PC[0]], 0, 24);
- RSP.PC[0] += 8;
+ RSP.F5DL[0] = _SHIFTR(*(word*)&RDRAM[RSP.PC[0]], 0, 24);
+ RSP.PC[0] += sizeof(Gwords);
+#ifndef NATIVE
static u32 vAddrToClear[7] = { 0x11C >> 2, 0x120 >> 2, 0x124 >> 2, 0x37C >> 2,
0x58C >> 2, 0x5B0 >> 2, 0x5B4 >> 2};
- u32 * pDmem32 = reinterpret_cast(DMEM);
+ word * pDmem32 = reinterpret_cast(DMEM);
for (u32 i = 0; i < 7; ++i)
pDmem32[vAddrToClear[i]] = 0U;
+#endif
while (!RSP.halt) {
- if ((RSP.PC[RSP.PCi] + 8) > RDRAMSize) {
+ if ((RSP.PC[RSP.PCi] + sizeof(Gwords)) > RDRAMSize) {
break;
}
- RSP.w0 = *(u32*)&RDRAM[RSP.PC[RSP.PCi]];
- RSP.w1 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
- RSP.cmd = _SHIFTR(RSP.w0, 24, 8);
+ RSP.words.w0 = *(word*)&RDRAM[RSP.PC[RSP.PCi]];
+ RSP.words.w1 = *(word*)&RDRAM[RSP.PC[RSP.PCi] + sizeof(word)];
+ RSP.cmd = _SHIFTR(RSP.words.w0, 24, 8);
#ifdef DEBUG_DUMP
- DebugMsg(DEBUG_LOW, "0x%08lX: CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR(RSP.w0, 24, 8), RSP.w0, RSP.w1);
+ DebugMsg(DEBUG_LOW, "0x%08lX: CMD=0x%02lX W0=0x%08lX W1=0x%08lX\n", RSP.PC[RSP.PCi], _SHIFTR(RSP.words.w0, 24, 8), RSP.words.w0, RSP.words.w1);
#endif
- RSP.nextCmd = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 8], 24, 8);
+ RSP.nextCmd = _SHIFTR(*(word*)&RDRAM[RSP.PC[RSP.PCi] + sizeof(Gwords)], 24, 8);
- GBI.cmd[RSP.cmd](RSP.w0, RSP.w1);
- RSP.PC[RSP.PCi] += 8;
+ GBI.cmd[RSP.cmd](RSP.words);
+ RSP.PC[RSP.PCi] += sizeof(Gwords);
RSP_CheckDLCounter();
}
}
@@ -107,10 +119,14 @@ void RSP_CheckDLCounter()
}
}
-void RSP_ProcessDList()
+void RSP_ProcessDList(void* displayList, word displayListLength, void* uc_start, void* uc_dstart, word uc_dsize, u32 matrixStackSize, void* ZSortBOSS_pc)
{
RSP.LLE = false;
+ if (displayList == nullptr) {
+ return;
+ }
+
if (ConfigOpen || dwnd().isResizeWindow()) {
*REG.MI_INTR |= MI_INTR_DP;
CheckInterrupts();
@@ -126,14 +142,16 @@ void RSP_ProcessDList()
dwnd().updateScale();
}
- RSP.PC[0] = *(u32*)&DMEM[0x0FF0];
+ RSP.PC[0] = (word)displayList;
RSP.PCi = 0;
RSP.count = -1;
RSP.halt = false;
RSP.busy = true;
- gSP.matrix.stackSize = min( 32U, *(u32*)&DMEM[0x0FE4] >> 6 );
+
+ gSP.matrix.stackSize = min(32U, matrixStackSize >> 6);
+
if (gSP.matrix.stackSize == 0)
gSP.matrix.stackSize = 32;
gSP.matrix.modelViewi = 0;
@@ -146,22 +164,23 @@ void RSP_ProcessDList()
gDPSetTexturePersp(G_TP_PERSP);
// Get the start of the display list and the length of it
- const u32 dlist_start = *(u32*)(DMEM + 0xFF0);
- const u32 dlist_length = *(u32*)(DMEM + 0xFF4);
+ const word dlist_start = *(word*)displayList;
+ const word dlist_length = displayListLength;
+
DebugMsg(DEBUG_NORMAL, "--- NEW DLIST --- ucode: %d, fbuf: %08lx, fbuf_width: %d, dlist start: %08lx, dlist_length: %d, x_scale: %f, y_scale: %f\n",
GBI.getMicrocodeType(), *REG.VI_ORIGIN, *REG.VI_WIDTH, dlist_start, dlist_length, (*REG.VI_X_SCALE & 0xFFF) / 1024.0f, (*REG.VI_Y_SCALE & 0xFFF) / 1024.0f);
- u32 uc_start = *(u32*)&DMEM[0x0FD0];
- u32 uc_dstart = *(u32*)&DMEM[0x0FD8];
- u32 uc_dsize = *(u32*)&DMEM[0x0FDC];
-
- if ((uc_start != RSP.uc_start) || (uc_dstart != RSP.uc_dstart))
- gSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize);
+ if (((word)uc_start != RSP.uc_start) || ((word)uc_dstart != RSP.uc_dstart))
+ gSPLoadUcodeEx((word)uc_start, (word)uc_dstart, uc_dsize);
depthBufferList().setCleared(false);
if (GBI.getMicrocodeType() == ZSortBOSS) {
- RSP.PC[1] = *(u32*)&DMEM[0xff8];
+#ifdef NATIVE
+ RSP.PC[1] = (word)ZSortBOSS_pc;
+#else
+ RSP.PC[1] = *(word*)&DMEM[0xff8];
+#endif
*REG.SP_STATUS &= ~0x300; // clear sig1 | sig2
*REG.SP_STATUS |= 0x800; // set sig4
}
@@ -202,6 +221,12 @@ void RSP_ProcessDList()
gDP.changed |= CHANGED_COLORBUFFER;
}
+void RSP_ProcessDList() {
+ RSP_ProcessDList((void*)*(word*)&DMEM[0x0FF0], *(word*)(DMEM + 0xFF4), (void*)*(word*)&DMEM[0x0FD0],
+ (void*)*(word*)&DMEM[0x0FD8], *(word*)&DMEM[0x0FDC], *(u32*)&DMEM[0x0FE4],
+ (void*)*(word*)&DMEM[0xff8]);
+}
+
static
void RSP_SetDefaultState()
{
@@ -246,10 +271,11 @@ void setDepthClearColor()
DepthClearColor = 0xFFFCFFFC;
}
-void RSP_Init()
+
+void RSP_Init(const char* romName)
{
if (RDRAMSize == 0) {
-#ifdef OS_WINDOWS
+#if defined(OS_WINDOWS) && !defined(NATIVE)
// Calculate RDRAM size by intentionally causing an access violation
u32 test;
try
@@ -273,6 +299,13 @@ void RSP_Init()
RSP.LLE = false;
RSP.infloop = false;
+#ifdef NATIVE
+ RSP.translateSegment = false;
+#endif
+
+#ifdef NATIVE
+ const char* romname = romName;
+#else
// get the name of the ROM
char romname[21];
for (int i = 0; i < 20; ++i)
@@ -282,6 +315,7 @@ void RSP_Init()
// remove all trailing spaces
while (romname[strlen(romname) - 1] == ' ')
romname[strlen(romname) - 1] = 0;
+#endif
if (strcmp(RSP.romname, romname) != 0)
TFH.shutdown();
diff --git a/src/RSP.h b/src/RSP.h
index d9c58010..95ce6af5 100644
--- a/src/RSP.h
+++ b/src/RSP.h
@@ -4,15 +4,20 @@
#include "Types.h"
#include "N64.h"
+#define MAX_SEGMENTS 16
+
typedef struct
{
- u32 PC[18], PCi;
- u32 F5DL[10];
- u32 uc_start, uc_dstart, cmd, nextCmd;
- u32 w0, w1;
+ word PC[18], PCi;
+ word F5DL[10];
+ word uc_start, uc_dstart, cmd, nextCmd;
+ Gwords words;
s32 count;
bool busy, halt, infloop;
bool LLE;
+#ifdef NATIVE
+ bool translateSegment;
+#endif
char romname[21];
wchar_t pluginpath[PLUGIN_PATH_SIZE];
} RSPInfo;
@@ -22,11 +27,26 @@ extern RSPInfo RSP;
extern u32 DepthClearColor;
extern u32 rectDepthBufferCopyFrame;
-#define RSP_SegmentToPhysical( segaddr ) ((gSP.segment[(segaddr >> 24) & 0x0F] + (segaddr & RDRAMSize)) & RDRAMSize)
+#ifdef NATIVE
+//#define RSP_SegmentToPhysical( segaddr ) ((segaddr < (16 << 24)) ? ((gSP.segment[(segaddr >> 24) & 0x0F] + segaddr)) : segaddr)
+//#define RSP_SegmentToPhysical( segaddr ) ((RSP_SegmentToPhysical2(segaddr) & 0x00FFFF00) != 0 ? segaddr : ((gSP.segment[(segaddr >> 24) & 0x0F] + segaddr)))
+//#define RSP_SegmentToPhysical(segaddr) (segaddr)
-void RSP_Init();
+word RSP_SegmentToPhysical(word segaddr);
+#define SEGMENT_MASK(addr) (addr)
+
+#else
+#define SEGMENT_MASK(addr) (addr & 0x00FFFFFF)
+#define RSP_SegmentToPhysical( segaddr ) ((gSP.segment[(segaddr >> 24) & 0x0F] + (segaddr & RDRAMSize)) & RDRAMSize)
+#endif
+
+void RSP_Init(const char* romName = nullptr);
+
+void RSP_ProcessDList(void* displayList, word displayListLength, void* uc_start, void* uc_dstart, word uc_dsize, u32 matrixStackSize = 0, void* ZSortBOSS_pc = nullptr);
void RSP_ProcessDList();
-void RSP_LoadMatrix( f32 mtx[4][4], u32 address );
+
+
+void RSP_LoadMatrix( f32 mtx[4][4], word address );
void RSP_CheckDLCounter();
#endif
diff --git a/src/RSP_LoadMatrix.cpp b/src/RSP_LoadMatrix.cpp
index 90189c02..557ac4a7 100644
--- a/src/RSP_LoadMatrix.cpp
+++ b/src/RSP_LoadMatrix.cpp
@@ -1,7 +1,9 @@
#include "RSP.h"
#include "3DMath.h"
-void RSP_LoadMatrix( f32 mtx[4][4], u32 address )
+#define ENDIAN_BIT_SWAP 0
+
+void RSP_LoadMatrix( f32 mtx[4][4], word address )
{
struct _N64Matrix
{
@@ -9,7 +11,13 @@ void RSP_LoadMatrix( f32 mtx[4][4], u32 address )
u16 fraction[4][4];
} *n64Mat = (struct _N64Matrix *)&RDRAM[address];
+#ifdef NATIVE2
for (u32 i = 0; i < 4; i++)
for (u32 j = 0; j < 4; j++)
- mtx[i][j] = GetFloatMatrixElement(n64Mat->integer[i][j ^ 1], n64Mat->fraction[i][j ^ 1]);
+ mtx[i][j] = GetFloatMatrixElement(n64Mat->integer[i][j], n64Mat->fraction[i][j]);
+#else
+ for (u32 i = 0; i < 4; i++)
+ for (u32 j = 0; j < 4; j++)
+ mtx[i][j] = GetFloatMatrixElement(n64Mat->integer[i][j ^ ENDIAN_BIT_SWAP], n64Mat->fraction[i][j ^ ENDIAN_BIT_SWAP]);
+#endif
}
diff --git a/src/RSP_LoadMatrixX86.cpp b/src/RSP_LoadMatrixX86.cpp
index 2ee25ec7..f7837fb9 100644
--- a/src/RSP_LoadMatrixX86.cpp
+++ b/src/RSP_LoadMatrixX86.cpp
@@ -2,7 +2,7 @@
#include "RSP.h"
#include "GBI.h"
-void RSP_LoadMatrix( f32 mtx[4][4], u32 address )
+void RSP_LoadMatrix( f32 mtx[4][4], word address )
{
f32 recip = FIXED2FLOATRECIP16;
#if defined (WIN32_ASM)
diff --git a/src/TexrectDrawer.cpp b/src/TexrectDrawer.cpp
index a7afe6bd..a0f7b809 100644
--- a/src/TexrectDrawer.cpp
+++ b/src/TexrectDrawer.cpp
@@ -115,7 +115,7 @@ void TexrectDrawer::_setDrawBuffer()
frameBufferList().setCurrentDrawBuffer();
}
-TexrectDrawer::iRect TexrectDrawer::_getiRect(u32 w0, u32 w1) const
+TexrectDrawer::iRect TexrectDrawer::_getiRect(word w0, word w1) const
{
iRect rect;
rect.ulx = _SHIFTR(w1, 12, 12);
@@ -141,9 +141,9 @@ bool TexrectDrawer::_lookAhead(bool _checkCoordinates) const
return true;
}
- auto sideBySide = [&](u32 pc) ->bool {
- const u32 w0 = *(u32*)&RDRAM[pc];
- const u32 w1 = *(u32*)&RDRAM[pc + 4];
+ auto sideBySide = [&](word pc) ->bool {
+ const word w0 = *(word*)&RDRAM[pc];
+ const word w1 = *(word*)&RDRAM[pc + sizeof(word)];
const iRect nextRect = _getiRect(w0, w1);
if (COMPARE_COORDS(m_curRect.ulx, nextRect.ulx)) {
diff --git a/src/TexrectDrawer.h b/src/TexrectDrawer.h
index e62ff606..e9fbecb0 100644
--- a/src/TexrectDrawer.h
+++ b/src/TexrectDrawer.h
@@ -49,7 +49,7 @@ private:
struct iRect {
s32 ulx = 0, uly = 0, lrx = 0, lry = 0;
};
- iRect _getiRect(u32 w0, u32 w1) const;
+ iRect _getiRect(word w0, word w1) const;
iRect m_curRect;
};
diff --git a/src/Textures.cpp b/src/Textures.cpp
index 828a5bcc..c6e8af85 100644
--- a/src/Textures.cpp
+++ b/src/Textures.cpp
@@ -21,6 +21,10 @@
#include "Graphics/Parameters.h"
#include "DisplayWindow.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
using namespace std;
using namespace graphics;
@@ -1092,8 +1096,13 @@ void TextureCache::_getTextureDestData(CachedTexture& tmptex,
tx = min(x, clampSClamp) & maskSMask;
u32 taddr = ((tline + tx) ^ xorval) & 0x3ff;
+#ifdef NATIVE
+ gr = tmem16[taddr];
+ ab = tmem16[taddr | 0x400];
+#else
gr = swapword(tmem16[taddr]);
ab = swapword(tmem16[taddr | 0x400]);
+#endif
pDest[j++] = (ab << 16) | gr;
}
}
diff --git a/src/Types.h b/src/Types.h
index ed1130bd..6899b1f2 100644
--- a/src/Types.h
+++ b/src/Types.h
@@ -61,4 +61,43 @@ private:
T m_val;
};
+#include "porting.h"
+
+struct Gwords {
+ Gwords();
+ Gwords(word _w0, word _w1);
+
+ word w0;
+ word w1;
+#ifdef EXTENDED_GFX
+ word w2;
+ word w3;
+
+ Gwords(word _w0, word _w1, word _w2, word _w3);
+#endif
+};
+
+#ifdef EXTENDED_GFX
+static_assert(sizeof(Gwords) == sizeof(word) * 4, "Gwords is incorrect size");
+#else
+static_assert(sizeof(Gwords) == sizeof(word) * 2, "Gwords is incorrect size");
+#endif
+
+struct RGBA8
+{
+#ifdef NATIVE
+ u8 a;
+ u8 b;
+ u8 g;
+ u8 r;
+#else
+ u8 r;
+ u8 g;
+ u8 b;
+ u8 a;
+#endif
+};
+
+static_assert(sizeof(RGBA8) == 4);
+
#endif // TYPES_H
diff --git a/src/VI.cpp b/src/VI.cpp
index 6a8719e2..8239eff9 100644
--- a/src/VI.cpp
+++ b/src/VI.cpp
@@ -32,6 +32,10 @@ u16 VI_GetMaxBufferHeight(u16 _width)
void VI_UpdateSize()
{
+#ifdef NATIVE2
+ VI.width = 320;
+ VI.height = 240;
+#else
const f32 xScale = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 0, 12 ), 10 );
// f32 xOffset = _FIXED2FLOAT( _SHIFTR( *REG.VI_X_SCALE, 16, 12 ), 10 );
@@ -94,6 +98,7 @@ void VI_UpdateSize()
depthBufferList().destroy();
depthBufferList().init();
}
+#endif
VI.rwidth = VI.width != 0 ? 1.0f / VI.width : 0.0f;
VI.rheight = VI.height != 0 ? 1.0f / VI.height : 0.0f;
diff --git a/src/ZilmarGFX_1_3.h b/src/ZilmarGFX_1_3.h
index f1cde0f1..3d41a619 100644
--- a/src/ZilmarGFX_1_3.h
+++ b/src/ZilmarGFX_1_3.h
@@ -19,6 +19,10 @@ the plugin
#ifndef _GFX_H_INCLUDED__
#define _GFX_H_INCLUDED__
+#ifndef word
+#include "porting.h"
+#endif
+
#if defined(__cplusplus)
extern "C" {
#endif
@@ -56,36 +60,38 @@ typedef struct {
// eg. the first 8 bytes are stored like this:
// 4 3 2 1 8 7 6 5
+#ifndef NATIVE
unsigned char * HEADER; /* This is the rom header (first 40h bytes of the rom) */
unsigned char * RDRAM;
unsigned char * DMEM;
unsigned char * IMEM;
+#endif
- unsigned int * MI_INTR_REG;
+ word * MI_INTR_REG;
- unsigned int * DPC_START_REG;
- unsigned int * DPC_END_REG;
- unsigned int * DPC_CURRENT_REG;
- unsigned int * DPC_STATUS_REG;
- unsigned int * DPC_CLOCK_REG;
- unsigned int * DPC_BUFBUSY_REG;
- unsigned int * DPC_PIPEBUSY_REG;
- unsigned int * DPC_TMEM_REG;
+ word * DPC_START_REG;
+ word * DPC_END_REG;
+ word * DPC_CURRENT_REG;
+ word * DPC_STATUS_REG;
+ word * DPC_CLOCK_REG;
+ word * DPC_BUFBUSY_REG;
+ word * DPC_PIPEBUSY_REG;
+ word * DPC_TMEM_REG;
- unsigned int * VI_STATUS_REG;
- unsigned int * VI_ORIGIN_REG;
- unsigned int * VI_WIDTH_REG;
- unsigned int * VI_INTR_REG;
- unsigned int * VI_V_CURRENT_LINE_REG;
- unsigned int * VI_TIMING_REG;
- unsigned int * VI_V_SYNC_REG;
- unsigned int * VI_H_SYNC_REG;
- unsigned int * VI_LEAP_REG;
- unsigned int * VI_H_START_REG;
- unsigned int * VI_V_START_REG;
- unsigned int * VI_V_BURST_REG;
- unsigned int * VI_X_SCALE_REG;
- unsigned int * VI_Y_SCALE_REG;
+ word * VI_STATUS_REG;
+ word * VI_ORIGIN_REG;
+ word * VI_WIDTH_REG;
+ word * VI_INTR_REG;
+ word * VI_V_CURRENT_LINE_REG;
+ word * VI_TIMING_REG;
+ word * VI_V_SYNC_REG;
+ word * VI_H_SYNC_REG;
+ word * VI_LEAP_REG;
+ word * VI_H_START_REG;
+ word * VI_V_START_REG;
+ word * VI_V_BURST_REG;
+ word * VI_X_SCALE_REG;
+ word * VI_Y_SCALE_REG;
void (*CheckInterrupts)( void );
} GFX_INFO;
diff --git a/src/common/CommonAPIImpl_common.cpp b/src/common/CommonAPIImpl_common.cpp
index 8e4f6728..79f07448 100644
--- a/src/common/CommonAPIImpl_common.cpp
+++ b/src/common/CommonAPIImpl_common.cpp
@@ -157,8 +157,10 @@ void PluginAPI::ProcessDList()
#ifdef RSPTHREAD
_callAPICommand(ProcessDListCommand());
#else
+#ifndef NATIVE
RSP_ProcessDList();
#endif
+#endif
}
void PluginAPI::ProcessRDPList()
@@ -196,7 +198,7 @@ void PluginAPI::RomClosed()
osal_keys_quit();
}
-int PluginAPI::RomOpen()
+int PluginAPI::RomOpen(const char* romName)
{
osal_keys_init();
@@ -208,7 +210,8 @@ int PluginAPI::RomOpen()
m_pluginThreadCv.wait(m_pluginThreadMtx);
m_pluginThreadMtx.unlock();
#else
- RSP_Init();
+
+ RSP_Init(romName);
GBI.init();
Config_LoadConfig();
if (!dwnd().start())
@@ -236,10 +239,12 @@ void PluginAPI::UpdateScreen()
}
void PluginAPI::_initiateGFX(const GFX_INFO & _gfxInfo) const {
- HEADER = _gfxInfo.HEADER;
+#ifndef NATIVE
+ HEADER = _gfxInfo.HEADER;
DMEM = _gfxInfo.DMEM;
IMEM = _gfxInfo.IMEM;
RDRAM = _gfxInfo.RDRAM;
+#endif
REG.MI_INTR = _gfxInfo.MI_INTR_REG;
REG.DPC_START = _gfxInfo.DPC_START_REG;
diff --git a/src/convert.cpp b/src/convert.cpp
index 137c33d5..8284cdeb 100644
--- a/src/convert.cpp
+++ b/src/convert.cpp
@@ -1,4 +1,5 @@
#include "convert.h"
+#include
const volatile unsigned char Five2Eight[32] =
{
@@ -99,10 +100,13 @@ const volatile unsigned char One2Eight[2] =
255, // 1 = 11111111
};
-void UnswapCopyWrap(const u8 *src, u32 srcIdx, u8 *dest, u32 destIdx, u32 destMask, u32 numBytes)
+void UnswapCopyWrap(const u8 *src, word srcIdx, u8 *dest, word destIdx, word destMask, word numBytes)
{
+#ifdef NATIVE
+ memcpy(dest + destIdx, src + srcIdx, numBytes);
+#else
// copy leading bytes
- u32 leadingBytes = srcIdx & 3;
+ word leadingBytes = srcIdx & 3;
if (leadingBytes != 0) {
leadingBytes = 4 - leadingBytes;
if (leadingBytes > numBytes)
@@ -138,6 +142,7 @@ void UnswapCopyWrap(const u8 *src, u32 srcIdx, u8 *dest, u32 destIdx, u32 destMa
--srcIdx;
}
}
+#endif
}
void DWordInterleaveWrap(u32 *src, u32 srcIdx, u32 srcMask, u32 numQWords)
diff --git a/src/convert.h b/src/convert.h
index d5cf2a0e..46730fee 100644
--- a/src/convert.h
+++ b/src/convert.h
@@ -11,12 +11,15 @@ extern const volatile unsigned char Two2Eight[4];
extern const volatile unsigned char One2Four[2];
extern const volatile unsigned char One2Eight[2];
-void UnswapCopyWrap(const u8 *src, u32 srcIdx, u8 *dest, u32 destIdx, u32 destMask, u32 numBytes);
+void UnswapCopyWrap(const u8 *src, word srcIdx, u8 *dest, word destIdx, word destMask, word numBytes);
void DWordInterleaveWrap(u32 *src, u32 srcIdx, u32 srcMask, u32 numQWords);
inline u16 swapword( u16 value )
{
+#ifdef NATIVE2
+ return value;
+#else
#ifdef WIN32_ASM
__asm
{
@@ -26,6 +29,7 @@ inline u16 swapword( u16 value )
#else // WIN32_ASM
return (value << 8) | (value >> 8);
#endif // WIN32_ASM
+#endif
}
inline u16 RGBA8888_RGBA4444( u32 color )
diff --git a/src/gDP.cpp b/src/gDP.cpp
index 087cd8a5..b8fd4b20 100644
--- a/src/gDP.cpp
+++ b/src/gDP.cpp
@@ -23,6 +23,10 @@
#include "DisplayWindow.h"
#include
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
using namespace std;
gDPInfo gDP;
@@ -165,7 +169,7 @@ void gDPSetCombine( u32 muxs0, u32 muxs1 )
#endif
}
-void gDPSetColorImage( u32 format, u32 size, u32 width, u32 address )
+void gDPSetColorImage( u32 format, u32 size, u32 width, word address )
{
address = RSP_SegmentToPhysical( address );
@@ -186,7 +190,7 @@ void gDPSetColorImage( u32 format, u32 size, u32 width, u32 address )
#endif
}
-void gDPSetTextureImage(u32 format, u32 size, u32 width, u32 address)
+void gDPSetTextureImage(u32 format, u32 size, u32 width, word address)
{
gDP.textureImage.format = format;
gDP.textureImage.size = size;
@@ -213,7 +217,7 @@ void gDPSetTextureImage(u32 format, u32 size, u32 width, u32 address)
#endif
}
-void gDPSetDepthImage( u32 address )
+void gDPSetDepthImage( word address )
{
address = RSP_SegmentToPhysical( address );
gDP.depthImageAddress = address;
@@ -463,7 +467,7 @@ void gDPLoadTile32b(u32 uls, u32 ult, u32 lrs, u32 lrt)
const u32 height = lrt - ult + 1;
const u32 line = gDP.loadTile->line << 2;
const u32 tbase = gDP.loadTile->tmem << 2;
- const u32 addr = gDP.textureImage.address >> 2;
+ const word addr = gDP.textureImage.address >> 2;
const u32 * src = reinterpret_cast(RDRAM);
u16 * tmem16 = reinterpret_cast(TMEM);
u32 c, ptr, tline, s, xorval;
@@ -475,8 +479,13 @@ void gDPLoadTile32b(u32 uls, u32 ult, u32 lrs, u32 lrt)
for (u32 i = 0; i < width; ++i) {
c = src[addr + s + i];
ptr = ((tline + i) ^ xorval) & 0x3ff;
+#ifdef NATIVE
+ tmem16[ptr | 0x400] = c >> 16;
+ tmem16[ptr] = c & 0xffff;
+#else
tmem16[ptr] = c >> 16;
tmem16[ptr | 0x400] = c & 0xffff;
+#endif
}
}
}
@@ -542,7 +551,7 @@ void gDPLoadTile(u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt)
gDP.loadTile->loadHeight = max(gDP.loadTile->loadHeight, info.height);
}
- u32 address = gDP.textureImage.address + gDP.loadTile->ult * gDP.textureImage.bpl + (gDP.loadTile->uls << gDP.textureImage.size >> 1);
+ word address = gDP.textureImage.address + gDP.loadTile->ult * gDP.textureImage.bpl + (gDP.loadTile->uls << gDP.textureImage.size >> 1);
u32 bpl2 = bpl;
if (gDP.loadTile->lrs > gDP.textureImage.width)
bpl2 = (gDP.textureImage.width - gDP.loadTile->uls);
@@ -556,9 +565,9 @@ void gDPLoadTile(u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt)
if (gDP.loadTile->size == G_IM_SIZ_32b)
gDPLoadTile32b(gDP.loadTile->uls, gDP.loadTile->ult, gDP.loadTile->lrs, gDP.loadTile->lrt);
else {
- u32 tmemAddr = gDP.loadTile->tmem;
- const u32 line = gDP.loadTile->line;
- const u32 qwpr = bpr >> 3;
+ word tmemAddr = gDP.loadTile->tmem;
+ const word line = gDP.loadTile->line;
+ const word qwpr = bpr >> 3;
for (u32 y = 0; y < height; ++y) {
if (address + bpl > RDRAMSize)
UnswapCopyWrap(RDRAM, address, reinterpret_cast(TMEM), tmemAddr << 3, 0xFFF, RDRAMSize - address);
@@ -589,7 +598,7 @@ void gDPLoadBlock32(u32 uls,u32 lrs, u32 dxt)
const u32 line = gDP.loadTile->line << 2;
u16 *tmem16 = reinterpret_cast(TMEM);
- u32 addr = gDP.loadTile->imageAddress >> 2;
+ word addr = gDP.loadTile->imageAddress >> 2;
u32 width = (lrs - uls + 1) << 2;
if (width == 4) // lr_s == 0, 1x1 texture
width = 1;
@@ -610,12 +619,21 @@ void gDPLoadBlock32(u32 uls,u32 lrs, u32 dxt)
i += line;
ptr = ((tb + i) ^ t) & 0x3ff;
c = src[addr + i];
+#ifdef NATIVE
+ tmem16[ptr | 0x400] = c >> 16;
+ tmem16[ptr] = c & 0xffff;
+ ptr = ((tb + i + 1) ^ t) & 0x3ff;
+ c = src[addr + i + 1];
+ tmem16[ptr | 0x400] = c >> 16;
+ tmem16[ptr] = c & 0xffff;
+#else
tmem16[ptr] = c >> 16;
tmem16[ptr | 0x400] = c & 0xffff;
ptr = ((tb + i + 1) ^ t) & 0x3ff;
c = src[addr + i + 1];
tmem16[ptr] = c >> 16;
tmem16[ptr | 0x400] = c & 0xffff;
+#endif
j += dxt;
}
} else {
@@ -623,8 +641,13 @@ void gDPLoadBlock32(u32 uls,u32 lrs, u32 dxt)
for (u32 i = 0; i < width; i++) {
ptr = ((tb + i) ^ 1) & 0x3ff;
c = src[addr + i];
+#ifdef NATIVE
+ tmem16[ptr | 0x400] = c >> 16;
+ tmem16[ptr] = c & 0xffff;
+#else
tmem16[ptr] = c >> 16;
tmem16[ptr | 0x400] = c & 0xffff;
+#endif
}
}
}
@@ -664,7 +687,14 @@ void gDPLoadBlock(u32 tile, u32 uls, u32 ult, u32 lrs, u32 dxt)
bytes = (bytes & (~7U)) + 8;
info.bytes = bytes;
- u32 address = gDP.textureImage.address + ult * gDP.textureImage.bpl + (uls << gDP.textureImage.size >> 1);
+ word address = gDP.textureImage.address + ult * gDP.textureImage.bpl + (uls << gDP.textureImage.size >> 1);
+
+#ifdef NATIVE
+ if(address == 0 || address == 0xCDCDCDCD)
+ {
+ return;
+ }
+#endif
if (bytes == 0 || (address + bytes) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load texture block out of range\n");
@@ -730,7 +760,7 @@ void gDPLoadTLUT( u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt )
return;
}
u16 count = static_cast((gDP.tiles[tile].lrs - gDP.tiles[tile].uls + 1) * (gDP.tiles[tile].lrt - gDP.tiles[tile].ult + 1));
- u32 address = gDP.textureImage.address + gDP.tiles[tile].ult * gDP.textureImage.bpl + (gDP.tiles[tile].uls << gDP.textureImage.size >> 1);
+ word address = gDP.textureImage.address + gDP.tiles[tile].ult * gDP.textureImage.bpl + (gDP.tiles[tile].uls << gDP.textureImage.size >> 1);
u16 pal = static_cast((gDP.tiles[tile].tmem - 256) >> 4);
u16 * dest = reinterpret_cast(TMEM);
u32 destIdx = gDP.tiles[tile].tmem << 2;
@@ -738,7 +768,12 @@ void gDPLoadTLUT( u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt )
int i = 0;
while (i < count) {
for (u16 j = 0; (j < 16) && (i < count); ++j, ++i) {
+#ifdef NATIVE
+ //dest[(destIdx | 0x0400) & 0x07FF] = *reinterpret_cast(RDRAM + (address ^ 2));
+ dest[(destIdx) & 0x07FF] = *reinterpret_cast(RDRAM + (address));
+#else
dest[(destIdx | 0x0400) & 0x07FF] = swapword(*reinterpret_cast(RDRAM + (address ^ 2)));
+#endif
address += 2;
destIdx += 4;
}
@@ -984,9 +1019,16 @@ void gDPTileSync()
DebugMsg( DEBUG_NORMAL | DEBUG_IGNORED, "gDPTileSync();\n" );
}
-void gDPPipeSync()
+void gDPPipeSync(const Gwords words)
{
+ const word line = _SHIFTR(words.w0, 0, 16);
+ const char* file = (const char*)words.w1;
+
DebugMsg( DEBUG_NORMAL | DEBUG_IGNORED, "gDPPipeSync();\n" );
+
+ if (line && file) {
+ DebugMsg(DEBUG_NORMAL, "\nLINE %s : %d;\n\n", file, line);
+ }
}
void gDPLoadSync()
@@ -994,9 +1036,16 @@ void gDPLoadSync()
DebugMsg( DEBUG_NORMAL | DEBUG_IGNORED, "gDPLoadSync();\n" );
}
-void gDPNoOp()
+void gDPNoOp(const Gwords words)
{
- DebugMsg( DEBUG_NORMAL | DEBUG_IGNORED, "gDPNoOp();\n" );
+ const word line = _SHIFTR(words.w0, 0, 16);
+ const char* file = (const char*)words.w1;
+
+ DebugMsg(DEBUG_NORMAL | DEBUG_IGNORED, "gDPNoOp();\n");
+
+ if (line && file) {
+ DebugMsg(DEBUG_NORMAL, "\nLINE %s : %d;\n\n", file, line);
+ }
}
LLETriangle::LLETriangle()
@@ -1403,7 +1452,7 @@ void LLETriangle::draw(bool _shade, bool _texture, bool _zbuffer, u32 * _pData)
}
}
-void gDPTriFill(u32 w0, u32 w1)
+void gDPTriFill(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 8 * sizeof(s32));
@@ -1412,7 +1461,7 @@ void gDPTriFill(u32 w0, u32 w1)
DebugMsg( DEBUG_NORMAL, "trifill\n");
}
-void gDPTriShade(u32 w0, u32 w1)
+void gDPTriShade(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 24 * sizeof(s32));
@@ -1421,7 +1470,7 @@ void gDPTriShade(u32 w0, u32 w1)
DebugMsg( DEBUG_NORMAL, "trishade\n");
}
-void gDPTriTxtr(u32 w0, u32 w1)
+void gDPTriTxtr(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 8 * sizeof(s32));
@@ -1432,7 +1481,7 @@ void gDPTriTxtr(u32 w0, u32 w1)
DebugMsg(DEBUG_NORMAL, "tritxtr\n");
}
-void gDPTriShadeTxtr(u32 w0, u32 w1)
+void gDPTriShadeTxtr(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 40 * sizeof(s32));
@@ -1441,7 +1490,7 @@ void gDPTriShadeTxtr(u32 w0, u32 w1)
DebugMsg( DEBUG_NORMAL, "trishadetxtr\n");
}
-void gDPTriFillZ(u32 w0, u32 w1)
+void gDPTriFillZ(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 8 * sizeof(s32));
@@ -1451,7 +1500,7 @@ void gDPTriFillZ(u32 w0, u32 w1)
DebugMsg( DEBUG_NORMAL, "trifillz\n");
}
-void gDPTriShadeZ(u32 w0, u32 w1)
+void gDPTriShadeZ(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 24 * sizeof(s32));
@@ -1461,7 +1510,7 @@ void gDPTriShadeZ(u32 w0, u32 w1)
DebugMsg( DEBUG_NORMAL, "trishadez\n");
}
-void gDPTriTxtrZ(u32 w0, u32 w1)
+void gDPTriTxtrZ(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 8 * sizeof(s32));
@@ -1472,7 +1521,7 @@ void gDPTriTxtrZ(u32 w0, u32 w1)
DebugMsg( DEBUG_NORMAL, "tritxtrz\n");
}
-void gDPTriShadeTxtrZ(u32 w0, u32 w1)
+void gDPTriShadeTxtrZ(word w0, word w1)
{
u32 ewdata[44];
memcpy(&ewdata[0], RDP.cmd_data + RDP.cmd_cur, 44 * sizeof(s32));
diff --git a/src/gDP.h b/src/gDP.h
index b698158a..2499295d 100644
--- a/src/gDP.h
+++ b/src/gDP.h
@@ -237,13 +237,13 @@ struct gDPInfo
struct
{
u32 format, size, width, bpl;
- u32 address;
+ word address;
} textureImage;
struct
{
u32 format, size, width, height, bpl;
- u32 address, changed;
+ word address, changed;
} colorImage;
u32 depthImageAddress;
@@ -297,9 +297,9 @@ void gDPSetPrimDepth( u16 z, u16 dz );
void gDPSetTexturePersp( u32 enable );
void gDPSetTextureLUT( u32 mode );
void gDPSetCombine( u32 muxs0, u32 muxs1 );
-void gDPSetColorImage( u32 format, u32 size, u32 width, u32 address );
-void gDPSetTextureImage( u32 format, u32 size, u32 width, u32 address );
-void gDPSetDepthImage( u32 address );
+void gDPSetColorImage( u32 format, u32 size, u32 width, word address );
+void gDPSetTextureImage( u32 format, u32 size, u32 width, word address );
+void gDPSetDepthImage( word address );
void gDPSetEnvColor( u32 r, u32 g, u32 b, u32 a );
void gDPSetBlendColor( u32 r, u32 g, u32 b, u32 a );
void gDPSetFogColor( u32 r, u32 g, u32 b, u32 a );
@@ -319,18 +319,18 @@ void gDPSetKeyGB(u32 cG, u32 sG, u32 wG, u32 cB, u32 sB, u32 wB );
void gDPTextureRectangle( f32 ulx, f32 uly, f32 lrx, f32 lry, s32 tile, s16 s, s16 t, f32 dsdx, f32 dtdy, bool flip );
void gDPFullSync();
void gDPTileSync();
-void gDPPipeSync();
+void gDPPipeSync(const Gwords words);
void gDPLoadSync();
-void gDPNoOp();
+void gDPNoOp(const Gwords words);
-void gDPTriFill( u32 w0, u32 w1 );
-void gDPTriShade( u32 w0, u32 w1 );
-void gDPTriTxtr( u32 w0, u32 w1 );
-void gDPTriShadeTxtr( u32 w0, u32 w1 );
-void gDPTriFillZ( u32 w0, u32 w1 );
-void gDPTriShadeZ( u32 w0, u32 w1 );
-void gDPTriTxtrZ( u32 w0, u32 w1 );
-void gDPTriShadeTxtrZ( u32 w0, u32 w1 );
+void gDPTriFill( word w0, word w1 );
+void gDPTriShade( word w0, word w1 );
+void gDPTriTxtr( word w0, word w1 );
+void gDPTriShadeTxtr( word w0, word w1 );
+void gDPTriFillZ( word w0, word w1 );
+void gDPTriShadeZ( word w0, word w1 );
+void gDPTriTxtrZ( word w0, word w1 );
+void gDPTriShadeTxtrZ( word w0, word w1 );
bool isCurrentColorImageDepthImage();
bool isDepthCompareEnabled();
diff --git a/src/gSP.cpp b/src/gSP.cpp
index 317decc7..73e91c79 100644
--- a/src/gSP.cpp
+++ b/src/gSP.cpp
@@ -19,6 +19,10 @@
#include "Log.h"
#include "DisplayWindow.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
using namespace std;
using namespace graphics;
@@ -127,7 +131,7 @@ f32 identityMatrix[4][4] =
{ 0.0f, 0.0f, 0.0f, 1.0f }
};
-void gSPLoadUcodeEx( u32 uc_start, u32 uc_dstart, u16 uc_dsize )
+void gSPLoadUcodeEx( word uc_start, word uc_dstart, u16 uc_dsize )
{
gSP.matrix.modelViewi = 0;
gSP.status[0] = gSP.status[1] = gSP.status[2] = gSP.status[3] = 0;
@@ -136,10 +140,12 @@ void gSPLoadUcodeEx( u32 uc_start, u32 uc_dstart, u16 uc_dsize )
gSP.geometryMode = 0U;
gSP.changed |= CHANGED_MATRIX | CHANGED_LIGHT | CHANGED_LOOKAT | CHANGED_GEOMETRYMODE;
+#ifndef NATIVE
if ((((uc_start & 0x1FFFFFFF) + 4096) > RDRAMSize) || (((uc_dstart & 0x1FFFFFFF) + uc_dsize) > RDRAMSize)) {
DebugMsg(DEBUG_NORMAL|DEBUG_ERROR, "gSPLoadUcodeEx out of RDRAM\n");
return;
}
+#endif
GBI.loadMicrocode(uc_start, uc_dstart, uc_dsize);
RSP.uc_start = uc_start;
@@ -158,7 +164,7 @@ void gSPMatrix( u32 matrix, u8 param )
{
f32 mtx[4][4];
- u32 address = RSP_SegmentToPhysical( matrix );
+ word address = RSP_SegmentToPhysical( matrix );
if (address + 64 > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load matrix from invalid address\n");
@@ -213,7 +219,7 @@ void gSPMatrix( u32 matrix, u8 param )
void gSPDMAMatrix( u32 matrix, u8 index, u8 multiply )
{
f32 mtx[4][4];
- u32 address = gSP.DMAOffsets.mtx + RSP_SegmentToPhysical( matrix );
+ word address = gSP.DMAOffsets.mtx + RSP_SegmentToPhysical( matrix );
if (address + 64 > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load matrix from invalid address\n");
@@ -248,9 +254,19 @@ void gSPDMAMatrix( u32 matrix, u8 index, u8 multiply )
mtx[3][0], mtx[3][1], mtx[3][2], mtx[3][3] );
}
+extern "C" u64 gfx_width();
+extern "C" u64 gfx_height();
+
+#define SCREEN_WIDTH 320
+#define SCREEN_HEIGHT 240
+#define HALF_SCREEN_WIDTH (SCREEN_WIDTH / 2)
+#define HALF_SCREEN_HEIGHT (SCREEN_HEIGHT / 2)
+#define RATIO_X (gfx_width() / (2.0f * HALF_SCREEN_WIDTH))
+#define RATIO_Y (gfx_height() / (2.0f * HALF_SCREEN_HEIGHT))
+
void gSPViewport( u32 v )
{
- u32 address = RSP_SegmentToPhysical( v );
+ word address = RSP_SegmentToPhysical( v );
if ((address + 16) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load viewport from invalid address\n");
@@ -258,14 +274,28 @@ void gSPViewport( u32 v )
return;
}
- gSP.viewport.vscale[0] = _FIXED2FLOAT( *(s16*)&RDRAM[address + 2], 2 );
- gSP.viewport.vscale[1] = _FIXED2FLOAT( *(s16*)&RDRAM[address ], 2 );
- gSP.viewport.vscale[2] = _FIXED2FLOAT( *(s16*)&RDRAM[address + 6], 10 );// * 0.00097847357f;
- gSP.viewport.vscale[3] = *(s16*)&RDRAM[address + 4];
- gSP.viewport.vtrans[0] = _FIXED2FLOAT( *(s16*)&RDRAM[address + 10], 2 );
- gSP.viewport.vtrans[1] = _FIXED2FLOAT( *(s16*)&RDRAM[address + 8], 2 );
- gSP.viewport.vtrans[2] = _FIXED2FLOAT( *(s16*)&RDRAM[address + 14], 10 );// * 0.00097847357f;
- gSP.viewport.vtrans[3] = *(s16*)&RDRAM[address + 12];
+#ifdef NATIVE
+ Vp_t* vp = (Vp_t*)address;
+ gSP.viewport.vscale[0] = _FIXED2FLOAT( vp->vscale.x, 2 );
+ gSP.viewport.vscale[1] = _FIXED2FLOAT( vp->vscale.y, 2 );
+ gSP.viewport.vscale[2] = _FIXED2FLOAT( vp->vscale.z, 10 );// * 0.00097847357f;
+ gSP.viewport.vscale[3] = vp->vscale.w;
+
+ gSP.viewport.vtrans[0] = _FIXED2FLOAT( vp->vtrans.x, 2 );
+ gSP.viewport.vtrans[1] = _FIXED2FLOAT( vp->vtrans.y, 2 );
+ gSP.viewport.vtrans[2] = _FIXED2FLOAT( vp->vtrans.z, 10 );// * 0.00097847357f;
+ gSP.viewport.vtrans[3] = vp->vtrans.w;
+#else
+ gSP.viewport.vscale[0] = _FIXED2FLOAT( vp->vscale.y, 2 );
+ gSP.viewport.vscale[1] = _FIXED2FLOAT( vp->vscale.x, 2 );
+ gSP.viewport.vscale[2] = _FIXED2FLOAT( vp->vscale.w, 10 );// * 0.00097847357f;
+ gSP.viewport.vscale[3] = vp->vscale.z;
+
+ gSP.viewport.vtrans[0] = _FIXED2FLOAT( vp->vtrans.y, 2 );
+ gSP.viewport.vtrans[1] = _FIXED2FLOAT( vp->vtrans.x, 2 );
+ gSP.viewport.vtrans[2] = _FIXED2FLOAT( vp->vtrans.w, 10 );// * 0.00097847357f;
+ gSP.viewport.vtrans[3] = vp->vtrans.z;
+#endif
if (gSP.viewport.vscale[1] < 0.0f && !GBI.isNegativeY())
gSP.viewport.vscale[1] = -gSP.viewport.vscale[1];
@@ -277,6 +307,11 @@ void gSPViewport( u32 v )
gSP.viewport.nearz = gSP.viewport.vtrans[2] - gSP.viewport.vscale[2];
gSP.viewport.farz = (gSP.viewport.vtrans[2] + gSP.viewport.vscale[2]) ;
+ /*gSP.viewport.x *= RATIO_X;
+ gSP.viewport.y *= RATIO_Y;
+ gSP.viewport.width /= RATIO_X;
+ gSP.viewport.height /= RATIO_Y;*/
+
gSP.changed |= CHANGED_VIEWPORT;
DebugMsg(DEBUG_NORMAL, "gSPViewport scale(%02f, %02f, %02f), trans(%02f, %02f, %02f)\n",
@@ -286,7 +321,7 @@ void gSPViewport( u32 v )
void gSPForceMatrix( u32 mptr )
{
- u32 address = RSP_SegmentToPhysical( mptr );
+ word address = RSP_SegmentToPhysical( mptr );
if (address + 64 > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load from invalid address");
@@ -304,7 +339,7 @@ void gSPForceMatrix( u32 mptr )
void gSPLight( u32 l, s32 n )
{
--n;
- u32 addrByte = RSP_SegmentToPhysical( l );
+ word addrByte = RSP_SegmentToPhysical( l );
if ((addrByte + sizeof( Light )) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load light from invalid address\n");
@@ -327,7 +362,7 @@ void gSPLight( u32 l, s32 n )
gSP.lights.xyz[n][Z] = light->z;
Normalize( gSP.lights.xyz[n] );
- u32 addrShort = addrByte >> 1;
+ word addrShort = addrByte >> 1;
gSP.lights.pos_xyzw[n][X] = (float)(((short*)RDRAM)[(addrShort+4)^1]);
gSP.lights.pos_xyzw[n][Y] = (float)(((short*)RDRAM)[(addrShort+5)^1]);
gSP.lights.pos_xyzw[n][Z] = (float)(((short*)RDRAM)[(addrShort+6)^1]);
@@ -348,7 +383,7 @@ void gSPLight( u32 l, s32 n )
void gSPLightCBFD( u32 l, s32 n )
{
- u32 addrByte = RSP_SegmentToPhysical( l );
+ word addrByte = RSP_SegmentToPhysical( l );
if ((addrByte + sizeof( Light )) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load light from invalid address\n");
@@ -371,7 +406,7 @@ void gSPLightCBFD( u32 l, s32 n )
gSP.lights.xyz[n][Z] = light->z;
Normalize( gSP.lights.xyz[n] );
- u32 addrShort = addrByte >> 1;
+ word addrShort = addrByte >> 1;
gSP.lights.pos_xyzw[n][X] = (float)(((short*)RDRAM)[(addrShort+16)^1]);
gSP.lights.pos_xyzw[n][Y] = (float)(((short*)RDRAM)[(addrShort+17)^1]);
gSP.lights.pos_xyzw[n][Z] = (float)(((short*)RDRAM)[(addrShort+18)^1]);
@@ -390,10 +425,10 @@ void gSPLightCBFD( u32 l, s32 n )
void gSPLightAcclaim(u32 l, s32 n)
{
- u32 addrByte = RSP_SegmentToPhysical(l);
+ word addrByte = RSP_SegmentToPhysical(l);
if (n < 10) {
- const u32 addrShort = addrByte >> 1;
+ const word addrShort = addrByte >> 1;
gSP.lights.pos_xyzw[n][X] = (f32)(((s16*)RDRAM)[(addrShort + 0) ^ 1]);
gSP.lights.pos_xyzw[n][Y] = (f32)(((s16*)RDRAM)[(addrShort + 1) ^ 1]);
gSP.lights.pos_xyzw[n][Z] = (f32)(((s16*)RDRAM)[(addrShort + 2) ^ 1]);
@@ -415,7 +450,7 @@ void gSPLightAcclaim(u32 l, s32 n)
void gSPLookAt( u32 _l, u32 _n )
{
- u32 address = RSP_SegmentToPhysical(_l);
+ word address = RSP_SegmentToPhysical(_l);
if ((address + sizeof(Light)) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load light from invalid address\n");
@@ -932,7 +967,7 @@ void gSPVertex(u32 a, u32 n, u32 v0)
return;
}
- const u32 address = RSP_SegmentToPhysical(a);
+ const word address = RSP_SegmentToPhysical(a);
if ((address + sizeof(Vertex)* n) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "gSPVertex Using Vertex outside RDRAM n = %i, v0 = %i, from %08x\n", n, v0, a);
@@ -1002,7 +1037,7 @@ void gSPCIVertex( u32 a, u32 n, u32 v0 )
return;
}
- const u32 address = RSP_SegmentToPhysical( a );
+ const word address = RSP_SegmentToPhysical( a );
if ((address + sizeof( PDVertex ) * n) > RDRAMSize)
return;
@@ -1025,7 +1060,7 @@ void gSPCIVertex( u32 a, u32 n, u32 v0 )
template
-u32 gSPLoadDMAVertexData(u32 address, SPVertex * spVtx, u32 v0, u32 vi, u32 n)
+u32 gSPLoadDMAVertexData(word address, SPVertex * spVtx, u32 v0, u32 vi, u32 n)
{
const u32 end = n - (n%VNUM) + v0;
for (; vi < end; vi += VNUM) {
@@ -1057,7 +1092,7 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 )
return;
}
- const u32 address = gSP.DMAOffsets.vtx + RSP_SegmentToPhysical(a);
+ const word address = gSP.DMAOffsets.vtx + RSP_SegmentToPhysical(a);
if ((address + 10 * n) > RDRAMSize)
return;
@@ -1108,7 +1143,7 @@ void gSPCBFDVertex( u32 a, u32 n, u32 v0 )
return;
}
- const u32 address = RSP_SegmentToPhysical(a);
+ const word address = RSP_SegmentToPhysical(a);
if ((address + sizeof( Vertex ) * n) > RDRAMSize)
return;
@@ -1185,7 +1220,7 @@ void gSPF3DAMVertex(u32 a, u32 n, u32 v0)
return;
}
- const u32 address = RSP_SegmentToPhysical(a);
+ const word address = RSP_SegmentToPhysical(a);
if ((address + sizeof(Vertex)* n) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "gSPF3DAMVertex Using Vertex outside RDRAM n = %i, v0 = %i, from %08x\n", n, v0, a);
@@ -1259,7 +1294,7 @@ void gSPSWVertex(const SWVertex * vertex, u32 v0, u32 n)
void gSPT3DUXVertex(u32 a, u32 n, u32 ci)
{
- const u32 address = RSP_SegmentToPhysical(a);
+ const word address = RSP_SegmentToPhysical(a);
const u32 colors = RSP_SegmentToPhysical(ci);
struct T3DUXVertex {
@@ -1319,11 +1354,11 @@ void gSPT3DUXVertex(u32 a, u32 n, u32 ci)
}
}
-void gSPDisplayList( u32 dl )
+void gSPDisplayList( word dl )
{
- u32 address = RSP_SegmentToPhysical( dl );
+ word address = RSP_SegmentToPhysical( dl );
- if ((address + 8) > RDRAMSize) {
+ if ((address + sizeof(Gwords)) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load display list from invalid address\n");
DebugMsg(DEBUG_NORMAL, "gSPDisplayList( 0x%08X );\n", dl );
return;
@@ -1341,11 +1376,11 @@ void gSPDisplayList( u32 dl )
}
}
-void gSPBranchList( u32 dl )
+void gSPBranchList( word dl )
{
- u32 address = RSP_SegmentToPhysical( dl );
+ word address = RSP_SegmentToPhysical( dl );
- if ((address + 8) > RDRAMSize) {
+ if ((address + sizeof(Gwords)) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to branch to display list at invalid address\n");
DebugMsg(DEBUG_NORMAL, "gSPBranchList( 0x%08X );\n", dl );
return;
@@ -1353,22 +1388,22 @@ void gSPBranchList( u32 dl )
DebugMsg(DEBUG_NORMAL, "gSPBranchList( 0x%08X ) nopush\n", dl );
- if (address == (RSP.PC[RSP.PCi] - 8)) {
+ if (address == (RSP.PC[RSP.PCi] - sizeof(Gwords))) {
RSP.infloop = true;
- RSP.PC[RSP.PCi] -= 8;
+ RSP.PC[RSP.PCi] -= sizeof(Gwords);
RSP.halt = true;
return;
}
RSP.PC[RSP.PCi] = address;
- RSP.nextCmd = _SHIFTR( *(u32*)&RDRAM[address], 24, 8 );
+ RSP.nextCmd = _SHIFTR( *(word*)&RDRAM[address], 24, 8 );
}
-void gSPBranchLessZ(u32 branchdl, u32 vtx, u32 zval)
+void gSPBranchLessZ(word branchdl, u32 vtx, u32 zval)
{
- const u32 address = RSP_SegmentToPhysical( branchdl );
+ const word address = RSP_SegmentToPhysical( branchdl );
- if ((address + 8) > RDRAMSize) {
+ if ((address + sizeof(Gwords)) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Specified display list at invalid address\n");
DebugMsg(DEBUG_NORMAL, "gSPBranchLessZ( 0x%08X, %i, %i );\n", branchdl, vtx, zval );
return;
@@ -1382,11 +1417,11 @@ void gSPBranchLessZ(u32 branchdl, u32 vtx, u32 zval)
DebugMsg(DEBUG_NORMAL, "gSPBranchLessZ( 0x%08X, %i, %i );\n", branchdl, vtx, zval );
}
-void gSPBranchLessW( u32 branchdl, u32 vtx, u32 wval )
+void gSPBranchLessW( word branchdl, u32 vtx, u32 wval )
{
- const u32 address = RSP_SegmentToPhysical( branchdl );
+ const word address = RSP_SegmentToPhysical( branchdl );
- if ((address + 8) > RDRAMSize) {
+ if ((address + sizeof(Gwords)) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Specified display list at invalid address\n");
DebugMsg(DEBUG_NORMAL, "gSPBranchLessW( 0x%08X, %i, %i );\n", branchdl, vtx, wval);
return;
@@ -1401,8 +1436,8 @@ void gSPBranchLessW( u32 branchdl, u32 vtx, u32 wval )
void gSPDlistCount(u32 count, u32 v)
{
- u32 address = RSP_SegmentToPhysical( v );
- if (address == 0 || (address + 8) > RDRAMSize) {
+ word address = RSP_SegmentToPhysical( v );
+ if (address == 0 || (address + sizeof(Gwords)) > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to branch to display list at invalid address\n");
DebugMsg(DEBUG_NORMAL, "gSPDlistCnt(%d, 0x%08X );\n", count, v);
return;
@@ -1418,7 +1453,7 @@ void gSPDlistCount(u32 count, u32 v)
++RSP.PCi; // go to the next PC in the stack
RSP.PC[RSP.PCi] = address; // jump to the address
- RSP.nextCmd = _SHIFTR( *(u32*)&RDRAM[address], 24, 8 );
+ RSP.nextCmd = _SHIFTR( *(word*)&RDRAM[address], 24, 8 );
RSP.count = count + 1;
}
@@ -1445,7 +1480,7 @@ void gSPSetVertexColorBase( u32 base )
}
void gSPDMATriangles( u32 tris, u32 n ){
- const u32 address = RSP_SegmentToPhysical( tris );
+ const word address = RSP_SegmentToPhysical( tris );
if (address + sizeof( DKRTriangle ) * n > RDRAMSize) {
DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "// Attempting to load triangles from invalid address\n");
@@ -1574,7 +1609,7 @@ void gSPPopMatrix( u32 param )
(param == G_MTX_PROJECTION) ? "G_MTX_PROJECTION" : "G_MTX_INVALID");
}
-void gSPSegment( s32 seg, s32 base )
+void gSPSegment( s32 seg, word base )
{
gSP.segment[seg] = base;
@@ -1750,8 +1785,11 @@ void gSPTexture( f32 sc, f32 tc, u32 level, u32 tile, u32 on )
DebugMsg(DEBUG_NORMAL, "gSPTexture: tile: %d, mipmap_lvl: %d, on: %d, s_scale: %f, t_scale: %f\n", tile, level, on, sc, tc);
}
-void gSPEndDisplayList()
+void gSPEndDisplayList(const Gwords words)
{
+ const word line = _SHIFTR(words.w0, 0, 24);
+ const char* file = (const char*)words.w1;
+
if (RSP.PCi > 0)
--RSP.PCi;
else {
@@ -1760,6 +1798,10 @@ void gSPEndDisplayList()
}
DebugMsg(DEBUG_NORMAL, "gSPEndDisplayList();\n\n");
+
+ if (line && file) {
+ DebugMsg(DEBUG_NORMAL, "\nLINE %s : %d;\n\n", file, line);
+ }
}
void gSPGeometryMode( u32 clear, u32 set )
@@ -1989,7 +2031,7 @@ void gSPSprite2DBase(u32 _base)
{
DebugMsg(DEBUG_NORMAL, "gSPSprite2DBase\n");
assert(RSP.nextCmd == 0xBE);
- const u32 address = RSP_SegmentToPhysical( _base );
+ const word address = RSP_SegmentToPhysical( _base );
uSprite *pSprite = (uSprite*)&RDRAM[address];
if (pSprite->tlutPtr != 0) {
@@ -2117,3 +2159,19 @@ void gSPSetupFunctions()
{
g_ConkerUcode = GBI.getMicrocodeType() == F3DEX2CBFD;
}
+
+#ifdef NATIVE
+word RSP_SegmentToPhysical(word segaddr) {
+ if (RSP.translateSegment) {
+ RSP.translateSegment = false;
+
+ const u32 idx = (segaddr >> 24) & 0x0F;
+ const word addr = (segaddr & 0x00FFFFFF);
+
+ DebugMsg(DEBUG_NORMAL, "Translatings segment address %x (%x) -> %x\n", segaddr, idx, gSP.segment[idx] + addr);
+ return gSP.segment[idx] + addr;
+ }
+
+ return segaddr;
+}
+#endif
diff --git a/src/gSP.h b/src/gSP.h
index 7aab7dae..e0d72de2 100644
--- a/src/gSP.h
+++ b/src/gSP.h
@@ -47,9 +47,25 @@ struct SPVertex
s16 flag;
};
+struct S16XYZW
+{
+ s16 x;
+ s16 y;
+ s16 z;
+ s16 w;
+};
+
+typedef struct {
+ S16XYZW vscale; /* scale, 2 bits fraction */
+ S16XYZW vtrans; /* translate, 2 bits fraction */
+ /* both the above arrays are padded to 64-bit boundary */
+} Vp_t;
+
+static_assert(sizeof(Vp_t) == 16, "Vp_t is incorrect size");
+
struct gSPInfo
{
- u32 segment[16];
+ word segment[16];
struct
{
@@ -110,7 +126,7 @@ struct gSPInfo
struct
{
- u32 address, width, height, format, size, palette;
+ word address, width, height, format, size, palette;
f32 imageX, imageY, scaleW, scaleH;
u8 clampS, clampT;
} bgImage;
@@ -121,7 +137,7 @@ struct gSPInfo
struct {
u8 sid;
u32 flag;
- u32 addr;
+ word addr;
} selectDL;
u32 status[4];
@@ -149,7 +165,7 @@ struct gSPInfo
extern gSPInfo gSP;
-void gSPLoadUcodeEx( u32 uc_start, u32 uc_dstart, u16 uc_dsize );
+void gSPLoadUcodeEx( word uc_start, word uc_dstart, u16 uc_dsize );
void gSPNoOp();
void gSPMatrix( u32 matrix, u8 param );
void gSPDMAMatrix( u32 matrix, u8 index, u8 multiply );
@@ -167,10 +183,10 @@ void gSPT3DUXVertex(u32 v, u32 n, u32 ci);
void gSPF3DAMVertex( u32 v, u32 n, u32 v0 );
void gSPSWVertex(const SWVertex * vertex, u32 n, const bool * const verticesToProcess);
void gSPSWVertex(const SWVertex * vertex, u32 v0, u32 n);
-void gSPDisplayList(u32 dl);
-void gSPBranchList( u32 dl );
-void gSPBranchLessZ(u32 branchdl, u32 vtx, u32 zval);
-void gSPBranchLessW( u32 branchdl, u32 vtx, u32 wval );
+void gSPDisplayList(word dl);
+void gSPBranchList( word dl );
+void gSPBranchLessZ(word branchdl, u32 vtx, u32 zval);
+void gSPBranchLessW( word branchdl, u32 vtx, u32 wval );
void gSPDlistCount(u32 count, u32 v);
void gSPSprite2DBase(u32 _base );
void gSPDMATriangles( u32 tris, u32 n );
@@ -178,7 +194,7 @@ void gSP1Quadrangle( s32 v0, s32 v1, s32 v2, s32 v3 );
void gSPCullDisplayList( u32 v0, u32 vn );
void gSPPopMatrix( u32 param );
void gSPPopMatrixN( u32 param, u32 num );
-void gSPSegment( s32 seg, s32 base );
+void gSPSegment( s32 seg, word base );
void gSPClipRatio( u32 ratio );
void gSPInsertMatrix( u32 where, u32 num );
void gSPModifyVertex(u32 _vtx, u32 _where, u32 _val );
@@ -187,7 +203,7 @@ void gSPLightColor( u32 lightNum, u32 packedColor );
void gSPFogFactor( s16 fm, s16 fo );
void gSPPerspNormalize( u16 scale );
void gSPTexture( f32 sc, f32 tc, u32 level, u32 tile, u32 on );
-void gSPEndDisplayList();
+void gSPEndDisplayList(const Gwords words);
void gSPGeometryMode( u32 clear, u32 set );
void gSPSetGeometryMode( u32 mode );
void gSPClearGeometryMode( u32 mode );
diff --git a/src/inc/m64p_plugin.h b/src/inc/m64p_plugin.h
index 0f5a95d3..952e5daa 100644
--- a/src/inc/m64p_plugin.h
+++ b/src/inc/m64p_plugin.h
@@ -24,6 +24,7 @@
#define M64P_PLUGIN_H
#include "m64p_types.h"
+#include "Types.h"
#ifdef __cplusplus
extern "C" {
@@ -39,9 +40,11 @@ extern "C" {
/***** Structures *****/
typedef struct {
+#ifndef NATIVE
unsigned char * RDRAM;
unsigned char * DMEM;
unsigned char * IMEM;
+#endif
unsigned int * MI_INTR_REG;
@@ -73,16 +76,18 @@ typedef struct {
typedef struct {
unsigned char * HEADER; /* This is the rom header (first 40h bytes of the rom) */
+#ifndef NATIVE
unsigned char * RDRAM;
unsigned char * DMEM;
unsigned char * IMEM;
+#endif
unsigned int * MI_INTR_REG;
- unsigned int * DPC_START_REG;
- unsigned int * DPC_END_REG;
- unsigned int * DPC_CURRENT_REG;
- unsigned int * DPC_STATUS_REG;
+ word * DPC_START_REG;
+ word * DPC_END_REG;
+ word * DPC_CURRENT_REG;
+ word * DPC_STATUS_REG;
unsigned int * DPC_CLOCK_REG;
unsigned int * DPC_BUFBUSY_REG;
unsigned int * DPC_PIPEBUSY_REG;
@@ -120,9 +125,11 @@ typedef struct {
} GFX_INFO;
typedef struct {
+#ifndef NATIVE
unsigned char * RDRAM;
unsigned char * DMEM;
unsigned char * IMEM;
+#endif
unsigned int * MI_INTR_REG;
diff --git a/src/porting.h b/src/porting.h
new file mode 100644
index 00000000..20cd3cb4
--- /dev/null
+++ b/src/porting.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include
+
+#if UINTPTR_MAX == 0xffffffff
+#elif UINTPTR_MAX == 0xffffffffffffffff
+#define IS_64_BIT 1
+#else
+/* wtf */
+#endif
+
+#ifdef NATIVE
+#ifdef IS_64_BIT
+#define word uint64_t
+#else
+#define word uint32_t
+#endif
+#else
+#define word uint32_t
+#endif
diff --git a/src/uCodes/F3D.cpp b/src/uCodes/F3D.cpp
index aaad5426..63473c64 100644
--- a/src/uCodes/F3D.cpp
+++ b/src/uCodes/F3D.cpp
@@ -8,245 +8,245 @@
#include "gDP.h"
#include "GBI.h"
-void F3D_SPNoOp( u32 w0, u32 w1 )
+void F3D_SPNoOp( const Gwords words )
{
gSPNoOp();
}
-void F3D_Mtx( u32 w0, u32 w1 )
+void F3D_Mtx( const Gwords words )
{
- if (_SHIFTR( w0, 0, 16 ) != 64) {
- DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR(w0, 0, 16), _SHIFTR(w0, 16, 8));
+ if (_SHIFTR( words.w0, 0, 16 ) != 64) {
+ DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", words.w1, _SHIFTR(words.w0, 0, 16), _SHIFTR(words.w0, 16, 8));
return;
}
- gSPMatrix( w1, _SHIFTR( w0, 16, 8 ) );
+ gSPMatrix( words.w1, _SHIFTR( words.w0, 16, 8 ) );
}
-void F3D_Reserved0( u32 w0, u32 w1 )
+void F3D_Reserved0( const Gwords words )
{
- DebugMsg(DEBUG_NORMAL | DEBUG_IGNORED, "G_RESERVED0: w0=0x%08lX w1=0x%08lX\n", w0, w1);
+ DebugMsg(DEBUG_NORMAL | DEBUG_IGNORED, "G_RESERVED0: words.w0=0x%08lX words.w1=0x%08lX\n", words.w0, words.w1);
}
-void F3D_MoveMem( u32 w0, u32 w1 )
+void F3D_MoveMem( const Gwords words )
{
- switch (_SHIFTR( w0, 16, 8 )) {
+ switch (_SHIFTR( words.w0, 16, 8 )) {
case F3D_MV_VIEWPORT:
- gSPViewport( w1 );
+ gSPViewport( words.w1 );
break;
case G_MV_MATRIX_1:
- gSPForceMatrix( w1 );
+ gSPForceMatrix( words.w1 );
// force matrix takes four commands
RSP.PC[RSP.PCi] += 24;
break;
case G_MV_L0:
- gSPLight( w1, LIGHT_1 );
+ gSPLight( words.w1, LIGHT_1 );
break;
case G_MV_L1:
- gSPLight( w1, LIGHT_2 );
+ gSPLight( words.w1, LIGHT_2 );
break;
case G_MV_L2:
- gSPLight( w1, LIGHT_3 );
+ gSPLight( words.w1, LIGHT_3 );
break;
case G_MV_L3:
- gSPLight( w1, LIGHT_4 );
+ gSPLight( words.w1, LIGHT_4 );
break;
case G_MV_L4:
- gSPLight( w1, LIGHT_5 );
+ gSPLight( words.w1, LIGHT_5 );
break;
case G_MV_L5:
- gSPLight( w1, LIGHT_6 );
+ gSPLight( words.w1, LIGHT_6 );
break;
case G_MV_L6:
- gSPLight( w1, LIGHT_7 );
+ gSPLight( words.w1, LIGHT_7 );
break;
case G_MV_L7:
- gSPLight( w1, LIGHT_8 );
+ gSPLight( words.w1, LIGHT_8 );
break;
case G_MV_LOOKATX:
- gSPLookAt(w1, 0);
+ gSPLookAt(words.w1, 0);
break;
case G_MV_LOOKATY:
- gSPLookAt(w1, 1);
+ gSPLookAt(words.w1, 1);
break;
}
}
-void F3D_Vtx( u32 w0, u32 w1 )
+void F3D_Vtx( const Gwords words )
{
- gSPVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
+ gSPVertex( words.w1, _SHIFTR( words.w0, 20, 4 ) + 1, _SHIFTR( words.w0, 16, 4 ) );
}
-void F3D_Reserved1( u32 w0, u32 w1 )
+void F3D_Reserved1( const Gwords words )
{
}
-void F3D_DList( u32 w0, u32 w1 )
+void F3D_DList( const Gwords words )
{
- switch (_SHIFTR( w0, 16, 8 ))
+ switch (_SHIFTR( words.w0, 16, 8 ))
{
case G_DL_PUSH:
- gSPDisplayList( w1 );
+ gSPDisplayList( words.w1 );
break;
case G_DL_NOPUSH:
- gSPBranchList( w1 );
+ gSPBranchList( words.w1 );
break;
}
}
-void F3D_Reserved2( u32 w0, u32 w1 )
+void F3D_Reserved2( const Gwords words )
{
}
-void F3D_Reserved3( u32 w0, u32 w1 )
+void F3D_Reserved3( const Gwords words )
{
}
-void F3D_Sprite2D_Base( u32 w0, u32 w1 )
+void F3D_Sprite2D_Base( const Gwords words )
{
- gSPSprite2DBase( w1 );
+ gSPSprite2DBase( words.w1 );
}
-void F3D_Tri1( u32 w0, u32 w1 )
+void F3D_Tri1( const Gwords words )
{
- gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 10,
- _SHIFTR( w1, 8, 8 ) / 10,
- _SHIFTR( w1, 0, 8 ) / 10);
+ gSP1Triangle( _SHIFTR( words.w1, 16, 8 ) / 10,
+ _SHIFTR( words.w1, 8, 8 ) / 10,
+ _SHIFTR( words.w1, 0, 8 ) / 10);
}
-void F3D_CullDL( u32 w0, u32 w1 )
+void F3D_CullDL( const Gwords words )
{
- gSPCullDisplayList( _SHIFTR( w0, 0, 24 ) / 40, (w1 / 40) - 1 );
+ gSPCullDisplayList( _SHIFTR( words.w0, 0, 24 ) / 40, (words.w1 / 40) - 1 );
}
-void F3D_PopMtx( u32 w0, u32 w1 )
+void F3D_PopMtx( const Gwords words )
{
- gSPPopMatrix( w1 );
+ gSPPopMatrix( words.w1 );
}
-void F3D_MoveWord( u32 w0, u32 w1 )
+void F3D_MoveWord( const Gwords words )
{
- switch (_SHIFTR( w0, 0, 8 )) {
+ switch (_SHIFTR( words.w0, 0, 8 )) {
case G_MW_MATRIX:
- gSPInsertMatrix( _SHIFTR( w0, 8, 16 ), w1 );
+ gSPInsertMatrix( _SHIFTR( words.w0, 8, 16 ), words.w1 );
break;
case G_MW_NUMLIGHT:
- gSPNumLights( ((w1 - 0x80000000) >> 5) - 1 );
+ gSPNumLights( ((words.w1 - 0x80000000) >> 5) - 1 );
break;
case G_MW_CLIP:
- gSPClipRatio( w1 );
+ gSPClipRatio( words.w1 );
break;
case G_MW_SEGMENT:
- gSPSegment( _SHIFTR( w0, 10, 4 ), w1 & 0x00FFFFFF );
+ gSPSegment( _SHIFTR( words.w0, 10, 4 ), SEGMENT_MASK(words.w1) );
break;
case G_MW_FOG:
/* u32 fm, fo, min, max;
- fm = _SHIFTR( w1, 16, 16 );
- fo = _SHIFTR( w1, 0, 16 );
+ fm = _SHIFTR( words.w1, 16, 16 );
+ fo = _SHIFTR( words.w1, 0, 16 );
min = 500 - (fo * (128000 / fm)) / 256;
max = (128000 / fm) + min;*/
- gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
+ gSPFogFactor( (s16)_SHIFTR( words.w1, 16, 16 ), (s16)_SHIFTR( words.w1, 0, 16 ) );
break;
case G_MW_LIGHTCOL:
- switch (_SHIFTR( w0, 8, 16 ))
+ switch (_SHIFTR( words.w0, 8, 16 ))
{
case F3D_MWO_aLIGHT_1:
- gSPLightColor( LIGHT_1, w1 );
+ gSPLightColor( LIGHT_1, words.w1 );
break;
case F3D_MWO_aLIGHT_2:
- gSPLightColor( LIGHT_2, w1 );
+ gSPLightColor( LIGHT_2, words.w1 );
break;
case F3D_MWO_aLIGHT_3:
- gSPLightColor( LIGHT_3, w1 );
+ gSPLightColor( LIGHT_3, words.w1 );
break;
case F3D_MWO_aLIGHT_4:
- gSPLightColor( LIGHT_4, w1 );
+ gSPLightColor( LIGHT_4, words.w1 );
break;
case F3D_MWO_aLIGHT_5:
- gSPLightColor( LIGHT_5, w1 );
+ gSPLightColor( LIGHT_5, words.w1 );
break;
case F3D_MWO_aLIGHT_6:
- gSPLightColor( LIGHT_6, w1 );
+ gSPLightColor( LIGHT_6, words.w1 );
break;
case F3D_MWO_aLIGHT_7:
- gSPLightColor( LIGHT_7, w1 );
+ gSPLightColor( LIGHT_7, words.w1 );
break;
case F3D_MWO_aLIGHT_8:
- gSPLightColor( LIGHT_8, w1 );
+ gSPLightColor( LIGHT_8, words.w1 );
break;
}
break;
case G_MW_POINTS:
{
- const u32 val = _SHIFTR(w0, 8, 16);
- gSPModifyVertex(val / 40, val % 40, w1);
+ const u32 val = _SHIFTR(words.w0, 8, 16);
+ gSPModifyVertex(val / 40, val % 40, words.w1);
}
break;
case G_MW_PERSPNORM:
- gSPPerspNormalize( w1 );
+ gSPPerspNormalize( words.w1 );
break;
}
}
-void F3D_Texture( u32 w0, u32 w1 )
+void F3D_Texture( const Gwords words )
{
- gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
- _FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
- _SHIFTR( w0, 11, 3 ),
- _SHIFTR( w0, 8, 3 ),
- _SHIFTR( w0, 0, 8 ) );
+ gSPTexture( _FIXED2FLOAT( _SHIFTR( words.w1, 16, 16 ), 16 ),
+ _FIXED2FLOAT( _SHIFTR( words.w1, 0, 16 ), 16 ),
+ _SHIFTR( words.w0, 11, 3 ),
+ _SHIFTR( words.w0, 8, 3 ),
+ _SHIFTR( words.w0, 0, 8 ) );
}
-void F3D_SetOtherMode_H( u32 w0, u32 w1 )
+void F3D_SetOtherMode_H( const Gwords words )
{
- const u32 length = _SHIFTR(w0, 0, 8);
- const u32 shift = _SHIFTR(w0, 8, 8);
- gSPSetOtherMode_H(length, shift, w1);
+ const u32 length = _SHIFTR(words.w0, 0, 8);
+ const u32 shift = _SHIFTR(words.w0, 8, 8);
+ gSPSetOtherMode_H(length, shift, words.w1);
}
-void F3D_SetOtherMode_L( u32 w0, u32 w1 )
+void F3D_SetOtherMode_L( const Gwords words )
{
- const u32 length = _SHIFTR(w0, 0, 8);
- const u32 shift = _SHIFTR(w0, 8, 8);
- gSPSetOtherMode_L(length, shift, w1);
+ const u32 length = _SHIFTR(words.w0, 0, 8);
+ const u32 shift = _SHIFTR(words.w0, 8, 8);
+ gSPSetOtherMode_L(length, shift, words.w1);
}
-void F3D_EndDL( u32 w0, u32 w1 )
+void F3D_EndDL( const Gwords words )
{
- gSPEndDisplayList();
+ gSPEndDisplayList(words);
}
-void F3D_SetGeometryMode( u32 w0, u32 w1 )
+void F3D_SetGeometryMode( const Gwords words )
{
- gSPSetGeometryMode( w1 );
+ gSPSetGeometryMode( words.w1 );
}
-void F3D_ClearGeometryMode( u32 w0, u32 w1 )
+void F3D_ClearGeometryMode( const Gwords words )
{
- gSPClearGeometryMode( w1 );
+ gSPClearGeometryMode( words.w1 );
}
-void F3D_Quad( u32 w0, u32 w1 )
+void F3D_Quad( const Gwords words )
{
- gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 10, _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10 );
+ gSP1Quadrangle( _SHIFTR( words.w1, 24, 8 ) / 10, _SHIFTR( words.w1, 16, 8 ) / 10, _SHIFTR( words.w1, 8, 8 ) / 10, _SHIFTR( words.w1, 0, 8 ) / 10 );
}
-void F3D_RDPHalf_1( u32 w0, u32 w1 )
+void F3D_RDPHalf_1( const Gwords words )
{
- gDP.half_1 = w1;
- RDP_Half_1(w1);
+ gDP.half_1 = words.w1;
+ RDP_Half_1(words.w1);
}
-void F3D_RDPHalf_2( u32 w0, u32 w1 )
+void F3D_RDPHalf_2( const Gwords words )
{
- gDP.half_2 = w1;
+ gDP.half_2 = words.w1;
}
-void F3D_RDPHalf_Cont( u32 w0, u32 w1 )
+void F3D_RDPHalf_Cont( const Gwords words )
{
}
diff --git a/src/uCodes/F3D.h b/src/uCodes/F3D.h
index 85ab9c05..435850ac 100644
--- a/src/uCodes/F3D.h
+++ b/src/uCodes/F3D.h
@@ -66,31 +66,31 @@
#define F3D_RDPHALF_CONT 0xB2
#define F3D_TRI4 0xB1
-void F3D_SPNoOp( u32 w0, u32 w1 );
-void F3D_Mtx( u32 w0, u32 w1 );
-void F3D_Reserved0( u32 w0, u32 w1 );
-void F3D_MoveMem( u32 w0, u32 w1 );
-void F3D_Vtx( u32 w0, u32 w1 );
-void F3D_Reserved1( u32 w0, u32 w1 );
-void F3D_DList( u32 w0, u32 w1 );
-void F3D_Reserved2( u32 w0, u32 w1 );
-void F3D_Reserved3( u32 w0, u32 w1 );
-void F3D_Sprite2D_Base( u32 w0, u32 w1 );
-void F3D_Tri1( u32 w0, u32 w1 );
-void F3D_CullDL( u32 w0, u32 w1 );
-void F3D_PopMtx( u32 w0, u32 w1 );
-void F3D_MoveWord( u32 w0, u32 w1 );
-void F3D_Texture( u32 w0, u32 w1 );
-void F3D_SetOtherMode_H( u32 w0, u32 w1 );
-void F3D_SetOtherMode_L( u32 w0, u32 w1 );
-void F3D_EndDL( u32 w0, u32 w1 );
-void F3D_SetGeometryMode( u32 w0, u32 w1 );
-void F3D_ClearGeometryMode( u32 w0, u32 w1 );
-//void F3D_Line3D( u32 w0, u32 w1 );
-void F3D_Quad( u32 w0, u32 w1 );
-void F3D_RDPHalf_1( u32 w0, u32 w1 );
-void F3D_RDPHalf_2( u32 w0, u32 w1 );
-void F3D_RDPHalf_Cont( u32 w0, u32 w1 );
+void F3D_SPNoOp( const Gwords words );
+void F3D_Mtx( const Gwords words );
+void F3D_Reserved0( const Gwords words );
+void F3D_MoveMem( const Gwords words );
+void F3D_Vtx( const Gwords words );
+void F3D_Reserved1( const Gwords words );
+void F3D_DList( const Gwords words );
+void F3D_Reserved2( const Gwords words );
+void F3D_Reserved3( const Gwords words );
+void F3D_Sprite2D_Base( const Gwords words );
+void F3D_Tri1( const Gwords words );
+void F3D_CullDL( const Gwords words );
+void F3D_PopMtx( const Gwords words );
+void F3D_MoveWord( const Gwords words );
+void F3D_Texture( const Gwords words );
+void F3D_SetOtherMode_H( const Gwords words );
+void F3D_SetOtherMode_L( const Gwords words );
+void F3D_EndDL( const Gwords words );
+void F3D_SetGeometryMode( const Gwords words );
+void F3D_ClearGeometryMode( const Gwords words );
+//void F3D_Line3D( const Gwords words );
+void F3D_Quad( const Gwords words );
+void F3D_RDPHalf_1( const Gwords words );
+void F3D_RDPHalf_2( const Gwords words );
+void F3D_RDPHalf_Cont( const Gwords words );
void F3D_Init();
#endif
diff --git a/src/uCodes/F3DAM.cpp b/src/uCodes/F3DAM.cpp
index 162606cd..ab2aa007 100644
--- a/src/uCodes/F3DAM.cpp
+++ b/src/uCodes/F3DAM.cpp
@@ -5,43 +5,43 @@
#include "F3DAM.h"
#include "gSP.h"
-void F3DAM_MoveWord(u32 w0, u32 w1)
+void F3DAM_MoveWord( const Gwords words )
{
- switch (_SHIFTR(w0, 16, 8)) {
+ switch (_SHIFTR(words.w0, 16, 8)) {
case G_MW_FOG:
- switch (_SHIFTR(w0, 0, 8)) {
+ switch (_SHIFTR(words.w0, 0, 8)) {
case 0:
- gSPFogFactor((s16)_SHIFTR(w1, 16, 16), (s16)_SHIFTR(w1, 0, 16));
+ gSPFogFactor((s16)_SHIFTR(words.w1, 16, 16), (s16)_SHIFTR(words.w1, 0, 16));
break;
case 0x0C:
- gSP.textureCoordScale[0] = w1;
+ gSP.textureCoordScale[0] = words.w1;
break;
case 0x10:
- gSP.textureCoordScale[1] = w1;
+ gSP.textureCoordScale[1] = words.w1;
break;
}
break;
default:
- F3DEX2_MoveWord(w0, w1);
+ F3DEX2_MoveWord(words);
break;
}
}
-void F3DAM_Vtx( u32 w0, u32 w1 )
+void F3DAM_Vtx( const Gwords words )
{
- u32 n = _SHIFTR( w0, 12, 8 );
+ u32 n = _SHIFTR( words.w0, 12, 8 );
- gSPF3DAMVertex( w1, n, _SHIFTR( w0, 1, 7 ) - n );
+ gSPF3DAMVertex( words.w1, n, _SHIFTR( words.w0, 1, 7 ) - n );
}
-void F3DAM_Texture( u32 w0, u32 w1 )
+void F3DAM_Texture( const Gwords words )
{
- gSP.textureCoordScaleOrg = w1;
+ gSP.textureCoordScaleOrg = words.w1;
gSPTexture( 1.0f,
1.0f,
- _SHIFTR( w0, 11, 3 ),
- _SHIFTR( w0, 8, 3 ),
- _SHIFTR( w0, 1, 7 ) );
+ _SHIFTR( words.w0, 11, 3 ),
+ _SHIFTR( words.w0, 8, 3 ),
+ _SHIFTR( words.w0, 1, 7 ) );
}
void F3DAM_Init()
diff --git a/src/uCodes/F3DBETA.cpp b/src/uCodes/F3DBETA.cpp
index 457ea6fe..84a2df2c 100644
--- a/src/uCodes/F3DBETA.cpp
+++ b/src/uCodes/F3DBETA.cpp
@@ -10,32 +10,32 @@
#include "gDP.h"
#include "GBI.h"
-void F3DBETA_Vtx( u32 w0, u32 w1 )
+void F3DBETA_Vtx( const Gwords words )
{
- gSPVertex( w1, _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 16, 8 ) / 5 );
+ gSPVertex( words.w1, _SHIFTR( words.w0, 9, 7 ), _SHIFTR( words.w0, 16, 8 ) / 5 );
}
-void F3DBETA_Tri1( u32 w0, u32 w1 )
+void F3DBETA_Tri1( const Gwords words )
{
- gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 5,
- _SHIFTR( w1, 8, 8 ) / 5,
- _SHIFTR( w1, 0, 8 ) / 5);
+ gSP1Triangle( _SHIFTR( words.w1, 16, 8 ) / 5,
+ _SHIFTR( words.w1, 8, 8 ) / 5,
+ _SHIFTR( words.w1, 0, 8 ) / 5);
}
-void F3DBETA_Tri2( u32 w0, u32 w1 )
+void F3DBETA_Tri2( const Gwords words )
{
- gSP2Triangles( _SHIFTR( w0, 16, 8 ) / 5, _SHIFTR( w0, 8, 8 ) / 5, _SHIFTR( w0, 0, 8 ) / 5, 0,
- _SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5, 0);
+ gSP2Triangles( _SHIFTR( words.w0, 16, 8 ) / 5, _SHIFTR( words.w0, 8, 8 ) / 5, _SHIFTR( words.w0, 0, 8 ) / 5, 0,
+ _SHIFTR( words.w1, 16, 8 ) / 5, _SHIFTR( words.w1, 8, 8 ) / 5, _SHIFTR( words.w1, 0, 8 ) / 5, 0);
}
-void F3DBETA_Quad( u32 w0, u32 w1 )
+void F3DBETA_Quad( const Gwords words )
{
- gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 5, _SHIFTR( w1, 16, 8 ) / 5, _SHIFTR( w1, 8, 8 ) / 5, _SHIFTR( w1, 0, 8 ) / 5 );
+ gSP1Quadrangle( _SHIFTR( words.w1, 24, 8 ) / 5, _SHIFTR( words.w1, 16, 8 ) / 5, _SHIFTR( words.w1, 8, 8 ) / 5, _SHIFTR( words.w1, 0, 8 ) / 5 );
}
-void F3DBETA_Perpnorm(u32 w0, u32 w1)
+void F3DBETA_Perpnorm(const Gwords words)
{
- gSPPerspNormalize(w1);
+ gSPPerspNormalize(words.w1);
}
void F3DBETA_Init()
diff --git a/src/uCodes/F3DBETA.h b/src/uCodes/F3DBETA.h
index 1d07768d..91640d3c 100644
--- a/src/uCodes/F3DBETA.h
+++ b/src/uCodes/F3DBETA.h
@@ -8,7 +8,7 @@
void F3DBETA_Init();
-void F3DBETA_Perpnorm(u32 w0, u32 w1);
+void F3DBETA_Perpnorm(const Gwords words);
#endif
diff --git a/src/uCodes/F3DDKR.cpp b/src/uCodes/F3DDKR.cpp
index e38cfa4d..a141e2b3 100644
--- a/src/uCodes/F3DDKR.cpp
+++ b/src/uCodes/F3DDKR.cpp
@@ -9,90 +9,90 @@
#include "gDP.h"
#include "GBI.h"
-void F3DDKR_DMA_Mtx( u32 w0, u32 w1 )
+void F3DDKR_DMA_Mtx( const Gwords words )
{
- if (_SHIFTR( w0, 0, 16 ) != 64) {
- DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", w1, _SHIFTR(w0, 0, 16), _SHIFTR(w0, 16, 8));
+ if (_SHIFTR( words.w0, 0, 16 ) != 64) {
+ DebugMsg(DEBUG_NORMAL | DEBUG_ERROR, "G_MTX: address = 0x%08X length = %i params = 0x%02X\n", words.w1, _SHIFTR(words.w0, 0, 16), _SHIFTR(words.w0, 16, 8));
return;
}
- u32 index = _SHIFTR( w0, 16, 4 );
+ u32 index = _SHIFTR( words.w0, 16, 4 );
u32 multiply;
if (index == 0) {// DKR
- index = _SHIFTR( w0, 22, 2 );
+ index = _SHIFTR( words.w0, 22, 2 );
multiply = 0;
}
else { // JFG
- multiply = _SHIFTR( w0, 23, 1 );
+ multiply = _SHIFTR( words.w0, 23, 1 );
}
- gSPDMAMatrix( w1, index, multiply );
+ gSPDMAMatrix( words.w1, index, multiply );
}
-void F3DDKR_DMA_Vtx( u32 w0, u32 w1 )
+void F3DDKR_DMA_Vtx( const Gwords words )
{
- if ((w0 & F3DDKR_VTX_APPEND)) {
+ if ((words.w0 & F3DDKR_VTX_APPEND)) {
if (gSP.matrix.billboard)
gSP.vertexi = 1;
} else
gSP.vertexi = 0;
- u32 n = _SHIFTR( w0, 19, 5 ) + 1;
+ u32 n = _SHIFTR( words.w0, 19, 5 ) + 1;
- gSPDMAVertex( w1, n, gSP.vertexi + _SHIFTR( w0, 9, 5 ) );
+ gSPDMAVertex( words.w1, n, gSP.vertexi + _SHIFTR( words.w0, 9, 5 ) );
gSP.vertexi += n;
}
-void F3DJFG_DMA_Vtx(u32 w0, u32 w1)
+void F3DJFG_DMA_Vtx(const Gwords words)
{
- if ((w0 & F3DDKR_VTX_APPEND)) {
+ if ((words.w0 & F3DDKR_VTX_APPEND)) {
if (gSP.matrix.billboard)
gSP.vertexi = 1;
} else
gSP.vertexi = 0;
- u32 n = _SHIFTR(w0, 19, 5);
+ u32 n = _SHIFTR(words.w0, 19, 5);
- gSPDMAVertex(w1, n, gSP.vertexi + _SHIFTR(w0, 9, 5));
+ gSPDMAVertex(words.w1, n, gSP.vertexi + _SHIFTR(words.w0, 9, 5));
gSP.vertexi += n;
}
-void F3DDKR_DMA_Tri(u32 w0, u32 w1)
+void F3DDKR_DMA_Tri(const Gwords words)
{
- gSPDMATriangles( w1, _SHIFTR( w0, 4, 12 ) );
+ gSPDMATriangles( words.w1, _SHIFTR( words.w0, 4, 12 ) );
gSP.vertexi = 0;
}
-void F3DDKR_DMA_DList( u32 w0, u32 w1 )
+void F3DDKR_DMA_DList( const Gwords words )
{
- gSPDlistCount(_SHIFTR(w0, 16, 8), w1);
+ gSPDlistCount(_SHIFTR(words.w0, 16, 8), words.w1);
}
-void F3DDKR_DMA_Offsets( u32 w0, u32 w1 )
+void F3DDKR_DMA_Offsets( const Gwords words )
{
- gSPSetDMAOffsets( _SHIFTR( w0, 0, 24 ), _SHIFTR( w1, 0, 24 ) );
+ gSPSetDMAOffsets( _SHIFTR( words.w0, 0, 24 ), _SHIFTR( words.w1, 0, 24 ) );
}
-void F3DDKR_DMA_Tex_Offset(u32 w0, u32 w1)
+void F3DDKR_DMA_Tex_Offset(const Gwords words)
{
- gSPSetDMATexOffset(w1);
+ gSPSetDMATexOffset(words.w1);
}
-void F3DDKR_MoveWord( u32 w0, u32 w1 )
+void F3DDKR_MoveWord( const Gwords words )
{
- switch (_SHIFTR( w0, 0, 8 )) {
+ switch (_SHIFTR( words.w0, 0, 8 )) {
case 0x02:
- gSP.matrix.billboard = w1 & 1;
+ gSP.matrix.billboard = words.w1 & 1;
break;
case 0x0A:
- gSP.matrix.modelViewi = _SHIFTR( w1, 6, 2 );
+ gSP.matrix.modelViewi = _SHIFTR( words.w1, 6, 2 );
gSP.changed |= CHANGED_MATRIX;
break;
default:
- F3D_MoveWord( w0, w1 );
+ F3D_MoveWord(words);
break;
}
}
diff --git a/src/uCodes/F3DEX.cpp b/src/uCodes/F3DEX.cpp
index 6ea624aa..29547667 100644
--- a/src/uCodes/F3DEX.cpp
+++ b/src/uCodes/F3DEX.cpp
@@ -9,45 +9,45 @@
#include "gDP.h"
#include "GBI.h"
-void F3DEX_Vtx( u32 w0, u32 w1 )
+void F3DEX_Vtx( const Gwords words )
{
- gSPVertex( w1, _SHIFTR( w0, 10, 6 ), _SHIFTR( w0, 17, 7 ) );
+ gSPVertex( words.w1, _SHIFTR( words.w0, 10, 6 ), _SHIFTR( words.w0, 17, 7 ) );
}
-void F3DEX_Tri1( u32 w0, u32 w1 )
+void F3DEX_Tri1( const Gwords words )
{
- gSP1Triangle( _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ));
+ gSP1Triangle( _SHIFTR( words.w1, 17, 7 ), _SHIFTR( words.w1, 9, 7 ), _SHIFTR( words.w1, 1, 7 ));
}
-void F3DEX_CullDL( u32 w0, u32 w1 )
+void F3DEX_CullDL( const Gwords words )
{
- gSPCullDisplayList( _SHIFTR( w0, 1, 15 ), _SHIFTR( w1, 1, 15 ) );
+ gSPCullDisplayList( _SHIFTR( words.w0, 1, 15 ), _SHIFTR( words.w1, 1, 15 ) );
}
-void F3DEX_ModifyVtx( u32 w0, u32 w1 )
+void F3DEX_ModifyVtx( const Gwords words )
{
- gSPModifyVertex( _SHIFTR( w0, 1, 15 ), _SHIFTR( w0, 16, 8 ), w1 );
+ gSPModifyVertex( _SHIFTR( words.w0, 1, 15 ), _SHIFTR( words.w0, 16, 8 ), words.w1 );
}
-void F3DEX_Tri2( u32 w0, u32 w1 )
+void F3DEX_Tri2( const Gwords words )
{
- gSP2Triangles( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), _SHIFTR( w0, 1, 7 ), 0,
- _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ), 0);
+ gSP2Triangles( _SHIFTR( words.w0, 17, 7 ), _SHIFTR( words.w0, 9, 7 ), _SHIFTR( words.w0, 1, 7 ), 0,
+ _SHIFTR( words.w1, 17, 7 ), _SHIFTR( words.w1, 9, 7 ), _SHIFTR( words.w1, 1, 7 ), 0);
}
-void F3DEX_Quad( u32 w0, u32 w1 )
+void F3DEX_Quad( const Gwords words )
{
- gSP1Quadrangle( _SHIFTR( w1, 25, 7 ), _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), _SHIFTR( w1, 1, 7 ) );
+ gSP1Quadrangle( _SHIFTR( words.w1, 25, 7 ), _SHIFTR( words.w1, 17, 7 ), _SHIFTR( words.w1, 9, 7 ), _SHIFTR( words.w1, 1, 7 ) );
}
-void F3DEX_Branch_Z( u32 w0, u32 w1 )
+void F3DEX_Branch_Z( const Gwords words )
{
- gSPBranchLessZ(gDP.half_1, _SHIFTR(w0, 1, 11), _SHIFTR(w1, 16, 16));
+ gSPBranchLessZ(gDP.half_1, _SHIFTR(words.w0, 1, 11), _SHIFTR(words.w1, 16, 16));
}
-void F3DEX_Load_uCode( u32 w0, u32 w1 )
+void F3DEX_Load_uCode( const Gwords words )
{
- gSPLoadUcodeEx( w1, gDP.half_1, _SHIFTR( w0, 0, 16 ) + 1 );
+ gSPLoadUcodeEx( words.w1, gDP.half_1, _SHIFTR( words.w0, 0, 16 ) + 1 );
}
void F3DEX_Init()
diff --git a/src/uCodes/F3DEX.h b/src/uCodes/F3DEX.h
index 429f4d98..f54ed5ef 100644
--- a/src/uCodes/F3DEX.h
+++ b/src/uCodes/F3DEX.h
@@ -42,13 +42,13 @@
#define F3DEX_BRANCH_Z 0xB0
#define F3DEX_LOAD_UCODE 0xAF // 0xCF
-void F3DEX_Vtx( u32 w0, u32 w1 );
-void F3DEX_Tri1( u32 w0, u32 w1 );
-void F3DEX_CullDL( u32 w0, u32 w1 );
-void F3DEX_ModifyVtx( u32 w0, u32 w1 );
-void F3DEX_Tri2( u32 w0, u32 w1 );
-void F3DEX_Branch_Z( u32 w0, u32 w1 );
-void F3DEX_Load_uCode( u32 w0, u32 w1 );
+void F3DEX_Vtx( const Gwords words );
+void F3DEX_Tri1( const Gwords words );
+void F3DEX_CullDL( const Gwords words );
+void F3DEX_ModifyVtx( const Gwords words );
+void F3DEX_Tri2( const Gwords words );
+void F3DEX_Branch_Z( const Gwords words );
+void F3DEX_Load_uCode( const Gwords words );
void F3DEX_Init();
#endif
diff --git a/src/uCodes/F3DEX2.cpp b/src/uCodes/F3DEX2.cpp
index a3c28b9f..279791c3 100644
--- a/src/uCodes/F3DEX2.cpp
+++ b/src/uCodes/F3DEX2.cpp
@@ -14,158 +14,158 @@
using namespace std;
-void F3DEX2_Mtx( u32 w0, u32 w1 )
+void F3DEX2_Mtx( const Gwords words )
{
- gSPMatrix( w1, _SHIFTR( w0, 0, 8 ) ^ G_MTX_PUSH );
+ gSPMatrix( words.w1, _SHIFTR( words.w0, 0, 8 ) ^ G_MTX_PUSH );
}
-void F3DEX2_MoveMem( u32 w0, u32 w1 )
+void F3DEX2_MoveMem( const Gwords words )
{
- switch (_SHIFTR( w0, 0, 8 ))
+ switch (_SHIFTR( words.w0, 0, 8 ))
{
case F3DEX2_MV_VIEWPORT:
- gSPViewport( w1 );
+ gSPViewport( words.w1 );
break;
case G_MV_MATRIX:
- gSPForceMatrix( w1 );
+ gSPForceMatrix( words.w1 );
// force matrix takes two commands
RSP.PC[RSP.PCi] += 8;
break;
case G_MV_LIGHT:
{
- const u32 offset = (_SHIFTR(w0, 5, 11))&0x7F8;
+ const u32 offset = (_SHIFTR(words.w0, 5, 11))&0x7F8;
const u32 n = offset / 24;
if (n < 2)
- gSPLookAt(w1, n);
+ gSPLookAt(words.w1, n);
else
- gSPLight(w1, n - 1);
+ gSPLight(words.w1, n - 1);
}
break;
}
}
-void F3DEX2_Vtx( u32 w0, u32 w1 )
+void F3DEX2_Vtx( const Gwords words )
{
- u32 n = _SHIFTR( w0, 12, 8 );
+ u32 n = _SHIFTR( words.w0, 12, 8 );
- gSPVertex( w1, n, _SHIFTR( w0, 1, 7 ) - n );
+ gSPVertex( words.w1, n, _SHIFTR( words.w0, 1, 7 ) - n );
}
-void F3DEX2_Reserved1( u32 w0, u32 w1 )
+void F3DEX2_Reserved1( const Gwords words )
{
}
-void F3DEX2_Tri1( u32 w0, u32 w1 )
+void F3DEX2_Tri1( const Gwords words )
{
- gSP1Triangle( _SHIFTR( w0, 17, 7 ),
- _SHIFTR( w0, 9, 7 ),
- _SHIFTR( w0, 1, 7 ));
+ gSP1Triangle( _SHIFTR( words.w0, 17, 7 ),
+ _SHIFTR( words.w0, 9, 7 ),
+ _SHIFTR( words.w0, 1, 7 ));
}
-void F3DEX2_Line3D( u32 w0, u32 w1 )
+void F3DEX2_Line3D( const Gwords words )
{
assert(false);
}
-void F3DEX2_PopMtx( u32 w0, u32 w1 )
+void F3DEX2_PopMtx( const Gwords words )
{
- gSPPopMatrixN( 0, w1 >> 6 );
+ gSPPopMatrixN( 0, words.w1 >> 6 );
}
-void F3DEX2_MoveWord( u32 w0, u32 w1 )
+void F3DEX2_MoveWord( const Gwords words )
{
- switch (_SHIFTR( w0, 16, 8 ))
+ switch (_SHIFTR( words.w0, 16, 8 ))
{
case G_MW_FORCEMTX:
- if (w1 == 0)
+ if (words.w1 == 0)
gSP.changed |= CHANGED_MATRIX;
else
gSP.changed &= ~CHANGED_MATRIX;
break;
case G_MW_MATRIX:
- gSPInsertMatrix( _SHIFTR( w0, 0, 16 ), w1 );
+ gSPInsertMatrix( _SHIFTR( words.w0, 0, 16 ), words.w1 );
break;
case G_MW_NUMLIGHT:
- gSPNumLights( w1 / 24 );
+ gSPNumLights( words.w1 / 24 );
break;
case G_MW_CLIP:
- gSPClipRatio( w1 );
+ gSPClipRatio( words.w1 );
break;
case G_MW_SEGMENT:
- gSPSegment( _SHIFTR( w0, 2, 4 ) , w1 & 0x00FFFFFF );
+ gSPSegment( _SHIFTR( words.w0, 2, 4 ) , SEGMENT_MASK(words.w1) );
break;
case G_MW_FOG:
- gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
+ gSPFogFactor( (s16)_SHIFTR( words.w1, 16, 16 ), (s16)_SHIFTR( words.w1, 0, 16 ) );
break;
case G_MW_LIGHTCOL:
- gSPLightColor((_SHIFTR( w0, 0, 16 ) / 24) + 1, w1 );
+ gSPLightColor((_SHIFTR( words.w0, 0, 16 ) / 24) + 1, words.w1 );
break;
case G_MW_PERSPNORM:
- gSPPerspNormalize( w1 );
+ gSPPerspNormalize( words.w1 );
break;
}
}
-void F3DEX2_Texture( u32 w0, u32 w1 )
+void F3DEX2_Texture( const Gwords words )
{
- gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
- _FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
- _SHIFTR( w0, 11, 3 ),
- _SHIFTR( w0, 8, 3 ),
- _SHIFTR( w0, 1, 7 ) );
+ gSPTexture( _FIXED2FLOAT( _SHIFTR( words.w1, 16, 16 ), 16 ),
+ _FIXED2FLOAT( _SHIFTR( words.w1, 0, 16 ), 16 ),
+ _SHIFTR( words.w0, 11, 3 ),
+ _SHIFTR( words.w0, 8, 3 ),
+ _SHIFTR( words.w0, 1, 7 ) );
}
-void F3DEX2_SetOtherMode_H( u32 w0, u32 w1 )
+void F3DEX2_SetOtherMode_H( const Gwords words )
{
- const u32 length = _SHIFTR(w0, 0, 8) + 1;
- const u32 shift = max(0, (s32)(32 - _SHIFTR(w0, 8, 8) - length));
- gSPSetOtherMode_H(length, shift, w1);
+ const u32 length = _SHIFTR(words.w0, 0, 8) + 1;
+ const u32 shift = max(0, (s32)(32 - _SHIFTR(words.w0, 8, 8) - length));
+ gSPSetOtherMode_H(length, shift, words.w1);
}
-void F3DEX2_SetOtherMode_L( u32 w0, u32 w1 )
+void F3DEX2_SetOtherMode_L( const Gwords words )
{
- const u32 length = _SHIFTR(w0, 0, 8) + 1;
- const u32 shift = max(0, (s32)(32 - _SHIFTR(w0, 8, 8) - length));
- gSPSetOtherMode_L(length, shift, w1);
+ const u32 length = _SHIFTR(words.w0, 0, 8) + 1;
+ const u32 shift = max(0, (s32)(32 - _SHIFTR(words.w0, 8, 8) - length));
+ gSPSetOtherMode_L(length, shift, words.w1);
}
-void F3DEX2_GeometryMode( u32 w0, u32 w1 )
+void F3DEX2_GeometryMode( const Gwords words )
{
- gSPGeometryMode( ~_SHIFTR( w0, 0, 24 ), w1 );
+ gSPGeometryMode( ~_SHIFTR( words.w0, 0, 24 ), words.w1 );
}
-void F3DEX2_DMAIO( u32 w0, u32 w1 )
+void F3DEX2_DMAIO( const Gwords words )
{
- gSP.DMAIO_address = RSP_SegmentToPhysical(w1);
+ gSP.DMAIO_address = RSP_SegmentToPhysical(words.w1);
}
-void F3DEX2_Special_1( u32 w0, u32 w1 )
+void F3DEX2_Special_1( const Gwords words )
{
- const u32 param = _SHIFTR(w0, 0, 8);
+ const u32 param = _SHIFTR(words.w0, 0, 8);
if (GBI.isCombineMatrices())
gSPCombineMatrices(param);
else
- gSPDlistCount(param, w1);
+ gSPDlistCount(param, words.w1);
}
-void F3DEX2_Special_2( u32 w0, u32 w1 )
+void F3DEX2_Special_2( const Gwords words )
{
}
-void F3DEX2_Special_3( u32 w0, u32 w1 )
+void F3DEX2_Special_3( const Gwords words )
{
}
-void F3DEX2_Quad( u32 w0, u32 w1 )
+void F3DEX2_Quad( const Gwords words )
{
- gSP2Triangles( _SHIFTR( w0, 17, 7 ),
- _SHIFTR( w0, 9, 7 ),
- _SHIFTR( w0, 1, 7 ),
+ gSP2Triangles( _SHIFTR( words.w0, 17, 7 ),
+ _SHIFTR( words.w0, 9, 7 ),
+ _SHIFTR( words.w0, 1, 7 ),
0,
- _SHIFTR( w1, 17, 7 ),
- _SHIFTR( w1, 9, 7 ),
- _SHIFTR( w1, 1, 7 ),
+ _SHIFTR( words.w1, 17, 7 ),
+ _SHIFTR( words.w1, 9, 7 ),
+ _SHIFTR( words.w1, 1, 7 ),
0 );
}
diff --git a/src/uCodes/F3DEX2.h b/src/uCodes/F3DEX2.h
index 9f81420e..0efae15d 100644
--- a/src/uCodes/F3DEX2.h
+++ b/src/uCodes/F3DEX2.h
@@ -66,23 +66,23 @@
#define F3DEX2_LINE3D 0x08
-void F3DEX2_Mtx( u32 w0, u32 w1 );
-void F3DEX2_MoveMem( u32 w0, u32 w1 );
-void F3DEX2_Vtx( u32 w0, u32 w1 );
-void F3DEX2_Reserved1( u32 w0, u32 w1 );
-void F3DEX2_Tri1( u32 w0, u32 w1 );
-void F3DEX2_PopMtx( u32 w0, u32 w1 );
-void F3DEX2_MoveWord( u32 w0, u32 w1 );
-void F3DEX2_Texture( u32 w0, u32 w1 );
-void F3DEX2_SetOtherMode_H( u32 w0, u32 w1 );
-void F3DEX2_SetOtherMode_L( u32 w0, u32 w1 );
-void F3DEX2_GeometryMode( u32 w0, u32 w1 );
-void F3DEX2_Line3D( u32 w0, u32 w1 );
-void F3DEX2_DMAIO( u32 w0, u32 w1 );
-void F3DEX2_Special_1( u32 w0, u32 w1 );
-void F3DEX2_Special_2( u32 w0, u32 w1 );
-void F3DEX2_Special_3( u32 w0, u32 w1 );
-void F3DEX2_Quad( u32 w0, u32 w1 );
+void F3DEX2_Mtx( const Gwords words );
+void F3DEX2_MoveMem( const Gwords words );
+void F3DEX2_Vtx( const Gwords words );
+void F3DEX2_Reserved1( const Gwords words );
+void F3DEX2_Tri1( const Gwords words );
+void F3DEX2_PopMtx( const Gwords words );
+void F3DEX2_MoveWord( const Gwords words );
+void F3DEX2_Texture( const Gwords words );
+void F3DEX2_SetOtherMode_H( const Gwords words );
+void F3DEX2_SetOtherMode_L( const Gwords words );
+void F3DEX2_GeometryMode( const Gwords words );
+void F3DEX2_Line3D( const Gwords words );
+void F3DEX2_DMAIO( const Gwords words );
+void F3DEX2_Special_1( const Gwords words );
+void F3DEX2_Special_2( const Gwords words );
+void F3DEX2_Special_3( const Gwords words );
+void F3DEX2_Quad( const Gwords words );
void F3DEX2_Init();
#endif
diff --git a/src/uCodes/F3DEX2ACCLAIM.cpp b/src/uCodes/F3DEX2ACCLAIM.cpp
index 69bb8215..02e42e92 100644
--- a/src/uCodes/F3DEX2ACCLAIM.cpp
+++ b/src/uCodes/F3DEX2ACCLAIM.cpp
@@ -10,31 +10,31 @@
using namespace std;
-void F3DEX2ACCLAIM_MoveMem( u32 w0, u32 w1 )
+void F3DEX2ACCLAIM_MoveMem( const Gwords words )
{
- switch (_SHIFTR( w0, 0, 8 ))
+ switch (_SHIFTR( words.w0, 0, 8 ))
{
case F3DEX2_MV_VIEWPORT:
- gSPViewport( w1 );
+ gSPViewport( words.w1 );
break;
case G_MV_MATRIX:
- gSPForceMatrix( w1 );
+ gSPForceMatrix( words.w1 );
// force matrix takes two commands
RSP.PC[RSP.PCi] += 8;
break;
case G_MV_LIGHT:
{
- const u32 offset = (_SHIFTR(w0, 5, 11))&0x7F8;
+ const u32 offset = (_SHIFTR(words.w0, 5, 11))&0x7F8;
if (offset <= 24 * 3) {
const u32 n = offset / 24;
if (n < 2)
- gSPLookAt(w1, n);
+ gSPLookAt(words.w1, n);
else
- gSPLight(w1, n - 1);
+ gSPLight(words.w1, n - 1);
} else {
const u32 n = 2 + (offset - 24 * 4) / 16;
- gSPLightAcclaim(w1, n);
+ gSPLightAcclaim(words.w1, n);
}
}
break;
diff --git a/src/uCodes/F3DEX2CBFD.cpp b/src/uCodes/F3DEX2CBFD.cpp
index a740aad9..63927e26 100644
--- a/src/uCodes/F3DEX2CBFD.cpp
+++ b/src/uCodes/F3DEX2CBFD.cpp
@@ -12,15 +12,15 @@
#include "GBI.h"
static
-void F3DEX2CBFD_Vtx( u32 w0, u32 w1 )
+void F3DEX2CBFD_Vtx( const Gwords words )
{
- u32 n = _SHIFTR( w0, 12, 8 );
+ u32 n = _SHIFTR( words.w0, 12, 8 );
- gSPCBFDVertex( w1, n, _SHIFTR( w0, 1, 7 ) - n );
+ gSPCBFDVertex(words.w1, n, _SHIFTR(words.w0, 1, 7) - n);
}
static
-void F3DEX2CBFD_CoordMod(u32 _w0, u32 _w1)
+void F3DEX2CBFD_CoordMod(word _w0, word _w1)
{
DebugMsg(DEBUG_NORMAL, "gSPCoordMod( %u, %u );\n", _w0, _w1);
if ((_w0 & 8) != 0)
@@ -44,67 +44,67 @@ void F3DEX2CBFD_CoordMod(u32 _w0, u32 _w1)
}
static
-void F3DEX2CBFD_MoveWord( u32 w0, u32 w1 )
+void F3DEX2CBFD_MoveWord( const Gwords words )
{
- switch (_SHIFTR( w0, 16, 8 ))
+ switch (_SHIFTR( words.w0, 16, 8 ))
{
case G_MW_NUMLIGHT:
- gSPNumLights( w1 / 48 );
+ gSPNumLights( words.w1 / 48 );
break;
case G_MW_CLIP:
- gSPClipRatio( w1 );
+ gSPClipRatio( words.w1 );
break;
case G_MW_SEGMENT:
- gSPSegment( _SHIFTR( w0, 0, 16 ) >> 2, w1 & 0x00FFFFFF );
+ gSPSegment( _SHIFTR( words.w0, 0, 16 ) >> 2, SEGMENT_MASK(words.w1) );
break;
case G_MW_FOG:
- gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
+ gSPFogFactor( (s16)_SHIFTR( words.w1, 16, 16 ), (s16)_SHIFTR( words.w1, 0, 16 ) );
break;
case G_MW_PERSPNORM:
- gSPPerspNormalize( w1 );
+ gSPPerspNormalize( words.w1 );
break;
case G_MW_COORD_MOD:
- F3DEX2CBFD_CoordMod( w0, w1 );
+ F3DEX2CBFD_CoordMod( words.w0, words.w1 );
break;
}
}
static
-void F3DEX2CBFD_MoveMem( u32 w0, u32 w1 )
+void F3DEX2CBFD_MoveMem( const Gwords words )
{
- switch (_SHIFTR( w0, 0, 8 ))
+ switch (_SHIFTR( words.w0, 0, 8 ))
{
case F3DEX2_MV_VIEWPORT:
- gSPViewport( w1 );
+ gSPViewport( words.w1 );
break;
case G_MV_LIGHT:
{
- const u32 offset = _SHIFTR(w0, 5, 14);
+ const u32 offset = _SHIFTR(words.w0, 5, 14);
const u32 n = offset / 48;
if (n < 2)
- gSPLookAt(w1, n);
+ gSPLookAt(words.w1, n);
else
- gSPLightCBFD(w1, n - 2);
+ gSPLightCBFD(words.w1, n - 2);
}
break;
case G_MV_NORMALES:
- gSP.cbfd.vertexNormalBase = RSP_SegmentToPhysical(w1);
- DebugMsg(DEBUG_NORMAL, "gSPSetVertexNormaleBase( 0x%08X );\n", w1);
+ gSP.cbfd.vertexNormalBase = RSP_SegmentToPhysical(words.w1);
+ DebugMsg(DEBUG_NORMAL, "gSPSetVertexNormaleBase( 0x%08X );\n", words.w1);
break;
}
}
static
-void F3DEX2CBFD_Tri4( u32 w0, u32 w1 )
+void F3DEX2CBFD_Tri4( const Gwords words )
{
- gSP4Triangles( _SHIFTR( w0, 23, 5 ), _SHIFTR( w0, 18, 5 ), (_SHIFTR( w0, 15, 3 )<<2)|_SHIFTR( w1, 30, 2 ),
- _SHIFTR( w0, 10, 5 ), _SHIFTR( w0, 5, 5 ), _SHIFTR( w0, 0, 5 ),
- _SHIFTR( w1, 25, 5 ), _SHIFTR( w1, 20, 5 ), _SHIFTR( w1, 15, 5 ),
- _SHIFTR( w1, 10, 5 ), _SHIFTR( w1, 5, 5 ), _SHIFTR( w1, 0, 5 ) );
+ gSP4Triangles( _SHIFTR( words.w0, 23, 5 ), _SHIFTR( words.w0, 18, 5 ), (_SHIFTR( words.w0, 15, 3 )<<2)|_SHIFTR( words.w1, 30, 2 ),
+ _SHIFTR( words.w0, 10, 5 ), _SHIFTR( words.w0, 5, 5 ), _SHIFTR( words.w0, 0, 5 ),
+ _SHIFTR( words.w1, 25, 5 ), _SHIFTR( words.w1, 20, 5 ), _SHIFTR( words.w1, 15, 5 ),
+ _SHIFTR( words.w1, 10, 5 ), _SHIFTR( words.w1, 5, 5 ), _SHIFTR( words.w1, 0, 5 ) );
}
static
-void F3DEX2CBFD_SwitchLightingMode(u32, u32)
+void F3DEX2CBFD_SwitchLightingMode(const Gwords words)
{
gSP.cbfd.advancedLighting = true;
}
diff --git a/src/uCodes/F3DFLX2.cpp b/src/uCodes/F3DFLX2.cpp
index 640359cd..ef3e6a4f 100644
--- a/src/uCodes/F3DFLX2.cpp
+++ b/src/uCodes/F3DFLX2.cpp
@@ -8,10 +8,14 @@
#include "gSP.h"
#include "DebugDump.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
inline
void F3DFLX2_LoadAlphaLight(u32 _a)
{
- const u32 address = RSP_SegmentToPhysical(_a);
+ const word address = RSP_SegmentToPhysical(_a);
const s16* const data = reinterpret_cast(RDRAM + address);
@@ -30,22 +34,22 @@ void F3DFLX2_LoadAlphaLight(u32 _a)
}
static
-void F3DFLX2_MoveMem(u32 w0, u32 w1)
+void F3DFLX2_MoveMem(const Gwords words)
{
- switch (_SHIFTR(w0, 0, 8))
+ switch (_SHIFTR(words.w0, 0, 8))
{
case G_MV_LIGHT:
{
- const u32 offset = (w0 >> 5) & 0x7F8;
+ const u32 offset = (words.w0 >> 5) & 0x7F8;
const u32 n = offset / 24;
if (n == 1)
- F3DFLX2_LoadAlphaLight(w1);
+ F3DFLX2_LoadAlphaLight(words.w1);
else
- gSPLight(w1, n - 1);
+ gSPLight(words.w1, n - 1);
}
break;
default:
- F3DEX2_MoveMem(w0, w1);
+ F3DEX2_MoveMem(words);
break;
}
}
diff --git a/src/uCodes/F3DGOLDEN.cpp b/src/uCodes/F3DGOLDEN.cpp
index 2e6736bd..9e4d81f4 100644
--- a/src/uCodes/F3DGOLDEN.cpp
+++ b/src/uCodes/F3DGOLDEN.cpp
@@ -14,17 +14,18 @@
u32 G_GOLDEN_MOVEWORD;
-void F3D_TriX(u32 w0, u32 w1)
+void F3D_TriX(const Gwords _words)
{
- while(w1 != 0) {
- u32 v0 = w1 & 0xf;
- w1 >>= 4;
+ Gwords words = _words;
+ while(words.w1 != 0) {
+ u32 v0 = words.w1 & 0xf;
+ words.w1 >>= 4;
- u32 v1 = w1 & 0xf;
- w1 >>= 4;
+ u32 v1 = words.w1 & 0xf;
+ words.w1 >>= 4;
- u32 v2 = w0 & 0xf;
- w0 >>= 4;
+ u32 v2 = words.w0 & 0xf;
+ words.w0 >>= 4;
gSPTriangle(v0, v1, v2);
}
diff --git a/src/uCodes/F3DGOLDEN.h b/src/uCodes/F3DGOLDEN.h
index 4849b7a3..4c7823dc 100644
--- a/src/uCodes/F3DGOLDEN.h
+++ b/src/uCodes/F3DGOLDEN.h
@@ -5,7 +5,7 @@
void F3DGOLDEN_Init();
-void F3D_TriX(u32 w0, u32 w1);
+void F3D_TriX(const Gwords words);
#endif
diff --git a/src/uCodes/F3DPD.cpp b/src/uCodes/F3DPD.cpp
index 9ec2a1c5..e86967d9 100644
--- a/src/uCodes/F3DPD.cpp
+++ b/src/uCodes/F3DPD.cpp
@@ -8,14 +8,14 @@
#define F3DPD_VTXCOLORBASE 0x07
-void F3DPD_Vtx( u32 w0, u32 w1 )
+void F3DPD_Vtx( const Gwords words )
{
- gSPCIVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
+ gSPCIVertex( words.w1, _SHIFTR( words.w0, 20, 4 ) + 1, _SHIFTR( words.w0, 16, 4 ) );
}
-void F3DPD_VtxColorBase( u32 w0, u32 w1 )
+void F3DPD_VtxColorBase( const Gwords words )
{
- gSPSetVertexColorBase( w1 );
+ gSPSetVertexColorBase( words.w1 );
}
void F3DPD_Init()
diff --git a/src/uCodes/F3DSETA.cpp b/src/uCodes/F3DSETA.cpp
index aec37e20..d2803b8e 100644
--- a/src/uCodes/F3DSETA.cpp
+++ b/src/uCodes/F3DSETA.cpp
@@ -21,47 +21,47 @@
#define F3DSETA_MW_FOG 0x06
#define F3DSETA_MW_LIGHTCOL 0x08
-void F3DSETA_MoveWord(u32 w0, u32 w1)
+void F3DSETA_MoveWord(const Gwords words)
{
- switch (_SHIFTR( w0, 8, 8 )) {
+ switch (_SHIFTR( words.w0, 8, 8 )) {
case F3DSETA_MW_NUMLIGHT:
- gSPNumLights( ((w1 - 0x80000000) >> 5) - 1 );
+ gSPNumLights( ((words.w1 - 0x80000000) >> 5) - 1 );
break;
case F3DSETA_MW_CLIP:
- gSPClipRatio( w1 );
+ gSPClipRatio( words.w1 );
break;
case F3DSETA_MW_SEGMENT:
- gSPSegment( _SHIFTR( w0, 10, 4 ), w1 & 0x00FFFFFF );
+ gSPSegment( _SHIFTR( words.w0, 10, 4 ), SEGMENT_MASK(words.w1) );
break;
case F3DSETA_MW_FOG:
- gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) );
+ gSPFogFactor( (s16)_SHIFTR( words.w1, 16, 16 ), (s16)_SHIFTR( words.w1, 0, 16 ) );
break;
case F3DSETA_MW_LIGHTCOL:
- switch (_SHIFTR( w0, 0, 8 ))
+ switch (_SHIFTR( words.w0, 0, 8 ))
{
case F3D_MWO_aLIGHT_1:
- gSPLightColor( LIGHT_1, w1 );
+ gSPLightColor( LIGHT_1, words.w1 );
break;
case F3D_MWO_aLIGHT_2:
- gSPLightColor( LIGHT_2, w1 );
+ gSPLightColor( LIGHT_2, words.w1 );
break;
case F3D_MWO_aLIGHT_3:
- gSPLightColor( LIGHT_3, w1 );
+ gSPLightColor( LIGHT_3, words.w1 );
break;
case F3D_MWO_aLIGHT_4:
- gSPLightColor( LIGHT_4, w1 );
+ gSPLightColor( LIGHT_4, words.w1 );
break;
case F3D_MWO_aLIGHT_5:
- gSPLightColor( LIGHT_5, w1 );
+ gSPLightColor( LIGHT_5, words.w1 );
break;
case F3D_MWO_aLIGHT_6:
- gSPLightColor( LIGHT_6, w1 );
+ gSPLightColor( LIGHT_6, words.w1 );
break;
case F3D_MWO_aLIGHT_7:
- gSPLightColor( LIGHT_7, w1 );
+ gSPLightColor( LIGHT_7, words.w1 );
break;
case F3D_MWO_aLIGHT_8:
- gSPLightColor( LIGHT_8, w1 );
+ gSPLightColor( LIGHT_8, words.w1 );
break;
}
break;
@@ -70,9 +70,9 @@ void F3DSETA_MoveWord(u32 w0, u32 w1)
}
}
-void F3DSETA_Perpnorm(u32 w0, u32 w1)
+void F3DSETA_Perpnorm(const Gwords words)
{
- gSPPerspNormalize(w1);
+ gSPPerspNormalize(words.w1);
}
void F3DSETA_Init()
diff --git a/src/uCodes/F3DTEXA.cpp b/src/uCodes/F3DTEXA.cpp
index 1fa8faf2..9e679157 100644
--- a/src/uCodes/F3DTEXA.cpp
+++ b/src/uCodes/F3DTEXA.cpp
@@ -12,18 +12,18 @@
u32 G_TEXA_LOADTEX, G_TEXA_SETTILESIZE;
-void F3DTTEXA_LoadTex(u32 w0, u32 w1)
+void F3DTTEXA_LoadTex(const Gwords words)
{
- RDP_SetTImg(0x3d100000, w1);
- RDP_SetTile(0x35100000, 0x07000000);
- RDP_LoadBlock(0x33000000, 0x27000000 | _SHIFTR(w0, 0, 24));
+ RDP_SetTImg(Gwords(0x3d100000, words.w1));
+ RDP_SetTile(Gwords(0x35100000, 0x07000000));
+ RDP_LoadBlock(Gwords(0x33000000, 0x27000000 | _SHIFTR(words.w0, 0, 24)));
}
-void F3DTTEXA_SetTileSize(u32 w0, u32 w1)
+void F3DTTEXA_SetTileSize(const Gwords words)
{
- const u32 firstHalf = _SHIFTL(_SHIFTR(w1, 24, 8), 9, 8);
- RDP_SetTile(0x35400000 | firstHalf, _SHIFTR(w0, 0, 24));
- RDP_SetTileSize(0x32000000, _SHIFTR(w1, 0, 24));
+ const u32 firstHalf = _SHIFTL(_SHIFTR(words.w1, 24, 8), 9, 8);
+ RDP_SetTile(Gwords(0x35400000 | firstHalf, _SHIFTR(words.w0, 0, 24)));
+ RDP_SetTileSize(Gwords(0x32000000, _SHIFTR(words.w1, 0, 24)));
}
void F3DTEXA_Init()
diff --git a/src/uCodes/F3DZEX2.cpp b/src/uCodes/F3DZEX2.cpp
index 600f9f75..0586d2e4 100644
--- a/src/uCodes/F3DZEX2.cpp
+++ b/src/uCodes/F3DZEX2.cpp
@@ -7,9 +7,9 @@
#define F3DZEX2_BRANCH_W 0x04
-void F3DZEX2_Branch_W( u32 w0, u32 w1 )
+void F3DZEX2_Branch_W( const Gwords words )
{
- gSPBranchLessW(gDP.half_1, _SHIFTR( w0, 1, 7 ), w1);
+ gSPBranchLessW(gDP.half_1, _SHIFTR( words.w0, 1, 7 ), words.w1);
}
void F3DZEX2_Init()
diff --git a/src/uCodes/F5Indi_Naboo.cpp b/src/uCodes/F5Indi_Naboo.cpp
index b661ea93..56c0bc25 100644
--- a/src/uCodes/F5Indi_Naboo.cpp
+++ b/src/uCodes/F5Indi_Naboo.cpp
@@ -90,29 +90,30 @@ void F5INDI_LoadSTMatrix()
}
static
-void F5INDI_DMA_Direct(u32 _w0, u32 _w1)
+void F5INDI_DMA_Direct(const Gwords words)
{
- u32 * pSrc = CAST_RDRAM(u32*, _SHIFTR(_w1, 0, 24));
- u32 * pDst = CAST_DMEM(u32*, _SHIFTR(_w0, 8, 12));
- const u32 count = (_SHIFTR(_w0, 0, 8) + 1) >> 2;
+ u32 * pSrc = CAST_RDRAM(u32*, _SHIFTR(words.w1, 0, 24));
+ u32 * pDst = CAST_DMEM(u32*, _SHIFTR(words.w0, 8, 12));
+ const u32 count = (_SHIFTR(words.w0, 0, 8) + 1) >> 2;
for (u32 i = 0; i < count; ++i) {
pDst[i] = pSrc[i];
}
}
static
-void F5INDI_DMA_Segmented(u32 _w0, u32 _w1)
+void F5INDI_DMA_Segmented(const Gwords words)
{
- if (_SHIFTR(_w0, 0, 8) == 0)
+ if (_SHIFTR(words.w0, 0, 8) == 0)
return;
u32 * FD4 = CAST_DMEM(u32*, 0xFD4);
u32 * FD8 = CAST_DMEM(u32*, 0xFD8);
u32 * FDC = CAST_DMEM(u32*, 0xFDC);
- s32 A0 = _SHIFTR(_w0, 0, 8);
+ s32 A0 = _SHIFTR(words.w0, 0, 8);
u32 A2 = *FDC;
s32 A3 = A0 + 1;
s32 A1 = A2 - A3;
- u32 V1 = _SHIFTR(_w0, 8, 12);
+ u32 V1 = _SHIFTR(words.w0, 8, 12);
+ word tmp;
while (A1 < 0) {
u32 V0 = *FD4;
A3 = A0 - A2;
@@ -120,12 +121,12 @@ void F5INDI_DMA_Segmented(u32 _w0, u32 _w1)
V1 += A2;
A0 = A3;
- _w1 = *FD8;
+ tmp = *FD8;
- u32 * pSrc = CAST_RDRAM(u32*, _SHIFTR(_w1, 0, 24));
+ u32 * pSrc = CAST_RDRAM(u32*, _SHIFTR(tmp, 0, 24));
*FD8 = *pSrc;
*FDC = 0x100;
- *FD4 = _w1 + 0x08;
+ *FD4 = tmp + 0x08;
A2 = *FDC;
A3 = A0 + 1;
@@ -140,10 +141,10 @@ void F5INDI_DMA_Segmented(u32 _w0, u32 _w1)
}
static
-void F5INDI_Lighting_Overlay1(u32 _w0, u32 _w1)
+void F5INDI_Lighting_Overlay1(const Gwords words)
{
static bool showErrorMessage = true;
- const u32 S = ((_SHIFTR(_w1, 24, 7) << 2) + 4) & 0xFFF8;
+ const u32 S = ((_SHIFTR(words.w1, 24, 7) << 2) + 4) & 0xFFF8;
memset(DMEM + 0xD40, 0, S);
u8 L = *(DMEM + (0x58B ^ 3));
@@ -153,7 +154,7 @@ void F5INDI_Lighting_Overlay1(u32 _w0, u32 _w1)
}
u32 lightAddr = 0xB10;
- const u32 dataAddr = _SHIFTR(_w0, 8, 12);
+ const u32 dataAddr = _SHIFTR(words.w0, 8, 12);
while (true) {
u8 * dst = DMEM + 0xD40;
@@ -209,7 +210,7 @@ void F5INDI_Lighting_Overlay1(u32 _w0, u32 _w1)
++V;
s16 Z1 = (s16)_SHIFTR(*V, 16, 16);
- const u32 addr = 0x170 + offsetAddr[offsetAddrIdx ^ 3];
+ const word addr = 0x170 + offsetAddr[offsetAddrIdx ^ 3];
if (addr >= 0x1000 && showErrorMessage) {
dwnd().getDrawer().showMessage("Wrong data address detected!!! Please report to developers.\n", Milliseconds(5000));
showErrorMessage = false;
@@ -289,9 +290,9 @@ void F5INDI_Lighting_Overlay1(u32 _w0, u32 _w1)
}
static
-void F5INDI_Lighting_Overlay2(u32 _w0, u32 _w1)
+void F5INDI_Lighting_Overlay2(const Gwords words)
{
- const u32 S = ((_SHIFTR(_w1, 24, 7) << 2) + 4) & 0xFFF8;
+ const u32 S = ((_SHIFTR(words.w1, 24, 7) << 2) + 4) & 0xFFF8;
memset(DMEM + 0xD40, 0, S + 8);
u8 L = *(DMEM + (0x58B ^ 3));
@@ -301,7 +302,7 @@ void F5INDI_Lighting_Overlay2(u32 _w0, u32 _w1)
}
u32 lightAddr = 0xB10;
- const u32 dataAddr = _SHIFTR(_w0, 8, 12);
+ const u32 dataAddr = _SHIFTR(words.w0, 8, 12);
while (true) {
u8 * dst = DMEM + 0xD40;
@@ -435,11 +436,11 @@ void F5INDI_Lighting_Overlay2(u32 _w0, u32 _w1)
}
static
-void F5INDI_Lighting_Basic(u32 _w0, u32 _w1)
+void F5INDI_Lighting_Basic(const Gwords words)
{
- s32 count = _SHIFTR(_w1, 24, 7);
+ s32 count = _SHIFTR(words.w1, 24, 7);
const u8* factor = DMEM + 0x158;
- const u8* data = DMEM + _SHIFTR(_w0, 8, 12);
+ const u8* data = DMEM + _SHIFTR(words.w0, 8, 12);
u8 * dst = DMEM + 0xD40;
while (count > 0) {
for (u32 j = 0; j < 8; ++j) {
@@ -457,10 +458,10 @@ void F5INDI_Lighting_Basic(u32 _w0, u32 _w1)
}
static
-void F5INDI_RebuildAndAdjustColors(u32 _w0, u32 _w1)
+void F5INDI_RebuildAndAdjustColors(const Gwords words)
{
- const u32 addr = _SHIFTR(_w0, 8, 12);
- const u32 count = std::min(_SHIFTR(_w1, 24, 8), (0x588 - addr) >> 2);
+ const u32 addr = _SHIFTR(words.w0, 8, 12);
+ const u32 count = std::min((u32)_SHIFTR(words.w1, 24, 8), (u32)((0x588 - addr) >> 2));
const u16* data = CAST_DMEM(const u16*, addr);
std::vector vres(count);
for (u32 i = 0; i < count; ++i) {
@@ -474,7 +475,7 @@ void F5INDI_RebuildAndAdjustColors(u32 _w0, u32 _w1)
}
static
-const SWVertex * F5INDI_LoadVtx(u32 _w0, u32 _w1, std::vector & _vres)
+const SWVertex * F5INDI_LoadVtx(word _w0, word _w1, std::vector & _vres)
{
const u32 count = _SHIFTR(_w1, 24, 8);
const u32 dmem_addr = _SHIFTR(_w0, 8, 12);
@@ -499,7 +500,7 @@ const SWVertex * F5INDI_LoadVtx(u32 _w0, u32 _w1, std::vector & _vres)
}
static
-const SWVertex * F5INDI_AdjustVtx(u32 _w0, u32 _w1, std::vector & _vres)
+const SWVertex * F5INDI_AdjustVtx(word _w0, word _w1, std::vector & _vres)
{
const u32 dmem_addr = _SHIFTR(_w0, 8, 12);
if (*CAST_DMEM(const u64*, 0x128) == 0)
@@ -524,26 +525,26 @@ const SWVertex * F5INDI_AdjustVtx(u32 _w0, u32 _w1, std::vector & _vre
}
static
-void F5INDI_MoveMem(u32 _w0, u32 _w1)
+void F5INDI_MoveMem(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F5INDI_01Cmd (0x%08x, 0x%08x)\n", _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F5INDI_01Cmd (0x%08x, 0x%08x)\n", words.w0, words.w1);
- if (_SHIFTR(_w1, 0, 24) != 0)
- F5INDI_DMA_Direct(_w0, _w1);
+ if (_SHIFTR(words.w1, 0, 24) != 0)
+ F5INDI_DMA_Direct(words);
else
- F5INDI_DMA_Segmented(_w0, _w1);
+ F5INDI_DMA_Segmented(words);
- switch (_w0 & 0x00f00000) {
+ switch (words.w0 & 0x00f00000) {
case 0x00000000:
- switch (_w0) {
+ switch (words.w0) {
case 0x0101300F:
- gSPViewport(_w1);
+ gSPViewport(words.w1);
break;
case 0x0105C03F:
- gSPForceMatrix(_w1);
+ gSPForceMatrix(words.w1);
break;
case 0x010E403F:
- RSP_LoadMatrix(getIndiData().mtx_vtx_gen, _SHIFTR(_w1, 0, 24));
+ RSP_LoadMatrix(getIndiData().mtx_vtx_gen, _SHIFTR(words.w1, 0, 24));
F5INDI_LoadSTMatrix();
break;
}
@@ -552,69 +553,69 @@ void F5INDI_MoveMem(u32 _w0, u32 _w1)
case 0x00100000:
{
std::vector vertices;
- const u32 n = _SHIFTR(_w1, 24, 7);
- gSPSWVertex(F5INDI_AdjustVtx(_w0, _w1, vertices), n, nullptr);
+ const u32 n = _SHIFTR(words.w1, 24, 7);
+ gSPSWVertex(F5INDI_AdjustVtx(words.w0, words.w1, vertices), n, nullptr);
}
break;
case 0x00300000:
// Set num of lights
- *(DMEM + (0x058B^3)) = static_cast(_w1 >> 24);
+ *(DMEM + (0x058B^3)) = static_cast(words.w1 >> 24);
break;
case 0x00500000:
{
- const u32 n = _SHIFTR(_w1, 24, 7);
+ const u32 n = _SHIFTR(words.w1, 24, 7);
std::vector vres(n);
- gSPSWVertex(F5INDI_LoadVtx(_w0, _w1, vres), n, nullptr);
+ gSPSWVertex(F5INDI_LoadVtx(words.w0, words.w1, vres), n, nullptr);
}
break;
default:
- if (_SHIFTR(_w0, 8, 12) == 0x480) {
+ if (_SHIFTR(words.w0, 8, 12) == 0x480) {
// Lighting
- const u32 F = (_w0 >> 22);
+ const u32 F = (words.w0 >> 22);
if ((F & 2) != 0)
- F5INDI_RebuildAndAdjustColors(_w0, _w1);
+ F5INDI_RebuildAndAdjustColors(words);
const u8 L = *(DMEM + (0x58B ^ 3));
- const u32 C = _SHIFTR(_w1, 24, 8) | L;
+ const u32 C = _SHIFTR(words.w1, 24, 8) | L;
if ((C & 0x80) == 0) {
if ((F & 1) != 0)
- F5INDI_Lighting_Overlay1(_w0, _w1);
+ F5INDI_Lighting_Overlay1(words);
else
- F5INDI_Lighting_Overlay2(_w0, _w1);
+ F5INDI_Lighting_Overlay2(words);
} else
- F5INDI_Lighting_Basic(_w0, _w1);
+ F5INDI_Lighting_Basic(words);
}
break;
}
}
static
-void F5INDI_SetDListAddr(u32 _w0, u32 _w1)
+void F5INDI_SetDListAddr(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F5INDI_SetDListAddr (0x%08x, 0x%08x)\n", _w0, _w1);
- const u32 count = _w0 & 0x1FF;
- const u32 * pSrc = CAST_RDRAM(const u32*, _SHIFTR(_w1, 0, 24));
+ DebugMsg(DEBUG_NORMAL, "F5INDI_SetDListAddr (0x%08x, 0x%08x)\n", words.w0, words.w1);
+ const u32 count = words.w0 & 0x1FF;
+ const u32 * pSrc = CAST_RDRAM(const u32*, _SHIFTR(words.w1, 0, 24));
u32 * pDst = CAST_DMEM(u32*, 0xFD4);
- pDst[0] = _w1 + 8;
+ pDst[0] = words.w1 + 8;
pDst[1] = *pSrc;
pDst[2] = count;
}
static
-void F5INDI_DList(u32 _w0, u32 _w1)
+void F5INDI_DList(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F5INDI_DList (0x%08x)\n", _w1);
- gSPDisplayList(_w1);
+ DebugMsg(DEBUG_NORMAL, "F5INDI_DList (0x%08x)\n", words.w1);
+ gSPDisplayList(words.w1);
_updateF5DL();
}
static
-void F5INDI_BranchDList(u32 _w0, u32 _w1)
+void F5INDI_BranchDList(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F5INDI_BranchDList (0x%08x)\n", _w1);
- gSPBranchList(_w1);
+ DebugMsg(DEBUG_NORMAL, "F5INDI_BranchDList (0x%08x)\n", words.w1);
+ gSPBranchList(words.w1);
_updateF5DL();
}
@@ -670,29 +671,29 @@ void F5INDI_DoSubDList()
RSP.PCi++;
RSP.F5DL[RSP.PCi] = _SHIFTR(*CAST_RDRAM(const u32*, dlistAddr), 0, 24);
- RSP.PC[RSP.PCi] = dlistAddr + 8;
+ RSP.PC[RSP.PCi] = dlistAddr + sizeof(Gwords);
while (true) {
- RSP.w0 = *CAST_RDRAM(u32*, RSP.PC[RSP.PCi]);
- RSP.w1 = *CAST_RDRAM(u32*, RSP.PC[RSP.PCi] + 4);
+ RSP.words.w0 = *CAST_RDRAM(u32*, RSP.PC[RSP.PCi]);
+ RSP.words.w1 = *CAST_RDRAM(u32*, RSP.PC[RSP.PCi] + 4);
- RSP.cmd = _SHIFTR(RSP.w0, 24, 8);
+ RSP.cmd = _SHIFTR(RSP.words.w0, 24, 8);
- DebugMsg(DEBUG_LOW, "0x%08lX: CMD=0x%02X W0=0x%08X W1=0x%08X\n", RSP.PC[RSP.PCi], RSP.cmd, RSP.w0, RSP.w1);
+ DebugMsg(DEBUG_LOW, "0x%08lX: CMD=0x%02X W0=0x%08X W1=0x%08X\n", RSP.PC[RSP.PCi], RSP.cmd, RSP.words.w0, RSP.words.w1);
- if (RSP.w0 == 0xB8000000 && RSP.w1 == 0xFFFFFFFF)
+ if (RSP.words.w0 == 0xB8000000 && RSP.words.w1 == 0xFFFFFFFF)
break;
RSP.nextCmd = _SHIFTR(*CAST_RDRAM(const u32*, RSP.PC[RSP.PCi] + 8), 24, 8);
- GBI.cmd[RSP.cmd](RSP.w0, RSP.w1);
+ GBI.cmd[RSP.cmd](RSP.words);
RSP.PC[RSP.PCi] += 8;
if (RSP.nextCmd == 0xBD) {
// Naboo
u32* command = CAST_DMEM(u32*, 0xE58);
- command[0] = RSP.w0;
- command[1] = RSP.w1;
+ command[0] = RSP.words.w0;
+ command[1] = RSP.words.w1;
break;
}
}
@@ -729,15 +730,15 @@ bool F5INDI_AddVertices(const u32 _vert[3], GraphicsDrawer & _drawer)
return true;
}
-void F5INDI_Tri(u32 _w0, u32 _w1)
+void F5INDI_Tri(const Gwords words)
{
const bool bTri2 = RSP.cmd == F5INDI_TRI2;
- DebugMsg(DEBUG_NORMAL, "F5INDI_Tri%d (0x%08x, 0x%08x)\n", bTri2 ? 2 : 1, _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F5INDI_Tri%d (0x%08x, 0x%08x)\n", bTri2 ? 2 : 1, words.w0, words.w1);
const u32* params = CAST_RDRAM(const u32*, RSP.PC[RSP.PCi]);
const u32 w3 = params[3];
- const u32 v1 = (_SHIFTR(_w1, 16, 12) - 0x600) / 40;
- const u32 v2 = (_SHIFTR(_w1, 0, 12) - 0x600) / 40;
+ const u32 v1 = (_SHIFTR(words.w1, 16, 12) - 0x600) / 40;
+ const u32 v2 = (_SHIFTR(words.w1, 0, 12) - 0x600) / 40;
const u32 v3 = (_SHIFTR( w3, 16, 12) - 0x600) / 40;
const u32 v4 = (_SHIFTR( w3, 0, 12) - 0x600) / 40;
const u32 vert[4] = { v1, v2, v3, v4 };
@@ -754,11 +755,11 @@ void F5INDI_Tri(u32 _w0, u32 _w1)
const u32 C4 = *CAST_DMEM(const u32*, 0xD40 + S4);
const u32 colors[4] = { C1, C2, C3, C4 };
- const bool useTex = (_w0 & 0x0200) != 0;
+ const bool useTex = (words.w0 & 0x0200) != 0;
u32 ST[4];
const u32 * texbase;
- if ((_w0 & 0x0800) != 0) {
+ if ((words.w0 & 0x0800) != 0) {
F5INDI_CalcST(params, ST);
texbase = ST;
} else {
@@ -823,7 +824,7 @@ void F5INDI_Tri(u32 _w0, u32 _w1)
RSP.PC[RSP.PCi] += 8;
}
-void F5INDI_GenVertices(u32 _w0, u32 _w1)
+void F5INDI_GenVertices(const Gwords words)
{
f32 combined[4][4];
memcpy(combined, gSP.matrix.combined, sizeof(combined));
@@ -832,7 +833,7 @@ void F5INDI_GenVertices(u32 _w0, u32 _w1)
const SWVertex * vertex = CAST_DMEM(const SWVertex*, 0x170);
bool verticesToProcess[32];
- u32 A = (_w0 & 0x0000FFFF) | (_w1 & 0xFFFF0000);
+ u32 A = (words.w0 & 0x0000FFFF) | (words.w1 & 0xFFFF0000);
u32 B = 1;
u32 count = 0;
@@ -1469,17 +1470,17 @@ void F5Naboo_PrepareAndDrawTriangle(const u32 _vert[3], GraphicsDrawer & _drawer
const u32 C = A | B;
CAST_DMEM(u16*, 0x100)[0x0 ^ 1] = C;
- auto doCommands = [](u32 addr)
+ auto doCommands = [](word addr)
{
const u32 * commands = CAST_DMEM(const u32*, addr);
u32 w0 = commands[0];
u32 w1 = commands[1];
u32 cmd = _SHIFTR(w0, 24, 8);
- GBI.cmd[cmd](w0, w1);
+ GBI.cmd[cmd](Gwords(w0, w1));
w0 = commands[2];
w1 = commands[3];
cmd = _SHIFTR(w0, 24, 8);
- GBI.cmd[cmd](w0, w1);
+ GBI.cmd[cmd](Gwords(w0, w1));
};
const u32 dlistAddr = _SHIFTR(*CAST_DMEM(const u32*, 0x58C), 0, 24);
@@ -1851,14 +1852,14 @@ void F5Naboo_GenVertices0C()
};
- for (u32 addrShift = startAddr; addrShift <= endAddr; addrShift += 4) {
+ for (word addrShift = startAddr; addrShift <= endAddr; addrShift += 4) {
PrepareVertexDataStep3(vd1);
PrepareVertexDataStep3(vd2);
// Step 4
- const u32 addr1 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr), 16, 16) + addrShift;
- const u32 addr2 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr + 8), 16, 16) + addrShift;
+ const word addr1 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr), 16, 16) + addrShift;
+ const word addr2 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr + 8), 16, 16) + addrShift;
PrepareVertexDataStep4_7(addr1, vd1);
PrepareVertexDataStep4_7(addr2, vd2);
@@ -2026,8 +2027,8 @@ void F5Naboo_GenVertices09()
for (u32 i = 0; i < 4; ++i)
pDst[i] = (pSrc1[i] + pSrc2[i]) >> 1;
};
- const u32 addr3 = _SHIFTR(_V, 16, 16) + _addrShift + (_addrShift & 4);
- const u32 addr4 = _SHIFTR(_V, 0, 16) + _addrShift - (_addrShift & 4);
+ const word addr3 = _SHIFTR(_V, 16, 16) + _addrShift + (_addrShift & 4);
+ const word addr4 = _SHIFTR(_V, 0, 16) + _addrShift - (_addrShift & 4);
const u32 factor1 = 0x7FFF - _vd.L;
const u32 factor2 = 0xFFFE - _vd.M - _vd.N;
u32 U = *CAST_DMEM(const u32*, _addr);
@@ -2086,15 +2087,15 @@ void F5Naboo_GenVertices09()
*CAST_DMEM(u32*, _addr + 0x168) = _vd.color2.color;
};
- for (u32 addrShift = startAddr; addrShift <= endAddr; addrShift += 4) {
+ for (word addrShift = startAddr; addrShift <= endAddr; addrShift += 4) {
PrepareVertexDataStep3(vd1);
PrepareVertexDataStep3(vd2);
// Step 4
- const u32 addr1 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr), 16, 16) + addrShift;
- const u32 addr2 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr + 8), 16, 16) + addrShift;
- //const u32 addrShift2 = addrShift + (addrShift & 4);
+ const word addr1 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr), 16, 16) + addrShift;
+ const word addr2 = _SHIFTR(*CAST_DMEM(const u32*, dmemSrcAddr + 8), 16, 16) + addrShift;
+ //const word addrShift2 = addrShift + (addrShift & 4);
PrepareVertexDataStep4(addr1, *CAST_DMEM(const u32*, dmemSrcAddr + 0x20), addrShift, vd1);
PrepareVertexDataStep4(addr2, *CAST_DMEM(const u32*, dmemSrcAddr + 0x24), addrShift, vd2);
@@ -2165,16 +2166,16 @@ void F5Naboo_GenVertices09()
}
static
-void F5NABOO_TexturedPolygons(u32, u32)
+void F5NABOO_TexturedPolygons(const Gwords words)
{
F5Naboo_DrawPolygons();
}
static
-void F5INDI_GeometryGen(u32 _w0, u32 _w1)
+void F5INDI_GeometryGen(const Gwords words)
{
- const u32 mode = _SHIFTR(_w1, 0, 8);
- DebugMsg(DEBUG_NORMAL, "F5INDI_GeometryGen (0x%08x, 0x%08x): mode=0x%02x\n", _w0, _w1, mode);
+ const u32 mode = _SHIFTR(words.w1, 0, 8);
+ DebugMsg(DEBUG_NORMAL, "F5INDI_GeometryGen (0x%08x, 0x%08x): mode=0x%02x\n", words.w0, words.w1, mode);
switch (mode) {
case 0x09: // Naboo
F5Naboo_GenVertices09();
@@ -2198,7 +2199,7 @@ void F5INDI_GeometryGen(u32 _w0, u32 _w1)
RSP.PC[RSP.PCi] += 24;
break;
case 0x18:
- F5INDI_GenVertices(_w0, _w1);
+ F5INDI_GenVertices(words);
break;
case 0x24:
F5INDI_DoSubDList();
@@ -2216,15 +2217,15 @@ void F5INDI_GeometryGen(u32 _w0, u32 _w1)
}
static
-void F5INDI_Texrect(u32 _w0, u32 _w1)
+void F5INDI_Texrect(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F5INDI_Texrect (0x%08x, 0x%08x)\n", _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F5INDI_Texrect (0x%08x, 0x%08x)\n", words.w0, words.w1);
F5INDI_DoSubDList();
- RDP_TexRect(_w0, _w1);
+ RDP_TexRect(words);
}
static
-void F5INDI_JumpDL(u32 _w0, u32 _w1)
+void F5INDI_JumpDL(const Gwords words)
{
DebugMsg(DEBUG_NORMAL, "F5INDI_JumpDL\n");
RSP.PC[RSP.PCi] = RSP.F5DL[RSP.PCi];
@@ -2232,25 +2233,25 @@ void F5INDI_JumpDL(u32 _w0, u32 _w1)
}
static
-void F5INDI_EndDisplayList(u32 _w0, u32 _w1)
+void F5INDI_EndDisplayList(const Gwords words)
{
DebugMsg(DEBUG_NORMAL, "F5INDI_EndDisplayList\n");
- gSPEndDisplayList();
+ gSPEndDisplayList(words);
}
static
-void F5INDI_MoveWord(u32 _w0, u32 _w1)
+void F5INDI_MoveWord(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F5INDI_MoveWord (0x%08x, 0x%08x)\n", _w0, _w1);
- const u32 destAddr = _SHIFTR(_w0, 0, 12);
- *CAST_DMEM(u32*, destAddr) = _w1;
+ DebugMsg(DEBUG_NORMAL, "F5INDI_MoveWord (0x%08x, 0x%08x)\n", words.w0, words.w1);
+ const u32 destAddr = _SHIFTR(words.w0, 0, 12);
+ *CAST_DMEM(u32*, destAddr) = words.w1;
switch (destAddr) {
case G_MWO_CLIP_RNX:
case G_MWO_CLIP_RNY:
case G_MWO_CLIP_RPX:
case G_MWO_CLIP_RPY:
- gSPClipRatio(_w1);
+ gSPClipRatio(words.w1);
break;
case G_MW_SEGMENT:
assert(false);
@@ -2260,15 +2261,15 @@ void F5INDI_MoveWord(u32 _w0, u32 _w1)
// Used to adjust colors (See command 0x01 - Case 02)
break;
case 0x160:
- gSP.fog.multiplierf = _FIXED2FLOAT((s32)_w1, 16);
+ gSP.fog.multiplierf = _FIXED2FLOAT((s32)words.w1, 16);
gSP.changed |= CHANGED_FOGPOSITION;
break;
case 0x164:
- gSP.fog.offsetf = _FIXED2FLOAT((s32)_w1, 16);
+ gSP.fog.offsetf = _FIXED2FLOAT((s32)words.w1, 16);
gSP.changed |= CHANGED_FOGPOSITION;
break;
case 0x14C:
- gSPPerspNormalize(_w1);
+ gSPPerspNormalize(words.w1);
break;
case 0x58C:
// sub dlist address;
@@ -2281,19 +2282,19 @@ void F5INDI_MoveWord(u32 _w0, u32 _w1)
}
static
-void F5INDI_SetOtherMode(u32 w0, u32 w1)
+void F5INDI_SetOtherMode(const Gwords words)
{
//u32 mask = (s32)0x80000000 >> _SHIFTR(w0, 0, 5); // unspecified behaviour
- u32 mask = static_cast(s32(0x80000000) / (1 << _SHIFTR(w0, 0, 5)));
- mask >>= _SHIFTR(w0, 8, 5);
+ u32 mask = static_cast(s32(0x80000000) / (1 << _SHIFTR(words.w0, 0, 5)));
+ mask >>= _SHIFTR(words.w0, 8, 5);
- const u32 A0 = _SHIFTR(w0, 16, 3);
+ const u32 A0 = _SHIFTR(words.w0, 16, 3);
if (A0 == 0) {
- gDP.otherMode.h = (gDP.otherMode.h&(~mask)) | w1;
+ gDP.otherMode.h = (gDP.otherMode.h&(~mask)) | words.w1;
if (mask & 0x00300000) // cycle type
gDP.changed |= CHANGED_CYCLETYPE;
} else if (A0 == 4) {
- gDP.otherMode.l = (gDP.otherMode.l&(~mask)) | w1;
+ gDP.otherMode.l = (gDP.otherMode.l&(~mask)) | words.w1;
if (mask & 0x00000003) // alpha compare
gDP.changed |= CHANGED_ALPHACOMPARE;
@@ -2304,26 +2305,26 @@ void F5INDI_SetOtherMode(u32 w0, u32 w1)
}
static
-void F5INDI_SetOtherMode_Conditional(u32 w0, u32 w1)
+void F5INDI_SetOtherMode_Conditional(const Gwords words)
{
- if (_SHIFTR(w0, 23, 1) != *CAST_DMEM(const u32*, 0x11C))
+ if (_SHIFTR(words.w0, 23, 1) != *CAST_DMEM(const u32*, 0x11C))
return;
- F5INDI_SetOtherMode(w0, w1);
+ F5INDI_SetOtherMode(words);
}
static
-void F5INDI_ClearGeometryMode(u32 w0, u32 w1)
+void F5INDI_ClearGeometryMode(const Gwords words)
{
- gSPClearGeometryMode(~w1);
+ gSPClearGeometryMode(~words.w1);
}
static
-void F5INDI_Texture(u32 w0, u32 w1)
+void F5INDI_Texture(const Gwords words)
{
- F3D_Texture(w0, w1);
- *CAST_DMEM(u32*, 0x148) = w0;
- const u32 V0 = (gSP.geometryMode ^ w0) & 2;
+ F3D_Texture(words);
+ *CAST_DMEM(u32*, 0x148) = words.w0;
+ const u32 V0 = (gSP.geometryMode ^ words.w0) & 2;
gSP.geometryMode ^= V0;
}
diff --git a/src/uCodes/F5Rogue.cpp b/src/uCodes/F5Rogue.cpp
index 3648c055..1a3a165c 100644
--- a/src/uCodes/F5Rogue.cpp
+++ b/src/uCodes/F5Rogue.cpp
@@ -21,6 +21,10 @@
#include "FrameBuffer.h"
#include "DisplayWindow.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#endif
+
#define F3DSWRS_VTXCOLOR 0x02
#define F3DSWRS_MOVEMEM 0x03
#define F3DSWRS_VTX 0x04
@@ -133,22 +137,22 @@ void _updateF5DL()
RSP.F5DL[RSP.PCi] = _SHIFTR(*(u32*)&RDRAM[RSP.PC[RSP.PCi]], 0, 24);
}
-void F3DSWRS_Mtx(u32 w0, u32 w1)
+void F3DSWRS_Mtx(const Gwords words)
{
- const u32 param = _SHIFTR(w0, 16, 8);
+ const u32 param = _SHIFTR(words.w0, 16, 8);
if ((param & G_MTX_PROJECTION) != 0)
- F3DSWRS_PerspMatrixAddress = _SHIFTR(w1, 0, 24);
- F3D_Mtx(w0, w1);
+ F3DSWRS_PerspMatrixAddress = _SHIFTR(words.w1, 0, 24);
+ F3D_Mtx(words);
}
-void F3DSWRS_VertexColor(u32, u32 _w1)
+void F3DSWRS_VertexColor(const Gwords words)
{
- gSPSetVertexColorBase(_w1);
+ gSPSetVertexColorBase(words.w1);
}
-void F3DSWRS_MoveMem(u32 _w0, u32)
+void F3DSWRS_MoveMem(const Gwords words)
{
- switch (_SHIFTR(_w0, 16, 8)) {
+ switch (_SHIFTR(words.w0, 16, 8)) {
case F3D_MV_VIEWPORT://G_MV_VIEWPORT:
F3DSWRS_ViewportAddress = _SHIFTR((RSP.PC[RSP.PCi] + 8), 0, 24);
gSPViewport(F3DSWRS_ViewportAddress);
@@ -163,12 +167,12 @@ void F3DSWRS_MoveMem(u32 _w0, u32)
RSP.PC[RSP.PCi] += 16;
}
-void F3DSWRS_Vtx(u32 _w0, u32 _w1)
+void F3DSWRS_Vtx(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_Vtx (0x%08x, 0x%08x)\n", _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_Vtx (0x%08x, 0x%08x)\n", words.w0, words.w1);
- const u32 address = RSP_SegmentToPhysical(_w1);
- const u32 n = _SHIFTR(_w0, 10, 6);
+ const word address = RSP_SegmentToPhysical(words.w1);
+ const u32 n = _SHIFTR(words.w0, 10, 6);
if ((address + sizeof(SWVertex)* n) > RDRAMSize)
return;
@@ -972,18 +976,18 @@ void TriGen02()
drawer.drawTriangles();
}
-void F3DSWRS_TriGen(u32 _w0, u32 _w1)
+void F3DSWRS_TriGen(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_TriGen (0x%08x, 0x%08x)\n", _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_TriGen (0x%08x, 0x%08x)\n", words.w0, words.w1);
const u32 nextCmd = RSP.nextCmd;
RSP.nextCmd = G_TRI1;
- const u32 mode = _SHIFTR(_w0, 8, 8);
+ const u32 mode = _SHIFTR(words.w0, 8, 8);
switch (mode) {
case 0x00:
{
- const u32 mode00 = _SHIFTR(_w0, 0, 8);
+ const u32 mode00 = _SHIFTR(words.w0, 0, 8);
switch (mode00) {
case 0x00:
TriGen0000();
@@ -1007,31 +1011,31 @@ void F3DSWRS_TriGen(u32 _w0, u32 _w1)
RSP.PC[RSP.PCi] += 32;
}
-void F3DSWRS_JumpSWDL(u32, u32)
+void F3DSWRS_JumpSWDL(const Gwords words)
{
DebugMsg(DEBUG_NORMAL, "F3DSWRS_JumpSWDL\n");
RSP.PC[RSP.PCi] = RSP.F5DL[RSP.PCi];
_updateF5DL();
}
-void F3DSWRS_DList(u32, u32 _w1)
+void F3DSWRS_DList(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_DList (0x%08x)\n", _w1);
- gSPDisplayList(_w1);
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_DList (0x%08x)\n", words.w1);
+ gSPDisplayList(words.w1);
_updateF5DL();
}
-void F3DSWRS_BranchDList(u32, u32 _w1)
+void F3DSWRS_BranchDList(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_BranchDList (0x%08x)\n", _w1);
- gSPBranchList(_w1);
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_BranchDList (0x%08x)\n", words.w1);
+ gSPBranchList(words.w1);
_updateF5DL();
}
-void F3DSWRS_EndDisplayList(u32, u32)
+void F3DSWRS_EndDisplayList(const Gwords words)
{
DebugMsg(DEBUG_NORMAL, "F3DSWRS_EndDisplayList\n");
- gSPEndDisplayList();
+ gSPEndDisplayList(words);
// _updateSWDL();
}
@@ -1041,7 +1045,7 @@ void _addVertices(const u32 _vert[3], GraphicsDrawer & _drawer)
if (_drawer.isClipped(_vert[0], _vert[1], _vert[2]))
return;
- SPVertex & vtx0 = _drawer.getVertex(_vert[(((RSP.w1 >> 24) & 3) % 3)]);
+ SPVertex & vtx0 = _drawer.getVertex(_vert[(((RSP.words.w1 >> 24) & 3) % 3)]);
for (u32 i = 0; i < 3; ++i) {
SPVertex & vtx = _drawer.getVertex(_vert[i]);
@@ -1067,21 +1071,21 @@ void _addVertices(const u32 _vert[3], GraphicsDrawer & _drawer)
}
}
-void F3DSWRS_Tri(u32 _w0, u32 _w1)
+void F3DSWRS_Tri(const Gwords words)
{
const bool bTri2 = RSP.cmd == F3DSWRS_TRI2;
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_Tri%d (0x%08x, 0x%08x)\n", bTri2 ? 2 : 1, _w0, _w1);
- const u32 v1 = (_SHIFTR(_w1, 13, 11) & 0x7F8) / 40;
- const u32 v2 = (_SHIFTR( _w1, 5, 11 ) & 0x7F8) / 40;
- const u32 v3 = ((_w1 << 3) & 0x7F8) / 40;
- const u32 v4 = (_SHIFTR( _w1, 21, 11 ) & 0x7F8) / 40;
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_Tri%d (0x%08x, 0x%08x)\n", bTri2 ? 2 : 1, words.w0, words.w1);
+ const u32 v1 = (_SHIFTR(words.w1, 13, 11) & 0x7F8) / 40;
+ const u32 v2 = (_SHIFTR( words.w1, 5, 11 ) & 0x7F8) / 40;
+ const u32 v3 = ((words.w1 << 3) & 0x7F8) / 40;
+ const u32 v4 = (_SHIFTR( words.w1, 21, 11 ) & 0x7F8) / 40;
const u32 vert[4] = { v1, v2, v3, v4 };
const u32 colorParam = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 8];
const u32 colorIdx[4] = { _SHIFTR(colorParam, 16, 8), _SHIFTR(colorParam, 8, 8),
_SHIFTR(colorParam, 0, 8), _SHIFTR(colorParam, 24, 8) };
- const bool useTex = (_w0 & 2) != 0;
+ const bool useTex = (words.w0 & 2) != 0;
const u8 * texbase = RDRAM + RSP.PC[RSP.PCi] + 16;
F3DSWRS_PrepareVertices(vert, RDRAM + gSP.vertexColorBase, colorIdx, texbase, useTex, gDP.otherMode.texturePersp != 0, bTri2 ? 4 : 3);
@@ -1106,35 +1110,35 @@ void F3DSWRS_Tri(u32 _w0, u32 _w1)
RSP.PC[RSP.PCi] += 8;
}
-void F3DSWRS_MoveWord(u32 _w0, u32 _w1)
+void F3DSWRS_MoveWord(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_MoveWord (0x%08x, 0x%08x)\n", _w0, _w1);
- switch (_SHIFTR(_w0, 0, 8)){
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_MoveWord (0x%08x, 0x%08x)\n", words.w0, words.w1);
+ switch (_SHIFTR(words.w0, 0, 8)){
case G_MW_CLIP:
- gSPClipRatio( _w1 );
+ gSPClipRatio( words.w1 );
break;
case G_MW_SEGMENT:
- gSPSegment( _SHIFTR( _w0, 8, 16 ) >> 2, _w1 & 0x00FFFFFF );
+ gSPSegment( _SHIFTR( words.w0, 8, 16 ) >> 2, SEGMENT_MASK(words.w1) );
break;
case F3DSWRS_MW_FOG_MULTIPLIER:
- gSP.fog.multiplierf = _FIXED2FLOAT((s32)_w1, 16);
+ gSP.fog.multiplierf = _FIXED2FLOAT((s32)words.w1, 16);
gSP.changed |= CHANGED_FOGPOSITION;
break;
case F3DSWRS_MW_FOG_OFFSET:
- gSP.fog.offsetf = _FIXED2FLOAT((s32)_w1, 16);
+ gSP.fog.offsetf = _FIXED2FLOAT((s32)words.w1, 16);
gSP.changed |= CHANGED_FOGPOSITION;
break;
case G_MW_PERSPNORM:
- gSPPerspNormalize( _w1 );
+ gSPPerspNormalize( words.w1 );
break;
}
}
-void F3DSWRS_TexrectGen(u32 _w0, u32 _w1)
+void F3DSWRS_TexrectGen(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_TexrectGen (0x%08x, 0x%08x)\n", _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_TexrectGen (0x%08x, 0x%08x)\n", words.w0, words.w1);
- const u32 vtxIdx = ((_w0 >> 5) & 0x07F8) / 40;
+ const u32 vtxIdx = ((words.w0 >> 5) & 0x07F8) / 40;
const u32* params = (const u32*)&RDRAM[RSP.PC[RSP.PCi]];
@@ -1147,7 +1151,7 @@ void F3DSWRS_TexrectGen(u32 _w0, u32 _w1)
const f32 screenX = v.x / v.w * gSP.viewport.vscale[0] + gSP.viewport.vtrans[0];
const f32 screenY = -v.y / v.w * gSP.viewport.vscale[1] + gSP.viewport.vtrans[1];
- const bool flip = (_w0 & 1) != 0;
+ const bool flip = (words.w0 & 1) != 0;
const u32 w_i = std::max(1U, u32(v.w));
const u32 viewport = *(u32*)&RDRAM[F3DSWRS_ViewportAddress];
@@ -1192,12 +1196,12 @@ void F3DSWRS_TexrectGen(u32 _w0, u32 _w1)
u16 dtdy_i = (u16)((param4Y / offset_y_i) >> 10);
u16 E = 0, F = 0;
- if ((_w0 & 2) != 0) {
+ if ((words.w0 & 2) != 0) {
dsdx_i = -dsdx_i;
E = _SHIFTR(params[4], 16, 16);;
}
- if ((_w0 & 4) != 0) {
+ if ((words.w0 & 4) != 0) {
dtdy_i = -dtdy_i;
F = _SHIFTR(params[4], 0, 16);;
}
@@ -1244,20 +1248,20 @@ void F3DSWRS_TexrectGen(u32 _w0, u32 _w1)
gDPTextureRectangle(ulx, uly, lrx, lry, gSP.texture.tile, (s16)S, (s16)T, dsdx, dtdy, flip);
}
-void F3DSWRS_SetOtherMode_H_EX(u32 _w0, u32 _w1)
+void F3DSWRS_SetOtherMode_H_EX(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_SetOtherMode_H_EX (0x%08x, 0x%08x)\n", _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_SetOtherMode_H_EX (0x%08x, 0x%08x)\n", words.w0, words.w1);
RSP.PC[RSP.PCi] += 8;
gDP.otherMode.h &= *(u32*)&RDRAM[RSP.PC[RSP.PCi]];
- gDP.otherMode.h |= _w1;
+ gDP.otherMode.h |= words.w1;
}
-void F3DSWRS_SetOtherMode_L_EX(u32 _w0, u32 _w1)
+void F3DSWRS_SetOtherMode_L_EX(const Gwords words)
{
- DebugMsg(DEBUG_NORMAL, "F3DSWRS_SetOtherMode_L_EX (0x%08x, 0x%08x)\n", _w0, _w1);
+ DebugMsg(DEBUG_NORMAL, "F3DSWRS_SetOtherMode_L_EX (0x%08x, 0x%08x)\n", words.w0, words.w1);
RSP.PC[RSP.PCi] += 8;
gDP.otherMode.l &= *(u32*)&RDRAM[RSP.PC[RSP.PCi]];
- gDP.otherMode.l |= _w1;
+ gDP.otherMode.l |= words.w1;
}
void F5Rogue_Init()
diff --git a/src/uCodes/L3D.cpp b/src/uCodes/L3D.cpp
index 6fc8e1ff..29d3f082 100644
--- a/src/uCodes/L3D.cpp
+++ b/src/uCodes/L3D.cpp
@@ -9,14 +9,14 @@
#include "gDP.h"
#include "GBI.h"
-void L3D_Line3D( u32 w0, u32 w1 )
+void L3D_Line3D( const Gwords words )
{
- u32 wd = _SHIFTR( w1, 0, 8 );
+ u32 wd = _SHIFTR( words.w1, 0, 8 );
if (wd == 0)
- gSPLine3D( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 24, 8 ) );
+ gSPLine3D( _SHIFTR( words.w1, 16, 8 ) / 10, _SHIFTR( words.w1, 8, 8 ) / 10, _SHIFTR( words.w1, 24, 8 ) );
else
- gSPLineW3D( _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, wd, _SHIFTR( w1, 24, 8 ) );
+ gSPLineW3D( _SHIFTR( words.w1, 16, 8 ) / 10, _SHIFTR( words.w1, 8, 8 ) / 10, wd, _SHIFTR( words.w1, 24, 8 ) );
}
void L3D_Init()
diff --git a/src/uCodes/L3D.h b/src/uCodes/L3D.h
index 485293b2..9828e963 100644
--- a/src/uCodes/L3D.h
+++ b/src/uCodes/L3D.h
@@ -4,7 +4,7 @@
#define L3D_LINE3D 0xB5
-void L3D_Line3D( u32 w0, u32 w1 );
+void L3D_Line3D( word w0, word w1 );
void L3D_Init();
#endif
diff --git a/src/uCodes/L3DEX.cpp b/src/uCodes/L3DEX.cpp
index f8ddf636..e01fab1b 100644
--- a/src/uCodes/L3DEX.cpp
+++ b/src/uCodes/L3DEX.cpp
@@ -11,14 +11,14 @@
#include "gDP.h"
#include "GBI.h"
-void L3DEX_Line3D( u32 w0, u32 w1 )
+void L3DEX_Line3D( const Gwords words )
{
- u32 wd = _SHIFTR( w1, 0, 8 );
+ u32 wd = _SHIFTR( words.w1, 0, 8 );
if (wd == 0)
- gSPLine3D( _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), 0 );
+ gSPLine3D( _SHIFTR( words.w1, 17, 7 ), _SHIFTR( words.w1, 9, 7 ), 0 );
else
- gSPLineW3D( _SHIFTR( w1, 17, 7 ), _SHIFTR( w1, 9, 7 ), wd, 0 );
+ gSPLineW3D( _SHIFTR( words.w1, 17, 7 ), _SHIFTR( words.w1, 9, 7 ), wd, 0 );
}
void L3DEX_Init()
diff --git a/src/uCodes/L3DEX.h b/src/uCodes/L3DEX.h
index ddcfb418..c61d63f2 100644
--- a/src/uCodes/L3DEX.h
+++ b/src/uCodes/L3DEX.h
@@ -2,7 +2,7 @@
#define L3DEX_H
#include "Types.h"
-void L3DEX_Line3D( u32 w0, u32 w1 );
+void L3DEX_Line3D( word w0, word w1 );
void L3DEX_Init();
#endif
diff --git a/src/uCodes/L3DEX2.cpp b/src/uCodes/L3DEX2.cpp
index eaa01a63..aad5d28c 100644
--- a/src/uCodes/L3DEX2.cpp
+++ b/src/uCodes/L3DEX2.cpp
@@ -11,14 +11,14 @@
#include "gDP.h"
#include "GBI.h"
-void L3DEX2_Line3D( u32 w0, u32 w1 )
+void L3DEX2_Line3D( const Gwords words )
{
- u32 wd = _SHIFTR( (w0 + 1), 0, 8 );
+ u32 wd = _SHIFTR( (words.w0 + 1), 0, 8 );
if (wd == 0)
- gSPLine3D( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), 0 );
+ gSPLine3D( _SHIFTR( words.w0, 17, 7 ), _SHIFTR( words.w0, 9, 7 ), 0 );
else
- gSPLineW3D( _SHIFTR( w0, 17, 7 ), _SHIFTR( w0, 9, 7 ), wd, 0 );
+ gSPLineW3D( _SHIFTR( words.w0, 17, 7 ), _SHIFTR( words.w0, 9, 7 ), wd, 0 );
}
void L3DEX2_Init()
diff --git a/src/uCodes/L3DEX2.h b/src/uCodes/L3DEX2.h
index b957efef..bf2ad264 100644
--- a/src/uCodes/L3DEX2.h
+++ b/src/uCodes/L3DEX2.h
@@ -4,7 +4,7 @@
#define L3DEX2_LINE3D 0x08
-void L3DEX2_Line3D( u32 w0, u32 w1 );
+void L3DEX2_Line3D( word w0, word w1 );
void L3DEX2_Init();
#endif
diff --git a/src/uCodes/S2DEX.cpp b/src/uCodes/S2DEX.cpp
index 54f04e60..05ec47f1 100644
--- a/src/uCodes/S2DEX.cpp
+++ b/src/uCodes/S2DEX.cpp
@@ -18,6 +18,11 @@
#include
#include "DisplayWindow.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#define DMEM ((u8*)0)
+#endif
+
using namespace graphics;
#define S2DEX_MV_MATRIX 0
@@ -64,6 +69,63 @@ using namespace graphics;
#define G_TX_LOADTILE 0x07
#define G_TX_RENDERTILE 0x00
+#ifdef NATIVE
+struct uObjBg
+{
+ u16 imageX; /* Texture width (8-byte alignment, u10.2) */
+ u16 imageW; /* x-coordinate of upper-left
+ position of texture (u10.5) */
+ u16 frameX; /* Transfer destination frame width (u10.2) */
+ s16 frameW; /* x-coordinate of upper-left
+ position of transfer destination frame (s10.2) */
+ u16 imageY; /* Texture height (u10.2) */
+ u16 imageH; /* y-coordinate of upper-left position of
+ texture (u10.5) */
+ u16 frameY; /* Transfer destination frame height (u10.2) */
+ s16 frameH; /* y-coordinate of upper-left position of transfer
+ destination frame (s10.2) */
+ u32 imagePtr; /* Address of texture source in DRAM*/
+
+ u16 imageLoad; /* Method for loading the BG image texture
+ G_BGLT_LOADBLOCK (use LoadBlock)
+ G_BGLT_LOADTILE (use LoadTile) */
+ u8 imageFmt; /*Texel format
+ G_IM_FMT_RGBA (RGBA format)
+ G_IM_FMT_YUV (YUV format)
+ G_IM_FMT_CI (CI format)
+ G_IM_FMT_IA (IA format)
+ G_IM_FMT_I (I format) */
+ u8 imageSiz; /* Texel size
+ G_IM_SIZ_4b (4 bits/texel)
+ G_IM_SIZ_8b (8 bits/texel)
+ G_IM_SIZ_16b (16 bits/texel)
+ G_IM_SIZ_32b (32 bits/texel) */
+ u16 imagePal; /* Position of palette for 4-bit color
+ index texture (4-bit precision, 0~15) */
+ u16 imageFlip; /* Image inversion on/off (horizontal
+ direction only)
+ 0 (normal display (no inversion))
+ G_BG_FLAG_FLIPS (horizontal inversion of texture image) */
+ u16 tmemW; /* TMEM width Word size for frame 1 line
+ When LoadBlock GS_PIX2TMEM(imageW/4,imageSiz)
+ When LoadTile GS_PIX2TMEM(frameW/4,imageSiz)+1 */
+ u16 tmemH; /* Quadruple TMEM height(s13.2) which can be loaded at once
+ When normal texture 512/tmemW*4
+ When CI Texture 256/tmemW*4 */
+ u16 tmemLoadSH; /* SH value
+ When LoadBlock tmemSize/2-1
+ When LoadTile tmemW*16-1 */
+ u16 tmemLoadTH; /* TH value or Stride value
+ When LoadBlock GS_CALC_DXT(tmemW)
+ When LoadTile tmemH-1 */
+ u16 tmemSizeW; /* imagePtr skip value for one line of image 1
+ When LoadBlock tmemW*2
+ When LoadTile GS_PIX2TMEM(imageW/4,imageSiz)*2 */
+ u16 tmemSize; /* imagePtr skip value for one load iteration
+ = tmemSizeW*tmemH */
+
+}; /* 40 bytes */
+#else
struct uObjBg {
u16 imageW; /* Texture width (8-byte alignment, u10.2) */
u16 imageX; /* x-coordinate of upper-left
@@ -116,6 +178,9 @@ struct uObjBg {
When LoadBlock tmemW*2
When LoadTile GS_PIX2TMEM(imageW/4,imageSiz)*2 */
}; /* 40 bytes */
+#endif
+
+static_assert(sizeof(uObjBg) == 40, "incorrect uObjBg size");
struct uObjScaleBg
{
@@ -665,7 +730,7 @@ void gSPSetSpriteTile(const uObjSprite *_pObjSprite)
static
void gSPObjLoadTxtr(u32 tx)
{
- const u32 address = RSP_SegmentToPhysical(tx);
+ const word address = RSP_SegmentToPhysical(tx);
uObjTxtr *objTxtr = (uObjTxtr*)&RDRAM[address];
if ((gSP.status[objTxtr->block.sid >> 2] & objTxtr->block.mask) != objTxtr->block.flag) {
@@ -700,7 +765,7 @@ void gSPObjLoadTxtr(u32 tx)
static
void gSPObjRectangle(u32 _sp)
{
- const u32 address = RSP_SegmentToPhysical(_sp);
+ const word address = RSP_SegmentToPhysical(_sp);
uObjSprite *objSprite = (uObjSprite*)&RDRAM[address];
gSPSetSpriteTile(objSprite);
@@ -712,7 +777,7 @@ void gSPObjRectangle(u32 _sp)
static
void gSPObjRectangleR(u32 _sp)
{
- const u32 address = RSP_SegmentToPhysical(_sp);
+ const word address = RSP_SegmentToPhysical(_sp);
const uObjSprite *objSprite = (uObjSprite*)&RDRAM[address];
gSPSetSpriteTile(objSprite);
ObjCoordinates objCoords(objSprite, true);
@@ -727,7 +792,7 @@ void gSPObjRectangleR(u32 _sp)
static
void gSPObjSprite(u32 _sp)
{
- const u32 address = RSP_SegmentToPhysical(_sp);
+ const word address = RSP_SegmentToPhysical(_sp);
uObjSprite *pObjSprite = (uObjSprite*)&RDRAM[address];
gSPSetSpriteTile(pObjSprite);
@@ -926,7 +991,7 @@ void _loadBGImage(const uObjScaleBg * _pBgInfo, bool _loadScale, bool _fbImage)
}
static
-bool _useOnePieceBgCode(u32 address, bool & fbImage)
+bool _useOnePieceBgCode(word address, bool & fbImage)
{
fbImage = false;
if (config.frameBufferEmulation.enable != 0) {
@@ -997,11 +1062,15 @@ void BgRectCopyOnePiece(u32 _bg, bool _fbImage)
DebugMsg(DEBUG_NORMAL, "BgRectCopyOnePiece\n");
}
-//#define runCommand(w0, w1) GBI.cmd[_SHIFTR(w0, 24, 8)](w0, w1)
+//#define runCommand(words.w0, words.w1) GBI.cmd[_SHIFTR(words.w0, 24, 8)](words.w0, words.w1)
inline
-void runCommand(u32 w0, u32 w1)
+void runCommand(const Gwords words)
{
- GBI.cmd[_SHIFTR(w0, 24, 8)](w0, w1);
+ GBI.cmd[_SHIFTR(words.w0, 24, 8)](words);
+};
+
+inline void runCommand(word w0, word w1) {
+ GBI.cmd[_SHIFTR(w0, 24, 8)](Gwords(w0, w1));
};
static
@@ -1157,9 +1226,9 @@ void BgRect1CycStripped(u32 _bgAddr)
*reinterpret_cast(DMEM + 0x578) = G2;
*reinterpret_cast(DMEM + 0x57C) = (L2 << 16) | A2_1;
- runCommand(J2, 0x27000000);
- runCommand(J2_1, K2);
- runCommand((G_SETTILESIZE<<24), 0);
+ runCommand(Gwords(J2, 0x27000000));
+ runCommand(Gwords(J2_1, K2));
+ runCommand(Gwords((G_SETTILESIZE<<24), 0));
}
if (config.graphics2D.enableNativeResTexrects != 0)
@@ -1330,7 +1399,7 @@ void BgRect1CycStripped(u32 _bgAddr)
const u32 w1 = (JJ << 2) | HH;
RDP.w2 = (H2 << 16) | F1_1;
RDP.w3 = (objBg.scaleW << 16) | objBg.scaleH;
- RDP_TexRect(w0, w1);
+ RDP_TexRect(Gwords(w0, w1));
if (FF <= 0)
stop = true;
else {
@@ -1488,7 +1557,7 @@ void BgRectCopyStripped(u32 _bgAddr)
w1 = T0 | T1;
RDP.w2 = R;
RDP.w3 = 0x10000400;
- RDP_TexRect(w0, w1);
+ RDP_TexRect(Gwords(w0, w1));
T1 = BB + 1;
S += Z;
if (U > 0)
@@ -1512,7 +1581,7 @@ void BgRectCopyStripped(u32 _bgAddr)
w1 = T0 | T1;
RDP.w2 = R;
RDP.w3 = 0x10000400;
- RDP_TexRect(w0, w1);
+ RDP_TexRect(Gwords(w0, w1));
T1 += 4;
AT -= 4;
if (AT <= 0)
@@ -1536,9 +1605,9 @@ void BgRectCopyStripped(u32 _bgAddr)
}
}
-void S2DEX_BG_1Cyc(u32 w0, u32 w1)
+void S2DEX_BG_1Cyc(const Gwords words)
{
- const u32 bgAddr = RSP_SegmentToPhysical(w1);
+ const u32 bgAddr = RSP_SegmentToPhysical(words.w1);
bool fbImage = false;
if (_useOnePieceBgCode(bgAddr, fbImage))
BgRect1CycOnePiece(bgAddr, fbImage);
@@ -1546,9 +1615,9 @@ void S2DEX_BG_1Cyc(u32 w0, u32 w1)
BgRect1CycStripped(bgAddr);
}
-void S2DEX_BG_Copy(u32 w0, u32 w1)
+void S2DEX_BG_Copy(const Gwords words)
{
- const u32 bgAddr = RSP_SegmentToPhysical(w1);
+ const u32 bgAddr = RSP_SegmentToPhysical(words.w1);
bool fbImage = false;
if (_useOnePieceBgCode(bgAddr, fbImage))
BgRectCopyOnePiece(bgAddr, fbImage);
@@ -1556,61 +1625,61 @@ void S2DEX_BG_Copy(u32 w0, u32 w1)
BgRectCopyStripped(bgAddr);
}
-void S2DEX_Obj_MoveMem(u32 w0, u32 w1)
+void S2DEX_Obj_MoveMem(const Gwords words)
{
- switch (_SHIFTR(w0, 0, 16)) {
+ switch (_SHIFTR(words.w0, 0, 16)) {
case S2DEX_MV_MATRIX:
- gSPObjMatrix(w1);
+ gSPObjMatrix(words.w1);
break;
case S2DEX_MV_SUBMUTRIX:
- gSPObjSubMatrix(w1);
+ gSPObjSubMatrix(words.w1);
break;
case S2DEX_MV_VIEWPORT:
- gSPViewport(w1);
+ gSPViewport(words.w1);
break;
}
}
-void S2DEX_MoveWord(u32 w0, u32 w1)
+void S2DEX_MoveWord(const Gwords words)
{
- switch (_SHIFTR(w0, 0, 8))
+ switch (_SHIFTR(words.w0, 0, 8))
{
case G_MW_GENSTAT:
- gSPSetStatus(_SHIFTR(w0, 0, 16), w1);
+ gSPSetStatus(_SHIFTR(words.w0, 0, 16), words.w1);
break;
default:
- F3D_MoveWord(w0, w1);
+ F3D_MoveWord(words);
break;
}
}
-void S2DEX_RDPHalf_0(u32 w0, u32 w1) {
+void S2DEX_RDPHalf_0(const Gwords words) {
if (RSP.nextCmd == G_SELECT_DL) {
- gSP.selectDL.addr = _SHIFTR(w0, 0, 16);
- gSP.selectDL.sid = _SHIFTR(w0, 18, 8);
- gSP.selectDL.flag = w1;
+ gSP.selectDL.addr = _SHIFTR(words.w0, 0, 16);
+ gSP.selectDL.sid = _SHIFTR(words.w0, 18, 8);
+ gSP.selectDL.flag = words.w1;
return;
}
if (RSP.nextCmd == G_RDPHALF_1) {
- RDP_TexRect(w0, w1);
+ RDP_TexRect(words);
return;
}
assert(false);
}
-void S2DEX_Select_DL(u32 w0, u32 w1)
+void S2DEX_Select_DL(const Gwords words)
{
- gSP.selectDL.addr |= (_SHIFTR(w0, 0, 16)) << 16;
+ gSP.selectDL.addr |= (_SHIFTR(words.w0, 0, 16)) << 16;
const u8 sid = gSP.selectDL.sid;
const u32 flag = gSP.selectDL.flag;
- const u32 mask = w1;
+ const u32 mask = words.w1;
if ((gSP.status[sid] & mask) == flag)
// Do nothing;
return;
gSP.status[sid] = (gSP.status[sid] & ~mask) | (flag & mask);
- switch (_SHIFTR(w0, 16, 8))
+ switch (_SHIFTR(words.w0, 16, 8))
{
case G_DL_PUSH:
gSPDisplayList(gSP.selectDL.addr);
@@ -1621,48 +1690,48 @@ void S2DEX_Select_DL(u32 w0, u32 w1)
}
}
-void S2DEX_Obj_RenderMode(u32 w0, u32 w1)
+void S2DEX_Obj_RenderMode(const Gwords words)
{
- gSP.objRendermode = w1;
+ gSP.objRendermode = words.w1;
DebugMsg(DEBUG_NORMAL, "gSPObjRendermode(0x%08x)\n", gSP.objRendermode);
}
-void S2DEX_Obj_Rectangle(u32 w0, u32 w1)
+void S2DEX_Obj_Rectangle(const Gwords words)
{
- gSPObjRectangle(w1);
+ gSPObjRectangle(words.w1);
}
-void S2DEX_Obj_Rectangle_R(u32 w0, u32 w1)
+void S2DEX_Obj_Rectangle_R(const Gwords words)
{
- gSPObjRectangleR(w1);
+ gSPObjRectangleR(words.w1);
}
-void S2DEX_Obj_Sprite(u32 w0, u32 w1)
+void S2DEX_Obj_Sprite(const Gwords words)
{
- gSPObjSprite(w1);
+ gSPObjSprite(words.w1);
}
-void S2DEX_Obj_LoadTxtr(u32 w0, u32 w1)
+void S2DEX_Obj_LoadTxtr(const Gwords words)
{
- gSPObjLoadTxtr(w1);
+ gSPObjLoadTxtr(words.w1);
}
-void S2DEX_Obj_LdTx_Rect(u32 w0, u32 w1)
+void S2DEX_Obj_LdTx_Rect(const Gwords words)
{
- gSPObjLoadTxtr(w1);
- gSPObjRectangle(w1 + sizeof(uObjTxtr));
+ gSPObjLoadTxtr(words.w1);
+ gSPObjRectangle(words.w1 + sizeof(uObjTxtr));
}
-void S2DEX_Obj_LdTx_Rect_R(u32 w0, u32 w1)
+void S2DEX_Obj_LdTx_Rect_R(const Gwords words)
{
- gSPObjLoadTxtr(w1);
- gSPObjRectangleR(w1 + sizeof(uObjTxtr));
+ gSPObjLoadTxtr(words.w1);
+ gSPObjRectangleR(words.w1 + sizeof(uObjTxtr));
}
-void S2DEX_Obj_LdTx_Sprite(u32 w0, u32 w1)
+void S2DEX_Obj_LdTx_Sprite(const Gwords words)
{
- gSPObjLoadTxtr(w1);
- gSPObjSprite(w1 + sizeof(uObjTxtr));
+ gSPObjLoadTxtr(words.w1);
+ gSPObjSprite(words.w1 + sizeof(uObjTxtr));
}
void S2DEX_Init()
diff --git a/src/uCodes/S2DEX.h b/src/uCodes/S2DEX.h
index 7096f7cb..60aaa644 100644
--- a/src/uCodes/S2DEX.h
+++ b/src/uCodes/S2DEX.h
@@ -3,19 +3,19 @@
#include "Types.h"
-void S2DEX_BG_1Cyc(u32 w0, u32 w1);
-void S2DEX_BG_Copy( u32 w0, u32 w1 );
-void S2DEX_Obj_Rectangle( u32 w0, u32 w1 );
-void S2DEX_Obj_Sprite( u32 w0, u32 w1 );
-void S2DEX_Obj_MoveMem( u32 w0, u32 w1 );
-void S2DEX_RDPHalf_0( u32 w0, u32 w1 );
-void S2DEX_Select_DL( u32 w0, u32 w1 );
-void S2DEX_Obj_RenderMode( u32 w0, u32 w1 );
-void S2DEX_Obj_Rectangle_R( u32 w0, u32 w1 );
-void S2DEX_Obj_LoadTxtr( u32 w0, u32 w1 );
-void S2DEX_Obj_LdTx_Sprite( u32 w0, u32 w1 );
-void S2DEX_Obj_LdTx_Rect( u32 w0, u32 w1 );
-void S2DEX_Obj_LdTx_Rect_R( u32 w0, u32 w1 );
+void S2DEX_BG_1Cyc(const Gwords words);
+void S2DEX_BG_Copy( const Gwords words );
+void S2DEX_Obj_Rectangle( const Gwords words );
+void S2DEX_Obj_Sprite( const Gwords words );
+void S2DEX_Obj_MoveMem( const Gwords words );
+void S2DEX_RDPHalf_0( const Gwords words );
+void S2DEX_Select_DL( const Gwords words );
+void S2DEX_Obj_RenderMode( const Gwords words );
+void S2DEX_Obj_Rectangle_R( const Gwords words );
+void S2DEX_Obj_LoadTxtr( const Gwords words );
+void S2DEX_Obj_LdTx_Sprite( const Gwords words );
+void S2DEX_Obj_LdTx_Rect( const Gwords words );
+void S2DEX_Obj_LdTx_Rect_R( const Gwords words );
void S2DEX_1_03_Init();
void S2DEX_1_05_Init();
void S2DEX_1_07_Init();
diff --git a/src/uCodes/S2DEX2.cpp b/src/uCodes/S2DEX2.cpp
index dd8d1531..abfd297e 100644
--- a/src/uCodes/S2DEX2.cpp
+++ b/src/uCodes/S2DEX2.cpp
@@ -23,15 +23,15 @@
#define S2DEX2_BG_COPY 0x0A
#define S2DEX2_OBJ_RENDERMODE 0x0B
-void S2DEX2_MoveWord( u32 w0, u32 w1 )
+void S2DEX2_MoveWord( const Gwords words )
{
- switch (_SHIFTR( w0, 16, 8 ))
+ switch (_SHIFTR( words.w0, 16, 8 ))
{
case G_MW_GENSTAT:
- gSPSetStatus(_SHIFTR(w0, 0, 16), w1);
+ gSPSetStatus(_SHIFTR(words.w0, 0, 16), words.w1);
break;
default:
- F3DEX2_MoveWord(w0, w1);
+ F3DEX2_MoveWord(words);
break;
}
}
diff --git a/src/uCodes/T3DUX.cpp b/src/uCodes/T3DUX.cpp
index 0241efb7..f916eb77 100644
--- a/src/uCodes/T3DUX.cpp
+++ b/src/uCodes/T3DUX.cpp
@@ -60,14 +60,14 @@ static u32 t32uxSetTileW1 = 0;
static
void T3DUX_ProcessRDP(u32 _cmds)
{
- u32 addr = RSP_SegmentToPhysical(_cmds) >> 2;
+ word addr = RSP_SegmentToPhysical(_cmds) >> 2;
if (addr != 0) {
RSP.LLE = true;
u32 w0 = ((u32*)RDRAM)[addr++];
u32 w1 = ((u32*)RDRAM)[addr++];
RSP.cmd = _SHIFTR( w0, 24, 8 );
while (w0 + w1 != 0) {
- GBI.cmd[RSP.cmd]( w0, w1 );
+ GBI.cmd[RSP.cmd]( Gwords(w0, w1) );
w0 = ((u32*)RDRAM)[addr++];
w1 = ((u32*)RDRAM)[addr++];
RSP.cmd = _SHIFTR( w0, 24, 8 );
@@ -90,7 +90,7 @@ void T3DUX_ProcessRDP(u32 _cmds)
static
void T3DUX_LoadGlobState(u32 pgstate)
{
- const u32 addr = RSP_SegmentToPhysical(pgstate);
+ const word addr = RSP_SegmentToPhysical(pgstate);
T3DUXGlobState *gstate = (T3DUXGlobState*)&RDRAM[addr];
const u32 w0 = gstate->othermode0;
const u32 w1 = gstate->othermode1;
@@ -98,7 +98,7 @@ void T3DUX_LoadGlobState(u32 pgstate)
w1 ); // mode1
for (int s = 0; s < 16; ++s)
- gSPSegment(s, gstate->segBases[s] & 0x00FFFFFF);
+ gSPSegment(s, SEGMENT_MASK(gstate->segBases[s]));
gSPViewport(pgstate + 80);
@@ -158,7 +158,7 @@ void T3DUX_LoadObject(u32 pstate, u32 pvtx, u32 ptri, u32 pcol)
drawer.drawDMATriangles(static_cast(pVtx - drawer.getDMAVerticesData()));
pVtx = drawer.getDMAVerticesData();
pal = newPal;
- RDP_SetTile(t32uxSetTileW0, w1);
+ RDP_SetTile(Gwords(t32uxSetTileW0, w1));
}
}
@@ -213,7 +213,7 @@ void T3DUX_LoadObject(u32 pstate, u32 pvtx, u32 ptri, u32 pcol)
void RunT3DUX()
{
while (true) {
- u32 addr = RSP.PC[RSP.PCi] >> 2;
+ word addr = RSP.PC[RSP.PCi] >> 2;
const u32 pgstate = ((u32*)RDRAM)[addr++];
const u32 pstate = ((u32*)RDRAM)[addr++];
const u32 pvtx = ((u32*)RDRAM)[addr++];
diff --git a/src/uCodes/Turbo3D.cpp b/src/uCodes/Turbo3D.cpp
index 2b336373..2d23abf2 100644
--- a/src/uCodes/Turbo3D.cpp
+++ b/src/uCodes/Turbo3D.cpp
@@ -79,14 +79,14 @@ struct VtxOut {
static
void Turbo3D_ProcessRDP(u32 _cmds)
{
- u32 addr = RSP_SegmentToPhysical(_cmds) >> 2;
+ word addr = RSP_SegmentToPhysical(_cmds) >> 2;
if (addr != 0) {
RSP.LLE = true;
u32 w0 = ((u32*)RDRAM)[addr++];
u32 w1 = ((u32*)RDRAM)[addr++];
RSP.cmd = _SHIFTR( w0, 24, 8 );
while (w0 + w1 != 0) {
- GBI.cmd[RSP.cmd]( w0, w1 );
+ GBI.cmd[RSP.cmd]( Gwords(w0, w1) );
w0 = ((u32*)RDRAM)[addr++];
w1 = ((u32*)RDRAM)[addr++];
RSP.cmd = _SHIFTR( w0, 24, 8 );
@@ -102,7 +102,7 @@ void Turbo3D_ProcessRDP(u32 _cmds)
static
void Turbo3D_LoadGlobState(u32 pgstate)
{
- const u32 addr = RSP_SegmentToPhysical(pgstate);
+ const word addr = RSP_SegmentToPhysical(pgstate);
T3DGlobState *gstate = (T3DGlobState*)&RDRAM[addr];
const u32 w0 = gstate->othermode0;
const u32 w1 = gstate->othermode1;
@@ -110,7 +110,7 @@ void Turbo3D_LoadGlobState(u32 pgstate)
w1 ); // mode1
for (int s = 0; s < 16; ++s)
- gSPSegment(s, gstate->segBases[s] & 0x00FFFFFF);
+ gSPSegment(s, SEGMENT_MASK(gstate->segBases[s]));
gSPViewport(pgstate + 80);
@@ -120,7 +120,7 @@ void Turbo3D_LoadGlobState(u32 pgstate)
static
void Turbo3D_LoadObject(u32 pstate, u32 pvtx, u32 ptri)
{
- u32 addr = RSP_SegmentToPhysical(pstate);
+ word addr = RSP_SegmentToPhysical(pstate);
T3DState *ostate = (T3DState*)&RDRAM[addr];
const u32 tile = (ostate->textureState)&7;
gSP.texture.tile = tile;
@@ -182,7 +182,7 @@ void Turbo3D_LoadObject(u32 pstate, u32 pvtx, u32 ptri)
void RunTurbo3D()
{
while (true) {
- u32 addr = RSP.PC[RSP.PCi] >> 2;
+ word addr = RSP.PC[RSP.PCi] >> 2;
const u32 pgstate = ((u32*)RDRAM)[addr++];
const u32 pstate = ((u32*)RDRAM)[addr++];
const u32 pvtx = ((u32*)RDRAM)[addr++];
diff --git a/src/uCodes/ZSort.cpp b/src/uCodes/ZSort.cpp
index d7d667ca..a9f22c31 100644
--- a/src/uCodes/ZSort.cpp
+++ b/src/uCodes/ZSort.cpp
@@ -33,25 +33,25 @@ struct ZSORTRDP
f32 view_trans[2];
} zSortRdp = {{0, 0}, {0, 0}};
-void ZSort_RDPCMD( u32, u32 _w1 )
+void ZSort_RDPCMD( const Gwords words )
{
- u32 addr = RSP_SegmentToPhysical(_w1) >> 2;
+ word addr = RSP_SegmentToPhysical(words.w1) >> 2;
if (addr) {
RSP.LLE = true;
while(true)
{
- u32 w0 = ((u32*)RDRAM)[addr++];
+ word w0 = ((word*)RDRAM)[addr++];
RSP.cmd = _SHIFTR( w0, 24, 8 );
if (RSP.cmd == 0xDF)
break;
- u32 w1 = ((u32*)RDRAM)[addr++];
+ word w1 = ((word*)RDRAM)[addr++];
if (RSP.cmd == G_TEXRECT || RSP.cmd == G_TEXRECTFLIP) {
addr++;
- RDP.w2 = ((u32*)RDRAM)[addr++];
+ RDP.w2 = ((word*)RDRAM)[addr++];
addr++;
- RDP.w3 = ((u32*)RDRAM)[addr++];
+ RDP.w3 = ((word*)RDRAM)[addr++];
}
- GBI.cmd[RSP.cmd]( w0, w1 );
+ GBI.cmd[RSP.cmd]( words );
};
RSP.LLE = false;
}
@@ -138,7 +138,7 @@ u32 ZSort_LoadObject (u32 _zHeader, u32 * _pRdpCmds)
w1 = ((u32*)addr)[1];
if (w1 != _pRdpCmds[0]) {
_pRdpCmds[0] = w1;
- ZSort_RDPCMD (0, w1);
+ ZSort_RDPCMD (Gwords(0, w1));
}
ZSort_DrawObject(addr + 8, type);
}
@@ -150,16 +150,16 @@ u32 ZSort_LoadObject (u32 _zHeader, u32 * _pRdpCmds)
w1 = ((u32*)addr)[1];
if (w1 != _pRdpCmds[0]) {
_pRdpCmds[0] = w1;
- ZSort_RDPCMD (0, w1);
+ ZSort_RDPCMD (Gwords(0, w1));
}
w1 = ((u32*)addr)[2];
if (w1 != _pRdpCmds[1]) {
- ZSort_RDPCMD (0, w1);
+ ZSort_RDPCMD (Gwords(0, w1));
_pRdpCmds[1] = w1;
}
w1 = ((u32*)addr)[3];
if (w1 != _pRdpCmds[2]) {
- ZSort_RDPCMD (0, w1);
+ ZSort_RDPCMD (Gwords(0, w1));
_pRdpCmds[2] = w1;
}
if (type != 0) {
@@ -171,11 +171,11 @@ u32 ZSort_LoadObject (u32 _zHeader, u32 * _pRdpCmds)
return RSP_SegmentToPhysical(((u32*)addr)[0]);
}
-void ZSort_Obj( u32 _w0, u32 _w1 )
+void ZSort_Obj( const Gwords words )
{
u32 rdpcmds[3] = {0, 0, 0};
- u32 cmd1 = _w1;
- u32 zHeader = RSP_SegmentToPhysical(_w0);
+ u32 cmd1 = words.w1;
+ u32 zHeader = RSP_SegmentToPhysical(words.w0);
while (zHeader)
zHeader = ZSort_LoadObject(zHeader, rdpcmds);
zHeader = RSP_SegmentToPhysical(cmd1);
@@ -183,16 +183,16 @@ void ZSort_Obj( u32 _w0, u32 _w1 )
zHeader = ZSort_LoadObject(zHeader, rdpcmds);
}
-void ZSort_Interpolate( u32, u32 )
+void ZSort_Interpolate( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSort_Interpolate Ignored");
}
-void ZSort_XFMLight( u32 _w0, u32 _w1 )
+void ZSort_XFMLight( const Gwords words )
{
- int mid = _SHIFTR(_w0, 0, 8);
- gSPNumLights(1 + _SHIFTR(_w1, 12, 8));
- u32 addr = -1024 + _SHIFTR(_w1, 0, 12);
+ int mid = _SHIFTR(words.w0, 0, 8);
+ gSPNumLights(1 + _SHIFTR(words.w1, 12, 8));
+ word addr = -1024 + _SHIFTR(words.w1, 0, 12);
assert(mid == GZM_MMTX);
/*
@@ -236,19 +236,19 @@ void ZSort_XFMLight( u32 _w0, u32 _w1 )
}
}
-void ZSort_LightingL( u32, u32 )
+void ZSort_LightingL( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSort_LightingL Ignored");
}
-void ZSort_Lighting( u32 _w0, u32 _w1 )
+void ZSort_Lighting( const Gwords words )
{
- u32 csrs = -1024 + _SHIFTR(_w0, 12, 12);
- u32 nsrs = -1024 + _SHIFTR(_w0, 0, 12);
- u32 num = 1 + _SHIFTR(_w1, 24, 8);
- u32 cdest = -1024 + _SHIFTR(_w1, 12, 12);
- u32 tdest = -1024 + _SHIFTR(_w1, 0, 12);
+ u32 csrs = -1024 + _SHIFTR(words.w0, 12, 12);
+ u32 nsrs = -1024 + _SHIFTR(words.w0, 0, 12);
+ u32 num = 1 + _SHIFTR(words.w1, 24, 8);
+ u32 cdest = -1024 + _SHIFTR(words.w1, 12, 12);
+ u32 tdest = -1024 + _SHIFTR(words.w1, 0, 12);
int use_material = (csrs != 0x0ff0);
tdest >>= 1;
GraphicsDrawer & drawer = dwnd().getDrawer();
@@ -292,18 +292,18 @@ void ZSort_Lighting( u32 _w0, u32 _w1 )
}
}
-void ZSort_MTXRNSP( u32, u32 )
+void ZSort_MTXRNSP( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSort_MTXRNSP Ignored");
}
-void ZSort_MTXCAT(u32 _w0, u32 _w1)
+void ZSort_MTXCAT( const Gwords words )
{
M44 *s = nullptr;
M44 *t = nullptr;
- u32 S = _SHIFTR(_w0, 0, 4);
- u32 T = _SHIFTR(_w1, 16, 4);
- u32 D = _SHIFTR(_w1, 0, 4);
+ u32 S = _SHIFTR(words.w0, 0, 4);
+ u32 T = _SHIFTR(words.w1, 16, 4);
+ u32 D = _SHIFTR(words.w1, 0, 4);
switch (S) {
case GZM_MMTX:
s = (M44*)gSP.matrix.modelView[gSP.matrix.modelViewi];
@@ -343,11 +343,11 @@ void ZSort_MTXCAT(u32 _w0, u32 _w1)
}
}
-void ZSort_MultMPMTX( u32 _w0, u32 _w1 )
+void ZSort_MultMPMTX( const Gwords words )
{
- int num = 1 + _SHIFTR(_w1, 24, 8);
- int src = -1024 + _SHIFTR(_w1, 12, 12);
- int dst = -1024 + _SHIFTR(_w1, 0, 12);
+ int num = 1 + _SHIFTR(words.w1, 24, 8);
+ int src = -1024 + _SHIFTR(words.w1, 12, 12);
+ int dst = -1024 + _SHIFTR(words.w1, 0, 12);
s16 * saddr = (s16*)(DMEM+src);
zSortVDest * daddr = (zSortVDest*)(DMEM+dst);
int idx = 0;
@@ -389,22 +389,22 @@ void ZSort_MultMPMTX( u32 _w0, u32 _w1 )
}
}
-void ZSort_LinkSubDL( u32, u32 )
+void ZSort_LinkSubDL( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSort_LinkSubDL Ignored");
}
-void ZSort_SetSubDL( u32, u32 )
+void ZSort_SetSubDL( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSort_SetSubDL Ignored");
}
-void ZSort_WaitSignal( u32, u32 )
+void ZSort_WaitSignal( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSort_WaitSignal Ignored");
}
-void ZSort_SendSignal( u32, u32 )
+void ZSort_SendSignal( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSort_SendSignal Ignored");
}
@@ -421,22 +421,22 @@ void ZSort_SetTexture()
gSPSetGeometryMode(G_SHADING_SMOOTH | G_SHADE);
}
-void ZSort_MoveMem( u32 _w0, u32 _w1 )
+void ZSort_MoveMem( const Gwords words )
{
- int idx = _w0 & 0x0E;
- int ofs = _SHIFTR(_w0, 6, 9)<<3;
- int len = 1 + (_SHIFTR(_w0, 15, 9)<<3);
- int flag = _w0 & 0x01;
- u32 addr = RSP_SegmentToPhysical(_w1);
+ word idx = words.w0 & 0x0E;
+ word ofs = _SHIFTR(words.w0, 6, 9)<<3;
+ word len = 1 + (_SHIFTR(words.w0, 15, 9)<<3);
+ word flag = words.w0 & 0x01;
+ word addr = RSP_SegmentToPhysical(words.w1);
switch (idx)
{
case GZF_LOAD: //save/load
if (flag == 0) {
- int dmem_addr = (idx<<3) + ofs;
+ word dmem_addr = (idx<<3) + ofs;
memcpy(DMEM + dmem_addr, RDRAM + addr, len);
} else {
- int dmem_addr = (idx<<3) + ofs;
+ word dmem_addr = (idx<<3) + ofs;
memcpy(RDRAM + addr, DMEM + dmem_addr, len);
}
break;
@@ -504,9 +504,9 @@ void ZSort_MoveMem( u32 _w0, u32 _w1 )
}
-void SZort_SetScissor(u32 _w0, u32 _w1)
+void SZort_SetScissor( const Gwords words )
{
- RDP_SetScissor(_w0, _w1);
+ RDP_SetScissor(words);
if ((gDP.scissor.lrx - gDP.scissor.ulx) > (zSortRdp.view_scale[0] - zSortRdp.view_trans[0]))
{
diff --git a/src/uCodes/ZSort.h b/src/uCodes/ZSort.h
index fa917970..c091549c 100644
--- a/src/uCodes/ZSort.h
+++ b/src/uCodes/ZSort.h
@@ -15,7 +15,7 @@ struct zSortVDest{
typedef f32 M44[4][4];
void ZSort_Init();
-void ZSort_RDPCMD( u32, u32 _w1 );
+void ZSort_RDPCMD( const Gwords words );
int Calc_invw( int _w );
#endif // ZSORT_H
diff --git a/src/uCodes/ZSortBOSS.cpp b/src/uCodes/ZSortBOSS.cpp
index 8b0d5611..d0d11584 100644
--- a/src/uCodes/ZSortBOSS.cpp
+++ b/src/uCodes/ZSortBOSS.cpp
@@ -11,6 +11,11 @@
#include "3DMath.h"
#include "DisplayWindow.h"
+#ifdef NATIVE
+#define RDRAM ((u8*)0)
+#define DMEM ((u8*)0)
+#endif
+
#define CLAMP(x, min, max) ((x > max) ? max : ((x < min) ? min: x))
#define SATURATES8(x) ((x > 127) ? 127 : ((x < -128) ? -128: x))
@@ -36,7 +41,7 @@ struct ZSortBOSSState {
struct ZSortBOSSState gstate;
-void ZSortBOSS_EndMainDL( u32, u32 )
+void ZSortBOSS_EndMainDL( const Gwords words )
{
if(gstate.subdl == PROCESSED) {
// is this really happening?
@@ -63,7 +68,7 @@ void ZSortBOSS_EndMainDL( u32, u32 )
LOG(LOG_VERBOSE, "ZSortBOSS_EndMainDL");
}
-void ZSortBOSS_EndSubDL( u32, u32 )
+void ZSortBOSS_EndSubDL( const Gwords words )
{
if(gstate.maindl == PROCESSED) {
RSP.halt = true;
@@ -80,7 +85,7 @@ void ZSortBOSS_EndSubDL( u32, u32 )
LOG(LOG_VERBOSE, "ZSortBOSS_EndSubDL");
}
-void ZSortBOSS_WaitSignal( u32 , u32 )
+void ZSortBOSS_WaitSignal( const Gwords words )
{
if(!gstate.waiting_for_signal) {
// *REG.MI_INTR |= MI_INTR_SP;
@@ -101,26 +106,26 @@ void ZSortBOSS_WaitSignal( u32 , u32 )
LOG(LOG_VERBOSE, "ZSortBOSS_WaitSignal");
}
-void ZSortBOSS_MoveWord( u32 _w0, u32 _w1 )
+void ZSortBOSS_MoveWord( const Gwords words )
{
- assert((_w0 & 3) == 0);
+ assert((words.w0 & 3) == 0);
- if(((_w0 & 0xfff) == 0x10) && (RSP.nextCmd == 0x04)) { // Next cmd is G_ZSBOSS_MOVEMEM
- gstate.invw_factor = (f32)_w1;
+ if(((words.w0 & 0xfff) == 0x10) && (RSP.nextCmd == 0x04)) { // Next cmd is G_ZSBOSS_MOVEMEM
+ gstate.invw_factor = (f32)words.w1;
}
- memcpy((DMEM + (_w0 & 0xfff)), &_w1, sizeof(u32));
- LOG(LOG_VERBOSE, "ZSortBOSS_MoveWord (Write 0x%08x to DMEM: 0x%04x)", _w1, (_w0 & 0xfff));
+ memcpy((DMEM + (words.w0 & 0xfff)), &words.w1, sizeof(u32));
+ LOG(LOG_VERBOSE, "ZSortBOSS_MoveWord (Write 0x%08x to DMEM: 0x%04x)", words.w1, (words.w0 & 0xfff));
}
-void ZSortBOSS_ClearBuffer( u32, u32 )
+void ZSortBOSS_ClearBuffer( const Gwords words )
{
memset((DMEM + 0xc20), 0, 512);
LOG(LOG_VERBOSE, "ZSortBOSS_ClearBuffer (Write 0x0 to DMEM: 0x0c20 -> 0x0e20)");
}
static
-void StoreMatrix( f32 mtx[4][4], u32 address )
+void StoreMatrix( f32 mtx[4][4], word address )
{
struct _N64Matrix
{
@@ -137,18 +142,18 @@ void StoreMatrix( f32 mtx[4][4], u32 address )
}
}
-void ZSortBOSS_MoveMem( u32 _w0, u32 _w1 )
+void ZSortBOSS_MoveMem( const Gwords words )
{
- int flag = (_w0 >> 23) & 0x01;
- int len = 1 + (_w0 >> 12) & 0x7ff;
- u32 addr = RSP_SegmentToPhysical(_w1);
+ int flag = (words.w0 >> 23) & 0x01;
+ int len = 1 + (words.w0 >> 12) & 0x7ff;
+ word addr = RSP_SegmentToPhysical(words.w1);
assert((addr & 3) == 0);
- assert((_w0 & 3) == 0);
+ assert((words.w0 & 3) == 0);
- LOG(LOG_VERBOSE, "ZSortBOSS_MoveMem (R/W: %d, RDRAM: 0x%08x, DMEM: 0x%04x; len: %d)", flag, addr, (_w0 & 0xfff), len);
+ LOG(LOG_VERBOSE, "ZSortBOSS_MoveMem (R/W: %d, RDRAM: 0x%08x, DMEM: 0x%04x; len: %d)", flag, addr, (words.w0 & 0xfff), len);
// model matrix
- if((_w0 & 0xfff) == 0x830) {
+ if((words.w0 & 0xfff) == 0x830) {
assert(flag == 0);
RSP_LoadMatrix(gSP.matrix.modelView[gSP.matrix.modelViewi], addr);
gSP.changed |= CHANGED_MATRIX;
@@ -156,7 +161,7 @@ void ZSortBOSS_MoveMem( u32 _w0, u32 _w1 )
}
// projection matrix
- if((_w0 & 0xfff) == 0x870) {
+ if((words.w0 & 0xfff) == 0x870) {
assert(flag == 0);
RSP_LoadMatrix(gSP.matrix.projection, addr);
gSP.changed |= CHANGED_MATRIX;
@@ -164,7 +169,7 @@ void ZSortBOSS_MoveMem( u32 _w0, u32 _w1 )
}
// combined matrix
- if((_w0 & 0xfff) == 0x8b0) {
+ if((words.w0 & 0xfff) == 0x8b0) {
if(flag == 0) {
RSP_LoadMatrix(gSP.matrix.combined, addr);
gSP.changed &= ~CHANGED_MATRIX;
@@ -175,7 +180,7 @@ void ZSortBOSS_MoveMem( u32 _w0, u32 _w1 )
}
// VIEWPORT
- if((_w0 & 0xfff) == 0x0) {
+ if((words.w0 & 0xfff) == 0x0) {
u32 a = addr >> 1;
const f32 scale_x = _FIXED2FLOAT( ((s16*)RDRAM)[(a+0)^1], 2 );
@@ -211,26 +216,26 @@ void ZSortBOSS_MoveMem( u32 _w0, u32 _w1 )
return;
}
- if((_w0 & 0xfff) == 0x730) {
+ if((words.w0 & 0xfff) == 0x730) {
assert(len == 256);
memcpy(gstate.fogtable, (RDRAM + addr), len);
}
if(flag == 0) {
- memcpy((DMEM + (_w0 & 0xfff)), (RDRAM + addr), len);
+ memcpy((DMEM + (words.w0 & 0xfff)), (RDRAM + addr), len);
} else {
- memcpy((RDRAM + addr), (DMEM + (_w0 & 0xfff)), len);
+ memcpy((RDRAM + addr), (DMEM + (words.w0 & 0xfff)), len);
}
}
-void ZSortBOSS_MTXCAT(u32 _w0, u32 _w1)
+void ZSortBOSS_MTXCAT( const Gwords words )
{
M44 *s = nullptr;
M44 *t = nullptr;
M44 *d = nullptr;
- u32 S = (_w1 >> 16) & 0xfff;
- u32 T = _w0 & 0xfff;
- u32 D = _w1 & 0xfff;
+ u32 S = (words.w1 >> 16) & 0xfff;
+ u32 T = words.w0 & 0xfff;
+ u32 D = words.w1 & 0xfff;
switch(S) {
// model matrix
@@ -293,12 +298,12 @@ void ZSortBOSS_MTXCAT(u32 _w0, u32 _w1)
LOG(LOG_VERBOSE, "ZSortBOSS_MTXCAT (S: 0x%04x, T: 0x%04x, D: 0x%04x)", S, T, D);
}
-void ZSortBOSS_MultMPMTX( u32 _w0, u32 _w1 )
+void ZSortBOSS_MultMPMTX( const Gwords words )
{
- assert((_w0 & 0xfff) == 0x8b0); // combined matrix
- int num = 1 + _SHIFTR(_w1, 24, 8);
- int src = (_w1 >> 12) & 0xfff;
- int dst = _w1 & 0xfff;
+ assert((words.w0 & 0xfff) == 0x8b0); // combined matrix
+ int num = 1 + _SHIFTR(words.w1, 24, 8);
+ int src = (words.w1 >> 12) & 0xfff;
+ int dst = words.w1 & 0xfff;
assert((src & 3) == 0);
assert((dst & 3) == 0);
@@ -426,16 +431,16 @@ u32 ZSortBOSS_LoadObject(u32 _zHeader)
w1 = ((u32*)addr)[1];
if(w1 != gstate.rdpcmds[0]) {
gstate.rdpcmds[0] = w1;
- ZSort_RDPCMD (0, w1);
+ ZSort_RDPCMD (Gwords(0, w1));
}
w1 = ((u32*)addr)[2];
if(w1 != gstate.rdpcmds[1]) {
- ZSort_RDPCMD (0, w1);
+ ZSort_RDPCMD (Gwords(0, w1));
gstate.rdpcmds[1] = w1;
}
w1 = ((u32*)addr)[3];
if(w1 != gstate.rdpcmds[2]) {
- ZSort_RDPCMD (0, w1);
+ ZSort_RDPCMD (Gwords(0, w1));
gstate.rdpcmds[2] = w1;
}
if(type != ZH_NULL) {
@@ -447,26 +452,26 @@ u32 ZSortBOSS_LoadObject(u32 _zHeader)
return RSP_SegmentToPhysical(((u32*)addr)[0]);
}
-void ZSortBOSS_Obj( u32 _w0, u32 _w1 )
+void ZSortBOSS_Obj( const Gwords words )
{
// make sure no pending subdl
assert((*REG.SP_STATUS & 0x80) == 0);
- u32 zHeader = RSP_SegmentToPhysical(_w0);
+ u32 zHeader = RSP_SegmentToPhysical(words.w0);
while(zHeader)
zHeader = ZSortBOSS_LoadObject(zHeader);
- zHeader = RSP_SegmentToPhysical(_w1);
+ zHeader = RSP_SegmentToPhysical(words.w1);
while(zHeader)
zHeader = ZSortBOSS_LoadObject(zHeader);
}
-void ZSortBOSS_TransposeMTX( u32, u32 _w1 )
+void ZSortBOSS_TransposeMTX( const Gwords words )
{
M44 *mtx = nullptr;
f32 m[4][4];
- assert((_w1 & 0xfff) == 0x830); // model matrix
+ assert((words.w1 & 0xfff) == 0x830); // model matrix
- switch(_w1 & 0xfff) {
+ switch(words.w1 & 0xfff) {
// model matrix
case 0x830:
mtx = (M44*)gSP.matrix.modelView[gSP.matrix.modelViewi];
@@ -495,20 +500,20 @@ void ZSortBOSS_TransposeMTX( u32, u32 _w1 )
}
}
- LOG(LOG_VERBOSE, "ZSortBOSS_TransposeMTX (MTX: 0x%04x)", (_w1 & 0xfff));
+ LOG(LOG_VERBOSE, "ZSortBOSS_TransposeMTX (MTX: 0x%04x)", (words.w1 & 0xfff));
}
-void ZSortBOSS_Lighting( u32 _w0, u32 _w1 )
+void ZSortBOSS_Lighting( const Gwords words )
{
- u32 num = 1 + (_w1 >> 24);
- u32 nsrs = _w0 & 0xfff;
- u32 csrs = (_w0 >> 12) & 0xfff;
- u32 cdest = (_w1 >> 12) & 0xfff;
- u32 tdest = _w1 & 0xfff;
+ u32 num = 1 + (words.w1 >> 24);
+ u32 nsrs = words.w0 & 0xfff;
+ u32 csrs = (words.w0 >> 12) & 0xfff;
+ u32 cdest = (words.w1 >> 12) & 0xfff;
+ u32 tdest = words.w1 & 0xfff;
assert((tdest & 3) == 0);
tdest >>= 1;
- u32 r4 = _w0 << 7;
+ u32 r4 = words.w0 << 7;
u32 r9 = DMEM[0x944];
assert(r9 == 0);
@@ -543,7 +548,7 @@ void ZSortBOSS_Lighting( u32 _w0, u32 _w1 )
((s16*)DMEM)[(tdest++)^1] = (s16)vtx.t;
}
- LOG(LOG_VERBOSE, "ZSortBOSS_Lighting (0x%08x, 0x%08x)", _w0, _w1);
+ LOG(LOG_VERBOSE, "ZSortBOSS_Lighting (0x%08x, 0x%08x)", words.w0, words.w1);
}
static
@@ -568,18 +573,18 @@ void ZSortBOSS_TransformVectorNormalize(float vec[3], float mtx[4][4])
vec[2] = vres[2] * recip;
}
-void ZSortBOSS_TransformLights( u32 _w0, u32 _w1 )
+void ZSortBOSS_TransformLights( const Gwords words )
{
- assert((_w0 & 0xfff) == 0x830); // model matrix
- assert(_w1 == 0x1630); // no light only lookat
- assert((_w1 & 3) == 0);
+ assert((words.w0 & 0xfff) == 0x830); // model matrix
+ assert(words.w1 == 0x1630); // no light only lookat
+ assert((words.w1 & 3) == 0);
M44 *mtx = nullptr;
- int addr = _w1 & 0xfff;
- gSP.numLights = 1 - (_w1 >> 12);
+ int addr = words.w1 & 0xfff;
+ gSP.numLights = 1 - (words.w1 >> 12);
/*
- switch(_w0 & 0xfff) {
+ switch(words.w0 & 0xfff) {
// model matrix
case 0x830:
mtx = (M44*)gSP.matrix.modelView[gSP.matrix.modelViewi];
@@ -620,27 +625,27 @@ void ZSortBOSS_TransformLights( u32 _w0, u32 _w1 )
addr += 24;
}
- LOG(LOG_VERBOSE, "ZSortBOSS_TransformLights (0x%08x, 0x%08x)", _w0, _w1);
+ LOG(LOG_VERBOSE, "ZSortBOSS_TransformLights (0x%08x, 0x%08x)", words.w0, words.w1);
}
-void ZSortBOSS_Audio1( u32 _w0, u32 _w1 )
+void ZSortBOSS_Audio1( const Gwords words )
{
- u32 addr = RSP_SegmentToPhysical(_w1);
- u32 val = ((u32*)DMEM)[(_w0 & 0xfff) >> 2];
+ word addr = RSP_SegmentToPhysical(words.w1);
+ u32 val = ((u32*)DMEM)[(words.w0 & 0xfff) >> 2];
((u32*)DMEM)[0] = val;
memcpy(RDRAM+addr, DMEM, 0x8);
- LOG(LOG_VERBOSE, "ZSortBOSS_Audio1 (0x%08x, 0x%08x)", _w0, _w1);
+ LOG(LOG_VERBOSE, "ZSortBOSS_Audio1 (0x%08x, 0x%08x)", words.w0, words.w1);
}
-void ZSortBOSS_Audio2( u32 _w0, u32 _w1 )
+void ZSortBOSS_Audio2( const Gwords words )
{
- int len = _w1 >> 24;
+ int len = words.w1 >> 24;
// Written by previous ZSortBOSS_MoveWord
u32 dst = ((u32*)DMEM)[0x10>>2];
- f32 f1 = (f32)((_w0>>16) & 0xff) + (f32)(_w0 & 0xffff) / 65536.f;
- f32 f2 = (f32)((_w1>>16) & 0xff) + (f32)(_w1 & 0xffff) / 65536.f;
+ f32 f1 = (f32)((words.w0>>16) & 0xff) + (f32)(words.w0 & 0xffff) / 65536.f;
+ f32 f2 = (f32)((words.w1>>16) & 0xff) + (f32)(words.w1 & 0xffff) / 65536.f;
// Written by previous ZSortBOSS_MoveWord
u16 v11[2];
@@ -678,12 +683,12 @@ void ZSortBOSS_Audio2( u32 _w0, u32 _w1 )
}
}
- LOG(LOG_VERBOSE, "ZSortBOSS_Audio2 (0x%08x, 0x%08x)", _w0, _w1);
+ LOG(LOG_VERBOSE, "ZSortBOSS_Audio2 (0x%08x, 0x%08x)", words.w0, words.w1);
}
-void ZSortBOSS_Audio3( u32 _w0, u32 _w1 )
+void ZSortBOSS_Audio3( const Gwords words )
{
- u32 addr = RSP_SegmentToPhysical(_w0);
+ word addr = RSP_SegmentToPhysical(words.w0);
assert((addr & 3) == 0);
for(int i = 0; i < 8; i++) {
@@ -692,24 +697,24 @@ void ZSortBOSS_Audio3( u32 _w0, u32 _w1 )
}
}
- addr = RSP_SegmentToPhysical(_w1);
+ addr = RSP_SegmentToPhysical(words.w1);
assert((addr & 3) == 0);
// What is this?
memcpy(DMEM, (RDRAM + addr), 0x8);
memcpy((DMEM+8), &addr, sizeof(addr));
- LOG(LOG_VERBOSE, "ZSortBOSS_Audio3 (0x%08x, 0x%08x)", _w0, _w1);
+ LOG(LOG_VERBOSE, "ZSortBOSS_Audio3 (0x%08x, 0x%08x)", words.w0, words.w1);
}
-void ZSortBOSS_Audio4( u32 _w0, u32 _w1 )
+void ZSortBOSS_Audio4( const Gwords words )
{
- u32 addr = RSP_SegmentToPhysical(_w1);
+ word addr = RSP_SegmentToPhysical(words.w1);
assert((addr & 3) == 0);
- u32 src = ((_w0 & 0xf000) >> 12) + addr;
+ u32 src = ((words.w0 & 0xf000) >> 12) + addr;
s16 * dst = (s16*)(DMEM+0x30);
- int len = (_w0 & 0xfff);
+ int len = (words.w0 & 0xfff);
// Written by previous ZSortBOSS_MoveWord
s16 v1 = ((s16*)DMEM)[(0>>1)^1];
@@ -769,23 +774,23 @@ void ZSortBOSS_Audio4( u32 _w0, u32 _w1 )
}
}
- LOG(LOG_VERBOSE, "ZSortBOSS_Audio4 (0x%08x, 0x%08x)", _w0, _w1);
+ LOG(LOG_VERBOSE, "ZSortBOSS_Audio4 (0x%08x, 0x%08x)", words.w0, words.w1);
}
// RDP Commands
-void ZSortBOSS_UpdateMask( u32 _w0, u32 _w1 )
+void ZSortBOSS_UpdateMask( const Gwords words )
{
- gstate.updatemask[0] = _w0 | 0xff000000;
- gstate.updatemask[1] = _w1;
+ gstate.updatemask[0] = words.w0 | 0xff000000;
+ gstate.updatemask[1] = words.w1;
LOG(LOG_VERBOSE, "ZSortBOSS_UpdateMask (mask0: 0x%08x, mask1: 0x%08x)", gstate.updatemask[0], gstate.updatemask[1]);
}
-void ZSortBOSS_SetOtherMode_L( u32 _w0, u32 _w1 )
+void ZSortBOSS_SetOtherMode_L( const Gwords words )
{
- //u32 mask = (s32)0x80000000 >> (_w0 & 0x1f); // unspecified behaviour
- u32 mask = static_cast(s32(0x80000000) / (1 << (_w0 & 0x1f)));
- mask >>= (_w0 >> 8) & 0x1f;
- gDP.otherMode.l = (gDP.otherMode.l & ~mask) | _w1;
+ //u32 mask = (s32)0x80000000 >> (words.w0 & 0x1f); // unspecified behaviour
+ u32 mask = static_cast(s32(0x80000000) / (1 << (words.w0 & 0x1f)));
+ mask >>= (words.w0 >> 8) & 0x1f;
+ gDP.otherMode.l = (gDP.otherMode.l & ~mask) | words.w1;
const u32 w0 = gDP.otherMode.h;
const u32 w1 = gDP.otherMode.l;
@@ -796,12 +801,12 @@ void ZSortBOSS_SetOtherMode_L( u32 _w0, u32 _w1 )
LOG(LOG_VERBOSE, "ZSortBOSS_SetOtherMode_L (mode0: 0x%08x, mode1: 0x%08x)", gDP.otherMode.h, gDP.otherMode.l);
}
-void ZSortBOSS_SetOtherMode_H( u32 _w0, u32 _w1 )
+void ZSortBOSS_SetOtherMode_H( const Gwords words )
{
- //u32 mask = (s32)0x80000000 >> (_w0 & 0x1f); // unspecified behaviour
- u32 mask = static_cast(s32(0x80000000) / (1 << (_w0 & 0x1f)));
- mask >>= (_w0 >> 8) & 0x1f;
- gDP.otherMode.h = (gDP.otherMode.h & ~mask) | _w1;
+ //u32 mask = (s32)0x80000000 >> (words.w0 & 0x1f); // unspecified behaviour
+ u32 mask = static_cast(s32(0x80000000) / (1 << (words.w0 & 0x1f)));
+ mask >>= (words.w0 >> 8) & 0x1f;
+ gDP.otherMode.h = (gDP.otherMode.h & ~mask) | words.w1;
const u32 w0 = gDP.otherMode.h;
const u32 w1 = gDP.otherMode.l;
@@ -812,10 +817,10 @@ void ZSortBOSS_SetOtherMode_H( u32 _w0, u32 _w1 )
LOG(LOG_VERBOSE, "ZSortBOSS_SetOtherMode_H (mode0: 0x%08x, mode1: 0x%08x)", gDP.otherMode.h, gDP.otherMode.l);
}
-void ZSortBOSS_SetOtherMode( u32 _w0, u32 _w1 )
+void ZSortBOSS_SetOtherMode( const Gwords words )
{
- gDP.otherMode.h = (_w0 & gstate.updatemask[0]) | (gDP.otherMode.h & ~gstate.updatemask[0]);
- gDP.otherMode.l = (_w1 & gstate.updatemask[1]) | (gDP.otherMode.l & ~gstate.updatemask[1]);
+ gDP.otherMode.h = (words.w0 & gstate.updatemask[0]) | (gDP.otherMode.h & ~gstate.updatemask[0]);
+ gDP.otherMode.l = (words.w1 & gstate.updatemask[1]) | (gDP.otherMode.l & ~gstate.updatemask[1]);
const u32 w0 = gDP.otherMode.h;
const u32 w1 = gDP.otherMode.l;
@@ -826,25 +831,25 @@ void ZSortBOSS_SetOtherMode( u32 _w0, u32 _w1 )
LOG(LOG_VERBOSE, "ZSortBOSS_SetOtherMode (mode0: 0x%08x, mode1: 0x%08x)", gDP.otherMode.h, gDP.otherMode.l);
}
-void ZSortBOSS_TriangleCommand( u32, u32 _w1 )
+void ZSortBOSS_TriangleCommand( const Gwords words )
{
- assert(((_w1 >> 8) & 0x3f) == 0x0e); //Shade, Texture Triangle
+ assert(((words.w1 >> 8) & 0x3f) == 0x0e); //Shade, Texture Triangle
gSP.texture.scales = 1.0f;
gSP.texture.scalet = 1.0f;
- gSP.texture.level = (_w1 >> 3) & 0x7;
+ gSP.texture.level = (words.w1 >> 3) & 0x7;
gSP.texture.on = 1;
- gSP.texture.tile = _w1 & 0x7;
+ gSP.texture.tile = words.w1 & 0x7;
gSPSetGeometryMode(G_SHADING_SMOOTH | G_SHADE);
- LOG(LOG_VERBOSE, "ZSortBOSS_TriangleCommand (cmd: 0x%02x, level: %d, tile: %d)", ((_w1 >> 8) & 0x3f), gSP.texture.level, gSP.texture.tile);
+ LOG(LOG_VERBOSE, "ZSortBOSS_TriangleCommand (cmd: 0x%02x, level: %d, tile: %d)", ((words.w1 >> 8) & 0x3f), gSP.texture.level, gSP.texture.tile);
}
-void ZSortBOSS_FlushRDPCMDBuffer( u32, u32 )
+void ZSortBOSS_FlushRDPCMDBuffer( const Gwords words )
{
LOG(LOG_VERBOSE, "ZSortBOSS_FlushRDPCMDBuffer Ignored");
}
-void ZSortBOSS_Reserved( u32, u32 )
+void ZSortBOSS_Reserved( const Gwords words )
{
assert(0);
}