Begin GBA structure

This commit is contained in:
Jeffrey Pfau 2013-04-05 02:17:22 -07:00
parent cd07dee7b1
commit a01fc986a3
4 changed files with 282 additions and 4 deletions

View File

@ -66,7 +66,9 @@ struct ARMMemory {
uint8_t (*loadU8)(struct ARMMemory*, uint32_t address);
};
struct ARMBoard;
struct ARMBoard {
// TODO
};
struct ARMCore {
int32_t gprs[16];

200
src/gba.c Normal file
View File

@ -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;
}

75
src/gba.h Normal file
View File

@ -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

View File

@ -1,8 +1,9 @@
#include "arm.h"
#include "gba.h"
int main(int argc, char** argv) {
struct ARMCore cpu;
ARMInit(&cpu);
struct GBA gba;
GBAInit(&gba);
GBADeinit(&gba);
return 0;
}