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