further fixes to nemesis.c [Hau]

merged memory maps in hyprduel.c [Hau]
New games added or promoted from NOT_WORKING status
Magical Error wo Sagase [Hau]
This commit is contained in:
Yasuhiro Ogawa 2009-03-27 14:45:40 +00:00
parent c6116e9138
commit caa85ce7a0
4 changed files with 304 additions and 374 deletions

View File

@ -12,7 +12,7 @@ Imagetek Inc 14220 071
Magical Error wo Sagase
(c)1993? Technosoft / Jaleco
(c)1994 Technosoft / Jaleco
TEC5000(Japan)
TMP68000N-10 x2
@ -22,13 +22,10 @@ OSC: 3.579545MHz, 4.0000MHz, 20.0000MHz, 26.6660MHz
Imagetek Inc 14220 071
--
driver by Eisuke Watanabe
Written by Hau
03/27/2009
based on driver from drivers/metro.c by Luca Elia
spthx to kikur,Cha,teioh,kokkyu,teruchu,aya,sgo
Note:
sub68k is performing not only processing of sound but assistance of main68k.
---
Magical Error
@ -43,67 +40,21 @@ fix comms so it boots, it's a bit of a hack for hyperduel at the moment ;-)
#include "sound/2151intf.h"
#include "sound/okim6295.h"
#include "sound/2413intf.h"
#include "includes/hyprduel.h"
#define RASTER_LINES 262
#define FIRST_VISIBLE_LINE 0
#define LAST_VISIBLE_LINE 223
/* Variables defined in video: */
extern UINT16 *hyprduel_videoregs;
extern UINT16 *hyprduel_screenctrl;
extern UINT16 *hyprduel_tiletable;
extern size_t hyprduel_tiletable_size;
extern UINT16 *hyprduel_vram_0, *hyprduel_vram_1, *hyprduel_vram_2;
extern UINT16 *hyprduel_window;
extern UINT16 hyprduel_scrollx[3][RASTER_LINES+1];
extern UINT16 hyprduel_scrolly[3][RASTER_LINES+1];
/* Functions defined in video: */
WRITE16_HANDLER( hyprduel_paletteram_w );
WRITE16_HANDLER( hyprduel_window_w );
WRITE16_HANDLER( hyprduel_vram_0_w );
WRITE16_HANDLER( hyprduel_vram_1_w );
WRITE16_HANDLER( hyprduel_vram_2_w );
VIDEO_START( hyprduel_14220 );
VIDEO_UPDATE( hyprduel );
/***************************************************************************
Interrupts
***************************************************************************/
int rastersplit;
static int blitter_bit;
static int requested_int;
static UINT16 *hypr_irq_enable;
static int subcpu_resetline;
static int rastersplit;
static int int_num;
static UINT16 *hypr_sharedram1;
static UINT16 *hypr_sharedram2;
static UINT16 *hypr_sub_sharedram1_1;
static UINT16 *hypr_sub_sharedram1_2;
static UINT16 *hypr_sub_sharedram2_1;
static UINT16 *hypr_sub_sharedram2_2;
static UINT16 *sharedram;
static WRITE16_HANDLER( hypr_sharedram1_w )
{
COMBINE_DATA(&hypr_sharedram1[offset]);
COMBINE_DATA(&hypr_sub_sharedram1_1[offset]);
if (offset < 0x4000/2)
COMBINE_DATA(&hypr_sub_sharedram1_2[offset]);
}
static WRITE16_HANDLER( hypr_sharedram2_w )
{
COMBINE_DATA(&hypr_sharedram2[offset]);
COMBINE_DATA(&hypr_sub_sharedram2_1[offset]);
if ((offset >= 0x4000/2) && (offset < 0x7fff/2))
COMBINE_DATA(&hypr_sub_sharedram2_2[offset-0x4000/2]);
}
/***************************************************************************
Interrupts
***************************************************************************/
static void update_irq_state(running_machine *machine)
{
@ -112,86 +63,6 @@ static void update_irq_state(running_machine *machine)
cpu_set_input_line(machine->cpu[0], 3, (irq & int_num) ? ASSERT_LINE : CLEAR_LINE);
}
static READ16_HANDLER( hyprduel_irq_cause_r )
{
return requested_int;
}
static WRITE16_HANDLER( hyprduel_irq_cause_w )
{
if (ACCESSING_BITS_0_7)
{
if (data == int_num)
requested_int &= ~(int_num & ~*hypr_irq_enable);
else
requested_int &= ~(data & *hypr_irq_enable);
update_irq_state(space->machine);
}
}
static WRITE16_HANDLER( hypr_subcpu_control_w )
{
int pc = cpu_get_pc(space->cpu);
if (data & 0x01)
{
if (!subcpu_resetline)
{
if (pc != 0x95f2)
{
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_RESET, ASSERT_LINE);
subcpu_resetline = 1;
} else {
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_HALT, ASSERT_LINE);
subcpu_resetline = -1;
}
}
} else {
if (subcpu_resetline == 1 && (data != 0x0c))
{
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_RESET, CLEAR_LINE);
subcpu_resetline = 0;
if (pc == 0xbb0 || pc == 0x9d30 || pc == 0xb19c)
cpu_spinuntil_time(space->cpu, ATTOTIME_IN_USEC(15000)); /* sync semaphore */
}
else if (subcpu_resetline == -1)
{
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_HALT, CLEAR_LINE);
subcpu_resetline = 0;
}
}
}
static WRITE16_HANDLER( hypr_scrollreg_w )
{
int i;
if (offset & 0x01)
{
for (i = rastersplit; i < RASTER_LINES; i++)
hyprduel_scrollx[offset>>1][i] = data;
} else {
for (i = rastersplit; i < RASTER_LINES; i++)
hyprduel_scrolly[offset>>1][i] = data;
}
}
static WRITE16_HANDLER( hypr_scrollreg_init_w )
{
int i;
for (i = 0; i < RASTER_LINES; i++)
{
hyprduel_scrollx[0][i] = data;
hyprduel_scrollx[1][i] = data;
hyprduel_scrollx[2][i] = data;
hyprduel_scrolly[0][i] = data;
hyprduel_scrolly[1][i] = data;
hyprduel_scrolly[2][i] = data;
}
}
static TIMER_CALLBACK( vblank_end_callback )
{
requested_int &= ~param;
@ -219,13 +90,64 @@ static INTERRUPT_GEN( hyprduel_interrupt )
update_irq_state(device->machine);
}
static MACHINE_RESET( hyprduel )
static READ16_HANDLER( hyprduel_irq_cause_r )
{
/* start with cpu2 halted */
cpu_set_input_line(machine->cpu[1], INPUT_LINE_RESET, ASSERT_LINE);
subcpu_resetline = 1;
return requested_int;
}
static WRITE16_HANDLER( hyprduel_irq_cause_w )
{
if (ACCESSING_BITS_0_7)
{
if (data == int_num)
requested_int &= ~(int_num & ~*hypr_irq_enable);
else
requested_int &= ~(data & *hypr_irq_enable);
update_irq_state(space->machine);
}
}
static WRITE16_HANDLER( hypr_subcpu_control_w )
{
if (data & 0x01)
{
if (!subcpu_resetline)
{
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_RESET, ASSERT_LINE);
subcpu_resetline = 1;
}
}
else
{
if ((subcpu_resetline == 1) && (data != 0x0c))
{
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_RESET, CLEAR_LINE);
subcpu_resetline = 0;
if ((int_num == 0x02) && (cpu_get_pc(space->cpu) == 0x000bb0))
cpu_spinuntil_time(space->cpu, ATTOTIME_IN_USEC(8000));
else
cpu_spinuntil_int(space->cpu);
}
}
}
static READ16_HANDLER( hypr_cpusync_r )
{
cpu_spin(space->cpu);
return sharedram[0x408/2 + offset];
}
static emu_timer *magerror_irq_timer;
static TIMER_CALLBACK( magerror_irq_callback )
{
cpu_set_input_line(machine->cpu[1], 1, HOLD_LINE);
}
/***************************************************************************
Banked ROM access
@ -461,139 +383,95 @@ static WRITE16_HANDLER( hyprduel_blitter_w )
Memory Maps
***************************************************************************/
static ADDRESS_MAP_START( hyprduel_readmem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_READ(SMH_ROM)
AM_RANGE(0x400000, 0x41ffff) AM_READ(SMH_RAM ) // Layer 0
AM_RANGE(0x420000, 0x43ffff) AM_READ(SMH_RAM ) // Layer 1
AM_RANGE(0x440000, 0x45ffff) AM_READ(SMH_RAM ) // Layer 2
AM_RANGE(0x460000, 0x46ffff) AM_READ(hyprduel_bankedrom_r ) // Banked ROM
AM_RANGE(0x470000, 0x473fff) AM_READ(SMH_RAM ) // Palette
AM_RANGE(0x474000, 0x474fff) AM_READ(SMH_RAM ) // Sprites
AM_RANGE(0x475000, 0x477fff) AM_READ(SMH_RAM ) // (only used memory test)
AM_RANGE(0x478000, 0x4787ff) AM_READ(SMH_RAM ) // Tiles Set
AM_RANGE(0x4788a2, 0x4788a3) AM_READ(hyprduel_irq_cause_r ) // IRQ Cause
AM_RANGE(0xc00000, 0xc07fff) AM_READ(SMH_RAM ) // (sound driver controls)
AM_RANGE(0xe00000, 0xe00001) AM_READ_PORT("SERVICE")
static ADDRESS_MAP_START( hyprduel_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(hyprduel_vram_0_w) AM_BASE(&hyprduel_vram_0) /* Layer 0 */
AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(hyprduel_vram_1_w) AM_BASE(&hyprduel_vram_1) /* Layer 1 */
AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(hyprduel_vram_2_w) AM_BASE(&hyprduel_vram_2) /* Layer 2 */
AM_RANGE(0x460000, 0x46ffff) AM_READ(hyprduel_bankedrom_r) /* Banked ROM */
AM_RANGE(0x470000, 0x473fff) AM_RAM AM_WRITE(hyprduel_paletteram_w) AM_BASE(&paletteram16) /* Palette */
AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) /* Sprites */
AM_RANGE(0x475000, 0x477fff) AM_RAM /* only used memory test */
AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE(&hyprduel_tiletable) AM_SIZE(&hyprduel_tiletable_size) /* Tiles Set */
AM_RANGE(0x478840, 0x47884d) AM_WRITE(hyprduel_blitter_w) AM_BASE(&hyprduel_blitter_regs) /* Tiles Blitter */
AM_RANGE(0x478860, 0x47886b) AM_WRITE(hyprduel_window_w) AM_BASE(&hyprduel_window) /* Tilemap Window */
AM_RANGE(0x478870, 0x47887b) AM_WRITE(hypr_scrollreg_w) /* Scroll Regs */
AM_RANGE(0x47887c, 0x47887d) AM_WRITE(hypr_scrollreg_init_w)
AM_RANGE(0x478880, 0x478881) AM_WRITENOP
AM_RANGE(0x478890, 0x478891) AM_WRITENOP
AM_RANGE(0x4788a0, 0x4788a1) AM_WRITENOP
AM_RANGE(0x4788a2, 0x4788a3) AM_READWRITE(hyprduel_irq_cause_r, hyprduel_irq_cause_w) /* IRQ Cause,Acknowledge */
AM_RANGE(0x4788a4, 0x4788a5) AM_RAM AM_BASE(&hypr_irq_enable) /* IRQ Enable */
AM_RANGE(0x4788aa, 0x4788ab) AM_RAM AM_BASE(&hyprduel_rombank) /* Rom Bank */
AM_RANGE(0x4788ac, 0x4788ad) AM_RAM AM_BASE(&hyprduel_screenctrl) /* Screen Control */
AM_RANGE(0x479700, 0x479713) AM_RAM AM_BASE(&hyprduel_videoregs) /* Video Registers */
AM_RANGE(0x800000, 0x800001) AM_WRITE(hypr_subcpu_control_w)
AM_RANGE(0xc00000, 0xc07fff) AM_RAM AM_SHARE(1) AM_BASE(&sharedram)
AM_RANGE(0xe00000, 0xe00001) AM_READ_PORT("SERVICE") AM_WRITENOP
AM_RANGE(0xe00002, 0xe00003) AM_READ_PORT("DSW")
AM_RANGE(0xe00004, 0xe00005) AM_READ_PORT("P1_P2")
AM_RANGE(0xe00006, 0xe00007) AM_READ_PORT("SYSTEM")
AM_RANGE(0xfe0000, 0xffffff) AM_READ(SMH_RAM )
AM_RANGE(0xfe0000, 0xfe3fff) AM_RAM AM_SHARE(2)
AM_RANGE(0xfe4000, 0xffffff) AM_RAM AM_SHARE(3)
ADDRESS_MAP_END
static ADDRESS_MAP_START( hyprduel_writemem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_WRITE(SMH_ROM )
AM_RANGE(0x400000, 0x41ffff) AM_WRITE(hyprduel_vram_0_w) AM_BASE(&hyprduel_vram_0 ) // Layer 0
AM_RANGE(0x420000, 0x43ffff) AM_WRITE(hyprduel_vram_1_w) AM_BASE(&hyprduel_vram_1 ) // Layer 1
AM_RANGE(0x440000, 0x45ffff) AM_WRITE(hyprduel_vram_2_w) AM_BASE(&hyprduel_vram_2 ) // Layer 2
AM_RANGE(0x470000, 0x473fff) AM_WRITE(hyprduel_paletteram_w) AM_BASE(&paletteram16 ) // Palette
AM_RANGE(0x474000, 0x474fff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size ) // Sprites
AM_RANGE(0x475000, 0x477fff) AM_WRITE(SMH_RAM )
AM_RANGE(0x478000, 0x4787ff) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_tiletable) AM_SIZE(&hyprduel_tiletable_size ) // Tiles Set
AM_RANGE(0x478840, 0x47884d) AM_WRITE(hyprduel_blitter_w) AM_BASE(&hyprduel_blitter_regs ) // Tiles Blitter
AM_RANGE(0x478860, 0x47886b) AM_WRITE(hyprduel_window_w) AM_BASE(&hyprduel_window ) // Tilemap Window
AM_RANGE(0x478870, 0x47887b) AM_WRITE(hypr_scrollreg_w ) // Scroll Regs
AM_RANGE(0x47887c, 0x47887d) AM_WRITE(hypr_scrollreg_init_w ) // scroll regs all sets
AM_RANGE(0x478880, 0x478881) AM_WRITE(SMH_NOP )
AM_RANGE(0x478890, 0x478891) AM_WRITE(SMH_NOP )
AM_RANGE(0x4788a0, 0x4788a1) AM_WRITE(SMH_NOP )
AM_RANGE(0x4788a2, 0x4788a3) AM_WRITE(hyprduel_irq_cause_w ) // IRQ Acknowledge
AM_RANGE(0x4788a4, 0x4788a5) AM_WRITE(SMH_RAM) AM_BASE(&hypr_irq_enable ) // IRQ Enable
AM_RANGE(0x4788aa, 0x4788ab) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_rombank ) // Rom Bank
AM_RANGE(0x4788ac, 0x4788ad) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_screenctrl ) // Screen Control
AM_RANGE(0x479700, 0x479713) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_videoregs ) // Video Registers
AM_RANGE(0x800000, 0x800001) AM_WRITE(hypr_subcpu_control_w )
AM_RANGE(0xc00000, 0xc07fff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sharedram1 )
AM_RANGE(0xe00000, 0xe00001) AM_WRITE(SMH_NOP )
AM_RANGE(0xfe0000, 0xffffff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sharedram2 )
static ADDRESS_MAP_START( hyprduel_map2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x003fff) AM_RAM AM_SHARE(1) /* shadow ($c00000 - $c03fff : vector) */
AM_RANGE(0x004000, 0x007fff) AM_RAM AM_WRITENOP AM_SHARE(3) /* shadow ($fe4000 - $fe7fff : read only) */
AM_RANGE(0x400000, 0x400003) AM_DEVREADWRITE8("ym", ym2151_r, ym2151_w, 0x00ff )
AM_RANGE(0x400004, 0x400005) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff)
AM_RANGE(0x800000, 0x800001) AM_NOP
AM_RANGE(0xc00000, 0xc07fff) AM_RAM AM_SHARE(1)
AM_RANGE(0xfe0000, 0xfe3fff) AM_RAM AM_SHARE(2)
AM_RANGE(0xfe4000, 0xffffff) AM_RAM AM_SHARE(3)
ADDRESS_MAP_END
static ADDRESS_MAP_START( hyprduel_readmem2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x003fff) AM_READ(SMH_RAM )
AM_RANGE(0x004000, 0x007fff) AM_READ(SMH_RAM )
AM_RANGE(0x400000, 0x400003) AM_DEVREAD8("ym", ym2151_r, 0x00ff )
AM_RANGE(0x400004, 0x400005) AM_DEVREAD8("oki", okim6295_r, 0x00ff )
AM_RANGE(0xc00000, 0xc07fff) AM_READ(SMH_RAM )
AM_RANGE(0xfe0000, 0xffffff) AM_READ(SMH_RAM )
ADDRESS_MAP_END
static ADDRESS_MAP_START( hyprduel_writemem2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x003fff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram1_2 ) // shadow ($c00000 - $c03fff : vector, write ok)
AM_RANGE(0x004000, 0x007fff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram2_2 ) // shadow ($fe4000 - $fe7fff : read only)
AM_RANGE(0x400000, 0x400003) AM_DEVWRITE8("ym", ym2151_w, 0x00ff )
AM_RANGE(0x400004, 0x400005) AM_DEVWRITE8("oki", okim6295_w, 0x00ff)
AM_RANGE(0x800000, 0x800001) AM_WRITE(SMH_NOP )
AM_RANGE(0xc00000, 0xc07fff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram1_1 ) // (sound driver)
AM_RANGE(0xfe0000, 0xffffff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram2_1 )
ADDRESS_MAP_END
/* Magical Error - video is at 8x now */
static ADDRESS_MAP_START( magerror_readmem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_READ(SMH_ROM)
AM_RANGE(0x800000, 0x81ffff) AM_READ(SMH_RAM ) // Layer 0
AM_RANGE(0x820000, 0x83ffff) AM_READ(SMH_RAM ) // Layer 1
AM_RANGE(0x840000, 0x85ffff) AM_READ(SMH_RAM ) // Layer 2
AM_RANGE(0x860000, 0x86ffff) AM_READ(hyprduel_bankedrom_r ) // Banked ROM
AM_RANGE(0x870000, 0x873fff) AM_READ(SMH_RAM ) // Palette
AM_RANGE(0x874000, 0x874fff) AM_READ(SMH_RAM ) // Sprites
AM_RANGE(0x875000, 0x877fff) AM_READ(SMH_RAM ) // (only used memory test)
AM_RANGE(0x878000, 0x8787ff) AM_READ(SMH_RAM ) // Tiles Set
AM_RANGE(0x8788a2, 0x8788a3) AM_READ(hyprduel_irq_cause_r ) // IRQ Cause
AM_RANGE(0xc00000, 0xc1ffff) AM_READ(SMH_RAM ) // (sound driver controls) ?
AM_RANGE(0xe00000, 0xe00001) AM_READ_PORT("SERVICE")
static ADDRESS_MAP_START( magerror_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x400000, 0x400001) AM_WRITE(hypr_subcpu_control_w)
AM_RANGE(0x800000, 0x81ffff) AM_RAM_WRITE(hyprduel_vram_0_w) AM_BASE(&hyprduel_vram_0) /* Layer 0 */
AM_RANGE(0x820000, 0x83ffff) AM_RAM_WRITE(hyprduel_vram_1_w) AM_BASE(&hyprduel_vram_1) /* Layer 1 */
AM_RANGE(0x840000, 0x85ffff) AM_RAM_WRITE(hyprduel_vram_2_w) AM_BASE(&hyprduel_vram_2) /* Layer 2 */
AM_RANGE(0x860000, 0x86ffff) AM_READ(hyprduel_bankedrom_r) /* Banked ROM */
AM_RANGE(0x870000, 0x873fff) AM_RAM AM_WRITE(hyprduel_paletteram_w) AM_BASE(&paletteram16) /* Palette */
AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size ) /* Sprites */
AM_RANGE(0x875000, 0x877fff) AM_RAM /* only used memory test */
AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE(&hyprduel_tiletable) AM_SIZE(&hyprduel_tiletable_size) /* Tiles Set */
AM_RANGE(0x878840, 0x87884d) AM_WRITE(hyprduel_blitter_w) AM_BASE(&hyprduel_blitter_regs) /* Tiles Blitter */
AM_RANGE(0x878860, 0x87886b) AM_WRITE(hyprduel_window_w) AM_BASE(&hyprduel_window) /* Tilemap Window */
AM_RANGE(0x878870, 0x87887b) AM_WRITE(hypr_scrollreg_w) /* Scroll Regs */
AM_RANGE(0x87887c, 0x87887d) AM_WRITE(hypr_scrollreg_init_w)
AM_RANGE(0x878880, 0x878881) AM_WRITENOP
AM_RANGE(0x878890, 0x878891) AM_WRITENOP
AM_RANGE(0x8788a0, 0x8788a1) AM_WRITENOP
AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(hyprduel_irq_cause_r, hyprduel_irq_cause_w) /* IRQ Cause, Acknowledge */
AM_RANGE(0x8788a4, 0x8788a5) AM_RAM AM_BASE(&hypr_irq_enable) /* IRQ Enable */
AM_RANGE(0x8788aa, 0x8788ab) AM_RAM AM_BASE(&hyprduel_rombank) /* Rom Bank */
AM_RANGE(0x8788ac, 0x8788ad) AM_RAM AM_BASE(&hyprduel_screenctrl) /* Screen Control */
AM_RANGE(0x879700, 0x879713) AM_RAM AM_BASE(&hyprduel_videoregs) /* Video Registers */
AM_RANGE(0xc00000, 0xc1ffff) AM_RAM AM_SHARE(1) AM_BASE(&sharedram)
AM_RANGE(0xe00000, 0xe00001) AM_READ_PORT("SERVICE") AM_WRITENOP
AM_RANGE(0xe00002, 0xe00003) AM_READ_PORT("DSW")
AM_RANGE(0xe00004, 0xe00005) AM_READ_PORT("P1_P2")
AM_RANGE(0xe00006, 0xe00007) AM_READ_PORT("SYSTEM")
AM_RANGE(0xfe0000, 0xffffff) AM_READ(SMH_RAM )
AM_RANGE(0xfe0000, 0xfe3fff) AM_RAM AM_SHARE(2)
AM_RANGE(0xfe4000, 0xffffff) AM_RAM AM_SHARE(3)
ADDRESS_MAP_END
static ADDRESS_MAP_START( magerror_writemem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_WRITE(SMH_ROM )
AM_RANGE(0x800000, 0x81ffff) AM_WRITE(hyprduel_vram_0_w) AM_BASE(&hyprduel_vram_0 ) // Layer 0
AM_RANGE(0x820000, 0x83ffff) AM_WRITE(hyprduel_vram_1_w) AM_BASE(&hyprduel_vram_1 ) // Layer 1
AM_RANGE(0x840000, 0x85ffff) AM_WRITE(hyprduel_vram_2_w) AM_BASE(&hyprduel_vram_2 ) // Layer 2
AM_RANGE(0x870000, 0x873fff) AM_WRITE(hyprduel_paletteram_w) AM_BASE(&paletteram16 ) // Palette
AM_RANGE(0x874000, 0x874fff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size ) // Sprites
AM_RANGE(0x875000, 0x877fff) AM_WRITE(SMH_RAM )
AM_RANGE(0x878000, 0x8787ff) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_tiletable) AM_SIZE(&hyprduel_tiletable_size ) // Tiles Set
AM_RANGE(0x878840, 0x87884d) AM_WRITE(hyprduel_blitter_w) AM_BASE(&hyprduel_blitter_regs ) // Tiles Blitter
AM_RANGE(0x878860, 0x87886b) AM_WRITE(hyprduel_window_w) AM_BASE(&hyprduel_window ) // Tilemap Window
AM_RANGE(0x878870, 0x87887b) AM_WRITE(hypr_scrollreg_w ) // Scroll Regs
AM_RANGE(0x87887c, 0x87887d) AM_WRITE(hypr_scrollreg_init_w ) // scroll regs all sets
AM_RANGE(0x878880, 0x878881) AM_WRITE(SMH_NOP )
AM_RANGE(0x878890, 0x878891) AM_WRITE(SMH_NOP )
AM_RANGE(0x8788a0, 0x8788a1) AM_WRITE(SMH_NOP )
AM_RANGE(0x8788a2, 0x8788a3) AM_WRITE(hyprduel_irq_cause_w ) // IRQ Acknowledge
AM_RANGE(0x8788a4, 0x8788a5) AM_WRITE(SMH_RAM) AM_BASE(&hypr_irq_enable ) // IRQ Enable
AM_RANGE(0x8788aa, 0x8788ab) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_rombank ) // Rom Bank
AM_RANGE(0x8788ac, 0x8788ad) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_screenctrl ) // Screen Control
AM_RANGE(0x879700, 0x879713) AM_WRITE(SMH_RAM) AM_BASE(&hyprduel_videoregs ) // Video Registers
AM_RANGE(0x400000, 0x400001) AM_WRITE(hypr_subcpu_control_w )
AM_RANGE(0xc00000, 0xc1ffff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sharedram1 ) //?
AM_RANGE(0xe00000, 0xe00001) AM_WRITE(SMH_NOP )
AM_RANGE(0xfe0000, 0xffffff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sharedram2 )
static ADDRESS_MAP_START( magerror_map2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x003fff) AM_RAM AM_SHARE(1) /* shadow ($c00000 - $c03fff : vector) */
AM_RANGE(0x004000, 0x007fff) AM_RAM AM_WRITENOP AM_SHARE(3) /* shadow ($fe4000 - $fe7fff : read only) */
AM_RANGE(0x400000, 0x400003) AM_NOP
AM_RANGE(0x800000, 0x800003) AM_READNOP AM_DEVWRITE8("ym", ym2413_w, 0x00ff)
AM_RANGE(0x800004, 0x800005) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff)
AM_RANGE(0xc00000, 0xc1ffff) AM_RAM AM_SHARE(1)
AM_RANGE(0xfe0000, 0xfe3fff) AM_RAM AM_SHARE(2)
AM_RANGE(0xfe4000, 0xffffff) AM_RAM AM_SHARE(3)
ADDRESS_MAP_END
static ADDRESS_MAP_START( magerror_readmem2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x003fff) AM_READ(SMH_RAM )
AM_RANGE(0x004000, 0x007fff) AM_READ(SMH_RAM )
// AM_RANGE(0x400000, 0x400003) AM_DEVREAD8("ym", ym2151_r, 0x00ff )
AM_RANGE(0x400004, 0x400005) AM_DEVREAD8("oki", okim6295_r, 0x00ff)
AM_RANGE(0xc00000, 0xc07fff) AM_READ(SMH_RAM )
AM_RANGE(0xfe0000, 0xffffff) AM_READ(SMH_RAM )
ADDRESS_MAP_END
static ADDRESS_MAP_START( magerror_writemem2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x003fff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram1_2 ) // shadow ($c00000 - $c03fff : vector, write ok)
AM_RANGE(0x004000, 0x007fff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram2_2 ) // shadow ($fe4000 - $fe7fff : read only)
AM_RANGE(0x400000, 0x400003) AM_DEVWRITE8("ym", ym2413_w, 0x00ff)
AM_RANGE(0x400004, 0x400005) AM_DEVWRITE8("oki", okim6295_w, 0x00ff)
AM_RANGE(0x800000, 0x800001) AM_WRITE(SMH_NOP )
AM_RANGE(0xc00000, 0xc07fff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram1_1 ) // (sound driver)
AM_RANGE(0xfe0000, 0xffffff) AM_WRITE(SMH_RAM) AM_BASE(&hypr_sub_sharedram2_1 )
ADDRESS_MAP_END
/***************************************************************************
Input Ports
***************************************************************************/
@ -650,8 +528,8 @@ static INPUT_PORTS_START( hyprduel )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0080, 0x0080, "Start Up Mode" )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPSETTING( 0x0080, "Game Mode" )
PORT_DIPSETTING( 0x0000, "Test Mode" )
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Flip_Screen ) )
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
@ -715,15 +593,27 @@ static const ym2151_interface ym2151_config =
Machine Drivers
***************************************************************************/
static MACHINE_RESET( hyprduel )
{
/* start with cpu2 halted */
cpu_set_input_line(machine->cpu[1], INPUT_LINE_RESET, ASSERT_LINE);
subcpu_resetline = 1;
}
static MACHINE_START( magerror )
{
timer_adjust_periodic(magerror_irq_timer, attotime_zero, 0, ATTOTIME_IN_HZ(896)); /* ? */
}
static MACHINE_DRIVER_START( hyprduel )
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,20000000/2) /* 10MHz */
MDRV_CPU_PROGRAM_MAP(hyprduel_readmem,hyprduel_writemem)
MDRV_CPU_PROGRAM_MAP(hyprduel_map,0)
MDRV_CPU_VBLANK_INT_HACK(hyprduel_interrupt,RASTER_LINES)
MDRV_CPU_ADD("sub", M68000,20000000/2) /* 10MHz */
MDRV_CPU_PROGRAM_MAP(hyprduel_readmem2,hyprduel_writemem2)
MDRV_CPU_PROGRAM_MAP(hyprduel_map2,0)
MDRV_MACHINE_RESET(hyprduel)
@ -760,12 +650,13 @@ static MACHINE_DRIVER_START( magerror )
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,20000000/2) /* 10MHz */
MDRV_CPU_PROGRAM_MAP(magerror_readmem,magerror_writemem)
MDRV_CPU_PROGRAM_MAP(magerror_map,0)
MDRV_CPU_VBLANK_INT_HACK(hyprduel_interrupt,RASTER_LINES)
MDRV_CPU_ADD("sub", M68000,20000000/2) /* 10MHz */
MDRV_CPU_PROGRAM_MAP(magerror_readmem2,magerror_writemem2)
MDRV_CPU_PROGRAM_MAP(magerror_map2,0)
MDRV_MACHINE_START(magerror)
MDRV_MACHINE_RESET(hyprduel)
/* video hardware */
@ -786,8 +677,8 @@ static MACHINE_DRIVER_START( magerror )
MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MDRV_SOUND_ADD("ym", YM2413, 3579545)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.57)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.57)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
MDRV_SOUND_ADD("oki", OKIM6295, 4000000/16/16*132)
MDRV_SOUND_CONFIG(okim6295_interface_pin7high) // clock frequency & pin 7 not verified
@ -799,38 +690,6 @@ MACHINE_DRIVER_END
ROMs Loading
***************************************************************************/
static DRIVER_INIT( hyprduel )
{
int i, len = memory_region_length(machine, "gfx1");
UINT8 *ROM = memory_region(machine, "gfx1");
/*
Tiles can be either 4-bit or 8-bit, and both depths can be used at the same
time. The transparent pen is the last one, that is 15 or 255. To make
tilemap.c handle that, we invert gfx data so the transparent pen becomes 0
for both tile depths.
*/
for (i = 0;i < len;i++)
ROM[i] ^= 0xff;
// ROM[(0x174b9*0x20)+0x1f] |= 0x0e; /* I */
// ROM[(0x174e9*0x20)+0x1f] |= 0x0e;
memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xc00000, 0xc07fff, 0, 0, hypr_sharedram1_w);
memory_install_write16_handler(cpu_get_address_space(machine->cpu[1], ADDRESS_SPACE_PROGRAM), 0xc00000, 0xc07fff, 0, 0, hypr_sharedram1_w);
memory_install_write16_handler(cpu_get_address_space(machine->cpu[1], ADDRESS_SPACE_PROGRAM), 0x000000, 0x003fff, 0, 0, hypr_sharedram1_w);
memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xfe0000, 0xffffff, 0, 0, hypr_sharedram2_w);
memory_install_write16_handler(cpu_get_address_space(machine->cpu[1], ADDRESS_SPACE_PROGRAM), 0xfe0000, 0xffffff, 0, 0, hypr_sharedram2_w);
requested_int = 0x00;
blitter_bit = 2;
*hypr_irq_enable = 0xff;
int_num = strcmp(machine->gamedrv->name, "magerror")?2:1;
}
ROM_START( hyprduel )
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD16_BYTE( "24.u24", 0x000000, 0x40000, CRC(c7402722) SHA1(e385676cdcee65a3ddf07791d82a1fe83ba1b3e2) ) /* Also silk screened as position 10 */
@ -876,7 +735,46 @@ ROM_START( magerror )
ROM_LOAD( "97.u97", 0x00000, 0x40000, CRC(2e62bca8) SHA1(191fff11186dbbc1d9d9f3ba1b6e17c38a7d2d1d) ) /* Also silk screened as position 11 */
ROM_END
GAME( 1993, hyprduel, 0, hyprduel, hyprduel, hyprduel, ROT0, "Technosoft", "Hyper Duel (Japan set 1)", 0 )
GAME( 1993, hyprdelj, hyprduel, hyprduel, hyprduel, hyprduel, ROT0, "Technosoft", "Hyper Duel (Japan set 2)", 0 )
GAME( 199?, magerror, 0, magerror, hyprduel, hyprduel, ROT0, "Technosoft / Jaleco", "Magical Error wo Sagase", GAME_NOT_WORKING )
static DRIVER_INIT( hyprduel )
{
int i, len = memory_region_length(machine, "gfx1");
UINT8 *ROM = memory_region(machine, "gfx1");
/*
Tiles can be either 4-bit or 8-bit, and both depths can be used at the same
time. The transparent pen is the last one, that is 15 or 255. To make
tilemap.c handle that, we invert gfx data so the transparent pen becomes 0
for both tile depths.
*/
for (i=0; i<len; i++)
ROM[i] ^= 0xff;
requested_int = 0x00;
blitter_bit = 2;
*hypr_irq_enable = 0xff;
int_num = 0x02;
memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xc00408, 0xc0040b, 0, 0, hypr_cpusync_r);
/* Set up save state */
state_save_register_global(machine, rastersplit);
state_save_register_global(machine, blitter_bit);
state_save_register_global(machine, requested_int);
state_save_register_global(machine, subcpu_resetline);
state_save_register_global(machine, int_num);
}
static DRIVER_INIT( magerror )
{
DRIVER_INIT_CALL(hyprduel);
int_num = 0x01;
magerror_irq_timer = timer_alloc(machine, magerror_irq_callback, NULL);
}
GAME( 1993, hyprduel, 0, hyprduel, hyprduel, hyprduel, ROT0, "Technosoft", "Hyper Duel (Japan set 1)", GAME_SUPPORTS_SAVE )
GAME( 1993, hyprdelj, hyprduel, hyprduel, hyprduel, hyprduel, ROT0, "Technosoft", "Hyper Duel (Japan set 2)", GAME_SUPPORTS_SAVE )
GAME( 1994, magerror, 0, magerror, hyprduel, magerror, ROT0, "Technosoft / Jaleco", "Magical Error wo Sagase", GAME_SUPPORTS_SAVE )

