All pastes #2050967 Raw Edit

Unnamed

public text v1 · immutable
#2050967 ·published 2011-04-26 19:27 UTC
rendered paste body
// FB Alpha Bank Panic Driver Module
// Based on MAME driver by Nicola Salmoria

#include "tiles_generic.h"
//#include "sn76496.h"

//#define CZ80 1
#define RAZE 1
#define USE_MAP 1
//#define USE_SPRITES 1
#define VBTLIB 1
//#include "tiles_generic.h"
//#include "burnint.h"

//#define		_SPR3_
//#include "sega_spr.h"
#include "sega_scl2.h"
#include "sega_pcm.h"

static void DrvInitSaturn();
#ifdef USE_MAP
	extern UINT16 *ss_font;
	extern UINT16 *ss_map;
	extern UINT16 *ss_map2;
//	extern Fixed32	ls_tbl[SCL_MAXLINE];
//	extern SclLineparam lp;
#else
	unsigned char* pTransDraw;
	unsigned char *pBurnDraw;			// Pointer to correctly sized bitmap
	static unsigned int *Palette, *DrvPalette;
#endif

#define	RGB( r, g, b )		(0x8000U|((b) << 10)|((g) << 5 )|(r))
extern UINT16 *colBgAddr; // color
extern UINT16 *colBgAddr2;
//extern UINT16 *colAddr; // sprite color
//extern UINT8 *aVRAM;
//extern SprSpCmd  smsSprite[64+3];
extern UINT8 *cache;
extern char *g_movie_buf;
extern PcmHn pcm;
//extern unsigned char hz;

extern unsigned int delta;
//unsigned int titi2=0;

//int nBurnFPS;						// pas utile ?
//int nBurnBpp;						// Bytes per pixel (2, 3, or 4)
//int nBurnPitch;					// Pitch between each line
//unsigned int nBurnDrvSelect;		// Which game driver is selected
//short* pBurnSoundOut;				// Pointer to output buffer
extern int nBurnSoundRate;			// sample rate of sound or zero for no sound
extern int nBurnSoundLen;			// Length in samples per frame
//extern struct BurnDriver* pDriver[];

#define ACB_MEMORY_RAM	 (32)
#define ACB_DRIVER_DATA	 (64)
#define ACB_VOLATILE    (ACB_MEMORY_RAM | ACB_DRIVER_DATA)

#ifdef CZ80
#define ZET_IRQSTATUS_NONE 0
#define ZET_IRQSTATUS_ACK  1
#define ZET_IRQSTATUS_AUTO 2
#define CZetRaiseIrq(n) CZetSetIRQLine(n, ZET_IRQSTATUS_AUTO)
#endif



static unsigned char *Mem, *Rom, *Gfx0, *Gfx1, *Prom;
static unsigned char DrvJoy1[8], DrvJoy2[8], DrvJoy3[8], DrvReset, DrvDips;
static int *Palette;

static unsigned char scroll_x, priority, flipscreen, interrupt_enable;

static struct BurnInputInfo bankpInputList[] = {
	{"Coin 1"       , BIT_DIGITAL  , DrvJoy1 + 5,	"p1 coin"  },
	{"Coin 2"       , BIT_DIGITAL  , DrvJoy1 + 6,	"p2 coin"  },
	{"Coin 3"       , BIT_DIGITAL  , DrvJoy1 + 6,	"p3 coin"  },
	{"P1 Start"     , BIT_DIGITAL  , DrvJoy2 + 5,	"p1 start" },
	{"P2 Start"     , BIT_DIGITAL  , DrvJoy2 + 6,	"p2 start" },

	{"P1 Left"      , BIT_DIGITAL  , DrvJoy1 + 3, 	"p1 left"  },
	{"P1 Right"     , BIT_DIGITAL  , DrvJoy1 + 1, 	"p1 right" },
	{"P1 Button 1"  , BIT_DIGITAL  , DrvJoy1 + 7,	"p1 fire 1"},
	{"P1 Button 2"  , BIT_DIGITAL  , DrvJoy1 + 4,	"p1 fire 2"},
	{"P1 Button 3"  , BIT_DIGITAL  , DrvJoy3 + 0,	"p1 fire 3"},

	{"P2 Left"      , BIT_DIGITAL  , DrvJoy2 + 3, 	"p2 left"  },
	{"P2 Right"     , BIT_DIGITAL  , DrvJoy2 + 1, 	"p2 right" },
	{"P2 Button 1"  , BIT_DIGITAL  , DrvJoy2 + 7,	"p2 fire 1"},
	{"P2 Button 2"  , BIT_DIGITAL  , DrvJoy2 + 4,	"p2 fire 2"},
	{"P2 Button 3"  , BIT_DIGITAL  , DrvJoy3 + 1,	"p2 fire 3"},

	{"Reset"        , BIT_DIGITAL  , &DrvReset  ,	"reset"    },
	{"Dip 1"        , BIT_DIPSWITCH, &DrvDips,      "dip"      },
};

STDINPUTINFO(bankp)

static struct BurnInputInfo combhInputList[] = {
	{"Coin 1"       , BIT_DIGITAL  , DrvJoy1 + 5,	"p1 coin"  },
	{"Coin 2"       , BIT_DIGITAL  , DrvJoy1 + 6,	"p2 coin"  },
	{"Coin 3"       , BIT_DIGITAL  , DrvJoy1 + 6,	"p3 coin"  },
	{"P1 Start"     , BIT_DIGITAL  , DrvJoy2 + 5,	"p1 start" },
	{"P2 Start"     , BIT_DIGITAL  , DrvJoy2 + 6,	"p2 start" },

	{"P1 Up"        , BIT_DIGITAL  , DrvJoy1 + 0, 	"p1 up"    },
	{"P1 Down"      , BIT_DIGITAL  , DrvJoy1 + 2, 	"p1 down"  },
	{"P1 Button 1"  , BIT_DIGITAL  , DrvJoy1 + 7,	"p1 fire 1"},
	{"P1 Button 2"  , BIT_DIGITAL  , DrvJoy1 + 4,	"p1 fire 2"},
	{"P1 Button 3"  , BIT_DIGITAL  , DrvJoy3 + 0,	"p1 fire 3"},

	{"P2 Up"        , BIT_DIGITAL  , DrvJoy2 + 0, 	"p2 up"    },
	{"P2 Down"      , BIT_DIGITAL  , DrvJoy2 + 2, 	"p2 down"  },
	{"P2 Button 1"  , BIT_DIGITAL  , DrvJoy2 + 7,	"p2 fire 1"},
	{"P2 Button 2"  , BIT_DIGITAL  , DrvJoy2 + 4,	"p2 fire 2"},
	{"P2 Button 3"  , BIT_DIGITAL  , DrvJoy3 + 1,	"p2 fire 3"},

	{"Reset"        , BIT_DIGITAL  , &DrvReset  ,	"reset"    },
	{"Dip 1"        , BIT_DIPSWITCH, &DrvDips,      "dip"      },

};

STDINPUTINFO(combh)

static struct BurnDIPInfo bankpDIPList[]=
{
	// Default Values
	{0x10, 0xff, 0xff, 0x41, NULL                     },

	{0   , 0xfe, 0   , 4   , "Coin A/B"               },
	{0x10, 0x01, 0x03, 0x03, "3C 1C"     		  },
	{0x10, 0x01, 0x03, 0x02, "2C 1C"    		  },
	{0x10, 0x01, 0x03, 0x01, "1C 1C"     		  },
	{0x10, 0x01, 0x03, 0x00, "1C 2C"    		  },

	{0   , 0xfe, 0   , 2   , "Coin C"                 },
	{0x10, 0x01, 0x04, 0x04, "2C 1C"     		  },
	{0x10, 0x01, 0x04, 0x00, "1C 1C"    		  },

	{0   , 0xfe, 0   , 2   , "Lives"	          },
	{0x10, 0x01, 0x08, 0x00, "3"     		  },
	{0x10, 0x01, 0x08, 0x08, "4"			  },

	{0   , 0xfe, 0   , 2   , "Bonus Life"	          },
	{0x10, 0x01, 0x10, 0x00, "70K 200K 500K..."       },
	{0x10, 0x01, 0x10, 0x10, "100K 400K 800K..."	  },

	{0   , 0xfe, 0   , 2   , "Difficulty"             },
	{0x10, 0x01, 0x20, 0x00, "Easy"       		  },
	{0x10, 0x01, 0x20, 0x20, "Hard"       		  },

	{0   , 0xfe, 0   , 2   , "Demo Sounds"            },
	{0x10, 0x01, 0x40, 0x00, "Off"     		  },
	{0x10, 0x01, 0x40, 0x40, "On"    		  },

	{0   , 0xfe, 0   , 2   , "Cabinet"                },
	{0x10, 0x01, 0x80, 0x80, "Upright"     		  },
	{0x10, 0x01, 0x80, 0x00, "Cocktail"    		  },
};

STDDIPINFO(bankp)

static struct BurnDIPInfo combhDIPList[]=
{
	// Default Values
	{0x10, 0xff, 0xff, 0x40, NULL                     },

	{0   , 0xfe, 0   , 2   , "Flip Screen"            },
	{0x10, 0x01, 0x01, 0x00, "Off"     		  },
	{0x10, 0x01, 0x01, 0x01, "On"    		  },

	{0   , 0xfe, 0   , 4   , "Coinage"                },
	{0x10, 0x01, 0x06, 0x06, "2C 1C"     		  },
	{0x10, 0x01, 0x06, 0x00, "1C 1C"    		  },
	{0x10, 0x01, 0x06, 0x02, "1C 2C"     		  },
	{0x10, 0x01, 0x06, 0x04, "1C 3C"    		  },

	{0   , 0xfe, 0   , 2   , "Lives"	          },
	{0x10, 0x01, 0x08, 0x00, "3"     		  },
	{0x10, 0x01, 0x08, 0x08, "4"			  },

	{0   , 0xfe, 0   , 2   , "Cabinet"                },
	{0x10, 0x01, 0x10, 0x10, "Upright"     		  },
	{0x10, 0x01, 0x10, 0x00, "Cocktail"    		  },

	{0   , 0xfe, 0   , 2   , "Difficulty"             },
	{0x10, 0x01, 0x40, 0x00, "Easy"       		  },
	{0x10, 0x01, 0x40, 0x40, "Hard"       		  },

