diff --git a/.gitignore b/.gitignore index 4b16b4b..96ea458 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,7 @@ prodg* ## Linux *.swp +*.d ## WSL *:Zone.Identifier diff --git a/configure.py b/configure.py index 46f27ef..73cff53 100644 --- a/configure.py +++ b/configure.py @@ -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}", ] diff --git a/include/usr/local/sce/ee/gcc/ee/lib/libc/memset.h b/include/usr/local/sce/ee/gcc/ee/lib/libc/memset.h index e69de29..4aabb7b 100644 --- a/include/usr/local/sce/ee/gcc/ee/lib/libc/memset.h +++ b/include/usr/local/sce/ee/gcc/ee/lib/libc/memset.h @@ -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 diff --git a/include/usr/local/sce/ee/lib/eestruct.h b/include/usr/local/sce/ee/lib/eestruct.h new file mode 100644 index 0000000..3c27163 --- /dev/null +++ b/include/usr/local/sce/ee/lib/eestruct.h @@ -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_ */ diff --git a/include/usr/local/sega/px/src/pxtex2.h b/include/usr/local/sega/px/src/pxtex2.h index 983536b..a5ad1bb 100644 --- a/include/usr/local/sega/px/src/pxtex2.h +++ b/include/usr/local/sega/px/src/pxtex2.h @@ -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 @@ -13,3 +16,7 @@ enum PXE_ERR { PXE_ERR_NOTENOUGHBUFFER = -54, PXE_ERR_INCORRECTDBINDEX = -55, }; + +enum PXE_ERR PXStartPath3Trans(void * tagAddr); + +#endif diff --git a/include/usr/local/sega/px/src/pxvertexbuffer.h b/include/usr/local/sega/px/src/pxvertexbuffer.h index e69de29..4767222 100644 --- a/include/usr/local/sega/px/src/pxvertexbuffer.h +++ b/include/usr/local/sega/px/src/pxvertexbuffer.h @@ -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 diff --git a/src/usr/local/sega/px/src/pxvertexbuffer.c b/src/usr/local/sega/px/src/pxvertexbuffer.c index e69de29..e0e7a11 100644 --- a/src/usr/local/sega/px/src/pxvertexbuffer.c +++ b/src/usr/local/sega/px/src/pxvertexbuffer.c @@ -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]; +}