mirror of
https://github.com/holub/mame
synced 2025-05-25 23:35:26 +03:00
From Mamesick:
* ddragon3.diff - converted driver to be fully scanlines based using timers - hooked up interrupts - updated driver to new video screen raw parameters * shadfrce.diff - converted driver to be fully scanlines based using timers - implemented raster interrupt timer in the main routine - updated driver to new video screen raw parameters * wwfsstar.diff - converted driver to be fully scanlines based using timers - updated driver to new video screen raw parameters * wwfwfest.diff - converted driver to be fully scanlines based using timers - hooked up interrupts - updated driver to new video screen raw parameters
This commit is contained in:
parent
41ef03afbb
commit
825cfee6a8
@ -24,12 +24,14 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "deprecat.h"
|
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "sound/2151intf.h"
|
#include "sound/2151intf.h"
|
||||||
#include "sound/okim6295.h"
|
#include "sound/okim6295.h"
|
||||||
|
|
||||||
|
#define MASTER_CLOCK XTAL_24MHz
|
||||||
|
#define CPU_CLOCK MASTER_CLOCK / 2
|
||||||
|
#define PIXEL_CLOCK MASTER_CLOCK / 4
|
||||||
|
|
||||||
extern UINT16 *ddragon3_bg_videoram16;
|
extern UINT16 *ddragon3_bg_videoram16;
|
||||||
extern UINT16 *ddragon3_fg_videoram16;
|
extern UINT16 *ddragon3_fg_videoram16;
|
||||||
@ -76,15 +78,18 @@ static WRITE16_HANDLER( ddragon3_io16_w )
|
|||||||
/* this gets written to on startup and at the end of IRQ6
|
/* this gets written to on startup and at the end of IRQ6
|
||||||
** possibly trigger IRQ on sound CPU
|
** possibly trigger IRQ on sound CPU
|
||||||
*/
|
*/
|
||||||
|
cpu_set_input_line(space->machine->cpu[0], 6, CLEAR_LINE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
/* this gets written to on startup,
|
/* this gets written to on startup,
|
||||||
** and at the end of IRQ5 (input port read) */
|
** and at the end of IRQ5 (input port read) */
|
||||||
|
cpu_set_input_line(space->machine->cpu[0], 5, CLEAR_LINE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
/* this gets written to at the end of IRQ6 only */
|
/* this gets written to at the end of IRQ6 only */
|
||||||
|
cpu_set_input_line(space->machine->cpu[0], 6, CLEAR_LINE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -303,7 +308,7 @@ static INPUT_PORTS_START( ctribe )
|
|||||||
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 )
|
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||||
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN2 )
|
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||||
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_SERVICE1 )
|
||||||
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_VBLANK )
|
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_VBLANK )
|
||||||
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
|
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
|
||||||
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
|
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
|
||||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||||
@ -467,12 +472,28 @@ static const ym2151_interface ym2151_config =
|
|||||||
*
|
*
|
||||||
*************************************/
|
*************************************/
|
||||||
|
|
||||||
static INTERRUPT_GEN( ddragon3_cpu_interrupt ) { /* 6:0x177e - 5:0x176a */
|
static TIMER_DEVICE_CALLBACK( ddragon3_scanline )
|
||||||
if( cpu_getiloops(device) == 0 ){
|
{
|
||||||
cpu_set_input_line(device, 6, HOLD_LINE); /* VBlank */
|
int scanline = param;
|
||||||
|
|
||||||
|
/* An interrupt is generated every 16 scanlines */
|
||||||
|
if (scanline % 16 == 0)
|
||||||
|
{
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 5, ASSERT_LINE);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
cpu_set_input_line(device, 5, HOLD_LINE); /* Input Ports */
|
/* Vblank is raised on scanline 248 */
|
||||||
|
if (scanline == 248)
|
||||||
|
{
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 6, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust for next scanline */
|
||||||
|
if (++scanline >= video_screen_get_height(timer->machine->primary_screen))
|
||||||
|
{
|
||||||
|
scanline = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -484,20 +505,17 @@ static INTERRUPT_GEN( ddragon3_cpu_interrupt ) { /* 6:0x177e - 5:0x176a */
|
|||||||
|
|
||||||
static MACHINE_DRIVER_START( ddragon3 )
|
static MACHINE_DRIVER_START( ddragon3 )
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MDRV_CPU_ADD("main", M68000, 12000000) // Guess
|
MDRV_CPU_ADD("main", M68000, CPU_CLOCK) // Guess
|
||||||
MDRV_CPU_PROGRAM_MAP(readmem, writemem)
|
MDRV_CPU_PROGRAM_MAP(readmem, writemem)
|
||||||
MDRV_CPU_VBLANK_INT_HACK(ddragon3_cpu_interrupt, 2)
|
MDRV_TIMER_ADD_SCANLINE("scantimer", ddragon3_scanline, "main", 0, 1)
|
||||||
|
|
||||||
MDRV_CPU_ADD("audio", Z80, 3579545) // Guess (confirmed on bootleg)
|
MDRV_CPU_ADD("audio", Z80, 3579545) // Guess (confirmed on bootleg)
|
||||||
MDRV_CPU_PROGRAM_MAP(readmem_sound, writemem_sound)
|
MDRV_CPU_PROGRAM_MAP(readmem_sound, writemem_sound)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
MDRV_SCREEN_REFRESH_RATE(57)
|
|
||||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
|
||||||
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
||||||
MDRV_SCREEN_SIZE(40*8, 32*8)
|
MDRV_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
|
||||||
MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
|
|
||||||
|
|
||||||
MDRV_GFXDECODE(ddragon3)
|
MDRV_GFXDECODE(ddragon3)
|
||||||
MDRV_PALETTE_LENGTH(768)
|
MDRV_PALETTE_LENGTH(768)
|
||||||
@ -535,9 +553,6 @@ static MACHINE_DRIVER_START( ctribe )
|
|||||||
MDRV_CPU_MODIFY("audio")
|
MDRV_CPU_MODIFY("audio")
|
||||||
MDRV_CPU_PROGRAM_MAP(ctribe_readmem_sound,ctribe_writemem_sound)
|
MDRV_CPU_PROGRAM_MAP(ctribe_readmem_sound,ctribe_writemem_sound)
|
||||||
|
|
||||||
MDRV_SCREEN_MODIFY("main")
|
|
||||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
|
|
||||||
|
|
||||||
MDRV_VIDEO_UPDATE(ctribe)
|
MDRV_VIDEO_UPDATE(ctribe)
|
||||||
|
|
||||||
MDRV_SOUND_MODIFY("ym2151")
|
MDRV_SOUND_MODIFY("ym2151")
|
||||||
@ -821,7 +836,7 @@ ROM_END
|
|||||||
*************************************/
|
*************************************/
|
||||||
|
|
||||||
GAME( 1990, ddragon3, 0, ddragon3, ddragon3, 0, ROT0, "Technos", "Double Dragon 3 - The Rosetta Stone (US)", GAME_SUPPORTS_SAVE )
|
GAME( 1990, ddragon3, 0, ddragon3, ddragon3, 0, ROT0, "Technos", "Double Dragon 3 - The Rosetta Stone (US)", GAME_SUPPORTS_SAVE )
|
||||||
GAME( 1990, ddrago3j, ddragon3, ddragon3, ddragon3, 0, ROT0, "Technos", "Double Dragon 3 - The Rosetta Stone (Japan)", GAME_SUPPORTS_SAVE )
|
GAME( 1990, ddrago3j, ddragon3, ddragon3, ddragon3, 0, ROT0, "Technos", "Double Dragon 3 - The Rosetta Stone (Japan)", GAME_SUPPORTS_SAVE )
|
||||||
GAME( 1990, ddrago3b, ddragon3, ddrago3b, ddrago3b, 0, ROT0, "bootleg", "Double Dragon 3 - The Rosetta Stone (bootleg)", GAME_SUPPORTS_SAVE )
|
GAME( 1990, ddrago3b, ddragon3, ddrago3b, ddrago3b, 0, ROT0, "bootleg", "Double Dragon 3 - The Rosetta Stone (bootleg)", GAME_SUPPORTS_SAVE )
|
||||||
GAME( 1990, ctribe, 0, ctribe, ctribe, 0, ROT0, "Technos", "The Combatribes (US)", GAME_SUPPORTS_SAVE )
|
GAME( 1990, ctribe, 0, ctribe, ctribe, 0, ROT0, "Technos", "The Combatribes (US)", GAME_SUPPORTS_SAVE )
|
||||||
GAME( 1990, ctribe1, ctribe, ctribe, ctribe, 0, ROT0, "Technos", "The Combatribes (US Set 1?)", GAME_SUPPORTS_SAVE )
|
GAME( 1990, ctribe1, ctribe, ctribe, ctribe, 0, ROT0, "Technos", "The Combatribes (US Set 1?)", GAME_SUPPORTS_SAVE )
|
||||||
|
@ -80,10 +80,13 @@ lev 7 : 0x7c : 0000 11d0 - just rte
|
|||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "deprecat.h"
|
|
||||||
#include "sound/2151intf.h"
|
#include "sound/2151intf.h"
|
||||||
#include "sound/okim6295.h"
|
#include "sound/okim6295.h"
|
||||||
|
|
||||||
|
#define MASTER_CLOCK XTAL_28MHz
|
||||||
|
#define CPU_CLOCK MASTER_CLOCK / 2
|
||||||
|
#define PIXEL_CLOCK MASTER_CLOCK / 4
|
||||||
|
|
||||||
UINT16 *shadfrce_fgvideoram, *shadfrce_bg0videoram, *shadfrce_bg1videoram, *shadfrce_spvideoram;
|
UINT16 *shadfrce_fgvideoram, *shadfrce_bg0videoram, *shadfrce_bg1videoram, *shadfrce_spvideoram;
|
||||||
|
|
||||||
/* in video */
|
/* in video */
|
||||||
@ -100,8 +103,8 @@ WRITE16_HANDLER( shadfrce_bg1videoram_w );
|
|||||||
|
|
||||||
int shadfrce_video_enable = 0;
|
int shadfrce_video_enable = 0;
|
||||||
static int shadfrce_irqs_enable = 0;
|
static int shadfrce_irqs_enable = 0;
|
||||||
static int shadfrce_scanline = 0;
|
static int raster_scanline = 0;
|
||||||
static emu_timer *raster_irq_timer;
|
static int raster_irq_enable = 0;
|
||||||
static int vblank = 0;
|
static int vblank = 0;
|
||||||
|
|
||||||
|
|
||||||
@ -231,19 +234,6 @@ static WRITE16_HANDLER ( shadfrce_sound_brt_w )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static TIMER_CALLBACK( raster_interrupt )
|
|
||||||
{
|
|
||||||
// force a screen partial update on the previous scanline
|
|
||||||
if (shadfrce_scanline != 0)
|
|
||||||
video_screen_update_partial(machine->primary_screen, shadfrce_scanline - 1);
|
|
||||||
|
|
||||||
shadfrce_scanline = (shadfrce_scanline + 1) % 256;
|
|
||||||
|
|
||||||
// fire another raster irq for the next scanline
|
|
||||||
cpu_set_input_line(machine->cpu[0], 1, ASSERT_LINE);
|
|
||||||
timer_adjust_oneshot(raster_irq_timer, video_screen_get_time_until_pos(machine->primary_screen, shadfrce_scanline, 0), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static WRITE16_HANDLER( shadfrce_irq_ack_w )
|
static WRITE16_HANDLER( shadfrce_irq_ack_w )
|
||||||
{
|
{
|
||||||
cpu_set_input_line(space->machine->cpu[0], offset ^ 3, CLEAR_LINE);
|
cpu_set_input_line(space->machine->cpu[0], offset ^ 3, CLEAR_LINE);
|
||||||
@ -253,26 +243,19 @@ static WRITE16_HANDLER( shadfrce_irq_w )
|
|||||||
{
|
{
|
||||||
static int prev_value = 0;
|
static int prev_value = 0;
|
||||||
|
|
||||||
shadfrce_irqs_enable = data & 1; // maybe, it's set/unset inside every trap instruction which is executed
|
shadfrce_irqs_enable = data & 1; /* maybe, it's set/unset inside every trap instruction which is executed */
|
||||||
shadfrce_video_enable = data & 8; // probably
|
shadfrce_video_enable = data & 8; /* probably */
|
||||||
|
|
||||||
// check if there's a high transition to enable the raster timer
|
/* check if there's a high transition to enable the raster IRQ */
|
||||||
if((~prev_value & 4) && (data & 4))
|
if((~prev_value & 4) && (data & 4))
|
||||||
{
|
{
|
||||||
if( !timer_enabled(raster_irq_timer) )
|
raster_irq_enable = 1;
|
||||||
{
|
|
||||||
timer_enable(raster_irq_timer, 1);
|
|
||||||
timer_adjust_oneshot(raster_irq_timer, video_screen_get_time_until_pos(space->machine->primary_screen, shadfrce_scanline, 0), 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if there's a low transition to disable the raster timer
|
/* check if there's a low transition to disable the raster IRQ */
|
||||||
if((prev_value & 4) && (~data & 4))
|
if((prev_value & 4) && (~data & 4))
|
||||||
{
|
{
|
||||||
if( timer_enabled(raster_irq_timer) )
|
raster_irq_enable = 0;
|
||||||
{
|
|
||||||
timer_enable(raster_irq_timer, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_value = data;
|
prev_value = data;
|
||||||
@ -280,7 +263,60 @@ static WRITE16_HANDLER( shadfrce_irq_w )
|
|||||||
|
|
||||||
static WRITE16_HANDLER( shadfrce_scanline_w )
|
static WRITE16_HANDLER( shadfrce_scanline_w )
|
||||||
{
|
{
|
||||||
shadfrce_scanline = data; // guess, 0 is always written
|
raster_scanline = data; /* guess, 0 is always written */
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIMER_DEVICE_CALLBACK( shadfrce_scanline )
|
||||||
|
{
|
||||||
|
int scanline = param;
|
||||||
|
|
||||||
|
/* Vblank is lowered on scanline 0 */
|
||||||
|
if (scanline == 0)
|
||||||
|
{
|
||||||
|
vblank = 0;
|
||||||
|
}
|
||||||
|
/* Hack */
|
||||||
|
else if (scanline == (248-1)) /* -1 is an hack needed to avoid deadlocks */
|
||||||
|
{
|
||||||
|
vblank = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Raster interrupt - Perform raster effect on given scanline */
|
||||||
|
if (raster_irq_enable)
|
||||||
|
{
|
||||||
|
if (scanline == raster_scanline)
|
||||||
|
{
|
||||||
|
raster_scanline = (raster_scanline + 1) % 240;
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, raster_scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 1, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* An interrupt is generated every 16 scanlines */
|
||||||
|
if (shadfrce_irqs_enable)
|
||||||
|
{
|
||||||
|
if (scanline % 16 == 0)
|
||||||
|
{
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 2, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vblank is raised on scanline 248 */
|
||||||
|
if (shadfrce_irqs_enable)
|
||||||
|
{
|
||||||
|
if (scanline == 248)
|
||||||
|
{
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 3, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust for next scanline */
|
||||||
|
if (++scanline >= video_screen_get_height(timer->machine->primary_screen))
|
||||||
|
{
|
||||||
|
scanline = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -349,10 +385,10 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
|
|
||||||
static INPUT_PORTS_START( shadfrce )
|
static INPUT_PORTS_START( shadfrce )
|
||||||
PORT_START("P1") /* Fake IN0 (player 1 inputs) */
|
PORT_START("P1") /* Fake IN0 (player 1 inputs) */
|
||||||
SHADFRCE_PLAYER_INPUT( 1, IPT_START1 )
|
SHADFRCE_PLAYER_INPUT( 1, IPT_START1 )
|
||||||
|
|
||||||
PORT_START("P2") /* Fake IN1 (player 2 inputs) */
|
PORT_START("P2") /* Fake IN1 (player 2 inputs) */
|
||||||
SHADFRCE_PLAYER_INPUT( 2, IPT_START2 )
|
SHADFRCE_PLAYER_INPUT( 2, IPT_START2 )
|
||||||
|
|
||||||
PORT_START("EXTRA") /* Fake IN2 (players 1 & 2 extra inputs */
|
PORT_START("EXTRA") /* Fake IN2 (players 1 & 2 extra inputs */
|
||||||
@ -370,13 +406,13 @@ static INPUT_PORTS_START( shadfrce )
|
|||||||
|
|
||||||
PORT_START("SYSTEM") /* Fake IN4 (system inputs) */
|
PORT_START("SYSTEM") /* Fake IN4 (system inputs) */
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) /* only in "test mode" ? */
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) /* only in "test mode" ? */
|
||||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* only in "test mode" ? */
|
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* only in "test mode" ? */
|
||||||
PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED )
|
PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||||
|
|
||||||
PORT_START("MISC") /* Fake IN5 (misc) */
|
PORT_START("MISC") /* Fake IN5 (misc) */
|
||||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* guess */
|
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) /* guess */
|
||||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* must be ACTIVE_LOW or 'shadfrcj' jumps to the end (code at 0x04902e) */
|
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* must be ACTIVE_LOW or 'shadfrcj' jumps to the end (code at 0x04902e) */
|
||||||
PORT_BIT( 0xeb, IP_ACTIVE_LOW, IPT_UNUSED )
|
PORT_BIT( 0xeb, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||||
|
|
||||||
PORT_START("DSW1") /* Fake IN6 (DIP1) */
|
PORT_START("DSW1") /* Fake IN6 (DIP1) */
|
||||||
@ -480,61 +516,17 @@ static const ym2151_interface ym2151_config =
|
|||||||
irq_handler
|
irq_handler
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Interrupts generation is guessed, but it requires the same hack as in wwfsstar.c
|
|
||||||
*/
|
|
||||||
static INTERRUPT_GEN( shadfrce_interrupt )
|
|
||||||
{
|
|
||||||
int scanline = 255 - cpu_getiloops(device);
|
|
||||||
|
|
||||||
/* Vblank is lowered on scanline 0 (8) */
|
|
||||||
if (scanline == 0)
|
|
||||||
{
|
|
||||||
vblank = 0;
|
|
||||||
}
|
|
||||||
/* Hack */
|
|
||||||
else if (scanline==(248-1))
|
|
||||||
{
|
|
||||||
vblank = 4;
|
|
||||||
}
|
|
||||||
/* Vblank is raised on scanline 248 (256) */
|
|
||||||
else if (scanline==248)
|
|
||||||
{
|
|
||||||
if(shadfrce_irqs_enable)
|
|
||||||
cpu_set_input_line(device, 3, ASSERT_LINE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An interrupt is generated every 16 scanlines */
|
|
||||||
if (scanline%16 == 0)
|
|
||||||
{
|
|
||||||
if(shadfrce_irqs_enable)
|
|
||||||
cpu_set_input_line(device, 2, ASSERT_LINE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static MACHINE_RESET( shadfrce )
|
|
||||||
{
|
|
||||||
raster_irq_timer = timer_alloc(machine, raster_interrupt, NULL);
|
|
||||||
timer_enable(raster_irq_timer, 0);
|
|
||||||
shadfrce_scanline = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static MACHINE_DRIVER_START( shadfrce )
|
static MACHINE_DRIVER_START( shadfrce )
|
||||||
MDRV_CPU_ADD("main", M68000, XTAL_28MHz/2) /* verified on pcb */
|
MDRV_CPU_ADD("main", M68000, CPU_CLOCK) /* verified on pcb */
|
||||||
MDRV_CPU_PROGRAM_MAP(shadfrce_map,0)
|
MDRV_CPU_PROGRAM_MAP(shadfrce_map,0)
|
||||||
MDRV_CPU_VBLANK_INT_HACK(shadfrce_interrupt,256)
|
MDRV_TIMER_ADD_SCANLINE("scantimer", shadfrce_scanline, "main", 0, 1)
|
||||||
|
|
||||||
MDRV_CPU_ADD("audio", Z80, XTAL_3_579545MHz) /* verified on pcb */
|
MDRV_CPU_ADD("audio", Z80, XTAL_3_579545MHz) /* verified on pcb */
|
||||||
MDRV_CPU_PROGRAM_MAP(shadfrce_sound_map,0)
|
MDRV_CPU_PROGRAM_MAP(shadfrce_sound_map,0)
|
||||||
|
|
||||||
MDRV_MACHINE_RESET(shadfrce)
|
|
||||||
|
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
MDRV_SCREEN_REFRESH_RATE(60)
|
|
||||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
|
||||||
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
||||||
MDRV_SCREEN_SIZE(64*8, 32*8)
|
MDRV_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 432, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
|
||||||
MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
|
|
||||||
|
|
||||||
MDRV_GFXDECODE(shadfrce)
|
MDRV_GFXDECODE(shadfrce)
|
||||||
MDRV_PALETTE_LENGTH(0x4000)
|
MDRV_PALETTE_LENGTH(0x4000)
|
||||||
@ -546,13 +538,13 @@ static MACHINE_DRIVER_START( shadfrce )
|
|||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
|
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
|
||||||
|
|
||||||
MDRV_SOUND_ADD("ym", YM2151, XTAL_3_579545MHz) /* verified on pcb */
|
MDRV_SOUND_ADD("ym", YM2151, XTAL_3_579545MHz) /* verified on pcb */
|
||||||
MDRV_SOUND_CONFIG(ym2151_config)
|
MDRV_SOUND_CONFIG(ym2151_config)
|
||||||
MDRV_SOUND_ROUTE(0, "left", 0.50)
|
MDRV_SOUND_ROUTE(0, "left", 0.50)
|
||||||
MDRV_SOUND_ROUTE(1, "right", 0.50)
|
MDRV_SOUND_ROUTE(1, "right", 0.50)
|
||||||
|
|
||||||
MDRV_SOUND_ADD("oki", OKIM6295, XTAL_13_4952MHz/8) /* verified on pcb */
|
MDRV_SOUND_ADD("oki", OKIM6295, XTAL_13_4952MHz/8) /* verified on pcb */
|
||||||
MDRV_SOUND_CONFIG(okim6295_interface_pin7high) /* verified on pcb, pin7 is at 2.4v */
|
MDRV_SOUND_CONFIG(okim6295_interface_pin7high) /* verified on pcb, pin7 is at 2.4v */
|
||||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50)
|
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50)
|
||||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.50)
|
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "right", 0.50)
|
||||||
MACHINE_DRIVER_END
|
MACHINE_DRIVER_END
|
||||||
|
@ -138,12 +138,15 @@ Notes:
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "deprecat.h"
|
|
||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "sound/2151intf.h"
|
#include "sound/2151intf.h"
|
||||||
#include "sound/okim6295.h"
|
#include "sound/okim6295.h"
|
||||||
|
|
||||||
|
#define MASTER_CLOCK XTAL_20MHz
|
||||||
|
#define CPU_CLOCK MASTER_CLOCK / 2
|
||||||
|
#define PIXEL_CLOCK MASTER_CLOCK / 4
|
||||||
|
|
||||||
/* in (video/wwfsstar.c) */
|
/* in (video/wwfsstar.c) */
|
||||||
VIDEO_START( wwfsstar );
|
VIDEO_START( wwfsstar );
|
||||||
VIDEO_UPDATE( wwfsstar );
|
VIDEO_UPDATE( wwfsstar );
|
||||||
@ -157,7 +160,7 @@ static WRITE16_HANDLER( wwfsstar_flipscreen_w );
|
|||||||
static WRITE16_HANDLER ( wwfsstar_soundwrite );
|
static WRITE16_HANDLER ( wwfsstar_soundwrite );
|
||||||
static WRITE16_HANDLER ( wwfsstar_scrollwrite );
|
static WRITE16_HANDLER ( wwfsstar_scrollwrite );
|
||||||
|
|
||||||
static int vblank;
|
static int vblank = 0;
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Memory Maps
|
Memory Maps
|
||||||
@ -227,7 +230,7 @@ static WRITE16_HANDLER( wwfsstar_flipscreen_w )
|
|||||||
|
|
||||||
static WRITE16_HANDLER( wwfsstar_irqack_w )
|
static WRITE16_HANDLER( wwfsstar_irqack_w )
|
||||||
{
|
{
|
||||||
if(offset == 0)
|
if (offset == 0)
|
||||||
cpu_set_input_line(space->machine->cpu[0], 6, CLEAR_LINE);
|
cpu_set_input_line(space->machine->cpu[0], 6, CLEAR_LINE);
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -247,32 +250,39 @@ static WRITE16_HANDLER( wwfsstar_irqack_w )
|
|||||||
A hack is required: raise the vblank bit a scanline early.
|
A hack is required: raise the vblank bit a scanline early.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static INTERRUPT_GEN( wwfsstars_interrupt )
|
static TIMER_DEVICE_CALLBACK( wwfsstar_scanline )
|
||||||
{
|
{
|
||||||
int scanline = 271 - cpu_getiloops(device);
|
int scanline = param;
|
||||||
|
|
||||||
/* Vblank is lowered on scanline 0 (8) */
|
/* Vblank is lowered on scanline 0 */
|
||||||
if (scanline == 0)
|
if (scanline == 0)
|
||||||
{
|
{
|
||||||
vblank = 0;
|
vblank = 0;
|
||||||
}
|
}
|
||||||
/* Hack */
|
/* Hack */
|
||||||
else if (scanline==239)
|
else if (scanline == (240-1)) /* -1 is an hack needed to avoid deadlocks */
|
||||||
{
|
{
|
||||||
vblank = 1;
|
vblank = 1;
|
||||||
}
|
}
|
||||||
/* Vblank is raised on scanline 240 (248) */
|
|
||||||
else if (scanline==240)
|
|
||||||
{
|
|
||||||
video_screen_update_partial(device->machine->primary_screen, scanline);
|
|
||||||
cpu_set_input_line(device, 6, ASSERT_LINE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An interrupt is generated every 16 scanlines */
|
/* An interrupt is generated every 16 scanlines */
|
||||||
if (scanline%16 == 0)
|
if (scanline % 16 == 0)
|
||||||
{
|
{
|
||||||
video_screen_update_partial(device->machine->primary_screen, scanline);
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
cpu_set_input_line(device, 5, ASSERT_LINE);
|
cpu_set_input_line(timer->machine->cpu[0], 5, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vblank is raised on scanline 240 */
|
||||||
|
if (scanline == 240)
|
||||||
|
{
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 6, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust for next scanline */
|
||||||
|
if (++scanline >= video_screen_get_height(timer->machine->primary_screen))
|
||||||
|
{
|
||||||
|
scanline = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,20 +442,17 @@ static const ym2151_interface ym2151_config =
|
|||||||
static MACHINE_DRIVER_START( wwfsstar )
|
static MACHINE_DRIVER_START( wwfsstar )
|
||||||
|
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MDRV_CPU_ADD("main", M68000, XTAL_20MHz / 2)
|
MDRV_CPU_ADD("main", M68000, CPU_CLOCK)
|
||||||
MDRV_CPU_PROGRAM_MAP(main_map, 0)
|
MDRV_CPU_PROGRAM_MAP(main_map, 0)
|
||||||
MDRV_CPU_VBLANK_INT_HACK(wwfsstars_interrupt, 272)
|
MDRV_TIMER_ADD_SCANLINE("scantimer", wwfsstar_scanline, "main", 0, 1)
|
||||||
|
|
||||||
MDRV_CPU_ADD("audio", Z80, XTAL_3_579545MHz)
|
MDRV_CPU_ADD("audio", Z80, XTAL_3_579545MHz)
|
||||||
MDRV_CPU_PROGRAM_MAP(sound_map, 0)
|
MDRV_CPU_PROGRAM_MAP(sound_map, 0)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
MDRV_SCREEN_REFRESH_RATE(57.44)
|
|
||||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
|
||||||
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
||||||
MDRV_SCREEN_SIZE(32*8, 32*8)
|
MDRV_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 320, 0, 256, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
|
||||||
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
|
|
||||||
|
|
||||||
MDRV_GFXDECODE(wwfsstar)
|
MDRV_GFXDECODE(wwfsstar)
|
||||||
MDRV_PALETTE_LENGTH(384)
|
MDRV_PALETTE_LENGTH(384)
|
||||||
|
@ -38,13 +38,16 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "deprecat.h"
|
|
||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
#include "wwfwfest.h"
|
#include "wwfwfest.h"
|
||||||
#include "sound/2151intf.h"
|
#include "sound/2151intf.h"
|
||||||
#include "sound/okim6295.h"
|
#include "sound/okim6295.h"
|
||||||
|
|
||||||
|
#define MASTER_CLOCK XTAL_24MHz
|
||||||
|
#define CPU_CLOCK MASTER_CLOCK / 2
|
||||||
|
#define PIXEL_CLOCK MASTER_CLOCK / 4
|
||||||
|
|
||||||
/*- in this file -*/
|
/*- in this file -*/
|
||||||
static READ16_HANDLER( wwfwfest_paletteram16_xxxxBBBBGGGGRRRR_word_r );
|
static READ16_HANDLER( wwfwfest_paletteram16_xxxxBBBBGGGGRRRR_word_r );
|
||||||
static WRITE16_HANDLER( wwfwfest_paletteram16_xxxxBBBBGGGGRRRR_word_w );
|
static WRITE16_HANDLER( wwfwfest_paletteram16_xxxxBBBBGGGGRRRR_word_w );
|
||||||
@ -52,11 +55,8 @@ static WRITE16_HANDLER( wwfwfest_1410_write ); /* priority write */
|
|||||||
static WRITE16_HANDLER( wwfwfest_scroll_write ); /* scrolling write */
|
static WRITE16_HANDLER( wwfwfest_scroll_write ); /* scrolling write */
|
||||||
static WRITE8_HANDLER( oki_bankswitch_w );
|
static WRITE8_HANDLER( oki_bankswitch_w );
|
||||||
static WRITE16_HANDLER ( wwfwfest_soundwrite );
|
static WRITE16_HANDLER ( wwfwfest_soundwrite );
|
||||||
|
static WRITE16_HANDLER ( wwfwfest_flipscreen_w );
|
||||||
static WRITE16_HANDLER( wwfwfest_flipscreen_w )
|
static WRITE16_HANDLER ( wwfwfest_irq_ack_w );
|
||||||
{
|
|
||||||
flip_screen_set(space->machine, data&1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Memory Maps
|
Memory Maps
|
||||||
@ -74,8 +74,7 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
|
|||||||
AM_RANGE(0x082000, 0x082fff) AM_RAM_WRITE(wwfwfest_bg1_videoram_w) AM_BASE(&wwfwfest_bg1_videoram) /* BG1 Ram - 2 bytes per tile */
|
AM_RANGE(0x082000, 0x082fff) AM_RAM_WRITE(wwfwfest_bg1_videoram_w) AM_BASE(&wwfwfest_bg1_videoram) /* BG1 Ram - 2 bytes per tile */
|
||||||
AM_RANGE(0x100000, 0x100007) AM_WRITE(wwfwfest_scroll_write)
|
AM_RANGE(0x100000, 0x100007) AM_WRITE(wwfwfest_scroll_write)
|
||||||
AM_RANGE(0x10000a, 0x10000b) AM_WRITE(wwfwfest_flipscreen_w)
|
AM_RANGE(0x10000a, 0x10000b) AM_WRITE(wwfwfest_flipscreen_w)
|
||||||
AM_RANGE(0x140000, 0x140001) AM_WRITE(SMH_NOP) /* Irq 3 ack */
|
AM_RANGE(0x140000, 0x140003) AM_WRITE(wwfwfest_irq_ack_w)
|
||||||
AM_RANGE(0x140002, 0x140003) AM_WRITE(SMH_NOP) /* Irq 2 ack */
|
|
||||||
AM_RANGE(0x14000c, 0x14000d) AM_WRITE(wwfwfest_soundwrite)
|
AM_RANGE(0x14000c, 0x14000d) AM_WRITE(wwfwfest_soundwrite)
|
||||||
AM_RANGE(0x140010, 0x140011) AM_WRITE(wwfwfest_1410_write)
|
AM_RANGE(0x140010, 0x140011) AM_WRITE(wwfwfest_1410_write)
|
||||||
AM_RANGE(0x140020, 0x140021) AM_READ_PORT("P1")
|
AM_RANGE(0x140020, 0x140021) AM_READ_PORT("P1")
|
||||||
@ -102,6 +101,20 @@ ADDRESS_MAP_END
|
|||||||
as used by the above memory map
|
as used by the above memory map
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
static WRITE16_HANDLER( wwfwfest_irq_ack_w )
|
||||||
|
{
|
||||||
|
if (offset == 0)
|
||||||
|
cpu_set_input_line(space->machine->cpu[0], 3, CLEAR_LINE);
|
||||||
|
|
||||||
|
else
|
||||||
|
cpu_set_input_line(space->machine->cpu[0], 2, CLEAR_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static WRITE16_HANDLER( wwfwfest_flipscreen_w )
|
||||||
|
{
|
||||||
|
flip_screen_set(space->machine, data&1);
|
||||||
|
}
|
||||||
|
|
||||||
/*- Palette Reads/Writes -*/
|
/*- Palette Reads/Writes -*/
|
||||||
|
|
||||||
static READ16_HANDLER( wwfwfest_paletteram16_xxxxBBBBGGGGRRRR_word_r )
|
static READ16_HANDLER( wwfwfest_paletteram16_xxxxBBBBGGGGRRRR_word_r )
|
||||||
@ -331,11 +344,29 @@ GFXDECODE_END
|
|||||||
Interrupt Function
|
Interrupt Function
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
static INTERRUPT_GEN( wwfwfest_interrupt ) {
|
static TIMER_DEVICE_CALLBACK( wwfwfest_scanline )
|
||||||
if( cpu_getiloops(device) == 0 )
|
{
|
||||||
cpu_set_input_line(device, 3, HOLD_LINE);
|
int scanline = param;
|
||||||
else
|
|
||||||
cpu_set_input_line(device, 2, HOLD_LINE);
|
/* An interrupt is generated every 16 scanlines */
|
||||||
|
if (scanline % 16 == 0)
|
||||||
|
{
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 2, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vblank is raised on scanline 248 */
|
||||||
|
if (scanline == 248)
|
||||||
|
{
|
||||||
|
video_screen_update_partial(timer->machine->primary_screen, scanline - 1);
|
||||||
|
cpu_set_input_line(timer->machine->cpu[0], 3, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust for next scanline */
|
||||||
|
if (++scanline >= video_screen_get_height(timer->machine->primary_screen))
|
||||||
|
{
|
||||||
|
scanline = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
@ -368,9 +399,9 @@ static VIDEO_EOF( wwfwfest )
|
|||||||
static MACHINE_DRIVER_START( wwfwfest )
|
static MACHINE_DRIVER_START( wwfwfest )
|
||||||
|
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MDRV_CPU_ADD("main", M68000, XTAL_24MHz / 2) /* 24 crystal, 12 rated chip */
|
MDRV_CPU_ADD("main", M68000, CPU_CLOCK) /* 24 crystal, 12 rated chip */
|
||||||
MDRV_CPU_PROGRAM_MAP(main_map,0)
|
MDRV_CPU_PROGRAM_MAP(main_map,0)
|
||||||
MDRV_CPU_VBLANK_INT_HACK(wwfwfest_interrupt,2)
|
MDRV_TIMER_ADD_SCANLINE("scantimer", wwfwfest_scanline, "main", 0, 1)
|
||||||
|
|
||||||
MDRV_CPU_ADD("audio", Z80, XTAL_3_579545MHz)
|
MDRV_CPU_ADD("audio", Z80, XTAL_3_579545MHz)
|
||||||
MDRV_CPU_PROGRAM_MAP(sound_map,0)
|
MDRV_CPU_PROGRAM_MAP(sound_map,0)
|
||||||
@ -379,11 +410,8 @@ static MACHINE_DRIVER_START( wwfwfest )
|
|||||||
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
|
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
|
||||||
|
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
MDRV_SCREEN_REFRESH_RATE(60)
|
|
||||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
|
|
||||||
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
||||||
MDRV_SCREEN_SIZE(320, 256)
|
MDRV_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */
|
||||||
MDRV_SCREEN_VISIBLE_AREA(0, 319, 1*8, 31*8-1)
|
|
||||||
|
|
||||||
MDRV_GFXDECODE(wwfwfest)
|
MDRV_GFXDECODE(wwfwfest)
|
||||||
MDRV_PALETTE_LENGTH(8192)
|
MDRV_PALETTE_LENGTH(8192)
|
||||||
|
Loading…
Reference in New Issue
Block a user