diff options
| author | John Wilbert M. Villamor <lameguy64@gmail.com> | 2019-04-06 10:11:07 +0800 |
|---|---|---|
| committer | John Wilbert M. Villamor <lameguy64@gmail.com> | 2019-04-06 10:11:07 +0800 |
| commit | f3e040230772f978540a71aea43dfde200992922 (patch) | |
| tree | bd8ca31b72dd01e24980b073854e263589530f56 /libpsn00b/include/psxgpu.h | |
| download | psn00bsdk-f3e040230772f978540a71aea43dfde200992922.tar.gz | |
First commit
Diffstat (limited to 'libpsn00b/include/psxgpu.h')
| -rw-r--r-- | libpsn00b/include/psxgpu.h | 556 |
1 files changed, 556 insertions, 0 deletions
diff --git a/libpsn00b/include/psxgpu.h b/libpsn00b/include/psxgpu.h new file mode 100644 index 0000000..24d023a --- /dev/null +++ b/libpsn00b/include/psxgpu.h @@ -0,0 +1,556 @@ +#ifndef __PSXGPU_H +#define __PSXGPU_H + +// Low-level display parameters for DISPENV_RAW. A leftover from prototyping +#define DISP_WIDTH_256 0 +#define DISP_WIDTH_320 1 +#define DISP_WIDTH_384 64 +#define DISP_WIDTH_512 2 +#define DISP_WIDTH_640 3 + +#define DISP_HEIGHT_LOW 0 // Could be 240 for NTSC, 256 for PAL +#define DISP_HEIGHT_HIGH 4 // Could be 480 for NTSC, 512 for PAL +#define DISP_INTERLACE 32 +#define DISP_24BIT_COLOR 16 +#define DISP_MODE_NTSC 0 +#define DISP_MODE_PAL 8 + + +#define MODE_NTSC 0 +#define MODE_PAL 1 + + +// Vector macros + +#define setVector( v, _x, _y, _z ) \ + (v)->vx = _x, (v)->vy = _y, (v)->vz = _z + +#define setRECT( r, _x, _y, _w, _h ) \ + (v)->x = _x, (v)->y = _y, (v)->w = _w, (v)->h = _h + + + + + +// Primitive macros + + +#define setDrawTPage( p, tp, abr, x, y ) \ + ( (p)->code[0] = getTPage( tp, abr, x, y ), \ + setlen( p, 1 ), setcode( p, 0xe1 ) ) + +/** ORIGINAL FUNCTION **/ +#define setDrawTPageVal( p, tp ) \ + ( (p)->code[0] = tp, \ + setlen( p, 1 ), setcode( p, 0xe1 ) ) + +/*#define setVram2Vram( p ) ( setlen( p, 8 ), setcode( p, 0x80 ), \ + (p)->nop[0] = 0, (p)->nop[1] = 0, (p)->nop[2] = 0, (p)->nop[3] = 0 )*/ + +/* + +#define setTPagePri2( p, dth, tp, abr, x, y ) \ + ( (p)->code[0] = getTPage( tp, abr, x, y )|(dth<<9), \ + setlen( p, 1 ), setcode( p, 0xe1 ) )*/ + +/* + * Set primitive attributes + */ +#define setTPage( p, tp, abr, x, y ) \ + ( (p)->tpage = getTPage( tp, abr, x, y ) ) + +#define setClut( p, x, y ) \ + ( (p)->clut = getClut(x, y) ) + + +/* + * Set primitive colors + */ +#define setRGB0( p, r, g, b ) ( (p)->r0 = r, (p)->g0 = g, (p)->b0 = b ) +#define setRGB1( p, r, g, b ) ( (p)->r1 = r, (p)->g1 = g, (p)->b1 = b ) +#define setRGB2( p, r, g, b ) ( (p)->r2 = r, (p)->g2 = g, (p)->b2 = b ) +#define setRGB3( p, r, g, b ) ( (p)->r3 = r, (p)->g3 = g, (p)->b3 = b ) + + +/* + * Set primitive screen coordinates + */ +#define setXY0( p, _x0, _y0 ) \ + (p)->x0 = _x0, (p)->y0 = _y0 + +#define setXY2( p, _x0, _y0, _x1, _y1 ) \ + (p)->x0 = _x0, (p)->y0 = _y0, \ + (p)->x1 = _x1, (p)->y1 = _y1 + +#define setXY3( p, _x0, _y0, _x1, _y1, _x2, _y2 ) \ + (p)->x0 = _x0, (p)->y0 = _y0, \ + (p)->x1 = _x1, (p)->y1 = _y1, \ + (p)->x2 = _x2, (p)->y2 = _y2 + +#define setXY4( p, _x0, _y0, _x1, _y1, _x2, _y2, _x3, _y3 ) \ + (p)->x0 = _x0, (p)->y0 = _y0, \ + (p)->x1 = _x1, (p)->y1 = _y1, \ + (p)->x2 = _x2, (p)->y2 = _y2, \ + (p)->x3 = _x3, (p)->y3 = _y3 + +#define setWH( p, _w, _h ) \ + (p)->w = _w, (p)->h = _h + + +/* + * Set texture coordinates + */ +#define setUV0( p, _u0, _v0 ) \ + (p)->u0 = _u0, (p)->v0 = _v0 + +#define setUV3( p, _u0, _v0, _u1, _v1, _u2, _v2 ) \ + (p)->u0 = _u0, (p)->v0 = _v0, \ + (p)->u1 = _u1, (p)->v1 = _v1, \ + (p)->u2 = _u2, (p)->v2 = _v2 + +#define setUV4( p, _u0, _v0, _u1, _v1, _u2, _v2, _u3, _v3 ) \ + (p)->u0 = _u0, (p)->v0 = _v0, \ + (p)->u1 = _u1, (p)->v1 = _v1, \ + (p)->u2 = _u2, (p)->v2 = _v2, \ + (p)->u3 = _u3, (p)->v3 = _v3 + +#define setUVWH( p, _u0, _v0, _w, _h ) \ + (p)->u0 = _u0, (p)->v0 = _v0, \ + (p)->u1 = _u1+(_w), (p)->v1 = _v1, \ + (p)->u2 = _u2, (p)->v2 = _v2+(_h), \ + (p)->u2 = _u3+(_h), (p)->v2 = _v3+(_h) + + +/* + * Primitive handling macros + */ +#define setlen( p, _len ) ( ((P_TAG*)(p))->len = (unsigned char)_len ) +#define setaddr( p, _addr ) ( ((P_TAG*)(p))->addr = (unsigned int)_addr ) +#define setcode( p, _code ) ( ((P_TAG*)(p))->code = (unsigned char)_code ) + +#define getlen( p ) ( ((P_TAG*)(p))->len ) +#define getaddr( p ) ( ((P_TAG*)(p))->addr ) +#define getcode( p ) ( ((P_TAG*)(p))->code ) + +#define nextPrim( p ) (void*)((((P_TAG*)(p))->addr)|0x80000000) +#define isendprim( p ) ((((P_TAG*)(p))->addr)==0xffffff) + +#define addPrim( ot, p ) setaddr( p, getaddr( ot ) ), setaddr( ot, p ) +#define addPrims(ot, p0, p1) setaddr( p1, getaddr( ot ) ), setaddr( ot, p0 ) + +#define catPrim( p0, p1 ) setaddr( p0, p1 ) +#define termPrim( p ) setaddr( p, 0xffffffff ) + +#define setSemiTrans( p, abe ) \ + ( (abe)?setcode( p, getcode( p )|0x2 ):setcode( p, getcode( p )&~0x2 ) ) + +#define setShadeTex( p, tge ) \ + ( (tge)?setcode( p, getcode( p )|0x1 ):setcode( p, getcode( p )&~0x1 ) ) + + +/* ORIGINAl CODE */ +#define setDrawMask( p, sb, mt ) \ + setlen( p, 1 ), p->code[0] = sb|(mt<<1), \ + setcode( p, 0xe6 ) + + +#define getTPage( tp, abr, x, y ) \ + ( (((x)&0x3ff)>>6) | (((y)>>8)<<4) | (((abr)&0x3)<<5) | (((tp)&0x3)<<7) ) + +#define getClut( x, y ) \ + ( ((y)<<6)|(((x)>>4)&0x3f) ) + + +/* + * Primitive initializers + */ +#define setPolyF3( p ) setlen( p, 4 ), setcode( p, 0x20 ) +#define setPolyFT3( p ) setlen( p, 7 ), setcode( p, 0x24 ) +#define setPolyG3( p ) setlen( p, 6 ), setcode( p, 0x30 ) +#define setPolyGT3( p ) setlen( p, 9 ), setcode( p, 0x34 ) + +#define setPolyF4( p ) setlen( p, 5 ), setcode( p, 0x28 ) +#define setPolyFT4( p ) setlen( p, 9 ), setcode( p, 0x2c ) +#define setPolyG4( p ) setlen( p, 8 ), setcode( p, 0x38 ) +#define setPolyGT4( p ) setlen( p, 12 ), setcode( p, 0x3c ) + +#define setSprt8( p ) setlen( p, 3 ), setcode( p, 0x74 ) +#define setSprt16( p ) setlen( p, 3 ), setcode( p, 0x7c ) +#define setSprt( p ) setlen( p, 4 ), setcode( p, 0x64 ) + +#define setTile1( p ) setlen( p, 2 ), setcode( p, 0x68 ) +#define setTile8( p ) setlen( p, 2 ), setcode( p, 0x70 ) +#define setTile16( p ) setlen( p, 2 ), setcode( p, 0x78 ) +#define setTile( p ) setlen( p, 3 ), setcode( p, 0x60 ) + +#define setLineG2( p ) setlen( p, 4 ), setcode( p, 0x50 ) + +#define setLineF4( p ) setlen( p, 6 ), setcode( p, 0x4c ), (p)->pad = 0x55555555 +#define setLineG4( p ) setlen( p, 9 ), setcode( p, 0x5c ), (p)->pad = 0x55555555, \ + (p)->p2 = 0, (p)->p3 = 0 + +#define setFill( p ) setlen( p, 3 ), setcode( p, 0x02 ) + + +/* + * Primitive definitions + */ +typedef struct { + unsigned int addr:24; + unsigned int len:8; + unsigned char r,g,b; + unsigned char code; +} P_TAG; + +/* + * Polygon primitive definitions + */ +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + short x1,y1; + short x2,y2; +} POLY_F3; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char u0,v0; + unsigned short clut; + short x1,y1; + unsigned char u1,v1; + unsigned short tpage; + short x2,y2; + unsigned char u2,v2; + unsigned short pad; +} POLY_FT3; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char r1,g1,b1,pad0; + short x1,y1; + unsigned char r2,g2,b2,pad1; + short x2,y2; +} POLY_G3; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char u0,v0; + unsigned short clut; + unsigned char r1,g1,b1,pad0; + short x1,y1; + unsigned char u1,v1; + unsigned short tpage; + unsigned char r2,g2,b2,pad1; + short x2,y2; + unsigned char u2,v2; + unsigned short pad2; +} POLY_GT3; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + short x1,y1; + short x2,y2; + short x3,y3; +} POLY_F4; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char u0,v0; + unsigned short clut; + short x1,y1; + unsigned char u1,v1; + unsigned short tpage; + short x2,y2; + unsigned char u2,v2; + unsigned short pad0; + short x3,y3; + unsigned char u3,v3; + unsigned short pad1; +} POLY_FT4; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char r1,g1,b1,pad0; + short x1,y1; + unsigned char r2,g2,b2,pad1; + short x2,y2; + unsigned char r3,g3,b3,pad2; + short x3,y3; +} POLY_G4; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char u0,v0; + unsigned short clut; + unsigned char r1,g1,b1,pad0; + short x1,y1; + unsigned char u1,v1; + unsigned short tpage; + unsigned char r2,g2,b2,pad1; + short x2,y2; + unsigned char u2,v2; + unsigned short pad2; + unsigned char r3,g3,b3,pad3; + short x3,y3; + unsigned char u3,v3; + unsigned short pad4; +} POLY_GT4; + +/* + * Line primitive definitions + */ +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + short x1,y1; +} LINE_F2; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char r1,g1,b1,p1; + short x1,y1; +} LINE_G2; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + short x1,y1; + short x2,y2; + unsigned int pad; +} LINE_F3; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char r1,g1,b1,p1; + short x1,y1; + unsigned char r2,g2,b2,p2; + short x2,y2; + unsigned int pad; +} LINE_G3; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + short x1,y1; + short x2,y2; + short x3,y3; + unsigned int pad; +} LINE_F4; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char r1,g1,b1,p1; + short x1,y1; + unsigned char r2,g2,b2,p2; + short x2,y2; + unsigned char r3,g3,b3,p3; + short x3,y3; + unsigned int pad; +} LINE_G4; + +/* + * Tile and sprite primitive definitions + */ +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + short w,h; +} TILE; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; +} TILE_1; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; +} TILE_8; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; +} TILE_16; + +/* + * Sprite primitive definitions + */ +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char u0,v0; + unsigned short clut; + unsigned short w,h; +} SPRT; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char u0,v0; + unsigned short clut; +} SPRT_8; + +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + short x0,y0; + unsigned char u0,v0; + unsigned short clut; +} SPRT_16; + +/* + * VRAM fill and transfer primitive definitions + */ +typedef struct { + unsigned int tag; + unsigned char r0,g0,b0,code; + unsigned short x0,y0; // Note: coordinates must be in 16 pixel steps + unsigned short w,h; +} FILL; + +typedef struct { + unsigned int tag; + unsigned char p0,p1,p2,code; + unsigned short x0,y0; + unsigned short x1,y1; + unsigned short w,h; + unsigned int nop[4]; +} VRAM2VRAM; + +typedef struct { + unsigned int tag; + unsigned int code[15]; +} DR_ENV; + +typedef struct { + unsigned int tag; + unsigned int code[2]; +} DR_TWIN; + +typedef struct { + unsigned int tag; + unsigned int code[1]; +} DR_TPAGE; + +typedef struct { /* ORIGINAL CODE */ + unsigned int tag; + unsigned int code[1]; +} DR_MASK; + + +// General structs + +typedef struct { + short x,y; + short w,h; +} RECT; + +typedef struct { + unsigned int vid_mode; // Video mode + short vid_xpos,vid_ypos; // Video position (not framebuffer) + short fb_x,fb_y; // Framebuffer display position +} DISPENV_RAW; + +typedef struct { + RECT disp; + RECT screen; + char isinter; + char isrgb24; + char reverse; + char pad; +} DISPENV; + +typedef struct { + RECT clip; // Drawing area + short ofs[2]; // GPU draw offset (relative to draw area) + RECT tw; // Texture window (doesn't do anything atm) + unsigned short tpage; // Initial tpage value + unsigned char dtd; // Dither processing flag (simply OR'ed to tpage) + unsigned char dfe; // Drawing to display area blocked/allowed (simply OR'ed to tpage) + unsigned char isbg; // Clear draw area if non-zero + unsigned char r0,g0,b0; // Draw area clear color (if isbg iz nonzero) + DR_ENV dr_env; // Draw mode packet area (used by PutDrawEnv) +} DRAWENV; + +typedef struct { + unsigned int mode; + RECT *crect; + unsigned int *caddr; + RECT *prect; + unsigned int *paddr; +} TIM_IMAGE; + + +#ifdef __cplusplus +extern "C" { +#endif + +// Function definitions (asm) + +void ResetGraph(int mode); + +int GetVideoMode(); +void SetVideoMode(int mode); + +void PutDispEnvRaw(DISPENV_RAW *disp); +void PutDispEnv(DISPENV *disp); +void PutDrawEnv(DRAWENV *draw); + +void SetDispMask(int mask); + +void VSync(); +void DrawSync(); +void WaitGPUcmd(); +void WaitGPUdma(); + +void VSyncCallback(void (*func)()); + +void LoadImage(RECT *rect, unsigned int *data); + +void ClearOTagR(unsigned int* ot, int n); +void DrawOTag(unsigned int* ot); + +void AddPrim(unsigned int* ot, void* pri); + +// Function definitions (C) + +int GetTimInfo(unsigned int *tim, TIM_IMAGE *timimg); + +DISPENV *SetDefDispEnv(DISPENV *disp, int x, int y, int w, int h); +DRAWENV *SetDefDrawEnv(DRAWENV *draw, int x, int y, int w, int h); + +#ifdef __cplusplus +} +#endif + +#endif
\ No newline at end of file |
