diff options
Diffstat (limited to 'src/mame/drivers/yumefuda.c')
-rw-r--r-- | src/mame/drivers/yumefuda.c | 449 |
1 files changed, 449 insertions, 0 deletions
diff --git a/src/mame/drivers/yumefuda.c b/src/mame/drivers/yumefuda.c new file mode 100644 index 00000000000..b15d87a27c9 --- /dev/null +++ b/src/mame/drivers/yumefuda.c @@ -0,0 +1,449 @@ +/******************************************************************************************* + +Yumefuda (c) 198? Alba + +driver by Angelo Salese + +Notes: +-I think the name of this hardware is "Alba ZG board",an older(?) revision of the + "Alba ZC board" used by Hanaroku (hanaroku.c driver). + My guess is that this game is dated 1986/1987. + +TODO: +-Correct Bankswitch emulation.Obviously I'm not happy with the current implementation... + +-Finish controls. + +-Custom RAM emulation. + +-Fix the colors. + +============================================================================================ +Code disassembling +(anything that I don't know the meaning is in brackets): +[0458]-> (Writes to ports 00 & 01) +[04bd]-> Enables prot lock +[04d9]-> Palette RAM init +[0c55]-> Video Ram Init +[04c3]-> Disables prot lock +[2603]-> Custom Ram Math +[008b]-> Custom Ram Check 1 [without prot lock] +[009A]-> Custom Ram Check 2 [must be NZ] +[010e]-> Video Ram Math 1 [$c000] +[00A0]-> Video Ram Check 1 [must be Z] +[013b]-> Video Ram Math 2 [$d000] +[00A6]-> Video Ram Check 2 [must be Z] +[0197]-> Eeprom Check 1 + [2344] -> Eeprom sub check 1 + [2318] -> Eeprom sub check 2 + ... +[0222]-> Back Up Check +[047c]-> (Writes to ports 83 & 80) +[0488]-> Multiple writes to sound ports 40 & 41 +[04b4]-> Disables prot lock +[0810]->[08b5]->write & read to sound port 40 +[08dd]-> + [079d]->(write to port c0) + [0985]->Nvram lock enable/disable + ... +[0b44]-> Nvram Check +[0b1a]-> Nvram Check +[090a]-> (?) +[0312]-> Eeprom init msg +*******************************************************************************************/ + +#include "driver.h" +#include "machine/eeprom.h" +#include "sound/ay8910.h" + +static tilemap *bg_tilemap; + +static TILE_GET_INFO( y_get_bg_tile_info ) +{ + int code = videoram[tile_index]; + int color = colorram[tile_index]; + + SET_TILE_INFO( + 0, + code + ((color & 0xf8) << 3), + color & 0x7, + 0); +} + + +static VIDEO_START( yumefuda ) +{ + bg_tilemap = tilemap_create(y_get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); +} + +static VIDEO_UPDATE( yumefuda ) +{ + tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + return 0; +} + +/***************************************************************************************/ + + + +static const gfx_layout charlayout = +{ + 8,8, + RGN_FRAC(1,4), + 4, + { RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + 8*8 +}; + +static GFXDECODE_START( yumefuda ) + GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 0x10 ) +GFXDECODE_END + + +static WRITE8_HANDLER( yumefuda_vram_w ) +{ + videoram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap,offset); +} + +static WRITE8_HANDLER( yumefuda_cram_w ) +{ + colorram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap,offset); +} + +static UINT8 *cus_ram; +static UINT8 prot_lock; + +/*Custom RAM (Protection)*/ +static READ8_HANDLER( custom_ram_r ) +{ +// logerror("Custom RAM read at %02x PC = %x\n",offset+0xaf80,activecpu_get_pc()); + return cus_ram[offset];// ^ 0x55; +} + +static WRITE8_HANDLER( custom_ram_w ) +{ +// logerror("Custom RAM write at %02x : %02x PC = %x\n",offset+0xaf80,data,activecpu_get_pc()); + if(prot_lock) { cus_ram[offset] = data; } +} + +/*this might be used as NVRAM commands btw*/ +static WRITE8_HANDLER( prot_lock_w ) +{ +// logerror("PC %04x Prot lock value written %02x\n",activecpu_get_pc(),data); + prot_lock = data; +} + +static WRITE8_HANDLER( eeprom_w ) +{ + EEPROM_write_bit(data & 0x04); + EEPROM_set_cs_line((data & 0x02) ? CLEAR_LINE : ASSERT_LINE); + EEPROM_set_clock_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE); +} + +static WRITE8_HANDLER( port_c0_w ) +{ +// logerror("PC %04x (Port $c0) value written %02x\n",activecpu_get_pc(),data); +} + + +static READ8_HANDLER( eeprom_r ) +{ + return ((~EEPROM_read_bit()&0x01)<<6) | (0xff&~0x40); +} + +static UINT8 mux_data; + +static READ8_HANDLER( mux_r ) +{ + switch(mux_data) + { + case 0x00: return readinputport(0); + case 0x01: return readinputport(1); + case 0x02: return readinputport(2); + case 0x04: return readinputport(3); + case 0x08: return readinputport(4); + case 0x10: return 0xff; return readinputport(5); + case 0x20: return 0xff; return readinputport(6); + } + return 0xff; +} + +static WRITE8_HANDLER( mux_w ) +{ + static int bank=-1; + + int new_bank = (data&0xc0)>>6; + + //0x10000 service mode + //0x12000 gameplay + //0x14000 bonus game + //0x16000 ? + if(bank!=new_bank) { + UINT8 *ROM = memory_region(REGION_CPU1); + UINT32 bankaddress; + + bank = new_bank; + bankaddress = 0x10000 + 0x2000 * bank; + memory_set_bankptr(1, &ROM[bankaddress]); + } + + mux_data = data & ~0xc0; +} + + +/***************************************************************************************/ + +static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) + AM_RANGE(0x8000, 0x9fff) AM_READ(MRA8_BANK1) + AM_RANGE(0xaf80, 0xafff) AM_READ(custom_ram_r) + AM_RANGE(0xb000, 0xb0ff) AM_READ(MRA8_RAM) + AM_RANGE(0xc000, 0xc3ff) AM_READ(MRA8_RAM) + AM_RANGE(0xd000, 0xd3ff) AM_READ(MRA8_RAM) + AM_RANGE(0xe000, 0xffff) AM_READ(MRA8_RAM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0x8000, 0x9fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0xa7fc, 0xa7fc) AM_WRITE(prot_lock_w) + AM_RANGE(0xa7ff, 0xa7ff) AM_WRITE(eeprom_w) + AM_RANGE(0xaf80, 0xafff) AM_WRITE(custom_ram_w) AM_BASE(&cus_ram) //260d - 2626 + AM_RANGE(0xb000, 0xb0ff) AM_WRITE(MWA8_RAM) AM_WRITE(paletteram_RRRGGGBB_w) AM_BASE(&paletteram)/*Wrong format*/ + AM_RANGE(0xc000, 0xc3ff) AM_WRITE(yumefuda_vram_w) AM_BASE(&videoram) + AM_RANGE(0xd000, 0xd3ff) AM_WRITE(yumefuda_cram_w) AM_BASE(&colorram) + AM_RANGE(0xe000, 0xffff) AM_WRITE(MWA8_RAM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x40, 0x40) AM_READ(AY8910_read_port_0_r) + AM_RANGE(0x81, 0x81) AM_READ(eeprom_r) + AM_RANGE(0x82, 0x82) AM_READ(mux_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x40, 0x40) AM_WRITE(AY8910_control_port_0_w) + AM_RANGE(0x41, 0x41) AM_WRITE(AY8910_write_port_0_w) + AM_RANGE(0x80, 0x80) AM_WRITE(mux_w) + AM_RANGE(0xc0, 0xc0) AM_WRITE(port_c0_w) //watchdog write? +ADDRESS_MAP_END + +static MACHINE_DRIVER_START( yumefuda ) + + /* basic machine hardware */ + MDRV_CPU_ADD(Z80 , 6000000) /*???*/ + MDRV_CPU_PROGRAM_MAP(readmem,writemem) + MDRV_CPU_IO_MAP(readport,writeport) + MDRV_CPU_VBLANK_INT(irq0_line_hold,1) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + + MDRV_NVRAM_HANDLER(93C46) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 32*8-1) + MDRV_GFXDECODE( yumefuda ) + MDRV_PALETTE_LENGTH(0x100) + + MDRV_VIDEO_START( yumefuda ) + MDRV_VIDEO_UPDATE( yumefuda ) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 1500000) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +MACHINE_DRIVER_END + +/***************************************************************************************/ + +static INPUT_PORTS_START( yumefuda ) + PORT_START + PORT_DIPNAME( 0x01, 0x01, "Port 0" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START + PORT_DIPNAME( 0x01, 0x01, "Port 1" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("P1 BET Button") PORT_CODE(KEYCODE_RALT) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START + PORT_DIPNAME( 0x01, 0x01, "Port 2" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON4 ) + + PORT_START + PORT_DIPNAME( 0x01, 0x01, "Port 3" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P1 Button 6 / Yes") PORT_CODE(KEYCODE_RCONTROL) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START + PORT_DIPNAME( 0x01, 0x01, "Port 4" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +/* + PORT_START + PORT_DIPNAME( 0x01, 0x01, "Port 5" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START + PORT_DIPNAME( 0x01, 0x01, "Port 6" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) )*/ +INPUT_PORTS_END + +/***************************************************************************************/ + + +ROM_START( yumefuda ) + ROM_REGION( 0x18000, REGION_CPU1, 0 ) /* code */ + ROM_LOAD("zg004y02.u43", 0x00000, 0x8000, CRC(974c543c) SHA1(56aeb318cb00445f133246dfddc8c24bb0c23f2d)) + ROM_LOAD("zg004y01.u42", 0x10000, 0x8000, CRC(ae99126b) SHA1(4ae2c1c804bbc505a013f5e3d98c0bfbb51b747a)) + + ROM_REGION( 0x10000, REGION_GFX1, 0 ) + ROM_LOAD("zg001006.u6", 0x0000, 0x4000, CRC(a5df443c) SHA1(a6c088a463c05e43a7b559c5d0afceddc88ef476)) + ROM_LOAD("zg001005.u5", 0x4000, 0x4000, CRC(158b6cde) SHA1(3e335b7dc1bbae2edb02722025180f32ab91f69f)) + ROM_LOAD("zg001004.u4", 0x8000, 0x4000, CRC(d8676435) SHA1(9b6df5378948f492717e1a4d9c833ddc5a9e8225)) + ROM_LOAD("zg001003.u3", 0xc000, 0x4000, CRC(5822ff27) SHA1(d40fa0790de3c912f770ef8f610bd8c42bc3500f)) +ROM_END + +GAME( 198?, yumefuda, 0, yumefuda, yumefuda, 0, ROT0, "Alba", "(Medal) Yumefuda [BET]", GAME_NOT_WORKING | GAME_WRONG_COLORS ) |