MCUME/MCUME_teensy41/teensynofrendo/libsnss.h

398 wiersze
9.0 KiB
C
Executable File

/**************************************************************************/
/*
libsnss.h
(C) 2000 The SNSS Group
See README.TXT file for license and terms of use.
$Id: libsnss.h,v 1.1 2001/04/27 12:54:40 neil Exp $
*/
/**************************************************************************/
#ifndef _LIBSNSS_H_
#define _LIBSNSS_H_
#include <stdio.h>
/**************************************************************************/
/* endian customization */
/**************************************************************************/
/*
Endian-ness quick reference:
the number is:
$12345678
the little-endian representation (e.g.: 6502, Intel x86) is:
78 56 34 12
the big-endian representation (e.g.: Motorola 68000) is:
12 34 56 78
the SNSS file format uses big-endian representation
*/
/* comment/uncomment depending on your processor architecture */
/* commenting this out implies BIG ENDIAN */
#define USE_LITTLE_ENDIAN
/**************************************************************************/
/* SNSS constants */
/**************************************************************************/
typedef enum _SNSS_OPEN_MODES
{
SNSS_OPEN_READ,
SNSS_OPEN_WRITE
} SNSS_OPEN_MODE;
/* block types */
typedef enum _SNSS_BLOCK_TYPES
{
SNSS_BASR,
SNSS_VRAM,
SNSS_SRAM,
SNSS_MPRD,
SNSS_CNTR,
SNSS_SOUN,
SNSS_UNKNOWN_BLOCK
} SNSS_BLOCK_TYPE;
/* function return types */
typedef enum _SNSS_RETURN_CODES
{
SNSS_OK,
SNSS_BAD_FILE_TAG,
SNSS_OPEN_FAILED,
SNSS_CLOSE_FAILED,
SNSS_READ_FAILED,
SNSS_WRITE_FAILED,
SNSS_OUT_OF_MEMORY,
SNSS_UNSUPPORTED_BLOCK
} SNSS_RETURN_CODE;
#define TAG_LENGTH 4
#define SNSS_BLOCK_VERSION 1
/**************************************************************************/
/* SNSS data structures */
/**************************************************************************/
struct mapper1Data
{
unsigned char registers[4];
unsigned char latch;
unsigned char numberOfBits;
};
struct mapper4Data
{
unsigned char irqCounter;
unsigned char irqLatchCounter;
unsigned char irqCounterEnabled;
unsigned char last8000Write;
};
struct mapper5Data
{
unsigned char dummy; /* needed for some compilers; remove if any members are added */
};
struct mapper6Data
{
unsigned char irqCounter;
unsigned char irqLatchCounter;
unsigned char irqCounterEnabled;
unsigned char last43FEWrite;
unsigned char last4500Write;
};
struct mapper9Data
{
unsigned char latch[2];
unsigned char lastB000Write;
unsigned char lastC000Write;
unsigned char lastD000Write;
unsigned char lastE000Write;
};
struct mapper10Data
{
unsigned char latch[2];
unsigned char lastB000Write;
unsigned char lastC000Write;
unsigned char lastD000Write;
unsigned char lastE000Write;
};
struct mapper16Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper17Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper18Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper19Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper21Data
{
unsigned char irqCounter;
unsigned char irqCounterEnabled;
};
struct mapper24Data
{
unsigned char irqCounter;
unsigned char irqCounterEnabled;
};
struct mapper40Data
{
unsigned char irqCounter;
unsigned char irqCounterEnabled;
};
struct mapper69Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper90Data
{
unsigned char irqCounter;
unsigned char irqLatchCounter;
unsigned char irqCounterEnabled;
};
struct mapper224Data
{
unsigned char chrRamWriteable;
};
struct mapper225Data
{
unsigned char prgSize;
unsigned char registers[4];
};
struct mapper226Data
{
unsigned char chrRamWriteable;
};
struct mapper228Data
{
unsigned char prgChipSelected;
};
struct mapper230Data
{
unsigned char numberOfResets;
};
typedef struct _SnssFileHeader
{
char tag[TAG_LENGTH + 1];
unsigned int numberOfBlocks;
} SnssFileHeader;
/* this block appears before every block in the SNSS file */
typedef struct _SnssBlockHeader
{
char tag[TAG_LENGTH + 1];
unsigned int blockVersion;
unsigned int blockLength;
} SnssBlockHeader;
#define BASE_BLOCK_LENGTH 0x1931
typedef struct _SnssBaseBlock
{
unsigned char regA;
unsigned char regX;
unsigned char regY;
unsigned char regFlags;
unsigned char regStack;
unsigned short regPc;
unsigned char reg2000;
unsigned char reg2001;
unsigned char cpuRam[0x800];
unsigned char spriteRam[0x100];
unsigned char ppuRam[0x1000];
unsigned char palette[0x20];
unsigned char mirrorState[4];
unsigned short vramAddress;
unsigned char spriteRamAddress;
unsigned char tileXOffset;
} SnssBaseBlock;
#define VRAM_8K 0x2000
#define VRAM_16K 0x4000
typedef struct _SnssVramBlock
{
unsigned short vramSize;
unsigned char vram[VRAM_16K];
} SnssVramBlock;
#define SRAM_1K 0x0400
#define SRAM_2K 0x0800
#define SRAM_3K 0x0C00
#define SRAM_4K 0x1000
#define SRAM_5K 0x1400
#define SRAM_6K 0x1800
#define SRAM_7K 0x1C00
#define SRAM_8K 0x2000
typedef struct _SnssSramBlock
{
unsigned short sramSize;
unsigned char sramEnabled;
unsigned char sram[SRAM_8K];
} SnssSramBlock;
#define MAPPER_BLOCK_LENGTH 0x98
typedef struct _SnssMapperBlock
{
unsigned short prgPages[4];
unsigned short chrPages[8];
union _extraData
{
unsigned char mapperData[128];
struct mapper1Data mapper1;
struct mapper4Data mapper4;
struct mapper5Data mapper5;
struct mapper6Data mapper6;
struct mapper9Data mapper9;
struct mapper10Data mapper10;
struct mapper16Data mapper16;
struct mapper17Data mapper17;
struct mapper18Data mapper18;
struct mapper19Data mapper19;
struct mapper21Data mapper21;
struct mapper24Data mapper24;
struct mapper40Data mapper40;
struct mapper69Data mapper69;
struct mapper90Data mapper90;
struct mapper224Data mapper224;
struct mapper225Data mapper225;
struct mapper226Data mapper226;
struct mapper228Data mapper228;
struct mapper230Data mapper230;
} extraData;
} SnssMapperBlock;
typedef struct _SnssControllersBlock
{
unsigned char dummy; /* needed for some compilers; remove if any members are added */
} SnssControllersBlock;
#define SOUND_BLOCK_LENGTH 0x16
typedef struct _SnssSoundBlock
{
unsigned char soundRegisters[0x16];
} SnssSoundBlock;
/**************************************************************************/
/* SNSS file manipulation functions */
/**************************************************************************/
typedef struct _SNSS_FILE
{
FILE *fp;
SNSS_OPEN_MODE mode;
SnssFileHeader headerBlock;
SnssBaseBlock baseBlock;
SnssVramBlock vramBlock;
SnssSramBlock sramBlock;
SnssMapperBlock mapperBlock;
SnssControllersBlock contBlock;
SnssSoundBlock soundBlock;
} SNSS_FILE;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* general file manipulation routines */
SNSS_RETURN_CODE SNSS_OpenFile (SNSS_FILE **snssFile, const char *filename,
SNSS_OPEN_MODE mode);
SNSS_RETURN_CODE SNSS_CloseFile (SNSS_FILE **snssFile);
/* block traversal */
SNSS_RETURN_CODE SNSS_GetNextBlockType (SNSS_BLOCK_TYPE *blockType,
SNSS_FILE *snssFile);
SNSS_RETURN_CODE SNSS_SkipNextBlock (SNSS_FILE *snssFile);
/* functions to read/write SNSS blocks */
SNSS_RETURN_CODE SNSS_ReadBlock (SNSS_FILE *snssFile, SNSS_BLOCK_TYPE blockType);
SNSS_RETURN_CODE SNSS_WriteBlock (SNSS_FILE *snssFile, SNSS_BLOCK_TYPE blockType);
/* support functions */
const char *SNSS_GetErrorString (SNSS_RETURN_CODE code);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _LIBSNSS_H_ */
/*
** $Log: libsnss.h,v $
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/11/09 14:07:41 matt
** minor update
**
** Revision 1.1 2000/10/24 12:19:01 matt
** changed directory structure
**
** Revision 1.9 2000/09/18 02:06:48 matt
** -pedantic is your friend
**
** Revision 1.8 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.7 2000/07/15 23:49:14 matt
** fixed some typos in the mapper-specific data
**
** Revision 1.6 2000/07/09 15:37:21 matt
** all block read/write calls now pass through a common handler
**
** Revision 1.5 2000/07/09 03:39:06 matt
** minor modifications
**
** Revision 1.4 2000/07/08 16:01:39 matt
** added bald's changes, made error checking more robust
**
** Revision 1.3 2000/07/05 22:46:52 matt
** cleaned up header
**
** Revision 1.2 2000/07/04 04:46:06 matt
** simplified handling of SNSS states
**
** Revision 1.1 2000/06/29 14:13:28 matt
** initial revision
**
*/