📄 scobra.c
字号:
/***************************************************************************
Super Cobra memory map (preliminary)
0000-5fff ROM (Lost Tomb: 0000-6fff)
8000-87ff RAM
8800-8bff Video RAM
9000-90ff Object RAM
9000-903f screen attributes
9040-905f sprites
9060-907f bullets
9080-90ff unused?
read:
b000 Watchdog Reset
9800 IN0
9801 IN1
9802 IN2
*
* IN0 (all bits are inverted)
* bit 7 : COIN 1
* bit 6 : COIN 2
* bit 5 : LEFT player 1
* bit 4 : RIGHT player 1
* bit 3 : SHOOT 1 player 1
* bit 2 : CREDIT
* bit 1 : SHOOT 2 player 1
* bit 0 : UP player 2 (TABLE only)
*
*
* IN1 (all bits are inverted)
* bit 7 : START 1
* bit 6 : START 2
* bit 5 : LEFT player 2 (TABLE only)
* bit 4 : RIGHT player 2 (TABLE only)
* bit 3 : SHOOT 1 player 2 (TABLE only)
* bit 2 : SHOOT 2 player 2 (TABLE only)
* bit 1 : nr of lives 0 = 3 1 = 5
* bit 0 : allow continue 0 = NO 1 = YES
*
* IN2 (all bits are inverted)
* bit 7 : protection check?
* bit 6 : DOWN player 1
* bit 5 : protection check?
* bit 4 : UP player 1
* bit 3 : COCKTAIL or UPRIGHT cabinet (0 = UPRIGHT)
* bit 2 :\ coins per play
* bit 1 :/ (00 = 99 credits!)
* bit 0 : DOWN player 2 (TABLE only)
*
write:
a801 interrupt enable
a802 coin counter
a803 ? (POUT1)
a804 stars on
a805 ? (POUT2)
a806 screen vertical flip
a807 screen horizontal flip
a000 To AY-3-8910 port A (commands for the audio CPU)
a001 bit 3 = trigger interrupt on audio CPU
TODO:
Need correct color PROMs for:
Super Bond
Anteater
***************************************************************************/
#include "driver.h"
#include "vidhrdw/generic.h"
extern unsigned char *galaxian_attributesram;
extern unsigned char *galaxian_bulletsram;
extern int galaxian_bulletsram_size;
void galaxian_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
void galaxian_flipx_w(int offset,int data);
void galaxian_flipy_w(int offset,int data);
void galaxian_attributes_w(int offset,int data);
void galaxian_stars_w(int offset,int data);
int scramble_vh_start(void);
void galaxian_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
int scramble_vh_interrupt(void);
void scramble_background_w(int offset, int data); /* MJC 051297 */
void scramble_filter_w(int offset, int data);
int scramble_portB_r(int offset);
int frogger_portB_r(int offset);
void scramble_sh_irqtrigger_w(int offset,int data);
int rescue_vh_start(void); /* MJC */
int minefield_vh_start(void);
int calipso_vh_start(void);
static void scobra_init_machine(void)
{
/* we must start with NMI interrupts disabled, otherwise some games */
/* (e.g. Lost Tomb, Rescue) will not pass the startup test. */
interrupt_enable_w(0,0);
}
static int moonwar2_IN0_r (int offset)
{
int sign;
int delta;
delta = readinputport(3);
sign = (delta & 0x80) >> 3;
delta &= 0x0f;
return ((readinputport(0) & 0xe0) | delta | sign );
}
static void stratgyx_coin_counter_w(int offset, int data)
{
/* Bit 1 selects coin counter */
coin_counter_w(offset >> 1, data);
}
static struct MemoryReadAddress readmem[] =
{
{ 0x0000, 0x6fff, MRA_ROM },
{ 0x8000, 0x8bff, MRA_RAM }, /* RAM and Video RAM */
{ 0x9000, 0x907f, MRA_RAM }, /* screen attributes, sprites, bullets */
{ 0x9800, 0x9800, input_port_0_r }, /* IN0 */
{ 0x9801, 0x9801, input_port_1_r }, /* IN1 */
{ 0x9802, 0x9802, input_port_2_r }, /* IN2 */
{ 0xb000, 0xb000, watchdog_reset_r },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress writemem[] =
{
{ 0x8000, 0x87ff, MWA_RAM },
{ 0x8800, 0x8bff, videoram_w, &videoram, &videoram_size },
{ 0x8c00, 0x8fff, MWA_NOP},
{ 0x9000, 0x903f, galaxian_attributes_w, &galaxian_attributesram },
{ 0x9040, 0x905f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x9060, 0x907f, MWA_RAM, &galaxian_bulletsram, &galaxian_bulletsram_size },
{ 0x9080, 0x90ff, MWA_NOP},
{ 0xa000, 0xa000, soundlatch_w },
{ 0xa001, 0xa001, scramble_sh_irqtrigger_w },
{ 0xa801, 0xa801, interrupt_enable_w },
{ 0xa802, 0xa802, coin_counter_w },
{ 0xa803, 0xa803, scramble_background_w },
{ 0xa804, 0xa804, galaxian_stars_w },
{ 0xa806, 0xa806, galaxian_flipx_w },
{ 0xa807, 0xa807, galaxian_flipy_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress stratgyx_readmem[] =
{
{ 0x0000, 0x7fff, MRA_ROM },
{ 0x8000, 0x8bff, MRA_RAM }, /* RAM and Video RAM */
{ 0x9000, 0x93ff, MRA_RAM }, /* screen attributes, sprites, bullets */
{ 0x9800, 0x9800, watchdog_reset_r},
{ 0xa000, 0xa000, input_port_0_r }, /* IN0 */
{ 0xa004, 0xa004, input_port_2_r }, /* IN2 */
{ 0xa008, 0xa008, input_port_1_r }, /* IN1 */
{ -1 } /* end of table */
};
static struct MemoryWriteAddress stratgyx_writemem[] =
{
{ 0x8000, 0x87ff, MWA_RAM },
{ 0x8800, 0x883f, galaxian_attributes_w, &galaxian_attributesram },
{ 0x8840, 0x885f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x8860, 0x887f, MWA_RAM, &galaxian_bulletsram, &galaxian_bulletsram_size },
{ 0x8880, 0x88ff, MWA_NOP},
{ 0x9000, 0x93ff, videoram_w, &videoram, &videoram_size },
{ 0xa800, 0xa800, soundlatch_w },
{ 0xa804, 0xa804, scramble_sh_irqtrigger_w },
{ 0xa80c, 0xa80c, scramble_background_w }, /* may be wrong! */
{ 0xb004, 0xb004, interrupt_enable_w },
{ 0xb006, 0xb008, stratgyx_coin_counter_w },
{ 0xb00c, 0xb00c, galaxian_flipy_w },
{ 0xb00e, 0xb00e, galaxian_flipx_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress hustler_readmem[] =
{
{ 0x0000, 0x3fff, MRA_ROM },
{ 0x8000, 0x8bff, MRA_RAM }, /* RAM and Video RAM */
{ 0x9000, 0x907f, MRA_RAM }, /* screen attributes, sprites, bullets */
{ 0xb800, 0xb800, watchdog_reset_r },
{ 0xd000, 0xd000, input_port_0_r }, /* IN0 */
{ 0xd008, 0xd008, input_port_1_r }, /* IN1 */
{ 0xd010, 0xd010, input_port_2_r }, /* IN2 */
{ -1 } /* end of table */
};
static struct MemoryWriteAddress hustler_writemem[] =
{
{ 0x8000, 0x87ff, MWA_RAM },
{ 0x8800, 0x8bff, videoram_w, &videoram, &videoram_size },
{ 0x9000, 0x903f, galaxian_attributes_w, &galaxian_attributesram },
{ 0x9040, 0x905f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x9060, 0x907f, MWA_RAM, &galaxian_bulletsram, &galaxian_bulletsram_size },
{ 0xa802, 0xa802, galaxian_flipx_w },
{ 0xa804, 0xa804, interrupt_enable_w },
{ 0xa806, 0xa806, galaxian_flipy_w },
{ 0xa80e, 0xa80e, MWA_NOP }, /* coin counters */
{ 0xe000, 0xe000, soundlatch_w },
{ 0xe008, 0xe008, scramble_sh_irqtrigger_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress moonwar2_readmem[] =
{
{ 0x0000, 0x6fff, MRA_ROM },
{ 0x8000, 0x8bff, MRA_RAM }, /* RAM and Video RAM */
{ 0x9000, 0x907f, MRA_RAM }, /* screen attributes, sprites, bullets */
{ 0x9800, 0x9800, moonwar2_IN0_r }, /* IN0 */
{ 0x9801, 0x9801, input_port_1_r }, /* IN1 */
{ 0x9802, 0x9802, input_port_2_r }, /* IN2 */
{ 0xb000, 0xb000, watchdog_reset_r },
{ -1 } /* end of table */
};
static struct MemoryReadAddress sound_readmem[] =
{
{ 0x0000, 0x1fff, MRA_ROM },
{ 0x8000, 0x83ff, MRA_RAM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress sound_writemem[] =
{
{ 0x8000, 0x83ff, MWA_RAM },
{ 0x9000, 0x9fff, scramble_filter_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress hustler_sound_readmem[] =
{
{ 0x0000, 0x0fff, MRA_ROM },
{ 0x4000, 0x43ff, MRA_RAM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress hustler_sound_writemem[] =
{
{ 0x0000, 0x0fff, MWA_ROM },
{ 0x4000, 0x43ff, MWA_RAM },
{ -1 } /* end of table */
};
static struct IOReadPort sound_readport[] =
{
{ 0x20, 0x20, AY8910_read_port_1_r },
{ 0x80, 0x80, AY8910_read_port_0_r },
{ -1 } /* end of table */
};
static struct IOWritePort sound_writeport[] =
{
{ 0x10, 0x10, AY8910_control_port_1_w },
{ 0x20, 0x20, AY8910_write_port_1_w },
{ 0x40, 0x40, AY8910_control_port_0_w },
{ 0x80, 0x80, AY8910_write_port_0_w },
{ -1 } /* end of table */
};
static struct IOReadPort hustler_sound_readport[] =
{
{ 0x40, 0x40, AY8910_read_port_0_r },
{ -1 } /* end of table */
};
static struct IOWritePort hustler_sound_writeport[] =
{
{ 0x40, 0x40, AY8910_write_port_0_w },
{ 0x80, 0x80, AY8910_control_port_0_w },
{ -1 } /* end of table */
};
INPUT_PORTS_START( scobra_input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START /* IN1 */
PORT_DIPNAME( 0x01, 0x00, "Allow Continue", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "No" )
PORT_DIPSETTING( 0x01, "Yes" )
PORT_DIPNAME( 0x02, 0x00, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x02, "5" )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
PORT_START /* IN2 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
PORT_DIPNAME( 0x06, 0x02, "Coinage", IP_KEY_NONE )
PORT_DIPSETTING( 0x04, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x06, "4 Coins/3 Credits" )
PORT_DIPSETTING( 0x02, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/99 Credits" )
PORT_DIPNAME( 0x08, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x08, "Cocktail" )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
/* identical to scobra apart from the number of lives */
INPUT_PORTS_START( scobrak_input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START /* IN1 */
PORT_DIPNAME( 0x01, 0x00, "Allow Continue", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "No" )
PORT_DIPSETTING( 0x01, "Yes" )
PORT_DIPNAME( 0x02, 0x00, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x02, "4" )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
PORT_START /* IN2 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
PORT_DIPNAME( 0x06, 0x02, "Coinage", IP_KEY_NONE )
PORT_DIPSETTING( 0x04, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x06, "4 Coins/3 Credits" )
PORT_DIPSETTING( 0x02, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/99 Credits" )
PORT_DIPNAME( 0x08, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x08, "Cocktail" )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -