summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/drivers/skylncr.c
blob: 8937a77169e3ca1de26416da6f6d11d0caa45eb7 (plain) (tree)
1
2
3
4

                                                                                                              
                        
 





















                                                                                                              
                                        
 


                                                                                                              


                                                               
                
                        
                         
                            
                          
 



                                          

                                                                                       
 





















                                     
  




                                       


                                           
                                                                             

                                                       



                                           
                                                                             

                                                       

 
 

                                     
                                                                    
                                                                                               


                                                    
                                            
 
                                                                    
                                                                                                                 
                                                    

 
                                            
 
                                                                    
                                                                                                                 
                                                    

 
                                            
 
                                                                    
                                                                                                                 


                                                    
                                            
 
                                                                    
                                                                                                                 
                                                    

 
 

                             
                                                                    
 
                                                                                                          
 



                                                                                                                  
 


                                                               
 


                                                                

 
                                                      

 
                                     


                                                                         

 
                               
 
                                                                              

              
                                       
                                                                     


                             


                                                                                         

         


                                                                     

 
                                                           


                 
                                      
 
                                                                             

                                                                 

 
                                      
 
                                                                             

                                                                 

 
                                      
 
                                                                             

                                                                 

 
                                      
 
                                                                             

                                                                 

 
                                          
 
                                                                             

                                                                 

 
                                          
 
                                                                             

                                                                 

 
                                          
 
                                                                             

                                                                 

 
                                          
 
                                                                             

                                                                 


 

                                             
                                                                             


                        
                                      



                          
                                                                              
 


                                                                                       



                                        

                                                                                           




                                              
                                                                             


                        
                                       



                          
                                                                                
 


                                                                                         



                                        

                                                                                                    


         

                                      
                                                                             
                                            



                                      
                                                                             
                                            



                                      
                                                                             
                                            



                                      
                                                                             
                                            


 





                                       
                                                           















                                             
                                                                             
                                          






                                       
                                                          
                                       
                                                         
 

                                                                                                              
 







                                                                                                                        
 
                                                  
 
                                                                                                         







                                                            
                                                                                                         







                                                            
                                                                                                         







                                                            
                                                                                                         






                                                            




                                       
                                                    
                                     
 

                                                                                                 


                                                       

                                                                          







                                                              



                                        





















                                                    












                                                     


                                                                    






                         
                                                     
                         
                                                    







                                  




                                       
                                 
                                                                      
                                                                      
                                                              

             
 



                                    
                                   
                                                       
                                                      
                                                   
                                                      
                                                   
                                                      



                                                   
                                                       
                                                      
                                                   
                                                                                                   
                                                   
                                                                     



                                                   
                                                       





                                                                                                    
                                                    
                                                                                
 
                                                       
                                                   
                                                                                            
                                                                           



                                                                      
                                                          
 
                                                       





















                                                          
                                        
 

                                                       




                                                      







                                                  


                                                      















                                                         





                                                      























                                                            








                                                      

               
 






                                                





                                                                                  

                                           





                                                                                  







                                   
                                             
 

                             



                                 





                                                        
                                                                              
                                                                                           

 




                                      
                                                     

                                    



                                                               
 
                                     
 
                                         

                                                        
 
                            





                                                       
                                   
 

                                  
 
                                 

                            



                                                       
                  
 



                                   
  
 



























                                                
                    
                                           

                                                                                                                
                                        

                                                                                                                
                                        


                                                                                                                
                    
                                           














                                                                                                                    






























                                                
                                           


                                                                                                               












                                                                                                                       
                                           






                                                                                                                             

                                        



                                                                                                                             


       



                                   

                             

                                                                                      


 


                                                     
 



                                                                                                                                        
                                                                                                                                                 
/*************************************************************************************************************

    Sky Lancer / Mad Zoo

    Original preliminary driver by Luca Elia.
    Additional Work: Roberto Fresca & David Haywood.


**************************************************************************************************************

    Notes:

    - Some of the tiles look badly scaled down, and others appear to have columns swapped.
      This might actually be correct.

    - Skylncr and madzoo can run with the same program roms, they're basically graphics swaps.

    - To enter the Service Mode, press F2. All the game settings are there.
      Change regular values using DIP switches, and jackpot value using STOP2 and STOP3.
      To exit the mode, press START. You must reset the machine (F3) to update the changes.

    - Press key 0 to navigate between statistics pages. Press START to exit the mode.


    TODO:

    - Proper M5M82C255 device emulation.


*************************************************************************************************************/


#define MASTER_CLOCK		XTAL_12MHz	/* confirmed */

#include "emu.h"
#include "cpu/z80/z80.h"
#include "sound/ay8910.h"
#include "machine/8255ppi.h"
#include "machine/nvram.h"


class skylncr_state : public driver_device
{
public:
	skylncr_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag) { }

	tilemap_t *m_tmap;
	UINT8 *m_videoram;
	UINT8 *m_colorram;
	UINT8* m_reeltiles_1_ram;
	UINT8* m_reeltiles_2_ram;
	UINT8* m_reeltiles_3_ram;
	UINT8* m_reeltiles_4_ram;
	UINT8* m_reeltileshigh_1_ram;
	UINT8* m_reeltileshigh_2_ram;
	UINT8* m_reeltileshigh_3_ram;
	UINT8* m_reeltileshigh_4_ram;
	tilemap_t *m_reel_1_tilemap;
	tilemap_t *m_reel_2_tilemap;
	tilemap_t *m_reel_3_tilemap;
	tilemap_t *m_reel_4_tilemap;
	UINT8* m_reelscroll1;
	UINT8* m_reelscroll2;
	UINT8* m_reelscroll3;
	UINT8* m_reelscroll4;
	UINT8 m_nmi_enable;
	int m_color;
	int m_color2;
};


