A major rewrite of skychut.c lying around for months. There are still some glitches and it is not perfect but the following has been achieved:

* fixes skychut37b1yel 
* fixes skychut37b6gre
* adds samples to ipm invaders - just rename your old invaders samples to ipminvad to test
* added - amongst others - "capsule" dip switch to ipm invaders
* sound ports identified
* demo sound and cabinet type driver configuration
* more I don't remember
This commit is contained in:
Couriersud 2008-01-06 18:05:41 +00:00
parent c3cea73c75
commit 7ce3ee6529
4 changed files with 798 additions and 166 deletions

1
.gitattributes vendored
View File

@ -2256,6 +2256,7 @@ src/mame/includes/segas32.h svneol=native#text/plain
src/mame/includes/seta.h svneol=native#text/plain
src/mame/includes/shuuz.h svneol=native#text/plain
src/mame/includes/skullxbo.h svneol=native#text/plain
src/mame/includes/skychut.h svneol=native#text/plain
src/mame/includes/skydiver.h svneol=native#text/plain
src/mame/includes/slapstic.h svneol=native#text/plain
src/mame/includes/snes.h svneol=native#text/plain

View File

@ -86,17 +86,39 @@ Notes:
***************************************************************************/
/***************************************************************************
Notes (couriersud)
From http://www.crazykong.com/tech/IremBoardList.txt
skychut: M-11
andromed: N/A
ipminvad: N/A
spacbeam: not listed
headon: not listed
greenber: N/A
M10-Board: Has SN76477
***************************************************************************/
#include "driver.h"
#include "sound/samples.h"
extern UINT8* iremm15_chargen;
#include "skychut.h"
VIDEO_UPDATE( skychut );
VIDEO_UPDATE( iremm15 );
WRITE8_HANDLER( skychut_colorram_w );
WRITE8_HANDLER( skychut_ctrl_w );
/*************************************
*
* Defines
*
*************************************/
static UINT8 *memory;
#define DEBUG (0)
/*************************************
*
* Initialization
*
*************************************/
static PALETTE_INIT( skychut )
{
@ -118,64 +140,410 @@ static PALETTE_INIT( skychut )
}
}
static MACHINE_RESET( irem )
{
irem_state *state = Machine->driver_data;
static ADDRESS_MAP_START( skychut_readmem, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_READ(MRA8_RAM) /* scratch ram */
AM_RANGE(0x1000, 0x2fff) AM_READ(MRA8_ROM)
AM_RANGE(0x4000, 0x43ff) AM_READ(MRA8_RAM)
AM_RANGE(0x4800, 0x4bff) AM_READ(MRA8_RAM) /* Foreground colour */
AM_RANGE(0x5000, 0x53ff) AM_READ(MRA8_RAM) /* BKgrnd colour ??? */
AM_RANGE(0xa200, 0xa200) AM_READ(input_port_1_r)
AM_RANGE(0xa300, 0xa300) AM_READ(input_port_0_r)
/* AM_RANGE(0xa700, 0xa700) AM_READ(input_port_3_r)*/
AM_RANGE(0xfc00, 0xffff) AM_READ(MRA8_ROM) /* for the reset / interrupt vectors */
ADDRESS_MAP_END
state_save_register_global(state->bottomline);
state_save_register_global(state->flip);
}
/*************************************
*
* I/O handling
*
*************************************/
/*
* M10 Ctrl Port
*
* 76543210
* ========
* e------- ACTIVE LOW Demo mode
* -?------ ????
* --b----- ACTIVE LOW Bottom line
* ---f---- ACTIVE LOW Flip screen
* ----u--- ACTIVE LOW Ufo sound enable (SN76477)
* -----sss Sound #sss start
* 0x01: MISSILE
* 0x02: EXPLOSION
* 0x03: INVADER HIT
* 0x04: BONUS BASE
* 0x05: FLEET MOVE
* 0x06: SAUCER HIT
*/
WRITE8_HANDLER( iremm10_ctrl_w )
{
irem_state *state = Machine->driver_data;
#if DEBUG
if (data & 0x40)
popmessage("ctrl: %02x",data);
#endif
/* I have NO IDEA if this is correct or not */
state->bottomline = ~data & 0x20;
if (readinputportbytag("CAB") & 0x01)
state->flip = ~data & 0x10;
if (!(readinputportbytag("CAB") & 0x02))
sound_global_enable(~data & 0x80);
/* sound command in lower 4 bytes */
switch (data & 0x07)
{
case 0x00:
/* no sound mapped */
break;
case 0x01:
/* MISSILE sound */
sample_start_n(0, 0, 0, 0);
break;
case 0x02:
/* EXPLOSION sound */
sample_start_n(0, 1, 1, 0);
break;
case 0x03:
/* INVADER HIT sound */
sample_start_n(0, 2, 2, 0);
break;
case 0x04:
/* BONUS BASE sound */
sample_start_n(0, 3, 8, 0);
break;
case 0x05:
/* FLEET MOVE sound */
sample_start_n(0, 3, 3, 0);
break;
case 0x06:
/* SAUCER HIT SOUND */
sample_start_n(0, 2, 7, 0);
break;
default:
popmessage("Unknown sound M10: %02x\n", data & 0x07);
break;
}
/* UFO SOUND */
if (data & 0x08)
sample_stop_n(0, 4);
else
sample_start_n(0, 4, 9, 1);
}
/*
* M11 Ctrl Port
*
* 76543210
* ========
* e------- ACTIVE LOW Demo mode
* -?------ ????
* --b----- ACTIVE LOW Bottom line
* ---f---- ACTIVE LOW Flip screen
* ----??-- ????
* ------cc Credits indicator ?
* 0x03: 0 Credits
* 0x02: 1 Credit
* 0x00: 2 or more credits
* Will be updated only in attract mode
*/
WRITE8_HANDLER( iremm11_ctrl_w )
{
irem_state *state = Machine->driver_data;
#if DEBUG
if (data & 0x4C)
popmessage("M11 ctrl: %02x",data);
#endif
state->bottomline = ~data & 0x20;
if (readinputportbytag("CAB") & 0x01)
state->flip = ~data & 0x10;
if (!(readinputportbytag("CAB") & 0x02))
sound_global_enable(~data & 0x80);
}
/*
* M15 Ctrl Port
*
* 76543210
* ========
* ????---- ????
* ----e--- ACTIVE LOW Demo mode
* -----f-- ACTIVE LOW Flip screen
* ------cc Credits indicator ?
* 0x03: 0 Credits
* 0x02: 1 Credit
* 0x00: 2 or more credits
* Will be updated only in attract mode
*/
WRITE8_HANDLER( iremm15_ctrl_w )
{
irem_state *state = Machine->driver_data;
#if DEBUG
if (data & 0xF0)
popmessage("M15 ctrl: %02x",data);
#endif
if (readinputportbytag("CAB") & 0x01)
state->flip = ~data & 0x04;
if (!(readinputportbytag("CAB") & 0x02))
sound_global_enable(~data & 0x08);
}
static ADDRESS_MAP_START( skychut_writemem, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_WRITE(MWA8_RAM) AM_BASE(&memory)
AM_RANGE(0x1000, 0x2fff) AM_WRITE(MWA8_ROM)
AM_RANGE(0x4000, 0x43ff) AM_WRITE(videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_WRITE(skychut_colorram_w) AM_BASE(&colorram) /* foreground colour */
AM_RANGE(0x5000, 0x53ff) AM_WRITE(MWA8_RAM) AM_BASE(&iremm15_chargen) /* background ????? */
// AM_RANGE(0xa100, 0xa1ff) AM_WRITE(MWA8_RAM) /* Sound writes????? */
AM_RANGE(0xa400, 0xa400) AM_WRITE(skychut_ctrl_w) /* line at bottom of screen?, sound, flip screen */
AM_RANGE(0xfc00, 0xffff) AM_WRITE(MWA8_ROM) /* for the reset / interrupt vectors */
ADDRESS_MAP_END
/*
* M10 A500
*
* 76543210
* ========
* ??????-- Always 111111
* ------cc Credits indicator ?
* 0x03: 0 Credits
* 0x02: 1 Credit
* 0x00: 2 or more credits
* Will be updated only in attract mode
*/
static ADDRESS_MAP_START( greenberet_readmem, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_READ(MRA8_RAM) /* scratch ram */
AM_RANGE(0x1000, 0x33ff) AM_READ(MRA8_ROM)
AM_RANGE(0x4000, 0x43ff) AM_READ(MRA8_RAM)
AM_RANGE(0x4800, 0x4bff) AM_READ(MRA8_RAM) /* Foreground colour */
AM_RANGE(0x5000, 0x57ff) AM_READ(MRA8_RAM)
AM_RANGE(0xa000, 0xa000) AM_READ(input_port_3_r)
AM_RANGE(0xa200, 0xa200) AM_READ(input_port_1_r)
AM_RANGE(0xa300, 0xa300) AM_READ(input_port_0_r)
AM_RANGE(0xfc00, 0xffff) AM_READ(MRA8_ROM) /* for the reset / interrupt vectors */
ADDRESS_MAP_END
WRITE8_HANDLER( iremm10_a500_w )
{
#if DEBUG
if (data & 0xFC)
popmessage("a500: %02x",data);
#endif
}
static ADDRESS_MAP_START( greenberet_writemem, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_WRITE(MWA8_RAM) AM_BASE(&memory)
AM_RANGE(0x1000, 0x33ff) AM_WRITE(MWA8_ROM)
AM_RANGE(0x4000, 0x43ff) AM_WRITE(videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_WRITE(skychut_colorram_w) AM_BASE(&colorram) /* foreground colour */
AM_RANGE(0x5000, 0x57ff) AM_WRITE(MWA8_RAM) AM_BASE(&iremm15_chargen)
AM_RANGE(0xa100, 0xa1ff) AM_WRITE(MWA8_RAM) /* Sound writes????? */
AM_RANGE(0xa400, 0xa400) AM_WRITE(MWA8_NOP) /* sound, flip screen */
AM_RANGE(0xfc00, 0xffff) AM_WRITE(MWA8_ROM) /* for the reset / interrupt vectors */
ADDRESS_MAP_END
WRITE8_HANDLER( iremm11_a100_w )
{
static int last = 0x00;
int raising_bits = data & ~last;
//int falling_bits = ~data & last;
// should a falling bit stop a sample?
// This port is written to about 20x per vblank
#if DEBUG
if ((last & 0xE8) != (data & 0xE8))
popmessage("A100: %02x\n", data);
#endif
last = data;
// audio control!
/* MISSILE sound */
if (raising_bits & 0x01)
sample_start_n(0, 0, 0, 0);
/* EXPLOSION sound */
if (raising_bits & 0x02)
sample_start_n(0, 1, 1, 0);
static INTERRUPT_GEN( skychut_interrupt )
/* Rapidly falling parachute */
if (raising_bits & 0x04)
sample_start_n(0, 3, 8, 0);
/* Background sound ? */
if (data & 0x10)
sample_start_n(0, 4, 9, 1);
else
sample_stop_n(0, 4);
}
WRITE8_HANDLER( iremm15_a100_w )
{
static int last = 0x00;
//int raising_bits = data & ~last;
int falling_bits = ~data & last;
// should a falling bit stop a sample?
// Bit 4 is used
// Bit 5 is used 0xef
// Bit 7 is used
// headoni
// 0x01: Acceleration
// 0x04: background (motor) ?
// 0x08: explosion
// 0x10: player changes lane
// 0x20: computer car changes lane
// 0x40: dot
#if DEBUG
if ((last & 0x82) != (data & 0x82))
popmessage("A100: %02x\n", data);
#endif
/* DOT sound */
if (falling_bits & 0x40)
sample_start_n(0, 0, 0, 0);
#if 0
if (raising_bits & 0x40)
sample_stop_n(0, 0);
#endif
/* EXPLOSION sound */
if (falling_bits & 0x08)
sample_start_n(0, 1, 1, 0);
#if 0
if (raising_bits & 0x08)
sample_stop_n(0, 1);
#endif
/* player changes lane */
if (falling_bits & 0x10)
sample_start_n(0, 3, 3, 0);
#if 0
if (raising_bits & 0x10)
sample_stop_n(0, 3);
#endif
/* computer car changes lane */
if (falling_bits & 0x20)
sample_start_n(0, 4, 4, 0);
#if 0
if (raising_bits & 0x20)
sample_stop_n(0, 4);
#endif
last = data;
}
READ8_HANDLER( iremm10_a700_r )
{
//printf("rd:%d\n",video_screen_get_vpos(0));
cpunum_set_input_line(0, 0, CLEAR_LINE);
return 0x00;
}
READ8_HANDLER( iremm11_a700_r )
{
//printf("rd:%d\n",video_screen_get_vpos(0));
return 0x00;
}
/*************************************
*
* Interrupt handling
*
*************************************/
TIMER_CALLBACK( skychut_callback )
{
if (param==0)
{
cpunum_set_input_line(0, 0, ASSERT_LINE);
timer_set(video_screen_get_time_until_pos(0, IREMM10_VBSTART+16, 0), NULL, 1,skychut_callback);
}
if (param==1)
{
cpunum_set_input_line(0, 0, ASSERT_LINE);
timer_set(video_screen_get_time_until_pos(0, IREMM10_VBSTART+24, 0), NULL, 2,skychut_callback);
}
if (param==-1)
cpunum_set_input_line(0, 0, CLEAR_LINE);
}
INTERRUPT_GEN( iremm11_interrupt )
{
if (readinputport(2) & 1) /* Left Coin */
cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE);
else
cpunum_set_input_line(0, 0, HOLD_LINE);
{
cpunum_set_input_line(0, 0, ASSERT_LINE);
timer_set(video_screen_get_time_until_pos(0, IREMM10_VBEND, 0), NULL, -1,skychut_callback);
}
}
static INPUT_PORTS_START( skychut )
INTERRUPT_GEN( iremm10_interrupt )
{
if (readinputport(2) & 1) /* Left Coin */
cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE);
else
cpunum_set_input_line(0, 0, ASSERT_LINE);
}
INTERRUPT_GEN( iremm15_interrupt )
{
if (readinputport(2) & 1) /* Left Coin */
cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE);
else
{
cpunum_set_input_line(0, 0, ASSERT_LINE);
timer_set(video_screen_get_time_until_pos(0, IREMM10_VBSTART+1, 80), NULL, -1,skychut_callback);
}
}
/*************************************
*
* Main CPU memory handlers
*
*************************************/
static ADDRESS_MAP_START( iremm10_main, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(irem_state, memory) /* scratch ram */
AM_RANGE(0x1000, 0x2fff) AM_READ(MRA8_ROM) AM_BASE_MEMBER(irem_state, rom)
AM_RANGE(0x4000, 0x43ff) AM_READWRITE(MRA8_RAM, videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_READWRITE(MRA8_RAM, skychut_colorram_w) AM_BASE(&colorram) /* foreground colour */
AM_RANGE(0x5000, 0x53ff) AM_RAM AM_BASE_MEMBER(irem_state, chargen) /* background ????? */
AM_RANGE(0xa200, 0xa200) AM_READ(input_port_1_r)
AM_RANGE(0xa300, 0xa300) AM_READ(input_port_0_r)
AM_RANGE(0xa400, 0xa400) AM_WRITE(iremm10_ctrl_w) /* line at bottom of screen?, sound, flip screen */
AM_RANGE(0xa500, 0xa500) AM_WRITE(iremm10_a500_w) /* ??? */
AM_RANGE(0xa700, 0xa700) AM_READ(iremm10_a700_r)
AM_RANGE(0xfc00, 0xffff) AM_READ(MRA8_ROM) /* for the reset / interrupt vectors */
ADDRESS_MAP_END
static ADDRESS_MAP_START( iremm11_main, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(irem_state, memory) /* scratch ram */
AM_RANGE(0x1000, 0x2fff) AM_READ(MRA8_ROM) AM_BASE_MEMBER(irem_state, rom)
AM_RANGE(0x4000, 0x43ff) AM_READWRITE(MRA8_RAM, videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_READWRITE(MRA8_RAM, skychut_colorram_w) AM_BASE(&colorram) /* foreground colour */
AM_RANGE(0x5000, 0x53ff) AM_RAM AM_BASE_MEMBER(irem_state, chargen) /* background ????? */
AM_RANGE(0xa100, 0xa100) AM_WRITE(iremm11_a100_w) /* sound writes ???? */
AM_RANGE(0xa200, 0xa200) AM_READ(input_port_1_r)
AM_RANGE(0xa300, 0xa300) AM_READ(input_port_0_r)
AM_RANGE(0xa400, 0xa400) AM_WRITE(iremm11_ctrl_w) /* line at bottom of screen?, sound, flip screen */
AM_RANGE(0xa700, 0xa700) AM_READ(iremm11_a700_r)
AM_RANGE(0xfc00, 0xffff) AM_READ(MRA8_ROM) /* for the reset / interrupt vectors */
ADDRESS_MAP_END
static ADDRESS_MAP_START( iremm15_main, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(irem_state, memory) /* scratch ram */
AM_RANGE(0x1000, 0x33ff) AM_READ(MRA8_ROM) AM_BASE_MEMBER(irem_state, rom)
AM_RANGE(0x4000, 0x43ff) AM_READWRITE(MRA8_RAM, videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_READWRITE(MRA8_RAM, skychut_colorram_w) AM_BASE(&colorram) /* foreground colour */
AM_RANGE(0x5000, 0x57ff) AM_READWRITE(MRA8_RAM, iremm15_chargen_w) AM_BASE_MEMBER(irem_state, chargen) /* background ????? */
AM_RANGE(0xa000, 0xa000) AM_READ(input_port_3_r)
AM_RANGE(0xa100, 0xa100) AM_WRITE(iremm15_a100_w) /* sound writes ???? */
AM_RANGE(0xa200, 0xa200) AM_READ(input_port_1_r)
AM_RANGE(0xa300, 0xa300) AM_READ(input_port_0_r)
AM_RANGE(0xa400, 0xa400) AM_WRITE(iremm15_ctrl_w) /* sound, flip screen */
AM_RANGE(0xfc00, 0xffff) AM_READ(MRA8_ROM) /* for the reset / interrupt vectors */
ADDRESS_MAP_END
/*************************************
*
* Port definitions
*
*************************************/
#define CAB_PORTENV \
/* fake port for cabinet type */ \
PORT_START_TAG("CAB") \
PORT_CONFNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) \
PORT_CONFSETTING( 0x00, DEF_STR( Upright ) ) \
PORT_CONFSETTING( 0x01, DEF_STR( Cocktail ) ) \
PORT_CONFNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) \
PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) \
PORT_CONFSETTING( 0x02, DEF_STR( On ) ) \
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_START( skychut )
PORT_START
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
@ -191,12 +559,73 @@ static INPUT_PORTS_START( skychut )
PORT_DIPSETTING ( 0x00, "3" )
PORT_DIPSETTING ( 0x01, "4" )
PORT_DIPSETTING ( 0x02, "5" )
PORT_DIPNAME( 0x04, 0x00, "Unknown 1" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "Unknown 2" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, "Unknown 3" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Unknown 4" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, "Unknown 5" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, "Unknown 6" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START /* FAKE */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1)
CAB_PORTENV
INPUT_PORTS_END
static INPUT_PORTS_START( spacebeam )
INPUT_PORTS_START( ipminvad )
PORT_START
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_COCKTAIL
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
PORT_START /* IN1 */
PORT_DIPNAME(0x03, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING ( 0x00, "3" )
PORT_DIPSETTING ( 0x01, "4" )
PORT_DIPSETTING ( 0x02, "5" )
PORT_DIPNAME( 0x04, 0x00, "Capsules" )
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x04, DEF_STR( Yes ) )
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) )
PORT_DIPSETTING( 0x00, "1500" )
PORT_DIPSETTING( 0x08, "1000" )
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Coin_A ) )
PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) ) // Verified with debugger
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START /* FAKE */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1)
CAB_PORTENV
INPUT_PORTS_END
INPUT_PORTS_START( spacebeam )
PORT_START
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
@ -226,9 +655,11 @@ static INPUT_PORTS_START( spacebeam )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
CAB_PORTENV
INPUT_PORTS_END
static INPUT_PORTS_START( headoni )
INPUT_PORTS_START( headoni )
PORT_START
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
@ -261,10 +692,18 @@ static INPUT_PORTS_START( headoni )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
CAB_PORTENV
INPUT_PORTS_END
/*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
@ -281,57 +720,121 @@ static GFXDECODE_START( skychut )
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 8 )
GFXDECODE_END
/*************************************
*
* Sound definitions
*
*************************************/
static const char *iremm10_sample_names[] =
{
"*ipminvad",
"1.wav", /* shot/missle */
"2.wav", /* base hit/explosion */
"3.wav", /* invader hit */
"4.wav", /* fleet move 1 */
"5.wav", /* fleet move 2 */
"6.wav", /* fleet move 3 */
"7.wav", /* fleet move 4 */
"8.wav", /* UFO/saucer hit */
"9.wav", /* bonus base */
"0.wav", /* UFO sound */
0
};
static MACHINE_DRIVER_START( skychut )
static struct Samplesinterface iremm10_samples_interface =
{
6, /* 6 channels */
iremm10_sample_names
};
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_DRIVER_START( iremm10 )
MDRV_DRIVER_DATA(irem_state)
/* basic machine hardware */
MDRV_CPU_ADD(M6502,20000000/8)
MDRV_CPU_PROGRAM_MAP(skychut_readmem,skychut_writemem)
MDRV_CPU_VBLANK_INT(skychut_interrupt,1)
MDRV_CPU_ADD_TAG("Main", M6502,IREMM10_CPU_CLOCK)
MDRV_CPU_PROGRAM_MAP(iremm10_main,0)
MDRV_MACHINE_RESET(irem)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_CPU_VBLANK_INT(iremm10_interrupt,1)
MDRV_SCREEN_RAW_PARAMS(IREMM10_PIXEL_CLOCK, IREMM10_HTOTAL, IREMM10_HBEND, IREMM10_HBSTART, IREMM10_VTOTAL, IREMM10_VBEND, IREMM10_VBSTART)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(skychut)
MDRV_PALETTE_LENGTH(8)
MDRV_COLORTABLE_LENGTH(2*8)
MDRV_PALETTE_INIT(skychut)
MDRV_VIDEO_START(generic)
MDRV_VIDEO_UPDATE(skychut)
//MDRV_VIDEO_START(generic)
MDRV_VIDEO_START(iremm10)
MDRV_VIDEO_UPDATE(iremm10)
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD(SAMPLES, 0)
MDRV_SOUND_CONFIG(iremm10_samples_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( iremm11 )
MDRV_DRIVER_DATA(irem_state)
/* basic machine hardware */
MDRV_IMPORT_FROM(iremm10)
MDRV_CPU_REPLACE("Main", M6502,IREMM10_CPU_CLOCK / 2)
//MDRV_CPU_MODIFY("Main")
MDRV_CPU_PROGRAM_MAP(iremm11_main,0)
MDRV_CPU_VBLANK_INT(iremm11_interrupt,1)
/* sound hardware */
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( greenberet )
/* basic machine hardware */
MDRV_CPU_ADD_TAG("main", M6502,11730000/10)
MDRV_CPU_PROGRAM_MAP(greenberet_readmem,greenberet_writemem)
MDRV_CPU_VBLANK_INT(skychut_interrupt,1)
MDRV_DRIVER_DATA(irem_state)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
/* basic machine hardware */
MDRV_CPU_ADD_TAG("main", M6502,IREMM15_CPU_CLOCK)
MDRV_CPU_PROGRAM_MAP(iremm15_main,0)
MDRV_MACHINE_RESET(irem)
MDRV_CPU_VBLANK_INT(iremm15_interrupt,1)
MDRV_SCREEN_RAW_PARAMS(IREMM15_PIXEL_CLOCK, IREMM15_HTOTAL, IREMM15_HBEND, IREMM15_HBSTART, IREMM15_VTOTAL, IREMM15_VBEND, IREMM15_VBSTART)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_PALETTE_LENGTH(8)
MDRV_COLORTABLE_LENGTH(2*8)
MDRV_PALETTE_INIT(skychut)
MDRV_VIDEO_START(generic)
MDRV_VIDEO_START( iremm15 )
MDRV_VIDEO_UPDATE(iremm15)
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD(SAMPLES, 0)
MDRV_SOUND_CONFIG(iremm10_samples_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_DRIVER_END
@ -340,7 +843,18 @@ static MACHINE_DRIVER_START( headoni )
MDRV_CPU_REPLACE("main", M6502,11730000/16)
MACHINE_DRIVER_END
static DRIVER_INIT( andromed )
{
int i;
irem_state *state = machine->driver_data;
for (i=0x1c00;i<0x2000;i++)
state->rom[i]=0x60;
}
static DRIVER_INIT( iremm15 )
{
}
/***************************************************************************
@ -359,7 +873,8 @@ ROM_START( andromed )//Jumps to an unmapped sub-routine at $2fc9
ROM_LOAD( "am5", 0x2000, 0x0400, CRC(518a3b88) SHA1(5e20c905c2190b381a105327e112fcc0a127bb2f) )
ROM_LOAD( "am6", 0x2400, 0x0400, CRC(ce3d5fff) SHA1(c34178aca9ffb8b2dd468d9e3369a985f52daf9a) )
ROM_LOAD( "am7", 0x2800, 0x0400, CRC(30d3366f) SHA1(aa73bba194fa6d1f3909f8df517a0bff07583ea9) )
ROM_LOAD( "am8", 0x2c00, 0x0400, NO_DUMP ) // $60 entries
ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE )
ROM_LOAD( "am9", 0x0000, 0x0400, CRC(a1c8f4db) SHA1(bedf5d7126c7e9b91ad595188c69aa2c043c71e8) )
ROM_LOAD( "am10", 0x0400, 0x0400, CRC(be2de8f3) SHA1(7eb3d1eb88b4481b0dcb7d001207f516a5db32b3) )
@ -434,9 +949,9 @@ ROM_START( greenber )
ROM_LOAD( "gb9", 0x3000, 0x0400, CRC(c27b9ba3) SHA1(a2f4f0c4b61eb03bba13ae5d25dc01009a4f86ee) ) // ok ?
ROM_END
GAME( 1979, andromed, 0, skychut, skychut, 0, ROT270, "Irem", "Andromeda (Japan?)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING )
GAME( 1979?,ipminvad, 0, skychut, skychut, 0, ROT270, "Irem", "IPM Invader", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS )
GAME( 1980, skychut, 0, skychut, skychut, 0, ROT270, "Irem", "Sky Chuter", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS )
GAME( 1979, spacbeam, 0, greenberet, spacebeam, 0, ROT270, "Irem", "Space Beam", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS )
GAME( 1979?,headoni, 0, headoni, headoni, 0, ROT270, "Irem", "Head On (Irem, M-15 Hardware)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS )
GAME( 1980, greenber, 0, greenberet, spacebeam, 0, ROT270, "Irem", "Green Beret (Irem)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING )
GAME( 1979, andromed, 0, iremm11, skychut, andromed, ROT270, "Irem", "Andromeda (Japan?)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING )
GAME( 1979?,ipminvad, 0, iremm10, ipminvad, 0, ROT270, "Irem", "IPM Invader", GAME_NO_COCKTAIL | GAME_IMPERFECT_COLORS )
GAME( 1980, skychut, 0, iremm11, skychut, 0, ROT270, "Irem", "Sky Chuter", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS )
GAME( 1979, spacbeam, 0, greenberet, spacebeam, iremm15, ROT270, "Irem", "Space Beam", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS )
GAME( 1979?,headoni, 0, headoni, headoni, iremm15, ROT270, "Irem", "Head On (Irem, M-15 Hardware)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS )
GAME( 1980, greenber, 0, greenberet, spacebeam, iremm15, ROT270, "Irem", "Green Beret (Irem)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING )

View File

@ -0,0 +1,61 @@
/***************************************************************************
IREM M-10,M-11 and M-15 based hardware
****************************************************************************/
#define IREMM10_MASTER_CLOCK (25000000)
#define IREMM10_CPU_CLOCK (IREMM10_MASTER_CLOCK/20)
#define IREMM10_PIXEL_CLOCK (IREMM10_MASTER_CLOCK/5)
#define IREMM10_HTOTAL (318)
#define IREMM10_HBSTART (248)
#define IREMM10_HBEND (8)
#define IREMM10_VTOTAL (262)
#define IREMM10_VBSTART (240)
#define IREMM10_VBEND (16)
#define IREMM15_MASTER_CLOCK (11730000)
#define IREMM15_CPU_CLOCK (IREMM15_MASTER_CLOCK/10)
#define IREMM15_PIXEL_CLOCK (IREMM15_MASTER_CLOCK/2)
#define IREMM15_HTOTAL (372)
#define IREMM15_HBSTART (256)
#define IREMM15_HBEND (0)
#define IREMM15_VTOTAL (262)
#define IREMM15_VBSTART (240)
#define IREMM15_VBEND (16)
typedef struct _irem_state irem_state;
struct _irem_state
{
/* memory pointers */
UINT8 * chargen;
UINT8 * memory;
UINT8 * rom;
/* machine states */
/* sound state */
/* video state */
UINT8 bottomline;
UINT8 flip;
/* Specific states */
};
/*----------- defined in video/skychut.c -----------*/
WRITE8_HANDLER( skychut_colorram_w );
WRITE8_HANDLER( iremm15_chargen_w );
VIDEO_UPDATE( iremm10 );
VIDEO_UPDATE( iremm15 );
VIDEO_START( iremm10 );
VIDEO_START( iremm15 );

View File

@ -6,133 +6,188 @@
(c) 12/2/1998 Lee Taylor
2006 - major rewrite by couriersud
***************************************************************************/
#include "driver.h"
#include "skychut.h"
static tilemap * tx_tilemap;
static gfx_element * back_gfx;
static UINT32 extyoffs[32*8];
static UINT32 extxoffs[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
static const gfx_layout backlayout =
{
8,8*32, /* 8*8 characters */
4, /* 256 characters */
1, /* 1 bits per pixel */
{ 0 },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8*32, 1*8*32, 2*8*32, 3*8*32, 4*8*32, 5*8*32, 6*8*32, 7*8*32 },
32*8*8, /* every char takes 8 consecutive bytes */
extxoffs, extyoffs
};
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
256, /* 256 characters */
1, /* 1 bits per pixel */
{ 0 },
{ 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 UINT32 tilemap_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)
{
//irem_state *state = Machine->driver_data;
return (31-col)*32 + row;
}
UINT8 *iremm15_chargen;
static int bottomline;
static void get_tile_info(running_machine *machine, tile_data *tileinfo, tilemap_memory_index tile_index, void *param)
{
SET_TILE_INFO(0, videoram[tile_index], colorram[tile_index] & 0x07, 0);
}
WRITE8_HANDLER( skychut_colorram_w )
{
colorram[offset] = data;
}
WRITE8_HANDLER( skychut_ctrl_w )
{
//popmessage("%02x",data);
/* I have NO IDEA if this is correct or not */
bottomline = ~data & 0x20;
if (colorram[offset] != data)
{
tilemap_mark_tile_dirty(tx_tilemap, offset);
colorram[offset] = data;
}
}
VIDEO_UPDATE( skychut )
WRITE8_HANDLER( iremm15_chargen_w )
{
irem_state *state = Machine->driver_data;
if (state->chargen[offset] != data)
{
state->chargen[offset] = data;
/* not very effective ... dirty would be better */
decodechar(Machine->gfx[0],offset >> 3,state->chargen, &Machine->gfx[0]->layout);
}
}
INLINE void plot_pixel_iremm10(mame_bitmap *bm, int x, int y, int col)
{
irem_state *state = Machine->driver_data;
if (!state->flip)
*BITMAP_ADDR16(bm, y, x) = col;
else
*BITMAP_ADDR16(bm, (IREMM10_VBSTART - 1)- (y - IREMM10_VBEND) + 6
, (IREMM10_HBSTART - 1)- (x- IREMM10_HBEND)) = col; // only when flip_screen(?)
}
VIDEO_START( iremm10 )
{
//irem_state *state = machine->driver_data;
int i;
for (i=0;i<32*8;i++)
extyoffs[i] = i*8;
video_start_generic(machine);
tx_tilemap = tilemap_create(get_tile_info,tilemap_scan,TILEMAP_TYPE_COLORTABLE,8,8,32,32);
tilemap_set_transparent_pen(tx_tilemap, 0x07);
tilemap_set_scrolldx(tx_tilemap, 0, 62);
tilemap_set_scrolldy(tx_tilemap, 0, 0);
back_gfx = allocgfx(&backlayout);
back_gfx->total_colors = 8;
machine->gfx[1] = back_gfx;
return ;
}
VIDEO_START( iremm15 )
{
irem_state *state = machine->driver_data;
machine->gfx[0] = allocgfx(&charlayout);
machine->gfx[0]->total_colors = 8;
decodegfx(machine->gfx[0], state->chargen,0,256);
video_start_generic(machine);
tx_tilemap = tilemap_create(get_tile_info,tilemap_scan,TILEMAP_TYPE_PEN,8,8,32,32);
tilemap_set_scrolldx(tx_tilemap, 0, 116);
tilemap_set_scrolldy(tx_tilemap, 0, 0);
return ;
}
/***************************************************************************
Draw the game screen in the given mame_bitmap.
***************************************************************************/
VIDEO_UPDATE( iremm10 )
{
irem_state *state = machine->driver_data;
int offs;
int color[4]= { 3, 3, 5, 5};
int xpos[4] = { 4*8, 26*8, 7*8, 6*8} ;
int i;
fillbitmap(bitmap,machine->pens[7],cliprect);
for (offs = 0;offs < 0x400;offs++)
{
int mask=iremm15_chargen[offs];
int x = offs / 256;
int y = offs % 256;
int col = 0;
decodegfx(back_gfx, state->chargen,0,4);
for (i=0;i<4;i++)
if (state->flip)
drawgfx(bitmap, back_gfx, i, color[i], 1, 1, 31*8 - xpos[i], 6, cliprect, 0, 0);
else
drawgfx(bitmap, back_gfx, i, color[i], 0, 0, xpos[i], 0, cliprect, 0, 0);
switch (x)
{
case 0: x = 4*8; col = 3; break;
case 1: x = 26*8; col = 3; break;
case 2: x = 7*8; col = 5; break;
case 3: x = 6*8; col = 5; break;
}
if (x >= cliprect->min_x && x+7 <= cliprect->max_x
&& y >= cliprect->min_y && y <= cliprect->max_y)
{
if (mask&0x80) *BITMAP_ADDR16(bitmap, y, x+0) = col;
if (mask&0x40) *BITMAP_ADDR16(bitmap, y, x+1) = col;
if (mask&0x20) *BITMAP_ADDR16(bitmap, y, x+2) = col;
if (mask&0x10) *BITMAP_ADDR16(bitmap, y, x+3) = col;
if (mask&0x08) *BITMAP_ADDR16(bitmap, y, x+4) = col;
if (mask&0x04) *BITMAP_ADDR16(bitmap, y, x+5) = col;
if (mask&0x02) *BITMAP_ADDR16(bitmap, y, x+6) = col;
if (mask&0x01) *BITMAP_ADDR16(bitmap, y, x+7) = col;
}
}
if (bottomline)
if (state->bottomline)
{
int y;
for (y = cliprect->min_y;y <= cliprect->max_y;y++)
for (y = IREMM10_VBEND;y < IREMM10_VBSTART;y++)
{
*BITMAP_ADDR16(bitmap, y, 16) = 0;
plot_pixel_iremm10(bitmap,16,y,0);
}
}
for (offs = videoram_size - 1;offs >= 0;offs--)
{
int sx,sy;
tilemap_mark_tile_dirty(tx_tilemap, offs);
sx = 31 - offs / 32;
sy = offs % 32;
tilemap_set_flip(tx_tilemap, state->flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
drawgfx(bitmap,machine->gfx[0],
videoram[offs],
colorram[offs],
0,0,
8*sx,8*sy,
cliprect,TRANSPARENCY_PEN,0);
}
return 0;
}
static void iremm15_drawgfx(mame_bitmap *bitmap, int ch,
INT16 color, INT16 back, int x, int y)
{
UINT8 mask;
int i;
for (i=0; i<8; i++, y++) {
mask=iremm15_chargen[ch*8+i];
*BITMAP_ADDR16(bitmap, y, x+0) = mask&0x80?color:back;
*BITMAP_ADDR16(bitmap, y, x+1) = mask&0x40?color:back;
*BITMAP_ADDR16(bitmap, y, x+2) = mask&0x20?color:back;
*BITMAP_ADDR16(bitmap, y, x+3) = mask&0x10?color:back;
*BITMAP_ADDR16(bitmap, y, x+4) = mask&0x08?color:back;
*BITMAP_ADDR16(bitmap, y, x+5) = mask&0x04?color:back;
*BITMAP_ADDR16(bitmap, y, x+6) = mask&0x02?color:back;
*BITMAP_ADDR16(bitmap, y, x+7) = mask&0x01?color:back;
}
}
/***************************************************************************
Draw the game screen in the given mame_bitmap.
***************************************************************************/
VIDEO_UPDATE( iremm15 )
{
irem_state *state = machine->driver_data;
int offs;
for (offs = videoram_size - 1;offs >= 0;offs--)
{
int sx,sy;
tilemap_mark_tile_dirty(tx_tilemap, offs);
//tilemap_mark_all_tiles_dirty(tx_tilemap);
tilemap_set_flip(tx_tilemap, state->flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
sx = 31 - offs / 32;
sy = offs % 32;
iremm15_drawgfx(tmpbitmap,
videoram[offs],
machine->pens[colorram[offs] & 7],
machine->pens[7], // space beam not color 0
8*sx,8*sy);
}
copybitmap(bitmap,tmpbitmap,0,0,0,0,&machine->screen[0].visarea,TRANSPARENCY_NONE,0);
return 0;
}