#include "mapper_direct.h" struct mapper_direct_t { int* memory; }; void mapper_direct_init(mapper_direct_t** mapper_direct, int* memory, mapper_funcs_t* mapper_funcs) { mapper_direct_t* pThis = NULL; (*mapper_direct) = (mapper_direct_t*)malloc(sizeof(mapper_direct_t)); assert((*mapper_direct)); pThis = (*mapper_direct); pThis->memory = memory; mapper_funcs->read = &mapper_direct_read; mapper_funcs->write = &mapper_direct_write; mapper_funcs->kill = &mapper_direct_kill; } void mapper_direct_kill(void* mapper_data) { mapper_direct_t* pThis = (mapper_direct_t*)mapper_data; assert(pThis); free(pThis); } int mapper_direct_read(void* mapper_data, int address) { mapper_direct_t* pThis = (mapper_direct_t*)mapper_data; assert(pThis); address &= 0xFFFF; if (address > 0x4017) { /* SaveRAM */ return pThis->memory[address]; } else if (address >= 0x2000) { /* TODO: IO Ports */ return 0x0; } else { /* RAM (mirrored) */ return pThis->memory[address & 0x7FF]; } } void mapper_direct_write(void* mapper_data, int address, int value) { mapper_direct_t* pThis = (mapper_direct_t*)mapper_data; assert(pThis); if (address > 0x4017) { pThis->memory[address] = value; if (address >= 0x6000 && address < 0x8000) { /* TODO: Write to SaveRAM, store in file. */ } } else if (address > 0x2007 && address < 0x4000) { /* TODO: Write to registers, offset */ } else if (address < 0x2000) { /* RAM (mirrored) */ pThis->memory[address & 0x7FF] = value; } else { /* TODO: Write to registers */ } }