d3042c3693160efbfd744cf8daf669e9feb46c7e
[psx_test1] / src / psxregs.h
1 #ifndef PSXREGS_H_
2 #define PSXREGS_H_
3
4 #define REG_BASE                0x1f800000
5 #define REGPTR32(x)             (*(volatile unsigned long*)(REG_BASE | (x)))
6 #define REGPTR16(x)             (*(volatile unsigned short*)(REG_BASE | (x)))
7
8 /* --- GPU --- */
9 #define REGN_GP0                0x1810
10 #define REGN_GP1                0x1814
11 #define REGN_GPUREAD    REGN_GP0
12 #define REGN_GPUSTAT    REGN_GP1
13
14 #define REG_GP0                 REGPTR32(REGN_GP0)
15 #define REG_GP1                 REGPTR32(REGN_GP1)
16 #define REG_GPUREAD             REGPTR32(REGN_GPUREAD)
17 #define REG_GPUSTAT             REGPTR32(REGN_GPUSTAT)
18
19 /* --- interrupts --- */
20 #define REGN_ISTAT              1070h
21 #define REGN_IMASK              1074h
22
23 #define REG_ISTAT               REGPTR32(REGN_ISTAT)
24 #define REG_IMASK               REGPTR32(REGN_IMASK)
25
26 enum {
27         IRQ_VBLANK      = 0x0001,
28         IRQ_GPU         = 0x0002,
29         IRQ_CDROM       = 0x0004,
30         IRQ_DMA         = 0x0008,
31         IRQ_TIMER0      = 0x0010,
32         IRQ_TIMER1      = 0x0020,
33         IRQ_TIMER2      = 0x0040,
34         IRQ_JOYMC       = 0x0080,
35         IRQ_SIO         = 0x0100,
36         IRQ_SPU         = 0x0200,
37         IRQ_LPEN        = 0x0400
38 };
39
40 #define GPCMD(cmd)      ((cmd) << 24)
41
42 enum {
43         GP1_RESET               = 0,
44         GP1_RESET_CMDBUF = 0x01,
45         GP1_IACK                = 0x02,
46         GP1_DISPEN              = 0x03, /* 0:on, 1:off */
47         GP1_DMADIR              = 0x04, /* 0:off, 1:fifo, 2:cpu->gpu, 3:gpu->cpu */
48         GP1_START               = 0x05, /* bits [0,9]: X, [10,18]: Y */
49         GP1_HDISP               = 0x06, /* (pix*8) bits [0,11]: left, [12,23]: right */
50         GP1_VDISP               = 0x07, /* bits [0,9]: top, [10,19]: bottom */
51         GP1_DISPMODE    = 0x08, /* see DISP_* flags */
52 };
53
54 #define DISP_H256       0
55 #define DISP_H320       0x01
56 #define DISP_H512       0x02
57 #define DISP_H640       0x03
58 #define DISP_V240       0
59 #define DISP_V480       0x04
60 #define DISP_NTSC       0
61 #define DISP_PAL        0x08
62 #define DISP_15BPP      0
63 #define DISP_24BPP      0x10
64 #define DISP_ILACE      0x20
65 #define DISP_H368       0x40
66
67
68 /* primitive bits for GP0 drawing commands */
69 enum {
70         PRIM_TRI                = 0x20,
71         PRIM_QUAD               = 0x28,
72         PRIM_LINE               = 0x40,
73         PRIM_PLINE              = 0x48,
74         PRIM_RECT               = 0x60,
75         PRIM_POINT              = 0x6a, /* rect 1x1 */
76         PRIM_RECT8              = 0x70,
77         PRIM_RECT16             = 0x78,
78
79         PRIM_NOMOD              = 0x01, /* no-modulate tex/color bit */
80         PRIM_ST                 = 0x02, /* semi-transparent bit */
81         PRIM_TEX                = 0x04, /* textured bit */
82         PRIM_GOURAUD    = 0x10  /* gouraud bit */
83 };
84
85 enum {
86         GP0_CLEAR_CACHE = 0,
87         GP0_FILLRECT    = 0x02, /* color24+cmd/topleft/size */
88         GP0_BLT_VIDVID  = 0x80, /* cmd/src/dst/size */
89         GP0_BLT_CPUVID  = 0xa0, /* cmd/dst/size/data(dma?) */
90         GP0_BLT_VIDCPU  = 0xc0, /* cmd/src/size/data(GPUREAD|dma) */
91         GP0_TEXPG               = 0xe1,
92         GP0_TEXWIN              = 0xe2,
93         GP0_CLIP_TL             = 0xe3,
94         GP0_CLIP_BR             = 0xe4,
95         GP0_ORIGIN              = 0xe5,
96
97         /* flat tri/quad: cmd+color/v0/.../vN (16+16 YYYYXXXX) */
98         GP0_TRI                         = PRIM_TRI,
99         GP0_TRI_ST                      = PRIM_TRI | PRIM_ST,
100         GP0_QUAD                        = PRIM_QUAD,
101         GP0_QUAD_ST                     = PRIM_QUAD | PRIM_ST,
102         /* textured tri/quad: cmd+color/v0/uv0+pal/v1/uv1+texpage/v2/uv2/.. */
103         GP0_TRI_TEXMOD          = PRIM_TRI | PRIM_TEX,
104         GP0_TRI_TEX                     = PRIM_TRI | PRIM_TEX | PRIM_NOMOD,
105         GP0_TRI_ST_TEXMOD       = PRIM_TRI | PRIM_ST | PRIM_TEX,
106         GP0_TRI_ST_TEX          = PRIM_TRI | PRIM_ST | PRIM_TEX | PRIM_NOMOD,
107         GP0_QUAD_TEXMOD         = PRIM_QUAD | PRIM_TEX,
108         GP0_QUAD_TEX            = PRIM_QUAD | PRIM_TEX | PRIM_NOMOD,
109         GP0_QUAD_ST_TEXMOD      = PRIM_QUAD | PRIM_ST | PRIM_TEX,
110         GP0_QUAD_ST_TEX         = PRIM_QUAD | PRIM_ST | PRIM_TEX | PRIM_NOMOD,
111         /* gouraud tri/quad: cmd+color0/v0/c1/v1/.../cN/vN */
112         GP0_GTRI                        = PRIM_TRI | PRIM_GOURAUD,
113         GP0_GTRI_ST                     = PRIM_TRI | PRIM_GOURAUD | PRIM_ST,
114         GP0_GQUAD                       = PRIM_QUAD | PRIM_GOURAUD,
115         GP0_GQUAD_ST            = PRIM_QUAD | PRIM_GOURAUD | PRIM_ST,
116         /* gouraud tex tri/quad: cmd+color0/v0/uv0+pal/c1/v1/uv1+texpage/c2/v2/uv2/... */
117         GP0_GTRI_TEXMOD         = PRIM_TRI | PRIM_GOURAUD | PRIM_TEX,
118         GP0_GTRI_ST_TEXMOD      = PRIM_TRI | PRIM_GOURAUD | PRIM_ST | PRIM_TEX,
119         GP0_GQUAD_TEXMOD        = PRIM_QUAD | PRIM_GOURAUD | PRIM_TEX,
120         GP0_GQUAD_ST_TEXMOD     = PRIM_QUAD | PRIM_GOURAUD | PRIM_ST | PRIM_TEX,
121
122         /* line/poly-line: cmd+color/v0/.../vN/PLINE_END(55555555h) */
123         GP0_LINE                        = PRIM_LINE,
124         GP0_LINE_ST                     = PRIM_LINE | PRIM_ST,
125         GP0_PLINE                       = PRIM_PLINE,
126         GP0_PLINE_ST            = PRIM_PLINE | PRIM_ST,
127         /* line/poly-line: cmd+color0/v0/c1/v1/.../cN/vN/PLINE_END */
128         GP0_GLINE                       = PRIM_LINE | PRIM_GOURAUD,
129         GP0_GLINE_ST            = PRIM_LINE | PRIM_GOURAUD | PRIM_ST,
130         GP0_GPLINE                      = PRIM_PLINE | PRIM_GOURAUD,
131         GP0_GPLINE_ST           = PRIM_PLINE | PRIM_GOURAUD | PRIM_ST,
132
133         /* rect: cmd+col/pos/size(for variable rect) */
134         GP0_RECT                        = PRIM_RECT,
135         GP0_RECT_ST                     = PRIM_RECT | PRIM_ST,
136         GP0_POINT                       = PRIM_POINT,
137         GP0_POINT_ST            = PRIM_POINT | PRIM_ST,
138         GP0_RECT8                       = PRIM_RECT8,
139         GP0_RECT8_ST            = PRIM_RECT8 | PRIM_ST,
140         GP0_RECT16                      = PRIM_RECT16,
141         GP0_RECT16_ST           = PRIM_RECT16 | PRIM_ST,
142         /* rect: cmd+col/pos/uv0+pal/size(for var rect), texpage in GP0(e1h) */
143         GP0_RECT_TEXMOD         = PRIM_RECT | PRIM_TEX,
144         GP0_RECT_TEX            = PRIM_RECT | PRIM_TEX | PRIM_NOMOD,
145         GP0_RECT_ST_TEXMOD      = PRIM_RECT | PRIM_ST | PRIM_TEX,
146         GP0_RECT_ST_TEX         = PRIM_RECT | PRIM_ST | PRIM_TEX | PRIM_NOMOD,
147         /* ... TODO and the rest ... */
148 };
149
150
151 enum {
152         TEXPG_BLEND_HALF        = 0,
153         TEXPG_BLEND_ADD         = 0x0020,
154         TEXPG_BLEND_SUB         = 0x0040,
155         TEXPG_BLEND_QUART       = 0x0060,
156         TEXPG_8BPP                      = 0x0080,
157         TEXPG_15BPP                     = 0x0100,
158         TEXPG_DRAWDISP          = 0x0200,
159         TEXPG_DITHER            = 0x0400,
160         TEXPG_NOTEX                     = 0x0800,
161         TEXPG_XFLIP                     = 0x1000,
162         TEXPG_YFLIP                     = 0x2000
163 };
164
165 #endif  /* PSXREGS_H_ */