📄 system16.c
字号:
WRITE_WORD (&paletteram[offset], newword);
}
}
/***************************************************************************/
static void set_refresh( int data ){
sys16_refreshenable = data&0x20;
}
static void set_tile_bank( int data ){
sys16_tile_bank1 = data&0xf;
sys16_tile_bank0 = (data>>4)&0xf;
}
static void set_fg_page( int data ){
sys16_fg_page[0] = data>>12;
sys16_fg_page[1] = (data>>8)&0xf;
sys16_fg_page[2] = (data>>4)&0xf;
sys16_fg_page[3] = data&0xf;
}
static void set_bg_page( int data ){
sys16_bg_page[0] = data>>12;
sys16_bg_page[1] = (data>>8)&0xf;
sys16_bg_page[2] = (data>>4)&0xf;
sys16_bg_page[3] = data&0xf;
}
/***************************************************************************/
/* Important: you must leave extra space when listing sprite ROMs
in a ROM module definition. This routine unpacks each sprite nibble
into a byte, doubling the memory consumption. */
void sys16_sprite_decode( int num_banks, int bank_size ){
unsigned char *base = Machine->memory_region[2];
unsigned char *temp = malloc( bank_size );
int i;
if( !temp ) return;
for( i = num_banks; i >0; i-- ){
unsigned char *finish = base + 2*bank_size*i;
unsigned char *dest = finish - 2*bank_size;
unsigned char *p1 = temp;
unsigned char *p2 = temp+bank_size/2;
unsigned char data;
memcpy (temp, base+bank_size*(i-1), bank_size);
do {
data = *p2++;
*dest++ = data >> 4;
*dest++ = data & 0xF;
data = *p1++;
*dest++ = data >> 4;
*dest++ = data & 0xF;
} while( dest<finish );
}
free( temp );
}
/***************************************************************************/
static int io_player1_r( int offset ){ return input_port_0_r( offset ); }
static int io_player2_r( int offset ){ return input_port_1_r( offset ); }
static int io_player3_r( int offset ){ return input_port_5_r( offset ); }
static int io_service_r( int offset ){ return input_port_2_r( offset ); }
static int io_dip1_r( int offset ){ return input_port_3_r( offset ); }
static int io_dip2_r( int offset ){ return input_port_4_r( offset ); }
/***************************************************************************/
static void copy_rom64k( int dest, int source ){
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
memcpy( &RAM[dest*0x10000], &RAM[source*0x10000], 0x10000 );
}
static void patch_code( int offset, int data ){
int aligned_offset = offset&0xfffffe;
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
int old_word = READ_WORD( &RAM[aligned_offset] );
if( offset&1 ){
data = (old_word&0xff00)|data;
}
else {
data = (old_word&0x00ff)|(data<<8);
}
WRITE_WORD (&RAM[aligned_offset], data);
}
/***************************************************************************/
#define SYS16_JOY1 PORT_START \
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) \
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) \
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) \
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) \
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) \
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) \
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) \
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
#define SYS16_JOY2 PORT_START \
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_COCKTAIL ) \
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL ) \
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL ) \
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) \
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL ) \
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL ) \
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL ) \
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
#define SYS16_JOY3 PORT_START \
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_COCKTAIL ) \
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL ) \
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL ) \
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) \
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER3 ) \
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER3 ) \
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER3 ) \
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER3 )
#define SYS16_SERVICE PORT_START \
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) \
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) \
PORT_BITX(0x04, 0x04, 0, "Test Mode", OSD_KEY_F1, IP_JOY_NONE, 0 ) \
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 ) \
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) \
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) \
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) \
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
#define SYS16_COINAGE PORT_START \
PORT_DIPNAME( 0x0f, 0x0f, "Coin A", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x07, "4 Coins/1 Credit") \
PORT_DIPSETTING( 0x08, "3 Coins/1 Credit") \
PORT_DIPSETTING( 0x09, "2 Coins/1 Credit") \
PORT_DIPSETTING( 0x05, "2/1 5/3 6/4") \
PORT_DIPSETTING( 0x04, "2/1 4/3") \
PORT_DIPSETTING( 0x0f, "1 Coin/1 Credit") \
PORT_DIPSETTING( 0x01, "1/1 2/3") \
PORT_DIPSETTING( 0x02, "1/1 4/5") \
PORT_DIPSETTING( 0x03, "1/1 5/6") \
PORT_DIPSETTING( 0x06, "2 Coins/3 Credits") \
PORT_DIPSETTING( 0x0e, "1 Coin/2 Credits") \
PORT_DIPSETTING( 0x0d, "1 Coin/3 Credits") \
PORT_DIPSETTING( 0x0c, "1 Coin/4 Credits") \
PORT_DIPSETTING( 0x0b, "1 Coin/5 Credits") \
PORT_DIPSETTING( 0x0a, "1 Coin/6 Credits") \
PORT_DIPSETTING( 0x00, "Free Play (if Coin B too) or 1/1") \
PORT_DIPNAME( 0xf0, 0xf0, "Coin B", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x70, "4 Coins/1 Credit") \
PORT_DIPSETTING( 0x80, "3 Coins/1 Credit") \
PORT_DIPSETTING( 0x90, "2 Coins/1 Credit") \
PORT_DIPSETTING( 0x50, "2/1 5/3 6/4") \
PORT_DIPSETTING( 0x40, "2/1 4/3") \
PORT_DIPSETTING( 0xf0, "1 Coin/1 Credit") \
PORT_DIPSETTING( 0x10, "1/1 2/3") \
PORT_DIPSETTING( 0x20, "1/1 4/5") \
PORT_DIPSETTING( 0x30, "1/1 5/6") \
PORT_DIPSETTING( 0x60, "2 Coins/3 Credits") \
PORT_DIPSETTING( 0xe0, "1 Coin/2 Credits") \
PORT_DIPSETTING( 0xd0, "1 Coin/3 Credits") \
PORT_DIPSETTING( 0xc0, "1 Coin/4 Credits") \
PORT_DIPSETTING( 0xb0, "1 Coin/5 Credits") \
PORT_DIPSETTING( 0xa0, "1 Coin/6 Credits") \
PORT_DIPSETTING( 0x00, "Free Play (if Coin A too) or 1/1")
#define SYS16_OPTIONS PORT_START \
PORT_DIPNAME( 0x01, 0x00, "Cabinet", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x00, "Upright") \
PORT_DIPSETTING( 0x01, "Cocktail") \
PORT_DIPNAME( 0x02, 0x02, "Attract Mode Sound", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x02, "Off" ) \
PORT_DIPSETTING( 0x00, "On" ) \
PORT_DIPNAME( 0x0c, 0x0c, "Lives", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x08, "2" ) \
PORT_DIPSETTING( 0x0c, "3" ) \
PORT_DIPSETTING( 0x04, "5" ) \
PORT_BITX( 0, 0x00, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "240", IP_KEY_NONE, IP_JOY_NONE, 0 ) \
PORT_DIPNAME( 0x30, 0x30, "Difficulty", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x20, "Easy" ) \
PORT_DIPSETTING( 0x30, "Normal" ) \
PORT_DIPSETTING( 0x10, "Hard" ) \
PORT_DIPSETTING( 0x00, "Hardest" ) \
PORT_DIPNAME( 0x40, 0x40, "Enemy's Bullet Speed", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x40, "Slow" ) \
PORT_DIPSETTING( 0x00, "Fast" ) \
PORT_DIPNAME( 0x80, 0x80, "Language", IP_KEY_NONE ) \
PORT_DIPSETTING( 0x80, "Japanese" ) \
PORT_DIPSETTING( 0x00, "English" )
/***************************************************************************/
ROM_START( alexkidd_rom )
ROM_REGION( 0x040000 ) /* 68000 code */
ROM_LOAD_ODD ( "10445.26", 0x000000, 0x10000, 0x25ce5b6f )
ROM_LOAD_EVEN( "10447.43", 0x000000, 0x10000, 0x29e87f71 )
ROM_LOAD_ODD ( "10446.25", 0x020000, 0x10000, 0xcd61d23c )
ROM_LOAD_EVEN( "10448.42", 0x020000, 0x10000, 0x05baedb5 )
ROM_REGION( 0x18000 ) /* tiles */
ROM_LOAD( "10431.95", 0x00000, 0x08000, 0xa7962c39 )
ROM_LOAD( "10432.94", 0x08000, 0x08000, 0xdb8cd24e )
ROM_LOAD( "10433.93", 0x10000, 0x08000, 0xe163c8c2 )
ROM_REGION( 0x050000*2 ) /* sprites */
ROM_LOAD( "10437.10", 0x000000, 0x008000, 0x522f7618 )
ROM_LOAD( "10441.11", 0x008000, 0x008000, 0x74e3a35c )
ROM_LOAD( "10438.17", 0x010000, 0x008000, 0x738a6362 )
ROM_LOAD( "10442.18", 0x018000, 0x008000, 0x86cb9c14 )
ROM_LOAD( "10439.23", 0x020000, 0x008000, 0xb391aca7 )
ROM_LOAD( "10443.24", 0x028000, 0x008000, 0x95d32635 )
ROM_LOAD( "10440.29", 0x030000, 0x008000, 0x23939508 )
ROM_LOAD( "10444.30", 0x038000, 0x008000, 0x82115823 )
ROM_LOAD( "10437.10", 0x040000, 0x008000, 0x522f7618 )
ROM_LOAD( "10441.11", 0x048000, 0x008000, 0x74e3a35c )
ROM_REGION( 0x10000 ) /* sound CPU */
ROM_LOAD( "10434.12", 0x0000, 0x8000, 0x77141cce )
ROM_END
/***************************************************************************/
static struct MemoryReadAddress alexkidd_readmem[] =
{
{ 0xc41002, 0xc41003, io_player1_r },
{ 0xc41006, 0xc41007, io_player2_r },
{ 0xc41000, 0xc41001, io_service_r },
{ 0xc42002, 0xc42003, io_dip1_r },
{ 0xc42000, 0xc42001, io_dip2_r },
{ 0x400000, 0x40ffff, MRA_TILERAM },
{ 0x410000, 0x410fff, MRA_TEXTRAM },
{ 0x440000, 0x440fff, MRA_SPRITERAM },
{ 0x840000, 0x840fff, MRA_PALETTERAM },
{ 0xff0000, 0xffffff, MRA_WORKINGRAM },
{ 0x000000, 0x03ffff, MRA_ROM },
{-1}
};
static struct MemoryWriteAddress alexkidd_writemem[] =
{
{ 0x000000, 0x03ffff, MWA_ROM },
{ 0xfe0006, 0xfe0007, sound_command_w },
{ 0x410000, 0x410fff, MWA_TEXTRAM },
{ 0x400000, 0x40ffff, MWA_TILERAM },
{ 0x440000, 0x44ffff, MWA_SPRITERAM },
{ 0x840000, 0x84ffff, MWA_PALETTERAM },
{ 0xff0000, 0xffffff, MWA_WORKINGRAM },
{-1}
};
/***************************************************************************/
void alexkidd_update_proc( void ){
sys16_fg_scrollx = READ_WORD( &sys16_textram[0x0ff8] );
sys16_bg_scrollx = READ_WORD( &sys16_textram[0x0ffa] );
sys16_fg_scrolly = READ_WORD( &sys16_textram[0x0f24] );
sys16_bg_scrolly = READ_WORD( &sys16_textram[0x0f26] );
set_fg_page( READ_WORD( &sys16_textram[0x0e9e] ) );
set_bg_page( READ_WORD( &sys16_textram[0x0e9c] ) );
}
void alexkidd_init_machine( void ){
static int bank[16] = { 00,01,02,03,00,01,02,03,00,01,02,03,00,01,02,03};
sys16_obj_bank = bank;
sys16_update_proc = alexkidd_update_proc;
}
void alexkidd_sprite_decode( void ){
sys16_sprite_decode( 5,0x010000 );
}
/***************************************************************************/
INPUT_PORTS_START( alexkidd_input_ports )
SYS16_JOY1
SYS16_JOY2
SYS16_SERVICE
SYS16_COINAGE
SYS16_OPTIONS
INPUT_PORTS_END
/***************************************************************************/
MACHINE_DRIVER( alexkidd_machine_driver, \
alexkidd_readmem,alexkidd_writemem,alexkidd_init_machine,gfx8 )
struct GameDriver alexkidd_driver =
{
__FILE__,
0,
"alexkidd",
"Alex Kidd (bootleg)",
"1986",
"bootleg",
SYS16_CREDITS,
GAME_NOT_WORKING,
&alexkidd_machine_driver,
0,
alexkidd_rom,
alexkidd_sprite_decode, 0,
0,
0,
alexkidd_input_ports,
0, 0, 0,
ORIENTATION_DEFAULT,
0, 0
};
/***************************************************************************/
ROM_START( aliensyn_rom )
ROM_REGION( 0x030000 ) /* 68000 code */
ROM_LOAD_ODD ( "11080.a1", 0x00000, 0x8000, 0xfe7378d9 )
ROM_LOAD_EVEN( "11083.a4", 0x00000, 0x8000, 0xcb2ad9b3 )
ROM_LOAD_ODD ( "11081.a2", 0x10000, 0x8000, 0x1308ee63 )
ROM_LOAD_EVEN( "11084.a5", 0x10000, 0x8000, 0x2e1ec7b1 )
ROM_LOAD_ODD ( "11082.a3", 0x20000, 0x8000, 0x9cdc2a14 )
ROM_LOAD_EVEN( "11085.a6", 0x20000, 0x8000, 0xcff78f39 )
ROM_REGION( 0x30000 ) /* tiles */
ROM_LOAD( "10702.b9", 0x00000, 0x10000, 0x393bc813 )
ROM_LOAD( "10703.b10", 0x10000, 0x10000, 0x6b6dd9f5 )
ROM_LOAD( "10704.b11", 0x20000, 0x10000, 0x911e7ebc )
ROM_REGION( 0x080000*2 ) /* sprites */
ROM_LOAD( "10709.b1", 0x00000, 0x10000, 0xaddf0a90 )
ROM_LOAD( "10713.b5", 0x10000, 0x10000, 0xececde3a )
ROM_LOAD( "10710.b2", 0x20000, 0x10000, 0x992369eb )
ROM_LOAD( "10714.b6", 0x30000, 0x10000, 0x91bf42fb )
ROM_LOAD( "10711.b3", 0x40000, 0x10000, 0x29166ef6 )
ROM_LOAD( "10715.b7", 0x50000, 0x10000, 0xa7c57384 )
ROM_LOAD( "10712.b4", 0x60000, 0x10000, 0x876ad019 )
ROM_LOAD( "10716.b8", 0x70000, 0x10000, 0x40ba1d48 )
ROM_REGION( 0x10000 ) /* sound CPU */
ROM_LOAD( "10723.a7", 0x0000, 0x8000, 0x99953526 )
ROM_END
/***************************************************************************/
static struct MemoryReadAddress aliensyn_readmem[] =
{
{ 0xc41002, 0xc41003, io_player1_r },
{ 0xc41006, 0xc41007, io_player2_r },
{ 0xc41000, 0xc41001, io_service_r },
{ 0xc42002, 0xc42003, io_dip1_r },
{ 0xc42000, 0xc42001, io_dip2_r },
{ 0x410000, 0x410fff, MRA_TEXTRAM },
{ 0x400000, 0x40ffff, MRA_TILERAM },
{ 0x440000, 0x440fff, MRA_SPRITERAM },
{ 0x840000, 0x840fff, MRA_PALETTERAM },
{ 0xc40000, 0xc40fff, MRA_EXTRAM },
{ 0xff0000, 0xffffff, MRA_WORKINGRAM },
{ 0x000000, 0x02ffff, MRA_ROM },
{-1}
};
static struct MemoryWriteAddress aliensyn_writemem[] =
{
{ 0x000000, 0x03ffff, MWA_ROM },
{ 0x400000, 0x40ffff, MWA_TILERAM },
{ 0x410000, 0x410fff, MWA_TEXTRAM },
{ 0x440000, 0x440fff, MWA_SPRITERAM },
{ 0x840000, 0x840fff, MWA_PALETTERAM },
{ 0xc00006, 0xc00007, sound_command_w },
{ 0xc40000, 0xc40fff, MWA_EXTRAM },
{ 0xff0000, 0xffffff, MWA_WORKINGRAM },
{-1}
};
/***************************************************************************/
void aliensyn_update_proc( void ){
sys16_fg_scrollx = READ_WORD( &sys16_textram[0x0e98] );
sys16_bg_scrollx = READ_WORD( &sys16_textram[0x0e9a] );
sys16_fg_scrolly = READ_WORD( &sys16_textram[0x0e90] );
sys16_bg_scrolly = READ_WORD( &sys16_textram[0x0e92] );
set_fg_page( READ_WORD( &sys16_textram[0x0e80] ) );
set_bg_page( READ_WORD( &sys16_textram[0x0e82] ) );
set_refresh( READ_WORD( &sys16_extraram[0] ) );
}
void aliensyn_init_machine( void ){
static int bank[16] = { 0,0,0,0,0,0,0,6,0,0,0,4,0,2,0,0 };
sys16_obj_bank = bank;
sys16_update_proc = aliensyn_update_proc;
}
void aliensyn_sprite_decode( void ){
sys16_sprite_decode( 4,0x20000 );
}
/***************************************************************************/
INPUT_PORTS_START( aliensyn_input_ports )
SYS16_JOY1
SYS16_JOY2
SYS16_SERVICE
SYS16_COINAGE
PORT_START /* DSW1 */
PORT_DIPNAME( 0x01, 0x00, "Unknown", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "On")
PORT_DIPSETTING( 0x01, "Off")
PORT_DIPNAME( 0x02, 0x02, "Demo Sound?", IP_KEY_NONE )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -