📄 fastfred.c
字号:
/***************************************************************************
Fast Freddie/Jump Coaster memory map (preliminary)
These games run on a modified Galaxian board.
Main CPU
Fast Fred Jump Coas
0000-7fff ROM
c000-c7ff RAM
d000-d3ff d800-dbff Video RAM
d400-d7ff dc00-dfff Mirrored Video RAM
d800-d83f d000-d03f Attributes RAM
d840-d85f d040-d05f Sprite RAM
I/O read:
c800-cfff Custom I/O (Protection)
e000 e802 Input Port 1
e800 e803 Input Port 2
f000 e800 Dip Switches
f800 Watchdog Reset
I/O write:
c800-cfff Custom I/O write
e000 Background color write
fXX1 NMI Enable
fXX2-fXX3 Palette Select (?)
fXX4-fXX5 Character Bank Select
fXX6 Screen Flip X
fXX7 Screen Flip Y
f800 Sound Command Write (AY8910 #1 Control Port on Jump Coaster)
f801 AY8910 #1 Write Port on Jump Coaster
Sound CPU (Only on Fast Freddie)
0000-1fff ROM
2000-23ff RAM
I/O read:
3000 Sound Command Read
I/O write:
3000 NMI Enable
4000 Reset PSG's (?)
5000 AY8910 #1 Control Port
5001 AY8910 #1 Write Port
6000 AY8910 #2 Control Port
6001 AY8910 #2 Write Port
***************************************************************************/
#include "driver.h"
#include "vidhrdw/generic.h"
extern unsigned char *galaxian_attributesram;
void galaxian_attributes_w(int offset,int data);
void fastfred_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
void fastfred_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
void fastfred_character_bank_select_w (int offset, int data);
void fastfred_color_bank_select_w (int offset, int data);
void fastfred_background_color_w (int offset, int data);
void fastfred_flipx_w(int offset,int data);
void fastfred_flipy_w(int offset,int data);
void jumpcoas_init_machine(void);
static int use_custom_io;
static int jumpcoas_custom_io_r(int offset)
{
if (offset == 0x100)
{
return 0x63;
}
return 0x00;
}
static int fastfred_custom_io_r(int offset)
{
if (!use_custom_io) return 0x00;
switch (cpu_getpc())
{
case 0x03c0:
return 0x9d;
case 0x03e6:
return 0x9f;
case 0x0407:
return 0x00;
case 0x0446:
return 0x94;
case 0x049f:
return 0x01;
case 0x04b1:
return 0x00;
case 0x0dd2:
return 0x00;
case 0x0de4:
return 0x20;
case 0x122b:
return 0x10;
case 0x123d:
return 0x00;
case 0x1a83:
return 0x10;
case 0x1a93:
return 0x00;
case 0x1b26:
return 0x00;
case 0x1b37:
return 0x80;
case 0x2491:
return 0x10;
case 0x24a2:
return 0x00;
case 0x46ce:
return 0x20;
case 0x46df:
return 0x00;
case 0x7b18:
return 0x01;
case 0x7b29:
return 0x00;
case 0x7b47:
return 0x00;
case 0x7b58:
return 0x20;
}
return 0x00;
}
static void flyboy_init(void)
{
use_custom_io = 0;
}
static void fastfred_init(void)
{
use_custom_io = 1;
}
static struct MemoryReadAddress fastfred_readmem[] =
{
{ 0x0000, 0x7fff, MRA_ROM },
{ 0x8000, 0x9fff, MRA_NOP },
{ 0xc000, 0xc7ff, MRA_RAM },
{ 0xc800, 0xcfff, fastfred_custom_io_r },
{ 0xd000, 0xd3ff, MRA_RAM },
{ 0xd800, 0xd8ff, MRA_RAM },
{ 0xe000, 0xe000, input_port_0_r },
{ 0xe800, 0xe800, input_port_1_r },
{ 0xf000, 0xf000, input_port_2_r },
{ 0xf800, 0xf800, watchdog_reset_r },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress fastfred_writemem[] =
{
{ 0xc000, 0xc7ff, MWA_RAM },
{ 0xc800, 0xcfff, MWA_NOP },
{ 0xd000, 0xd3ff, videoram_w, &videoram, &videoram_size },
{ 0xd400, 0xd7ff, videoram_w },
{ 0xd800, 0xd83f, galaxian_attributes_w, &galaxian_attributesram },
{ 0xd840, 0xd85f, MWA_RAM, &spriteram, &spriteram_size },
{ 0xd860, 0xdbff, MWA_RAM },
{ 0xe000, 0xe000, fastfred_background_color_w },
{ 0xf000, 0xf000, MWA_NOP },
{ 0xf001, 0xf001, interrupt_enable_w },
{ 0xf002, 0xf003, fastfred_color_bank_select_w },
{ 0xf004, 0xf005, fastfred_character_bank_select_w },
{ 0xf006, 0xf006, fastfred_flipx_w },
{ 0xf007, 0xf007, fastfred_flipy_w },
{ 0xf116, 0xf116, fastfred_flipx_w },
{ 0xf117, 0xf117, fastfred_flipy_w },
{ 0xf800, 0xf800, soundlatch_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress jumpcoas_readmem[] =
{
{ 0x0000, 0x7fff, MRA_ROM },
{ 0xc000, 0xc7ff, MRA_RAM },
{ 0xc800, 0xcfff, jumpcoas_custom_io_r },
{ 0xd000, 0xd3ff, MRA_RAM },
{ 0xd800, 0xdbff, MRA_RAM },
{ 0xe800, 0xe800, input_port_0_r },
{ 0xe802, 0xe802, input_port_1_r },
{ 0xe802, 0xe803, input_port_2_r },
{ 0xf800, 0xf800, MRA_NOP },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress jumpcoas_writemem[] =
{
{ 0xc000, 0xc7ff, MWA_RAM },
{ 0xc800, 0xcfff, MWA_NOP },
{ 0xd000, 0xd03f, galaxian_attributes_w, &galaxian_attributesram },
{ 0xd040, 0xd05f, MWA_RAM, &spriteram, &spriteram_size },
{ 0xd060, 0xd3ff, MWA_NOP },
{ 0xd800, 0xdbff, videoram_w, &videoram, &videoram_size },
{ 0xdc00, 0xdfff, videoram_w }, /* mirror address, used in the name entry screen */
{ 0xe000, 0xe000, fastfred_background_color_w },
{ 0xf000, 0xf000, MWA_NOP },
{ 0xf001, 0xf001, interrupt_enable_w },
{ 0xf002, 0xf003, fastfred_color_bank_select_w },
{ 0xf004, 0xf005, fastfred_character_bank_select_w },
{ 0xf006, 0xf006, fastfred_flipx_w },
{ 0xf007, 0xf007, fastfred_flipy_w },
{ 0xf116, 0xf116, fastfred_flipx_w },
{ 0xf117, 0xf117, fastfred_flipy_w },
{ 0xf800, 0xf800, AY8910_control_port_0_w },
{ 0xf801, 0xf801, AY8910_write_port_0_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress sound_readmem[] =
{
{ 0x0000, 0x1fff, MRA_ROM },
{ 0x2000, 0x23ff, MRA_RAM },
{ 0x3000, 0x3000, soundlatch_r },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress sound_writemem[] =
{
{ 0x2000, 0x23ff, MWA_RAM },
{ 0x3000, 0x3000, interrupt_enable_w },
{ 0x4000, 0x4000, MWA_RAM },
{ 0x5000, 0x5000, AY8910_control_port_0_w },
{ 0x5001, 0x5001, AY8910_write_port_0_w },
{ 0x6000, 0x6000, AY8910_control_port_1_w },
{ 0x6001, 0x6001, AY8910_write_port_1_w },
{ -1 } /* end of table */
};
INPUT_PORTS_START( fastfred_input_ports )
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BITX( 0x04, 0x00, IPT_DIPSWITCH_NAME | IPF_TOGGLE, "Service Mode", OSD_KEY_F2, IP_JOY_NONE, 0 )
PORT_DIPSETTING( 0x00, "Off" )
PORT_DIPSETTING( 0x04, "On" )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN3 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_8WAY )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_8WAY | IPF_COCKTAIL )
PORT_START /* IN2 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
PORT_START /* DSW 1 */
PORT_DIPNAME( 0x0f, 0x00, "Coinage", IP_KEY_NONE )
PORT_DIPSETTING( 0x01, "A 2/1 B 2/1" )
PORT_DIPSETTING( 0x02, "A 2/1 B 1/3" )
PORT_DIPSETTING( 0x00, "A 1/1 B 1/1" )
PORT_DIPSETTING( 0x03, "A 1/1 B 1/2" )
PORT_DIPSETTING( 0x04, "A 1/1 B 1/3" )
PORT_DIPSETTING( 0x05, "A 1/1 B 1/4" )
PORT_DIPSETTING( 0x06, "A 1/1 B 1/5" )
PORT_DIPSETTING( 0x07, "A 1/1 B 1/6" )
PORT_DIPSETTING( 0x08, "A 1/2 B 1/2" )
PORT_DIPSETTING( 0x09, "A 1/2 B 1/4" )
PORT_DIPSETTING( 0x0a, "A 1/2 B 1/5" )
PORT_DIPSETTING( 0x0e, "A 1/2 B 1/6" )
PORT_DIPSETTING( 0x0b, "A 1/2 B 1/10" )
PORT_DIPSETTING( 0x0c, "A 1/2 B 1/11" )
PORT_DIPSETTING( 0x0d, "A 1/2 B 1/12" )
PORT_DIPSETTING( 0x0f, "Free Play" )
PORT_DIPNAME( 0x10, 0x00, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x10, "5" )
PORT_DIPNAME( 0x60, 0x20, "Bonus Life", IP_KEY_NONE )
PORT_DIPSETTING( 0x20, "30000" )
PORT_DIPSETTING( 0x40, "50000" )
PORT_DIPSETTING( 0x60, "100000" )
PORT_DIPSETTING( 0x00, "None" )
PORT_DIPNAME( 0x80, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x80, "Cocktail" )
INPUT_PORTS_END
INPUT_PORTS_START( flyboy_input_ports )
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_8WAY )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_8WAY | IPF_COCKTAIL )
PORT_START /* IN2 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
PORT_START /* DSW 1 */
PORT_DIPNAME( 0x03, 0x00, "Coin A", IP_KEY_NONE )
PORT_DIPSETTING( 0x03, "6 Coins/1 Credit" )
PORT_DIPSETTING( 0x02, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x01, "1 Coin/2 Credits" )
PORT_DIPNAME( 0x0c, 0x00, "Coin B", IP_KEY_NONE )
PORT_DIPSETTING( 0x0c, "6 Coins/1 Credit" )
PORT_DIPSETTING( 0x08, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x04, "1 Coin/2 Credits" )
PORT_DIPNAME( 0x30, 0x00, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x10, "5" )
PORT_DIPSETTING( 0x20, "7" )
PORT_BITX( 0, 0x30, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "255", IP_KEY_NONE, IP_JOY_NONE, 0 )
PORT_DIPNAME( 0x40, 0x00, "Invincibility", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Off" )
PORT_BITX( 0, 0x40, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "On", IP_KEY_NONE, IP_JOY_NONE, 0 )
PORT_DIPNAME( 0x80, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x80, "Cocktail" )
INPUT_PORTS_END
INPUT_PORTS_START( jumpcoas_input_ports )
PORT_START /* DSW 0 */
PORT_DIPNAME( 0x03, 0x00, "Coin A", IP_KEY_NONE )
PORT_DIPSETTING( 0x03, "6 Coins/1 Credit" )
PORT_DIPSETTING( 0x02, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x01, "1 Coin/2 Credits" )
PORT_DIPNAME( 0x0c, 0x00, "Coin B", IP_KEY_NONE )
PORT_DIPSETTING( 0x0c, "6 Coins/1 Credit" )
PORT_DIPSETTING( 0x08, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x04, "1 Coin/2 Credits" )
PORT_DIPNAME( 0x30, 0x00, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x10, "5" )
PORT_DIPSETTING( 0x20, "7" )
PORT_BITX( 0, 0x30, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "255", IP_KEY_NONE, IP_JOY_NONE, 0 )
PORT_DIPNAME( 0x40, 0x00, "Unknown", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Off" )
PORT_DIPSETTING( 0x40, "On" )
PORT_DIPNAME( 0x80, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x80, "Cocktail" )
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
PORT_START /* IN2 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
INPUT_PORTS_END
static struct GfxLayout fastfred_charlayout =
{
8,8, /* 8*8 characters */
1024, /* 1024 characters */
3, /* 3 bits per pixel */
{ 0x4000*8, 0x2000*8, 0 }, /* the three bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8 /* every char takes 8 consecutive bytes */
};
static struct GfxLayout jumpcoas_charlayout =
{
8,8, /* 8*8 characters */
256, /* 256 characters */
3, /* 3 bits per pixel */
{ 0x2000*8, 0x1000*8, 0 }, /* the three bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8 /* every char takes 8 consecutive bytes */
};
static struct GfxLayout fastfred_spritelayout =
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -