Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ prodg*

## Linux
*.swp
*.d

## WSL
*:Zone.Identifier
2 changes: 1 addition & 1 deletion configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ def do_clean(version: str, build_dir: Path) -> None:
# Flags for C SDK libraries (no -lang=c++ override)
cflags_c = [
"-lang=c",
"-O3",
"-O3,p",
"-i include",
f"-DBUILD_VERSION={version_num}",
]
Expand Down
6 changes: 6 additions & 0 deletions include/usr/local/sce/ee/gcc/ee/lib/libc/memset.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef SCE_GCC_MEMSET_H
#define SCE_GCC_MEMSET_H

void * memset(void * ptr, int value, unsigned int num); //TODO: change "unsigned int num" to "size_t num"

#endif
11 changes: 11 additions & 0 deletions include/usr/local/sce/ee/lib/eestruct.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#ifndef _EESTRUCT_H_
#define _EESTRUCT_H_

#define SCE_GIF_SET_TAG(nloop, eop, pre, prim, flg, nreg) \
((unsigned long)(nloop) | ((unsigned long)(eop)<<15) | ((unsigned long)(pre) << 46) | \
((unsigned long)(prim)<<47) | ((unsigned long)(flg)<<58) | ((unsigned long)(nreg)<<60))

#define SCE_VIF1_SET_UNPACK(vuaddr, num, cmd, irq) ((unsigned int)(vuaddr) | ((unsigned int)(num) << 16) | ((unsigned int)(0x60 | (cmd)) << 24) | ((unsigned int)(irq) << 31))


#endif /* _EESTRUCT_H_ */
7 changes: 7 additions & 0 deletions include/usr/local/sega/px/src/pxtex2.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#ifndef PXTEX2_H
#define PXTEX2_H

extern unsigned int pxgPath3TransAddr; // size: 0x4, address: 0x6D1F38
extern unsigned int pxgPath3TransInvokeCount; // size: 0x4, address: 0x6D1F3C

Expand All @@ -13,3 +16,7 @@ enum PXE_ERR {
PXE_ERR_NOTENOUGHBUFFER = -54,
PXE_ERR_INCORRECTDBINDEX = -55,
};

enum PXE_ERR PXStartPath3Trans(void * tagAddr);

#endif
24 changes: 24 additions & 0 deletions include/usr/local/sega/px/src/pxvertexbuffer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef PXVERTEXBUFFER_H
#define PXVERTEXBUFFER_H

struct PXS_VERTEXBUFFER{
char magic[4]; // offset 0x0, size 0x4
unsigned int version; // offset 0x4, size 0x4
unsigned int size; // offset 0x8, size 0x4
unsigned int flag; // offset 0xC, size 0x4
__int128 * addr; // offset 0x10, size 0x4
unsigned int qwc; // offset 0x14, size 0x4
__int128 * bufPtr; // offset 0x18, size 0x4
unsigned int lockFlag; // offset 0x1C, size 0x4
unsigned int vuOffset; // offset 0x20, size 0x4
unsigned int reserved2[3]; // offset 0x24, size 0xC
unsigned int reserved3[4]; // offset 0x30, size 0x10
};

struct PXS_VERTEXBUFFER * PXSetupVB(void * addr, unsigned int size, unsigned int flag);
void * PXLockVB(struct PXS_VERTEXBUFFER *vb, unsigned int flag);
void PXUnlockVB(struct PXS_VERTEXBUFFER * vb, void * p);
void * PXBeginPrimVB(struct PXS_VERTEXBUFFER * vb, void * addr, unsigned int vertices, unsigned int stride, unsigned int prim);
void * PXEndPrimVB(int /* unused */, void * addr);

#endif
74 changes: 74 additions & 0 deletions src/usr/local/sega/px/src/pxvertexbuffer.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include "usr/local/sega/px/src/pxvertexbuffer.h"
#include "usr/local/sce/ee/gcc/ee/lib/libc/memset.h"
#include "usr/local/sce/ee/lib/eestruct.h"

struct PXS_VERTEXBUFFER * PXSetupVB(void *addr, unsigned int size, unsigned int flag) {
struct PXS_VERTEXBUFFER * vb;
memset(addr, 0, sizeof(struct PXS_VERTEXBUFFER));
vb = (struct PXS_VERTEXBUFFER *) addr;
vb->magic[0] = 'P';
vb->magic[1] = 'X';
vb->magic[2] = 'V';
vb->magic[3] = 'B';
vb->version = 0x10;
vb->addr = (__int128 *)( (char *)addr + sizeof(struct PXS_VERTEXBUFFER));
vb->size = size;
vb->flag = flag;
vb->qwc = 0;
vb->bufPtr = vb->addr;
vb->lockFlag = 0;
vb->vuOffset = 1;
return vb;
}

void * PXLockVB(struct PXS_VERTEXBUFFER *vb, unsigned int flag) {
vb->lockFlag = flag;
return vb->bufPtr;
}

void PXUnlockVB(struct PXS_VERTEXBUFFER *vb, void *p) {
if (((int) p & 0xF) != 0) {
if (((int) p & 0xF) != 0) {
do {
*(int*)p = 0;
((int*)p)++;
} while ((int) p & 0xF);
}
}

vb->qwc = (((int) p - (int)vb->addr) / 16);
vb->bufPtr = (__int128 *) p;
}

void * PXBeginPrimVB(struct PXS_VERTEXBUFFER * vb, void * addr, unsigned int vertices, unsigned int stride, unsigned int prim) {
int vuaddr; // not shown in the dwarf
unsigned int * p;

if (vb->vuOffset) {
vuaddr = 0x200;
} else {
vuaddr = 0;
}

p = (unsigned int *) addr;
p[0] = 0x01000404;
p[1] = 0;
p[2] = 0;
p[3] = SCE_VIF1_SET_UNPACK(vuaddr, (vertices * stride) + 2, 12, 0);
*(unsigned __int128 *)&p[4] = 0;
p[4] = vertices;
p[7] = vertices * 0xD0;
*(unsigned long *)&p[8] = SCE_GIF_SET_TAG(vertices, 1, 1, prim, 0, 3);
*(unsigned long *)&p[10] = 0x412;
vb->vuOffset ^= 1;
return ((unsigned int *) p) + 12;
}

void * PXEndPrimVB(int /* unused */, void * addr) {
unsigned int *p = (unsigned int *) addr;
p[0] = 0x17000000;
p[1] = 0;
p[2] = 0;
p[3] = 0;
return &p[4];
}
Loading