	{0   , 0xfe, 0   , 2   , "Fuel"                   },
	{0x10, 0x01, 0x80, 0x00, "120 Units"     	  },
	{0x10, 0x01, 0x80, 0x80, "90 Units"    		  },
};

STDDIPINFO(combh)

unsigned char __fastcall bankp_in(unsigned short address)
{
	unsigned char ret = 0;

	switch (address & 0xff)
	{
		case 0x00:
		{
			unsigned int i;
			for (i = 0; i < 8; i++) ret |= DrvJoy1[i] << i;

			// limit controls to 2-way
			if ((ret & 0x05) == 0x05) ret &= 0xfa;
			if ((ret & 0x0a) == 0x0a) ret &= 0xf5;

			return ret;
		}

		case 0x01:
		{
			unsigned int i;
			for (i = 0; i < 8; i++) ret |= DrvJoy2[i] << i;

			// limit controls to 2-way
			if ((ret & 0x05) == 0x05) ret &= 0xfa;
			if ((ret & 0x0a) == 0x0a) ret &= 0xf5;

			return ret;
		}

		case 0x02:
		{
			unsigned int i;
			for (i = 0; i < 8; i++) ret |= DrvJoy3[i] << i;

			return ret;
		}

		case 0x04:
			return DrvDips;
	}

	return 0;
}

void __fastcall bankp_out(unsigned short address, unsigned char data)
{
	switch (address & 0xff)
	{
		case 0x00: 
//			SN76496Write(0, data);
		break;
		
		case 0x01:
//			SN76496Write(1, data);
		break;
		
		case 0x02:
//			SN76496Write(2, data);
		break;

		case 0x05:
			scroll_x = data;
		break;

		case 0x07:
		{
			priority = data & 0x03;

			interrupt_enable = (data >> 4) & 1;

			flipscreen = data & 0x20;
		}
		break;
	}
}

static int DrvDoReset()
{
	DrvReset = 0;

	memset (Mem + 0xe000, 0, 0x2000);

	CZetOpen(0);
	CZetReset();
	CZetClose();

	scroll_x = 0, priority = 0, flipscreen = 0;
	interrupt_enable = 0;

	return 0;
}

static int bankp_palette_init()
{
	int i;

	unsigned int t_pal[32];
	unsigned char *color_prom = Prom;

	for (i = 0;i < 32;i++)
	{
		int bit0,bit1,bit2,r,g,b;

		bit0 = (*color_prom >> 0) & 0x01;
		bit1 = (*color_prom >> 1) & 0x01;
		bit2 = (*color_prom >> 2) & 0x01;
		r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;

		bit0 = (*color_prom >> 3) & 0x01;
		bit1 = (*color_prom >> 4) & 0x01;
		bit2 = (*color_prom >> 5) & 0x01;
		g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;

		bit0 = 0;
		bit1 = (*color_prom >> 6) & 0x01;
		bit2 = (*color_prom >> 7) & 0x01;
		b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;

        r =  (r >>3);
        g =  (g >>3);
        b =  (b >>3);		

		t_pal[i] = RGB(r,g,b);//(r << 16) | (g << 8) | b;
		color_prom++;
	}
//nbg2 mauvais

	int j=0,k=0,delta=0;
	for (i = 0;i < 32 * 4;i++) {
//		colAddr[i] = 
			colBgAddr2[delta] = colBgAddr2[delta+4] = Palette[i] = t_pal[*color_prom & 0x0f];
		delta++; if ((delta & 3) == 0) delta += 12;
		color_prom++;
	}
	color_prom += 128;
	delta=0;
	for (i = 0;i < 16 * 8;i++) {
		colBgAddr[delta] = Palette[i+0x80] = t_pal[*color_prom & 0x0f];
		delta++; if ((delta & 7) == 0) delta += 8;
		color_prom++;
	}
	return 0;
}

static int bankp_gfx_decode()
{
/*	unsigned char *tmp = (unsigned char*)malloc(0x10000);
	if (tmp == NULL) {
		return 1;
	}

	memcpy (tmp, Gfx0, 0x10000);
*/
	static int Char1PlaneOffsets[2] = { 0x00, 0x04 };
	static int Char2PlaneOffsets[3] = { 0x00, 0x20000, 0x40000 };
	static int Char1XOffsets[8]     = { 0x43, 0x42, 0x41, 0x40, 0x03, 0x02, 0x01, 0x00 };
	static int Char2XOffsets[8]     = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 };
	static int CharYOffsets[8]      = { 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38 };

//	GfxDecode(0x400, 2, 8, 8, Char1PlaneOffsets, Char1XOffsets, CharYOffsets, 0x080, tmp, Gfx0);

//	memcpy (tmp, Gfx1, 0x10000);

//	GfxDecode(0x800, 3, 8, 8, Char2PlaneOffsets, Char2XOffsets, CharYOffsets, 0x040, tmp, Gfx1);

