forked from Ports/perfect_dark
portx64: pd-extract util gbi: fixed gdl conversion so it works on x86
it works but is still a bit messy, may rewrite it later
This commit is contained in:
1 parent
373f08ca3e
commit
e8006f3446
1 file changed
+25
-15
+25
-15
@@ -2,6 +2,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "gbi.h"
|
||||||
|
|
||||||
#ifdef FORCE_BE32
|
#ifdef FORCE_BE32
|
||||||
#define HOST_DWORDS_PER_CMD 1
|
#define HOST_DWORDS_PER_CMD 1
|
||||||
@@ -117,7 +118,7 @@ void gbi_convert_vtx(u8 *dst, u32 offset, int count)
|
|||||||
* Segment 5 is the start of the model file. The data in these files shifts
|
* Segment 5 is the start of the model file. The data in these files shifts
|
||||||
* depending on the pointer size, so this function adjusts the offset accordingly.
|
* depending on the pointer size, so this function adjusts the offset accordingly.
|
||||||
*/
|
*/
|
||||||
static uint64_t gbi_rewrite_addr(uint64_t cmd, u8 opcode)
|
static u64 gbi_rewrite_addr(u64 cmd, u8 opcode)
|
||||||
{
|
{
|
||||||
u8 segment = (cmd & 0x0f000000) >> 24;
|
u8 segment = (cmd & 0x0f000000) >> 24;
|
||||||
u32 offset = cmd & 0x00ffffff;
|
u32 offset = cmd & 0x00ffffff;
|
||||||
@@ -143,34 +144,42 @@ void gbi_gdl_rewrite_addrs(u8 *dst, u32 offset)
|
|||||||
{
|
{
|
||||||
if (!offset) return;
|
if (!offset) return;
|
||||||
|
|
||||||
uint64_t *cmds = (uint64_t*)(dst + (offset & 0x00ffffff));
|
u64 *cmds = (u64 *)(dst + (offset & 0x00ffffff));
|
||||||
if (!cmds) return;
|
if (!cmds) return;
|
||||||
|
|
||||||
uint64_t cmd;
|
u64 cmd;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
cmd = *cmds;
|
cmd = *cmds;
|
||||||
|
Gfx* gfxcmd = cmds;
|
||||||
|
int idx = 0;
|
||||||
|
u8 opcode = (cmd >> 24) & 0xff;
|
||||||
|
|
||||||
if (CMD_HAS_ADDR((cmd << 32))) {
|
#if HOST_DWORDS_PER_CMD == 2
|
||||||
u8 opcode = (cmd >> 24) & 0xff;
|
idx = 1;
|
||||||
cmds[1] = gbi_rewrite_addr(cmds[1], opcode);
|
opcode = (cmd >> 24) & 0xff;
|
||||||
|
#endif
|
||||||
|
cmd = (u64)opcode << 56;
|
||||||
|
|
||||||
|
if (CMD_HAS_ADDR(cmd)) {
|
||||||
|
cmds[idx] = gbi_rewrite_addr(cmds[idx], opcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CMD_IS_SEGMENTED((cmd << 32))) {
|
if (CMD_IS_SEGMENTED(cmd)) {
|
||||||
cmds[1] |= 1;
|
gfxcmd->words.w1 |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmds += 2;
|
cmds += HOST_DWORDS_PER_CMD;
|
||||||
} while (!CMD_IS_ENDDL((cmd << 32)));
|
} while (!CMD_IS_ENDDL(cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 gbi_convert_gdl(u8 *dst, u32 dstpos, u8 *src, u32 srcpos, int segment_cmds)
|
u32 gbi_convert_gdl(u8 *dst, u32 dstpos, u8 *src, u32 srcpos, int segment_cmds)
|
||||||
{
|
{
|
||||||
dstpos = ALIGN8(dstpos);
|
dstpos = ALIGN8(dstpos);
|
||||||
|
|
||||||
uint64_t *n64_cmd = (uint64_t*)&src[srcpos];
|
u64 *n64_cmd = (u64*)&src[srcpos];
|
||||||
uint64_t *host_cmd = (uint64_t*)&dst[dstpos];
|
u64 *host_cmd = (u64*)&dst[dstpos];
|
||||||
uint64_t cmd;
|
u64 cmd;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
cmd = srctoh64(*n64_cmd);
|
cmd = srctoh64(*n64_cmd);
|
||||||
@@ -183,10 +192,11 @@ u32 gbi_convert_gdl(u8 *dst, u32 dstpos, u8 *src, u32 srcpos, int segment_cmds)
|
|||||||
host_cmd[1] |= 1;
|
host_cmd[1] |= 1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
host_cmd[0] = htodst64(cmd);
|
host_cmd[0] = (cmd >> 32) | ((cmd & 0xffffffff) << 32);
|
||||||
|
|
||||||
if (segment_cmds && CMD_IS_SEGMENTED(cmd)) {
|
if (segment_cmds && CMD_IS_SEGMENTED(cmd)) {
|
||||||
host_cmd[0] |= 1;
|
Gfx* gfxcmd = (Gfx*)host_cmd;
|
||||||
|
gfxcmd->words.w1 |= 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user