#ifndef __MAPPER_H__
#define __MAPPER_H__

#include 
#include 
#include 

typedef struct mapper_t mapper_t;

typedef struct mapper_funcs_t
{
	int (*read)(void*, int);
	void (*write)(void*, int, int);
	void (*kill)(void*);
} mapper_funcs_t;

#define MAPPER_DIRECT 0
#define MAPPER_LIST_END 1

#include "mapper_direct.h"

/* mapper_init
 * Initializes the mapper_t struct.
 * [in/out] mapper_t** mapper - The return pointer. Expects NULL.
 * [in] int* memory - The memory buffer to use.
 * [in] int mapper - The mapper to use.
 */
void mapper_init(mapper_t** mapper, int* memory, int mapper_type);

/* mapper_kill
 * Kills the mapper_t struct.
 * [in] mapper_t* maper - The memory mapper.
 */
void mapper_kill(mapper_t* mapper);

/* mapper_read
 * Reads 1 byte from memory.
 * [in] mapper_t* mapper - The memory mapper.
 * [in] int address - The 16bit address to read from.
 * Returns: The byte at the requested address.
 */
int mapper_read(mapper_t* mapper, int address);

/* mapper_read16
 * Reads 2 bytes from memory.
 * [in] mapper_t* mapper - The memory mapper.
 * [in] int address - The 16bit address to read from.
 * Returns: The bytes at the requested address.
 */
int mapper_read16(mapper_t* mapper, int address);

/* mapper_write
 * Writes 1 byte from memory.
 * [in] mapper_t* mapper - The memory mapper.
 * [in] int address - The 16bit address to write to.
 * [in] int value - The byte to write.
 */
void mapper_write(mapper_t* mapper, int address, int value);

#endif