📄 mooncrst.c
字号:
/***************************************************************************
Main clock: XTAL = 18.432 MHz
Z80 Clock: XTAL/6 = 3.072 MHz
Horizontal video frequency: HSYNC = XTAL/3/192/2 = 16 kHz
Video frequency: VSYNC = HSYNC/132/2 = 60.606060 Hz
VBlank duration: 1/VSYNC * (20/132) = 2500 us
Changes:
19 Feb 98 LBO
* Added Checkman driver
19 Jul 98 LBO
* Added King & Balloon driver
TODO:
* Need valid color prom for Fantazia. Current one is slightly damaged.
***************************************************************************/
#include "driver.h"
#include "vidhrdw/generic.h"
#include "Z80/Z80.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);
void mooncrst_gfxextend_w(int offset,int data);
int galaxian_vh_start(void);
int moonqsr_vh_start(void);
void galaxian_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
int galaxian_vh_interrupt(void);
void mooncrst_pitch_w(int offset,int data);
void mooncrst_vol_w(int offset,int data);
void mooncrst_noise_w(int offset,int data);
void mooncrst_background_w(int offset,int data);
void mooncrst_shoot_w(int offset,int data);
void mooncrst_lfo_freq_w(int offset,int data);
int mooncrst_sh_start(void);
void mooncrst_sh_stop(void);
void mooncrst_sh_update(void);
/* Send sound data to the sound cpu and cause an nmi */
void checkman_sound_command_w (int offset, int data)
{
soundlatch_w (0,data);
cpu_cause_interrupt (1, Z80_NMI_INT);
}
static int kingball_speech_dip;
/* Hack? If $b003 is high, we'll check our "fake" speech dipswitch */
static int kingball_IN0_r (int offset)
{
if (kingball_speech_dip)
return (readinputport (0) & 0x80) >> 1;
else
return readinputport (0);
}
static void kingball_speech_dip_w (int offset, int data)
{
kingball_speech_dip = data;
}
static int kingball_sound;
static void kingball_sound1_w (int offset, int data)
{
kingball_sound = (kingball_sound & ~0x01) | data;
}
static void kingball_sound2_w (int offset, int data)
{
kingball_sound = (kingball_sound & ~0x02) | (data << 1);
soundlatch_w (0, kingball_sound | 0xf0);
}
static struct MemoryReadAddress readmem[] =
{
{ 0x0000, 0x3fff, MRA_ROM },
{ 0x8000, 0x83ff, MRA_RAM },
{ 0x9000, 0x93ff, MRA_RAM }, /* video RAM */
{ 0x9400, 0x97ff, videoram_r }, /* Checkman - video RAM mirror */
{ 0x9800, 0x9fff, MRA_RAM }, /* screen attributes, sprites, bullets */
{ 0xa000, 0xa000, input_port_0_r }, /* IN0 */
{ 0xa800, 0xa800, input_port_1_r }, /* IN1 */
{ 0xb000, 0xb000, input_port_2_r }, /* DSW (coins per play) */
{ 0xb800, 0xb800, watchdog_reset_r },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress writemem[] =
{
{ 0x0000, 0x3fff, MWA_ROM },
{ 0x8000, 0x83ff, MWA_RAM },
{ 0x9000, 0x93ff, videoram_w, &videoram, &videoram_size },
{ 0x9800, 0x983f, galaxian_attributes_w, &galaxian_attributesram },
{ 0x9840, 0x985f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x9860, 0x987f, MWA_RAM, &galaxian_bulletsram, &galaxian_bulletsram_size },
{ 0xa000, 0xa002, mooncrst_gfxextend_w }, /* Moon Cresta only */
{ 0xa004, 0xa007, mooncrst_lfo_freq_w },
{ 0xa800, 0xa800, mooncrst_background_w },
{ 0xa803, 0xa803, mooncrst_noise_w },
{ 0xa805, 0xa805, mooncrst_shoot_w },
{ 0xa806, 0xa807, mooncrst_vol_w },
{ 0xb000, 0xb000, interrupt_enable_w }, /* not Checkman */
{ 0xb001, 0xb001, interrupt_enable_w }, /* Checkman only */
{ 0xb004, 0xb004, galaxian_stars_w },
{ 0xb006, 0xb006, galaxian_flipx_w },
{ 0xb007, 0xb007, galaxian_flipy_w },
{ 0xb800, 0xb800, mooncrst_pitch_w },
{ -1 } /* end of table */
};
/* EXACTLY the same as above, but no gfxextend_w to avoid graphics problems */
static struct MemoryWriteAddress moonal2_writemem[] =
{
{ 0x0000, 0x3fff, MWA_ROM },
{ 0x8000, 0x83ff, MWA_RAM },
{ 0x9000, 0x93ff, videoram_w, &videoram, &videoram_size },
{ 0x9800, 0x983f, galaxian_attributes_w, &galaxian_attributesram },
{ 0x9840, 0x985f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x9860, 0x987f, MWA_RAM, &galaxian_bulletsram, &galaxian_bulletsram_size },
/* { 0xa000, 0xa002, mooncrst_gfxextend_w }, * Moon Cresta only */
{ 0xa004, 0xa007, mooncrst_lfo_freq_w },
{ 0xa800, 0xa800, mooncrst_background_w },
{ 0xa803, 0xa803, mooncrst_noise_w },
{ 0xa805, 0xa805, mooncrst_shoot_w },
{ 0xa806, 0xa807, mooncrst_vol_w },
{ 0xb000, 0xb000, interrupt_enable_w }, /* not Checkman */
{ 0xb001, 0xb001, interrupt_enable_w }, /* Checkman only */
{ 0xb004, 0xb004, galaxian_stars_w },
{ 0xb006, 0xb006, galaxian_flipx_w },
{ 0xb007, 0xb007, galaxian_flipy_w },
{ 0xb800, 0xb800, mooncrst_pitch_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress kingball_readmem[] =
{
{ 0x0000, 0x3fff, MRA_ROM },
{ 0x8000, 0x83ff, MRA_RAM },
{ 0x9000, 0x93ff, MRA_RAM }, /* video RAM */
{ 0x9400, 0x97ff, videoram_r }, /* Checkman - video RAM mirror */
{ 0x9800, 0x9fff, MRA_RAM }, /* screen attributes, sprites, bullets */
{ 0xa000, 0xa000, kingball_IN0_r }, /* IN0 */
{ 0xa800, 0xa800, input_port_1_r }, /* IN1 */
{ 0xb000, 0xb000, input_port_2_r }, /* DSW (coins per play) */
{ 0xb800, 0xb800, watchdog_reset_r },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress kingball_writemem[] =
{
{ 0x0000, 0x2fff, MWA_ROM },
{ 0x8000, 0x83ff, MWA_RAM },
{ 0x9000, 0x93ff, videoram_w, &videoram, &videoram_size },
{ 0x9800, 0x983f, galaxian_attributes_w, &galaxian_attributesram },
{ 0x9840, 0x985f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x9860, 0x987f, MWA_RAM, &galaxian_bulletsram, &galaxian_bulletsram_size },
{ 0x9880, 0x98ff, MWA_RAM },
{ 0xa000, 0xa003, MWA_NOP }, /* lamps */
{ 0xa004, 0xa007, mooncrst_lfo_freq_w },
{ 0xa800, 0xa800, mooncrst_background_w },
{ 0xa803, 0xa803, mooncrst_noise_w },
{ 0xa805, 0xa805, mooncrst_shoot_w },
{ 0xa806, 0xa807, mooncrst_vol_w },
{ 0xb001, 0xb001, interrupt_enable_w },
{ 0xb000, 0xb000, kingball_sound1_w },
{ 0xb002, 0xb002, kingball_sound2_w },
{ 0xb003, 0xb003, kingball_speech_dip_w },
{ 0xb006, 0xb006, galaxian_flipx_w },
{ 0xb007, 0xb007, galaxian_flipy_w },
{ 0xb800, 0xb800, mooncrst_pitch_w },
{ -1 } /* end of table */
};
/* These sound structures are only used by Checkman */
static struct IOWritePort writeport[] =
{
{ 0, 0, checkman_sound_command_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress sound_readmem[] =
{
{ 0x0000, 0x0fff, MRA_ROM },
{ 0x2000, 0x23ff, MRA_RAM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress sound_writemem[] =
{
{ 0x0000, 0x0fff, MWA_ROM },
{ 0x2000, 0x23ff, MWA_RAM },
{ -1 } /* end of table */
};
static struct IOReadPort sound_readport[] =
{
{ 0x03, 0x03, soundlatch_r },
{ 0x06, 0x06, AY8910_read_port_0_r },
{ -1 } /* end of table */
};
static struct IOWritePort sound_writeport[] =
{
{ 0x04, 0x04, AY8910_control_port_0_w },
{ 0x05, 0x05, AY8910_write_port_0_w },
{ -1 } /* end of table */
};
/* These 4 structures are used only by King & Balloon */
static struct MemoryReadAddress kb_sound_readmem[] =
{
{ 0x0000, 0x1fff, MRA_ROM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress kb_sound_writemem[] =
{
{ 0x0000, 0x1fff, MWA_ROM },
{ -1 } /* end of table */
};
static struct IOReadPort kb_sound_readport[] =
{
{ 0x00, 0x00, soundlatch_r },
{ -1 } /* end of table */
};
static struct IOWritePort kb_sound_writeport[] =
{
{ 0x00, 0x00, DAC_data_w },
{ -1 } /* end of table */
};
INPUT_PORTS_START( mooncrst_input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_DIPNAME( 0x20, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x20, "Cocktail" )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* "reset" on schematics */
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN3 ) /* works only in the Gremlin version */
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* probably unused */
PORT_DIPNAME( 0x40, 0x00, "Bonus Life", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "30000" )
PORT_DIPSETTING( 0x40, "50000" )
PORT_DIPNAME( 0x80, 0x80, "Language", IP_KEY_NONE )
PORT_DIPSETTING( 0x80, "English" )
PORT_DIPSETTING( 0x00, "Japanese" )
PORT_START /* DSW */
PORT_DIPNAME( 0x03, 0x00, "Coin A", IP_KEY_NONE )
PORT_DIPSETTING( 0x03, "4 Coins/1 Credit" )
PORT_DIPSETTING( 0x02, "3 Coins/1 Credit" )
PORT_DIPSETTING( 0x01, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPNAME( 0x0c, 0x00, "Coin B", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x04, "1 Coin/2 Credits" )
PORT_DIPSETTING( 0x08, "1 Coin/3 Credits" )
PORT_DIPSETTING( 0x0c, "Free Play" )
PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
INPUT_PORTS_START( moonqsr_input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_DIPNAME( 0x20, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x20, "Cocktail" )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* "reset" on schematics */
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN3 )
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY | IPF_PLAYER2 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY | IPF_PLAYER2 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* probably unused */
PORT_DIPNAME( 0xc0, 0x00, "Difficulty", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Easy" )
PORT_DIPSETTING( 0x40, "Medium" )
PORT_DIPSETTING( 0x80, "Hard" )
PORT_DIPSETTING( 0xc0, "Hardest" )
PORT_START /* DSW1 */
PORT_DIPNAME( 0x03, 0x00, "Coin A", IP_KEY_NONE )
PORT_DIPSETTING( 0x03, "4 Coins/1 Credit" )
PORT_DIPSETTING( 0x02, "3 Coins/1 Credit" )
PORT_DIPSETTING( 0x01, "2 Coins/1 Credit" )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPNAME( 0x0c, 0x00, "Coin B", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "1 Coin/1 Credit" )
PORT_DIPSETTING( 0x04, "1 Coin/2 Credits" )
PORT_DIPSETTING( 0x08, "1 Coin/3 Credits" )
PORT_DIPSETTING( 0x0c, "Free Play" )
PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
INPUT_PORTS_START( checkman_input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) /* 6 credits */
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) /* 1 credit */
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_COCKTAIL ) /* p2 tiles right */
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_COCKTAIL )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) /* also p1 tiles left */
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) /* also p1 tiles right */
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL ) /* p2 tiles left */
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_COCKTAIL )
PORT_DIPNAME( 0x40, 0x00, "Coinage", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "A 1/1 B 1/6" )
PORT_DIPSETTING( 0x40, "A 2/1 B 1/3" )
PORT_DIPNAME( 0x80, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x80, "Cocktail" )
PORT_START /* DSW */
PORT_DIPNAME( 0x03, 0x00, "Lives", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "3" )
PORT_DIPSETTING( 0x01, "4" )
PORT_DIPSETTING( 0x02, "5" )
PORT_DIPSETTING( 0x03, "6" )
PORT_DIPNAME( 0x04, 0x00, "Unknown", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Off" )
PORT_DIPSETTING( 0x04, "On" )
PORT_DIPNAME( 0x08, 0x00, "Unknown", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Off" )
PORT_DIPSETTING( 0x08, "On" )
PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
INPUT_PORTS_START( moonal2_input_ports )
PORT_START /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_DIPNAME( 0x20, 0x00, "Cabinet", IP_KEY_NONE )
PORT_DIPSETTING( 0x00, "Upright" )
PORT_DIPSETTING( 0x20, "Cocktail" )
PORT_BITX( 0x40, 0x00, IPT_DIPSWITCH_NAME | IPF_TOGGLE, "Service Mode", OSD_KEY_F2, IP_JOY_NONE, 0 )
PORT_DIPSETTING( 0x00, "Off" )
PORT_DIPSETTING( 0x40, "On" )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN3 ) /* works only in the Gremlin version */
PORT_START /* IN1 */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_2WAY | IPF_COCKTAIL )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_2WAY | IPF_COCKTAIL )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* probably unused */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -