diff options
Diffstat (limited to 'src/mame/drivers/fuukifg3.c')
-rw-r--r-- | src/mame/drivers/fuukifg3.c | 741 |
1 files changed, 741 insertions, 0 deletions
diff --git a/src/mame/drivers/fuukifg3.c b/src/mame/drivers/fuukifg3.c new file mode 100644 index 00000000000..760ae8185b5 --- /dev/null +++ b/src/mame/drivers/fuukifg3.c @@ -0,0 +1,741 @@ +/*************************************************************************** + + -= Fuuki 32 Bit Games (FG-3) =- + + driver by Paul Priest and David Haywood + based on fuukifg2 by Luca Elia + +Hardware is similar to FG-2 used for : +"Go Go! Mile Smile", "Susume! Mile Smile (Japan)" & "Gyakuten!! Puzzle Bancho (Japan)" +See fuukifg2.c + +Main CPU : M68020 + +--------------------------------------------------------------------------- +Year + Game +--------------------------------------------------------------------------- +98 Asura Blade - Sword of Dynasty (Japan) +00 Asura Buster - Eternal Warriors (Japan) + +English versions exist, but are not dumped + +--------------------------------------------------------------------------- + +-- +Notes so far: + +- Dips, need DIP sheet. + +- Raster Effects are imperfect, bad frames when lots of new sprites. + +- The scroll values are generally wrong when flip screen is on and rasters are often incorrect + +Asura Blade +Fuuki Co. Ltd., 1998 + +PCB Layout +---------- + +Top Board + +FG-3J MAIN-J Revision:1.1 +|-----------------------------------------------------| +| YAC516 YMF278 N341256(x4) N341028 (x4) FI-002K | +| 33.8688MHz N341512(x4) | +| PAL N341256 | +| Z80 N341256 | +| N341256 | +|J DSW1 | +|A | +|M 12MHz FI-003K N341256(x2) | +|M DSW2 N341256(x3) | +|A PAL | +| 40MHz PAL | +| DSW3 PAL N341256 | +| 68020 PAL N341256 | +| N341256 28.432MHz M60067-0901FP | +| DSW4 N341256 PAL | +|-----------------------------------------------------| + +Notes: + 68020 clock: 20.000MHz + Z80 clock: 6.000MHz + YM278 clock: 33.8688MHz + VSync: 60Hz + Hsync: 15.81kHz + + +Bottom Board + +FG-3J ROM-J 507KA0301P04 Rev:1.3 +|--------------------------------| +| SROM | +| | +| SP01* SP89 PCM | +| | +| SP23 SPAB | +| | +| SP45 SPCD MAP | +| | +| SP67 SPEF* PGM3 | +| | +| PGM2 | +| | +| BG2123 BG1113 PGM1 | +| | +| BG2022 BG1012 PGM0 | +|--------------------------------| + +* = Not populated + +**************************************************************************** + +Asura Buster +Fuuki Co. Ltd. + +PCB Layout +---------- + +Top Board + +FG-3J MAIN-J Revision:1.1 +|-----------------------------------------------------| +| YAC516 YMF278 N341256(x4) N341028 (x4) FI-002K | +| 33.8688MHz N341512(x4) | +| PAL N341256 | +| Z80 N341256 | +| N341256 | +|J DSW1 | +|A | +|M 12MHz FI-003K N341256(x2) | +|M DSW2 N341256(x3) | +|A PAL | +| 40MHz PAL | +| DSW3 PAL N341256 | +| 68020 PAL N341256 | +| N341256 28.432MHz M60067-0901FP | +| DSW4 N341256 PAL | +|-----------------------------------------------------| + +Notes: + 68020 clock: 20.000MHz [40/2] + Z80 clock: 6.000MHz [12/2] + YM278 clock: 33.8688MHz + VSync: 60Hz + Hsync: 15.81kHz + + +Bottom Board + +FG-3J ROM-J 507KA0301P04 Rev:1.3 +|--------------------------------| +| SROM | +| | +| SP01 SP89 OPM | +| | +| SP23 SPAB | +| | +| SP45 SPCD MAP | +| | +| SP67 SPEF PGM3 | +| | +| PGM2 | +| | +| BG2123 BG1113 PGM1 | +| | +| BG2022 BG1012 PGM0 | +|--------------------------------| + +***************************************************************************/ + +#include "driver.h" +#include "sound/262intf.h" +#include "sound/ymf278b.h" + +static emu_timer *raster_interrupt_timer; +static UINT8 fuuki32_shared_ram[16]; + +// Described in src/video/fuuki32.c +extern UINT32 *fuuki32_vram_0, *fuuki32_vram_1; +extern UINT32 *fuuki32_vram_2, *fuuki32_vram_3; +extern UINT32 *fuuki32_vregs, *fuuki32_priority, *fuuki32_tilebank; + + +/* Functions defined in video: */ + +WRITE32_HANDLER( fuuki32_vram_0_w ); +WRITE32_HANDLER( fuuki32_vram_1_w ); +WRITE32_HANDLER( fuuki32_vram_2_w ); +WRITE32_HANDLER( fuuki32_vram_3_w ); + +VIDEO_START( fuuki32 ); +VIDEO_UPDATE( fuuki32 ); +VIDEO_EOF( fuuki32 ); + +//UINT32 *fuuki32_shared_ram; + +static WRITE32_HANDLER( paletteram32_xRRRRRGGGGGBBBBB_dword_w ) +{ + if(ACCESSING_MSW32) + { + int r,g,b; + COMBINE_DATA(&paletteram32[offset]); + + r = (paletteram32[offset] & 0x7c000000) >> (10+16); + g = (paletteram32[offset] & 0x03e00000) >> (5+16); + b = (paletteram32[offset] & 0x001f0000) >> (0+16); + + palette_set_color_rgb(Machine,offset*2,pal5bit(r),pal5bit(g),pal5bit(b)); + } + + if(ACCESSING_LSW32) + { + int r,g,b; + COMBINE_DATA(&paletteram32[offset]); + + r = (paletteram32[offset] & 0x00007c00) >> (10); + g = (paletteram32[offset] & 0x000003e0) >> (5); + b = (paletteram32[offset] & 0x0000001f) >> (0); + + palette_set_color_rgb(Machine,offset*2+1,pal5bit(r),pal5bit(g),pal5bit(b)); + } +} + +/*************************************************************************** + + + Memory Maps - Main CPU + + +***************************************************************************/ + + +#define FUUKI32_INPUT( _N_ ) \ +\ +static READ32_HANDLER( io32_##_N_##_r ) \ +{ \ + return (readinputport( _N_ ) << 16) | readinputport( _N_ ); \ +} + +FUUKI32_INPUT( 0 ) /* $800000.l Coins Inputs */ +FUUKI32_INPUT( 1 ) /* $810000.l Player Inputs */ +FUUKI32_INPUT( 2 ) /* $880000.l Dipswitches + Service */ +FUUKI32_INPUT( 3 ) /* $890000.l More Dipswitches */ + +/* Sound comms */ +static READ32_HANDLER( snd_020_r ) +{ + UINT32 retdata = fuuki32_shared_ram[offset*2]<<16 | fuuki32_shared_ram[(offset*2)+1]; + return retdata; +} + +static WRITE32_HANDLER( snd_020_w ) +{ + if (!(mem_mask & 0x00ff0000)) + { + fuuki32_shared_ram[offset*2] = data>>16; + } + + if (!(mem_mask & 0x000000ff)) + { + fuuki32_shared_ram[(offset*2)+1] = data & 0xff; + } +} + +static WRITE32_HANDLER( fuuki32_vregs_w ) +{ + if (fuuki32_vregs[offset] != data) + { + COMBINE_DATA(&fuuki32_vregs[offset]); + if (offset == 0x1c/4) + { + timer_adjust(raster_interrupt_timer, video_screen_get_time_until_pos(0, fuuki32_vregs[0x1c/4]>>16, Machine->screen[0].visarea.max_x + 1), 0, video_screen_get_frame_period(0)); + } + } +} + +// Lines with empty comment are for debug only + +static ADDRESS_MAP_START( fuuki32_readmem, ADDRESS_SPACE_PROGRAM, 32 ) + AM_RANGE(0x000000, 0x1fffff) AM_READ(MRA32_ROM) + AM_RANGE(0x400000, 0x40ffff) AM_READ(MRA32_RAM) // Work RAM + AM_RANGE(0x410000, 0x41ffff) AM_READ(MRA32_RAM) // Work RAM (used by asurabus) + AM_RANGE(0x500000, 0x501fff) AM_READ(MRA32_RAM) // Tilemap 1 + AM_RANGE(0x502000, 0x503fff) AM_READ(MRA32_RAM) // Tilemap 2 + AM_RANGE(0x504000, 0x505fff) AM_READ(MRA32_RAM) // Tilemap bg + AM_RANGE(0x506000, 0x507fff) AM_READ(MRA32_RAM) // Tilemap bg2 + AM_RANGE(0x508000, 0x517fff) AM_READ(MRA32_RAM) // More tilemap, or linescroll? Seems to be empty all of the time + AM_RANGE(0x600000, 0x601fff) AM_READ(MRA32_RAM) // Sprites + + AM_RANGE(0x700000, 0x703fff) AM_READ(MRA32_RAM) // Palette + + AM_RANGE(0x800000, 0x800003) AM_READ(io32_0_r) // Coin + AM_RANGE(0x810000, 0x810003) AM_READ(io32_1_r) // Player Inputs + AM_RANGE(0x880000, 0x880003) AM_READ(io32_2_r) // Service + DIPS + AM_RANGE(0x890000, 0x890003) AM_READ(io32_3_r) // More DIPS + + AM_RANGE(0x8c0000, 0x8c001f) AM_READ(MRA32_RAM)// Video Registers + +/**/AM_RANGE(0x8d0000, 0x8d0003) AM_READ(MRA32_RAM) // Flipscreen Related +/**/AM_RANGE(0x8e0000, 0x8e0003) AM_READ(MRA32_RAM) // Controls layer order + + AM_RANGE(0x903fe0, 0x903fff) AM_READ(snd_020_r) // Shared with Z80 +// AM_RANGE(0x903fe0, 0x903fe3) AM_READ(fuuki32_sound_command_r) // Shared with Z80 +// AM_RANGE(0x903fe4, 0x903fff) AM_READ(MRA32_RAM) // ?? +ADDRESS_MAP_END + +static ADDRESS_MAP_START( fuuki32_writemem, ADDRESS_SPACE_PROGRAM, 32 ) + AM_RANGE(0x000000, 0x1fffff) AM_WRITE(MWA32_ROM) + AM_RANGE(0x400000, 0x40ffff) AM_WRITE(MWA32_RAM) // Work RAM + AM_RANGE(0x410000, 0x41ffff) AM_WRITE(MWA32_RAM) // Work RAM + AM_RANGE(0x500000, 0x501fff) AM_WRITE(fuuki32_vram_0_w) AM_BASE(&fuuki32_vram_0) // Tilemap 1 + AM_RANGE(0x502000, 0x503fff) AM_WRITE(fuuki32_vram_1_w) AM_BASE(&fuuki32_vram_1) // Tilemap 2 + AM_RANGE(0x504000, 0x505fff) AM_WRITE(fuuki32_vram_2_w) AM_BASE(&fuuki32_vram_2) // Tilemap bg + AM_RANGE(0x506000, 0x507fff) AM_WRITE(fuuki32_vram_3_w) AM_BASE(&fuuki32_vram_3) // Tilemap bg2 + AM_RANGE(0x508000, 0x517fff) AM_WRITE(MWA32_RAM) // More tilemap, or linescroll? Seems to be empty all of the time + + AM_RANGE(0x600000, 0x601fff) AM_WRITE(MWA32_RAM) AM_BASE(&spriteram32) AM_SIZE(&spriteram_size ) // Sprites + AM_RANGE(0x700000, 0x703fff) AM_WRITE(paletteram32_xRRRRRGGGGGBBBBB_dword_w) AM_BASE(&paletteram32) // Palette + + AM_RANGE(0x800000, 0x800003) AM_WRITE(MWA32_NOP) // Clear buffered inputs + AM_RANGE(0x810000, 0x810003) AM_WRITE(MWA32_NOP) // Clear buffered inputs + + AM_RANGE(0x8c0000, 0x8c001f) AM_WRITE(fuuki32_vregs_w) AM_BASE(&fuuki32_vregs) // Video Registers + + AM_RANGE(0x8d0000, 0x8d0003) AM_WRITE(MWA32_RAM) // Flipscreen Related + AM_RANGE(0x8e0000, 0x8e0003) AM_WRITE(MWA32_RAM) AM_BASE(&fuuki32_priority) // Controls layer order + + AM_RANGE(0x903fe0, 0x903fff) AM_WRITE(snd_020_w) // z80 comms + + AM_RANGE(0xa00000, 0xa00003) AM_WRITE(MWA32_RAM) AM_BASE(&fuuki32_tilebank) +ADDRESS_MAP_END + + +/*************************************************************************** + + Memory Maps - Sound CPU + +***************************************************************************/ + +static WRITE8_HANDLER ( fuuki32_sound_bw_w ) +{ + UINT8 *rom = memory_region(REGION_CPU2); + + memory_set_bankptr(1, rom + 0x10000 + (data * 0x8000)); +} + +static READ8_HANDLER( snd_z80_r ) +{ + UINT8 retdata = fuuki32_shared_ram[offset]; + return retdata; +} + +static WRITE8_HANDLER( snd_z80_w ) +{ + fuuki32_shared_ram[offset] = data; +} + +static ADDRESS_MAP_START( fuuki32_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x5fff) AM_READ(MRA8_ROM ) // ROM + AM_RANGE(0x6000, 0x6fff) AM_READ(MRA8_RAM ) // RAM + AM_RANGE(0x7ff0, 0x7fff) AM_READ(snd_z80_r) + AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_BANK1 ) // ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( fuuki32_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x5fff) AM_WRITE(MWA8_ROM ) // ROM + AM_RANGE(0x6000, 0x6fff) AM_WRITE(MWA8_RAM ) // RAM + AM_RANGE(0x7ff0, 0x7fff) AM_WRITE(snd_z80_w) + AM_RANGE(0x8000, 0xffff) AM_WRITE(MWA8_ROM ) // ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( fuuki32_sound_readport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x40, 0x40) AM_READ(YMF262_status_0_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( fuuki32_sound_writeport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x00, 0x00) AM_WRITE(fuuki32_sound_bw_w) + AM_RANGE(0x30, 0x30) AM_WRITE(MWA8_NOP) + AM_RANGE(0x40, 0x40) AM_WRITE(YMF262_register_A_0_w) + AM_RANGE(0x41, 0x41) AM_WRITE(YMF262_data_A_0_w) + AM_RANGE(0x42, 0x42) AM_WRITE(YMF262_register_B_0_w) + AM_RANGE(0x43, 0x43) AM_WRITE(YMF262_data_B_0_w) + AM_RANGE(0x44, 0x44) AM_WRITE(YMF278B_control_port_0_C_w) + AM_RANGE(0x45, 0x45) AM_WRITE(YMF278B_data_port_0_C_w) +ADDRESS_MAP_END + + +/*************************************************************************** + + + Input Ports + + +***************************************************************************/ + +static INPUT_PORTS_START( asurabld ) + PORT_START // IN0 - $800000.w/$800002.w + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0xfe00, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START // IN1 - $810000.w/$810002.w + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START // IN2 - $880000.w/$880002.w + PORT_SERVICE( 0x0001, 0x0001 ) + PORT_DIPNAME( 0x0002, 0x0002, "Blood Colour" ) // Any other censorship? (Tested in 3 locations) + PORT_DIPSETTING( 0x0002, "Red" ) + PORT_DIPSETTING( 0x0000, "Green" ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) // Tested @ 0917AC + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) // Tested @ 0917AC + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0030, 0x0030, "Timer" ) + PORT_DIPSETTING( 0x0000, "Slow" ) + PORT_DIPSETTING( 0x0030, DEF_STR( Medium ) ) + PORT_DIPSETTING( 0x0010, "Fast" ) + PORT_DIPSETTING( 0x0020, "Very Fast" ) + PORT_DIPNAME( 0x00c0, 0x0000, "Coinage Mode" ) + PORT_DIPSETTING( 0x00c0, "Split" ) + PORT_DIPSETTING( 0x0000, "Joint" ) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START // IN3 - $890000.w/$890002.w + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x000e, 0x0000, "Computer Level" ) // See @ 0917CC + PORT_DIPSETTING( 0x0000, "0" ) + PORT_DIPSETTING( 0x0008, "1" ) + PORT_DIPSETTING( 0x0004, "2" ) + PORT_DIPSETTING( 0x000c, "3" ) + PORT_DIPSETTING( 0x000e, "4" ) + PORT_DIPSETTING( 0x0002, "5" ) + PORT_DIPSETTING( 0x000a, "6" ) + PORT_DIPSETTING( 0x0006, "7" ) + PORT_DIPNAME( 0x0030, 0x0010, "Damage" ) + PORT_DIPSETTING( 0x0020, "Lowest" ) + PORT_DIPSETTING( 0x0030, DEF_STR( Low ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Medium ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( High ) ) + PORT_DIPNAME( 0x00c0, 0x0040, "Max Rounds" ) + PORT_DIPSETTING( 0x0000, "1" ) + PORT_DIPSETTING( 0x0040, "3" ) + PORT_DIPSETTING( 0x0080, "5" ) + PORT_DIPNAME( 0xf000, 0xf000, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( 8C_1C ) ) + PORT_DIPSETTING( 0x9000, DEF_STR( 7C_1C ) ) + PORT_DIPSETTING( 0xa000, DEF_STR( 6C_1C ) ) + PORT_DIPSETTING( 0xb000, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0xc000, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0xd000, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0xe000, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0xf000, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) ) // Set both for Free Play + PORT_DIPNAME( 0x0f00, 0x0f00, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( 8C_1C ) ) + PORT_DIPSETTING( 0x0900, DEF_STR( 7C_1C ) ) + PORT_DIPSETTING( 0x0a00, DEF_STR( 6C_1C ) ) + PORT_DIPSETTING( 0x0b00, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x0c00, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0d00, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0e00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0f00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) ) // Set both for Free Play + +INPUT_PORTS_END + + +/*************************************************************************** + + + Graphics Layouts + + +***************************************************************************/ + +/* 8x8x4 */ +static const gfx_layout layout_8x8x4 = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 2*4,3*4, 0*4,1*4, 6*4,7*4, 4*4,5*4 }, + { STEP8(0,8*4) }, + 8*8*4 +}; + +/* 16x16x4 */ +static const gfx_layout layout_16x16x4 = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 2*4,3*4, 0*4,1*4, 6*4,7*4, 4*4,5*4, + 10*4,11*4, 8*4,9*4, 14*4,15*4, 12*4,13*4 }, + { STEP16(0,16*4) }, + 16*16*4 +}; + +/* 16x16x8 */ +static const gfx_layout layout_16x16x8 = +{ + 16,16, + RGN_FRAC(1,2), + 8, + { STEP4(RGN_FRAC(1,2),1), STEP4(0,1) }, + { 2*4,3*4, 0*4,1*4, 6*4,7*4, 4*4,5*4, + 10*4,11*4, 8*4,9*4, 14*4,15*4, 12*4,13*4 }, + { STEP16(0,16*4) }, + 16*16*4 +}; + +static GFXDECODE_START( fuuki32 ) + GFXDECODE_ENTRY( REGION_GFX1, 0, layout_16x16x4, 0x400*2, 0x40 ) // [0] Sprites + GFXDECODE_ENTRY( REGION_GFX2, 0, layout_16x16x8, 0x400*0, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( REGION_GFX3, 0, layout_16x16x8, 0x400*1, 0x40 ) // [2] Layer 2 + GFXDECODE_ENTRY( REGION_GFX4, 0, layout_8x8x4, 0x400*3, 0x40 ) // [3] BG Layer + GFXDECODE_ENTRY( REGION_GFX4, 0, layout_8x8x4, 0x400*3, 0x40 ) // [4] BG Layer 2 (GFX4!) +GFXDECODE_END + + +/*************************************************************************** + + + Machine Drivers + + +***************************************************************************/ + +static TIMER_CALLBACK( level_1_interrupt_callback ) +{ + cpunum_set_input_line(0, 1, PULSE_LINE); + timer_set(video_screen_get_time_until_pos(0, 248, 0), 0, level_1_interrupt_callback); +} + + +static TIMER_CALLBACK( vblank_interrupt_callback ) +{ + cpunum_set_input_line(0, 3, PULSE_LINE); // VBlank IRQ + timer_set(video_screen_get_time_until_pos(0, machine->screen[0].visarea.max_y + 1, 0), 0, vblank_interrupt_callback); +} + + +static TIMER_CALLBACK( raster_interrupt_callback ) +{ + cpunum_set_input_line(0, 5, PULSE_LINE); // Raster Line IRQ + video_screen_update_partial(0, video_screen_get_vpos(0)); + timer_adjust(raster_interrupt_timer, video_screen_get_frame_period(0), 0, attotime_zero); +} + + +static MACHINE_START( fuuki32 ) +{ + raster_interrupt_timer = timer_alloc(raster_interrupt_callback); +} + + +static MACHINE_RESET( fuuki32 ) +{ + timer_set(video_screen_get_time_until_pos(0, 248, 0), 0, level_1_interrupt_callback); + timer_set(video_screen_get_time_until_pos(0, machine->screen[0].visarea.max_y + 1, 0), 0, vblank_interrupt_callback); + timer_adjust(raster_interrupt_timer, video_screen_get_time_until_pos(0, 0, machine->screen[0].visarea.max_x + 1), 0, attotime_zero); +} + + +static void irqhandler(int irq) +{ + cpunum_set_input_line(1, 0, irq ? ASSERT_LINE : CLEAR_LINE); +} + +static struct YMF278B_interface ymf278b_interface = +{ + REGION_SOUND1 +}; + +static struct YMF262interface ymf262_interface = +{ + irqhandler /* irq */ +}; + +static MACHINE_DRIVER_START( fuuki32 ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68EC020, 20000000) /* verified */ + MDRV_CPU_PROGRAM_MAP(fuuki32_readmem,fuuki32_writemem) + + MDRV_CPU_ADD_TAG("sound", Z80, 6000000) /* verified */ + MDRV_CPU_PROGRAM_MAP(fuuki32_sound_readmem,fuuki32_sound_writemem) + MDRV_CPU_IO_MAP(fuuki32_sound_readport,fuuki32_sound_writeport) + + MDRV_SCREEN_REFRESH_RATE(60) + + MDRV_MACHINE_START(fuuki32) + MDRV_MACHINE_RESET(fuuki32) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) // | VIDEO_BUFFERS_SPRITERAM ) // Buffered by 2 frames + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(64*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 30*8-1) + MDRV_GFXDECODE(fuuki32) + MDRV_PALETTE_LENGTH(0x4000/2) + + MDRV_VIDEO_START(fuuki32) + MDRV_VIDEO_UPDATE(fuuki32) + MDRV_VIDEO_EOF(fuuki32) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(YMF262, 14318180) + MDRV_SOUND_CONFIG(ymf262_interface) + MDRV_SOUND_ROUTE(0, "left", 0.50) + MDRV_SOUND_ROUTE(1, "right", 0.50) + MDRV_SOUND_ROUTE(2, "left", 0.50) + MDRV_SOUND_ROUTE(3, "right", 0.50) + + MDRV_SOUND_ADD(YMF278B, YMF278B_STD_CLOCK) + MDRV_SOUND_CONFIG(ymf278b_interface) + MDRV_SOUND_ROUTE(0, "left", 0.50) + MDRV_SOUND_ROUTE(1, "right", 0.50) +MACHINE_DRIVER_END + +/*************************************************************************** + + + ROMs Loading + + +***************************************************************************/ + +/*************************************************************************** + + Asura Blade +Fuuki, 1999 + +This dump is taken from a ROM board with number FG-3J ROM-J +There's nothing on the board except some 4M EPROMs and several +surface mounted MASK ROMs. + +The connectors on the board and the size of the board is similar +to Jaleco Megasys32, however it's not compatible with it due to the +connector spacing being different. The physical size of the board +is too large to fit an SSV board. +So, I have no idea what the main hardware is, the game probably +runs on a custom Fuuki system board named 'FG-3'? + +***************************************************************************/ + +ROM_START( asurabld ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) /* M68020 */ + ROM_LOAD32_BYTE( "pgm3.u1", 0x000000, 0x80000, CRC(053e9758) SHA1(c2754d3f0c607c81c8fa33b667b576eb0474fd0b) ) + ROM_LOAD32_BYTE( "pgm2.u2", 0x000001, 0x80000, CRC(16b656ca) SHA1(5ffb551ce7dec462d3896f0fed693454496894bc) ) + ROM_LOAD32_BYTE( "pgm1.u3", 0x000002, 0x80000, CRC(35104452) SHA1(03cfd81429f8a945d5419c9750925bfa997d0607) ) + ROM_LOAD32_BYTE( "pgm0.u4", 0x000003, 0x80000, CRC(68615497) SHA1(de93751f151f195a863dc6fe83b6e7ed8f99430a) ) + + ROM_REGION( 0x090000, REGION_CPU2, 0 ) /* Z80 */ + ROM_LOAD( "srom.u7", 0x00000, 0x80000, CRC(bb1deb89) SHA1(b1c70abddc0b9a88beb69a592376ff69a7e091eb) ) + ROM_RELOAD( 0x10000, 0x80000) /* for banks */ + + ROM_REGION( 0x2000000, REGION_GFX1, ROMREGION_DISPOSE ) + /* 0x0000000 - 0x03fffff empty */ /* spXX.uYY - XX is the bank number! */ + ROM_LOAD( "sp23.u14", 0x0400000, 0x400000, CRC(7df492eb) SHA1(30b88a3cd025ffc8c28fef06e0784755be37ef8e) ) + ROM_LOAD( "sp45.u15", 0x0800000, 0x400000, CRC(1890f42a) SHA1(22254fe38fd83f4602a25e1ccba32df16edaf3f9) ) + ROM_LOAD( "sp67.u16", 0x0c00000, 0x400000, CRC(a48f1ef0) SHA1(bf8787f293793291a503af662d3738c007654726) ) + ROM_LOAD( "sp89.u17", 0x1000000, 0x400000, CRC(6b024362) SHA1(8be5cc3c7306d28b75acd970bb3be6d3c9825367) ) + ROM_LOAD( "spab.u18", 0x1400000, 0x400000, CRC(803d2d8c) SHA1(25df30689e576a0620656c721d92bcc3fbd84844) ) + ROM_LOAD( "spcd.u19", 0x1800000, 0x400000, CRC(42e5c26e) SHA1(b68875d353bdc5d49113bbac02fd83508bce66a5) ) + + ROM_REGION( 0x0800000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "bg1012.u22", 0x0000000, 0x400000, CRC(d717a0a1) SHA1(007df309dc0650ca07e077b983a2b05730349d0b) ) + ROM_LOAD( "bg1113.u23", 0x0400000, 0x400000, CRC(94338267) SHA1(7848bc57cb0eac216100a508763451eb57a0a082) ) + + ROM_REGION( 0x0800000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "bg2022.u25", 0x0000000, 0x400000, CRC(ee312cd3) SHA1(2ef9d51928d80375daf8e6b204bb66a8b9cbaee7) ) + ROM_LOAD( "bg2123.u24", 0x0400000, 0x400000, CRC(4acfc469) SHA1(a98d06b967ebb3fa3b4c8aa3d7a05063ec981fb2) ) + + ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_DISPOSE ) // background tiles + ROM_LOAD( "map.u5", 0x00000, 0x200000, CRC(e681155e) SHA1(458845b9c86df72685d92d0d4052aacc2fa7d1bd) ) + + ROM_REGION( 0x400000, REGION_SOUND1, 0 ) // OPL4 samples + ROM_LOAD( "pcm.u6", 0x00000, 0x400000, CRC(ac72225a) SHA1(8d16399ed34ac5bd69dbf43b2de2b0db9ac1c610) ) +ROM_END + +ROM_START( asurabus ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) /* M68020 */ + ROM_LOAD32_BYTE( "pgm3.u1", 0x000000, 0x80000, CRC(2c6b5271) SHA1(188371f1f003823ac719e962e048719d76696b2f) ) + ROM_LOAD32_BYTE( "pgm2.u2", 0x000001, 0x80000, CRC(8f8694ec) SHA1(3334df4aecc5ab2f8914ef6748c027a99b39ce26) ) + ROM_LOAD32_BYTE( "pgm1.u3", 0x000002, 0x80000, CRC(0a040f0f) SHA1(d5e86d33efcbbde7ee62cfc8dfe867f250a33415) ) + ROM_LOAD32_BYTE( "pgm0.u4", 0x000003, 0x80000, CRC(9b71e9d8) SHA1(9b705b5b6fff549f5679890422b481b5cf1d7bd7) ) + + ROM_REGION( 0x090000, REGION_CPU2, 0 ) /* Z80 */ + ROM_LOAD( "srom.u7", 0x00000, 0x80000, CRC(368da389) SHA1(1423b709da40bf3033c9032c4bd07658f1a969de) ) + ROM_RELOAD( 0x10000, 0x80000) /* for banks */ + + ROM_REGION( 0x2000000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "sp01.u13", 0x0000000, 0x400000, CRC(5edea463) SHA1(22a780912f060bae0c9a403a7bfd4d27f25b76e3) ) + ROM_LOAD( "sp23.u14", 0x0400000, 0x400000, CRC(91b1b0de) SHA1(341367966559ef2027415b673eb0db704680c81f) ) + ROM_LOAD( "sp45.u15", 0x0800000, 0x400000, CRC(96c69aac) SHA1(cf053523026651427f884b9dd7c095af362dd24e) ) + ROM_LOAD( "sp67.u16", 0x0c00000, 0x400000, CRC(7c3d83bf) SHA1(7188dd923c6c7eb6aee3323e7ab54aa240c35ea3) ) + ROM_LOAD( "sp89.u17", 0x1000000, 0x400000, CRC(cb1e14f8) SHA1(941cea1887d7ceb52222adcf1d6913969e6163aa) ) + ROM_LOAD( "spab.u18", 0x1400000, 0x400000, CRC(e5a4608d) SHA1(b8e39f53e0b7ad1e16ae9c3726597776b404be1c) ) + ROM_LOAD( "spcd.u19", 0x1800000, 0x400000, CRC(99bfbe32) SHA1(926a8afc4a175874f22f53300e76f59331d3b9ba) ) + ROM_LOAD( "spef.u20", 0x1c00000, 0x400000, CRC(c9c799cc) SHA1(01373316700d8688deeea2e9e8f831d5f86c7f17) ) + + ROM_REGION( 0x0800000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "bg1012.u22", 0x0000000, 0x400000, CRC(e3fb9af0) SHA1(11900cc2873337692f66fb4f1eb9c574e5a967de) ) + ROM_LOAD( "bg1113.u23", 0x0400000, 0x400000, CRC(5f8657e6) SHA1(7c2854dc5d2d4efe55bda01e329da051350e0031) ) + + ROM_REGION( 0x0800000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "bg2022.u25", 0x0000000, 0x400000, CRC(f46eda52) SHA1(46530016b32a164bd76c4f53e7b53b2beb28db06) ) + ROM_LOAD( "bg2123.u24", 0x0400000, 0x400000, CRC(c4ebb86b) SHA1(a7093e6e02b64566d277cbbd5fa90cd430e7c8a0) ) + + ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_DISPOSE ) // background tiles + ROM_LOAD( "map.u5", 0x00000, 0x200000, CRC(bd179dc5) SHA1(ce3fcac573b14fd5365eb5dcec3257e439d2c129) ) + + ROM_REGION( 0x400000, REGION_SOUND1, 0 ) // OPL4 samples + ROM_LOAD( "opm.u6", 0x00000, 0x400000, CRC(31b05be4) SHA1(d0f4f387f84a74591224b0f42b7f5c538a3dc498) ) +ROM_END + + + +/*************************************************************************** + + + Game Drivers + + +***************************************************************************/ + +GAME( 1998, asurabld, 0, fuuki32, asurabld, 0, ROT0, "Fuuki", "Asura Blade - Sword of Dynasty (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 2000, asurabus, 0, fuuki32, asurabld, 0, ROT0, "Fuuki", "Asura Buster - Eternal Warriors (Japan)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) // sounds loop forever? |