all repos — mgba @ 475af6fde27b12dad701ee1cb67ddadf462e0755

mGBA Game Boy Advance Emulator

src/gba.h (view raw)

  1#ifndef GBA_MEMORY_H
  2#define GBA_MEMORY_H
  3
  4#include "arm.h"
  5
  6enum GBAError {
  7	GBA_NO_ERROR = 0,
  8	GBA_OUT_OF_MEMORY = -1
  9};
 10
 11enum GBALogLevel {
 12	GBA_LOG_STUB
 13};
 14
 15enum GBAMemoryRegion {
 16	REGION_BIOS = 0x0,
 17	REGION_WORKING_RAM = 0x2,
 18	REGION_WORKING_IRAM = 0x3,
 19	REGION_IO = 0x4,
 20	REGION_PALETTE_RAM = 0x5,
 21	REGION_VRAM = 0x6,
 22	REGION_OAM = 0x7,
 23	REGION_CART0 = 0x8,
 24	REGION_CART0_EX = 0x9,
 25	REGION_CART1 = 0xA,
 26	REGION_CART1_EX = 0xB,
 27	REGION_CART2 = 0xC,
 28	REGION_CART2_EX = 0xD,
 29	REGION_CART_SRAM = 0xE
 30};
 31
 32enum GBAMemoryBase {
 33	BASE_BIOS = 0x00000000,
 34	BASE_WORKING_RAM = 0x02000000,
 35	BASE_WORKING_IRAM = 0x03000000,
 36	BASE_IO = 0x04000000,
 37	BASE_PALETTE_RAM = 0x05000000,
 38	BASE_VRAM = 0x06000000,
 39	BASE_OAM = 0x07000000,
 40	BASE_CART0 = 0x08000000,
 41	BASE_CART0_EX = 0x09000000,
 42	BASE_CART1 = 0x0A000000,
 43	BASE_CART1_EX = 0x0B000000,
 44	BASE_CART2 = 0x0C000000,
 45	BASE_CART2_EX = 0x0D000000,
 46	BASE_CART_SRAM = 0x0E000000
 47};
 48
 49enum {
 50	SIZE_BIOS = 0x00004000,
 51	SIZE_WORKING_RAM = 0x00040000,
 52	SIZE_WORKING_IRAM = 0x00008000,
 53	SIZE_IO = 0x00000400,
 54	SIZE_PALETTE_RAM = 0x00000400,
 55	SIZE_VRAM = 0x00018000,
 56	SIZE_OAM = 0x00000400,
 57	SIZE_CART0 = 0x02000000,
 58	SIZE_CART1 = 0x02000000,
 59	SIZE_CART2 = 0x02000000,
 60	SIZE_CART_SRAM = 0x00008000,
 61	SIZE_CART_FLASH512 = 0x00010000,
 62	SIZE_CART_FLASH1M = 0x00020000,
 63	SIZE_CART_EEPROM = 0x00002000
 64};
 65
 66enum GBAIORegisters {
 67	REG_DISPCNT = 0x000,
 68	REG_GREENSWP = 0x002,
 69	REG_DISPSTAT = 0x004,
 70	REG_VCOUNT = 0x006,
 71	REG_BG0CNT = 0x008,
 72	REG_BG1CNT = 0x00A,
 73	REG_BG2CNT = 0x00C,
 74	REG_BG3CNT = 0x00E,
 75	REG_BG0HOFS = 0x010,
 76	REG_BG0VOFS = 0x012,
 77	REG_BG1HOFS = 0x014,
 78	REG_BG1VOFS = 0x016,
 79	REG_BG2HOFS = 0x018,
 80	REG_BG2VOFS = 0x01A,
 81	REG_BG3HOFS = 0x01C,
 82	REG_BG3VOFS = 0x01E,
 83	REG_BG2PA = 0x020,
 84	REG_BG2PB = 0x022,
 85	REG_BG2PC = 0x024,
 86	REG_BG2PD = 0x026,
 87	REG_BG2X_LO = 0x028,
 88	REG_BG2X_HI = 0x02A,
 89	REG_BG2Y_LO = 0x02C,
 90	REG_BG2Y_HI = 0x02E,
 91	REG_BG3PA = 0x030,
 92	REG_BG3PB = 0x032,
 93	REG_BG3PC = 0x034,
 94	REG_BG3PD = 0x036,
 95	REG_BG3X_LO = 0x038,
 96	REG_BG3X_HI = 0x03A,
 97	REG_BG3Y_LO = 0x03C,
 98	REG_BG3Y_HI = 0x03E,
 99	REG_WIN0H = 0x040,
100	REG_WIN1H = 0x042,
101	REG_WIN0V = 0x044,
102	REG_WIN1V = 0x046,
103	REG_WININ = 0x048,
104	REG_WINOUT = 0x04A,
105	REG_MOSAIC = 0x04C,
106	REG_BLDCNT = 0x050,
107	REG_BLDALPHA = 0x052,
108	REG_BLDY = 0x054,
109
110	// Sound
111	REG_SOUND1CNT_LO = 0x060,
112	REG_SOUND1CNT_HI = 0x062,
113	REG_SOUND1CNT_X = 0x064,
114	REG_SOUND2CNT_LO = 0x068,
115	REG_SOUND2CNT_HI = 0x06C,
116	REG_SOUND3CNT_LO = 0x070,
117	REG_SOUND3CNT_HI = 0x072,
118	REG_SOUND3CNT_X = 0x074,
119	REG_SOUND4CNT_LO = 0x078,
120	REG_SOUND4CNT_HI = 0x07C,
121	REG_SOUNDCNT_LO = 0x080,
122	REG_SOUNDCNT_HI = 0x082,
123	REG_SOUNDCNT_X = 0x084,
124	REG_SOUNDBIAS = 0x088,
125	REG_WAVE_RAM0_LO = 0x090,
126	REG_WAVE_RAM0_HI = 0x092,
127	REG_WAVE_RAM1_LO = 0x094,
128	REG_WAVE_RAM1_HI = 0x096,
129	REG_WAVE_RAM2_LO = 0x098,
130	REG_WAVE_RAM2_HI = 0x09A,
131	REG_WAVE_RAM3_LO = 0x09C,
132	REG_WAVE_RAM3_HI = 0x09E,
133	REG_FIFO_A_LO = 0x0A0,
134	REG_FIFO_A_HI = 0x0A2,
135	REG_FIFO_B_LO = 0x0A4,
136	REG_FIFO_B_HI = 0x0A6,
137
138	// DMA
139	REG_DMA0SAD_LO = 0x0B0,
140	REG_DMA0SAD_HI = 0x0B2,
141	REG_DMA0DAD_LO = 0x0B4,
142	REG_DMA0DAD_HI = 0x0B6,
143	REG_DMA0CNT_LO = 0x0B8,
144	REG_DMA0CNT_HI = 0x0BA,
145	REG_DMA1SAD_LO = 0x0BC,
146	REG_DMA1SAD_HI = 0x0BE,
147	REG_DMA1DAD_LO = 0x0C0,
148	REG_DMA1DAD_HI = 0x0C2,
149	REG_DMA1CNT_LO = 0x0C4,
150	REG_DMA1CNT_HI = 0x0C6,
151	REG_DMA2SAD_LO = 0x0C8,
152	REG_DMA2SAD_HI = 0x0CA,
153	REG_DMA2DAD_LO = 0x0CC,
154	REG_DMA2DAD_HI = 0x0CE,
155	REG_DMA2CNT_LO = 0x0D0,
156	REG_DMA2CNT_HI = 0x0D2,
157	REG_DMA3SAD_LO = 0x0D4,
158	REG_DMA3SAD_HI = 0x0D6,
159	REG_DMA3DAD_LO = 0x0D8,
160	REG_DMA3DAD_HI = 0x0DA,
161	REG_DMA3CNT_LO = 0x0DC,
162	REG_DMA3CNT_HI = 0x0DE,
163
164	// Timers
165	REG_TM0CNT_LO = 0x100,
166	REG_TM0CNT_HI = 0x102,
167	REG_TM1CNT_LO = 0x104,
168	REG_TM1CNT_HI = 0x106,
169	REG_TM2CNT_LO = 0x108,
170	REG_TM2CNT_HI = 0x10A,
171	REG_TM3CNT_LO = 0x10C,
172	REG_TM3CNT_HI = 0x10E,
173
174	// SIO (note: some of these are repeated)
175	REG_SIODATA32_LO = 0x120,
176	REG_SIOMULTI0 = 0x120,
177	REG_SIODATA32_HI = 0x122,
178	REG_SIOMULTI1 = 0x122,
179	REG_SIOMULTI2 = 0x124,
180	REG_SIOMULTI3 = 0x126,
181	REG_SIOCNT = 0x128,
182	REG_SIOMLT_SEND = 0x12A,
183	REG_SIODATA8 = 0x12A,
184	REG_RCNT = 0x134,
185	REG_JOYCNT = 0x140,
186	REG_JOY_RECV = 0x150,
187	REG_JOY_TRANS = 0x154,
188	REG_JOYSTAT = 0x158,
189
190	// Keypad
191	REG_KEYINPUT = 0x130,
192	REG_KEYCNT = 0x132,
193
194	// Interrupts, etc
195	REG_IE = 0x200,
196	REG_IF = 0x202,
197	REG_WAITCNT = 0x204,
198	REG_IME = 0x208,
199
200	REG_POSTFLG = 0x300,
201	REG_HALTCNT = 0x301
202};
203
204enum {
205	SP_BASE_SYSTEM = 0x03FFFF00,
206	SP_BASE_IRQ = 0x03FFFFA0,
207	SP_BASE_SUPERVISOR = 0x03FFFFE0
208};
209
210enum {
211	OFFSET_MASK = 0x00FFFFFF
212};
213
214struct GBAMemory {
215	struct ARMMemory d;
216	struct GBA* p;
217
218	uint32_t* bios;
219	uint32_t* wram;
220	uint32_t* iwram;
221	uint32_t* rom;
222	uint16_t io[SIZE_IO >> 1];
223};
224
225struct GBABoard {
226	struct ARMBoard d;
227	struct GBA* p;
228};
229
230struct GBA {
231	struct ARMCore cpu;
232	struct GBABoard board;
233	struct GBAMemory memory;
234
235	struct ARMDebugger* debugger;
236
237	enum GBAError errno;
238	const char* errstr;
239};
240
241void GBAInit(struct GBA* gba);
242void GBADeinit(struct GBA* gba);
243
244void GBAMemoryInit(struct GBAMemory* memory);
245void GBAMemoryDeinit(struct GBAMemory* memory);
246
247void GBABoardInit(struct GBABoard* board);
248void GBABoardReset(struct ARMBoard* board);
249
250void GBAAttachDebugger(struct GBA* gba, struct ARMDebugger* debugger);
251
252void GBALoadROM(struct GBA* gba, int fd);
253
254#endif