/*
 * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
 *
 * (c) Copyright 1996, 1997, 1998 Gary Henderson (gary@daniver.demon.co.uk) and
 *                                Jerremy Koot (jkoot@euronet.nl)
 *
 * Super FX C emulator code 
 * (c) Copyright 1997, 1998 Lestat (lstat@hotmail.com) and
 *                          Gary Henderson.
 * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_.
 *
 * DSP1 emulator code (c) Copyright 1998 Lestat and Gary Henderson.
 * DOS port code contains the works of other authors. See headers in
 * individual files.
 *
 * Permission to use, copy, modify and distribute Snes9x in both binary and
 * source form, for non-commercial purposes, is hereby granted without fee,
 * providing that this license information and copyright notice appear with
 * all copies and any derived work.
 *
 * This software is provided 'as-is', without any express or implied
 * warranty. In no event shall the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Snes9x is freeware for PERSONAL USE only. Commercial users should
 * seek permission of the copyright holders first. Commercial use includes
 * charging money for Snes9x or software derived from Snes9x.
 *
 * The copyright holders request that bug fixes and improvements to the code
 * should be forwarded to them so everyone can benefit from the modifications
 * in future versions.
 *
 * Super NES and Super Nintendo Entertainment System are trademarks of
 * Nintendo Co., Limited and its subsidiary companies.
 */

#ifndef _PORT_H_
#define _PORT_H_

#include <limits.h>
#include <memory.h>
#include <string.h>

#include <sys/types.h>

#if !defined(RGB565) && !defined(RGB555) && !defined(BGR565) && !defined(BGR555)
#define RGB565
#endif

#if defined(RGB565)
#define BUILD_PIXEL(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) (B))
#define BUILD_PIXEL2(R,G,B) (((int) (R) << 11) | ((int) (G) << 5) | (int) (B))

#define MAX_RED		   31
#define MAX_GREEN	   63
#define MAX_BLUE	   31

#define RED_LOW_BIT_MASK   0x0800
#define GREEN_LOW_BIT_MASK 0x0020
#define BLUE_LOW_BIT_MASK  0x0001
#define RED_HI_BIT_MASK    0x8000
#define GREEN_HI_BIT_MASK  0x0400
#define BLUE_HI_BIT_MASK   0x0010

#elif defined(RGB555)
#define BUILD_PIXEL(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B))
#define BUILD_PIXEL2(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B))

#define MAX_RED		   31
#define MAX_GREEN	   31
#define MAX_BLUE	   31

#define RED_LOW_BIT_MASK   0x0400
#define GREEN_LOW_BIT_MASK 0x0020
#define BLUE_LOW_BIT_MASK  0x0001
#define RED_HI_BIT_MASK    0x4000
#define GREEN_HI_BIT_MASK  0x0200
#define BLUE_HI_BIT_MASK   0x0010

#elif defined (BGR565)
#define BUILD_PIXEL(R,G,B) (((int) (B) << 11) | ((int) (G) << 6) | (int) (R))
#define BUILD_PIXEL2(R,G,B) (((int) (B) << 11) | ((int) (G) << 5) | (int) (R))

#define MAX_RED		   31
#define MAX_GREEN	   63
#define MAX_BLUE	   31

#define RED_LOW_BIT_MASK   0x0001
#define GREEN_LOW_BIT_MASK 0x0040
#define BLUE_LOW_BIT_MASK  0x0800
#define RED_HI_BIT_MASK    0x0010
#define GREEN_HI_BIT_MASK  0x0400
#define BLUE_HI_BIT_MASK   0x8000

#elif defined (BGR555)
#define BUILD_PIXEL(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R))
#define BUILD_PIXEL2(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R))

#define MAX_RED		   31
#define MAX_GREEN	   31
#define MAX_BLUE	   31

#define RED_LOW_BIT_MASK   0x0001
#define GREEN_LOW_BIT_MASK 0x0020
#define BLUE_LOW_BIT_MASK  0x0400
#define RED_HI_BIT_MASK    0x0010
#define GREEN_HI_BIT_MASK  0x0200
#define BLUE_HI_BIT_MASK   0x4000

#endif

#define GREEN_HI_BIT	   ((MAX_GREEN + 1) >> 1)

#define RGB_LOW_BITS_MASK (RED_LOW_BIT_MASK | GREEN_LOW_BIT_MASK | \
			   BLUE_LOW_BIT_MASK)
#define RGB_HI_BITS_MASK  (RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | \
			   BLUE_HI_BIT_MASK)
#define RGB_REMOVE_LOW_BITS_MASK (~RGB_LOW_BITS_MASK)

#ifndef snes9x_types_defined
#define snes9x_types_defined
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
typedef unsigned char bool8;
typedef signed char int8;
typedef short int16;
typedef int int32;
#endif

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

#ifndef _WIN32

#ifndef PATH_MAX
#define PATH_MAX 1024
#endif

#define _MAX_DIR PATH_MAX
#define _MAX_DRIVE 1
#define _MAX_FNAME PATH_MAX
#define _MAX_EXT PATH_MAX
#define _MAX_PATH PATH_MAX

#if defined(__cplusplus) || defined(c_plusplus)
#define EXTERN_C extern "C"
#define START_EXTERN_C extern "C" {
#define END_EXTERN_C }
#else
#define EXTERN_C
#define START_EXTERN_C
#define END_EXTERN_C
#endif

#define ZeroMemory(a,b) memset((a),0,(b))

void _makepath (char *path, const char *drive, const char *dir,
		const char *fname, const char *ext);
void _splitpath (const char *path, char *drive, char *dir, char *fname,
		 char *ext);
#else // _WIN32
#define strcasecmp stricmp
#define strncasecmp strnicmp
#endif

#if defined(__linux) || defined(__sun)
EXTERN_C void S9xUnixProcessSound ();
#define CHECK_SOUND() if (CPU.Flags & PROCESS_SOUND_FLAG) S9xUnixProcessSound ()
#elif defined(_WIN32)
void WindowsWaitForSound (void);
void WindowsProcessSound (void);
#define CHECK_SOUND() if (CPU.Flags & PROCESS_SOUND_FLAG) WindowsWaitForSound ()
#else
#define CHECK_SOUND()
#endif

#ifdef __DJGPP
#define SLASH_STR "\\"
#define SLASH_CHAR '\\'
#else
#define SLASH_STR "/"
#define SLASH_CHAR '/'
#endif

#ifdef __linux
#define SIG_PF SignalHandler
#endif

#if defined(__i386__) || defined(__i486__) || defined(__i586__)
#define LSB_FIRST
#define FAST_LSB_WORD_ACCESS
#else
#define MSB_FIRST
#endif

#ifdef __sun
#define TITLE "Snes9X: Solaris"
#endif

#ifdef __linux
#define TITLE "Snes9X: Linux"
#endif

#ifndef TITLE
#define TITLE "Snes9x"
#endif

#endif