/**************************************
*           Video Hardware            *
**************************************/

static WRITE8_HANDLER( skylncr_videoram_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_videoram[offset] = data;
	tilemap_mark_tile_dirty(state->m_tmap, offset);
}

static WRITE8_HANDLER( skylncr_colorram_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_colorram[offset] = data;
	tilemap_mark_tile_dirty(state->m_tmap, offset);
}


static TILE_GET_INFO( get_tile_info )
{
	skylncr_state *state = machine.driver_data<skylncr_state>();
	UINT16 code = state->m_videoram[ tile_index ] + (state->m_colorram[ tile_index ] << 8);
	SET_TILE_INFO(0, code, 0, TILE_FLIPYX( 0 ));
}

static TILE_GET_INFO( get_reel_1_tile_info )
{
	skylncr_state *state = machine.driver_data<skylncr_state>();
	UINT16 code = state->m_reeltiles_1_ram[ tile_index ] + (state->m_reeltileshigh_1_ram[ tile_index ] << 8);
	SET_TILE_INFO(1, code, 0, TILE_FLIPYX( 0 ));
}

static TILE_GET_INFO( get_reel_2_tile_info )
{
	skylncr_state *state = machine.driver_data<skylncr_state>();
	UINT16 code = state->m_reeltiles_2_ram[ tile_index ] + (state->m_reeltileshigh_2_ram[ tile_index ] << 8);
	SET_TILE_INFO(1, code, 0, TILE_FLIPYX( 0 ));
}

static TILE_GET_INFO( get_reel_3_tile_info )
{
	skylncr_state *state = machine.driver_data<skylncr_state>();
	UINT16 code = state->m_reeltiles_3_ram[ tile_index ] + (state->m_reeltileshigh_3_ram[ tile_index ] << 8);
	SET_TILE_INFO(1, code, 0, TILE_FLIPYX( 0 ));
}

static TILE_GET_INFO( get_reel_4_tile_info )
{
	skylncr_state *state = machine.driver_data<skylncr_state>();
	UINT16 code = state->m_reeltiles_4_ram[ tile_index ] + (state->m_reeltileshigh_4_ram[ tile_index ] << 8);
	SET_TILE_INFO(1, code, 0, TILE_FLIPYX( 0 ));
}


static VIDEO_START( skylncr )
{
	skylncr_state *state = machine.driver_data<skylncr_state>();

	state->m_tmap = tilemap_create(	machine, get_tile_info, tilemap_scan_rows, 8, 8, 0x40, 0x20	);

	state->m_reel_1_tilemap = tilemap_create(machine, get_reel_1_tile_info, tilemap_scan_rows, 8, 32, 64, 8 );
	state->m_reel_2_tilemap = tilemap_create(machine, get_reel_2_tile_info, tilemap_scan_rows, 8, 32, 64, 8 );
	state->m_reel_3_tilemap = tilemap_create(machine, get_reel_3_tile_info, tilemap_scan_rows, 8, 32, 64, 8 );
	state->m_reel_4_tilemap = tilemap_create(machine, get_reel_4_tile_info, tilemap_scan_rows, 8, 32, 64, 8 );

	tilemap_set_scroll_cols(state->m_reel_2_tilemap, 0x40);
	tilemap_set_scroll_cols(state->m_reel_3_tilemap, 0x40);
	tilemap_set_scroll_cols(state->m_reel_4_tilemap, 0x40);

	tilemap_set_transparent_pen(state->m_reel_2_tilemap, 0);
	tilemap_set_transparent_pen(state->m_reel_3_tilemap, 0);
	tilemap_set_transparent_pen(state->m_reel_4_tilemap, 0);


	tilemap_set_transparent_pen(state->m_tmap, 0);
}

// are these hardcoded, or registers?
static const rectangle visible1 = { 0*8, (20+48)*8-1,  4*8,  (4+7)*8-1 };
static const rectangle visible2 = { 0*8, (20+48)*8-1, 12*8, (12+7)*8-1 };
static const rectangle visible3 = { 0*8, (20+48)*8-1, 20*8, (20+7)*8-1 };


static SCREEN_UPDATE( skylncr )
{
	skylncr_state *state = screen->machine().driver_data<skylncr_state>();
	int i;

	bitmap_fill(bitmap,cliprect,0);
	tilemap_draw(bitmap,cliprect, state->m_reel_1_tilemap, 0, 0);

	for (i= 0;i < 64;i++)
	{
		tilemap_set_scrolly(state->m_reel_2_tilemap, i, state->m_reelscroll2[i]);
		tilemap_set_scrolly(state->m_reel_3_tilemap, i, state->m_reelscroll3[i]);
		tilemap_set_scrolly(state->m_reel_4_tilemap, i, state->m_reelscroll4[i]);
	}

	tilemap_draw(bitmap,&visible1,state->m_reel_2_tilemap, 0, 0);
	tilemap_draw(bitmap,&visible2,state->m_reel_3_tilemap, 0, 0);
	tilemap_draw(bitmap,&visible3,state->m_reel_4_tilemap, 0, 0);


	tilemap_draw(bitmap,cliprect, state->m_tmap, 0, 0);
	return 0;
}

