57#define TEX4_VRAM_BASE_X (TEX4_TX * 64)
58#define TEX4_VRAM_BASE_Y (TEX4_TY * 256)
62#define TEX8_VRAM_BASE_X (TEX8_TX * 64)
63#define TEX8_VRAM_BASE_Y (TEX8_TY * 256)
67#define TEX15_VRAM_BASE_X (TEX15_TX * 64)
68#define TEX15_VRAM_BASE_Y (TEX15_TY * 256)
72#define CLUT4_VRAM_X 512u
73#define CLUT4_VRAM_Y 256u
74#define CLUT8_VRAM_X 512u
75#define CLUT8_VRAM_Y 257u
79static inline uint16_t clutField(uint16_t cx, uint16_t cy) {
80 return (uint16_t)(((cx & 0x3f0) >> 4) | ((cy & 0x1ff) << 6));
83#define CLUT4_FIELD clutField(CLUT4_VRAM_X, CLUT4_VRAM_Y)
84#define CLUT8_FIELD clutField(CLUT8_VRAM_X, CLUT8_VRAM_Y)
85#define CLUT15_FIELD 0u
96static inline uint16_t texpageField(uint16_t tx, uint16_t ty, uint16_t abr, uint16_t depth) {
97 return (uint16_t)((tx & 0xf) | ((ty & 1) << 4) | ((abr & 3) << 5) | ((depth & 3) << 7));
100#define TEX4_TPAGE texpageField(TEX4_TX, TEX4_TY, 0, 0)
101#define TEX8_TPAGE texpageField(TEX8_TX, TEX8_TY, 0, 1)
102#define TEX15_TPAGE texpageField(TEX15_TX, TEX15_TY, 0, 2)
106static inline void setTexpage(uint16_t tx, uint16_t ty, uint16_t depth) {
107 uint32_t
cmd = 0xe1000000u | ((tx & 0xf)) | ((ty & 1) << 4) | (0u << 5) |
108 ((depth & 3) << 7) | (0u << 9) |
117static inline void setTexpageAbr(uint16_t tx, uint16_t ty, uint16_t depth, uint16_t abr) {
119 0xe1000000u | ((tx & 0xf)) | ((ty & 1) << 4) | ((abr & 3) << 5) | ((depth & 3) << 7) | (0u << 9) | (1u << 10);
125static inline void setTextureWindow(uint8_t mask_x, uint8_t mask_y, uint8_t off_x, uint8_t off_y) {
126 uint32_t
cmd = 0xe2000000u | ((uint32_t)(mask_x & 0x1f)) | ((uint32_t)(mask_y & 0x1f) << 5) |
127 ((uint32_t)(off_x & 0x1f) << 10) | ((uint32_t)(off_y & 0x1f) << 15);
139static inline void uploadClut4(
void) {
141 for (
int i = 0;
i < 16;
i++) {
142 clut[
i] = rasterVram555((uint8_t)
i, (uint8_t)(31 -
i), 0);
147 GPU_DATA = ((uint32_t)(uint16_t)1 << 16) | (uint32_t)(uint16_t)16;
149 for (
int i = 0;
i < 8;
i++) {
150 GPU_DATA = (uint32_t)clut[
i * 2] | ((uint32_t)clut[
i * 2 + 1] << 16);
156static inline void uploadClut8(
void) {
158 for (
int i = 0;
i < 256;
i++) {
159 clut[
i] = rasterVram555((uint8_t)(
i & 0x1f), (uint8_t)((255 -
i) & 0x1f), (uint8_t)((
i >> 5) & 0x1f));
164 GPU_DATA = ((uint32_t)(uint16_t)1 << 16) | (uint32_t)(uint16_t)256;
165 for (
int i = 0;
i < 128;
i++) {
166 GPU_DATA = (uint32_t)clut[
i * 2] | ((uint32_t)clut[
i * 2 + 1] << 16);
181static inline void uploadTex4(
void) {
185 GPU_DATA = ((uint32_t)(uint16_t)16 << 16) | (uint32_t)(uint16_t)4;
192 for (
int v = 0; v < 16; v++) {
206static inline void uploadTex8(
void) {
210 GPU_DATA = ((uint32_t)(uint16_t)16 << 16) | (uint32_t)(uint16_t)32;
211 for (
int v = 0; v < 16; v++) {
212 for (
int px = 0;
px < 32;
px += 2) {
215 uint32_t lo_pix = ((uint32_t)(px * 2 + 0) & 0xff) | (((uint32_t)(
px * 2 + 1) & 0xff) << 8);
216 uint32_t hi_pix = ((uint32_t)(px * 2 + 2) & 0xff) | (((uint32_t)(
px * 2 + 3) & 0xff) << 8);
217 GPU_DATA = (lo_pix & 0xffff) | ((hi_pix & 0xffff) << 16);
225static inline void uploadTex15(
void) {
229 GPU_DATA = ((uint32_t)(uint16_t)16 << 16) | (uint32_t)(uint16_t)64;
230 for (
int v = 0; v < 16; v++) {
231 for (
int u = 0; u < 64; u += 2) {
232 uint16_t t0 = rasterVram555((uint8_t)(u & 0x1f), (uint8_t)(v & 0x1f), (uint8_t)((u + v) & 0x1f));
233 uint16_t t1 = rasterVram555((uint8_t)((u + 1) & 0x1f), (uint8_t)(v & 0x1f), (uint8_t)((u + 1 + v) & 0x1f));
234 GPU_DATA = (uint32_t)t0 | ((uint32_t)t1 << 16);
241static inline void uploadTex15Masked(
void) {
245 GPU_DATA = ((uint32_t)(uint16_t)16 << 16) | (uint32_t)(uint16_t)64;
246 for (
int v = 0; v < 16; v++) {
247 for (
int u = 0; u < 64; u += 2) {
249 (uint16_t)(rasterVram555((uint8_t)(u & 0x1f), (uint8_t)(v & 0x1f), (uint8_t)((u + v) & 0x1f)) |
251 uint16_t t1 = (uint16_t)(rasterVram555((uint8_t)((u + 1) & 0x1f), (uint8_t)(v & 0x1f),
252 (uint8_t)((u + 1 + v) & 0x1f)) |
254 GPU_DATA = (uint32_t)t0 | ((uint32_t)t1 << 16);
260static inline void uploadAllTextureFixtures(
void) {
271static inline uint16_t expectedClut4Color(uint8_t u) {
272 return rasterVram555((uint8_t)(u & 0xf), (uint8_t)(31 - (u & 0xf)), 0);
275static inline uint16_t expectedClut8Color(uint8_t u) {
276 return rasterVram555((uint8_t)(u & 0x1f), (uint8_t)((255 - u) & 0x1f), (uint8_t)((u >> 5) & 0x1f));
279static inline uint16_t expectedTex15Color(uint8_t u, uint8_t v) {
280 return rasterVram555((uint8_t)(u & 0x1f), (uint8_t)(v & 0x1f), (uint8_t)((u + v) & 0x1f));
292static inline void rasterTexTri(uint32_t cmdColor, int16_t x0, int16_t y0, uint8_t
u0, uint8_t v0, int16_t x1,
293 int16_t y1, uint8_t
u1, uint8_t
v1, int16_t x2, int16_t y2, uint8_t u2, uint8_t
v2,
294 uint16_t clut_field, uint16_t tpage_field) {
296 GPU_DATA = 0x24000000u | (cmdColor & 0x00ffffffu);
297 GPU_DATA = ((uint32_t)(uint16_t)y0 << 16) | (uint32_t)(uint16_t)x0;
298 GPU_DATA = ((uint32_t)clut_field << 16) | ((uint32_t)v0 << 8) | (uint32_t)
u0;
299 GPU_DATA = ((uint32_t)(uint16_t)y1 << 16) | (uint32_t)(uint16_t)x1;
300 GPU_DATA = ((uint32_t)tpage_field << 16) | ((uint32_t)
v1 << 8) | (uint32_t)
u1;
301 GPU_DATA = ((uint32_t)(uint16_t)y2 << 16) | (uint32_t)(uint16_t)x2;
302 GPU_DATA = (0u << 16) | ((uint32_t)
v2 << 8) | (uint32_t)u2;
308#define TEX_MOD_NEUTRAL 0x808080u
325static inline void rasterFlatTexQuad(uint32_t cmdColor, int16_t x0, int16_t y0, uint8_t
u0, uint8_t v0, int16_t x1,
326 int16_t y1, uint8_t
u1, uint8_t
v1, int16_t x2, int16_t y2, uint8_t u2, uint8_t
v2,
327 int16_t x3, int16_t y3, uint8_t u3, uint8_t v3, uint16_t clut_field,
328 uint16_t tpage_field) {
330 GPU_DATA = 0x2c000000u | (cmdColor & 0x00ffffffu);
331 GPU_DATA = ((uint32_t)(uint16_t)y0 << 16) | (uint32_t)(uint16_t)x0;
332 GPU_DATA = ((uint32_t)clut_field << 16) | ((uint32_t)v0 << 8) | (uint32_t)
u0;
333 GPU_DATA = ((uint32_t)(uint16_t)y1 << 16) | (uint32_t)(uint16_t)x1;
334 GPU_DATA = ((uint32_t)tpage_field << 16) | ((uint32_t)
v1 << 8) | (uint32_t)
u1;
335 GPU_DATA = ((uint32_t)(uint16_t)y2 << 16) | (uint32_t)(uint16_t)x2;
336 GPU_DATA = (0u << 16) | ((uint32_t)
v2 << 8) | (uint32_t)u2;
337 GPU_DATA = ((uint32_t)(uint16_t)y3 << 16) | (uint32_t)(uint16_t)x3;
338 GPU_DATA = (0u << 16) | ((uint32_t)v3 << 8) | (uint32_t)u3;
348static inline void rasterTexRect(uint32_t cmdColor, int16_t x, int16_t y, uint8_t u, uint8_t v, int16_t w, int16_t h,
349 uint16_t clut_field) {
351 GPU_DATA = 0x64000000u | (cmdColor & 0x00ffffffu);
352 GPU_DATA = ((uint32_t)(uint16_t)y << 16) | (uint32_t)(uint16_t)x;
353 GPU_DATA = ((uint32_t)clut_field << 16) | ((uint32_t)v << 8) | (uint32_t)u;
354 GPU_DATA = ((uint32_t)(uint16_t)h << 16) | (uint32_t)(uint16_t)w;
359static inline void rasterTexRectSemi(uint32_t cmdColor, int16_t x, int16_t y, uint8_t u, uint8_t v, int16_t w,
360 int16_t h, uint16_t clut_field) {
362 GPU_DATA = 0x66000000u | (cmdColor & 0x00ffffffu);
363 GPU_DATA = ((uint32_t)(uint16_t)y << 16) | (uint32_t)(uint16_t)x;
364 GPU_DATA = ((uint32_t)clut_field << 16) | ((uint32_t)v << 8) | (uint32_t)u;
365 GPU_DATA = ((uint32_t)(uint16_t)h << 16) | (uint32_t)(uint16_t)w;
371static inline void rasterFlatTexQuadSemi(uint32_t cmdColor, int16_t x0, int16_t y0, uint8_t
u0, uint8_t v0, int16_t x1,
372 int16_t y1, uint8_t
u1, uint8_t
v1, int16_t x2, int16_t y2, uint8_t u2,
373 uint8_t
v2, int16_t x3, int16_t y3, uint8_t u3, uint8_t v3,
374 uint16_t clut_field, uint16_t tpage_field) {
376 GPU_DATA = 0x2e000000u | (cmdColor & 0x00ffffffu);
377 GPU_DATA = ((uint32_t)(uint16_t)y0 << 16) | (uint32_t)(uint16_t)x0;
378 GPU_DATA = ((uint32_t)clut_field << 16) | ((uint32_t)v0 << 8) | (uint32_t)
u0;
379 GPU_DATA = ((uint32_t)(uint16_t)y1 << 16) | (uint32_t)(uint16_t)x1;
380 GPU_DATA = ((uint32_t)tpage_field << 16) | ((uint32_t)
v1 << 8) | (uint32_t)
u1;
381 GPU_DATA = ((uint32_t)(uint16_t)y2 << 16) | (uint32_t)(uint16_t)x2;
382 GPU_DATA = (0u << 16) | ((uint32_t)
v2 << 8) | (uint32_t)u2;
383 GPU_DATA = ((uint32_t)(uint16_t)y3 << 16) | (uint32_t)(uint16_t)x3;
384 GPU_DATA = (0u << 16) | ((uint32_t)v3 << 8) | (uint32_t)u3;
int i
Definition gte-regio.c:299
#define GPU_DATA
Definition hwregs.h:52
volatile void * u0
Definition load-timings.c:875
volatile void * u1
Definition load-timings.c:876
uint16_t cmd[MON_CMD_WORDS]
Definition monitor.c:89
int px
Definition mktest.py:147
#define CLUT8_VRAM_Y
Definition texture-fixtures.h:75
#define TEX4_VRAM_BASE_Y
Definition texture-fixtures.h:58
#define TEX15_VRAM_BASE_X
Definition texture-fixtures.h:67
#define CLUT8_VRAM_X
Definition texture-fixtures.h:74
#define TEX4_VRAM_BASE_X
Definition texture-fixtures.h:57
#define TEX8_VRAM_BASE_X
Definition texture-fixtures.h:62
#define TEX8_VRAM_BASE_Y
Definition texture-fixtures.h:63
#define CLUT4_VRAM_Y
Definition texture-fixtures.h:73
#define TEX15_VRAM_BASE_Y
Definition texture-fixtures.h:68
#define CLUT4_VRAM_X
Definition texture-fixtures.h:72
uint16_t v2
Definition timers.c:262
uint16_t v1
Definition timers.c:260