
/* CART header support for cart2xex

	Format of CART header (from atari800 cart.txt):

 first 4 bytes containing 'C' 'A' 'R' 'T'.
 next 4 bytes containing cartridge type in MSB format (see the table below).
 next 4 bytes containing cartridge checksum in MSB format (ROM only).
 next 4 bytes are currently unused (zero).
 followed immediately with the ROM data: 4, 8, 16, 32, 40, 64, 128, 256, 512
 or 1024 kilobytes.

 See cart.c for the list of cart types.
*/

#ifndef CART_H
#define CART_H

#define CART_SIGNATURE "CART"

#define CART_SIGNATURE_OFFSET 0
#define CART_TYPE_OFFSET 4
#define CART_CHECKSUM_OFFSET 8
#define CART_UNUSED_OFFSET 12

typedef enum {
	M_INVALID,
	M_ATARI8,
	M_5200
} machine_t;

typedef struct {
	int machine;
	int size;
	char *name;
} cart_t;

extern cart_t cart_types[];
extern const int MAX_CART_TYPE;

int has_cart_signature(unsigned char *cart);
void cart_dump_header(unsigned char *cart, int calc_cksum);
unsigned int get_cart_type(unsigned char *cart);
unsigned int get_cart_size(unsigned char *cart);
unsigned int get_cart_checksum(unsigned char *cart);
machine_t get_cart_machine(unsigned char *cart);
unsigned int calc_rom_checksum(unsigned char *rom, int bytes);
unsigned int cart_checksum_ok(unsigned char *cart);
int create_cart_header(
		unsigned char *buffer, unsigned char *rom, unsigned int type);
void set_cart_checksum(unsigned char *cart, unsigned int sum);
void set_cart_type(unsigned char *cart, unsigned int type);
void set_cart_unused(unsigned char *cart, unsigned int data);

#endif