static WRITE8_HANDLER( reeltiles_1_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltiles_1_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_1_tilemap, offset);
}

static WRITE8_HANDLER( reeltiles_2_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltiles_2_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_2_tilemap, offset);
}

static WRITE8_HANDLER( reeltiles_3_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltiles_3_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_3_tilemap, offset);
}

static WRITE8_HANDLER( reeltiles_4_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltiles_4_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_4_tilemap, offset);
}

static WRITE8_HANDLER( reeltileshigh_1_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltileshigh_1_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_1_tilemap, offset);
}

static WRITE8_HANDLER( reeltileshigh_2_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltileshigh_2_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_2_tilemap, offset);
}

static WRITE8_HANDLER( reeltileshigh_3_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltileshigh_3_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_3_tilemap, offset);
}

static WRITE8_HANDLER( reeltileshigh_4_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reeltileshigh_4_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_reel_4_tilemap, offset);
}


static WRITE8_HANDLER( skylncr_paletteram_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();

	if (offset == 0)
	{
		state->m_color = data;
	}
	else
	{
		int r,g,b;
		space->machine().generic.paletteram.u8[state->m_color] = data;

		r = space->machine().generic.paletteram.u8[(state->m_color/3 * 3) + 0];
		g = space->machine().generic.paletteram.u8[(state->m_color/3 * 3) + 1];
		b = space->machine().generic.paletteram.u8[(state->m_color/3 * 3) + 2];
		r = (r << 2) | (r >> 4);
		g = (g << 2) | (g >> 4);
		b = (b << 2) | (b >> 4);

		palette_set_color(space->machine(), state->m_color / 3, MAKE_RGB(r, g, b));
		state->m_color = (state->m_color + 1) % (0x100 * 3);
	}
}

static WRITE8_HANDLER( skylncr_paletteram2_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();

	if (offset == 0)
	{
		state->m_color2 = data;
	}
	else
	{
		int r,g,b;
		space->machine().generic.paletteram2.u8[state->m_color2] = data;

		r = space->machine().generic.paletteram2.u8[(state->m_color2/3 * 3) + 0];
		g = space->machine().generic.paletteram2.u8[(state->m_color2/3 * 3) + 1];
		b = space->machine().generic.paletteram2.u8[(state->m_color2/3 * 3) + 2];
		r = (r << 2) | (r >> 4);
		g = (g << 2) | (g >> 4);
		b = (b << 2) | (b >> 4);

		palette_set_color(space->machine(), 0x100 + state->m_color2 / 3, MAKE_RGB(r, g, b));
		state->m_color2 = (state->m_color2 + 1) % (0x100 * 3);
	}
}

static WRITE8_HANDLER( reelscroll1_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reelscroll1[offset] = data;
}

static WRITE8_HANDLER( reelscroll2_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reelscroll2[offset] = data;
}

static WRITE8_HANDLER( reelscroll3_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reelscroll3[offset] = data;
}

static WRITE8_HANDLER( reelscroll4_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_reelscroll4[offset] = data;
}


/************************************
*         Other Handlers            *
************************************/

static WRITE8_HANDLER( skylncr_coin_w )
{
	coin_counter_w( space->machine(), 0, data & 0x04 );
}

static READ8_HANDLER( ret_ff )
{
	return 0xff;
}

#ifdef UNUSED_FUNCTION
static READ8_HANDLER( ret_00 )
{
	return 0x00;
}
#endif

static WRITE8_HANDLER( skylncr_nmi_enable_w )
{
	skylncr_state *state = space->machine().driver_data<skylncr_state>();
	state->m_nmi_enable = data & 0x10;
}


/**************************************
*             Memory Map              *
**************************************/

static ADDRESS_MAP_START( mem_map_skylncr, AS_PROGRAM, 8 )
	AM_RANGE(0x0000, 0x7fff) AM_ROM
	AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("nvram")

	AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE( skylncr_videoram_w ) AM_BASE_MEMBER(skylncr_state, m_videoram )
	AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE( skylncr_colorram_w ) AM_BASE_MEMBER(skylncr_state, m_colorram )

	AM_RANGE(0x9800, 0x99ff) AM_RAM_WRITE( reeltiles_1_w ) AM_BASE_MEMBER(skylncr_state, m_reeltiles_1_ram )
	AM_RANGE(0x9a00, 0x9bff) AM_RAM_WRITE( reeltiles_2_w ) AM_BASE_MEMBER(skylncr_state, m_reeltiles_2_ram )
	AM_RANGE(0x9c00, 0x9dff) AM_RAM_WRITE( reeltiles_3_w ) AM_BASE_MEMBER(skylncr_state, m_reeltiles_3_ram )
	AM_RANGE(0x9e00, 0x9fff) AM_RAM_WRITE( reeltiles_4_w ) AM_BASE_MEMBER(skylncr_state, m_reeltiles_4_ram )
	AM_RANGE(0xa000, 0xa1ff) AM_RAM_WRITE( reeltileshigh_1_w ) AM_BASE_MEMBER(skylncr_state, m_reeltileshigh_1_ram )
	AM_RANGE(0xa200, 0xa3ff) AM_RAM_WRITE( reeltileshigh_2_w ) AM_BASE_MEMBER(skylncr_state, m_reeltileshigh_2_ram )
	AM_RANGE(0xa400, 0xa5ff) AM_RAM_WRITE( reeltileshigh_3_w ) AM_BASE_MEMBER(skylncr_state, m_reeltileshigh_3_ram )
	AM_RANGE(0xa600, 0xa7ff) AM_RAM_WRITE( reeltileshigh_4_w ) AM_BASE_MEMBER(skylncr_state, m_reeltileshigh_4_ram )

	AM_RANGE(0xaa55, 0xaa55) AM_READ( ret_ff )

	AM_RANGE(0xb000, 0xb03f) AM_RAM_WRITE(reelscroll1_w) AM_BASE_MEMBER(skylncr_state, m_reelscroll1)
	AM_RANGE(0xb040, 0xb07f) AM_RAM_WRITE(reelscroll1_w)
	AM_RANGE(0xb080, 0xb0bf) AM_RAM_WRITE(reelscroll1_w)
	AM_RANGE(0xb0c0, 0xb0ff) AM_RAM_WRITE(reelscroll1_w)
	AM_RANGE(0xb100, 0xb13f) AM_RAM_WRITE(reelscroll1_w)
	AM_RANGE(0xb140, 0xb17f) AM_RAM_WRITE(reelscroll1_w)
	AM_RANGE(0xb180, 0xb1bf) AM_RAM_WRITE(reelscroll1_w)
	AM_RANGE(0xb1c0, 0xb1ff) AM_RAM_WRITE(reelscroll1_w)

	AM_RANGE(0xb200, 0xb23f) AM_RAM_WRITE(reelscroll2_w) AM_BASE_MEMBER(skylncr_state, m_reelscroll2)
	AM_RANGE(0xb240, 0xb27f) AM_RAM_WRITE(reelscroll2_w)
	AM_RANGE(0xb280, 0xb2bf) AM_RAM_WRITE(reelscroll2_w)
	AM_RANGE(0xb2c0, 0xb2ff) AM_RAM_WRITE(reelscroll2_w)
	AM_RANGE(0xb300, 0xb33f) AM_RAM_WRITE(reelscroll2_w)
	AM_RANGE(0xb340, 0xb37f) AM_RAM_WRITE(reelscroll2_w)
	AM_RANGE(0xb380, 0xb3bf) AM_RAM_WRITE(reelscroll2_w)
	AM_RANGE(0xb3c0, 0xb3ff) AM_RAM_WRITE(reelscroll2_w)

	AM_RANGE(0xb400, 0xb43f) AM_RAM_WRITE(reelscroll3_w) AM_BASE_MEMBER(skylncr_state, m_reelscroll3)
	AM_RANGE(0xb440, 0xb47f) AM_RAM_WRITE(reelscroll3_w)
	AM_RANGE(0xb480, 0xb4bf) AM_RAM_WRITE(reelscroll3_w)
	AM_RANGE(0xb4c0, 0xb4ff) AM_RAM_WRITE(reelscroll3_w)
	AM_RANGE(0xb500, 0xb53f) AM_RAM_WRITE(reelscroll3_w)
	AM_RANGE(0xb540, 0xb57f) AM_RAM_WRITE(reelscroll3_w)
	AM_RANGE(0xb580, 0xb5bf) AM_RAM_WRITE(reelscroll3_w)
	AM_RANGE(0xb5c0, 0xb5ff) AM_RAM_WRITE(reelscroll3_w)

	AM_RANGE(0xb600, 0xb63f) AM_RAM_WRITE(reelscroll4_w) AM_BASE_MEMBER(skylncr_state, m_reelscroll4)
	AM_RANGE(0xb640, 0xb67f) AM_RAM_WRITE(reelscroll4_w)
	AM_RANGE(0xb680, 0xb6bf) AM_RAM_WRITE(reelscroll4_w)
	AM_RANGE(0xb6c0, 0xb6ff) AM_RAM_WRITE(reelscroll4_w)
	AM_RANGE(0xb700, 0xb73f) AM_RAM_WRITE(reelscroll4_w)
	AM_RANGE(0xb740, 0xb77f) AM_RAM_WRITE(reelscroll4_w)
	AM_RANGE(0xb780, 0xb7bf) AM_RAM_WRITE(reelscroll4_w)
	AM_RANGE(0xb7c0, 0xb7ff) AM_RAM_WRITE(reelscroll4_w)

	AM_RANGE(0xc000, 0xffff) AM_ROM
ADDRESS_MAP_END


static ADDRESS_MAP_START( io_map_skylncr, AS_IO, 8 )
	ADDRESS_MAP_GLOBAL_MASK(0xff)

	AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("ppi8255_0", ppi8255_r, ppi8255_w)	/* Input Ports */
	AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("ppi8255_1", ppi8255_r, ppi8255_w)	/* Input Ports */

	AM_RANGE(0x20, 0x20) AM_WRITE( skylncr_coin_w )

	AM_RANGE(0x30, 0x31) AM_DEVWRITE( "aysnd", ay8910_address_data_w )
	AM_RANGE(0x31, 0x31) AM_DEVREAD( "aysnd", ay8910_r )

	AM_RANGE(0x40, 0x41) AM_WRITE( skylncr_paletteram_w )
	AM_RANGE(0x50, 0x51) AM_WRITE( skylncr_paletteram2_w )

	AM_RANGE(0x70, 0x70) AM_WRITE( skylncr_nmi_enable_w )
ADDRESS_MAP_END


/***************************************
*           Graphics Layouts           *
***************************************/

static const gfx_layout layout8x8x8 =
{
	8,8,
	RGN_FRAC(1,2),
	8,
	{ STEP8(0,1) },
	{
		8*0,8*1,
		RGN_FRAC(1,2)+8*0,RGN_FRAC(1,2)+8*1,
		8*2,8*3,
		RGN_FRAC(1,2)+8*2,RGN_FRAC(1,2)+8*3
	},
	{ STEP8(0,8*4) },
	8*8*4
};

static const gfx_layout layout8x32x8 =
{
	8,32,
	RGN_FRAC(1,2),
	8,
	{ STEP8(0,1) },
	{
		8*0, 8*1,
		RGN_FRAC(1,2)+8*0, RGN_FRAC(1,2)+8*1,
		8*2, 8*3,
		RGN_FRAC(1,2)+8*2, RGN_FRAC(1,2)+8*3
	},
	{
		STEP16(0,8*4),
		STEP16(16*8*4,8*4)
	},
	8*32*8/2
};

/* this will decode the big x2 x3 'correctly' however, maybe they're
   simply not meant to appear correct? */
static const gfx_layout layout8x32x8_rot =
{
	8,32,
	RGN_FRAC(1,2),
	8,
	{ STEP8(0,1) },
	{
		8*0, 8*1,
		RGN_FRAC(1,2)+8*1, RGN_FRAC(1,2)+8*0,
		8*2, 8*3,
		RGN_FRAC(1,2)+8*3, RGN_FRAC(1,2)+8*2
	},
	{
		STEP16(0,8*4),
		STEP16(16*8*4,8*4)
	},
	8*32*8/2
};


/**************************************
*           Graphics Decode           *
**************************************/

static GFXDECODE_START( skylncr )
	GFXDECODE_ENTRY( "gfx1", 0, layout8x8x8,		0, 2 )
	GFXDECODE_ENTRY( "gfx2", 0, layout8x32x8,		0, 2 )
	GFXDECODE_ENTRY( "gfx2", 0, layout8x32x8_rot,	0, 2 )
GFXDECODE_END


/***********************************
*           Input Ports            *
***********************************/