//	GfxDecode4Bpp(0x400, 2, 8, 8, Char1PlaneOffsets, Char1XOffsets, CharYOffsets, 0x080, Gfx0, cache);
GfxDecode4Bpp(0x400, 2, 8, 8, Char1PlaneOffsets, Char1XOffsets, CharYOffsets, 0x080, Gfx0, cache+0x10000);
//	GfxDecode4Bpp(0x800, 3, 8, 8, Char2PlaneOffsets, Char2XOffsets, CharYOffsets, 0x040, Gfx1, &aVRAM[0x880]);
GfxDecode4Bpp(0x800, 3, 8, 8, Char2PlaneOffsets, Char2XOffsets, CharYOffsets, 0x040, Gfx1, cache);

	unsigned int i;
					   //60
	for (i=0x10060;i<0x10AA0;i++ )	  //2600
			cache[i] = cache[i]+0x44;//& 0x0f)| ((cache[i]& 0xf0));

	for (i=0x10BE0;i<0x12520;i++ )	  //2600
			cache[i] = cache[i]+0x44;//& 0x0f)| ((cache[i]& 0xf0));

  /*
	for (i=0x12520;i<0x14800;i++ )	  //2600
			cache[i] = cache[i]+0x44;//& 0x0f)| ((cache[i]& 0xf0));
*/

/*
	for (i=0x14800;i<0x14DE0;i++ )	  //2600
			cache[i] = cache[i]+0x44;//& 0x0f)| ((cache[i]& 0xf0));
*/ 
	for (i=0x15380;i<0x154E0;i++ )	  //15600
			cache[i] = cache[i]+0x44;//& 0x0f)| ((cache[i]& 0xf0));
 

	for (i=0x154E0;i<0x16000;i++ )		   //5800
		cache[i] = cache[i]+0x44;
   
   
	for (i=0x16600;i<0x20000;i++ )
		cache[i] = cache[i]+0x44;

 
//		if ((cache[i]& 0x0f)       ==0x00)cache[i] = cache[i] & 0xf0 | 0x4;
//		else if ((cache[0x880+i]& 0x0f)==0x0f) cache[i] = cache[i] & 0x40;

//		if ((cache[i]& 0xf0)       ==0x00)cache[i] = 0xf0 | cache[i] & 0x04;
//		else if ((cache[i]& 0xf0)==0xf0) cache[i] = cache[i] & 0x04;




/*
	unsigned int i;

	for (i = 0; i < 0x20000; i++) {
		Gfx1[i] |= 0x80;
	}

	free (tmp);
*/
	return 0;
}

static int DrvInit()
{
	DrvInitSaturn();

	Mem = (unsigned char*)malloc(0x10000 + 0x10000 + 0x20000 + 0x300 + 0x800);
	if (Mem == NULL) {
		return 1;
	}

	Rom  = Mem + 0x00000;
	Gfx0 = Mem + 0x10000;
	Gfx1 = Mem + 0x20000;
	Prom = Mem + 0x40000;
	Palette = (int*)(Mem + 0x40200);

	{
		unsigned int i;
		for (i = 0; i < 4; i++)
			if (BurnLoadRom(Rom + i * 0x4000, i +  0, 1)) return 1;

		if (BurnLoadRom(Gfx0 + 0x0000, 4, 1)) return 1;
		if (BurnLoadRom(Gfx0 + 0x2000, 5, 1)) return 1;

		for (i = 0; i < 6; i++)
			if (BurnLoadRom(Gfx1 + i * 0x2000, i +  6, 1)) return 1;

		if (BurnLoadRom(Prom + 0x0000, 12, 1)) return 1;
		if (BurnLoadRom(Prom + 0x0020, 13, 1)) return 1;
		if (BurnLoadRom(Prom + 0x0120, 14, 1)) return 1;

		if (bankp_gfx_decode()) return 1;
		bankp_palette_init();
	}

	CZetInit(1);
	CZetOpen(0);
	CZetSetInHandler(bankp_in);
	CZetSetOutHandler(bankp_out);
	CZetMapArea(0x0000, 0xdfff, 0, Rom + 0x0000);
	CZetMapArea(0x0000, 0xdfff, 2, Rom + 0x0000);
	CZetMapArea(0xe000, 0xefff, 0, Rom + 0xe000);
	CZetMapArea(0xe000, 0xefff, 1, Rom + 0xe000);
	CZetMapArea(0xe000, 0xefff, 2, Rom + 0xe000);
	CZetMapArea(0xf000, 0xffff, 0, Rom + 0xf000);
	CZetMapArea(0xf000, 0xffff, 1, Rom + 0xf000);
	CZetMemEnd();
	CZetClose();
	
//	SN76489Init(0, 15468000 / 6, 0);
//	SN76489Init(1, 15468000 / 6, 1);
//	SN76489Init(2, 15468000 / 6, 1);

	DrvDoReset();

	return 0;
}

//-------------------------------------------------------------------------------------------------------------------------------------
static void initLayers()
{
#ifdef USE_MAP
/*
    Uint16	CycleTb[]={
		0x4eff, 0x1fff, //A0
//		0x2f6f,0xf5ff,   //B0
//		0xffff, 0xffff,	//A1
		0xffff, 0xffff,	//A1
//		0x4eff, 0x1fff, //A0
		0x2f6f,0xf5ff,   //B0
		0xffff, 0xffff  //B1
//		0x4eff, 0x1fff, //B1
	};
*/	 /*
    Uint16	CycleTb[]={
		0x4eff, 0x1f2f, //A0
//		0x2f6f,0xf5ff,   //B0
		0xffff, 0xffff,	//A1
//		0xffff, 0xffff,	//A1
//		0x4eff, 0x1fff, //A0
		0xffff,0xf5f6,   //B0
		0xffff, 0xffff  //B1
//		0x4eff, 0x1fff, //B1
	};
	*/
    Uint16	CycleTb[]={
		0x1f56, 0xffff, //A0
		0xffff, 0xffff,	//A1
		0xf5f2,0x4eff,   //B0
		0xffff, 0xffff  //B1
//		0x4eff, 0x1fff, //B1
	};

#else
    Uint16	CycleTb[]={
		//0x44ee, 0xff5e, //A1
		0xff5e, 0x44ee,  //A1
		0xffff, 0xffff,	//A0
		0xffff, 0xffff,   //B1
		0xffff,0xffff  //B0
	};
#endif
/*
voir page 58 vdp2
voir plutot p355 vdp2
*/
 	SclConfig	scfg;
//A0 0x0000 0000
//A1 0x0004 0x005
//B0 0x0008
//B1 0x000c 1100
/*******************TILE MODE A GARDER*/
	cache     = (Uint8 *)SCL_VDP2_VRAM_A0;
/*********************************************/	
int i;
#ifdef USE_MAP
// 3 nbg
	scfg.dispenbl      = ON;
	scfg.charsize      = SCL_CHAR_SIZE_1X1;//OK du 1*1 surtout pas toucher
	scfg.pnamesize     = SCL_PN2WORD; //2word
//	scfg.flip          = SCL_PN_12BIT; 
	scfg.platesize     = SCL_PL_SIZE_1X1; // ou 2X2 ?
	scfg.coltype       = SCL_COL_TYPE_16;//SCL_COL_TYPE_256;
	scfg.datatype      = SCL_CELL;
//	scfg.mapover       = SCL_OVER_2;   //ajout
//	scfg.patnamecontrl =  0x000c;// VRAM B1 ‚̃IƒtƒZƒbƒg 
//	for(i=0;i<4;i++)   
		scfg.plate_addr[0] = ss_map2;
		scfg.plate_addr[1] = 0x00;
	SCL_SetConfig(SCL_NBG1, &scfg);
// 3 nbg
	scfg.dispenbl      = ON;
	scfg.charsize      = SCL_CHAR_SIZE_1X1;//OK du 1*1 surtout pas toucher
	scfg.pnamesize     = SCL_PN2WORD;
//	scfg.flip          = SCL_PN_12BIT; 
	scfg.platesize     = SCL_PL_SIZE_1X1; // ou 2X2 ?
	scfg.coltype       = SCL_COL_TYPE_16;//SCL_COL_TYPE_256;
	scfg.datatype      = SCL_CELL;
//	scfg.mapover       = SCL_OVER_0;   //ajout
//	scfg.patnamecontrl =  0x0008;// VRAM B1 ‚̃IƒtƒZƒbƒg 
	//for(i=0;i<4;i++)   
		scfg.plate_addr[0] = ss_map;
		scfg.plate_addr[1] = 0x00;
	SCL_SetConfig(SCL_NBG2, &scfg);
#endif

/********************************************/	
//	SCL_InitConfigTb(&scfg);
	scfg.dispenbl 		 = ON;
	scfg.bmpsize 		 = SCL_BMP_SIZE_512X256;
	scfg.coltype 			 = SCL_COL_TYPE_16;//SCL_COL_TYPE_16;//SCL_COL_TYPE_256;
	scfg.datatype 		 = SCL_BITMAP;
	scfg.mapover			 = SCL_OVER_0;
	scfg.plate_addr[0]	 = ss_font;

// 3 nbg	
	SCL_SetConfig(SCL_NBG0, &scfg);

	SCL_SetCycleTable(CycleTb);	
}
//-------------------------------------------------------------------------------------------------------------------------------------
static void initPosition()
{
#ifdef VBTLIB
	SCL_Open();
//	SCL_MoveTo(FIXED(0), FIXED(0),0);
	//SCL_MoveTo(FIXED(0), FIXED(0),0);
//	Scl_n_reg.n0_move_x = 0;
//	Scl_n_reg.n0_move_y = -32;
//	Scl_n_reg.n1_move_x =  (-8<<16) ;
//	Scl_n_reg.n1_move_y =  (-32<<16) ;
	// vbt à remettre
//	Scl_n_reg.n2_move_x =   (-8);
	Scl_n_reg.n1_move_y =  16 <<16;
	Scl_n_reg.n2_move_y =  16;//(0<<16) ;
	SCL_Close();
#endif
}
//-------------------------------------------------------------------------------------------------------------------------------------
static void initColors()
{
//	colAddr = (Uint16*)SCL_AllocColRam(SCL_SPR,OFF);
//	Uint16* grey = SCL_AllocColRam(SCL_NBG0,OFF);
//	colBgAddr  = (Uint16*)SCL_COLRAM_ADDR;//(Uint16*)SCL_AllocColRam(SCL_NBG1,ON);
//	SCL_Open();
	colBgAddr  = (Uint16*)SCL_AllocColRam(SCL_NBG1,ON);	  //ON
	(Uint16*)SCL_AllocColRam(SCL_NBG3,ON);
	(Uint16*)SCL_AllocColRam(SCL_NBG3,ON);
	colBgAddr2  =(Uint16*)SCL_AllocColRam(SCL_NBG2,OFF);//OFF);

//	(Uint16*)SCL_AllocColRam(SCL_NBG3,ON);
//	(Uint16*)SCL_AllocColRam(SCL_NBG3,ON); 

//	SCL_Close();
//	(Uint16*)SCL_AllocColRam(SCL_NBG0,ON);
//	colBgAddr2 = (Uint16*)SCL_AllocColRam(SCL_NBG2,OFF);
// 	colAddr    = (Uint16*)SCL_AllocColRam(SCL_SPR,OFF);
  /*
	unsigned short palette[4]=
	{
	RGB( 164>>3, 181>>3, 197>>3),RGB( 0,0,0 ),RGB( 164>>3, 181>>3, 197>>3),RGB( 214>>3, 230>>3, 247>>3 ),
//	RGB( 0, 0, 0 ),RGB( 0,0,0 ),RGB( 164>>3, 247>>3, 197>>3 ),RGB( 99>>3, 197>>3, 148>>3 ),
//	RGB( 0, 0, 0 ),RGB( 0,0,0 ),RGB( 247>>3, 132>>3, 132>>3 ),RGB( 247>>3, 230>>3, 132>>3 ),
//	RGB( 0, 0, 0 ),RGB( 0>>3  , 73>>3 , 231>>3 ),RGB( 0>>3  , 182>>3, 231>>3 ),RGB( 148>>3, 219>>3, 247>>3 )
	};
	SCL_SetColRam(SCL_NBG0,8,4,palette);
*/
}
//-------------------------------------------------------------------------------------------------------------------------------------
static void drawGrey()
{
	Uint16 *VRAM;    
	int x,j;
    VRAM = (Uint16 *)SCL_VDP2_VRAM_B0;
 
	for( x = 0; x < 224; x++ ) 
    {
		for( j = 0; j < 6; j++ ) //x
			*VRAM++ = 0xaaaa;
		VRAM += (56);

		for( j = 0; j < 32; j++ ) //x
			*VRAM++ = 0xaaaa;
		VRAM += (34);
	}
}
//-------------------------------------------------------------------------------------------------------------------------------------
static void DrvInitSaturn()
{
	ss_map   =(Uint16 *)SCL_VDP2_VRAM_B1;
	ss_map2 =(Uint16 *)SCL_VDP2_VRAM_A1;
	ss_font    =(Uint16 *)SCL_VDP2_VRAM_B0;
	Scl_s_reg.tvmode &= 0xfff0;
	Scl_s_reg.tvmode |= 0x0001;
	if(SclProcess == 0)	SclProcess = 1;

//    SpTvMode = 0x0007 & SPR_TV_NORMAL;
//    SPR_WRITE_REG(SPR_W_TVMR, 0x0007 & SPR_TV_NORMAL);
	
//	SPR_SetEraseData( 0x0000, 0, 0, 352-1, 224-1 );
//3 nbg
//    SCL_SetPriority(SCL_SPR,6);//6
	SCL_SetPriority(SCL_NBG0,7);
	SCL_SetPriority(SCL_NBG2,5);
	SCL_SetPriority(SCL_NBG1,4);//5
    /* Enable line and vertical cell scroll for NBG0 */
#ifdef VBTLIB
//	(*(Uint16 *)0x25F8009A) = 0x0003; 
//	(*(Uint16 *)0x25F80020) = 0x0303;
#endif
//	initSprites();
	SetVblank();
	initLayers();
	initPosition();
	initColors();

	//initScrolling(); // utilisé ?
//	memset(&aVRAM[0x880],0,0x40000);
//	memset(cache,0,sizeof(cache));
	//memset((Uint16 *)SCL_VDP2_VRAM_B0,0,0x10000);
//	hz = get_hz();
//	initScrolling(); // utilisé ?
	drawGrey();
}
//-------------------------------------------------------------------------------------------------------------------------------------
static int DrvExit()
{
	CZetExit();
	
//	SN76496Exit();

	free (Mem);

	scroll_x = priority = flipscreen = interrupt_enable = 0;

	Rom = Gfx0 = Gfx1 = Prom = NULL;
	Palette = NULL;

	return 0;
}

/*
static void bankp_plot_pixel(int x, int y, int color, unsigned char src, int transp)
{
	if (x > 223 || x < 0 || y > 223 || y < 0) return;

	int pxl = Palette[color | src];
	if (transp && !pxl) return;

//	PutPix(pBurnDraw + (y * 224 + x) * nBurnBpp, BurnHighCol(pxl >> 16, pxl >> 8, pxl, 0));
}


static void draw_8x8_tiles(unsigned char *gfx_base, int code, int color, int sx, int sy, int flipx, int flipy, int transp)
{
	unsigned char *src = gfx_base + (code << 6);

	if (flipy)
	{
		unsigned int y;

		for (y = sy + 7; y >= sy; y--)
		{
			unsigned int x;
			if (flipx)
			{
				for (x = sx + 7; x >= sx; x--, src++) {
					bankp_plot_pixel(x, y, color, *src, transp);
				}
			} else {
				for (x = sx; x < sx + 8; x++, src++) {
					bankp_plot_pixel(x, y, color, *src, transp);
				}
			}
		}	
	} else {
		unsigned int y,x;
		for (y = sy; y < sy + 8; y++)
		{
			if (flipx)
			{
				for (x = sx + 7; x >= sx; x--, src++) {
					bankp_plot_pixel(x, y, color, *src, transp);

				}
			} else {
				for (x = sx; x < sx + 8; x++, src++) {
					bankp_plot_pixel(x, y, color, *src, transp);

				}
			}
		}
	}
}
*/
static void draw_bg_tiles(int prio)
{
	int offs;

	for (offs = 0; offs < 0x400; offs++)
	{
		int code, color, flipx, sx, sy;

		code = Rom[0xf800 + offs] | ((Rom[0xfc00 + offs] & 7) << 8);
		color = (Rom[0xfc00 + offs] >> 1) & 0x78;
		flipx = Rom[0xfc00 + offs] & 0x08;
/*
		if (flipscreen) {
			sx = (~offs << 3) & 0xf8;
			sy = (~offs >> 2) & 0xf8;
			flipx ^= 0x08;
		} else {
			sx = ( offs << 3) & 0xf8;
			sy = ( offs >> 2) & 0xf8;
		}
*/
		sx = (offs) & 0x1f;
		sy = ((offs) >> 5)<<6;
		register int x = (sx | sy)<<1;		//-0x40
//NBG1
		ss_map2[x] = flipx <<11 | color>>3;//color/8;
		ss_map2[x+1] = code;
//		draw_8x8_tiles(Gfx1, code, color, sx - 24, sy - 16, flipx, flipscreen, prio);
	}
}

static void draw_fg_tiles(int prio)
{
	int offs;

	for (offs = 0; offs < 0x400; offs++)
	{
		int code, color, flipx, sx, sy;

		code = Rom[0xf000 + offs] | ((Rom[0xf400 + offs] & 3) << 8);
		color = (Rom[0xf400 + offs] >> 1) & 0x7c;
		flipx = Rom[0xf400 + offs] & 0x04;
	   /*
		if (flipscreen) {
			sx = ((~offs << 3) - scroll_x) & 0xff;
			sy = (~offs >> 2) & 0xf8;
			flipx ^= 4;
		} else {
			sx = (( offs << 3) - scroll_x) & 0xff;
			sy = ( offs >> 2) & 0xf8;
		}			 */
//		draw_8x8_tiles(Gfx0, code, color, sx - 24, sy - 16, flipx, flipscreen, prio);
		 sx = (offs) & 0x1f;
		 sy = (offs >> 5)<<6; //+0x40
		register int x = (sx | sy)<<1;

 //NBG2
		ss_map[x] = ss_map[x+0x40] = ss_map[x+0x1000] = ss_map[x+0x1040] = flipx <<12 | color>>2;//color /8;

		ss_map[x+1] = ss_map[x+0x41] = ss_map[x+0x1001] = ss_map[x+0x1041] = code+2048;



//		ss_map2[x+1] = ss_map2[x+0x41] = 2048;

	}
}

static int DrvDraw()
{
/*
	SCL_SetPriority(SCL_NBG2,5);
	SCL_SetPriority(SCL_NBG1,4);//5
*/


	if (priority & 0x02)
		SCL_SetPriority(SCL_NBG1,6);
	else
		SCL_SetPriority(SCL_NBG1,4);

	draw_bg_tiles(1);
	draw_fg_tiles(0);

	Scl_n_reg.n2_move_x = scroll_x;//-24;
	return 0;
}


static int DrvFrame()
{
	if (DrvReset) {
		DrvDoReset();
	}

	CZetOpen(0);
	CZetRun(2578000 / 60);
	if (interrupt_enable) CZetNmi();
	CZetClose();
	
//	SN76496Update(0, pBurnSoundOut, nBurnSoundLen);
//	SN76496Update(1, pBurnSoundOut, nBurnSoundLen);
//	SN76496Update(2, pBurnSoundOut, nBurnSoundLen);

//	if (pBurnDraw) 
	{
		DrvDraw();
	}

	return 0;
}
/*
static int DrvScan(int nAction,int *pnMin)
{
	struct BurnArea ba;

	if (pnMin) {
		*pnMin = 0x029521;
	}

	if (nAction & ACB_VOLATILE) {		
		memset(&ba, 0, sizeof(ba));

		ba.Data	  = Rom + 0xe000;
		ba.nLen	  = 0x2000;
		ba.szName = "All Ram";
		BurnAcb(&ba);

		CZetScan(nAction);

		SCAN_VAR(scroll_x);
		SCAN_VAR(priority);
		SCAN_VAR(flipscreen);
		SCAN_VAR(interrupt_enable);
	}

	return 0;
}
*/
// Bank Panic

static struct BurnRomInfo bankpRomDesc[] = {
	{ "epr6175.bin",       0x4000, 0x044552b8, 1 | BRF_ESS | BRF_PRG },    //  0 Z80 Code	
	{ "epr6174.bin",       0x4000, 0xd29b1598, 1 | BRF_ESS | BRF_PRG },    //  1	
	{ "epr6173.bin",       0x4000, 0xb8405d38, 1 | BRF_ESS | BRF_PRG },    //  2	
	{ "epr6176.bin",       0x2000, 0xc98ac200, 1 | BRF_ESS | BRF_PRG },    //  3	

