all repos — mgba @ 2359a4e88689fd23f5cf2ef57f7aa38055158b52

mGBA Game Boy Advance Emulator

include/mgba/internal/ds/io.h (view raw)

  1/* Copyright (c) 2013-2016 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#ifndef DS_IO_H
  7#define DS_IO_H
  8
  9#include <mgba-util/common.h>
 10
 11CXX_GUARD_START
 12
 13#include <mgba/core/log.h>
 14
 15enum DS7IORegisters {
 16	// Video
 17	DS7_REG_DISPSTAT = 0x004,
 18	DS7_REG_VCOUNT = 0x006,
 19
 20	// DMA
 21	DS7_REG_DISPSTAT_REG_DMA0SAD_LO = 0x0B0,
 22	DS7_REG_DISPSTAT_REG_DMA0SAD_HI = 0x0B2,
 23	DS7_REG_DISPSTAT_REG_DMA0DAD_LO = 0x0B4,
 24	DS7_REG_DISPSTAT_REG_DMA0DAD_HI = 0x0B6,
 25	DS7_REG_DISPSTAT_REG_DMA0CNT_LO = 0x0B8,
 26	DS7_REG_DISPSTAT_REG_DMA0CNT_HI = 0x0BA,
 27	DS7_REG_DISPSTAT_REG_DMA1SAD_LO = 0x0BC,
 28	DS7_REG_DISPSTAT_REG_DMA1SAD_HI = 0x0BE,
 29	DS7_REG_DISPSTAT_REG_DMA1DAD_LO = 0x0C0,
 30	DS7_REG_DISPSTAT_REG_DMA1DAD_HI = 0x0C2,
 31	DS7_REG_DISPSTAT_REG_DMA1CNT_LO = 0x0C4,
 32	DS7_REG_DISPSTAT_REG_DMA1CNT_HI = 0x0C6,
 33	DS7_REG_DISPSTAT_REG_DMA2SAD_LO = 0x0C8,
 34	DS7_REG_DISPSTAT_REG_DMA2SAD_HI = 0x0CA,
 35	DS7_REG_DISPSTAT_REG_DMA2DAD_LO = 0x0CC,
 36	DS7_REG_DISPSTAT_REG_DMA2DAD_HI = 0x0CE,
 37	DS7_REG_DISPSTAT_REG_DMA2CNT_LO = 0x0D0,
 38	DS7_REG_DISPSTAT_REG_DMA2CNT_HI = 0x0D2,
 39	DS7_REG_DISPSTAT_REG_DMA3SAD_LO = 0x0D4,
 40	DS7_REG_DISPSTAT_REG_DMA3SAD_HI = 0x0D6,
 41	DS7_REG_DISPSTAT_REG_DMA3DAD_LO = 0x0D8,
 42	DS7_REG_DISPSTAT_REG_DMA3DAD_HI = 0x0DA,
 43	DS7_REG_DISPSTAT_REG_DMA3CNT_LO = 0x0DC,
 44	DS7_REG_DISPSTAT_REG_DMA3CNT_HI = 0x0DE,
 45
 46	// Timers
 47	DS7_REG_TM0CNT_LO = 0x100,
 48	DS7_REG_TM0CNT_HI = 0x102,
 49	DS7_REG_TM1CNT_LO = 0x104,
 50	DS7_REG_TM1CNT_HI = 0x106,
 51	DS7_REG_TM2CNT_LO = 0x108,
 52	DS7_REG_TM2CNT_HI = 0x10A,
 53	DS7_REG_TM3CNT_LO = 0x10C,
 54	DS7_REG_TM3CNT_HI = 0x10E,
 55
 56	// Keypad
 57	DS7_REG_KEYINPUT = 0x130,
 58	DS7_REG_KEYCNT = 0x132,
 59	DS7_REG_EXTKEYIN = 0x136,
 60	DS7_REG_RTC = 0x138,
 61
 62	// IPC
 63	DS7_REG_IPCSYNC = 0x180,
 64	DS7_REG_IPCFIFOCNT = 0x182,
 65	DS7_REG_IPCFIFOSEND_LO = 0x184,
 66	DS7_REG_IPCFIFOSEND_HI = 0x186,
 67	DS7_REG_IPCFIFORECV_LO = 0x100000,
 68	DS7_REG_IPCFIFORECV_HI = 0x100002,
 69
 70	// Game card
 71	DS7_REG_AUXSPICNT = 0x1A0,
 72	DS7_REG_AUXSPIDATA = 0x1A2,
 73	DS7_REG_SLOT1CNT_LO = 0x1A4,
 74	DS7_REG_SLOT1CNT_HI = 0x1A6,
 75	DS7_REG_SLOT1CMD_0 = 0x1A8,
 76	DS7_REG_SLOT1CMD_1 = 0x1A9,
 77	DS7_REG_SLOT1CMD_2 = 0x1AA,
 78	DS7_REG_SLOT1CMD_3 = 0x1AB,
 79	DS7_REG_SLOT1CMD_4 = 0x1AC,
 80	DS7_REG_SLOT1CMD_5 = 0x1AD,
 81	DS7_REG_SLOT1CMD_6 = 0x1AE,
 82	DS7_REG_SLOT1CMD_7 = 0x1AF,
 83	DS7_REG_SLOT1DATA_0 = 0x100010,
 84	DS7_REG_SLOT1DATA_1 = 0x100011,
 85	DS7_REG_SLOT1DATA_2 = 0x100012,
 86	DS7_REG_SLOT1DATA_3 = 0x100013,
 87
 88	// Interrupts, etc
 89	DS7_REG_EXMEMSTAT = 0x204,
 90	DS7_REG_IME = 0x208,
 91	DS7_REG_IE_LO = 0x210,
 92	DS7_REG_IE_HI = 0x212,
 93	DS7_REG_IF_LO = 0x214,
 94	DS7_REG_IF_HI = 0x216,
 95
 96	// Memory control
 97	DS7_REG_VRAMSTAT = 0x240,
 98	DS7_REG_WRAMSTAT = 0x241,
 99	DS7_REG_POSTFLG = 0x300,
100	DS7_REG_HALTCNT = 0x301,
101	DS7_REG_POWCNT2 = 0x304,
102	DS7_REG_BIOSPROT_LO = 0x308,
103	DS7_REG_BIOSPROT_HI = 0x30A,
104
105	DS7_REG_MAX = 0x51E,
106};
107
108enum DS9IORegisters {
109	// Video
110	DS9_REG_A_DISPCNT_LO = 0x000,
111	DS9_REG_A_DISPCNT_HI = 0x002,
112	DS9_REG_DISPSTAT = 0x004,
113	DS9_REG_VCOUNT = 0x006,
114	DS9_REG_A_BG0CNT = 0x008,
115	DS9_REG_A_BG1CNT = 0x00A,
116	DS9_REG_A_BG2CNT = 0x00C,
117	DS9_REG_A_BG3CNT = 0x00E,
118	DS9_REG_A_BG0HOFS = 0x010,
119	DS9_REG_A_BG0VOFS = 0x012,
120	DS9_REG_A_BG1HOFS = 0x014,
121	DS9_REG_A_BG1VOFS = 0x016,
122	DS9_REG_A_BG2HOFS = 0x018,
123	DS9_REG_A_BG2VOFS = 0x01A,
124	DS9_REG_A_BG3HOFS = 0x01C,
125	DS9_REG_A_BG3VOFS = 0x01E,
126	DS9_REG_A_BG2PA = 0x020,
127	DS9_REG_A_BG2PB = 0x022,
128	DS9_REG_A_BG2PC = 0x024,
129	DS9_REG_A_BG2PD = 0x026,
130	DS9_REG_A_BG2X_LO = 0x028,
131	DS9_REG_A_BG2X_HI = 0x02A,
132	DS9_REG_A_BG2Y_LO = 0x02C,
133	DS9_REG_A_BG2Y_HI = 0x02E,
134	DS9_REG_A_BG3PA = 0x030,
135	DS9_REG_A_BG3PB = 0x032,
136	DS9_REG_A_BG3PC = 0x034,
137	DS9_REG_A_BG3PD = 0x036,
138	DS9_REG_A_BG3X_LO = 0x038,
139	DS9_REG_A_BG3X_HI = 0x03A,
140	DS9_REG_A_BG3Y_LO = 0x03C,
141	DS9_REG_A_BG3Y_HI = 0x03E,
142	DS9_REG_A_WIN0H = 0x040,
143	DS9_REG_A_WIN1H = 0x042,
144	DS9_REG_A_WIN0V = 0x044,
145	DS9_REG_A_WIN1V = 0x046,
146	DS9_REG_A_WININ = 0x048,
147	DS9_REG_A_WINOUT = 0x04A,
148	DS9_REG_A_MOSAIC = 0x04C,
149	DS9_REG_A_BLDCNT = 0x050,
150	DS9_REG_A_BLDALPHA = 0x052,
151	DS9_REG_A_BLDY = 0x054,
152	DS9_REG_DISP3DCNT = 0x060,
153	DS9_REG_DISPCAPCNT_LO = 0x064,
154	DS9_REG_DISPCAPCNT_HI = 0x066,
155	DS9_REG_DISP_MMEM_FIFO_LO = 0x068,
156	DS9_REG_DISP_MMEM_FIFO_HI = 0x06A,
157	DS9_REG_A_MASTER_BRIGHT = 0x06C,
158
159	DS9_REG_B_DISPCNT_LO = 0x1000,
160	DS9_REG_B_DISPCNT_HI = 0x1002,
161	DS9_REG_B_BG0CNT = 0x1008,
162	DS9_REG_B_BG1CNT = 0x100A,
163	DS9_REG_B_BG2CNT = 0x100C,
164	DS9_REG_B_BG3CNT = 0x100E,
165	DS9_REG_B_BG0HOFS = 0x1010,
166	DS9_REG_B_BG0VOFS = 0x1012,
167	DS9_REG_B_BG1HOFS = 0x1014,
168	DS9_REG_B_BG1VOFS = 0x1016,
169	DS9_REG_B_BG2HOFS = 0x1018,
170	DS9_REG_B_BG2VOFS = 0x101A,
171	DS9_REG_B_BG3HOFS = 0x101C,
172	DS9_REG_B_BG3VOFS = 0x101E,
173	DS9_REG_B_BG2PA = 0x1020,
174	DS9_REG_B_BG2PB = 0x1022,
175	DS9_REG_B_BG2PC = 0x1024,
176	DS9_REG_B_BG2PD = 0x1026,
177	DS9_REG_B_BG2X_LO = 0x1028,
178	DS9_REG_B_BG2X_HI = 0x102A,
179	DS9_REG_B_BG2Y_LO = 0x102C,
180	DS9_REG_B_BG2Y_HI = 0x102E,
181	DS9_REG_B_BG3PA = 0x1030,
182	DS9_REG_B_BG3PB = 0x1032,
183	DS9_REG_B_BG3PC = 0x1034,
184	DS9_REG_B_BG3PD = 0x1036,
185	DS9_REG_B_BG3X_LO = 0x1038,
186	DS9_REG_B_BG3X_HI = 0x103A,
187	DS9_REG_B_BG3Y_LO = 0x103C,
188	DS9_REG_B_BG3Y_HI = 0x103E,
189	DS9_REG_B_WIN0H = 0x1040,
190	DS9_REG_B_WIN1H = 0x1042,
191	DS9_REG_B_WIN0V = 0x1044,
192	DS9_REG_B_WIN1V = 0x1046,
193	DS9_REG_B_WININ = 0x1048,
194	DS9_REG_B_WINOUT = 0x104A,
195	DS9_REG_B_MOSAIC = 0x104C,
196	DS9_REG_B_BLDCNT = 0x1050,
197	DS9_REG_B_BLDALPHA = 0x1052,
198	DS9_REG_B_BLDY = 0x1054,
199	DS9_REG_B_MASTER_BRIGHT = 0x106C,
200
201	// DMA
202	DS9_REG_DMA0SAD_LO = 0x0B0,
203	DS9_REG_DMA0SAD_HI = 0x0B2,
204	DS9_REG_DMA0DAD_LO = 0x0B4,
205	DS9_REG_DMA0DAD_HI = 0x0B6,
206	DS9_REG_DMA0CNT_LO = 0x0B8,
207	DS9_REG_DMA0CNT_HI = 0x0BA,
208	DS9_REG_DMA1SAD_LO = 0x0BC,
209	DS9_REG_DMA1SAD_HI = 0x0BE,
210	DS9_REG_DMA1DAD_LO = 0x0C0,
211	DS9_REG_DMA1DAD_HI = 0x0C2,
212	DS9_REG_DMA1CNT_LO = 0x0C4,
213	DS9_REG_DMA1CNT_HI = 0x0C6,
214	DS9_REG_DMA2SAD_LO = 0x0C8,
215	DS9_REG_DMA2SAD_HI = 0x0CA,
216	DS9_REG_DMA2DAD_LO = 0x0CC,
217	DS9_REG_DMA2DAD_HI = 0x0CE,
218	DS9_REG_DMA2CNT_LO = 0x0D0,
219	DS9_REG_DMA2CNT_HI = 0x0D2,
220	DS9_REG_DMA3SAD_LO = 0x0D4,
221	DS9_REG_DMA3SAD_HI = 0x0D6,
222	DS9_REG_DMA3DAD_LO = 0x0D8,
223	DS9_REG_DMA3DAD_HI = 0x0DA,
224	DS9_REG_DMA3CNT_LO = 0x0DC,
225	DS9_REG_DMA3CNT_HI = 0x0DE,
226	DS9_REG_DMA0FILL_LO = 0x0E0,
227	DS9_REG_DMA0FILL_HI = 0x0E2,
228	DS9_REG_DMA1FILL_LO = 0x0E4,
229	DS9_REG_DMA1FILL_HI = 0x0E6,
230	DS9_REG_DMA2FILL_LO = 0x0E8,
231	DS9_REG_DMA2FILL_HI = 0x0EA,
232	DS9_REG_DMA3FILL_LO = 0x0EC,
233	DS9_REG_DMA3FILL_HI = 0x0EE,
234
235	// Timers
236	DS9_REG_TM0CNT_LO = 0x100,
237	DS9_REG_TM0CNT_HI = 0x102,
238	DS9_REG_TM1CNT_LO = 0x104,
239	DS9_REG_TM1CNT_HI = 0x106,
240	DS9_REG_TM2CNT_LO = 0x108,
241	DS9_REG_TM2CNT_HI = 0x10A,
242	DS9_REG_TM3CNT_LO = 0x10C,
243	DS9_REG_TM3CNT_HI = 0x10E,
244
245	// Keypad
246	DS9_REG_KEYINPUT = 0x130,
247	DS9_REG_KEYCNT = 0x132,
248
249	// IPC
250	DS9_REG_IPCSYNC = 0x180,
251	DS9_REG_IPCFIFOCNT = 0x182,
252	DS9_REG_IPCFIFOSEND_LO = 0x184,
253	DS9_REG_IPCFIFOSEND_HI = 0x186,
254	DS9_REG_IPCFIFORECV_LO = 0x100000,
255	DS9_REG_IPCFIFORECV_HI = 0x100002,
256
257	// Game card
258	DS9_REG_AUXSPICNT = 0x1A0,
259	DS9_REG_AUXSPIDATA = 0x1A2,
260	DS9_REG_SLOT1CNT_LO = 0x1A4,
261	DS9_REG_SLOT1CNT_HI = 0x1A6,
262	DS9_REG_SLOT1CMD_0 = 0x1A8,
263	DS9_REG_SLOT1CMD_1 = 0x1A9,
264	DS9_REG_SLOT1CMD_2 = 0x1AA,
265	DS9_REG_SLOT1CMD_3 = 0x1AB,
266	DS9_REG_SLOT1CMD_4 = 0x1AC,
267	DS9_REG_SLOT1CMD_5 = 0x1AD,
268	DS9_REG_SLOT1CMD_6 = 0x1AE,
269	DS9_REG_SLOT1CMD_7 = 0x1AF,
270	DS9_REG_SLOT1DATA_0 = 0x100010,
271	DS9_REG_SLOT1DATA_1 = 0x100011,
272	DS9_REG_SLOT1DATA_2 = 0x100012,
273	DS9_REG_SLOT1DATA_3 = 0x100013,
274
275	// Interrupts, etc
276	DS9_REG_EXMEMCNT = 0x204,
277	DS9_REG_IME = 0x208,
278	DS9_REG_IE_LO = 0x210,
279	DS9_REG_IE_HI = 0x212,
280	DS9_REG_IF_LO = 0x214,
281	DS9_REG_IF_HI = 0x216,
282
283	// Memory control
284	DS9_REG_VRAMCNT_A = 0x240,
285	DS9_REG_VRAMCNT_B = 0x241,
286	DS9_REG_VRAMCNT_C = 0x242,
287	DS9_REG_VRAMCNT_D = 0x243,
288	DS9_REG_VRAMCNT_E = 0x244,
289	DS9_REG_VRAMCNT_F = 0x245,
290	DS9_REG_VRAMCNT_G = 0x246,
291	DS9_REG_WRAMCNT = 0x247,
292	DS9_REG_VRAMCNT_H = 0x248,
293	DS9_REG_VRAMCNT_I = 0x249,
294
295	// Math
296	DS9_REG_DIVCNT = 0x280,
297	DS9_REG_DIV_NUMER_0 = 0x290,
298	DS9_REG_DIV_NUMER_1 = 0x292,
299	DS9_REG_DIV_NUMER_2 = 0x294,
300	DS9_REG_DIV_NUMER_3 = 0x296,
301	DS9_REG_DIV_DENOM_0 = 0x298,
302	DS9_REG_DIV_DENOM_1 = 0x29A,
303	DS9_REG_DIV_DENOM_2 = 0x29C,
304	DS9_REG_DIV_DENOM_3 = 0x29E,
305	DS9_REG_DIV_RESULT_0 = 0x2A0,
306	DS9_REG_DIV_RESULT_1 = 0x2A2,
307	DS9_REG_DIV_RESULT_2 = 0x2A4,
308	DS9_REG_DIV_RESULT_3 = 0x2A6,
309	DS9_REG_DIVREM_RESULT_0 = 0x2A8,
310	DS9_REG_DIVREM_RESULT_1 = 0x2AA,
311	DS9_REG_DIVREM_RESULT_2 = 0x2AC,
312	DS9_REG_DIVREM_RESULT_3 = 0x2AE,
313	DS9_REG_SQRTCNT = 0x2B0,
314	DS9_REG_SQRT_RESULT_LO = 0x2B4,
315	DS9_REG_SQRT_RESULT_HI = 0x2B6,
316	DS9_REG_SQRT_PARAM_0 = 0x2B8,
317	DS9_REG_SQRT_PARAM_1 = 0x2BA,
318	DS9_REG_SQRT_PARAM_2 = 0x2BC,
319	DS9_REG_SQRT_PARAM_3 = 0x2BE,
320
321	DS9_REG_MAX = 0x106E,
322
323	DS9_REG_POSTFLG = 0x300,
324	DS9_REG_POWCNT1 = 0x304,
325};
326
327mLOG_DECLARE_CATEGORY(DS_IO);
328
329extern const char* const DS7IORegisterNames[];
330extern const char* const DS9IORegisterNames[];
331
332struct DS;
333void DS7IOInit(struct DS* ds);
334void DS7IOWrite(struct DS* ds, uint32_t address, uint16_t value);
335void DS7IOWrite8(struct DS* ds, uint32_t address, uint8_t value);
336void DS7IOWrite32(struct DS* ds, uint32_t address, uint32_t value);
337uint16_t DS7IORead(struct DS* ds, uint32_t address);
338
339void DS9IOInit(struct DS* ds);
340void DS9IOWrite(struct DS* ds, uint32_t address, uint16_t value);
341void DS9IOWrite8(struct DS* ds, uint32_t address, uint8_t value);
342void DS9IOWrite32(struct DS* ds, uint32_t address, uint32_t value);
343uint16_t DS9IORead(struct DS* ds, uint32_t address);
344
345CXX_GUARD_END
346
347#endif