static INPUT_PORTS_START( skylncr )
	PORT_START("IN1")	/* $00 (PPI0 port A) */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SLOT_STOP2)
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP1)
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SLOT_STOP3)
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)

	PORT_START("IN2")	/* $01 (PPI0 port B) */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BET)
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Option 2 (D-UP)") PORT_CODE(KEYCODE_S)
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1) PORT_NAME("Start")
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)

	PORT_START("IN3")	/* $11 (PPI1 port B) */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2)
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2)
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(2)
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Option 1 (D-UP)") PORT_CODE(KEYCODE_A)
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE ) PORT_NAME("Take Score")

	PORT_START("IN4")	/* $12 (PPI1 port C) */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset")
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) PORT_NAME("Stats")
	PORT_SERVICE_NO_TOGGLE( 0x08, IP_ACTIVE_LOW )	/* Settings */
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )

	PORT_START("DSW1")	/* $02 (PPI0 port C) */
	PORT_DIPNAME( 0x11, 0x01, "D-UP Percentage" )
	PORT_DIPSETTING(    0x11, "60%" )
	PORT_DIPSETTING(    0x01, "70%" )
	PORT_DIPSETTING(    0x10, "80%" )
	PORT_DIPSETTING(    0x00, "90%" )
	PORT_DIPNAME( 0x0e, 0x0e, "Main Game Percentage" )
	PORT_DIPSETTING(    0x0e, "75%" )
	PORT_DIPSETTING(    0x0c, "78%" )
	PORT_DIPSETTING(    0x0a, "81%" )
	PORT_DIPSETTING(    0x08, "84%" )
	PORT_DIPSETTING(    0x06, "87%" )
	PORT_DIPSETTING(    0x04, "90%" )
	PORT_DIPSETTING(    0x02, "93%" )
	PORT_DIPSETTING(    0x00, "96%" )
	PORT_DIPNAME( 0x20, 0x20, "Reels Speed" )
	PORT_DIPSETTING(    0x20, "Slow" )
	PORT_DIPSETTING(    0x00, "Fast" )
	PORT_DIPNAME( 0x40, 0x40, "Bonus Score" )
	PORT_DIPSETTING(    0x40, "32" )
	PORT_DIPSETTING(    0x00, "24" )
	PORT_DIPNAME( 0x80, 0x00, "Key Out" )
	PORT_DIPSETTING(    0x80, "x100" )
	PORT_DIPSETTING(    0x00, "x1" )

	PORT_START("DSW2")	/* $10 (PPI1 port A) */
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, "Double-Up" )
	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
	PORT_DIPSETTING(    0x04, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x18, 0x08, "Payout Limit" )
	PORT_DIPSETTING(    0x00, "0" )
	PORT_DIPSETTING(    0x08, "5000" )
	PORT_DIPSETTING(    0x10, "2000" )
	PORT_DIPSETTING(    0x18, "1000" )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0xc0, 0xc0, "Clown Percentage" )
	PORT_DIPSETTING(    0xc0, "60%" )
	PORT_DIPSETTING(    0x80, "70%" )
	PORT_DIPSETTING(    0x40, "80%" )
	PORT_DIPSETTING(    0x00, "90%" )

	PORT_START("DSW3")	/* AY8910 port A */
	PORT_DIPNAME( 0x07, 0x07, "Coinage A, B & C" )
	PORT_DIPSETTING(    0x00, "1 Coin / 1 Credit" )
	PORT_DIPSETTING(    0x01, "1 Coin / 5 Credits" )
	PORT_DIPSETTING(    0x02, "1 Coin / 10 Credits" )
	PORT_DIPSETTING(    0x03, "1 Coin / 20 Credits" )
	PORT_DIPSETTING(    0x04, "1 Coin / 30 Credits" )
	PORT_DIPSETTING(    0x05, "1 Coin / 40 Credits" )
	PORT_DIPSETTING(    0x06, "1 Coin / 50 Credits" )
	PORT_DIPSETTING(    0x07, "1 Coin / 100 Credit" )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, "Max Win Bonus" )
	PORT_DIPSETTING(    0x20, "10000" )
	PORT_DIPSETTING(    0x00, "20000" )
	PORT_DIPNAME( 0xc0, 0xc0, "Minimum Bet" )
	PORT_DIPSETTING(    0xc0, "0" )
	PORT_DIPSETTING(    0x80, "8" )
	PORT_DIPSETTING(    0x40, "16" )
	PORT_DIPSETTING(    0x00, "32" )

	PORT_START("DSW4")	/* AY8910 port B */
	PORT_DIPNAME( 0x07, 0x07, "Remote Credits" )
	PORT_DIPSETTING(    0x00, "1 Pulse / 100 Credits" )
	PORT_DIPSETTING(    0x01, "1 Pulse / 110 Credits" )
	PORT_DIPSETTING(    0x02, "1 Pulse / 120 Credits" )
	PORT_DIPSETTING(    0x03, "1 Pulse / 130 Credits" )
	PORT_DIPSETTING(    0x04, "1 Pulse / 200 Credits" )
	PORT_DIPSETTING(    0x05, "1 Pulse / 400 Credits" )
	PORT_DIPSETTING(    0x06, "1 Pulse / 500 Credits" )
	PORT_DIPSETTING(    0x07, "1 Pulse / 1000 Credits" )
	PORT_DIPNAME( 0x18, 0x00, "Max Bet" )
	PORT_DIPSETTING(    0x18, "32" )
	PORT_DIPSETTING(    0x10, "64" )
	PORT_DIPSETTING(    0x08, "72" )
	PORT_DIPSETTING(    0x00, "80" )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
INPUT_PORTS_END


/**************************************
*       PPI 8255 (x2) Interface       *
**************************************/

static const ppi8255_interface ppi8255_intf[2] =
{
	{	/* A, B & C set as input */
		DEVCB_INPUT_PORT("IN1"),	/* Port A read */
		DEVCB_INPUT_PORT("IN2"),	/* Port B read */
		DEVCB_INPUT_PORT("DSW1"),	/* Port C read */
		DEVCB_NULL,					/* Port A write */
		DEVCB_NULL,					/* Port B write */
		DEVCB_NULL					/* Port C write */
	},
	{	/* A, B & C set as input */
		DEVCB_INPUT_PORT("DSW2"),	/* Port A read */
		DEVCB_INPUT_PORT("IN3"),	/* Port B read */
		DEVCB_INPUT_PORT("IN4"),	/* Port C read */
		DEVCB_NULL,					/* Port A write */
		DEVCB_NULL,					/* Port B write */
		DEVCB_NULL					/* Port C write */
	}
};


/**********************************
*       AY-3-8910 Interface       *
**********************************/

static const ay8910_interface ay8910_config =
{
	AY8910_LEGACY_OUTPUT,
	AY8910_DEFAULT_LOADS,
	DEVCB_INPUT_PORT("DSW3"),
	DEVCB_INPUT_PORT("DSW4"),
	DEVCB_NULL,
	DEVCB_NULL
};


// It runs in IM 0, thus needs an opcode on the data bus
static INTERRUPT_GEN( skylncr_vblank_interrupt )
{
	skylncr_state *state = device->machine().driver_data<skylncr_state>();
	if (state->m_nmi_enable) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
}


/*************************************
*           Machine Driver           *
*************************************/

static MACHINE_CONFIG_START( skylncr, skylncr_state )

	/* basic machine hardware */
	MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/4)
	MCFG_CPU_PROGRAM_MAP(mem_map_skylncr)
	MCFG_CPU_IO_MAP(io_map_skylncr)
	MCFG_CPU_VBLANK_INT("screen", skylncr_vblank_interrupt)

	MCFG_NVRAM_ADD_0FILL("nvram")

	/* 1x M5M82C255, or 2x PPI8255 */
	MCFG_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] )
	MCFG_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] )

	/* video hardware */
	MCFG_SCREEN_ADD("screen", RASTER)
	MCFG_SCREEN_REFRESH_RATE(60)
	MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
	MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
	MCFG_SCREEN_SIZE(512, 256)
	MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
	MCFG_SCREEN_UPDATE(skylncr)

	MCFG_GFXDECODE(skylncr)
	MCFG_PALETTE_LENGTH(0x200)

	MCFG_VIDEO_START(skylncr)

	/* sound hardware */
	MCFG_SPEAKER_STANDARD_MONO("mono")
	MCFG_SOUND_ADD("aysnd", AY8910, MASTER_CLOCK/8)
	MCFG_SOUND_CONFIG(ay8910_config)
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END


