diff --git a/src/mame/drivers/hyprduel.c b/src/mame/drivers/hyprduel.c index 8024ef86bd6..8da447a154c 100644 --- a/src/mame/drivers/hyprduel.c +++ b/src/mame/drivers/hyprduel.c @@ -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; icpu[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 ) diff --git a/src/mame/drivers/nemesis.c b/src/mame/drivers/nemesis.c index 4549683cd71..73e56f58ba2 100644 --- a/src/mame/drivers/nemesis.c +++ b/src/mame/drivers/nemesis.c @@ -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 /******************************************************************************/ diff --git a/src/mame/video/hyprduel.c b/src/mame/video/hyprduel.c index ef223d19c45..b81f7fdc40e 100644 --- a/src/mame/video/hyprduel.c +++ b/src/mame/video/hyprduel.c @@ -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); diff --git a/src/mame/video/nemesis.c b/src/mame/video/nemesis.c index 8a2e040b7c8..345aeb1e03f 100644 --- a/src/mame/video/nemesis.c +++ b/src/mame/video/nemesis.c @@ -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++)