View File

@ -23,7 +23,7 @@
driver by Bryan McPhail
modified by Hau
03/26/2009
03/27/2009
spthx to Unagi,rassy,hina,nori,Tobikage,Tommy,Crimson,yasuken,cupmen,zoo
Notes:
@ -51,8 +51,6 @@ So this is the correct behavior of real hardware, not an emulation bug.
#include "sound/k051649.h"
#include "includes/nemesis.h"
static UINT16 *ram;
static UINT16 *ram2;
int nemesis_irq_on = 0;
int nemesis_irq2_on = 0;
@ -286,12 +284,11 @@ static WRITE8_DEVICE_HANDLER( city_sound_bank_w )
static ADDRESS_MAP_START( nemesis_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x040000, 0x04ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x050000, 0x050fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x050f80, 0x050fff) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x051000, 0x051fff) AM_WRITENOP /* used, but written to with 0's */
AM_RANGE(0x050000, 0x051fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x050f80, 0x050fff) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x052000, 0x052fff) AM_RAM_WRITE(nemesis_videoram1_word_w) AM_BASE(&nemesis_videoram1) /* VRAM */
AM_RANGE(0x053000, 0x053fff) AM_RAM_WRITE(nemesis_videoram2_word_w) AM_BASE(&nemesis_videoram2)
AM_RANGE(0x054000, 0x054fff) AM_RAM_WRITE(nemesis_colorram1_word_w) AM_BASE(&nemesis_colorram1)
@ -312,20 +309,19 @@ static ADDRESS_MAP_START( nemesis_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x05e006, 0x05e007) AM_WRITE(nemesis_gfx_flipy_word_w)
AM_RANGE(0x05e008, 0x05e009) AM_WRITENOP /* not used irq */
AM_RANGE(0x05e00e, 0x05e00f) AM_WRITENOP /* not used irq */
AM_RANGE(0x060000, 0x067fff) AM_RAM AM_BASE(&ram) /* WORK RAM */
AM_RANGE(0x060000, 0x067fff) AM_RAM /* WORK RAM */
ADDRESS_MAP_END
static ADDRESS_MAP_START( gx400_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x00ffff) AM_ROM /* ROM BIOS */
AM_RANGE(0x010000, 0x01ffff) AM_RAM AM_BASE(&ram)
AM_RANGE(0x010000, 0x01ffff) AM_RAM
AM_RANGE(0x020000, 0x0287ff) AM_READWRITE(gx400_sharedram_word_r, gx400_sharedram_word_w)
AM_RANGE(0x030000, 0x03ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x050000, 0x050fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x050f80, 0x050fff) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x051000, 0x051fff) AM_WRITENOP /* used, but written to with 0's */
AM_RANGE(0x050000, 0x051fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x050f80, 0x050fff) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x052000, 0x052fff) AM_RAM_WRITE(nemesis_videoram1_word_w) AM_BASE(&nemesis_videoram1) /* VRAM */
AM_RANGE(0x053000, 0x053fff) AM_RAM_WRITE(nemesis_videoram2_word_w) AM_BASE(&nemesis_videoram2)
AM_RANGE(0x054000, 0x054fff) AM_RAM_WRITE(nemesis_colorram1_word_w) AM_BASE(&nemesis_colorram1)
@ -347,19 +343,18 @@ static ADDRESS_MAP_START( gx400_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x05e006, 0x05e007) AM_WRITE(nemesis_gfx_flipy_word_w)
AM_RANGE(0x05e008, 0x05e009) AM_WRITENOP /* IRQ acknowledge??? */
AM_RANGE(0x05e00e, 0x05e00f) AM_WRITE(&gx400_irq4_enable_word_w) /* ?? */
AM_RANGE(0x060000, 0x07ffff) AM_RAM AM_BASE(&ram2)
AM_RANGE(0x060000, 0x07ffff) AM_RAM /* WORK RAM */
AM_RANGE(0x080000, 0x0bffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( konamigt_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x040000, 0x04ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x050000, 0x050fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x050f80, 0x050fff) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x051000, 0x051fff) AM_WRITENOP /* used, but written to with 0's */
AM_RANGE(0x050000, 0x051fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x050f80, 0x050fff) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x052000, 0x052fff) AM_RAM_WRITE(nemesis_videoram1_word_w) AM_BASE(&nemesis_videoram1) /* VRAM */
AM_RANGE(0x053000, 0x053fff) AM_RAM_WRITE(nemesis_videoram2_word_w) AM_BASE(&nemesis_videoram2)
AM_RANGE(0x054000, 0x054fff) AM_RAM_WRITE(nemesis_colorram1_word_w) AM_BASE(&nemesis_colorram1)
@ -380,21 +375,20 @@ static ADDRESS_MAP_START( konamigt_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x05e006, 0x05e007) AM_WRITE(nemesis_gfx_flipy_word_w)
AM_RANGE(0x05e008, 0x05e009) AM_WRITENOP /* not used irq */
AM_RANGE(0x05e00e, 0x05e00f) AM_WRITENOP /* not used irq */
AM_RANGE(0x060000, 0x067fff) AM_RAM AM_BASE(&ram) /* WORK RAM */
AM_RANGE(0x060000, 0x067fff) AM_RAM /* WORK RAM */
AM_RANGE(0x070000, 0x070001) AM_READ(konamigt_input_word_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( rf2_gx400_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x00ffff) AM_ROM /* ROM BIOS */
AM_RANGE(0x010000, 0x01ffff) AM_RAM AM_BASE(&ram2)
AM_RANGE(0x010000, 0x01ffff) AM_RAM
AM_RANGE(0x020000, 0x0287ff) AM_READWRITE(gx400_sharedram_word_r, gx400_sharedram_word_w)
AM_RANGE(0x030000, 0x03ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x050000, 0x050fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x050f80, 0x050fff) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x051000, 0x051fff) AM_WRITENOP /* used, but written to with 0's */
AM_RANGE(0x050000, 0x051fff) AM_RAM
AM_RANGE(0x050000, 0x0503ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x050400, 0x0507ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x050f00, 0x050f7f) AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x050f80, 0x050fff) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x052000, 0x052fff) AM_RAM_WRITE(nemesis_videoram1_word_w) AM_BASE(&nemesis_videoram1) /* VRAM */
AM_RANGE(0x053000, 0x053fff) AM_RAM_WRITE(nemesis_videoram2_word_w) AM_BASE(&nemesis_videoram2)
AM_RANGE(0x054000, 0x054fff) AM_RAM_WRITE(nemesis_colorram1_word_w) AM_BASE(&nemesis_colorram1)
@ -415,7 +409,7 @@ static ADDRESS_MAP_START( rf2_gx400_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x05e006, 0x05e007) AM_WRITE(nemesis_gfx_flipy_word_w)
AM_RANGE(0x05e008, 0x05e009) AM_WRITE(SMH_NOP) /* IRQ acknowledge??? */
AM_RANGE(0x05e00e, 0x05e00f) AM_WRITE(&gx400_irq4_enable_word_w) /* ?? */
AM_RANGE(0x060000, 0x067fff) AM_RAM AM_BASE(&ram) /* WORK RAM */
AM_RANGE(0x060000, 0x067fff) AM_RAM /* WORK RAM */
AM_RANGE(0x070000, 0x070001) AM_READ(konamigt_input_word_r)
AM_RANGE(0x080000, 0x0bffff) AM_ROM
ADDRESS_MAP_END
@ -459,7 +453,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( salamand_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x080000, 0x087fff) AM_RAM AM_BASE(&ram)
AM_RANGE(0x080000, 0x087fff) AM_RAM
AM_RANGE(0x090000, 0x091fff) AM_RAM_WRITE(salamander_palette_word_w) AM_BASE(&paletteram16)
AM_RANGE(0x0a0000, 0x0a0001) AM_WRITE(salamand_control_port_word_w) /* irq enable, flipscreen, etc. */
AM_RANGE(0x0c0000, 0x0c0001) AM_WRITE(nemesis_soundlatch_word_w)
@ -476,16 +470,16 @@ static ADDRESS_MAP_START( salamand_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x120000, 0x12ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x180000, 0x180fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) /* more sprite ram ??? */
AM_RANGE(0x190000, 0x191fff) AM_RAM
AM_RANGE(0x190000, 0x1903ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x190400, 0x1907ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x190f00, 0x190f7f) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x190f80, 0x190fff) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x190000, 0x1903ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x190400, 0x1907ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x190f00, 0x190f7f) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x190f80, 0x190fff) AM_BASE(&nemesis_yscroll2)
ADDRESS_MAP_END
static ADDRESS_MAP_START( blkpnthr_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x080000, 0x081fff) AM_RAM_WRITE(salamander_palette_word_w) AM_BASE(&paletteram16)
AM_RANGE(0x090000, 0x097fff) AM_RAM AM_BASE(&ram)
AM_RANGE(0x090000, 0x097fff) AM_RAM
AM_RANGE(0x0a0000, 0x0a0001) AM_RAM AM_WRITE(salamand_control_port_word_w) /* irq enable, flipscreen, etc. */
AM_RANGE(0x0c0000, 0x0c0001) AM_WRITE(nemesis_soundlatch_word_w)
AM_RANGE(0x0c0002, 0x0c0003) AM_READ_PORT("DSW0")
@ -500,16 +494,16 @@ static ADDRESS_MAP_START( blkpnthr_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x103000, 0x103fff) AM_RAM_WRITE(nemesis_videoram2_word_w) AM_BASE(&nemesis_videoram2)
AM_RANGE(0x120000, 0x12ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x180000, 0x181fff) AM_RAM
AM_RANGE(0x180000, 0x1803ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x180400, 0x1807ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x180f00, 0x180f7f) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x180f80, 0x180fff) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x180000, 0x1803ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x180400, 0x1807ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x180f00, 0x180f7f) AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x180f80, 0x180fff) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x190000, 0x190fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) /* more sprite ram ??? */
ADDRESS_MAP_END
static ADDRESS_MAP_START( citybomb_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x01ffff) AM_ROM
AM_RANGE(0x080000, 0x087fff) AM_RAM AM_BASE(&ram)
AM_RANGE(0x080000, 0x087fff) AM_RAM
AM_RANGE(0x0e0000, 0x0e1fff) AM_RAM_WRITE(salamander_palette_word_w) AM_BASE(&paletteram16)
AM_RANGE(0x0f0000, 0x0f0001) AM_READ_PORT("DSW1")
AM_RANGE(0x0f0002, 0x0f0003) AM_READ_PORT("IN2")
@ -527,16 +521,16 @@ static ADDRESS_MAP_START( citybomb_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x212000, 0x212fff) AM_RAM_WRITE(nemesis_colorram1_word_w) AM_BASE(&nemesis_colorram1)
AM_RANGE(0x213000, 0x213fff) AM_RAM_WRITE(nemesis_colorram2_word_w) AM_BASE(&nemesis_colorram2)
AM_RANGE(0x300000, 0x301fff) AM_RAM
AM_RANGE(0x300000, 0x3003ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x300400, 0x3007ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x300f00, 0x300f7f) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x300f80, 0x300fff) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x300000, 0x3003ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x300400, 0x3007ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x300f00, 0x300f7f) AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x300f80, 0x300fff) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x310000, 0x310fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) /* more sprite ram ??? */
ADDRESS_MAP_END
static ADDRESS_MAP_START( nyanpani_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x01ffff) AM_ROM
AM_RANGE(0x040000, 0x047fff) AM_RAM AM_BASE(&ram)
AM_RANGE(0x040000, 0x047fff) AM_RAM
AM_RANGE(0x060000, 0x061fff) AM_RAM_WRITE(salamander_palette_word_w) AM_BASE(&paletteram16)
AM_RANGE(0x100000, 0x13ffff) AM_ROM
AM_RANGE(0x070000, 0x070001) AM_READ_PORT("DSW1")
@ -554,10 +548,10 @@ static ADDRESS_MAP_START( nyanpani_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x210000, 0x21ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x300000, 0x300fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) /* more sprite ram ??? */
AM_RANGE(0x310000, 0x311fff) AM_RAM
AM_RANGE(0x310000, 0x3103ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x310400, 0x3107ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x310f00, 0x310f7f) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x310f80, 0x310fff) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x310000, 0x3103ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x310400, 0x3107ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x310f00, 0x310f7f) AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x310f80, 0x310fff) AM_BASE(&nemesis_yscroll1)
ADDRESS_MAP_END
static READ8_HANDLER( wd_r )
@ -625,12 +619,11 @@ static ADDRESS_MAP_START( hcrash_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x103000, 0x103fff) AM_RAM_WRITE(nemesis_colorram1_word_w) AM_BASE(&nemesis_colorram1)
AM_RANGE(0x120000, 0x12ffff) AM_RAM_WRITE(nemesis_characterram_word_w) AM_BASE(&nemesis_characterram) AM_SIZE(&nemesis_characterram_size)
AM_RANGE(0x180000, 0x180fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
AM_RANGE(0x190000, 0x1903ff) AM_RAM AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x190400, 0x1907ff) AM_RAM AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x190800, 0x190eff) AM_RAM /* not used */
AM_RANGE(0x190f00, 0x190f7f) AM_RAM AM_BASE(&nemesis_yscroll2)
AM_RANGE(0x190f80, 0x190fff) AM_RAM AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x191000, 0x191fff) AM_RAM /* not used */
AM_RANGE(0x190000, 0x191fff) AM_RAM
AM_RANGE(0x190000, 0x1903ff) AM_BASE(&nemesis_xscroll2)
AM_RANGE(0x190400, 0x1907ff) AM_BASE(&nemesis_xscroll1)
AM_RANGE(0x190f00, 0x190f7f) AM_BASE(&nemesis_yscroll1)
AM_RANGE(0x190f80, 0x190fff) AM_BASE(&nemesis_yscroll2)
ADDRESS_MAP_END
/******************************************************************************/

