initial commit
[gbajam21] / src / gbaregs.h
1 #ifndef GBAREGS_H_
2 #define GBAREGS_H_
3
4 #include <stdint.h>
5
6 #define VRAM_START_ADDR         0x6000000
7 #define VRAM_BG_ADDR            VRAM_START_ADDR
8 #define VRAM_OBJ_ADDR           0x6010000
9 #define VRAM_LFB_OBJ_ADDR       0x6014000
10 #define VRAM_LFB_FB0_ADDR       VRAM_START_ADDR
11 #define VRAM_LFB_FB1_ADDR       0x600a000
12
13 /* address of character data block x (4 possible blocks, 16k each) */
14 #define VRAM_CHR_BLOCK_ADDR(x)  (VRAM_START_ADDR + ((x) << 14))
15 /* address of screen data block x (32 possible blocks, 2k each) */
16 #define VRAM_SCR_BLOCK_ADDR(x)  (VRAM_START_ADDR + ((x) << 11))
17
18 /* fields of a background tile in screen memory */
19 #define BGTILE_HFLIP    0x0400
20 #define BGTILE_VFLIP    0x0800
21 #define BGTILE_PAL(x)   ((uint16_t)(x) << 12)
22
23 /* color palette ram addresses for backgrounds and sprites */
24 #define CRAM_BG_ADDR    0x5000000
25 #define CRAM_OBJ_ADDR   0x5000200
26
27 /* OAM table */
28 #define OAM_ADDR                0x7000000
29
30 /* interrupt handler */
31 #define INTR_VECTOR             (*(volatile uint32_t*)0x3007ffc)
32
33 /* battery backed RAM address */
34 #define SRAM_ADDR               0xe000000
35
36 /* I/O space */
37
38 #define REG_BASE                0x4000000
39 #define REG8(x)                 (*(volatile uint8_t*)(REG_BASE + (x)))
40 #define REG16(x)                (*(volatile uint16_t*)(REG_BASE + (x)))
41 #define REG32(x)                (*(volatile uint32_t*)(REG_BASE + (x)))
42
43 /* ---- display registers ---- */
44 #define REG_DISPCNT             REG16(0x00)
45 #define REG_GREENSWAP   REG16(0x02)
46 #define REG_DISPSTAT    REG16(0x04)
47 #define REG_VCOUNT              REG16(0x06)
48 #define REG_BG0CNT              REG16(0x08)
49 #define REG_BG1CNT              REG16(0x0a)
50 #define REG_BG2CNT              REG16(0x0c)
51 #define REG_BG3CNT              REG16(0x0e)
52 /* scrolling registers */
53 #define REG_BG0HOFS             REG16(0x10)
54 #define REG_BG0VOFS             REG16(0x12)
55 #define REG_BG1HOFS             REG16(0x14)
56 #define REG_BG1VOFS             REG16(0x16)
57 #define REG_BG2HOFS             REG16(0x18)
58 #define REG_BG2VOFS             REG16(0x1a)
59 #define REG_BG3HOFS             REG16(0x1c)
60 #define REG_BG3VOFS             REG16(0x1e)
61 /* BG rotation and scaling registers */
62 #define REG_BG2PA               REG16(0x20)
63 #define REG_BG2PB               REG16(0x22)
64 #define REG_BG2PC               REG16(0x24)
65 #define REG_BG2PD               REG16(0x26)
66 #define REG_BG2X                REG32(0x28)
67 #define REG_BG2Y                REG32(0x2c)
68 #define REG_BG3PA               REG16(0x30)
69 #define REG_BG3PB               REG16(0x32)
70 #define REG_BG3PC               REG16(0x34)
71 #define REG_BG3PD               REG16(0x36)
72 #define REG_BG3X                REG32(0x38)
73 #define REG_BG3Y                REG32(0x3c)
74 /* window registers */
75 #define REG_WIN0H               REG16(0x40)
76 #define REG_WIN1H               REG16(0x42)
77 #define REG_WIN0V               REG16(0x44)
78 #define REG_WIN1V               REG16(0x46)
79 #define REG_WININ               REG16(0x48)
80 #define REG_WINOUT              REG16(0x4a)
81
82 #define REG_MOSAIC              REG16(0x4c)
83 /* color effects */
84 #define REG_BLDCNT              REG16(0x50)
85 #define REG_BLDALPHA    REG16(0x52)
86 #define REG_BLDY                REG16(0x54)
87
88 /* ---- sound registers ---- */
89 #define REG_SOUND1CNT_L REG16(0x60)
90 #define REG_SOUND1CNT_H REG16(0x62)
91 #define REG_SOUND1CNT_X REG16(0x64)
92 #define REG_SOUND2CNT_L REG16(0x68)
93 #define REG_SOUND2CNT_H REG16(0x6c)
94 #define REG_SOUND3CNT_L REG16(0x70)
95 #define REG_SOUND3CNT_H REG16(0x72)
96 #define REG_SOUND3CNT_X REG16(0x74)
97 #define REG_SOUND4CNT_L REG16(0x78)
98 #define REG_SOUND4CNT_H REG16(0x7c)
99 #define REG_SOUNDCNT_L  REG16(0x80)
100 #define REG_SOUNDCNT_H  REG16(0x82)
101 #define REG_SOUNDCNT_X  REG16(0x84)
102 #define REG_SOUNDBIAS   REG16(0x88)
103 #define WAVE_RAM_PTR    ((unsigned char*)(REG_BASE + 0x90))
104 #define REG_FIFO_A              REG32(0xa0)
105 #define REG_FIFO_B              REG32(0xa4)
106 #define FIFO_A_PTR              ((unsigned char*)(REG_BASE + 0xa0))
107 #define FIFO_B_PTR              ((unsigned char*)(REG_BASE + 0xa4))
108
109 /* ---- DMA registers ---- */
110 #define REG_DMA0SAD             REG32(0xb0)
111 #define REG_DMA0DAD             REG32(0xb4)
112 #define REG_DMA0CNT_L   REG16(0xb8)
113 #define REG_DMA0CNT_H   REG16(0xba)
114 #define REG_DMA1SAD             REG32(0xbc)
115 #define REG_DMA1DAD             REG32(0xc0)
116 #define REG_DMA1CNT_L   REG16(0xc4)
117 #define REG_DMA1CNT_H   REG16(0xc6)
118 #define REG_DMA2SAD             REG32(0xc8)
119 #define REG_DMA2DAD             REG32(0xcc)
120 #define REG_DMA2CNT_L   REG16(0xd0)
121 #define REG_DMA2CNT_H   REG16(0xd2)
122 #define REG_DMA3SAD             REG32(0xd4)
123 #define REG_DMA3DAD             REG32(0xd8)
124 #define REG_DMA3CNT_L   REG16(0xdc)
125 #define REG_DMA3CNT_H   REG16(0xde)
126
127 /* ---- timer registers ---- */
128 #define REG_TM0CNT_L    REG16(0x100)
129 #define REG_TM0CNT_H    REG16(0x102)
130 #define REG_TM1CNT_L    REG16(0x104)
131 #define REG_TM1CNT_H    REG16(0x106)
132 #define REG_TM2CNT_L    REG16(0x108)
133 #define REG_TM2CNT_H    REG16(0x10a)
134 #define REG_TM3CNT_L    REG16(0x10c)
135 #define REG_TM3CNT_H    REG16(0x10e)
136
137 #define REG_TMCNT_L(x)  REG16(0x100 + ((x) << 2))
138 #define REG_TMCNT_H(x)  REG16(0x102 + ((x) << 2))
139
140 /* ---- communication registers (serial/joybus/gpio) ---- */
141 #define REG_SIODATA32   REG32(0x120)
142 #define REG_SIOMULTI0   REG16(0x120)
143 #define REG_SIOMULTI1   REG16(0x122)
144 #define REG_SIOMULTI2   REG16(0x124)
145 #define REG_SIOMULTI3   REG16(0x126)
146 #define REG_SIOCNT              REG16(0x128)
147 #define REG_SIOMLT_SEND REG16(0x12a)
148 #define REG_SIODATA8    REG16(0x12a)
149 #define REG_RCNT                REG16(0x134)
150 #define REG_JOYCNT              REG16(0x140)
151 #define REG_JOY_RECV    REG32(0x150)
152 #define REG_JOY_TRANS   REG32(0x154)
153 #define REG_JOYSTAT             REG16(0x158)
154
155 /* ---- keypad registers ---- */
156 #define REG_KEYINPUT    REG16(0x130)
157 #define REG_KEYCNT              REG16(0x132)
158
159 /* ---- interrupts ---- */
160 #define REG_IE                  REG16(0x200)
161 #define REG_IF                  REG16(0x202)
162 #define REG_WAITCNT             REG16(0x204)
163 #define REG_IME                 REG16(0x208)
164
165 #define REG_POSTFLG             REG8(0x300)
166 #define REG_HALTCNT             REG8(0x301)
167 #define REG_INTMEMCNT   REG32(0x800)
168
169 /* REG_DISPSTAT bits */
170 #define DISPSTAT_VBLANK                 0x01
171 #define DISPSTAT_HBLANK                 0x02
172 #define DISPSTAT_VMATCH                 0x04
173 #define DISPSTAT_IEN_VBLANK             0x08
174 #define DISPSTAT_IEN_HBLANK             0x10
175 #define DISPSTAT_IEN_VMATCH             0x20
176 #define DISPSTAT_VCOUNT(x)              ((uint16_t)(x) << 8)
177
178 /* REG_DISPCNT bits */
179 #define DISPCNT_MODE(x)                 (x)
180 #define DISPCNT_FB1                             0x0010
181 #define DISPCNT_HBLANK_OBJPROC  0x0020
182 #define DISPCNT_OBJMAP_1D               0x0040
183 #define DISPCNT_FORCE_BLANK             0x0080
184 #define DISPCNT_BG0                             0x0100
185 #define DISPCNT_BG1                             0x0200
186 #define DISPCNT_BG2                             0x0400
187 #define DISPCNT_BG3                             0x0800
188 #define DISPCNT_OBJ                             0x1000
189 #define DISPCNT_WIN0                    0x2000
190 #define DISPCNT_WIN1                    0x4000
191 #define DISPCNT_WINOBJ                  0x8000
192
193 /* REG_BGXCNT bits */
194 #define BGCNT_PRIO(x)                   ((uint16_t)(x))
195 #define BGCNT_CHR_BASE(x)               ((uint16_t)(x) << 2)
196 #define BGCNT_MOSAIC                    0x0040
197 #define BGCNT_256COL                    0x0080
198 #define BGCNT_SCR_BASE(x)               ((uint16_t)(x) << 8)
199 #define BGCNT_WRAP                              0x2000
200
201 #define BGCNT_SZ(x)                             ((uint16_t)(x) << 14)
202 #define BGCNT_SZ_TX_256X256             BGCNT_SZ(0)
203 #define BGCNT_SZ_RS_128X128             BGCNT_SZ(0)
204 #define BGCNT_SZ_TX_512X256             BGCNT_SZ(1)
205 #define BGCNT_SZ_RS_256X256             BGCNT_SZ(1)
206 #define BGCNT_SZ_TX_256X512             BGCNT_SZ(2)
207 #define BGCNT_SZ_RS_512X512             BGCNT_SZ(2)
208 #define BGCNT_SZ_TX_512X512             BGCNT_SZ(3)
209 #define BGCNT_SZ_RS_1024X1024   BGCNT_SZ(3)
210
211 /* REG_BLDCNT bits */
212 #define BLDCNT_A_BG0            0x0001
213 #define BLDCNT_A_BG1            0x0002
214 #define BLDCNT_A_BG2            0x0004
215 #define BLDCNT_A_BG3            0x0008
216 #define BLDCNT_A_OBJ            0x0010
217 #define BLDCNT_A_BACKDROP       0x0020
218 #define BLDCNT_B_BG0            0x0100
219 #define BLDCNT_B_BG1            0x0200
220 #define BLDCNT_B_BG2            0x0400
221 #define BLDCNT_B_BG3            0x0800
222 #define BLDCNT_B_OBJ            0x1000
223 #define BLDCNT_B_BACKDROP       0x2000
224
225 #define BLDCNT_ALPHA            0x0040
226 #define BLDCNT_BRIGHTEN         0x0080
227 #define BLDCNT_DARKEN           0x00c0
228
229 /* REG_IF bits */
230 #define IF_VBLANK               0x0001
231 #define IF_HBLANK               0x0002
232 #define IF_VMATCH               0x0004
233 #define IF_TIMER0               0x0008
234 #define IF_TIMER1               0x0010
235 #define IF_TIMER2               0x0020
236 #define IF_TIMER3               0x0040
237 #define IF_COMM                 0x0080
238 #define IF_DMA0                 0x0100
239 #define IF_DMA1                 0x0200
240 #define IF_DMA2                 0x0400
241 #define IF_DMA3                 0x0800
242 #define IF_KEY                  0x1000
243 #define IF_GPAK                 0x2000
244
245 /* REG_TMXCNT bits */
246 #define TMCNT_PRESCL_CLK1               0
247 #define TMCNT_PRESCL_CLK64              1
248 #define TMCNT_PRESCL_CLK256             2
249 #define TMCNT_PRESCL_CLK1024    3
250
251 #define TMCNT_CASCADE                   0x04
252 #define TMCNT_IE                                0x40
253 #define TMCNT_EN                                0x80
254
255 /* REG_KEY* bits */
256 #define KEY_A                   0x0001
257 #define KEY_B                   0x0002
258 #define KEY_SELECT              0x0004
259 #define KEY_START               0x0008
260 #define KEY_RIGHT               0x0010
261 #define KEY_LEFT                0x0020
262 #define KEY_UP                  0x0040
263 #define KEY_DOWN                0x0080
264 #define KEY_RT                  0x0100
265 #define KEY_LT                  0x0200
266
267 #define KEYCNT_IE               0x4000
268 #define KEYCNT_IAND             0x8000
269
270 /* REG_SOUNDCNT_L bits */
271 #define SCNT_SS_LVOL(x)         ((x) & 7)
272 #define SCNT_SS_RVOL(x)         (((x) & 7) << 4)
273 #define SCNT_SS_VOL(x)          (SCNT_SS_LVOL(x) | SCNT_SS_RVOL(x))
274 #define SCNT_SS1_EN_R           0x0100
275 #define SCNT_SS2_EN_R           0x0200
276 #define SCNT_SS3_EN_R           0x0400
277 #define SCNT_SS4_EN_R           0x0800
278 #define SCNT_SS_EN_R(x)         (SCNT_SS1_EN_R << (x))
279 #define SCNT_SS1_EN_L           0x1000
280 #define SCNT_SS2_EN_L           0x2000
281 #define SCNT_SS3_EN_L           0x4000
282 #define SCNT_SS4_EN_L           0x8000
283 #define SCNT_SS_EN_L(x)         (SCNT_SS1_EN_L << (x))
284 #define SCNT_SS1_EN                     (SCNT_SS1_EN_R | SCNT_SS1_EN_L)
285 #define SCNT_SS2_EN                     (SCNT_SS2_EN_R | SCNT_SS2_EN_L)
286 #define SCNT_SS3_EN                     (SCNT_SS3_EN_R | SCNT_SS3_EN_L)
287 #define SCNT_SS4_EN                     (SCNT_SS4_EN_R | SCNT_SS4_EN_L)
288 #define SCNT_SS_EN(x)           (SCNT_SS_EN_L(x) | SCNT_SS_EN_R(x))
289
290 #define SCNT_SS1                0
291 #define SCNT_SS2                1
292 #define SCNT_SS3                2
293 #define SCNT_SS4                3
294
295 /* REG_SOUNDCNT_X bits */
296 #define SCNT_MASTER_EN          0x0080
297
298 /* REG_SOUNDCNT_H bits */
299 #define SCNT_SS_VOL_QRT         0x0000
300 #define SCNT_SS_VOL_HALF        0x0001
301 #define SCNT_SS_VOL_FULL        0x0002
302 #define SCNT_DSA_VOL_HALF       0
303 #define SCNT_DSA_VOL_FULL       0x0004
304 #define SCNT_DSB_VOL_HALF       0
305 #define SCNT_DSB_VOL_FULL       0x0008
306 #define SCNT_DSA_EN_R           0x0100
307 #define SCNT_DSA_EN_L           0x0200
308 #define SCNT_DSA_TIMER0         0
309 #define SCNT_DSA_TIMER1         0x0400
310 #define SCNT_DSA_CLRFIFO        0x0800
311 #define SCNT_DSB_EN_R           0x1000
312 #define SCNT_DSB_EN_L           0x2000
313 #define SCNT_DSB_TIMER0         0
314 #define SCNT_DSB_TIMER1         0x4000
315 #define SCNT_DSB_CLRFIFO        0x8000
316
317 /* REG_DMAxCNT_H bits */
318 #define DMACNTH_DST_INC         0
319 #define DMACNTH_DST_DEC         0x0020
320 #define DMACNTH_DST_FIXED       0x0040
321 #define DMACNTH_INC_RELOAD      0x0060
322 #define DMACNTH_SRC_INC         0
323 #define DMACNTH_SRC_DEC         0x0080
324 #define DMACNTH_SRC_FIXED       0x0100
325 #define DMACNTH_REPEAT          0x0200
326 #define DMACNTH_16BIT           0
327 #define DMACNTH_32BIT           0x0400
328 #define DMACNTH_VBLANK          0x1000
329 #define DMACNTH_HBLANK          0x2000
330 #define DMACNTH_SOUND           0x3000
331 #define DMACNTH_IEN                     0x4000
332 #define DMACNTH_EN                      0x8000
333
334 #define DMACNT_DST_INC          0
335 #define DMACNT_DST_DEC          0x00200000
336 #define DMACNT_DST_FIXED        0x00400000
337 #define DMACNT_INC_RELOAD       0x00600000
338 #define DMACNT_SRC_INC          0
339 #define DMACNT_SRC_DEC          0x00800000
340 #define DMACNT_SRC_FIXED        0x01000000
341 #define DMACNT_REPEAT           0x02000000
342 #define DMACNT_16BIT            0
343 #define DMACNT_32BIT            0x04000000
344 #define DMACNT_VBLANK           0x10000000
345 #define DMACNT_HBLANK           0x20000000
346 #define DMACNT_SOUND            0x30000000
347 #define DMACNT_IEN                      0x40000000
348 #define DMACNT_EN                       0x80000000
349
350
351 #endif  /* GBAREGS_H_ */