summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/rainbow.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/rainbow.c')
-rw-r--r--src/mame/drivers/rainbow.c823
1 files changed, 823 insertions, 0 deletions
diff --git a/src/mame/drivers/rainbow.c b/src/mame/drivers/rainbow.c
new file mode 100644
index 00000000000..61ab20f7110
--- /dev/null
+++ b/src/mame/drivers/rainbow.c
@@ -0,0 +1,823 @@
+/***************************************************************************
+
+Rainbow Islands (c) Taito 1987 + Jumping
+===============
+
+driver by Mike Coates
+
+c-chip enhanced by Robert Gallagher, with many thanks to Tormod Tjaberg for providing
+his PCB for dumping/collecting the c-chip data from Rainbow Islands Extra.
+
+ ***
+
+Notes on Rainbow Islands romsets by Robert Gallagher
+----------------------------------------------------
+
+There are 3 code segments that differ between Rainbow Islands old and new
+version. They are all related to secret rooms;
+
+ The first code segment is entered at the start of a secret room.
+
+
+ rainbowo rainbow
+ $55EE lea $C01308,a0 $55EE lea $C00B08,a0
+ move.w #$13,d0 bsr $561C
+ $55F8 move.w #$15fa,2(a0) lea $C00D08,a0
+ move.w #$15fa,6(a0) bsr $561C
+ move.w #$15fa,$102(a0) lea $C00F08,a0
+ move.w #$15fa,$106(a0) bsr $561C
+ adda.l #8,a0 lea $C01108,a0
+ dbf d0,$55F8 bsr $561C
+ rts $561C lea $C01308,a0
+ move.w #$13,d0
+ ...
+
+ The next code segment fixes the bonus related to entering ALL 10 Secret rooms.
+ In Rainbow Islands, If you enter the last secret room, you receive a 10,000,000
+ point bonus. If you have entered all 10 secret rooms, you receive a 50,000,000 point
+ bonus. (BUG THAT'S NOT A BUG - the games says 1,000,000 and 5,000,000, but the code gives
+ you 10mil and 50mil)
+ The counter is in $10D05C.b, the (rainbowo) romset never increments this counter, making
+ it impossible to achieve.
+
+ $56A2 cmpi.w #$31,$11c6(a5) $56CA addi.b #1,$105C(a5) ;increment the secret room count
+ bne cmpi.w #$31,$11c6(a5) ;is it round 49 (50)?
+ bne
+
+ The final change fixes a Secret room bug that was noted by Stefan Jokisch.
+ In (rainbowo) it is possible to scroll the screen inside a secret room.
+ You can walk right off the top of the screen, and scroll the 'next' secret
+ room into view. This is fixed in (rainbow) with the following code;
+
+ $5F06 move.b #1,d0 $5F34 tst.b $11c4(a5) ; in secret room?
+ jsr $1736 bne $600A ; exit this routine, which is getting
+ move.b #1,d0 ; the room height from c-chip bank 1
+ jsr $1736 ; which we don't need
+ ...
+ $600A rts
+
+ The (jumping) bootleg is based on the (rainbowo) roms.
+
+Notes on Rainbow Islands Extra by Robert Gallagher
+--------------------------------------------------
+ In Rainbow Islands Extra, there are more changes than just the differing enemies/rounds.
+
+ In RIE if you end a level with the same 2 digits in your score as xxxx220, you will receive
+ items at the "GOAL IN" worth 3000 points each (instead of 500pts) as:
+
+ 00 = french fries
+ 11 = neopolaton ice cream
+ 22 = creme caramel
+ 33 = hamburgers
+ 44 = cake slice
+ 55 = iced bun
+ 66 = mug of beer
+ 77 = hotdog on a stick
+ 88 = vanilla ice cream
+ 99 = blue popsicle
+
+ There are two other possibilities:
+ moneybags - worth 500pts if you don't have double digits, or worth 3000 points if you do (any)
+ if you got the 'Money Coin' powerup in a secret room.
+ hearts - worth 10,000 each, this is based on a timer in 0x0010DBA4 && 128 == 0, making this a
+ 1 in 128 chance.
+
+
+ The items received in 'Secret Room' are not the same as Rainbow Islands. They are based on
+ the LAST diamond you collect in the round before entering. That is; you must still collect
+ the 7 diamonds in order, Red, Orange, Yellow... to enter a secret room, however, AFTER completing
+ this, you can still collect diamonds. If you collect (last), you get:
+
+ Red - Book of Continues - this allows you to continue after world 7
+ Orange - Money Bag - this will make a 100,000pt Money bag fall from the sky on every round.
+ it will also make all fruit at 'GOAL IN' into money bags.
+ Yellow - Key - when taken, this will show the Secret room code completely for about 8 seconds.
+ Green - Protection Fairy, gives you the protection fairy for about 8 seconds at the beginning
+ of each round, or after you die. (NOT perm. like RI, code at $C528 in RIE handles this,
+ and is distinctly different from the code at $BC8C in RI)
+ Blue - Yellow Potion, gives you perm. fast rainbow power
+ Indigo - Red Potion, gives you perm. 2X rainbow power
+ Violet - Shoes, gives you perm. fast feet.
+
+ Unlike the secret rooms in Rainbow Islands, in Rainbow Islands Extra, only 2 letters of the code
+ for that room are revealed. The first letter, and the second letter will corespond to the last
+ diamond collected before entering the secret room. (You can see this with the coloured hearts
+ that remain). The idea is that you must enter the secret room 7X to get the full code, making the
+ game harder. Otherwise, collecting a yellow diamond will give you the 'key' to the room, and reveal
+ the code for about 5 seconds.
+
+ In the secret rooms of RIE there is an added bonus; If you exit the room without collecting the
+ power-up item, you will receive a 1,000,000pt bonus. The text in the room in Japanese reads:
+ "KYOUKA-SOUBI WO TORAZUNI DERUTO 1000000 TEN HAIRUYO !!"
+
+ If you enter all 10 secret rooms in Rainbow Islands Extra, and do NOT collect the powerups in
+ _any_ of the rooms, you will receive "SPECIAL BIG BONUS !! 50000000 PTS."
+
+ If you enter all 10 secret rooms, and do NOT collect the bubble-rainbow power in secret room 10,
+ (though you may collect them in others) you will receive "SPECIAL BIG BONUS !! 10000000 PTS."
+
+ If you collect the bubble-rainbow power in secret room 10, you will receive "ALL ROOM CLEAR
+ 5000000" bonus instead.
+
+ In Rainbow Islands Extra (as in Rainbow Islands), if you collect 2 of any colour 'cane'...
+ (canes are collected for collecting 7 of one colour of diamond, WITHOUT 'complete' happening, or
+ if 'complete', you must collect 7 of the same colour diamond within one round. (the diamond
+ counters are reset to one at the beginning of each round once 'complete' has occured).
+ ...you will receive a 'Potion' (not Rainbow powerup potions)
+ of the appropriate colour. Once collected, you will receive a
+ 100,000pts. large fruit item at 'GOAL IN' for that round. Although the code for this is present in
+ Rainbow Islands, it is rarely seen. This is not a result of poor emulation, but rather poor coding;
+ In both RI and RIE, there are tables that indicate which special item is deserved, and what actions
+ are required to earn them. (the number of times the event must occur).
+ In both RI and RIE, you receive a special item for every 3rd enemy you kill as:
+ 1. Shoes
+ 2. Red Potion
+ 3. Yellow Potion
+ 4. Red Potion
+ 5. Crystal Ball
+ 6. Yellow star
+ 7. Red Star
+ 8. - Special item - depending on what you deserve.
+
+ The Special item table can be found at $ADC0 in RI, and $B5E8 in RIE. This table is checked in
+ linear fashion until a special item requirement is met.
+ items 24/25/26 are: Blue Ring/Violet Ring/Red Ring.
+ To get these items you collect: Red Potion/Yellow Potion/Shoes. (note that each potion collect =+2)
+ In Rainbow Islands, this table shows that we need only collect:
+ 3 red potions (but each one counts as +2 if you created it, or +1 if you 'found' it in a level),
+ 3 yellow potions ""
+ 3 red shoes (only count as one)
+ The 'canes', and 'potions' occur -after- these entries (cane index 27-33, potion index 34-40)
+ So the reason that you (rarely!) see the canes, and hence the potions in RI, is because you will
+ almost ALWAYS satisfy at least one of these requirements: 2 RED potions are given before 1 'special'
+ In Rainbow Islands Extra however, the canes are more common. This is because the index shows that
+ we need to collect 12/12/12 of the above before we can get the rings.
+
+ One more condition has been added to RIE regards this;
+ if _no_ special item has been earned, you will receive a Potion that is the same colour as the
+ LAST diamond you have collected in the round.
+
+
+
+Bugs in Jumping
+---------------
+
+The bootleggers didn't defeat the protection completely: Secret
+rooms are broken, some dying enemy sprites have obviously wrong
+graphics, monsters are falling through platforms etc.
+
+
+Secret rooms in Rainbow Islands
+-------------------------------
+
+Getting the small diamonds in order (red through to purple) opens
+a secret door in the boss room. The trick is to turn an enemy into
+a diamond of a specific color: It depends on its x position and
+direction. There is a cheat code at the top of each secret room
+that can be entered on the copyright screen:
+
+ L -> left
+ R -> right
+ J -> jump
+ B -> rainbow
+ S -> start
+
+ | regular | extra
+ --------------+------------+------------
+ Fast Feet | BLRBJSBJ | SLLSRJRR
+ Red Potion | RJSBJLBR | JLSSSBRJ
+ Yellow Potion | SSSLLRRS | BRSLJSLJ
+ Hint A | BJBJBJRS | BJBJBJRS
+ Hint B | LJLSLBLS | LJLSLBLS
+ Continue | LBSJRLJL | LJLRSJJJ
+ Money Bags | RRLLBBJS | LLSBRRJB
+ Money + Cont | RRRRSBSJ | RSJRLBRS
+ Hint C | SJBLRJSR | SJBLRJSR
+ 100M Counter | SRBJSLSB | BBSSJJJJ
+ Hint D | N/A | BBJJRLSL
+ Hint E | N/A | LRSLRSJR
+ Hint F | N/A | SBJLSBRR
+
+
+
+Stephh's notes (based on the game M68000 code and some tests) :
+
+1) 'rainbow*'
+
+ - Region stored at 0x02fffe.w
+ - Sets :
+ * 'rainbow' : region = 0x0000
+ * 'rainbowo' : region = 0x0000
+ * 'rainbowe' : region = 0x0000
+ - Possible regions :
+ * 0x0000 : Japan
+ * 0x0001 : US
+ * 0x0002 : World
+ * 0x0003 : US, licenced to ROMSTAR
+ * 0x0004 : licenced to PHOENIX ELECTRONICS CO.
+ - Coinage relies on "Coin Mode" Dip Switch (code at 0x0030fc) :
+ * "Mode A" uses TAITO_COINAGE_JAPAN_OLD
+ * "Mode B" uses TAITO_COINAGE_WORLD
+
+
+2) 'jumping'
+
+ - Region stored at 0x02fffe.w
+ - Sets :
+ * 'jumping' : region = 0x0000
+ - If you change the region, you'll notice that the copyright strings
+ haven't been correcly erased !
+ - Some Dip Switches have no effect due to code at 0x000850;
+ this means the following things :
+ * always upright cabinet
+ * screen never flipped
+ * impossible to enter the "test mode"
+ * always English language
+
+***************************************************************************/
+
+#include "driver.h"
+#include "taitoipt.h"
+#include "video/taitoic.h"
+#include "audio/taitosnd.h"
+#include "sound/2203intf.h"
+#include "sound/2151intf.h"
+
+VIDEO_START( rainbow );
+VIDEO_START( jumping );
+
+VIDEO_UPDATE( rainbow );
+VIDEO_UPDATE( jumping );
+
+WRITE16_HANDLER( jumping_spritectrl_w );
+WRITE16_HANDLER( rainbow_spritectrl_w );
+
+void rainbow_cchip_init(int version);
+READ16_HANDLER( rainbow_cchip_ctrl_r );
+READ16_HANDLER( rainbow_cchip_ram_r );
+WRITE16_HANDLER( rainbow_cchip_ctrl_w );
+WRITE16_HANDLER( rainbow_cchip_bank_w );
+WRITE16_HANDLER( rainbow_cchip_ram_w );
+
+static UINT8 jumping_latch = 0;
+
+
+static WRITE16_HANDLER( jumping_sound_w )
+{
+ if (ACCESSING_LSB)
+ {
+ jumping_latch = data & 0xff; /*M68000 writes .b to $400007*/
+ cpunum_set_input_line(1,0,HOLD_LINE);
+ }
+}
+
+
+/***************************************************************************
+ MEMORY STRUCTURES
+***************************************************************************/
+
+static ADDRESS_MAP_START( rainbow_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x10c000, 0x10ffff) AM_READ(MRA16_RAM) /* main RAM */
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM) /* palette */
+ AM_RANGE(0x201000, 0x203fff) AM_READ(MRA16_RAM) /* read in initial checks */
+ AM_RANGE(0x390000, 0x390003) AM_READ(input_port_0_word_r)
+ AM_RANGE(0x3b0000, 0x3b0003) AM_READ(input_port_1_word_r)
+ AM_RANGE(0x3e0000, 0x3e0001) AM_READ(MRA16_NOP)
+ AM_RANGE(0x3e0002, 0x3e0003) AM_READ(taitosound_comm16_lsb_r)
+ AM_RANGE(0x800000, 0x8007ff) AM_READ(rainbow_cchip_ram_r)
+ AM_RANGE(0x800802, 0x800803) AM_READ(rainbow_cchip_ctrl_r)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_READ(PC080SN_word_0_r)
+ AM_RANGE(0xd00000, 0xd03fff) AM_READ(PC090OJ_word_0_r) /* sprite ram + other stuff */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( rainbow_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x10c000, 0x10ffff) AM_WRITE(MWA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x201000, 0x203fff) AM_WRITE(MWA16_RAM) /* written in initial checks */
+ AM_RANGE(0x3a0000, 0x3a0001) AM_WRITE(rainbow_spritectrl_w)
+ AM_RANGE(0x3c0000, 0x3c0003) AM_WRITE(MWA16_NOP) /* written very often, watchdog? */
+ AM_RANGE(0x3e0000, 0x3e0001) AM_WRITE(taitosound_port16_lsb_w)
+ AM_RANGE(0x3e0002, 0x3e0003) AM_WRITE(taitosound_comm16_lsb_w)
+ AM_RANGE(0x800000, 0x8007ff) AM_WRITE(rainbow_cchip_ram_w)
+ AM_RANGE(0x800802, 0x800803) AM_WRITE(rainbow_cchip_ctrl_w)
+ AM_RANGE(0x800c00, 0x800c01) AM_WRITE(rainbow_cchip_bank_w)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_WRITE(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_WRITE(PC090OJ_word_0_w) /* sprite ram + other stuff */
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( jumping_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x09ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x10c000, 0x10ffff) AM_READ(MRA16_RAM) /* main RAM */
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM) /* palette */
+ AM_RANGE(0x201000, 0x203fff) AM_READ(MRA16_RAM) /* read in initial checks */
+ AM_RANGE(0x400000, 0x400001) AM_READ(input_port_0_word_r)
+ AM_RANGE(0x400002, 0x400003) AM_READ(input_port_1_word_r)
+ AM_RANGE(0x401000, 0x401001) AM_READ(input_port_2_word_r)
+ AM_RANGE(0x401002, 0x401003) AM_READ(input_port_3_word_r)
+ AM_RANGE(0x420000, 0x420001) AM_READ(MRA16_NOP) /* read, but result not used */
+ AM_RANGE(0x440000, 0x4407ff) AM_READ(MRA16_RAM)
+ AM_RANGE(0xc00000, 0xc0ffff) AM_READ(PC080SN_word_0_r)
+ AM_RANGE(0xd00000, 0xd01fff) AM_READ(MRA16_RAM) /* original spriteram location, needed for Attract Mode */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( jumping_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x09ffff) AM_WRITE(MWA16_ROM)
+ AM_RANGE(0x10c000, 0x10ffff) AM_WRITE(MWA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x201000, 0x203fff) AM_WRITE(MWA16_RAM) /* written in initial checks */
+ AM_RANGE(0x3a0000, 0x3a0001) AM_WRITE(jumping_spritectrl_w)
+ AM_RANGE(0x3c0000, 0x3c0001) AM_WRITE(MWA16_NOP) /* watchdog? */
+ AM_RANGE(0x400006, 0x400007) AM_WRITE(jumping_sound_w)
+ AM_RANGE(0x430000, 0x430003) AM_WRITE(PC080SN_yscroll_word_0_w)
+ AM_RANGE(0x440000, 0x4407ff) AM_WRITE(MWA16_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ AM_RANGE(0x800000, 0x80ffff) AM_WRITE(MWA16_NOP) /* original c-chip location (not used) */
+ AM_RANGE(0xc00000, 0xc0ffff) AM_WRITE(PC080SN_word_0_w)
+ AM_RANGE(0xc20000, 0xc20003) AM_WRITE(MWA16_NOP) /* seems it is a leftover from rainbow: scroll y written here too */
+ AM_RANGE(0xc40000, 0xc40003) AM_WRITE(PC080SN_xscroll_word_0_w)
+ AM_RANGE(0xd00000, 0xd01fff) AM_WRITE(MWA16_RAM) /* original spriteram location, needed for Attract Mode */
+ADDRESS_MAP_END
+
+
+/**********************************************************
+ SOUND
+
+ Rainbow uses a YM2151 and YM3012
+ Jumping uses two YM2203's
+***********************************************************/
+
+static WRITE8_HANDLER( bankswitch_w )
+{
+ memory_set_bankptr(5, memory_region(REGION_CPU2) + ((data - 1) & 3) * 0x4000 + 0x10000);
+}
+
+static READ8_HANDLER( jumping_latch_r )
+{
+ return jumping_latch;
+}
+
+
+static ADDRESS_MAP_START( rainbow_s_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK5)
+ AM_RANGE(0x8000, 0x8fff) AM_READ(MRA8_RAM)
+ AM_RANGE(0x9001, 0x9001) AM_READ(YM2151_status_port_0_r)
+ AM_RANGE(0x9002, 0x9100) AM_READ(MRA8_RAM)
+ AM_RANGE(0xa001, 0xa001) AM_READ(taitosound_slave_comm_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( rainbow_s_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x8000, 0x8fff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0x9000, 0x9000) AM_WRITE(YM2151_register_port_0_w)
+ AM_RANGE(0x9001, 0x9001) AM_WRITE(YM2151_data_port_0_w)
+ AM_RANGE(0xa000, 0xa000) AM_WRITE(taitosound_slave_port_w)
+ AM_RANGE(0xa001, 0xa001) AM_WRITE(taitosound_slave_comm_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( jumping_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM)
+ AM_RANGE(0x8000, 0x8fff) AM_READ(MRA8_RAM)
+ AM_RANGE(0xb000, 0xb000) AM_READ(YM2203_status_port_0_r)
+ AM_RANGE(0xb400, 0xb400) AM_READ(YM2203_status_port_1_r)
+ AM_RANGE(0xb800, 0xb800) AM_READ(jumping_latch_r)
+ AM_RANGE(0xc000, 0xffff) AM_READ(MRA8_ROM)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( jumping_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM)
+ AM_RANGE(0x8000, 0x8fff) AM_WRITE(MWA8_RAM)
+ AM_RANGE(0xb000, 0xb000) AM_WRITE(YM2203_control_port_0_w)
+ AM_RANGE(0xb001, 0xb001) AM_WRITE(YM2203_write_port_0_w)
+ AM_RANGE(0xb400, 0xb400) AM_WRITE(YM2203_control_port_1_w)
+ AM_RANGE(0xb401, 0xb401) AM_WRITE(YM2203_write_port_1_w)
+ AM_RANGE(0xbc00, 0xbc00) AM_WRITE(MWA8_NOP) /* looks like a bankswitch, but sound works with or without it */
+ADDRESS_MAP_END
+
+
+/***********************************************************
+ INPUT PORTS, DIPs
+***********************************************************/
+
+static INPUT_PORTS_START( rainbow_generic )
+ PORT_START_TAG("DSWA")
+ TAITO_MACHINE_COCKTAIL
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x10, DEF_STR( 3C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x80)
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_3C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C ) ) PORT_CONDITION("DSWB",0x80,PORTCOND_EQUALS,0x00)
+
+ PORT_START_TAG("DSWB")
+ TAITO_DIFFICULTY
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x04, "100k 1000k" )
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+ PORT_DIPNAME( 0x08, 0x08, "Complete Bonus" )
+ PORT_DIPSETTING( 0x08, "1 Up" )
+ PORT_DIPSETTING( 0x00, "100k" )
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x10, "1" )
+ PORT_DIPSETTING( 0x00, "2" )
+ PORT_DIPSETTING( 0x30, "3" )
+ PORT_DIPSETTING( 0x20, "4" )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Language ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( English ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Japanese ) )
+ PORT_DIPNAME( 0x80, 0x80, "Coin Mode" )
+ PORT_DIPSETTING( 0x80, "Mode A (Japan)" ) /* Mode A is TAITO_COINAGE_JAPAN_OLD */
+ PORT_DIPSETTING( 0x00, "Mode B (World)" ) /* Mode B is TAITO_COINAGE_WORLD */
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rainbow )
+ PORT_INCLUDE(rainbow_generic)
+
+ /* 0x390000 -> 0x10cfc2 ($fc2,A5) : DSWA */
+
+ /* 0x3b0000 -> 0x10cfc4 ($fc4,A5) : DSWB */
+
+ PORT_START_TAG("800007")
+ 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_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )
+
+ PORT_START_TAG("800009")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START_TAG("80000B")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT )
+ 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_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 )
+
+ PORT_START_TAG("80000D")
+ 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_JOYSTICK_LEFT ) PORT_2WAY PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jumping )
+ PORT_INCLUDE(rainbow_generic)
+
+ /* 0x400000 -> 0x10cfc2 ($fc2,A5) */
+ PORT_MODIFY("DSWA")
+ PORT_DIPUNUSED( 0x01, IP_ACTIVE_LOW ) /* see notes */
+ PORT_DIPUNUSED( 0x02, IP_ACTIVE_LOW ) /* see notes */
+ PORT_DIPUNUSED( 0x04, IP_ACTIVE_LOW ) /* see notes */
+
+ /* 0x400002 -> 0x10cfc4 ($fc4,A5) */
+ PORT_MODIFY("DSWB")
+ PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) /* see notes */
+
+ PORT_START_TAG("401001")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START_TAG("401003")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY
+INPUT_PORTS_END
+
+
+/**************************************************************
+ GFX DECODING
+**************************************************************/
+
+static const gfx_layout tilelayout =
+{
+ 8,8, /* 8*8 tiles */
+ RGN_FRAC(1,1),
+ 4, /* 4 bits per pixel */
+ { 0, 1, 2, 3 },
+ { 8, 12, 0, 4, 24, 28, 16, 20 },
+ { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
+ 32*8 /* every tile takes 32 consecutive bytes */
+};
+
+static const gfx_layout spritelayout =
+{
+ 16,16, /* 16*16 sprites */
+ RGN_FRAC(1,1),
+ 4, /* 4 bits per pixel */
+ { 0, 1, 2, 3 },
+ { 8, 12, 0, 4, 24, 28, 16, 20, 40, 44, 32, 36, 56, 60, 48, 52 },
+ { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
+ 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
+ 128*8 /* every sprite takes 128 consecutive bytes */
+};
+
+static GFXDECODE_START( rainbow )
+ GFXDECODE_ENTRY( REGION_GFX2, 0x000000, spritelayout, 0, 0x80 ) /* OBJ 16x16 */
+ GFXDECODE_ENTRY( REGION_GFX1, 0x000000, tilelayout, 0, 0x80 ) /* SCR 8x8 */
+GFXDECODE_END
+
+
+static const gfx_layout jumping_tilelayout =
+{
+ 8,8, /* 8*8 tiles */
+ 16384, /* 16384 tiles */
+ 4, /* 4 bits per pixel */
+ { 0, 0x20000*8, 0x40000*8, 0x60000*8 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8 /* every tile takes 8 consecutive bytes */
+};
+
+static const gfx_layout jumping_spritelayout =
+{
+ 16,16, /* 16*16 sprites */
+ 5120, /* 5120 sprites */
+ 4, /* 4 bits per pixel */
+ { 0x78000*8,0x50000*8,0x28000*8,0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8*16+0, 8*16+1, 8*16+2, 8*16+3, 8*16+4, 8*16+5, 8*16+6, 8*16+7 },
+ { 0, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
+ 32*8 /* every sprite takes 32 consecutive bytes */
+};
+
+static GFXDECODE_START( jumping )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, jumping_spritelayout, 0, 0x80 ) /* OBJ 16x16 */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, jumping_tilelayout, 0, 0x80 ) /* SCR 8x8 */
+GFXDECODE_END
+
+
+/**************************************************************
+ YM2151 & YM2203 (SOUND)
+**************************************************************/
+
+/* 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,
+ bankswitch_w
+};
+
+
+/***********************************************************
+ MACHINE DRIVERS
+***********************************************************/
+
+static MACHINE_DRIVER_START( rainbow )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, 8000000)
+ MDRV_CPU_PROGRAM_MAP(rainbow_readmem,rainbow_writemem)
+ MDRV_CPU_VBLANK_INT(irq4_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(rainbow_s_readmem,rainbow_s_writemem)
+
+ 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, 2*8, 30*8-1)
+ MDRV_GFXDECODE(rainbow)
+ MDRV_PALETTE_LENGTH(8192)
+
+ MDRV_VIDEO_START(rainbow)
+ MDRV_VIDEO_UPDATE(rainbow)
+
+ /* 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)
+MACHINE_DRIVER_END
+
+
+static MACHINE_DRIVER_START( jumping )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, 8000000)
+ MDRV_CPU_PROGRAM_MAP(jumping_readmem,jumping_writemem)
+ MDRV_CPU_VBLANK_INT(irq4_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(jumping_sound_readmem,jumping_sound_writemem)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+ MDRV_INTERLEAVE(10) /* 10 CPU slices per frame - enough ? */
+
+ /* 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, 2*8, 30*8-1)
+ MDRV_GFXDECODE(jumping)
+ MDRV_PALETTE_LENGTH(8192)
+
+ MDRV_VIDEO_START(jumping)
+ MDRV_VIDEO_UPDATE(jumping)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM2203, 3579545)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+
+ MDRV_SOUND_ADD(YM2203, 3579545)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+MACHINE_DRIVER_END
+
+
+/***************************************************************************
+ DRIVERS
+***************************************************************************/
+
+ROM_START( rainbow )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_BYTE( "b22-10-1.19", 0x00000, 0x10000, CRC(e34a50ca) SHA1(17a92cd7182db1e18000b1ae689758fcfd70fe16) )
+ ROM_LOAD16_BYTE( "b22-11-1.20", 0x00001, 0x10000, CRC(6a31a093) SHA1(1e99ae47811c0d3774d138dab02ac50bc1b92173) )
+ ROM_LOAD16_BYTE( "b22-08-1.21", 0x20000, 0x10000, CRC(15d6e17a) SHA1(7b0339180239e75adf1437aee276b652a1bfee51) )
+ ROM_LOAD16_BYTE( "b22-09-1.22", 0x20001, 0x10000, CRC(454e66bc) SHA1(54d57dee90da04101f4b1473770b38001d63230f) )
+ ROM_LOAD16_BYTE( "b22-03.23", 0x40000, 0x20000, CRC(3ebb0fb8) SHA1(1b41b305623d121255eb70cb992e4d9da13abd82) )
+ ROM_LOAD16_BYTE( "b22-04.24", 0x40001, 0x20000, CRC(91625e7f) SHA1(765afd973d9b82bb496b04beca284bf2769d6e6f) )
+
+ ROM_REGION( 0x1c000, REGION_CPU2, 0 )
+ ROM_LOAD( "b22-14.43", 0x00000, 0x4000, CRC(113c1a5b) SHA1(effa2adf54a6be78b2d4baf3a47529342fb0d895) )
+ ROM_CONTINUE( 0x10000, 0xc000 )
+
+ ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "b22-01.2", 0x00000, 0x80000, CRC(b76c9168) SHA1(e924be0c8294b930488bb04583784254a840a52e) ) /* tiles */
+
+ ROM_REGION( 0xa0000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "b22-01.5", 0x00000, 0x80000, CRC(1b87ecf0) SHA1(37a463184f4064fe0565367236e289d57639614c) ) /* sprites */
+ ROM_LOAD16_BYTE( "b22-12.7", 0x80000, 0x10000, CRC(67a76dc6) SHA1(626ee684eb3ea859c695ffe03344ccaa442da4af) )
+ ROM_LOAD16_BYTE( "b22-13.6", 0x80001, 0x10000, CRC(2fda099f) SHA1(a1e27a4497f6733608be924d69d965b19f725b99) )
+ROM_END
+
+ROM_START( rainbowo )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_BYTE( "b22-10.19", 0x00000, 0x10000, CRC(3b013495) SHA1(fc89f401a80b9bde174df8a257bb7fad4937c838) )
+ ROM_LOAD16_BYTE( "b22-11.20", 0x00001, 0x10000, CRC(80041a3d) SHA1(619d71a2bef5fd898a15d37d8016850f832428c3) )
+ ROM_LOAD16_BYTE( "b22-08.21", 0x20000, 0x10000, CRC(962fb845) SHA1(1c5581e697902ee5cde0fb841ef05eade04a901b) )
+ ROM_LOAD16_BYTE( "b22-09.22", 0x20001, 0x10000, CRC(f43efa27) SHA1(f92bcdbe9bbc1c200946c10605846bb406d8e963) )
+ ROM_LOAD16_BYTE( "b22-03.23", 0x40000, 0x20000, CRC(3ebb0fb8) SHA1(1b41b305623d121255eb70cb992e4d9da13abd82) )
+ ROM_LOAD16_BYTE( "b22-04.24", 0x40001, 0x20000, CRC(91625e7f) SHA1(765afd973d9b82bb496b04beca284bf2769d6e6f) )
+
+ ROM_REGION( 0x1c000, REGION_CPU2, 0 )
+ ROM_LOAD( "b22-14.43", 0x00000, 0x4000, CRC(113c1a5b) SHA1(effa2adf54a6be78b2d4baf3a47529342fb0d895) )
+ ROM_CONTINUE( 0x10000, 0xc000 )
+
+ ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "b22-01.2", 0x00000, 0x80000, CRC(b76c9168) SHA1(e924be0c8294b930488bb04583784254a840a52e) ) /* tiles */
+
+ ROM_REGION( 0xa0000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "b22-01.5", 0x00000, 0x80000, CRC(1b87ecf0) SHA1(37a463184f4064fe0565367236e289d57639614c) ) /* sprites */
+ ROM_LOAD16_BYTE( "b22-12.7", 0x80000, 0x10000, CRC(67a76dc6) SHA1(626ee684eb3ea859c695ffe03344ccaa442da4af) )
+ ROM_LOAD16_BYTE( "b22-13.6", 0x80001, 0x10000, CRC(2fda099f) SHA1(a1e27a4497f6733608be924d69d965b19f725b99) )
+ROM_END
+
+ROM_START( rainbowe )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_BYTE( "b39-01.19", 0x00000, 0x10000, CRC(50690880) SHA1(88cd8739eaa6e4e5988be225c31d2a6605173d39) )
+ ROM_LOAD16_BYTE( "b39-02.20", 0x00001, 0x10000, CRC(4dead71f) SHA1(03e9df33fc8fc64d6eeb1c3a763acac00b10c071) )
+ ROM_LOAD16_BYTE( "b39-03.21", 0x20000, 0x10000, CRC(4a4cb785) SHA1(6ba7de3901a001cbb31713664ccb68b943a5578f) )
+ ROM_LOAD16_BYTE( "b39-04.22", 0x20001, 0x10000, CRC(4caa53bd) SHA1(302c668b77de41ffef96a3ca9d94877b4affc466) )
+ ROM_LOAD16_BYTE( "b22-03.23", 0x40000, 0x20000, CRC(3ebb0fb8) SHA1(1b41b305623d121255eb70cb992e4d9da13abd82) )
+ ROM_LOAD16_BYTE( "b22-04.24", 0x40001, 0x20000, CRC(91625e7f) SHA1(765afd973d9b82bb496b04beca284bf2769d6e6f) )
+
+ ROM_REGION( 0x1c000, REGION_CPU2, 0 )
+ ROM_LOAD( "b22-14.43", 0x00000, 0x4000, CRC(113c1a5b) SHA1(effa2adf54a6be78b2d4baf3a47529342fb0d895) )
+ ROM_CONTINUE( 0x10000, 0xc000 )
+
+ ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "b22-01.2", 0x00000, 0x80000, CRC(b76c9168) SHA1(e924be0c8294b930488bb04583784254a840a52e) ) /* tiles */
+
+ ROM_REGION( 0xa0000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "b22-01.5", 0x00000, 0x80000, CRC(1b87ecf0) SHA1(37a463184f4064fe0565367236e289d57639614c) ) /* sprites */
+ ROM_LOAD16_BYTE( "b22-12.7", 0x80000, 0x10000, CRC(67a76dc6) SHA1(626ee684eb3ea859c695ffe03344ccaa442da4af) )
+ ROM_LOAD16_BYTE( "b22-13.6", 0x80001, 0x10000, CRC(2fda099f) SHA1(a1e27a4497f6733608be924d69d965b19f725b99) )
+ROM_END
+
+ROM_START( jumping )
+ ROM_REGION( 0xa0000, REGION_CPU1, 0 )
+ ROM_LOAD16_BYTE( "jb1_h4", 0x00000, 0x10000, CRC(3fab6b31) SHA1(57803478949cb62f7eab2ef9be08b13aa2237dbc) )
+ ROM_LOAD16_BYTE( "jb1_h8", 0x00001, 0x10000, CRC(8c878827) SHA1(4a54a217b7c442305c3ce9298aa36ae225382444) )
+ ROM_LOAD16_BYTE( "jb1_i4", 0x20000, 0x10000, CRC(443492cf) SHA1(fc3809d784d611df4fd446ca2443eebdf4f0bfd7) )
+ ROM_LOAD16_BYTE( "jb1_i8", 0x20001, 0x10000, CRC(ed33bae1) SHA1(24ade29f3fdd45aa772ccf9c046294baa6eae7a2) )
+ ROM_LOAD16_BYTE( "b22-03.23", 0x40000, 0x20000, CRC(3ebb0fb8) SHA1(1b41b305623d121255eb70cb992e4d9da13abd82) )
+ ROM_LOAD16_BYTE( "b22-04.24", 0x40001, 0x20000, CRC(91625e7f) SHA1(765afd973d9b82bb496b04beca284bf2769d6e6f) )
+ ROM_LOAD16_BYTE( "jb1_f89", 0x80001, 0x10000, CRC(0810d327) SHA1(fe91ac02e617bde413dc8a20b7cbcaf3e20aeb28) ) /* c-chip substitute */
+
+ ROM_REGION( 0x14000, REGION_CPU2, 0 )
+ ROM_LOAD( "jb1_cd67", 0x00000, 0x8000, CRC(8527c00e) SHA1(86e3824caca39aca4ca4df63bb4474adacfc4c53) )
+ ROM_CONTINUE( 0x10000, 0x4000 )
+ ROM_CONTINUE( 0x0c000, 0x4000 )
+
+ ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "jb2_ic8", 0x00000, 0x10000, CRC(65b76309) SHA1(1e345726e137f4c56d4bf239651c986fd53a16c3) ) /* tiles */
+ ROM_LOAD( "jb2_ic7", 0x10000, 0x10000, CRC(43a94283) SHA1(d6a05cbc7b996a8e7f1520563f6fada9a59021a4) )
+ ROM_LOAD( "jb2_ic10", 0x20000, 0x10000, CRC(e61933fb) SHA1(02bc0e1a7a3ce9e15fb83b28ce8fafb0b8d80ebd) )
+ ROM_LOAD( "jb2_ic9", 0x30000, 0x10000, CRC(ed031eb2) SHA1(905be4d890ff7bb8a4d8ad85b2a11483fb4d67eb) )
+ ROM_LOAD( "jb2_ic12", 0x40000, 0x10000, CRC(312700ca) SHA1(c79edc9c25f364d0afd79aaa21cfe2fe46044314) )
+ ROM_LOAD( "jb2_ic11", 0x50000, 0x10000, CRC(de3b0b88) SHA1(14b8871821e4c0abbb9967c5aa282cf4e67884fe) )
+ ROM_LOAD( "jb2_ic14", 0x60000, 0x10000, CRC(9fdc6c8e) SHA1(ff4e1a98dc982bce2f9d235cac62c7166f477f64) )
+ ROM_LOAD( "jb2_ic13", 0x70000, 0x10000, CRC(06226492) SHA1(834280ec49e61a0c9c6b6fe2033e1b20bd1bffbf) )
+
+ ROM_REGION( 0xa0000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "jb2_ic62", 0x00000, 0x10000, CRC(8548db6c) SHA1(675cd301259d5ed16098a38ac58b27b5ccd91264) ) /* sprites */
+ ROM_LOAD( "jb2_ic61", 0x10000, 0x10000, CRC(37c5923b) SHA1(c83ef45564c56ef62d7019aecbd79dccc671deee) )
+ ROM_LOAD( "jb2_ic60", 0x20000, 0x08000, CRC(662a2f1e) SHA1(1c5e8b1f0623e64faf9cd60f9653fc5957191a9b) )
+ ROM_LOAD( "jb2_ic78", 0x28000, 0x10000, CRC(925865e1) SHA1(457de50bc03e8b949ac7d46ae4188201e87574a8) )
+ ROM_LOAD( "jb2_ic77", 0x38000, 0x10000, CRC(b09695d1) SHA1(e6d315f9befb7b47f42668d573a1102e52d78aea) )
+ ROM_LOAD( "jb2_ic76", 0x48000, 0x08000, CRC(41937743) SHA1(890c832a7cf87e6fe749d4824b02d57e10872bdf) )
+ ROM_LOAD( "jb2_ic93", 0x50000, 0x10000, CRC(f644eeab) SHA1(9d45e9dfb08e8c90b4b10f5dc383fa4732161a81) )
+ ROM_LOAD( "jb2_ic92", 0x60000, 0x10000, CRC(3fbccd33) SHA1(137880a564573db1f9e6de5c730af6709ca301f3) )
+ ROM_LOAD( "jb2_ic91", 0x70000, 0x08000, CRC(d886c014) SHA1(9327c332c98a81451e9e0624344d2601ef06e490) )
+ ROM_LOAD( "jb2_i121", 0x78000, 0x10000, CRC(93df1e4d) SHA1(b100d265b973254ec9cd44b6c32f62b4bac3b732) )
+ ROM_LOAD( "jb2_i120", 0x88000, 0x10000, CRC(7c4e893b) SHA1(eceecb38554157ee24d228a2c722dad750a6a07d) )
+ ROM_LOAD( "jb2_i119", 0x98000, 0x08000, CRC(7e1d58d8) SHA1(d586a018c3ec3e6e6a39992170d324361e03c68a) )
+ROM_END
+
+
+static DRIVER_INIT( rainbow )
+{
+ rainbow_cchip_init(0);
+}
+
+static DRIVER_INIT( rainbowe )
+{
+ rainbow_cchip_init(1);
+}
+
+static DRIVER_INIT( jumping )
+{
+ int i;
+
+ /* Sprite colour map is reversed - switch to normal */
+
+ for (i = 0;i < memory_region_length(REGION_GFX2);i++)
+ memory_region(REGION_GFX2)[i] ^= 0xff;
+
+ state_save_register_global(jumping_latch);
+}
+
+
+GAME( 1987, rainbow, 0, rainbow, rainbow, rainbow, ROT0, "Taito Corporation", "Rainbow Islands (new version)", 0 )
+GAME( 1987, rainbowo, rainbow, rainbow, rainbow, rainbow, ROT0, "Taito Corporation", "Rainbow Islands (old version)", 0 )
+GAME( 1988, rainbowe, rainbow, rainbow, rainbow, rainbowe, ROT0, "Taito Corporation", "Rainbow Islands (Extra)", 0 )
+GAME( 1989, jumping, rainbow, jumping, jumping, jumping, ROT0, "bootleg", "Jumping", 0 )