/***************************************************************************
Rastan
driver by Jarek Burczynski
custom ICs
----------
PC040DA x3 video DAC
PC050 coin I/O
PC060HS main/sub CPU communication
PC080 tilemap generator
PC090 sprite generator
memory map
----------
68000:
The address decoding is done by two PALs (IC11 and IC12) which haven't been
read, so the memory map is inferred by program behaviour
Address Dir Data Name Description
------------------------ --- ---------------- --------- -----------------------
0000000xxxxxxxxxxxxxxxx- R xxxxxxxxxxxxxxxx ROM0 program ROM
0000001xxxxxxxxxxxxxxxx- R xxxxxxxxxxxxxxxx ROM1 program ROM
0000010xxxxxxxxxxxxxxxx- R xxxxxxxxxxxxxxxx ROM2 program ROM
000100--11xxxxxxxxxxxxxx R/W xxxxxxxxxxxxxxxx WLRAM/WURAM work RAM
001000------xxxxxxxxxxx- R/W xxxxxxxxxxxxxxxx CLCS palette RAM
0011100-------------000- R --------xxxxxxxx IN PORT player 1 inputs
0011100-------------001- R --------xxxxxxxx IN PORT player 2 inputs
0011100-------------010- R --------xxxxxxxx IN PORT extra inputs
0011100-------------011- R --------xxxxxxxx IN PORT coin inputs
0011100-------------100- R --------xxxxxxxx IN PORT dip SW1
0011100-------------101- R --------xxxxxxxx IN PORT dip SW2
0011100-------------110- R ---------------- n.c.
0011100-------------111- R ---------------- n.c.
0011100----------------- W --------xxx----- OUT8-10 sprite palette bank
0011100----------------- W -----------x---- n.c.
0011100----------------- W ------------xxxx PC050 (coin counters, coin lockout)
0011101----------------- R ---------------- n.c.
0011101----------------- W --------------x- M INT [1]
0011101----------------- W ---------------x SUB RESET [1]
0011110----------------- R ---------------- n.c.
0011110----------------- W ---------------- watchdog reset
0011111---------------x- R/W ------------xxxx SNRD/SNWR PC060HS
0011 EXT [1]
11000xxxxxxxxxxxxxxxxxxx R/W xxxxxxxxxxxxxxxx SCN PC080 PGA
11010000---xxxxxxxxxxxxx R/W xxxxxxxxxxxxxxxx OBJ PC090 PGA
[1] Not used, goes to external connector, maybe provision for an MCU?
Z80:
Address Dir Data Name Description
---------------- --- -------- --------- -----------------------
00xxxxxxxxxxxxxx R xxxxxxxx program ROM
01xxxxxxxxxxxxxx R xxxxxxxx program ROM (banked)
1000xxxxxxxxxxxx R/W xxxxxxxx SRAM work RAM
1001-----------x R/W xxxxxxxx YM2151 YM2151 [1]
1010-----------x R/W ----xxxx PC6 PC060HS
1011------------ W xxxxxxxx V-ST-ADRS MSM5205 start address (bits 15-8)
1100------------ W -------- START-VCE MSM5205 start
1101------------ W -------- STOP-VCE MSM5205 stop
1110------------ n.c.
1111------------ n.c.
[1] Schematics also show a YM3526 that can replace the YM2151
Notes:
- For sound communication, we are using code in audio/taitosnd.c, which
claims to be for the TC0140SYT chip. That chip is not present in Rastan,
the communication is handled by PC060HS, which I guess is compatible.
TODO:
- Unknown writes to 0x350008.
Stephh's notes (based on the game M68000 code and some tests) :
1) 'rastan' and 'rastanu'
- Region stored at 0x05fffe.w
- Sets :
* 'rastan' : region = 0x0001
* 'rastanu' : region = 0x0000
- These 2 games are 100% the same, only region differs !
The US version has the copyright message twice in ROM though
- Coinage relies on the region (code at 0x05ffa2) :
* 0x0001 (World) uses TAITO_COINAGE_WORLD
* other uses TAITO_COINAGE_JAPAN_OLD
- Game name : "RASTAN"
- No notice screen
- In "demo mode", you get a scrolling screen with what the various items do
- No begining screen when you start a new game
- Same "YOU ARE A BRAVE FIGHTER ..." message between levels
- No message after beating level 6 boss
- No copyright message on scrolling credits screen
- Game ends after round 6
- There was sort of debug address at 0x05ff9e.w in ROM area :
* bits 0 to 2 determine the level (0 to 5)
* bits 3 and 5 determine where you start at the level !
. OFF & OFF : part 1
. OFF & ON : part 2
. ON & OFF : part 3 (boss)
. ON & ON : IMPOSSIBLE !
* bit 4 doesn't seem to have any effect
* bit 6 is the invulnerability flag (stored at 0x10c040.w = $40,A5)
surprisingly, it doesn't work when you fall in the water
* bit 7 is the infinite energy flag (stored at 0x10c044.w = $44,A5)
Be aware that the bits are active low !
2) 'rastanu2'
- Region stored at 0x05fffe.w
- Sets :
* 'rastanu2' : region = 0xffff
- Game uses TAITO_COINAGE_JAPAN_OLD
- Game name : "RASTAN"
- There was sort of debug address at 0x05fffc.w in ROM area
See 'rastan' comments to know what the different bits do
- Same other notes as for 'rastan'
3) 'rastsaga'
- Region stored at 0x05fffe.w
- Sets :
* 'rastsaga' : region = 0xffff
- Game uses TAITO_COINAGE_JAPAN_OLD
- Game name : "RASTAN SAGA"
- Notice screen
- In "demo mode", you get no scrolling screen with what the various items do
- Begining screen when you start a new game
- Different messages between levels
- There was sort of debug address at 0x05fffc.w in ROM area
See 'rastan' comments to know what the different bits do
- Message after beating level 6 boss
- Copyright message on scrolling credits screen
- There was sort of debug address at 0x05fffc.w in ROM area
See 'rastan' comments to know what the different bits do
- Different way to handle coins insertion ? See additional code at 0x039f00
- Same other notes as for 'rastan'
4) 'rastsag1'
- Region stored at 0x05fffe.w
- Sets :
* 'rastsaga' : region = 0xffff
- Game uses TAITO_COINAGE_JAPAN_OLD
- Game name : "RASTAN SAGA"
- Same other notes as for 'rastsaga'
***************************************************************************/
#include "driver.h"
#include "taitoipt.h"
#include "video/taitoic.h"
#include "audio/taitosnd.h"
#include "sound/2151intf.h"
#include "sound/msm5205.h"
WRITE16_HANDLER( rastan_spritectrl_w );
VIDEO_START( rastan );
VIDEO_UPDATE( rastan );
static WRITE8_HANDLER( rastan_bankswitch_w )
{
int offs;
data &= 3;
if (data == 0) offs = 0x0000;
else offs = (data-1) * 0x4000 + 0x10000;
memory_set_bankptr( 1, memory_region(REGION_CPU2) + offs );
}
static int adpcm_pos;
static void rastan_msm5205_vck(int chip)
{
static int adpcm_data = -1;
if (adpcm_data != -1)
{
MSM5205_data_w(0, adpcm_data & 0x0f);
adpcm_data = -1;
}
else
{
adpcm_data = memory_region(REGION_SOUND1)[adpcm_pos];
adpcm_pos = (adpcm_pos + 1) & 0xffff;
MSM5205_data_w(0, adpcm_data >> 4);
}
}
static WRITE8_HANDLER( rastan_msm5205_address_w )
{
adpcm_pos = (adpcm_pos & 0x00ff) | (data << 8);
}
static WRITE8_HANDLER( rastan_msm5205_start_w )
{
MSM5205_reset_w(0, 0);
}
static WRITE8_HANDLER( rastan_msm5205_stop_w )
{
MSM5205_reset_w(0, 1);
adpcm_pos &= 0xff00;
}
static ADDRESS_MAP_START( rastan_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x05ffff) AM_ROM
AM_RANGE(0x10c000, 0x10ffff) AM_RAM
AM_RANGE(0x200000, 0x200fff) AM_READWRITE(MRA16_RAM, paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE(&paletteram16)
AM_RANGE(0x350008, 0x350009) AM_WRITE(MWA16_NOP) /* 0 only (often) ? */
AM_RANGE(0x380000, 0x380001) AM_WRITE(rastan_spritectrl_w) /* sprite palette bank, coin counters & lockout */
AM_RANGE(0x390000, 0x390001) AM_READ(input_port_0_word_r)
AM_RANGE(0x390002, 0x390003) AM_READ(input_port_1_word_r)
AM_RANGE(0x390004, 0x390005) AM_READ(input_port_2_word_r)
AM_RANGE(0x390006, 0x390007) AM_READ(input_port_3_word_r)
AM_RANGE(0x390008, 0x390009) AM_READ(input_port_4_word_r)
AM_RANGE(0x39000a, 0x39000b) AM_READ(input_port_5_word_r)
AM_RANGE(0x3c0000, 0x3c0001) AM_WRITE(watchdog_reset16_w)
AM_RANGE(0x3e0000, 0x3e0001) AM_READWRITE(MRA16_NOP, taitosound_port16_lsb_w)
AM_RANGE(0x3e0002, 0x3e0003) AM_READWRITE(taitosound_comm16_lsb_r, taitosound_comm16_lsb_w)
AM_RANGE(0xc00000, 0xc0ffff) AM_READWRITE(PC080SN_word_0_r, PC080SN_word_0_w)
AM_RANGE(0xc20000, 0xc20003) AM_WRITE(PC080SN_yscroll_word_0_w)
AM_RANGE(0xc40000, 0xc40003) AM_WRITE(PC080SN_xscroll_word_0_w)
AM_RANGE(0xc50000, 0xc50003) AM_WRITE(PC080SN_ctrl_word_0_w)
AM_RANGE(0xd00000, 0xd03fff) AM_READWRITE(PC090OJ_word_0_r, PC090OJ_word_0_w) /* sprite ram */
ADDRESS_MAP_END
static ADDRESS_MAP_START( rastan_s_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK(1)
AM_RANGE(0x8000, 0x8fff) AM_RAM
AM_RANGE(0x9000, 0x9000) AM_WRITE(YM2151_register_port_0_w)
AM_RANGE(0x9001, 0x9001) AM_READWRITE(YM2151_status_port_0_r, YM2151_data_port_0_w)
AM_RANGE(0xa000, 0xa000) AM_WRITE(taitosound_slave_port_w)
AM_RANGE(0xa001, 0xa001) AM_READWRITE(taitosound_slave_comm_r, taitosound_slave_comm_w)
AM_RANGE(0xb000, 0xb000) AM_WRITE(rastan_msm5205_address_w)
AM_RANGE(0xc000, 0xc000) AM_WRITE(rastan_msm5205_start_w)
AM_RANGE(0xd000, 0xd000) AM_WRITE(rastan_msm5205_stop_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( rastan )
PORT_START_TAG("IN0")
TAITO_JOY_UDLR_2_BUTTONS( 1 )
PORT_START_TAG("IN1")
TAITO_JOY_UDLR_2_BUTTONS( 2 )
PORT_START_TAG("IN2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SPECIAL ) // from PC050 (coin A gets locked if 0)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) // from PC050 (coin B gets locked if 0)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) // from PC050 (above 2 bits not checked when 0)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START_TAG("IN3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
/* 0x390008 -> 0x10c018 ($18,A5) */
PORT_START_TAG("DSWA")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) )
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW )
TAITO_COINAGE_WORLD
/* 0x39000a -> 0x10c01c ($1c,A5) */
PORT_START_TAG("DSWB")
TAITO_DIFFICULTY
PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) /* table at 0x059f2e */
PORT_DIPSETTING( 0x0c, "100k 200k 400k 600k 800k" )
PORT_DIPSETTING( 0x08, "150k 300k 600k 900k 1200k" )
PORT_DIPSETTING( 0x04, "200k 400k 800k 1200k 1600k" )
PORT_DIPSETTING( 0x00, "250k 500k 1000k 1500k 2000k" )
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) )
PORT_DIPSETTING( 0x30, "3" )
PORT_DIPSETTING( 0x20, "4" )
PORT_DIPSETTING( 0x10, "5" )
PORT_DIPSETTING( 0x00, "6" )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) )
PORT_DIPSETTING( 0x00, DEF_STR( No ) )
PORT_DIPSETTING( 0x40, DEF_STR( Yes ) )
PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
INPUT_PORTS_END
static INPUT_PORTS_START( rastsaga )
PORT_INCLUDE( rastan )
PORT_MODIFY("DSWA")
TAITO_COINAGE_JAPAN_OLD
INPUT_PORTS_END
static const gfx_layout tilelayout =
{
8,8,
RGN_FRAC(1,2),
4,
{ 0, 1, 2, 3 },
{ 0, 4, RGN_FRAC(1,2)+0 ,RGN_FRAC(1,2)+4, 8+0, 8+4, RGN_FRAC(1,2)+8+0, RGN_FRAC(1,2)+8+4 },
{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
16*8
};
static const gfx_layout spritelayout =
{
16,16,
RGN_FRAC(1,2),
4,
{ 0, 1, 2, 3 },
{ 0, 4, RGN_FRAC(1,2)+0 ,RGN_FRAC(1,2)+4, 8+0, 8+4, RGN_FRAC(1,2)+8+0, RGN_FRAC(1,2)+8+4,
16+0, 16+4, RGN_FRAC(1,2)+16+0, RGN_FRAC(1,2)+16+4, 24+0, 24+4, RGN_FRAC(1,2)+24+0, RGN_FRAC(1,2)+24+4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
32*16
};
static GFXDECODE_START( rastan )
GFXDECODE_ENTRY( REGION_GFX1, 0, tilelayout, 0, 0x80 )
GFXDECODE_ENTRY( REGION_GFX2, 0, spritelayout, 0, 0x80 )
GFXDECODE_END
/* handler called by the YM2151 emulator when the internal timers cause an IRQ */
static void irqhandler(int irq)
{
cpunum_set_input_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE);
}
static struct YM2151interface ym2151_interface =
{
irqhandler,
rastan_bankswitch_w
};
static struct MSM5205interface msm5205_interface =
{
rastan_msm5205_vck, /* VCK function */
MSM5205_S48_4B /* 8 kHz */
};
static MACHINE_DRIVER_START( rastan )
/* basic machine hardware */
MDRV_CPU_ADD(M68000, 8000000) /* 8 MHz */
MDRV_CPU_PROGRAM_MAP(rastan_map,0)
MDRV_CPU_VBLANK_INT(irq5_line_hold,1)
MDRV_CPU_ADD(Z80, 4000000) /* 4 MHz */
MDRV_CPU_PROGRAM_MAP(rastan_s_map,0)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_INTERLEAVE(10) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(40*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
MDRV_GFXDECODE(rastan)
MDRV_PALETTE_LENGTH(8192)
MDRV_VIDEO_START(rastan)
MDRV_VIDEO_UPDATE(rastan)
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD(YM2151, 4000000)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "mono", 0.50)
MDRV_SOUND_ROUTE(1, "mono", 0.50)
MDRV_SOUND_ADD(MSM5205, 384000)
MDRV_SOUND_CONFIG(msm5205_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_DRIVER_END
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( rastan )
ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
ROM_LOAD16_BYTE( "b04-35.19", 0x00000, 0x10000, CRC(1c91dbb1) SHA1(17fc55e8546cc0b847aebd67fb4570a1e9f128f3) )
ROM_LOAD16_BYTE( "b04-37.07", 0x00001, 0x10000, CRC(ecf20bdd) SHA1(92e46b1edef40a19be17091c09daba598d77bca8) )
ROM_LOAD16_BYTE( "b04-40.20", 0x20000, 0x10000, CRC(0930d4b3) SHA1(c269b3856040ed9409de99cca48f22a2f355fc4c) )
ROM_LOAD16_BYTE( "b04-39.08", 0x20001, 0x10000, CRC(d95ade5e) SHA1(f47557dcfa9d3137e2a3838e45858fc21471cc91) )
ROM_LOAD16_BYTE( "b04-42.21", 0x40000, 0x10000, CRC(1857a7cb) SHA1(7d967d04ade648c6ddb19aad9e184b6e272856da) )
ROM_LOAD16_BYTE( "b04-43.09", 0x40001, 0x10000, CRC(c34b9152) SHA1(6ed9247ad455bc3b71d78b541591b269969830cb) )
ROM_REGION( 0x1c000, REGION_CPU2, 0 )
ROM_LOAD( "b04-19.49", 0x00000, 0x4000, CRC(ee81fdd8) SHA1(fa59dac2583a7d2979550dffc6f9c6c2bd67bfd5) )
ROM_CONTINUE( 0x10000, 0xc000 )
ROM_REGION( 0x080000, REGION_GFX1, ROMREGION_DISPOSE )
ROM_LOAD( "b04-01.40", 0x00000, 0x20000, CRC(cd30de19) SHA1(f8d158d38cd07a24cb5ddefd4ce90beec706924d) )
ROM_LOAD( "b04-03.39", 0x20000, 0x20000, CRC(ab67e064) SHA1(5c49f0ff9221cba9f2bb8da86eb4448c73012410) )
ROM_LOAD( "b04-02.67", 0x40000, 0x20000, CRC(54040fec) SHA1(a2bea2ce1cebd25b33be41723299ca0512d95f9e) )
ROM_LOAD( "b04-04.66", 0x60000, 0x20000, CRC(94737e93) SHA1(3df7f085fe6468bda11fab2e86252df6f74f7a99) )
ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE )
ROM_LOAD( "b04-05.15", 0x00000, 0x20000, CRC(c22d94ac) SHA1(04f69f9af7ac4242e95dba32988afa3616d75a92) )
ROM_LOAD( "b04-07.14", 0x20000, 0x20000, CRC(b5632a51) SHA1(da6ebe6afe245443a76b33714213549356c0c5c3) )
ROM_LOAD( "b04-06.28", 0x40000, 0x20000, CRC(002ccf39) SHA1(fdc29f39198f9b488e298ee89b0eeb3417527733) )
ROM_LOAD( "b04-08.27", 0x60000, 0x20000, CRC(feafca05) SHA1(9de9ff1fcf037e5ab25c181b678245041238d6ae) )
ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* 64k for the samples */
ROM_LOAD( "b04-20.76", 0x0000, 0x10000, CRC(fd1a34cc) SHA1(b1682959521fa295769207b75cf7d839e9ec95fd) ) /* samples are 4bit ADPCM */
ROM_END
ROM_START( rastanu )
ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
ROM_LOAD16_BYTE( "b04-35.19", 0x00000, 0x10000, CRC(1c91dbb1) SHA1(17fc55e8546cc0b847aebd67fb4570a1e9f128f3) )
ROM_LOAD16_BYTE( "b04-37.07", 0x00001, 0x10000, CRC(ecf20bdd) SHA1(92e46b1edef40a19be17091c09daba598d77bca8) )
ROM_LOAD16_BYTE( "b04-45.20", 0x20000, 0x10000, CRC(362812dd) SHA1(f7df037ef423d931ca780b34813d4e9e4db67054) )
ROM_LOAD16_BYTE( "b04-44.08", 0x20001, 0x10000, CRC(51cc5508) SHA1(2bd266351a4d1b94c8c3a489e4d267695d93db5e) )
ROM_LOAD16_BYTE( "b04-42.21", 0x40000, 0x10000, CRC(1857a7cb) SHA1(7d967d04ade648c6ddb19aad9e184b6e272856da) )
ROM_LOAD16_BYTE( "b04-41-1.09", 0x40001, 0x10000, CRC(bd403269) SHA1(14aee828d5efb65370a5e453c8fd1c7b3e718074) )
ROM_REGION( 0x1c000, REGION_CPU2, 0 )
ROM_LOAD( "b04-19.49", 0x00000, 0x4000, CRC(ee81fdd8) SHA1(fa59dac2583a7d2979550dffc6f9c6c2bd67bfd5) )
ROM_CONTINUE( 0x10000, 0xc000 )
ROM_REGION( 0x080000, REGION_GFX1, ROMREGION_DISPOSE )
ROM_LOAD( "b04-01.40", 0x00000, 0x20000, CRC(cd30de19) SHA1(f8d158d38cd07a24cb5ddefd4ce90beec706924d) )
ROM_LOAD( "b04-03.39", 0x20000, 0x20000, CRC(ab67e064) SHA1(5c49f0ff9221cba9f2bb8da86eb4448c73012410) )
ROM_LOAD( "b04-02.67", 0x40000, 0x20000, CRC(54040fec) SHA1(a2bea2ce1cebd25b33be41723299ca0512d95f9e) )
ROM_LOAD( "b04-04.66", 0x60000, 0x20000, CRC(94737e93) SHA1(3df7f085fe6468bda11fab2e86252df6f74f7a99) )
ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE )
ROM_LOAD( "b04-05.15", 0x00000, 0x20000, CRC(c22d94ac) SHA1(04f69f9af7ac4242e95dba32988afa3616d75a92) )
ROM_LOAD( "b04-07.14", 0x20000, 0x20000, CRC(b5632a51) SHA1(da6ebe6afe245443a76b33714213549356c0c5c3) )
ROM_LOAD( "b04-06.28", 0x40000, 0x20000, CRC(002ccf39) SHA1(fdc29f39198f9b488e298ee89b0eeb3417527733) )
ROM_LOAD( "b04-08.27", 0x60000, 0x20000, CRC(feafca05) SHA1(9de9ff1fcf037e5ab25c181b678245041238d6ae) )
ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* MSM5205 samples */
ROM_LOAD( "b04-20.76", 0x0000, 0x10000, CRC(fd1a34cc) SHA1(b1682959521fa295769207b75cf7d839e9ec95fd) )
ROM_END
ROM_START( rastanu2 )
ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
ROM_LOAD16_BYTE( "rs19_38.bin", 0x00000, 0x10000, CRC(a38ac909) SHA1(66d792fee03c6bd87d15060b9d5cae74137c5ebd) )
ROM_LOAD16_BYTE( "b04-21.7", 0x00001, 0x10000, CRC(7c8dde9a) SHA1(0cfc3b4f3bc7b940a6c07267ac95e4aae25801ea) )
ROM_LOAD16_BYTE( "b04-23.20", 0x20000, 0x10000, CRC(254b3dce) SHA1(5126cd5268abaa78dfdcd2ca70621c093c79be67) )
ROM_LOAD16_BYTE( "b04-22.8", 0x20001, 0x10000, CRC(98e8edcf) SHA1(cc89ef36da6d21192efc19c3bbb215b1635b7ef3) )
ROM_LOAD16_BYTE( "b04-25.21", 0x40000, 0x10000, CRC(d1e5adee) SHA1(eafc275a0023aecb2efaff14cd890915fa162624) )
ROM_LOAD16_BYTE( "b04-24.9", 0x40001, 0x10000, CRC(a3dcc106) SHA1(3a8854530b08864a1f7f46c427e49ceec8297806) )
ROM_REGION( 0x1c000, REGION_CPU2, 0 )
ROM_LOAD( "b04-19.49", 0x00000, 0x4000, CRC(ee81fdd8) SHA1(fa59dac2583a7d2979550dffc6f9c6c2bd67bfd5) )
ROM_CONTINUE( 0x10000, 0xc000 )
ROM_REGION( 0x080000, REGION_GFX1, ROMREGION_DISPOSE )
ROM_LOAD( "b04-01.40", 0x00000, 0x20000, CRC(cd30de19) SHA1(f8d158d38cd07a24cb5ddefd4ce90beec706924d) )
ROM_LOAD( "b04-03.39", 0x20000, 0x20000, CRC(ab67e064) SHA1(5c49f0ff9221cba9f2bb8da86eb4448c73012410) )
ROM_LOAD( "b04-02.67", 0x40000, 0x20000, CRC(54040fec) SHA1(a2bea2ce1cebd25b33be41723299ca0512d95f9e) )
ROM_LOAD( "b04-04.66", 0x60000, 0x20000, CRC(94737e93) SHA1(3df7f085fe6468bda11fab2e86252df6f74f7a99) )
ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE )
ROM_LOAD( "b04-05.15", 0x00000, 0x20000, CRC(c22d94ac) SHA1(04f69f9af7ac4242e95dba32988afa3616d75a92) )
ROM_LOAD( "b04-07.14", 0x20000, 0x20000, CRC(b5632a51) SHA1(da6ebe6afe245443a76b33714213549356c0c5c3) )
ROM_LOAD( "b04-06.28", 0x40000, 0x20000, CRC(002ccf39) SHA1(fdc29f39198f9b488e298ee89b0eeb3417527733) )
ROM_LOAD( "b04-08.27", 0x60000, 0x20000, CRC(feafca05) SHA1(9de9ff1fcf037e5ab25c181b678245041238d6ae) )
ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* MSM5205 samples */
ROM_LOAD( "b04-20.76", 0x0000, 0x10000, CRC(fd1a34cc) SHA1(b1682959521fa295769207b75cf7d839e9ec95fd) )
ROM_END
ROM_START( rastsaga )
ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
ROM_LOAD16_BYTE( "b04-38.19", 0x00000, 0x10000, CRC(a38ac909) SHA1(66d792fee03c6bd87d15060b9d5cae74137c5ebd) )
ROM_LOAD16_BYTE( "b04-37.7", 0x00001, 0x10000, CRC(bad60872) SHA1(e020f79b3ac3d2abccfcd5d135d2dc49e1335c7d) )
ROM_LOAD16_BYTE( "b04-40.20", 0x20000, 0x10000, CRC(6bcf70dc) SHA1(3e369548ac01981c503150b44c2747e6c2cec12a) )
ROM_LOAD16_BYTE( "b04-39.8", 0x20001, 0x10000, CRC(8838ecc5) SHA1(42b43ab77969bbacdf178fbe73a0a27652ccb297) )
ROM_LOAD16_BYTE( "b04-42.21", 0x40000, 0x10000, CRC(b626c439) SHA1(976e820edc4ba107c5b579edaaee1e354e85fb67) )
ROM_LOAD16_BYTE( "b04-43.9", 0x40001, 0x10000, CRC(c928a516) SHA1(fe87fdf2d1b7ba93e1986460eb6af648b58f42e4) )
ROM_REGION( 0x1c000, REGION_CPU2, 0 )
ROM_LOAD( "b04-19.49", 0x00000, 0x4000, CRC(ee81fdd8) SHA1(fa59dac2583a7d2979550dffc6f9c6c2bd67bfd5) )
ROM_CONTINUE( 0x10000, 0xc000 )
ROM_REGION( 0x080000, REGION_GFX1, ROMREGION_DISPOSE )
ROM_LOAD( "b04-01.40", 0x00000, 0x20000, CRC(cd30de19) SHA1(f8d158d38cd07a24cb5ddefd4ce90beec706924d) )
ROM_LOAD( "b04-03.39", 0x20000, 0x20000, CRC(ab67e064) SHA1(5c49f0ff9221cba9f2bb8da86eb4448c73012410) )
ROM_LOAD( "b04-02.67", 0x40000, 0x20000, CRC(54040fec) SHA1(a2bea2ce1cebd25b33be41723299ca0512d95f9e) )
ROM_LOAD( "b04-04.66", 0x60000, 0x20000, CRC(94737e93) SHA1(3df7f085fe6468bda11fab2e86252df6f74f7a99) )
ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE )
ROM_LOAD( "b04-05.15", 0x00000, 0x20000, CRC(c22d94ac) SHA1(04f69f9af7ac4242e95dba32988afa3616d75a92) )
ROM_LOAD( "b04-07.14", 0x20000, 0x20000, CRC(b5632a51) SHA1(da6ebe6afe245443a76b33714213549356c0c5c3) )
ROM_LOAD( "b04-06.28", 0x40000, 0x20000, CRC(002ccf39) SHA1(fdc29f39198f9b488e298ee89b0eeb3417527733) )
ROM_LOAD( "b04-08.27", 0x60000, 0x20000, CRC(feafca05) SHA1(9de9ff1fcf037e5ab25c181b678245041238d6ae) )
ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* MSM5205 samples */
ROM_LOAD( "b04-20.76", 0x0000, 0x10000, CRC(fd1a34cc) SHA1(b1682959521fa295769207b75cf7d839e9ec95fd) )
ROM_END
ROM_START( rastsag1 )
ROM_REGION( 0x60000, REGION_CPU1, 0 ) /* 6*64k for 68000 code */
ROM_LOAD16_BYTE( "b04-14.19", 0x00000, 0x10000, CRC(a38ac909) SHA1(66d792fee03c6bd87d15060b9d5cae74137c5ebd) )
ROM_LOAD16_BYTE( "b04-13.7", 0x00001, 0x10000, CRC(bad60872) SHA1(e020f79b3ac3d2abccfcd5d135d2dc49e1335c7d) )
ROM_LOAD16_BYTE( "b04-16-1.20", 0x20000, 0x10000, CRC(00b59e60) SHA1(545ab3eb9ef25c532dda5a9eec087665ba0cecc1) )
ROM_LOAD16_BYTE( "b04-15-1.8", 0x20001, 0x10000, CRC(ff9e018a) SHA1(37048eecec799f29564517fae9525ef0e3d9d9e5) )
ROM_LOAD16_BYTE( "b04-18-1.21", 0x40000, 0x10000, CRC(b626c439) SHA1(976e820edc4ba107c5b579edaaee1e354e85fb67) )
ROM_LOAD16_BYTE( "b04-17-1.9", 0x40001, 0x10000, CRC(c928a516) SHA1(fe87fdf2d1b7ba93e1986460eb6af648b58f42e4) )
ROM_REGION( 0x1c000, REGION_CPU2, 0 )
ROM_LOAD( "b04-19.49", 0x00000, 0x4000, CRC(ee81fdd8) SHA1(fa59dac2583a7d2979550dffc6f9c6c2bd67bfd5) )
ROM_CONTINUE( 0x10000, 0xc000 )
ROM_REGION( 0x080000, REGION_GFX1, ROMREGION_DISPOSE )
ROM_LOAD( "b04-01.40", 0x00000, 0x20000, CRC(cd30de19) SHA1(f8d158d38cd07a24cb5ddefd4ce90beec706924d) )
ROM_LOAD( "b04-03.39", 0x20000, 0x20000, CRC(ab67e064) SHA1(5c49f0ff9221cba9f2bb8da86eb4448c73012410) )
ROM_LOAD( "b04-02.67", 0x40000, 0x20000, CRC(54040fec) SHA1(a2bea2ce1cebd25b33be41723299ca0512d95f9e) )
ROM_LOAD( "b04-04.66", 0x60000, 0x20000, CRC(94737e93) SHA1(3df7f085fe6468bda11fab2e86252df6f74f7a99) )
ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE )
ROM_LOAD( "b04-05.15", 0x00000, 0x20000, CRC(c22d94ac) SHA1(04f69f9af7ac4242e95dba32988afa3616d75a92) )
ROM_LOAD( "b04-07.14", 0x20000, 0x20000, CRC(b5632a51) SHA1(da6ebe6afe245443a76b33714213549356c0c5c3) )
ROM_LOAD( "b04-06.28", 0x40000, 0x20000, CRC(002ccf39) SHA1(fdc29f39198f9b488e298ee89b0eeb3417527733) )
ROM_LOAD( "b04-08.27", 0x60000, 0x20000, CRC(feafca05) SHA1(9de9ff1fcf037e5ab25c181b678245041238d6ae) )
ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* MSM5205 samples */
ROM_LOAD( "b04-20.76", 0x0000, 0x10000, CRC(fd1a34cc) SHA1(b1682959521fa295769207b75cf7d839e9ec95fd) )
ROM_END
GAME( 1987, rastan, 0, rastan, rastan, 0, ROT0, "Taito Corporation Japan", "Rastan (World)", 0)
GAME( 1987, rastanu, rastan, rastan, rastsaga, 0, ROT0, "Taito America Corporation", "Rastan (US, set 1)", 0)
GAME( 1987, rastanu2, rastan, rastan, rastsaga, 0, ROT0, "Taito America Corporation", "Rastan (US, set 2)", 0)
GAME( 1987, rastsaga, rastan, rastan, rastsaga, 0, ROT0, "Taito Corporation", "Rastan Saga (Japan)", 0)
GAME( 1987, rastsag1, rastan, rastan, rastsaga, 0, ROT0, "Taito Corporation", "Rastan Saga (Japan Rev 1)", 0)