started implementing some GPU abstractions and moved test to C
[psx_test1] / src / psxregs.h
index dc3a7f1..d3042c3 100644 (file)
@@ -1,27 +1,27 @@
 #ifndef PSXREGS_H_
 #define PSXREGS_H_
 
-#define REG_BASE       0x1f800000
-#define REGPTR32(x)    (*(volatile unsigned long*)(REG_BASE | (x)))
-#define REGPTR16(x)    (*(volatile unsigned short*)(REG_BASE | (x)))
+#define REG_BASE               0x1f800000
+#define REGPTR32(x)            (*(volatile unsigned long*)(REG_BASE | (x)))
+#define REGPTR16(x)            (*(volatile unsigned short*)(REG_BASE | (x)))
 
 /* --- GPU --- */
-#define REGN_GP0       0x1810
-#define REGN_GP1       0x1814
+#define REGN_GP0               0x1810
+#define REGN_GP1               0x1814
 #define REGN_GPUREAD   REGN_GP0
 #define REGN_GPUSTAT   REGN_GP1
 
-#define REG_GP0                REGPTR32(REGN_GP0)
-#define REG_GP1                REGPTR32(REGN_GP1)
-#define REG_GPUREAD    REGPTR32(REGN_GPUREAD)
-#define REG_GPUSTAT    REGPTR32(REGN_GPUSTAT)
+#define REG_GP0                        REGPTR32(REGN_GP0)
+#define REG_GP1                        REGPTR32(REGN_GP1)
+#define REG_GPUREAD            REGPTR32(REGN_GPUREAD)
+#define REG_GPUSTAT            REGPTR32(REGN_GPUSTAT)
 
 /* --- interrupts --- */
-#define REGN_ISTAT     1070h
-#define REGN_IMASK     1074h
+#define REGN_ISTAT             1070h
+#define REGN_IMASK             1074h
 
