mirror of https://github.com/mgba-emu/mgba.git
Begin GBA structure
This commit is contained in:
parent
cd07dee7b1
commit
a01fc986a3
|
@ -66,7 +66,9 @@ struct ARMMemory {
|
||||||
uint8_t (*loadU8)(struct ARMMemory*, uint32_t address);
|
uint8_t (*loadU8)(struct ARMMemory*, uint32_t address);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ARMBoard;
|
struct ARMBoard {
|
||||||
|
// TODO
|
||||||
|
};
|
||||||
|
|
||||||
struct ARMCore {
|
struct ARMCore {
|
||||||
int32_t gprs[16];
|
int32_t gprs[16];
|
||||||
|
|
|
@ -0,0 +1,200 @@
|
||||||
|
#include "gba.h"
|
||||||
|
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
void GBAInit(struct GBA* gba) {
|
||||||
|
ARMInit(&gba->cpu);
|
||||||
|
GBAMemoryInit(&gba->memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBADeinit(struct GBA* gba) {
|
||||||
|
GBAMemoryDeinit(&gba->memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAMemoryInit(struct GBAMemory* memory) {
|
||||||
|
memory->d.load32 = GBALoad32;
|
||||||
|
memory->d.load16 = GBALoad16;
|
||||||
|
memory->d.loadU16 = GBALoadU16;
|
||||||
|
memory->d.load8 = GBALoad8;
|
||||||
|
memory->d.loadU8 = GBALoadU8;
|
||||||
|
|
||||||
|
memory->bios = 0;
|
||||||
|
memory->wram = mmap(0, SIZE_WORKING_RAM, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
|
memory->iwram = mmap(0, SIZE_WORKING_IRAM, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
|
memory->rom = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAMemoryDeinit(struct GBAMemory* memory) {
|
||||||
|
munmap(memory->wram, SIZE_WORKING_RAM);
|
||||||
|
munmap(memory->iwram, SIZE_WORKING_IRAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t GBALoad32(struct ARMMemory* memory, uint32_t address) {
|
||||||
|
struct GBAMemory* gbaMemory = (struct GBAMemory*) memory;
|
||||||
|
|
||||||
|
switch (address & OFFSET_MASK) {
|
||||||
|
case REGION_BIOS:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_IRAM:
|
||||||
|
break;
|
||||||
|
case REGION_IO:
|
||||||
|
break;
|
||||||
|
case REGION_PALETTE_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_VRAM:
|
||||||
|
break;
|
||||||
|
case REGION_OAM:
|
||||||
|
break;
|
||||||
|
case REGION_CART0:
|
||||||
|
case REGION_CART0_EX:
|
||||||
|
case REGION_CART1:
|
||||||
|
case REGION_CART1_EX:
|
||||||
|
case REGION_CART2:
|
||||||
|
case REGION_CART2_EX:
|
||||||
|
break;
|
||||||
|
case REGION_CART_SRAM:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t GBALoad16(struct ARMMemory* memory, uint32_t address) {
|
||||||
|
struct GBAMemory* gbaMemory = (struct GBAMemory*) memory;
|
||||||
|
|
||||||
|
switch (address & OFFSET_MASK) {
|
||||||
|
case REGION_BIOS:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_IRAM:
|
||||||
|
break;
|
||||||
|
case REGION_IO:
|
||||||
|
break;
|
||||||
|
case REGION_PALETTE_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_VRAM:
|
||||||
|
break;
|
||||||
|
case REGION_OAM:
|
||||||
|
break;
|
||||||
|
case REGION_CART0:
|
||||||
|
case REGION_CART0_EX:
|
||||||
|
case REGION_CART1:
|
||||||
|
case REGION_CART1_EX:
|
||||||
|
case REGION_CART2:
|
||||||
|
case REGION_CART2_EX:
|
||||||
|
break;
|
||||||
|
case REGION_CART_SRAM:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t GBALoadU16(struct ARMMemory* memory, uint32_t address) {
|
||||||
|
struct GBAMemory* gbaMemory = (struct GBAMemory*) memory;
|
||||||
|
|
||||||
|
switch (address & OFFSET_MASK) {
|
||||||
|
case REGION_BIOS:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_IRAM:
|
||||||
|
break;
|
||||||
|
case REGION_IO:
|
||||||
|
break;
|
||||||
|
case REGION_PALETTE_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_VRAM:
|
||||||
|
break;
|
||||||
|
case REGION_OAM:
|
||||||
|
break;
|
||||||
|
case REGION_CART0:
|
||||||
|
case REGION_CART0_EX:
|
||||||
|
case REGION_CART1:
|
||||||
|
case REGION_CART1_EX:
|
||||||
|
case REGION_CART2:
|
||||||
|
case REGION_CART2_EX:
|
||||||
|
break;
|
||||||
|
case REGION_CART_SRAM:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t GBALoad8(struct ARMMemory* memory, uint32_t address) {
|
||||||
|
struct GBAMemory* gbaMemory = (struct GBAMemory*) memory;
|
||||||
|
|
||||||
|
switch (address & OFFSET_MASK) {
|
||||||
|
case REGION_BIOS:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_IRAM:
|
||||||
|
break;
|
||||||
|
case REGION_IO:
|
||||||
|
break;
|
||||||
|
case REGION_PALETTE_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_VRAM:
|
||||||
|
break;
|
||||||
|
case REGION_OAM:
|
||||||
|
break;
|
||||||
|
case REGION_CART0:
|
||||||
|
case REGION_CART0_EX:
|
||||||
|
case REGION_CART1:
|
||||||
|
case REGION_CART1_EX:
|
||||||
|
case REGION_CART2:
|
||||||
|
case REGION_CART2_EX:
|
||||||
|
break;
|
||||||
|
case REGION_CART_SRAM:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t GBALoadU8(struct ARMMemory* memory, uint32_t address) {
|
||||||
|
struct GBAMemory* gbaMemory = (struct GBAMemory*) memory;
|
||||||
|
|
||||||
|
switch (address & OFFSET_MASK) {
|
||||||
|
case REGION_BIOS:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_WORKING_IRAM:
|
||||||
|
break;
|
||||||
|
case REGION_IO:
|
||||||
|
break;
|
||||||
|
case REGION_PALETTE_RAM:
|
||||||
|
break;
|
||||||
|
case REGION_VRAM:
|
||||||
|
break;
|
||||||
|
case REGION_OAM:
|
||||||
|
break;
|
||||||
|
case REGION_CART0:
|
||||||
|
case REGION_CART0_EX:
|
||||||
|
case REGION_CART1:
|
||||||
|
case REGION_CART1_EX:
|
||||||
|
case REGION_CART2:
|
||||||
|
case REGION_CART2_EX:
|
||||||
|
break;
|
||||||
|
case REGION_CART_SRAM:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
#ifndef GBA_MEMORY_H
|
||||||
|
#define GBA_MEMORY_H
|
||||||
|
|
||||||
|
#include "arm.h"
|
||||||
|
|
||||||
|
enum GBAMemoryRegion {
|
||||||
|
REGION_BIOS = 0x0,
|
||||||
|
REGION_WORKING_RAM = 0x2,
|
||||||
|
REGION_WORKING_IRAM = 0x3,
|
||||||
|
REGION_IO = 0x4,
|
||||||
|
REGION_PALETTE_RAM = 0x5,
|
||||||
|
REGION_VRAM = 0x6,
|
||||||
|
REGION_OAM = 0x7,
|
||||||
|
REGION_CART0 = 0x8,
|
||||||
|
REGION_CART0_EX = 0x9,
|
||||||
|
REGION_CART1 = 0xA,
|
||||||
|
REGION_CART1_EX = 0xB,
|
||||||
|
REGION_CART2 = 0xC,
|
||||||
|
REGION_CART2_EX = 0xD,
|
||||||
|
REGION_CART_SRAM = 0xE
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SIZE_BIOS = 0x00004000,
|
||||||
|
SIZE_WORKING_RAM = 0x00040000,
|
||||||
|
SIZE_WORKING_IRAM = 0x00008000,
|
||||||
|
SIZE_IO = 0x00000400,
|
||||||
|
SIZE_PALETTE_RAM = 0x00000400,
|
||||||
|
SIZE_VRAM = 0x00018000,
|
||||||
|
SIZE_OAM = 0x00000400,
|
||||||
|
SIZE_CART0 = 0x02000000,
|
||||||
|
SIZE_CART1 = 0x02000000,
|
||||||
|
SIZE_CART2 = 0x02000000,
|
||||||
|
SIZE_CART_SRAM = 0x00008000,
|
||||||
|
SIZE_CART_FLASH512 = 0x00010000,
|
||||||
|
SIZE_CART_FLASH1M = 0x00020000,
|
||||||
|
SIZE_CART_EEPROM = 0x00002000
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
OFFSET_MASK = 0x00FFFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GBAMemory {
|
||||||
|
struct ARMMemory d;
|
||||||
|
|
||||||
|
int32_t* bios;
|
||||||
|
int32_t* wram;
|
||||||
|
int32_t* iwram;
|
||||||
|
int32_t* rom;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GBABoard {
|
||||||
|
struct ARMBoard board;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GBA {
|
||||||
|
struct ARMCore cpu;
|
||||||
|
struct GBABoard board;
|
||||||
|
struct GBAMemory memory;
|
||||||
|
};
|
||||||
|
|
||||||
|
void GBAInit(struct GBA* gba);
|
||||||
|
void GBADeinit(struct GBA* gba);
|
||||||
|
|
||||||
|
void GBAMemoryInit(struct GBAMemory* memory);
|
||||||
|
void GBAMemoryDeinit(struct GBAMemory* memory);
|
||||||
|
|
||||||
|
int32_t GBALoad32(struct ARMMemory* memory, uint32_t address);
|
||||||
|
int16_t GBALoad16(struct ARMMemory* memory, uint32_t address);
|
||||||
|
uint16_t GBALoadU16(struct ARMMemory* memory, uint32_t address);
|
||||||
|
int8_t GBALoad8(struct ARMMemory* memory, uint32_t address);
|
||||||
|
uint8_t GBALoadU8(struct ARMMemory* memory, uint32_t address);
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,8 +1,9 @@
|
||||||
#include "arm.h"
|
#include "gba.h"
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
struct ARMCore cpu;
|
struct GBA gba;
|
||||||
ARMInit(&cpu);
|
GBAInit(&gba);
|
||||||
|
GBADeinit(&gba);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Loading…
Reference in New Issue