summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/dreamwld.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/dreamwld.c')
-rw-r--r--src/mame/drivers/dreamwld.c524
1 files changed, 524 insertions, 0 deletions
diff --git a/src/mame/drivers/dreamwld.c b/src/mame/drivers/dreamwld.c
new file mode 100644
index 00000000000..2ab02602730
--- /dev/null
+++ b/src/mame/drivers/dreamwld.c
@@ -0,0 +1,524 @@
+/*
+
+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 )