View File

@ -1,6 +1,6 @@
/* based on driver from video/metro.c by Luca Elia */
/* modified by Eisuke Watanabe */
/* modified by Hau */
/***************************************************************************
@ -55,13 +55,10 @@ Note: if MAME_DEBUG is defined, pressing Z with:
***************************************************************************/
#include "driver.h"
#include "includes/hyprduel.h"
#define RASTER_LINES 262
#define FIRST_VISIBLE_LINE 0
#define LAST_VISIBLE_LINE 223
/* Variables that driver has access to: */
UINT16 *hyprduel_videoregs;
UINT16 *hyprduel_screenctrl;
UINT16 *hyprduel_tiletable;
@ -69,12 +66,14 @@ size_t hyprduel_tiletable_size;
UINT16 *hyprduel_vram_0,*hyprduel_vram_1,*hyprduel_vram_2;
UINT16 *hyprduel_window;
UINT16 hyprduel_scrollx[3][RASTER_LINES+1];
UINT16 hyprduel_scrolly[3][RASTER_LINES+1];
static UINT16 hyprduel_scrollx[3][RASTER_LINES+1];
static UINT16 hyprduel_scrolly[3][RASTER_LINES+1];
static UINT16 *hypr_tiletable_old;
static UINT8 *dirtyindex;
static int hyprduel_sprite_xoffs;
static int hyprduel_sprite_yoffs;
static int hyprduel_sprite_yoffs_magerror;
/***************************************************************************
Palette GGGGGRRRRRBBBBBx
@ -299,9 +298,6 @@ WRITE16_HANDLER( hyprduel_window_w )
the tile's sizes to be known at startup - which we don't!
*/
static int hyprduel_sprite_xoffs, hyprduel_sprite_yoffs;
static void alloc_empty_tiles(void)
{
int code,i;
@ -330,6 +326,22 @@ VIDEO_START( hyprduel_14220 )
tilemap_set_scrolldx(bg_tilemap[0], 0, 0);
tilemap_set_scrolldx(bg_tilemap[1], 0, 0);
tilemap_set_scrolldx(bg_tilemap[2], 0, 0);
if (!strcmp(machine->gamedrv->name, "magerror"))
hyprduel_sprite_yoffs_magerror = 2;
else
hyprduel_sprite_yoffs_magerror = 0;
/* Set up save state */
state_save_register_global_array(machine, hyprduel_scrollx[0]);
state_save_register_global_array(machine, hyprduel_scrollx[1]);
state_save_register_global_array(machine, hyprduel_scrollx[2]);
state_save_register_global_array(machine, hyprduel_scrolly[0]);
state_save_register_global_array(machine, hyprduel_scrolly[1]);
state_save_register_global_array(machine, hyprduel_scrolly[2]);
state_save_register_global(machine, hyprduel_sprite_xoffs);
state_save_register_global(machine, hyprduel_sprite_yoffs);
state_save_register_global(machine, hyprduel_sprite_yoffs_magerror);
}
/***************************************************************************
@ -361,7 +373,34 @@ VIDEO_START( hyprduel_14220 )
***************************************************************************/
WRITE16_HANDLER( hypr_scrollreg_w )
{
int i;
if (offset & 0x01)
{
for (i = rastersplit; i < RASTER_LINES; i++)
hyprduel_scrollx[offset>>1][i] = data;
} else {
for (i = rastersplit; i < RASTER_LINES; i++)
hyprduel_scrolly[offset>>1][i] = data;
}
}
WRITE16_HANDLER( hypr_scrollreg_init_w )
{
int i;
for (i = 0; i < RASTER_LINES; i++)
{
hyprduel_scrollx[0][i] = data;
hyprduel_scrollx[1][i] = data;
hyprduel_scrollx[2][i] = data;
hyprduel_scrolly[0][i] = data;
hyprduel_scrolly[1][i] = data;
hyprduel_scrolly[2][i] = data;
}
}
/***************************************************************************
@ -607,7 +646,7 @@ VIDEO_UPDATE( hyprduel )
}
hyprduel_sprite_xoffs = hyprduel_videoregs[0x06/2] - video_screen_get_width(screen) / 2;
hyprduel_sprite_yoffs = hyprduel_videoregs[0x04/2] - video_screen_get_height(screen) / 2;
hyprduel_sprite_yoffs = hyprduel_videoregs[0x04/2] - video_screen_get_height(screen) / 2 + hyprduel_sprite_yoffs_magerror;
/* The background color is selected by a register */
bitmap_fill(priority_bitmap,cliprect,0);

View File

@ -435,8 +435,8 @@ VIDEO_UPDATE( nemesis )
if (flipscreen)
offset_x = (offs + 0x20) & 0x3f;
tilemap_set_scrolly( background, offs, nemesis_yscroll1[offset_x] );
tilemap_set_scrolly( foreground, offs, nemesis_yscroll2[offset_x] );
tilemap_set_scrolly( background, offs, nemesis_yscroll2[offset_x] );
tilemap_set_scrolly( foreground, offs, nemesis_yscroll1[offset_x] );
}
for (offs = cliprect->min_y; offs <= cliprect->max_y; offs++)