-#define REG_ISTAT      REGPTR32(REGN_ISTAT)
-#define REG_IMASK      REGPTR32(REGN_IMASK)
+#define REG_ISTAT              REGPTR32(REGN_ISTAT)
+#define REG_IMASK              REGPTR32(REGN_IMASK)
 
 enum {
        IRQ_VBLANK      = 0x0001,
@@ -37,4 +37,129 @@ enum {
        IRQ_LPEN        = 0x0400
 };
 
+#define GPCMD(cmd)     ((cmd) << 24)
+
+enum {
+       GP1_RESET               = 0,
+       GP1_RESET_CMDBUF = 0x01,
+       GP1_IACK                = 0x02,
+       GP1_DISPEN              = 0x03, /* 0:on, 1:off */
+       GP1_DMADIR              = 0x04, /* 0:off, 1:fifo, 2:cpu->gpu, 3:gpu->cpu */
+       GP1_START               = 0x05, /* bits [0,9]: X, [10,18]: Y */
+       GP1_HDISP               = 0x06, /* (pix*8) bits [0,11]: left, [12,23]: right */
+       GP1_VDISP               = 0x07, /* bits [0,9]: top, [10,19]: bottom */
+       GP1_DISPMODE    = 0x08, /* see DISP_* flags */
+};
+
+#define DISP_H256      0
+#define DISP_H320      0x01
+#define DISP_H512      0x02
+#define DISP_H640      0x03
+#define DISP_V240      0
+#define DISP_V480      0x04
+#define DISP_NTSC      0
+#define DISP_PAL       0x08
+#define DISP_15BPP     0
+#define DISP_24BPP     0x10
+#define DISP_ILACE     0x20
+#define DISP_H368      0x40
+
+
+/* primitive bits for GP0 drawing commands */
+enum {
+       PRIM_TRI                = 0x20,
+       PRIM_QUAD               = 0x28,
+       PRIM_LINE               = 0x40,
+       PRIM_PLINE              = 0x48,
+       PRIM_RECT               = 0x60,
+       PRIM_POINT              = 0x6a, /* rect 1x1 */
+       PRIM_RECT8              = 0x70,
+       PRIM_RECT16             = 0x78,
+
+       PRIM_NOMOD              = 0x01, /* no-modulate tex/color bit */
+       PRIM_ST                 = 0x02, /* semi-transparent bit */
+       PRIM_TEX                = 0x04, /* textured bit */
+       PRIM_GOURAUD    = 0x10  /* gouraud bit */
+};
+
+enum {
+       GP0_CLEAR_CACHE = 0,
+       GP0_FILLRECT    = 0x02, /* color24+cmd/topleft/size */
+       GP0_BLT_VIDVID  = 0x80, /* cmd/src/dst/size */
+       GP0_BLT_CPUVID  = 0xa0, /* cmd/dst/size/data(dma?) */
+       GP0_BLT_VIDCPU  = 0xc0, /* cmd/src/size/data(GPUREAD|dma) */
+       GP0_TEXPG               = 0xe1,
+       GP0_TEXWIN              = 0xe2,
+       GP0_CLIP_TL             = 0xe3,
+       GP0_CLIP_BR             = 0xe4,
+       GP0_ORIGIN              = 0xe5,
+
+       /* flat tri/quad: cmd+color/v0/.../vN (16+16 YYYYXXXX) */
+       GP0_TRI                         = PRIM_TRI,
+       GP0_TRI_ST                      = PRIM_TRI | PRIM_ST,
+       GP0_QUAD                        = PRIM_QUAD,
+       GP0_QUAD_ST                     = PRIM_QUAD | PRIM_ST,
+       /* textured tri/quad: cmd+color/v0/uv0+pal/v1/uv1+texpage/v2/uv2/.. */
+       GP0_TRI_TEXMOD          = PRIM_TRI | PRIM_TEX,
+       GP0_TRI_TEX                     = PRIM_TRI | PRIM_TEX | PRIM_NOMOD,
+       GP0_TRI_ST_TEXMOD       = PRIM_TRI | PRIM_ST | PRIM_TEX,
+       GP0_TRI_ST_TEX          = PRIM_TRI | PRIM_ST | PRIM_TEX | PRIM_NOMOD,
+       GP0_QUAD_TEXMOD         = PRIM_QUAD | PRIM_TEX,
+       GP0_QUAD_TEX            = PRIM_QUAD | PRIM_TEX | PRIM_NOMOD,
+       GP0_QUAD_ST_TEXMOD      = PRIM_QUAD | PRIM_ST | PRIM_TEX,
+       GP0_QUAD_ST_TEX         = PRIM_QUAD | PRIM_ST | PRIM_TEX | PRIM_NOMOD,
+       /* gouraud tri/quad: cmd+color0/v0/c1/v1/.../cN/vN */
+       GP0_GTRI                        = PRIM_TRI | PRIM_GOURAUD,
+       GP0_GTRI_ST                     = PRIM_TRI | PRIM_GOURAUD | PRIM_ST,
+       GP0_GQUAD                       = PRIM_QUAD | PRIM_GOURAUD,
+       GP0_GQUAD_ST            = PRIM_QUAD | PRIM_GOURAUD | PRIM_ST,
+       /* gouraud tex tri/quad: cmd+color0/v0/uv0+pal/c1/v1/uv1+texpage/c2/v2/uv2/... */
+       GP0_GTRI_TEXMOD         = PRIM_TRI | PRIM_GOURAUD | PRIM_TEX,
+       GP0_GTRI_ST_TEXMOD      = PRIM_TRI | PRIM_GOURAUD | PRIM_ST | PRIM_TEX,
+       GP0_GQUAD_TEXMOD        = PRIM_QUAD | PRIM_GOURAUD | PRIM_TEX,
+       GP0_GQUAD_ST_TEXMOD     = PRIM_QUAD | PRIM_GOURAUD | PRIM_ST | PRIM_TEX,
+
+       /* line/poly-line: cmd+color/v0/.../vN/PLINE_END(55555555h) */
+       GP0_LINE                        = PRIM_LINE,
+       GP0_LINE_ST                     = PRIM_LINE | PRIM_ST,
+       GP0_PLINE                       = PRIM_PLINE,
+       GP0_PLINE_ST            = PRIM_PLINE | PRIM_ST,
+       /* line/poly-line: cmd+color0/v0/c1/v1/.../cN/vN/PLINE_END */
+       GP0_GLINE                       = PRIM_LINE | PRIM_GOURAUD,
+       GP0_GLINE_ST            = PRIM_LINE | PRIM_GOURAUD | PRIM_ST,
+       GP0_GPLINE                      = PRIM_PLINE | PRIM_GOURAUD,
+       GP0_GPLINE_ST           = PRIM_PLINE | PRIM_GOURAUD | PRIM_ST,
+
+       /* rect: cmd+col/pos/size(for variable rect) */
+       GP0_RECT                        = PRIM_RECT,
+       GP0_RECT_ST                     = PRIM_RECT | PRIM_ST,
+       GP0_POINT                       = PRIM_POINT,
+       GP0_POINT_ST            = PRIM_POINT | PRIM_ST,
+       GP0_RECT8                       = PRIM_RECT8,
+       GP0_RECT8_ST            = PRIM_RECT8 | PRIM_ST,
+       GP0_RECT16                      = PRIM_RECT16,
+       GP0_RECT16_ST           = PRIM_RECT16 | PRIM_ST,
+       /* rect: cmd+col/pos/uv0+pal/size(for var rect), texpage in GP0(e1h) */
+       GP0_RECT_TEXMOD         = PRIM_RECT | PRIM_TEX,
+       GP0_RECT_TEX            = PRIM_RECT | PRIM_TEX | PRIM_NOMOD,
+       GP0_RECT_ST_TEXMOD      = PRIM_RECT | PRIM_ST | PRIM_TEX,
+       GP0_RECT_ST_TEX         = PRIM_RECT | PRIM_ST | PRIM_TEX | PRIM_NOMOD,
+       /* ... TODO and the rest ... */
+};
+
+
+enum {
+       TEXPG_BLEND_HALF        = 0,
+       TEXPG_BLEND_ADD         = 0x0020,
+       TEXPG_BLEND_SUB         = 0x0040,
+       TEXPG_BLEND_QUART       = 0x0060,
+       TEXPG_8BPP                      = 0x0080,
+       TEXPG_15BPP                     = 0x0100,
+       TEXPG_DRAWDISP          = 0x0200,
+       TEXPG_DITHER            = 0x0400,
+       TEXPG_NOTEX                     = 0x0800,
+       TEXPG_XFLIP                     = 0x1000,
+       TEXPG_YFLIP                     = 0x2000
+};
+
 #endif /* PSXREGS_H_ */