/*
Dream World
SemiCom, 2000
PCB Layout
----------
|-------------------------------------------------|
| M6295 ROM5 62256 ACTEL ROM10 |
|VOL M6295 ROM6 62256 A40MX04 |
| PAL PAL 32MHz |
| 62256 62256 PAL |
| ROM1 ROM3 68EC020 PAL PAL |
| ROM2 ROM4 PAL PAL |
|J 62256 62256 PAL |
|A PAL 27MHz |
|M PAL |
|M ACTEL M5M44260 |
|A 6116 A40MX04 M5M44260 |
| 6116 |
| PAL |
| 6264 PAL |
| 6264 |
| DSW1 ROM11 |
| 8752 ROM7 ROM9 |
| DSW2 ROM8 |
|-------------------------------------------------|
Notes:
68020 @ 16.0MHz [32/2]
M6295 (both) @ 1.0MHz [32/32]. pin 7 LOW
8752 @ 16.0MHz [32/2]
HSync @ 15.2kHz
VSync @ 58Hz
*/
#include "driver.h"
#include "sound/okim6295.h"
#define MASTER_CLOCK 32000000
static UINT32*dreamwld_bg_videoram;
static UINT32*dreamwld_bg2_videoram;
static UINT32*dreamwld_bg_scroll;
static int dreamwld_tilebank[2], dreamwld_tilebankold[2];
static tilemap *dreamwld_bg_tilemap;
static tilemap *dreamwld_bg2_tilemap;
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect )
{
const gfx_element *gfx = machine->gfx[0];
UINT32 *source = spriteram32;
UINT32 *finish = spriteram32 + 0x1000/4;
UINT16 *redirect = (UINT16 *)memory_region(REGION_GFX3);
while( source<finish )
{
int xpos, ypos, tileno;
int xsize, ysize, xinc;
int xct, yct;
int xflip;
int colour;
xpos = (source[0]&0x000001ff) >> 0;
ypos = (source[0]&0x01ff0000) >> 16;
xsize = (source[0]&0x00000e00) >> 9;
ysize = (source[0]&0x0e000000) >> 25;
tileno = (source[1]&0x0000ffff) >>0;
colour = (source[1]&0x3f000000) >>24;
xflip = (source[1]&0x40000000);
xinc = 16;
if (xflip)
{
xinc = -16;
xpos+=16*xsize;
}
ysize++;xsize++; // size 0 = 1 tile
xpos -=16;
for (yct=0;yct<ysize;yct++)
{
for (xct=0;xct<xsize;xct++)
{
drawgfx(bitmap,gfx,redirect[tileno],colour,xflip,0,xpos+xct*xinc,ypos+yct*16,cliprect,TRANSPARENCY_PEN,0);
drawgfx(bitmap,gfx,redirect[tileno],colour,xflip,0,(xpos+xct*xinc)-0x200,ypos+yct*16,cliprect,TRANSPARENCY_PEN,0);
drawgfx(bitmap,gfx,redirect[tileno],colour,xflip,0,(xpos+xct*xinc)-0x200,(ypos+yct*16)-0x200,cliprect,TRANSPARENCY_PEN,0);
drawgfx(bitmap,gfx,redirect[tileno],colour,xflip,0,xpos+xct*xinc,(ypos+yct*16)-0x200,cliprect,TRANSPARENCY_PEN,0);
tileno++;
}
}
source+=2;
}
}
static WRITE32_HANDLER( dreamwld_bg_videoram_w )
{
COMBINE_DATA(&dreamwld_bg_videoram[offset]);
tilemap_mark_tile_dirty(dreamwld_bg_tilemap,offset*2);
tilemap_mark_tile_dirty(dreamwld_bg_tilemap,offset*2+1);
}
static TILE_GET_INFO( get_dreamwld_bg_tile_info )
{
int tileno,colour;
tileno = (tile_index&1)?(dreamwld_bg_videoram[tile_index>>1]&0xffff):((dreamwld_bg_videoram[tile_index>>1]>>16)&0xffff);
colour = tileno >> 13;
tileno &=0x1fff;
SET_TILE_INFO(1,tileno+dreamwld_tilebank[0]*0x2000,0x80+colour,0);
}
static WRITE32_HANDLER( dreamwld_bg2_videoram_w )
{
COMBINE_DATA(&dreamwld_bg2_videoram[offset]);
tilemap_mark_tile_dirty(dreamwld_bg2_tilemap,offset*2);
tilemap_mark_tile_dirty(dreamwld_bg2_tilemap,offset*2+1);
}
static TILE_GET_INFO( get_dreamwld_bg2_tile_info )
{
UINT16 tileno,colour;
tileno = (tile_index&1)?(dreamwld_bg2_videoram[tile_index>>1]&0xffff):((dreamwld_bg2_videoram[tile_index>>1]>>16)&0xffff);
colour = tileno >> 13;
tileno &=0x1fff;
SET_TILE_INFO(1,tileno+dreamwld_tilebank[1]*0x2000,0xc0+colour,0);
}
static VIDEO_START(dreamwld)
{
dreamwld_bg_tilemap = tilemap_create(get_dreamwld_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16, 64,32);
dreamwld_bg2_tilemap = tilemap_create(get_dreamwld_bg2_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16, 64,32);
tilemap_set_transparent_pen(dreamwld_bg2_tilemap,0);
dreamwld_tilebankold[0] = dreamwld_tilebankold[1] = -1;
dreamwld_tilebank[0] = dreamwld_tilebank[1] = 0;
}
static VIDEO_UPDATE(dreamwld)
{
tilemap_set_scrolly( dreamwld_bg_tilemap,0, dreamwld_bg_scroll[(0x400/4)]+32 );
tilemap_set_scrolly( dreamwld_bg2_tilemap,0, dreamwld_bg_scroll[(0x400/4)+2]+32 );
tilemap_set_scrollx( dreamwld_bg_tilemap,0, dreamwld_bg_scroll[(0x400/4)+1]+3 );
tilemap_set_scrollx( dreamwld_bg2_tilemap,0, dreamwld_bg_scroll[(0x400/4)+3]+5 );
dreamwld_tilebank[0] = (dreamwld_bg_scroll[(0x400/4)+4]>>6)&1;
dreamwld_tilebank[1] = (dreamwld_bg_scroll[(0x400/4)+5]>>6)&1;
if (dreamwld_tilebank[0] != dreamwld_tilebankold[0])
{
dreamwld_tilebankold[0] = dreamwld_tilebank[0];
tilemap_mark_all_tiles_dirty (dreamwld_bg_tilemap);
}
if (dreamwld_tilebank[1] != dreamwld_tilebankold[1])
{
dreamwld_tilebankold[1] = dreamwld_tilebank[1];
tilemap_mark_all_tiles_dirty (dreamwld_bg2_tilemap);
}
tilemap_draw(bitmap,cliprect,dreamwld_bg_tilemap,0,0);
tilemap_draw(bitmap,cliprect,dreamwld_bg2_tilemap,0,0);
draw_sprites(machine,bitmap,cliprect);
return 0;
}
static READ32_HANDLER( dreamwld_protdata_r )
{
static int protindex = 0;
UINT8 *protdata = memory_region( REGION_USER1 );
size_t protsize = memory_region_length( REGION_USER1 );
UINT8 dat = protdata[(protindex++)%protsize];
return dat<<24;
}
static READ32_HANDLER( dreamwld_inputs_r )
{
return readinputport(1)|(readinputport(0)<<16);
}
static READ32_HANDLER( dreamwld_dips_r )
{
int x;
x= readinputport(2);
return x|(x<<16);
}
static WRITE32_HANDLER( dreamwld_palette_w )
{
UINT16 dat;
int color;
COMBINE_DATA(&paletteram32[offset]);
color = offset*2;
dat = paletteram32[offset]&0x7fff;
palette_set_color_rgb(Machine,color+1,pal5bit(dat >> 10),pal5bit(dat >> 5),pal5bit(dat >> 0));
dat = (paletteram32[offset]>>16)&0x7fff;
palette_set_color_rgb(Machine,color,pal5bit(dat >> 10),pal5bit(dat >> 5),pal5bit(dat >> 0));
}
static READ32_HANDLER(dreamwld_6295_0_r)
{
return OKIM6295_status_0_r(0)<<24;
}
static WRITE32_HANDLER(dreamwld_6295_0_w)
{
if (!(mem_mask & 0xff000000))
{
OKIM6295_data_0_w(0, (data>>24) & 0xff);
}
else
{
logerror("OKI0: unk write %x mem_mask %8x\n", data, mem_mask);
}
}
static void dreamwld_oki_setbank( UINT8 chip, UINT8 bank )
{
/* 0x30000-0x3ffff is banked.
banks are at 0x30000,0x40000,0x50000 and 0x60000 in rom */
UINT8 *sound = chip?memory_region(REGION_SOUND1):memory_region(REGION_SOUND2);
logerror("OKI%d: set bank %02x\n",chip,bank);
memcpy(sound+0x30000, sound+0xb0000+0x10000*bank, 0x10000);
}
static WRITE32_HANDLER( dreamwld_6295_0_bank_w )
{
if (!(mem_mask & 0x000000ff))
{
dreamwld_oki_setbank(0,data&0x3);
}
else
{
logerror("OKI0: unk bank write %x mem_mask %8x\n", data, mem_mask);
}
}
static READ32_HANDLER(dreamwld_6295_1_r)
{
return OKIM6295_status_1_r(0)<<24;
}
static WRITE32_HANDLER(dreamwld_6295_1_w)
{
if (!(mem_mask & 0xff000000))
{
OKIM6295_data_1_w(0, (data>>24) & 0xff);
}
else
{
logerror("OKI1: unk write %x mem_mask %8x\n", data, mem_mask);
}
}
static WRITE32_HANDLER( dreamwld_6295_1_bank_w )
{
if (!(mem_mask & 0x000000ff))
{
dreamwld_oki_setbank(1,data&0x3);
}
else
{
logerror("OKI1: unk bank write %x mem_mask %8x\n", data, mem_mask);
}
}
static ADDRESS_MAP_START( dreamwld_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_WRITE(MWA32_NOP)
AM_RANGE(0x400000, 0x401fff) AM_RAM AM_BASE( &spriteram32 )
AM_RANGE(0x600000, 0x601fff) AM_RAM AM_WRITE(dreamwld_palette_w) AM_BASE(&paletteram32) // real palette?
AM_RANGE(0x800000, 0x801fff) AM_READWRITE(MRA32_RAM, dreamwld_bg_videoram_w ) AM_BASE( &dreamwld_bg_videoram )
AM_RANGE(0x802000, 0x803fff) AM_READWRITE(MRA32_RAM, dreamwld_bg2_videoram_w ) AM_BASE( &dreamwld_bg2_videoram )
AM_RANGE(0x804000, 0x805fff) AM_RAM AM_BASE( &dreamwld_bg_scroll ) // scroll regs etc.
AM_RANGE(0xc00000, 0xc00003) AM_READ(dreamwld_inputs_r)
AM_RANGE(0xc00004, 0xc00007) AM_READ(dreamwld_dips_r)
AM_RANGE(0xc0000c, 0xc0000f) AM_WRITE( dreamwld_6295_0_bank_w ) // sfx
AM_RANGE(0xc00018, 0xc0001b) AM_READWRITE( dreamwld_6295_0_r, dreamwld_6295_0_w) // sfx
AM_RANGE(0xc0002c, 0xc0002f) AM_WRITE( dreamwld_6295_1_bank_w ) // sfx
AM_RANGE(0xc00028, 0xc0002b) AM_READWRITE( dreamwld_6295_1_r, dreamwld_6295_1_w) // sfx
AM_RANGE(0xc00030, 0xc00033) AM_READ(dreamwld_protdata_r) // it reads protection data (irq code) from here and puts it at ffd000
AM_RANGE(0xfe0000, 0xffffff) AM_RAM // work ram
ADDRESS_MAP_END
static INPUT_PORTS_START(dreamwld)
PORT_START
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_START
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_DIPNAME( 0x0004, 0x0004, "Not Dips?" ) // i don't think these are dips, they're probably just unused parts of the coin port input
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_START /* 16bit */
PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0001, "1" )
PORT_DIPSETTING( 0x0003, "2" )
PORT_DIPSETTING( 0x0002, "3" )
PORT_DIPSETTING( 0x0000, "4" )
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0060, 0x0060, "Ticket Payout" ) PORT_DIPLOCATION("SW2:6,7")
PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
PORT_DIPSETTING( 0x0020, "Little" )
PORT_DIPSETTING( 0x0060, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0040, "Much" )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0e00, 0x0e00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:2,3,4")
PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x0200, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x0400, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0600, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0e00, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x0a00, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x0c00, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x0800, DEF_STR( 1C_3C ) )
PORT_DIPNAME( 0x7000, 0x7000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:5,6,7")
PORT_DIPSETTING( 0x2000, "Level 1" )
PORT_DIPSETTING( 0x1000, "Level 2" )
PORT_DIPSETTING( 0x0000, "Level 3" )
PORT_DIPSETTING( 0x7000, "Level 4" )
PORT_DIPSETTING( 0x6000, "Level 5" )
PORT_DIPSETTING( 0x5000, "Level 6" )
PORT_DIPSETTING( 0x4000, "Level 7" )
PORT_DIPSETTING( 0x3000, "Level 8" )
PORT_SERVICE_DIPLOC( 0x8000, IP_ACTIVE_LOW, "SW1:8" )
INPUT_PORTS_END
static const gfx_layout tiles16x16_layout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60 },
{ 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 },
16*64
};
static GFXDECODE_START( dreamwld )
GFXDECODE_ENTRY( REGION_GFX1, 0, tiles16x16_layout, 0, 0x100 )
GFXDECODE_ENTRY( REGION_GFX2, 0, tiles16x16_layout, 0, 0x100 )
GFXDECODE_END
static MACHINE_DRIVER_START( dreamwld )
/* basic machine hardware */
MDRV_CPU_ADD(M68EC020, MASTER_CLOCK/2)
MDRV_CPU_PROGRAM_MAP(dreamwld_map, 0)
MDRV_CPU_VBLANK_INT(irq4_line_hold,1) // 4, 5, or 6, all point to the same place
MDRV_SCREEN_REFRESH_RATE(58)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512,256)
MDRV_SCREEN_VISIBLE_AREA(0, 304-1, 0, 224-1)
MDRV_PALETTE_LENGTH(0x1000)
MDRV_GFXDECODE(dreamwld)
MDRV_VIDEO_START(dreamwld)
MDRV_VIDEO_UPDATE(dreamwld)
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(OKIM6295, MASTER_CLOCK/32)
MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.50)
MDRV_SOUND_ADD(OKIM6295, MASTER_CLOCK/32)
MDRV_SOUND_CONFIG(okim6295_interface_region_2_pin7low)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.50)
MACHINE_DRIVER_END
ROM_START( dreamwld )
ROM_REGION( 0x200000, REGION_CPU1, 0 )
ROM_LOAD32_BYTE( "1.bin", 0x000002, 0x040000, CRC(35c94ee5) SHA1(3440a65a807622b619c97bc2a88fd7d875c26f66) )
ROM_LOAD32_BYTE( "2.bin", 0x000003, 0x040000, CRC(5409e7fc) SHA1(2f94a6a8e4c94b36b43f0b94d58525f594339a9d) )
ROM_LOAD32_BYTE( "3.bin", 0x000000, 0x040000, CRC(e8f7ae78) SHA1(cfd393cec6dec967c82e1131547b7e7fdc5d814f) )
ROM_LOAD32_BYTE( "4.bin", 0x000001, 0x040000, CRC(3ef5d51b) SHA1(82a00b4ff7155f6d5553870dfd510fed9469d9b5) )
ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 87C52 MCU Code */
ROM_LOAD( "87c52.mcu", 0x00000, 0x10000 , NO_DUMP ) /* can't be dumped. */
ROM_REGION( 0x6c9, REGION_USER1, 0 ) /* Protection data */
/* The MCU supplies this data.
The 68k reads it through a port, taking the size and destination write address from the level 1
and level 2 irq positions in the 68k vector table (there is code to check that they haven't been
modofied!) It then decodes the data using the rom checksum previously calculated and puts it in
ram. The interrupt vectors point at the code placed in RAM. */
ROM_LOAD( "protdata.bin", 0x000, 0x6c9 , CRC(f284b2fd) SHA1(9e8096c8aa8a288683f002311b38787b120748d1) ) /* extracted */
ROM_REGION( 0x100000, REGION_SOUND1, 0 ) /* OKI Samples - 1st chip*/
ROM_LOAD( "5.bin", 0x000000, 0x80000, CRC(9689570a) SHA1(4414233da8f46214ca7e9022df70953922a63aa4) )
ROM_RELOAD(0x80000,0x80000) // fot the banks
ROM_REGION( 0x100000, REGION_SOUND2, 0 ) /* OKI Samples - 2nd chip*/
ROM_LOAD( "6.bin", 0x000000, 0x80000, CRC(c8b91f30) SHA1(706004ca56d0a74bc7a3dfd73a21cdc09eb90f05) )
ROM_RELOAD(0x80000,0x80000) // fot the banks
ROM_REGION( 0x400000, REGION_GFX1, 0 ) /* Sprite Tiles - decoded */
ROM_LOAD( "9.bin", 0x000000, 0x200000, CRC(fa84e3af) SHA1(5978737d348fd382f4ec004d29870656c864d137) )
ROM_REGION( 0x200000, REGION_GFX2, 0 ) /* BG Tiles - decoded */
ROM_LOAD( "10.bin",0x000000, 0x200000, CRC(3553e4f5) SHA1(c335494f4a12a01a88e7cd578cae922954303cfd) )
ROM_REGION( 0x040000, REGION_GFX3, 0 ) /* Sprite Code Lookup ... */
ROM_LOAD16_BYTE( "8.bin", 0x000000, 0x020000, CRC(8d570df6) SHA1(e53e4b099c64eca11d027e0083caa101fcd99959) )
ROM_LOAD16_BYTE( "7.bin", 0x000001, 0x020000, CRC(a68bf35f) SHA1(f48540a5415a7d9723ca6e7e03cab039751dce17) )
ROM_REGION( 0x10000, REGION_GFX4, 0 ) /* ???? - not decoded seems to be in blocks of 0x41 bytes.. */
ROM_LOAD( "11.bin", 0x000000, 0x10000, CRC(0da8db45) SHA1(7d5bd71c5b0b28ff74c732edd7c662f46f2ab25b) )
ROM_END
GAME( 2000, dreamwld, 0, dreamwld, dreamwld, 0, ROT0, "SemiCom", "Dream World", 0 )