	{ "epr6165.bin",       0x2000, 0xaef34a93, 2 | BRF_GRA },	       //  4 Playfield #1 chars
	{ "epr6166.bin",       0x2000, 0xca13cb11, 2 | BRF_GRA },	       //  5

	{ "epr6172.bin",       0x2000, 0xc4c4878b, 3 | BRF_GRA },	       //  6 Playfield #2 chars
	{ "epr6171.bin",       0x2000, 0xa18165a1, 3 | BRF_GRA },	       //  7
	{ "epr6170.bin",       0x2000, 0xb58aa8fa, 3 | BRF_GRA },	       //  8
	{ "epr6169.bin",       0x2000, 0x1aa37fce, 3 | BRF_GRA },	       //  9
	{ "epr6168.bin",       0x2000, 0x05f3a867, 3 | BRF_GRA },	       // 10
	{ "epr6167.bin",       0x2000, 0x3fa337e1, 3 | BRF_GRA },	       // 11

	{ "pr6177.clr",        0x0020, 0xeb70c5ae, 4 | BRF_GRA },	       // 12 (unsigned int*)Palette
	{ "pr6178.clr",        0x0100, 0x0acca001, 4 | BRF_GRA },	       // 13 Charset #1 lut
	{ "pr6179.clr",        0x0100, 0xe53bafdb, 4 | BRF_GRA },	       // 14 Charset #2 lut

	{ "3155074.2c",   0x025b, 0x2e57bbba, 0 | BRF_OPT },	       // 15
//	{ "3155073.pal16l4",  0x0001, 0x00000000, 0 | BRF_OPT | BRF_NODUMP }, // 16 read protected
};

STD_ROM_PICK(bankp)
STD_ROM_FN(bankp)

struct BurnDriver BurnDrvbankp = {
	"bankp", NULL, NULL, "1984",
	"Bank Panic\0", NULL, "[Sanritsu] Sega", "Misc",
	NULL, NULL, NULL, NULL,
	BDF_GAME_WORKING, 2, HARDWARE_MISC_PRE90S, GBF_MISC, 0,
	NULL, bankpRomInfo, bankpRomName, bankpInputInfo, bankpDIPInfo,
	DrvInit, DrvExit, DrvFrame, DrvDraw, NULL/*DrvScan*/, 0, NULL, NULL, NULL, NULL, 
	224, 224, 4, 3
};

// Combat Hawk

static struct BurnRomInfo combhRomDesc[] = {
	{ "epr10904.7e",      0x4000, 0x4b106335, 1 | BRF_ESS | BRF_PRG },    //  0 Z80 Code	
	{ "epr10905.7f",      0x4000, 0xa76fc390, 1 | BRF_ESS | BRF_PRG },    //  1	
	{ "epr10906.7h",      0x4000, 0x16d54885, 1 | BRF_ESS | BRF_PRG },    //  2	
	{ "epr10903.7d",      0x2000, 0xb7a59cab, 1 | BRF_ESS | BRF_PRG },    //  3	

	{ "epr10914.5l",      0x2000, 0x7d7a2340, 2 | BRF_GRA },	       //  4 Playfield #1 chars
	{ "epr10913.5k",      0x2000, 0xd5c1a8ae, 2 | BRF_GRA },	       //  5

	{ "epr10907.5b",      0x2000, 0x08e5eea3, 3 | BRF_GRA },	       //  6 Playfield #2 chars
	{ "epr10908.5d",      0x2000, 0xd9e413f5, 3 | BRF_GRA },	       //  7
	{ "epr10909.5e",      0x2000, 0xfec7962c, 3 | BRF_GRA },	       //  8
	{ "epr10910.5f",      0x2000, 0x33db0fa7, 3 | BRF_GRA },	       //  9
	{ "epr10911.5h",      0x2000, 0x565d9e6d, 3 | BRF_GRA },	       // 10
	{ "epr10912.5i",      0x2000, 0xcbe22738, 3 | BRF_GRA },	       // 11

	{ "pr10900.8a",       0x0020, 0xf95fcd66, 4 | BRF_GRA },	       // 12 (unsigned int*)Palette
	{ "pr10901.6f",       0x0100, 0x6fd981c8, 4 | BRF_GRA },	       // 13 Charset #1 lut
	{ "pr10902.5a",       0x0100, 0x84d6bded, 4 | BRF_GRA },	       // 14 Charset #2 lut

	{ "3155074.2c",   0x025b, 0x2e57bbba, 0 | BRF_OPT },	       // 15
//	{ "3155073.pal16l4",  0x0001, 0x00000000, 0 | BRF_OPT | BRF_NODUMP }, // 16 read protected
};

STD_ROM_PICK(combh)
STD_ROM_FN(combh)

struct BurnDriver BurnDrvcombh = {
	"combh", NULL, NULL, "1987",
	"Combat Hawk\0", NULL, "Sega / Sanritsu", "Misc",
	NULL, NULL, NULL, NULL,
	BDF_GAME_WORKING | BDF_ORIENTATION_VERTICAL, 2, HARDWARE_MISC_PRE90S, GBF_MISC, 0,
	NULL, combhRomInfo, combhRomName, combhInputInfo, combhDIPInfo,
	DrvInit, DrvExit, DrvFrame, DrvDraw, NULL/*DrvScan*/, 0, NULL, NULL, NULL, NULL, 0x100,
	224, 224, 3, 4
};