#include "mapper.h"

struct mapper_t
{
	void* mapper_data;
	mapper_funcs_t funcs;
};

void mapper_init(mapper_t** mapper, int* memory, int mapper_type)
{
	mapper_t* pThis = NULL;

	assert(memory);
	assert(mapper_type >= 0 && mapper_type < MAPPER_LIST_END);
	
	(*mapper) = (mapper_t*)malloc(sizeof(mapper_t));
	assert((*mapper));
	pThis = (*mapper);
	
	switch (mapper_type) {
		case MAPPER_DIRECT: {
			mapper_direct_init((mapper_direct_t**)&pThis->mapper_data, memory, &pThis->funcs);
			break;
		}
		
		default: {
			break;
		}
	}
}

void mapper_kill(mapper_t* mapper)
{
	mapper_t* pThis = mapper;
	
	assert(pThis);
	assert(pThis->mapper_data);
	
	pThis->funcs.kill(pThis->mapper_data);
	
	free(pThis->mapper_data);
}

int mapper_read(mapper_t* mapper, int address)
{
	mapper_t* pThis = mapper;
	
	assert(pThis);
	
	return pThis->funcs.read(pThis->mapper_data, address);
}

int mapper_read16(mapper_t* mapper, int address)
{
	mapper_t* pThis = mapper;
	int hi, lo;
	
	assert(pThis);

	hi = pThis->funcs.read(pThis->mapper_data, address);
	lo = pThis->funcs.read(pThis->mapper_data, address + 1);

	return hi | (lo << 8);
}

void mapper_write(mapper_t* mapper, int address, int value)
{
	mapper_t* pThis = mapper;
	
	assert(pThis);
	
	pThis->funcs.write(pThis->mapper_data, address, value);
}