/* * tmd_func.c */ #include #include "tmd_defs.h" #define PRIM_BASE (tmd_prim *)0x80090000 #define VERT_BASE (tmd_vert *)0x800a0000 #define NORM_BASE (tmd_norm *)0x800d0000 #define PRIM_TAB (u_long *)0x800e0000 /* * memory map for TMD data * * 0x80090000 - 0x8009ffff PRIM * 0x800a0000 - 0x800cffff VERT * 0x800d0000 - 0x800dffff NORM * 0x800e0000 - 0x800e0fff PRIM_TAB */ static tmd_prim *prim = PRIM_BASE; static tmd_vert *vert = VERT_BASE; static tmd_norm *norm = NORM_BASE; static u_long *prim_tab = PRIM_TAB; static tmd_prim *next_prim; static u_long vert_idx, norm_idx, prim_idx; void tmd_reset(void) { vert_idx = 0; norm_idx = 0; prim_idx = 0; next_prim = prim; } u_long *tmd_primbase(void) { return (u_long *)(next_prim); } u_long *tmd_vertbase(void) { return (u_long *)(vert + vert_idx); } u_long *tmd_normbase(void) { return (u_long *)(norm + norm_idx); } u_short tmd_addvert(u_long x, u_long y, u_long z) { vert[vert_idx].vx = x; vert[vert_idx].vy = y; vert[vert_idx].vz = z; vert_idx++; return vert_idx-1; } u_short tmd_addnorm(u_long x, u_long y, u_long z) { norm[norm_idx].nx = x; norm[norm_idx].ny = y; norm[norm_idx].nz = z; norm_idx++; return norm_idx-1; } void tmd_addp4fnt(u_short n0, u_short v0, u_short v1, u_short v2, u_short v3, u_char r, u_char g, u_char b) { prim_4_fnt *p4_fnt = (prim_4_fnt *)(next_prim + 1); next_prim[0].hdr.mode = 0x28; next_prim[0].hdr.flag = 0x00; next_prim[0].hdr.ilen = 0x04; next_prim[0].hdr.olen = 0x05; p4_fnt[0].mode2 = 0x28; p4_fnt[0].r0 = r; p4_fnt[0].g0 = g; p4_fnt[0].b0 = b; p4_fnt[0].n0 = n0; p4_fnt[0].v0 = v0; p4_fnt[0].v1 = v1; p4_fnt[0].v2 = v2; p4_fnt[0].v3 = v3; next_prim = (tmd_prim *)((u_char *)next_prim + sizeof(tmd_prim) + sizeof(prim_4_fnt)); } void tmd_addp3fnt(u_short n0, u_short v0, u_short v1, u_short v2, u_char r, u_char g, u_char b) { prim_3_fnt *p3_fnt = (prim_3_fnt *)(next_prim + 1); next_prim[0].hdr.mode = 0x20; next_prim[0].hdr.flag = 0x00; next_prim[0].hdr.ilen = 0x03; next_prim[0].hdr.olen = 0x04; p3_fnt[0].mode2 = 0x20; p3_fnt[0].r0 = r; p3_fnt[0].g0 = g; p3_fnt[0].b0 = b; p3_fnt[0].n0 = n0; p3_fnt[0].v0 = v0; p3_fnt[0].v1 = v1; p3_fnt[0].v2 = v2; // printf("tmd_addp3fnt: hdr @ %p data @ %p ", next_prim, p3_fnt); next_prim = (tmd_prim *)((u_char *)next_prim + sizeof(tmd_prim) + sizeof(prim_3_fnt)); // printf("next @ %p\n", next_prim); }