
#ifndef _SYSTEM_H_
#define _SYSTEM_H_

#define APP_NAME            "SMS Plus"
#define APP_VERSION         "1.2"

#define PALETTE_SIZE        0x20

/* Mask for removing unused pixel data */
#define PIXEL_MASK          0x1F

/* These can be used for 'input.pad[]' */
#define INPUT_UP            0x00000001
#define INPUT_DOWN          0x00000002
#define INPUT_LEFT          0x00000004
#define INPUT_RIGHT         0x00000008
#define INPUT_BUTTON2       0x00000010
#define INPUT_BUTTON1       0x00000020

/* These can be used for 'input.system' */
#define INPUT_START         0x00000001  /* Game Gear only */    
#define INPUT_PAUSE         0x00000002  /* Master System only */
#define INPUT_RESET         0x00000004  /* Master System only */

enum {
    SRAM_SAVE   = 0,
    SRAM_LOAD   = 1
};


/* User input structure */
typedef struct
{
    uint32 pad[2];
    uint8 analog[2];
    uint32 system;
} input_t;

/* Game image structure */
typedef struct
{
    uint8 *rom;
    uint8 pages;
    uint32 crc;
    uint32 sram_crc;
    int mapper;
    uint8 sram[0x8000];
    uint8 fcr[4];
} cart_t;

/* Bitmap structure */
typedef struct
{
    unsigned char *data;
    int width;
    int height;
    int pitch;
    int depth;
    int granularity;
    struct {
        int x, y, w, h;
        int ox, oy, ow, oh;
        int changed;
    } viewport;        
    struct
    {
        uint8 color[PALETTE_SIZE][3];
        uint8 dirty[PALETTE_SIZE];
        uint8 update;
    }pal;
} bitmap_t;

/* Global variables */
extern bitmap_t bitmap;     /* Display bitmap */
extern cart_t cart;         /* Game cartridge data */
extern input_t input;       /* Controller input */

/* Function prototypes */
void system_frame(int skip_render);
void system_init(void);
void system_shutdown(void);
void system_reset(void);
void system_manage_sram(uint8 *sram, int slot, int mode);
void system_poweron(void);
void system_poweroff(void);

#endif /* _SYSTEM_H_ */


