#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,
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_ */