/**********************************
*            ROM Load             *
**********************************/
/*

Sky Lancer PCB Layout
---------------------

  |--------------------------------------------|
 _|                          ROM.U33           |
|                                              |
|                            ROM.U32           |
|    WF19054                                   |
|                                              |
|_                                             |
  |                                  6264      |
  |                     |------|     6116      |
 _|           DSW4(8)   |ACTEL |               |
|             DSW3(8)   |A1010B|               |
|             DSW2(8)   |      |          6264 |
|             DSW1(8)   |------|               |
|                                         6264 |
|    M5M82C255                                 |
|                                              |
|       ROM.U35                                |
|3.6V_BATT                                     |
|_          6116              Z80        12MHz |
  |--------------------------------------------|
Notes:
      Z80 @ 3.0MHz [12/4]
      WF19054 = AY-3-8910 @ 1.5MHz [12/8]
*/

ROM_START( skylncr )
	ROM_REGION( 0x80000, "maincpu", 0 )
	ROM_LOAD( "27512.u35",  0x00000, 0x10000, CRC(98b1c9fe) SHA1(9ca1706d25038a078fb07ba5c2e6681ed468bc88) )

	ROM_REGION( 0x80000, "gfx1", 0 )
	ROM_LOAD( "574200.u32", 0x00000, 0x80000, CRC(b36f11fe) SHA1(1d8660ac1ca44e33976ac14210e4a3a201f8f3c4) )

	ROM_REGION( 0x80000, "gfx2", 0 )
	ROM_LOAD( "574200.u33", 0x00000, 0x80000, CRC(19b25221) SHA1(2f32d337125a9fd0bc7f50713b05e564fd4f81b2) )
ROM_END

ROM_START( butrfly )
	ROM_REGION( 0x80000, "maincpu", 0 )
	ROM_LOAD( "butterfly.prg",  0x00000, 0x10000, CRC(b35b289c) SHA1(5a02bfb6e1fb608099b9f491c10795ef888a3b36) )

	ROM_REGION( 0x80000, "gfx1", 0 )
	ROM_LOAD16_BYTE( "u29", 0x00000, 0x20000, CRC(2ff775ea) SHA1(2219c75cbac2969485607446ab116587bdee7278) )
	ROM_LOAD16_BYTE( "u31", 0x00001, 0x20000, CRC(029d2214) SHA1(cf8256157db0b297ed457b3da6b6517907128843) )
	ROM_LOAD16_BYTE( "u33", 0x40000, 0x20000, CRC(37bad677) SHA1(c077f0c07b097b376a01e5637446e4c4f82d9e28) )
	ROM_LOAD16_BYTE( "u35", 0x40001, 0x20000, CRC(d14c7713) SHA1(c229ef64f3b0a04ff8e27bc56cff6a55ca34b80c) )

	ROM_REGION( 0x80000, "gfx2", 0 )
	ROM_LOAD16_BYTE( "u52", 0x00000, 0x20000, CRC(15051537) SHA1(086c38c05c605f297a7bc470eb51763a7648e72c) )
	ROM_LOAD16_BYTE( "u54", 0x00001, 0x20000, CRC(8e34d029) SHA1(ae316f2f34768938a07d62db110ce59d2751abaa) )
	ROM_LOAD16_BYTE( "u56", 0x40000, 0x20000, CRC(a53daaef) SHA1(7b88bb986bd5e47576163d6999f8770c720c5bfc) )
	ROM_LOAD16_BYTE( "u58", 0x40001, 0x20000, CRC(21ca47f8) SHA1(b192be06a2eb817776309580dc64fd76772a8d50) )
ROM_END

/*

Mad Zoo PCB Layout
------------------

|-----|  |------|  |---------------------------|
|     |--|      |--|ROM.U29           ROM.U52  |
|                                              |
| DSW3(8)           ROM.U31           ROM.U54  |
|    KC89C72                                   |
| DSW4(8)           ROM.U33           ROM.U56  |
|_                                             |
  |       PAL       ROM.U35           ROM.U58  |
  |                     |-------|              |
 _|                     |LATTICE|         6116 |
|             12MHz     |1016   |              |
|                       |       |         6116 |
|       8255            |-------|              |
|                                         6116 |
| DSW1(8)  DSW2(8)                             |
|       8255   PAL  ROM.U9                6116 |
|                                              |
|    6264      Z80  6116                  6116 |
|_   6264                          PAL  BATTERY|
  |--------------------------------------------|
Notes:
      Z80 @ 3.0MHz [12/4]
      KC89C72 = AY-3-8910 @ 1.5MHz [12/8]
*/

ROM_START( madzoo )
	ROM_REGION( 0x80000, "maincpu", 0 )
	ROM_LOAD( "27512.u9",  0x00000, 0x10000, CRC(98b1c9fe) SHA1(9ca1706d25038a078fb07ba5c2e6681ed468bc88) )

	ROM_REGION( 0x80000, "gfx1", 0 )
	ROM_LOAD16_BYTE( "27c301.u29", 0x00000, 0x20000, CRC(44645bb8) SHA1(efaf88d63e09029aa023ddaf72dbd9ee1df10315) )
	ROM_LOAD16_BYTE( "27c301.u31", 0x00001, 0x20000, CRC(58267dbc) SHA1(dd64e4b44d10e2d93ded255622891f058b2b8bb9) )
	ROM_LOAD16_BYTE( "27c301.u33", 0x40000, 0x20000, CRC(6adb1c2c) SHA1(d782a778a34e6240a3ae09cd11124790864a9149) )
	ROM_LOAD16_BYTE( "27c301.u35", 0x40001, 0x20000, CRC(a8d3a174) SHA1(b668bb1db1d27aff52e808aa9b972f24693161b3) )

	ROM_REGION( 0x80000, "gfx2", 0 )
	ROM_LOAD16_BYTE( "27c301.u52", 0x00000, 0x20000, CRC(dd1997ed) SHA1(9197a0b4a0b6284ae7eeb6364c87589f6f8a614d) )
	ROM_LOAD16_BYTE( "27c301.u54", 0x00001, 0x20000, CRC(a654a6df) SHA1(54292953df1103ad830e1f40fdf96c48e0e13be7) )
	ROM_LOAD16_BYTE( "27c301.u56", 0x40000, 0x20000, CRC(f2e3c394) SHA1(8e09516fe822d7c125be57b154c896ab3e024f98) )
	ROM_LOAD16_BYTE( "27c301.u58", 0x40001, 0x20000, CRC(65d2015b) SHA1(121494a2684276276e2504d6f853718e93f4d458) )
ROM_END

ROM_START( leader )
	ROM_REGION( 0x80000, "maincpu", 0 )
	ROM_LOAD( "leader.prg",  0x00000, 0x10000, CRC(1a6e1129) SHA1(639f687e7720bab89628b377dca0475f17a35041) )

	ROM_REGION( 0x80000, "gfx1", 0 )
	ROM_LOAD16_BYTE( "leadergfx1.dmp11", 0x00000, 0x20000, CRC(08acae31) SHA1(8b93066a2159e56607499fe1b1748a70a73a326c) )
	ROM_LOAD16_BYTE( "leadergfx1.dmp21", 0x00001, 0x20000, CRC(88cd7a49) SHA1(f7187c7e3e584180de03998f376001f8d5966882) )
	ROM_LOAD16_BYTE( "leadergfx1.dmp12", 0x40000, 0x20000, CRC(e57e145e) SHA1(3f6169ed1d907de3438787c02dc53c73ca6bdb73) )
	ROM_LOAD16_BYTE( "leadergfx1.dmp22", 0x40001, 0x20000, CRC(e8368d29) SHA1(19e7d7d6e320f5f06e91013cb4c92b3987dbe24e) )

	ROM_REGION( 0x80000, "gfx2", 0 )
	ROM_LOAD16_BYTE( "leadergfx2.dmp11", 0x00000, 0x20000, CRC(1d62edf4) SHA1(7ba43bf0d0d0cadd5c7fcbe940ecf3fab5c9127b) )
	ROM_LOAD16_BYTE( "leadergfx2.dmp21", 0x00001, 0x20000, CRC(57b9d159) SHA1(ee98aea160653d55017bd893cc253d23c7b1faf4) )
	ROM_LOAD16_BYTE( "leadergfx2.dmp12", 0x40000, 0x20000, CRC(91e73bf9) SHA1(90a9c1119ae05bbd66a4d3c2266ec02cc53969bd) )
	ROM_LOAD16_BYTE( "leadergfx2.dmp22", 0x40001, 0x20000, CRC(04cc0118) SHA1(016ccbe7daf8c4676830aadcc906a64e2826d11a) )
ROM_END


/**********************************
*           Driver Init           *
**********************************/

static DRIVER_INIT( skylncr )
{
	machine.generic.paletteram.u8   = auto_alloc_array(machine, UINT8, 0x100 * 3);
	machine.generic.paletteram2.u8 = auto_alloc_array(machine, UINT8, 0x100 * 3);
}


/****************************************************
*                  Game Drivers                     *
****************************************************/

/*    YEAR  NAME      PARENT   MACHINE   INPUT     INIT     ROT    COMPANY                 FULLNAME                            FLAGS  */
GAME( 1995, skylncr,  0,       skylncr,  skylncr,  skylncr, ROT0, "Bordun International", "Sky Lancer (Bordun, ver.U450C)",    0 )
GAME( 1995, butrfly,  0,       skylncr,  skylncr,  skylncr, ROT0, "Bordun International", "Butterfly Video Game (ver.U350C)",  0 )
GAME( 1995, madzoo,   0,       skylncr,  skylncr,  skylncr, ROT0, "Bordun International", "Mad Zoo (ver.U450C)",               0 )
GAME( 1995, leader,   0,       skylncr,  skylncr,  skylncr, ROT0, "bootleg",              "Leader",                            GAME_NOT_WORKING )