From b7d6cf77c17b02cd6f13e738ff72dce8580cab98 Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Wed, 17 Mar 2010 16:38:26 +0000 Subject: [PATCH] metro.c: added driver data class [Fabio Priuli] vmetal: added driver data class and save states [Fabio Priuli] no save states in metro.c (yet) because some games like 3kokushi have serious glitches when loading a state. any help is welcome... --- .gitattributes | 1 + src/mame/drivers/metro.c | 2145 ++++++++++++++++++++----------------- src/mame/drivers/vmetal.c | 206 ++-- src/mame/includes/metro.h | 100 ++ src/mame/video/metro.c | 605 ++++++----- 5 files changed, 1666 insertions(+), 1391 deletions(-) create mode 100644 src/mame/includes/metro.h diff --git a/.gitattributes b/.gitattributes index 6e6c123dfef..aaf8da09e98 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2658,6 +2658,7 @@ src/mame/includes/megazone.h svneol=native#text/plain src/mame/includes/mermaid.h svneol=native#text/plain src/mame/includes/metalmx.h svneol=native#text/plain src/mame/includes/metlclsh.h svneol=native#text/plain +src/mame/includes/metro.h svneol=native#text/plain src/mame/includes/mexico86.h svneol=native#text/plain src/mame/includes/mhavoc.h svneol=native#text/plain src/mame/includes/micro3d.h svneol=native#text/plain diff --git a/src/mame/drivers/metro.c b/src/mame/drivers/metro.c index 59c1c88d1f3..fc1a3d42baa 100644 --- a/src/mame/drivers/metro.c +++ b/src/mame/drivers/metro.c @@ -87,44 +87,14 @@ driver modified by Eisuke Watanabe #include "cpu/m68000/m68000.h" #include "cpu/h83002/h8.h" #include "cpu/upd7810/upd7810.h" +#include "includes/metro.h" #include "machine/eeprom.h" -#include "video/konicdev.h" #include "sound/2610intf.h" #include "sound/2151intf.h" #include "sound/2413intf.h" #include "sound/okim6295.h" #include "sound/ymf278b.h" - -/* Variables defined in video: */ - -extern UINT16 *metro_videoregs; -extern UINT16 *metro_screenctrl; -extern UINT16 *metro_scroll; -extern UINT16 *metro_tiletable; -extern size_t metro_tiletable_size; -extern UINT16 *metro_vram_0, *metro_vram_1, *metro_vram_2; -extern UINT16 *metro_window; -extern UINT16 *metro_K053936_ram; -WRITE16_HANDLER( metro_K053936_w ); - - -/* Functions defined in video: */ - -WRITE16_HANDLER( metro_window_w ); - -WRITE16_HANDLER( metro_vram_0_w ); -WRITE16_HANDLER( metro_vram_1_w ); -WRITE16_HANDLER( metro_vram_2_w ); - - -VIDEO_START( metro_14100 ); -VIDEO_START( metro_14220 ); -VIDEO_START( metro_14300 ); -VIDEO_START( blzntrnd ); -VIDEO_START( gstrik2 ); - -VIDEO_UPDATE( metro ); - +#include "video/konicdev.h" /*************************************************************************** @@ -134,89 +104,82 @@ VIDEO_UPDATE( metro ); ***************************************************************************/ -static int irq_line, blitter_bit; - -static UINT8 requested_int[8]; - -static UINT16 *metro_irq_levels, *metro_irq_vectors, *metro_irq_enable; - static READ16_HANDLER( metro_irq_cause_r ) { - return requested_int[0] * 0x01 + // vblank - requested_int[1] * 0x02 + - requested_int[2] * 0x04 + // blitter - requested_int[3] * 0x08 + - requested_int[4] * 0x10 + - requested_int[5] * 0x20 + - requested_int[6] * 0x40 + // unused - requested_int[7] * 0x80 ; // unused + metro_state *state = (metro_state *)space->machine->driver_data; + + return state->requested_int[0] * 0x01 + // vblank + state->requested_int[1] * 0x02 + + state->requested_int[2] * 0x04 + // blitter + state->requested_int[3] * 0x08 + + state->requested_int[4] * 0x10 + + state->requested_int[5] * 0x20 + + state->requested_int[6] * 0x40 + // unused + state->requested_int[7] * 0x80 ; // unused } /* Update the IRQ state based on all possible causes */ -static void update_irq_state(running_machine *machine) +static void update_irq_state( running_machine *machine ) { - const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); + metro_state *state = (metro_state *)machine->driver_data; + const address_space *space = cpu_get_address_space(state->maincpu, ADDRESS_SPACE_PROGRAM); - /* Get the pending IRQs (only the enabled ones, e.g. where - irq_enable is *0*) */ - UINT16 irq = metro_irq_cause_r(space, 0, 0xffff) & ~*metro_irq_enable; + /* Get the pending IRQs (only the enabled ones, e.g. where irq_enable is *0*) */ + UINT16 irq = metro_irq_cause_r(space, 0, 0xffff) & ~*state->irq_enable; - if (irq_line == -1) /* mouja, gakusai, gakusai2, dokyusei, dokyusp */ + if (state->irq_line == -1) /* mouja, gakusai, gakusai2, dokyusei, dokyusp */ { - /* This is for games that supply an *IRQ Vector* on the data bus - together with an IRQ level for each possible IRQ source */ - + /* This is for games that supply an *IRQ Vector* on the data bus together with an IRQ level for each possible IRQ source */ UINT8 irq_level[8] = { 0 }; - int i = 0; + int i; + for (i = 0; i < 8; i++) - if (irq & (1 << i)) - irq_level[metro_irq_levels[i] & 7] = 1; + if (BIT(irq, i)) + irq_level[state->irq_levels[i] & 7] = 1; + for (i = 0; i < 8; i++) - cputag_set_input_line(machine, "maincpu", i, irq_level[i] ? ASSERT_LINE : CLEAR_LINE); + cpu_set_input_line(state->maincpu, i, irq_level[i] ? ASSERT_LINE : CLEAR_LINE); } else { - /* This is for games where every IRQ source generates the same - IRQ level. The interrupt service routine then reads the actual - source by peeking a register (metro_irq_cause_r) */ + /* This is for games where every IRQ source generates the same IRQ level. The interrupt service routine + then reads the actual source by peeking a register (metro_irq_cause_r) */ - int state = (irq ? ASSERT_LINE : CLEAR_LINE); - cputag_set_input_line(machine, "maincpu", irq_line, state); + int irq_state = (irq ? ASSERT_LINE : CLEAR_LINE); + cpu_set_input_line(state->maincpu, state->irq_line, irq_state); } } /* For games that supply an *IRQ Vector* on the data bus */ -static IRQ_CALLBACK(metro_irq_callback) +static IRQ_CALLBACK( metro_irq_callback ) { -// logerror("%s: irq callback returns %04X\n",cpuexec_describe_context(device->machine),metro_irq_vectors[int_level]); - return metro_irq_vectors[irqline] & 0xff; -} + metro_state *state = (metro_state *)device->machine->driver_data; -static MACHINE_RESET( metro ) -{ - if (irq_line == -1) - cpu_set_irq_callback(devtag_get_device(machine, "maincpu"), metro_irq_callback); + // logerror("%s: irq callback returns %04X\n", cpuexec_describe_context(device->machine), state->irq_vectors[int_level]); + return state->irq_vectors[irqline] & 0xff; } static WRITE16_HANDLER( metro_irq_cause_w ) { -//if (data & ~0x15) logerror("CPU #0 PC %06X : unknown bits of irqcause written: %04X\n",cpu_get_pc(space->cpu),data); + metro_state *state = (metro_state *)space->machine->driver_data; + + //if (data & ~0x15) logerror("CPU #0 PC %06X : unknown bits of irqcause written: %04X\n", cpu_get_pc(space->cpu), data); if (ACCESSING_BITS_0_7) { - data &= ~*metro_irq_enable; + data &= ~*state->irq_enable; - if (data & 0x01) requested_int[0] = 0; - if (data & 0x02) requested_int[1] = 0; // DAITORIDE, BALCUBE, KARATOUR, MOUJA - if (data & 0x04) requested_int[2] = 0; - if (data & 0x08) requested_int[3] = 0; // KARATOUR - if (data & 0x10) requested_int[4] = 0; - if (data & 0x20) requested_int[5] = 0; // KARATOUR, BLZNTRND - if (data & 0x40) requested_int[6] = 0; - if (data & 0x80) requested_int[7] = 0; + if (BIT(data, 0)) state->requested_int[0] = 0; + if (BIT(data, 1)) state->requested_int[1] = 0; // DAITORIDE, BALCUBE, KARATOUR, MOUJA + if (BIT(data, 2)) state->requested_int[2] = 0; + if (BIT(data, 3)) state->requested_int[3] = 0; // KARATOUR + if (BIT(data, 4)) state->requested_int[4] = 0; + if (BIT(data, 5)) state->requested_int[5] = 0; // KARATOUR, BLZNTRND + if (BIT(data, 6)) state->requested_int[6] = 0; + if (BIT(data, 7)) state->requested_int[7] = 0; } update_irq_state(space->machine); @@ -225,15 +188,17 @@ static WRITE16_HANDLER( metro_irq_cause_w ) static INTERRUPT_GEN( metro_interrupt ) { - switch ( cpu_getiloops(device) ) + metro_state *state = (metro_state *)device->machine->driver_data; + + switch (cpu_getiloops(device)) { case 0: - requested_int[0] = 1; + state->requested_int[0] = 1; update_irq_state(device->machine); break; default: - requested_int[4] = 1; + state->requested_int[4] = 1; update_irq_state(device->machine); break; } @@ -242,64 +207,76 @@ static INTERRUPT_GEN( metro_interrupt ) /* Lev 1. Lev 2 seems sound related */ static INTERRUPT_GEN( bangball_interrupt ) { - requested_int[0] = 1; // set scroll regs if a flag is set - requested_int[4] = 1; // clear that flag + metro_state *state = (metro_state *)device->machine->driver_data; + + state->requested_int[0] = 1; // set scroll regs if a flag is set + state->requested_int[4] = 1; // clear that flag update_irq_state(device->machine); } static TIMER_CALLBACK( vblank_end_callback ) { - requested_int[5] = param; + metro_state *state = (metro_state *)machine->driver_data; + state->requested_int[5] = param; } /* lev 2-7 (lev 1 seems sound related) */ static INTERRUPT_GEN( karatour_interrupt ) { - switch ( cpu_getiloops(device) ) + metro_state *state = (metro_state *)device->machine->driver_data; + + switch (cpu_getiloops(device)) { case 0: - requested_int[0] = 1; - requested_int[5] = 1; // write the scroll registers + state->requested_int[0] = 1; + state->requested_int[5] = 1; // write the scroll registers /* the duration is a guess */ timer_set(device->machine, ATTOTIME_IN_USEC(2500), NULL, 0, vblank_end_callback); update_irq_state(device->machine); break; default: - requested_int[4] = 1; + state->requested_int[4] = 1; update_irq_state(device->machine); break; } } -static emu_timer *mouja_irq_timer; static TIMER_CALLBACK( mouja_irq_callback ) { - requested_int[0] = 1; + metro_state *state = (metro_state *)machine->driver_data; + + state->requested_int[0] = 1; update_irq_state(machine); } static WRITE16_HANDLER( mouja_irq_timer_ctrl_w ) { + metro_state *state = (metro_state *)space->machine->driver_data; double freq = 58.0 + (0xff - (data & 0xff)) / 2.2; /* 0xff=58Hz, 0x80=116Hz? */ - timer_adjust_periodic(mouja_irq_timer, attotime_zero, 0, ATTOTIME_IN_HZ(freq)); + + timer_adjust_periodic(state->mouja_irq_timer, attotime_zero, 0, ATTOTIME_IN_HZ(freq)); } static INTERRUPT_GEN( mouja_interrupt ) { - requested_int[1] = 1; + metro_state *state = (metro_state *)device->machine->driver_data; + + state->requested_int[1] = 1; update_irq_state(device->machine); } static INTERRUPT_GEN( gakusai_interrupt ) { - switch ( cpu_getiloops(device) ) + metro_state *state = (metro_state *)device->machine->driver_data; + + switch (cpu_getiloops(device)) { case 0: - requested_int[1] = 1; + state->requested_int[1] = 1; update_irq_state(device->machine); break; } @@ -307,22 +284,25 @@ static INTERRUPT_GEN( gakusai_interrupt ) static INTERRUPT_GEN( dokyusei_interrupt ) { - switch ( cpu_getiloops(device) ) + metro_state *state = (metro_state *)device->machine->driver_data; + + switch (cpu_getiloops(device)) { case 0: - requested_int[1] = 1; + state->requested_int[1] = 1; update_irq_state(device->machine); break; case 1: // needed? - requested_int[5] = 1; + state->requested_int[5] = 1; update_irq_state(device->machine); break; } } -static void ymf278b_interrupt(running_device *device, int active) +static void ymf278b_interrupt( running_device *device, int active ) { - cputag_set_input_line(device->machine, "maincpu", 2, active); + metro_state *state = (metro_state *)device->machine->driver_data; + cpu_set_input_line(state->maincpu, 2, active); } /*************************************************************************** @@ -333,19 +313,16 @@ static void ymf278b_interrupt(running_device *device, int active) ***************************************************************************/ -static UINT16 metro_soundstatus; -static int porta, portb, busy_sndcpu; - -static int metro_io_callback(running_device *device, int ioline, int state) +static int metro_io_callback( running_device *device, int ioline, int state ) { - const address_space *space = cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM); - + metro_state *driver_state = (metro_state *)device->machine->driver_data; + const address_space *space = cpu_get_address_space(driver_state->maincpu, ADDRESS_SPACE_PROGRAM); UINT8 data = 0; - switch ( ioline ) + switch (ioline) { case UPD7810_RXD: /* read the RxD line */ - data = soundlatch_r(space,0); + data = soundlatch_r(space, 0); state = data & 1; soundlatch_w(space, 0, data >> 1); break; @@ -358,30 +335,36 @@ static int metro_io_callback(running_device *device, int ioline, int state) static WRITE16_HANDLER( metro_soundlatch_w ) { + metro_state *state = (metro_state *)space->machine->driver_data; + if (ACCESSING_BITS_0_7) { - soundlatch_w(space,0,data & 0xff); - cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); + soundlatch_w(space, 0, data & 0xff); + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); cpu_spinuntil_int(space->cpu); - busy_sndcpu = 1; + state->busy_sndcpu = 1; } } static READ16_HANDLER( metro_soundstatus_r ) { - return (busy_sndcpu ? 0x00 : 0x01); + metro_state *state = (metro_state *)space->machine->driver_data; + return (state->busy_sndcpu ? 0x00 : 0x01); } static CUSTOM_INPUT( custom_soundstatus_r ) { - return (busy_sndcpu ? 0x01 : 0x00); + metro_state *state = (metro_state *)field->port->machine->driver_data; + return (state->busy_sndcpu ? 0x01 : 0x00); } static WRITE16_HANDLER( metro_soundstatus_w ) { + metro_state *state = (metro_state *)space->machine->driver_data; + if (ACCESSING_BITS_0_7) - metro_soundstatus = data & 0x01; + state->soundstatus = data & 0x01; } @@ -410,12 +393,14 @@ static WRITE8_HANDLER( daitorid_sound_rombank_w ) static READ8_HANDLER( metro_porta_r ) { - return porta; + metro_state *state = (metro_state *)space->machine->driver_data; + return state->porta; } static WRITE8_HANDLER( metro_porta_w ) { - porta = data; + metro_state *state = (metro_state *)space->machine->driver_data; + state->porta = data; } static WRITE8_HANDLER( metro_portb_w ) @@ -431,31 +416,33 @@ static WRITE8_HANDLER( metro_portb_w ) 0 */ - if (BIT(portb,7) && !BIT(data,7)) /* clock 1->0 */ + metro_state *state = (metro_state *)space->machine->driver_data; + + if (BIT(state->portb, 7) && !BIT(data, 7)) /* clock 1->0 */ { - busy_sndcpu = 0; - portb = data; + state->busy_sndcpu = 0; + state->portb = data; return; } - if (BIT(portb,5) && !BIT(data,5)) /* clock 1->0 */ + if (BIT(state->portb, 5) && !BIT(data, 5)) /* clock 1->0 */ { - if (!BIT(data,2)) + if (!BIT(data, 2)) { - running_device *ym = devtag_get_device(space->machine, "ymsnd"); - ym2413_w(ym,BIT(data,1),porta); + ym2413_w(state->ymsnd, BIT(data, 1), state->porta); } - portb = data; + state->portb = data; return; } - if (BIT(portb,2) && !BIT(data,2)) /* clock 1->0 */ + if (BIT(state->portb, 2) && !BIT(data, 2)) /* clock 1->0 */ { /* write */ - if (!BIT(data,4)) - okim6295_w(devtag_get_device(space->machine, "oki"),0,porta); + if (!BIT(data, 4)) + okim6295_w(state->oki, 0, state->porta); } - portb = data; + + state->portb = data; } @@ -471,49 +458,54 @@ static WRITE8_HANDLER( daitorid_portb_w ) 1 select YM2151 register or data port 0 */ + metro_state *state = (metro_state *)space->machine->driver_data; - if (BIT(portb,7) && !BIT(data,7)) /* clock 1->0 */ + if (BIT(state->portb, 7) && !BIT(data, 7)) /* clock 1->0 */ { - busy_sndcpu = 0; - portb = data; + state->busy_sndcpu = 0; + state->portb = data; return; } - if (BIT(portb,6) && !BIT(data,6)) /* clock 1->0 */ + if (BIT(state->portb, 6) && !BIT(data, 6)) /* clock 1->0 */ { - running_device *ym = devtag_get_device(space->machine, "ymsnd"); - if (!BIT(data,2)) + if (!BIT(data, 2)) { /* write */ - ym2151_w(ym,BIT(data,1),porta); + ym2151_w(state->ymsnd, BIT(data, 1), state->porta); } - if (!BIT(data,3)) + + if (!BIT(data, 3)) { /* read */ - porta = ym2151_r(ym,BIT(data,1)); + state->porta = ym2151_r(state->ymsnd, BIT(data, 1)); } - portb = data; + + state->portb = data; return; } - if (BIT(portb,2) && !BIT(data,2)) /* clock 1->0 */ + if (BIT(state->portb, 2) && !BIT(data, 2)) /* clock 1->0 */ { /* write */ - if (!BIT(data,4)) - okim6295_w(devtag_get_device(space->machine, "oki"),0,porta); + if (!BIT(data, 4)) + okim6295_w(state->oki, 0, state->porta); } - if (BIT(portb,3) && !BIT(data,3)) /* clock 1->0 */ + + if (BIT(state->portb, 3) && !BIT(data, 3)) /* clock 1->0 */ { /* read */ - if (!BIT(data,4)) - porta = okim6295_r(devtag_get_device(space->machine, "oki"),0); + if (!BIT(data, 4)) + state->porta = okim6295_r(state->oki, 0); } - portb = data; + + state->portb = data; } -static void metro_sound_irq_handler(running_device *device, int state) +static void metro_sound_irq_handler( running_device *device, int state ) { - cputag_set_input_line(device->machine, "audiocpu", UPD7810_INTF2, state ? ASSERT_LINE : CLEAR_LINE); + metro_state *driver_state = (metro_state *)device->machine->driver_data; + cpu_set_input_line(driver_state->audiocpu, UPD7810_INTF2, state ? ASSERT_LINE : CLEAR_LINE); } static const ym2151_interface ym2151_config = @@ -545,14 +537,14 @@ static WRITE16_HANDLER( metro_coin_lockout_1word_w ) // coin_lockout_w(space->machine, 0, data & 1); // coin_lockout_w(space->machine, 1, data & 2); } - if (data & ~3) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n",cpu_get_pc(space->cpu),data); + if (data & ~3) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n", cpu_get_pc(space->cpu), data); } static WRITE16_HANDLER( metro_coin_lockout_4words_w ) { -// coin_lockout_w( space->machine, (offset >> 1) & 1, offset & 1 ); - if (data & ~1) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n",cpu_get_pc(space->cpu),data); +// coin_lockout_w(space->machine, (offset >> 1) & 1, offset & 1); + if (data & ~1) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n", cpu_get_pc(space->cpu), data); } @@ -574,17 +566,18 @@ static WRITE16_HANDLER( metro_coin_lockout_4words_w ) that the blitter can readily use (which is a form of compression) */ -static UINT16 *metro_rombank; - static READ16_HANDLER( metro_bankedrom_r ) { - UINT8 *ROM = memory_region( space->machine, "gfx1" ); - size_t len = memory_region_length( space->machine, "gfx1" ); + metro_state *state = (metro_state *)space->machine->driver_data; + UINT8 *ROM = memory_region(space->machine, "gfx1"); + size_t len = memory_region_length(space->machine, "gfx1"); - offset = offset * 2 + 0x10000 * (*metro_rombank); + offset = offset * 2 + 0x10000 * (*state->rombank); - if ( offset < len ) return ((ROM[offset+0]<<8)+ROM[offset+1]); - else return 0xffff; + if (offset < len) + return ((ROM[offset + 0] << 8) + ROM[offset + 1]); + else + return 0xffff; } @@ -636,161 +629,149 @@ static READ16_HANDLER( metro_bankedrom_r ) ***************************************************************************/ -static UINT16 *metro_blitter_regs; - static TIMER_CALLBACK( metro_blit_done ) { - requested_int[blitter_bit] = 1; + metro_state *state = (metro_state *)machine->driver_data; + state->requested_int[state->blitter_bit] = 1; update_irq_state(machine); } -INLINE int blt_read(const UINT8 *ROM, const int offs) +INLINE int blt_read( const UINT8 *ROM, const int offs ) { return ROM[offs]; } -INLINE void blt_write(const address_space *space, const int tmap, const offs_t offs, const UINT16 data, const UINT16 mask) +INLINE void blt_write( const address_space *space, const int tmap, const offs_t offs, const UINT16 data, const UINT16 mask ) { - switch( tmap ) + switch(tmap) { - case 1: metro_vram_0_w(space,offs,data,mask); break; - case 2: metro_vram_1_w(space,offs,data,mask); break; - case 3: metro_vram_2_w(space,offs,data,mask); break; + case 1: metro_vram_0_w(space, offs, data, mask); break; + case 2: metro_vram_1_w(space, offs, data, mask); break; + case 3: metro_vram_2_w(space, offs, data, mask); break; } -// logerror("%s : Blitter %X] %04X <- %04X & %04X\n",cpuexec_describe_context(space->machine),tmap,offs,data,mask); +// logerror("%s : Blitter %X] %04X <- %04X & %04X\n", cpuexec_describe_context(space->machine), tmap, offs, data, mask); } static WRITE16_HANDLER( metro_blitter_w ) { - COMBINE_DATA( &metro_blitter_regs[offset] ); + metro_state *state = (metro_state *)space->machine->driver_data; + COMBINE_DATA(&state->blitter_regs[offset]); - if (offset == 0xC/2) + if (offset == 0x0c / 2) { - UINT8 *src = memory_region(space->machine, "gfx1"); - size_t src_len = memory_region_length(space->machine, "gfx1"); + UINT8 *src = memory_region(space->machine, "gfx1"); + size_t src_len = memory_region_length(space->machine, "gfx1"); - UINT32 tmap = (metro_blitter_regs[ 0x00 / 2 ] << 16 ) + - metro_blitter_regs[ 0x02 / 2 ]; - UINT32 src_offs = (metro_blitter_regs[ 0x04 / 2 ] << 16 ) + - metro_blitter_regs[ 0x06 / 2 ]; - UINT32 dst_offs = (metro_blitter_regs[ 0x08 / 2 ] << 16 ) + - metro_blitter_regs[ 0x0a / 2 ]; + UINT32 tmap = (state->blitter_regs[0x00 / 2] << 16) + state->blitter_regs[0x02 / 2]; + UINT32 src_offs = (state->blitter_regs[0x04 / 2] << 16) + state->blitter_regs[0x06 / 2]; + UINT32 dst_offs = (state->blitter_regs[0x08 / 2] << 16) + state->blitter_regs[0x0a / 2]; - int shift = (dst_offs & 0x80) ? 0 : 8; - UINT16 mask = (dst_offs & 0x80) ? 0x00ff : 0xff00; + int shift = (dst_offs & 0x80) ? 0 : 8; + UINT16 mask = (dst_offs & 0x80) ? 0x00ff : 0xff00; -// logerror("CPU #0 PC %06X : Blitter regs %08X, %08X, %08X\n",cpu_get_pc(space->cpu),tmap,src_offs,dst_offs); +// logerror("CPU #0 PC %06X : Blitter regs %08X, %08X, %08X\n", cpu_get_pc(space->cpu), tmap, src_offs, dst_offs); - dst_offs >>= 7+1; - switch( tmap ) + dst_offs >>= 7 + 1; + switch (tmap) { case 1: case 2: case 3: break; default: - logerror("CPU #0 PC %06X : Blitter unknown destination: %08X\n",cpu_get_pc(space->cpu),tmap); + logerror("CPU #0 PC %06X : Blitter unknown destination: %08X\n", cpu_get_pc(space->cpu), tmap); return; } while (1) { - UINT16 b1,b2,count; + UINT16 b1, b2, count; src_offs %= src_len; - b1 = blt_read(src,src_offs); -// logerror("CPU #0 PC %06X : Blitter opcode %02X at %06X\n",cpu_get_pc(space->cpu),b1,src_offs); + b1 = blt_read(src, src_offs); +// logerror("CPU #0 PC %06X : Blitter opcode %02X at %06X\n", cpu_get_pc(space->cpu), b1, src_offs); src_offs++; count = ((~b1) & 0x3f) + 1; - switch( (b1 & 0xc0) >> 6 ) + switch ((b1 & 0xc0) >> 6) { - case 0: - - /* Stop and Generate an IRQ. We can't generate it now + case 0: + /* Stop and Generate an IRQ. We can't generate it now both because it's unlikely that the blitter is so fast and because some games (e.g. lastfort) need to complete the blitter irq service routine before doing another blit. */ - if (b1 == 0) - { - timer_set(space->machine, ATTOTIME_IN_USEC(500), NULL,0,metro_blit_done); - return; - } - - /* Copy */ - while (count--) - { - src_offs %= src_len; - b2 = blt_read(src,src_offs) << shift; - src_offs++; - - dst_offs &= 0xffff; - blt_write(space,tmap,dst_offs,b2,mask); - dst_offs = ((dst_offs+1) & (0x100-1)) | (dst_offs & (~(0x100-1))); - } - break; - - - case 1: - - /* Fill with an increasing value */ - src_offs %= src_len; - b2 = blt_read(src,src_offs); - src_offs++; - - while (count--) - { - dst_offs &= 0xffff; - blt_write(space,tmap,dst_offs,b2<> (7+1)); - } - else - { - dst_offs += count; - } - break; - - - default: - logerror("CPU #0 PC %06X : Blitter unknown opcode %02X at %06X\n",cpu_get_pc(space->cpu),b1,src_offs-1); + if (b1 == 0) + { + timer_set(space->machine, ATTOTIME_IN_USEC(500), NULL, 0, metro_blit_done); return; + } + + /* Copy */ + while (count--) + { + src_offs %= src_len; + b2 = blt_read(src, src_offs) << shift; + src_offs++; + + dst_offs &= 0xffff; + blt_write(space, tmap, dst_offs, b2, mask); + dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); + } + break; + + case 1: + /* Fill with an increasing value */ + src_offs %= src_len; + b2 = blt_read(src, src_offs); + src_offs++; + + while (count--) + { + dst_offs &= 0xffff; + blt_write(space, tmap, dst_offs, b2 << shift, mask); + dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); + b2++; + } + break; + + case 2: + /* Fill with a fixed value */ + src_offs %= src_len; + b2 = blt_read(src, src_offs) << shift; + src_offs++; + + while (count--) + { + dst_offs &= 0xffff; + blt_write(space, tmap, dst_offs, b2, mask); + dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); + } + break; + + case 3: + /* Skip to the next line ?? */ + if (b1 == 0xc0) + { + dst_offs += 0x100; + dst_offs &= ~(0x100 - 1); + dst_offs |= (0x100 - 1) & (state->blitter_regs[0x0a / 2] >> (7 + 1)); + } + else + { + dst_offs += count; + } + break; + + default: + logerror("CPU #0 PC %06X : Blitter unknown opcode %02X at %06X\n",cpu_get_pc(space->cpu),b1,src_offs-1); + return; } } } - } @@ -817,7 +798,7 @@ static ADDRESS_MAP_START( metro_sound_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_END static ADDRESS_MAP_START( metro_sound_io_map, ADDRESS_SPACE_IO, 8 ) - AM_RANGE(UPD7810_PORTA, UPD7810_PORTA) AM_READWRITE(metro_porta_r,metro_porta_w) + AM_RANGE(UPD7810_PORTA, UPD7810_PORTA) AM_READWRITE(metro_porta_r, metro_porta_w) AM_RANGE(UPD7810_PORTB, UPD7810_PORTB) AM_WRITE(metro_portb_w) AM_RANGE(UPD7810_PORTC, UPD7810_PORTC) AM_WRITE(metro_sound_rombank_w) ADDRESS_MAP_END @@ -826,7 +807,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( daitorid_sound_io_map, ADDRESS_SPACE_IO, 8 ) - AM_RANGE(UPD7810_PORTA, UPD7810_PORTA) AM_READWRITE(metro_porta_r,metro_porta_w) + AM_RANGE(UPD7810_PORTA, UPD7810_PORTA) AM_READWRITE(metro_porta_r, metro_porta_w) AM_RANGE(UPD7810_PORTB, UPD7810_PORTB) AM_WRITE(daitorid_portb_w) AM_RANGE(UPD7810_PORTC, UPD7810_PORTC) AM_WRITE(daitorid_sound_rombank_w) ADDRESS_MAP_END @@ -842,58 +823,58 @@ static READ16_HANDLER( balcube_dsw_r ) UINT16 dsw2 = input_port_read(space->machine, "DSW0") >> 8; UINT16 dsw3 = input_port_read(space->machine, "IN2"); - switch (offset*2) + switch (offset * 2) { - case 0x1FFFC: return ((dsw1 & 0x01) ? 0x40 : 0) | ((dsw3 & 0x01) ? 0x80 : 0); - case 0x1FFFA: return ((dsw1 & 0x02) ? 0x40 : 0) | ((dsw3 & 0x02) ? 0x80 : 0); - case 0x1FFF6: return ((dsw1 & 0x04) ? 0x40 : 0) | ((dsw3 & 0x04) ? 0x80 : 0); - case 0x1FFEE: return ((dsw1 & 0x08) ? 0x40 : 0) | ((dsw3 & 0x08) ? 0x80 : 0); - case 0x1FFDE: return ((dsw1 & 0x10) ? 0x40 : 0) | ((dsw3 & 0x10) ? 0x80 : 0); - case 0x1FFBE: return ((dsw1 & 0x20) ? 0x40 : 0) | ((dsw3 & 0x20) ? 0x80 : 0); - case 0x1FF7E: return ((dsw1 & 0x40) ? 0x40 : 0) | ((dsw3 & 0x40) ? 0x80 : 0); - case 0x1FEFE: return ((dsw1 & 0x80) ? 0x40 : 0) | ((dsw3 & 0x80) ? 0x80 : 0); + case 0x1FFFC: return (BIT(dsw1, 0) ? 0x40 : 0) | (BIT(dsw3, 0) ? 0x80 : 0); + case 0x1FFFA: return (BIT(dsw1, 1) ? 0x40 : 0) | (BIT(dsw3, 1) ? 0x80 : 0); + case 0x1FFF6: return (BIT(dsw1, 2) ? 0x40 : 0) | (BIT(dsw3, 2) ? 0x80 : 0); + case 0x1FFEE: return (BIT(dsw1, 3) ? 0x40 : 0) | (BIT(dsw3, 3) ? 0x80 : 0); + case 0x1FFDE: return (BIT(dsw1, 4) ? 0x40 : 0) | (BIT(dsw3, 4) ? 0x80 : 0); + case 0x1FFBE: return (BIT(dsw1, 5) ? 0x40 : 0) | (BIT(dsw3, 5) ? 0x80 : 0); + case 0x1FF7E: return (BIT(dsw1, 6) ? 0x40 : 0) | (BIT(dsw3, 6) ? 0x80 : 0); + case 0x1FEFE: return (BIT(dsw1, 7) ? 0x40 : 0) | (BIT(dsw3, 7) ? 0x80 : 0); - case 0x1FDFE: return (dsw2 & 0x01) ? 0x40 : 0; - case 0x1FBFE: return (dsw2 & 0x02) ? 0x40 : 0; - case 0x1F7FE: return (dsw2 & 0x04) ? 0x40 : 0; - case 0x1EFFE: return (dsw2 & 0x08) ? 0x40 : 0; - case 0x1DFFE: return (dsw2 & 0x10) ? 0x40 : 0; - case 0x1BFFE: return (dsw2 & 0x20) ? 0x40 : 0; - case 0x17FFE: return (dsw2 & 0x40) ? 0x40 : 0; - case 0x0FFFE: return (dsw2 & 0x80) ? 0x40 : 0; + case 0x1FDFE: return BIT(dsw2, 0) ? 0x40 : 0; + case 0x1FBFE: return BIT(dsw2, 1) ? 0x40 : 0; + case 0x1F7FE: return BIT(dsw2, 2) ? 0x40 : 0; + case 0x1EFFE: return BIT(dsw2, 3) ? 0x40 : 0; + case 0x1DFFE: return BIT(dsw2, 4) ? 0x40 : 0; + case 0x1BFFE: return BIT(dsw2, 5) ? 0x40 : 0; + case 0x17FFE: return BIT(dsw2, 6) ? 0x40 : 0; + case 0x0FFFE: return BIT(dsw2, 7) ? 0x40 : 0; } - logerror("CPU #0 PC %06X : unknown dsw address read: %04X\n",cpu_get_pc(space->cpu),offset); + logerror("CPU #0 PC %06X : unknown dsw address read: %04X\n", cpu_get_pc(space->cpu), offset); return 0xffff; } static ADDRESS_MAP_START( balcube_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM AM_RANGE(0x300000, 0x300001) AM_DEVREAD8("ymf", ymf278b_r, 0x00ff) // Sound AM_RANGE(0x300000, 0x30000b) AM_DEVWRITE8("ymf", ymf278b_w, 0x00ff) // Sound - AM_RANGE(0x400000, 0x41ffff) AM_READ(balcube_dsw_r) // DSW x 3 - AM_RANGE(0x500000, 0x500001) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0x500002, 0x500003) AM_READ_PORT("IN1") // - AM_RANGE(0x500006, 0x500007) AM_READNOP // + AM_RANGE(0x400000, 0x41ffff) AM_READ(balcube_dsw_r) // DSW x 3 + AM_RANGE(0x500000, 0x500001) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0x500002, 0x500003) AM_READ_PORT("IN1") // + AM_RANGE(0x500006, 0x500007) AM_READNOP // AM_RANGE(0x500002, 0x500009) AM_WRITE(metro_coin_lockout_4words_w) // Coin Lockout - AM_RANGE(0x600000, 0x61ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x620000, 0x63ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x640000, 0x65ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x660000, 0x66ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x600000, 0x61ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x620000, 0x63ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x640000, 0x65ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x660000, 0x66ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x670000, 0x673fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x674000, 0x674fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x678000, 0x6787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x678840, 0x67884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x678860, 0x67886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x678870, 0x67887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x678880, 0x678881) AM_WRITENOP // ? increasing - AM_RANGE(0x678890, 0x678891) AM_WRITENOP // ? increasing - AM_RANGE(0x6788a2, 0x6788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x6788a4, 0x6788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x6788aa, 0x6788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x6788ac, 0x6788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x679700, 0x679713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers + AM_RANGE(0x674000, 0x674fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x678000, 0x6787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x678840, 0x67884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x678860, 0x67886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x678870, 0x67887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x678880, 0x678881) AM_WRITENOP // ? increasing + AM_RANGE(0x678890, 0x678891) AM_WRITENOP // ? increasing + AM_RANGE(0x6788a2, 0x6788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x6788a4, 0x6788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x6788aa, 0x6788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x6788ac, 0x6788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x679700, 0x679713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers ADDRESS_MAP_END @@ -903,31 +884,31 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( daitoa_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM AM_RANGE(0x400000, 0x400001) AM_DEVREAD8("ymf", ymf278b_r, 0x00ff) // Sound AM_RANGE(0x400000, 0x40000b) AM_DEVWRITE8("ymf", ymf278b_w, 0x00ff) // Sound - AM_RANGE(0x300000, 0x31ffff) AM_READ(balcube_dsw_r) // DSW x 3 - AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0 ) // Layer 0 - AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1 ) // Layer 1 - AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2 ) // Layer 2 - AM_RANGE(0x160000, 0x16ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x300000, 0x31ffff) AM_READ(balcube_dsw_r) // DSW x 3 + AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x160000, 0x16ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x170000, 0x173fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x178840, 0x17884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x178860, 0x17886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x178870, 0x17887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x178880, 0x178881) AM_WRITENOP // ? increasing - AM_RANGE(0x178890, 0x178891) AM_WRITENOP // ? increasing - AM_RANGE(0x1788a2, 0x1788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x1788a4, 0x1788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x1788aa, 0x1788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x1788ac, 0x1788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x200000, 0x200001) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0x200002, 0x200003) AM_READ_PORT("IN1") // - AM_RANGE(0x200006, 0x200007) AM_READNOP // + AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x178840, 0x17884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x178860, 0x17886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x178870, 0x17887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x178880, 0x178881) AM_WRITENOP // ? increasing + AM_RANGE(0x178890, 0x178891) AM_WRITENOP // ? increasing + AM_RANGE(0x1788a2, 0x1788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x1788a4, 0x1788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x1788aa, 0x1788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x1788ac, 0x1788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x200000, 0x200001) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0x200002, 0x200003) AM_READ_PORT("IN1") // + AM_RANGE(0x200006, 0x200007) AM_READNOP // AM_RANGE(0x200002, 0x200009) AM_WRITE(metro_coin_lockout_4words_w) // Coin Lockout ADDRESS_MAP_END @@ -937,33 +918,33 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( bangball_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM - AM_RANGE(0xf10000, 0xf10fff) AM_RAM // RAM (bug in the ram test routine) + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM + AM_RANGE(0xf10000, 0xf10fff) AM_RAM // RAM (bug in the ram test routine) AM_RANGE(0xb00000, 0xb00001) AM_DEVREAD8("ymf", ymf278b_r, 0x00ff) // Sound AM_RANGE(0xb00000, 0xb0000b) AM_DEVWRITE8("ymf", ymf278b_w, 0x00ff) // Sound - AM_RANGE(0xc00000, 0xc1ffff) AM_READ(balcube_dsw_r) // DSW x 3 - AM_RANGE(0xd00000, 0xd00001) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0xd00002, 0xd00003) AM_READ_PORT("IN1") // - AM_RANGE(0xd00006, 0xd00007) AM_READNOP // + AM_RANGE(0xc00000, 0xc1ffff) AM_READ(balcube_dsw_r) // DSW x 3 + AM_RANGE(0xd00000, 0xd00001) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0xd00002, 0xd00003) AM_READ_PORT("IN1") // + AM_RANGE(0xd00006, 0xd00007) AM_READNOP // AM_RANGE(0xd00002, 0xd00009) AM_WRITE(metro_coin_lockout_4words_w) // Coin Lockout - AM_RANGE(0xe00000, 0xe1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0xe20000, 0xe3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0xe40000, 0xe5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0xe60000, 0xe6ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0xe00000, 0xe1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0xe20000, 0xe3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0xe40000, 0xe5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0xe60000, 0xe6ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0xe70000, 0xe73fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0xe74000, 0xe74fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0xe78000, 0xe787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0xe78840, 0xe7884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0xe78860, 0xe7886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0xe78870, 0xe7887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0xe78880, 0xe78881) AM_WRITENOP // ? increasing - AM_RANGE(0xe78890, 0xe78891) AM_WRITENOP // ? increasing - AM_RANGE(0xe788a2, 0xe788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0xe788a4, 0xe788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0xe788aa, 0xe788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0xe788ac, 0xe788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0xe79700, 0xe79713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers + AM_RANGE(0xe74000, 0xe74fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0xe78000, 0xe787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0xe78840, 0xe7884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0xe78860, 0xe7886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0xe78870, 0xe7887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0xe78880, 0xe78881) AM_WRITENOP // ? increasing + AM_RANGE(0xe78890, 0xe78891) AM_WRITENOP // ? increasing + AM_RANGE(0xe788a2, 0xe788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0xe788a4, 0xe788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0xe788aa, 0xe788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0xe788ac, 0xe788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0xe79700, 0xe79713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers ADDRESS_MAP_END @@ -972,34 +953,34 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( batlbubl_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM - AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x160000, 0x16ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM + AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x160000, 0x16ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x170000, 0x173fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x178840, 0x17884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x178860, 0x17886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x178870, 0x17887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x178880, 0x178881) AM_WRITENOP // ? increasing - AM_RANGE(0x178890, 0x178891) AM_WRITENOP // ? increasing - AM_RANGE(0x1788a2, 0x1788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x1788a4, 0x1788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x1788aa, 0x1788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x1788ac, 0x1788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers + AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x178840, 0x17884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x178860, 0x17886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x178870, 0x17887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x178880, 0x178881) AM_WRITENOP // ? increasing + AM_RANGE(0x178890, 0x178891) AM_WRITENOP // ? increasing + AM_RANGE(0x1788a2, 0x1788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x1788a4, 0x1788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x1788aa, 0x1788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x1788ac, 0x1788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers AM_RANGE(0x200000, 0x200001) AM_READ_PORT("IN1") AM_RANGE(0x200002, 0x200003) AM_READ_PORT("DSW0") AM_RANGE(0x200004, 0x200005) AM_READ_PORT("IN0") AM_RANGE(0x200006, 0x200007) AM_READ_PORT("IN2") AM_RANGE(0x200002, 0x200009) AM_WRITE(metro_coin_lockout_4words_w) // Coin Lockout - AM_RANGE(0x300000, 0x31ffff) AM_READ(balcube_dsw_r) // read but ignored? + AM_RANGE(0x300000, 0x31ffff) AM_READ(balcube_dsw_r) // read but ignored? AM_RANGE(0x400000, 0x400001) AM_DEVREAD8("ymf", ymf278b_r, 0x00ff) // Sound AM_RANGE(0x400000, 0x40000b) AM_DEVWRITE8("ymf", ymf278b_w, 0x00ff) // - AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM - AM_RANGE(0xf10000, 0xf10fff) AM_RAM // RAM (bug in the ram test routine) + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM + AM_RANGE(0xf10000, 0xf10fff) AM_RAM // RAM (bug in the ram test routine) ADDRESS_MAP_END @@ -1008,32 +989,32 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( msgogo_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x160000, 0x16ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x160000, 0x16ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x170000, 0x173fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x178840, 0x17884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x178860, 0x17886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x178870, 0x17887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x178880, 0x178881) AM_WRITENOP // ? increasing - AM_RANGE(0x178890, 0x178891) AM_WRITENOP // ? increasing - AM_RANGE(0x1788a2, 0x1788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x1788a4, 0x1788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x1788aa, 0x1788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x1788ac, 0x1788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x200000, 0x200001) AM_READ_PORT("COINS") // Inputs - AM_RANGE(0x200002, 0x200003) AM_READ_PORT("JOYS") // - AM_RANGE(0x200006, 0x200007) AM_READNOP // + AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x178840, 0x17884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x178860, 0x17886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x178870, 0x17887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x178880, 0x178881) AM_WRITENOP // ? increasing + AM_RANGE(0x178890, 0x178891) AM_WRITENOP // ? increasing + AM_RANGE(0x1788a2, 0x1788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x1788a4, 0x1788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x1788aa, 0x1788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x1788ac, 0x1788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x200000, 0x200001) AM_READ_PORT("COINS") // Inputs + AM_RANGE(0x200002, 0x200003) AM_READ_PORT("JOYS") // + AM_RANGE(0x200006, 0x200007) AM_READNOP // AM_RANGE(0x200002, 0x200009) AM_WRITE(metro_coin_lockout_4words_w) // Coin Lockout - AM_RANGE(0x300000, 0x31ffff) AM_READ(balcube_dsw_r) // 3 x DSW + AM_RANGE(0x300000, 0x31ffff) AM_READ(balcube_dsw_r) // 3 x DSW AM_RANGE(0x400000, 0x400001) AM_DEVREAD8("ymf", ymf278b_r, 0x00ff) // Sound AM_RANGE(0x400000, 0x40000b) AM_DEVWRITE8("ymf", ymf278b_w, 0x00ff) // - AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM ADDRESS_MAP_END /*************************************************************************** @@ -1041,27 +1022,27 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( daitorid_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0x800000, 0x80ffff) AM_RAM // RAM - AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0 ) // Layer 0 - AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1 ) // Layer 1 - AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2 ) // Layer 2 - AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0x800000, 0x80ffff) AM_RAM // RAM + AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x470000, 0x473fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x478870, 0x47887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x478880, 0x478881) AM_WRITENOP // ? increasing - AM_RANGE(0x478890, 0x478891) AM_WRITENOP // ? increasing - AM_RANGE(0x4788a2, 0x4788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x4788a4, 0x4788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x478870, 0x47887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x478880, 0x478881) AM_WRITENOP // ? increasing + AM_RANGE(0x478890, 0x478891) AM_WRITENOP // ? increasing + AM_RANGE(0x4788a2, 0x4788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x4788a4, 0x4788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0x4788a8, 0x4788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x4788aa, 0x4788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x4788ac, 0x4788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU + AM_RANGE(0x4788aa, 0x4788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x4788ac, 0x4788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU AM_RANGE(0xc00002, 0xc00003) AM_READ_PORT("IN1") AM_RANGE(0xc00004, 0xc00005) AM_READ_PORT("DSW0") AM_RANGE(0xc00006, 0xc00007) AM_READ_PORT("IN2") @@ -1074,27 +1055,27 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( dharma_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0x400000, 0x40ffff) AM_RAM // RAM - AM_RANGE(0x800000, 0x81ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0 ) // Layer 0 - AM_RANGE(0x820000, 0x83ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1 ) // Layer 1 - AM_RANGE(0x840000, 0x85ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2 ) // Layer 2 - AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0x400000, 0x40ffff) AM_RAM // RAM + AM_RANGE(0x800000, 0x81ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x820000, 0x83ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x840000, 0x85ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x870000, 0x873fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size ) // Tiles Set - AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window ) // Tilemap Window - AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing - AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing - AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing + AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing + AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0x8788a8, 0x8788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x879700, 0x879713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU + AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x879700, 0x879713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU AM_RANGE(0xc00002, 0xc00003) AM_READ_PORT("IN1") AM_RANGE(0xc00004, 0xc00005) AM_READ_PORT("DSW0") AM_RANGE(0xc00006, 0xc00007) AM_READ_PORT("IN2") @@ -1115,11 +1096,12 @@ ADDRESS_MAP_END #define KARATOUR_VRAM( _n_ ) \ static READ16_HANDLER( karatour_vram_##_n_##_r ) \ { \ - return metro_vram_##_n_[KARATOUR_OFFS(offset)]; \ + metro_state *state = (metro_state *)space->machine->driver_data; \ + return state->vram_##_n_[KARATOUR_OFFS(offset)]; \ } \ static WRITE16_HANDLER( karatour_vram_##_n_##_w ) \ { \ - metro_vram_##_n_##_w(space,KARATOUR_OFFS(offset),data,mem_mask); \ + metro_vram_##_n_##_w(space, KARATOUR_OFFS(offset), data, mem_mask); \ } KARATOUR_VRAM( 0 ) @@ -1127,33 +1109,33 @@ KARATOUR_VRAM( 1 ) KARATOUR_VRAM( 2 ) static ADDRESS_MAP_START( karatour_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0xffc000, 0xffffff) AM_RAM // RAM - AM_RANGE(0x400000, 0x400001) AM_READWRITE(metro_soundstatus_r,metro_soundstatus_w) // From Sound CPU - AM_RANGE(0x400002, 0x400003) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0x400002, 0x400003) AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout - AM_RANGE(0x400004, 0x400005) AM_READ_PORT("IN1") // - AM_RANGE(0x400006, 0x400007) AM_READ_PORT("DSW0") // - AM_RANGE(0x40000a, 0x40000b) AM_READ_PORT("DSW1") // - AM_RANGE(0x40000c, 0x40000d) AM_READ_PORT("IN2") // - AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0xffc000, 0xffffff) AM_RAM // RAM + AM_RANGE(0x400000, 0x400001) AM_READWRITE(metro_soundstatus_r, metro_soundstatus_w) // From Sound CPU + AM_RANGE(0x400002, 0x400003) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0x400002, 0x400003) AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout + AM_RANGE(0x400004, 0x400005) AM_READ_PORT("IN1") // + AM_RANGE(0x400006, 0x400007) AM_READ_PORT("DSW0") // + AM_RANGE(0x40000a, 0x40000b) AM_READ_PORT("DSW1") // + AM_RANGE(0x40000c, 0x40000d) AM_READ_PORT("IN2") // + AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x870000, 0x873fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x875000, 0x875fff) AM_READWRITE(karatour_vram_0_r,karatour_vram_0_w) // Layer 0 (Part of) - AM_RANGE(0x876000, 0x876fff) AM_READWRITE(karatour_vram_1_r,karatour_vram_1_w) // Layer 1 (Part of) - AM_RANGE(0x877000, 0x877fff) AM_READWRITE(karatour_vram_2_r,karatour_vram_2_w) // Layer 2 (Part of) - AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x878800, 0x878813) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing - AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing - AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x875000, 0x875fff) AM_READWRITE(karatour_vram_0_r, karatour_vram_0_w) // Layer 0 (Part of) + AM_RANGE(0x876000, 0x876fff) AM_READWRITE(karatour_vram_1_r, karatour_vram_1_w) // Layer 1 (Part of) + AM_RANGE(0x877000, 0x877fff) AM_READWRITE(karatour_vram_2_r, karatour_vram_2_w) // Layer 2 (Part of) + AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x878800, 0x878813) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing + AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing + AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0x8788a8, 0x8788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control + AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control ADDRESS_MAP_END @@ -1164,28 +1146,28 @@ ADDRESS_MAP_END /* same limited tilemap access as karatour */ static ADDRESS_MAP_START( kokushi_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0x7fc000, 0x7fffff) AM_RAM // RAM - AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0x7fc000, 0x7fffff) AM_RAM // RAM + AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x870000, 0x873fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x875000, 0x875fff) AM_READWRITE(karatour_vram_0_r,karatour_vram_0_w) // Layer 0 (Part of) - AM_RANGE(0x876000, 0x876fff) AM_READWRITE(karatour_vram_1_r,karatour_vram_1_w) // Layer 1 (Part of) - AM_RANGE(0x877000, 0x877fff) AM_READWRITE(karatour_vram_2_r,karatour_vram_2_w) // Layer 2 (Part of) - AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - WRONG -// AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing - AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing - AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x8788a8, 0x8788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x879700, 0x879713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers + AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x875000, 0x875fff) AM_READWRITE(karatour_vram_0_r, karatour_vram_0_w) // Layer 0 (Part of) + AM_RANGE(0x876000, 0x876fff) AM_READWRITE(karatour_vram_1_r, karatour_vram_1_w) // Layer 1 (Part of) + AM_RANGE(0x877000, 0x877fff) AM_READWRITE(karatour_vram_2_r, karatour_vram_2_w) // Layer 2 (Part of) + AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs - WRONG +// AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing + AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing + AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x8788a8, 0x8788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU + AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x879700, 0x879713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers AM_RANGE(0xc00000, 0xc00001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU - AM_RANGE(0xc00002, 0xc00003) AM_READ_PORT("IN1") // Inputs + AM_RANGE(0xc00002, 0xc00003) AM_READ_PORT("IN1") // Inputs AM_RANGE(0xc00004, 0xc00005) AM_READ_PORT("DSW0") AM_RANGE(0xc00002, 0xc00009) AM_WRITE(metro_coin_lockout_4words_w ) // Coin Lockout ADDRESS_MAP_END @@ -1196,67 +1178,67 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( lastfort_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0x400000, 0x40ffff) AM_RAM // RAM - AM_RANGE(0x800000, 0x81ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x820000, 0x83ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x840000, 0x85ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0x400000, 0x40ffff) AM_RAM // RAM + AM_RANGE(0x800000, 0x81ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x820000, 0x83ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x840000, 0x85ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x870000, 0x873fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x878800, 0x878813) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing - AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing - AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x878800, 0x878813) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing + AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing + AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0x8788a8, 0x8788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0xc00000, 0xc00001) AM_READWRITE(metro_soundstatus_r,metro_soundstatus_w) // From / To Sound CPU - AM_RANGE(0xc00002, 0xc00003) AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout - AM_RANGE(0xc00004, 0xc00005) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0xc00006, 0xc00007) AM_READ_PORT("IN1") // - AM_RANGE(0xc00008, 0xc00009) AM_READ_PORT("IN2") // - AM_RANGE(0xc0000a, 0xc0000b) AM_READ_PORT("DSW0") // - AM_RANGE(0xc0000c, 0xc0000d) AM_READ_PORT("DSW1") // - AM_RANGE(0xc0000e, 0xc0000f) AM_READ_PORT("IN3") // + AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0xc00000, 0xc00001) AM_READWRITE(metro_soundstatus_r, metro_soundstatus_w) // From / To Sound CPU + AM_RANGE(0xc00002, 0xc00003) AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout + AM_RANGE(0xc00004, 0xc00005) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0xc00006, 0xc00007) AM_READ_PORT("IN1") // + AM_RANGE(0xc00008, 0xc00009) AM_READ_PORT("IN2") // + AM_RANGE(0xc0000a, 0xc0000b) AM_READ_PORT("DSW0") // + AM_RANGE(0xc0000c, 0xc0000d) AM_READ_PORT("DSW1") // + AM_RANGE(0xc0000e, 0xc0000f) AM_READ_PORT("IN3") // ADDRESS_MAP_END /* the German version is halfway between lastfort and ladykill (karatour) memory maps */ /* todo: clean up input reads etc. */ static ADDRESS_MAP_START( lastforg_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0x400000, 0x400001) AM_READWRITE(metro_soundstatus_r,metro_soundstatus_w) // From / To Sound CPU - AM_RANGE(0x400002, 0x400003) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0x400002, 0x400003) AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout - AM_RANGE(0x400004, 0x400005) AM_READ_PORT("IN1") // - AM_RANGE(0x400006, 0x400007) AM_READ_PORT("DSW0") // - AM_RANGE(0x40000a, 0x40000b) AM_READ_PORT("DSW1") // - AM_RANGE(0x40000c, 0x40000d) AM_READ_PORT("IN2") // - AM_RANGE(0x880000, 0x89ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x8a0000, 0x8bffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x8c0000, 0x8dffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x8e0000, 0x8effff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0x400000, 0x400001) AM_READWRITE(metro_soundstatus_r, metro_soundstatus_w) // From / To Sound CPU + AM_RANGE(0x400002, 0x400003) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0x400002, 0x400003) AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout + AM_RANGE(0x400004, 0x400005) AM_READ_PORT("IN1") // + AM_RANGE(0x400006, 0x400007) AM_READ_PORT("DSW0") // + AM_RANGE(0x40000a, 0x40000b) AM_READ_PORT("DSW1") // + AM_RANGE(0x40000c, 0x40000d) AM_READ_PORT("IN2") // + AM_RANGE(0x880000, 0x89ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x8a0000, 0x8bffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x8c0000, 0x8dffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x8e0000, 0x8effff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x8f0000, 0x8f3fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x8f4000, 0x8f4fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x8f8000, 0x8f87ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x8f8800, 0x8f8813) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x8f8840, 0x8f884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x8f8860, 0x8f886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x8f8870, 0x8f887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x8f8880, 0x8f8881) AM_WRITENOP // ? increasing - AM_RANGE(0x8f8890, 0x8f8891) AM_WRITENOP // ? increasing - AM_RANGE(0x8f88a2, 0x8f88a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x8f88a4, 0x8f88a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0x8f4000, 0x8f4fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x8f8000, 0x8f87ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x8f8800, 0x8f8813) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x8f8840, 0x8f884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x8f8860, 0x8f886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x8f8870, 0x8f887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x8f8880, 0x8f8881) AM_WRITENOP // ? increasing + AM_RANGE(0x8f8890, 0x8f8891) AM_WRITENOP // ? increasing + AM_RANGE(0x8f88a2, 0x8f88a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x8f88a4, 0x8f88a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0x8f88a8, 0x8f88a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x8f88aa, 0x8f88ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x8f88ac, 0x8f88ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0xc00000, 0xc0ffff) AM_RAM // RAM + AM_RANGE(0x8f88aa, 0x8f88ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x8f88ac, 0x8f88ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0xc00000, 0xc0ffff) AM_RAM // RAM ADDRESS_MAP_END @@ -1264,37 +1246,40 @@ ADDRESS_MAP_END Mahjong Gakuensai ***************************************************************************/ -static int gakusai_oki_bank_lo, gakusai_oki_bank_hi; - static void gakusai_oki_bank_set(running_device *device) { - int bank = (gakusai_oki_bank_lo & 7) + (gakusai_oki_bank_hi & 1) * 8; + metro_state *state = (metro_state *)device->machine->driver_data; + int bank = (state->gakusai_oki_bank_lo & 7) + (state->gakusai_oki_bank_hi & 1) * 8; okim6295_set_bank_base(device, bank * 0x40000); } static WRITE16_DEVICE_HANDLER( gakusai_oki_bank_hi_w ) { + metro_state *state = (metro_state *)device->machine->driver_data; + if (ACCESSING_BITS_0_7) { - gakusai_oki_bank_hi = data & 0xff; + state->gakusai_oki_bank_hi = data & 0xff; gakusai_oki_bank_set(device); } } static WRITE16_DEVICE_HANDLER( gakusai_oki_bank_lo_w ) { + metro_state *state = (metro_state *)device->machine->driver_data; + if (ACCESSING_BITS_0_7) { - gakusai_oki_bank_lo = data & 0xff; + state->gakusai_oki_bank_lo = data & 0xff; gakusai_oki_bank_set(device); } } -static UINT16 *gakusai_input_sel; static READ16_HANDLER( gakusai_input_r ) { - UINT16 input_sel = (*gakusai_input_sel) ^ 0x3e; + metro_state *state = (metro_state *)space->machine->driver_data; + UINT16 input_sel = (*state->input_sel) ^ 0x3e; // Bit 0 ?? if (input_sel & 0x0002) return input_port_read(space->machine, "KEY0"); if (input_sel & 0x0004) return input_port_read(space->machine, "KEY1"); @@ -1314,45 +1299,45 @@ static WRITE16_DEVICE_HANDLER( gakusai_eeprom_w ) if (ACCESSING_BITS_0_7) { // latch the bit - eeprom_write_bit(device, data & 0x01); + eeprom_write_bit(device, BIT(data, 0)); // reset line asserted: reset. - eeprom_set_cs_line(device, (data & 0x04) ? CLEAR_LINE : ASSERT_LINE ); + eeprom_set_cs_line(device, BIT(data, 2) ? CLEAR_LINE : ASSERT_LINE ); // clock line asserted: write latch or select next bit to read - eeprom_set_clock_line(device, (data & 0x02) ? ASSERT_LINE : CLEAR_LINE ); + eeprom_set_clock_line(device, BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE ); } } static ADDRESS_MAP_START( gakusai_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM - AM_RANGE(0x200000, 0x21ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x220000, 0x23ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x240000, 0x25ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x260000, 0x26ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM + AM_RANGE(0x200000, 0x21ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x220000, 0x23ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x240000, 0x25ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x260000, 0x26ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x270000, 0x273fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x274000, 0x274fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x278000, 0x2787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x27880e, 0x27880f) AM_RAM AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x278810, 0x27881f) AM_WRITEONLY AM_BASE(&metro_irq_levels) // IRQ Levels - AM_RANGE(0x278820, 0x27882f) AM_WRITEONLY AM_BASE(&metro_irq_vectors) // IRQ Vectors - AM_RANGE(0x278830, 0x278831) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x278832, 0x278833) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x274000, 0x274fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x278000, 0x2787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x27880e, 0x27880f) AM_RAM AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x278810, 0x27881f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_levels) // IRQ Levels + AM_RANGE(0x278820, 0x27882f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_vectors) // IRQ Vectors + AM_RANGE(0x278830, 0x278831) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x278832, 0x278833) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge AM_RANGE(0x278880, 0x278881) AM_READ(gakusai_input_r) // Inputs - AM_RANGE(0x278882, 0x278883) AM_READ_PORT("IN0") // + AM_RANGE(0x278882, 0x278883) AM_READ_PORT("IN0") // AM_RANGE(0x278836, 0x278837) AM_WRITE(watchdog_reset16_w) // Watchdog - AM_RANGE(0x278840, 0x27884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x278860, 0x27886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x278850, 0x27885b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0x278870, 0x278871) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x278888, 0x278889) AM_WRITEONLY AM_BASE(&gakusai_input_sel) // Inputs - AM_RANGE(0x279700, 0x279713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x400000, 0x400001) AM_WRITENOP // ? 5 - AM_RANGE(0x500000, 0x500001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Sound + AM_RANGE(0x278840, 0x27884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x278860, 0x27886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x278850, 0x27885b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0x278870, 0x278871) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x278888, 0x278889) AM_WRITEONLY AM_BASE_MEMBER(metro_state, input_sel) // Inputs + AM_RANGE(0x279700, 0x279713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x400000, 0x400001) AM_WRITENOP // ? 5 + AM_RANGE(0x500000, 0x500001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Sound AM_RANGE(0x600000, 0x600003) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0x700000, 0x700001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0x00ff) // Sound - AM_RANGE(0xc00000, 0xc00001) AM_DEVREADWRITE("eeprom", gakusai_eeprom_r,gakusai_eeprom_w) // EEPROM + AM_RANGE(0x700000, 0x700001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0x00ff) // Sound + AM_RANGE(0xc00000, 0xc00001) AM_DEVREADWRITE("eeprom", gakusai_eeprom_r, gakusai_eeprom_w) // EEPROM AM_RANGE(0xd00000, 0xd00001) AM_DEVWRITE("oki", gakusai_oki_bank_hi_w) ADDRESS_MAP_END @@ -1362,34 +1347,34 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( gakusai2_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM - AM_RANGE(0x600000, 0x61ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x620000, 0x63ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x640000, 0x65ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x660000, 0x66ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM + AM_RANGE(0x600000, 0x61ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x620000, 0x63ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x640000, 0x65ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x660000, 0x66ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x670000, 0x673fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x674000, 0x674fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x675000, 0x675fff) AM_RAM // Sprites? - AM_RANGE(0x678000, 0x6787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x67880e, 0x67880f) AM_RAM AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x678810, 0x67881f) AM_WRITEONLY AM_BASE(&metro_irq_levels) // IRQ Levels - AM_RANGE(0x678820, 0x67882f) AM_WRITEONLY AM_BASE(&metro_irq_vectors) // IRQ Vectors - AM_RANGE(0x678830, 0x678831) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x678832, 0x678833) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x674000, 0x674fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x675000, 0x675fff) AM_RAM // Sprites? + AM_RANGE(0x678000, 0x6787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x67880e, 0x67880f) AM_RAM AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x678810, 0x67881f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_levels) // IRQ Levels + AM_RANGE(0x678820, 0x67882f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_vectors) // IRQ Vectors + AM_RANGE(0x678830, 0x678831) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x678832, 0x678833) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge AM_RANGE(0x678836, 0x678837) AM_WRITE(watchdog_reset16_w) // Watchdog - AM_RANGE(0x678840, 0x67884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x678860, 0x67886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window + AM_RANGE(0x678840, 0x67884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x678860, 0x67886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window AM_RANGE(0x678880, 0x678881) AM_READ(gakusai_input_r) // Inputs - AM_RANGE(0x678882, 0x678883) AM_READ_PORT("IN0") // - AM_RANGE(0x678850, 0x67885b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0x678870, 0x678871) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x678888, 0x678889) AM_WRITEONLY AM_BASE(&gakusai_input_sel) // Inputs - AM_RANGE(0x679700, 0x679713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x800000, 0x800001) AM_WRITENOP // ? 5 - AM_RANGE(0x900000, 0x900001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Sound bank + AM_RANGE(0x678882, 0x678883) AM_READ_PORT("IN0") // + AM_RANGE(0x678850, 0x67885b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0x678870, 0x678871) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x678888, 0x678889) AM_WRITEONLY AM_BASE_MEMBER(metro_state, input_sel) // Inputs + AM_RANGE(0x679700, 0x679713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x800000, 0x800001) AM_WRITENOP // ? 5 + AM_RANGE(0x900000, 0x900001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Sound bank AM_RANGE(0xa00000, 0xa00001) AM_DEVWRITE("oki", gakusai_oki_bank_hi_w) - AM_RANGE(0xb00000, 0xb00001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0x00ff) // Sound + AM_RANGE(0xb00000, 0xb00001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0x00ff) // Sound AM_RANGE(0xc00000, 0xc00003) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE("eeprom", gakusai_eeprom_r,gakusai_eeprom_w) // EEPROM ADDRESS_MAP_END @@ -1413,7 +1398,7 @@ static WRITE16_DEVICE_HANDLER( dokyusp_eeprom_bit_w ) if (ACCESSING_BITS_0_7) { // latch the bit - eeprom_write_bit(device, data & 0x01); + eeprom_write_bit(device, BIT(data, 0)); // clock line asserted: write latch or select next bit to read eeprom_set_clock_line(device, CLEAR_LINE); @@ -1426,40 +1411,40 @@ static WRITE16_DEVICE_HANDLER( dokyusp_eeprom_reset_w ) if (ACCESSING_BITS_0_7) { // reset line asserted: reset. - eeprom_set_cs_line(device, (data & 0x01) ? CLEAR_LINE : ASSERT_LINE); + eeprom_set_cs_line(device, BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); } } static ADDRESS_MAP_START( dokyusp_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM - AM_RANGE(0x200000, 0x21ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x220000, 0x23ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x240000, 0x25ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x260000, 0x26ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM + AM_RANGE(0x200000, 0x21ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x220000, 0x23ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x240000, 0x25ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x260000, 0x26ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x270000, 0x273fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x274000, 0x274fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x278000, 0x2787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x278810, 0x27881f) AM_WRITEONLY AM_BASE(&metro_irq_levels) // IRQ Levels - AM_RANGE(0x278820, 0x27882f) AM_WRITEONLY AM_BASE(&metro_irq_vectors) // IRQ Vectors - AM_RANGE(0x278830, 0x278831) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x278832, 0x278833) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x274000, 0x274fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x278000, 0x2787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x278810, 0x27881f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_levels) // IRQ Levels + AM_RANGE(0x278820, 0x27882f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_vectors) // IRQ Vectors + AM_RANGE(0x278830, 0x278831) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x278832, 0x278833) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge AM_RANGE(0x278836, 0x278837) AM_WRITE(watchdog_reset16_w) // Watchdog - AM_RANGE(0x278840, 0x27884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x278860, 0x27886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x278850, 0x27885b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0x278870, 0x278871) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank + AM_RANGE(0x278840, 0x27884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x278860, 0x27886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x278850, 0x27885b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0x278870, 0x278871) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank AM_RANGE(0x278880, 0x278881) AM_READ(gakusai_input_r) // Inputs - AM_RANGE(0x278882, 0x278883) AM_READ_PORT("IN0") // - AM_RANGE(0x278888, 0x278889) AM_WRITEONLY AM_BASE(&gakusai_input_sel) // Inputs - AM_RANGE(0x27880e, 0x27880f) AM_RAM AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x279700, 0x279713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x400000, 0x400001) AM_WRITENOP // ? 5 - AM_RANGE(0x500000, 0x500001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Sound + AM_RANGE(0x278882, 0x278883) AM_READ_PORT("IN0") // + AM_RANGE(0x278888, 0x278889) AM_WRITEONLY AM_BASE_MEMBER(metro_state, input_sel) // Inputs + AM_RANGE(0x27880e, 0x27880f) AM_RAM AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x279700, 0x279713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x400000, 0x400001) AM_WRITENOP // ? 5 + AM_RANGE(0x500000, 0x500001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Sound AM_RANGE(0x600000, 0x600003) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0x700000, 0x700001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0x00ff) // Sound - AM_RANGE(0xc00000, 0xc00001) AM_DEVWRITE("eeprom", dokyusp_eeprom_reset_w) // EEPROM - AM_RANGE(0xd00000, 0xd00001) AM_DEVREADWRITE("eeprom", dokyusp_eeprom_r,dokyusp_eeprom_bit_w) // EEPROM + AM_RANGE(0x700000, 0x700001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff) // Sound + AM_RANGE(0xc00000, 0xc00001) AM_DEVWRITE("eeprom", dokyusp_eeprom_reset_w) // EEPROM + AM_RANGE(0xd00000, 0xd00001) AM_DEVREADWRITE("eeprom", dokyusp_eeprom_r, dokyusp_eeprom_bit_w) // EEPROM ADDRESS_MAP_END @@ -1468,38 +1453,38 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( dokyusei_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM - AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM - AM_RANGE(0x460000, 0x46ffff) AM_WRITENOP // DSW Selection + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM + AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x460000, 0x46ffff) AM_WRITENOP // DSW Selection AM_RANGE(0x470000, 0x473fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x47880e, 0x47880f) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x478810, 0x47881f) AM_WRITEONLY AM_BASE(&metro_irq_levels) // IRQ Levels - AM_RANGE(0x478820, 0x47882f) AM_WRITEONLY AM_BASE(&metro_irq_vectors) // IRQ Vectors - AM_RANGE(0x478830, 0x478831) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable -// AM_RANGE(0x478832, 0x478833) AM_READ(metro_irq_cause_r) // IRQ Cause + AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x47880e, 0x47880f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x478810, 0x47881f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_levels) // IRQ Levels + AM_RANGE(0x478820, 0x47882f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_vectors) // IRQ Vectors + AM_RANGE(0x478830, 0x478831) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable +// AM_RANGE(0x478832, 0x478833) AM_READ(metro_irq_cause_r) // IRQ Cause AM_RANGE(0x478832, 0x478833) AM_WRITE(metro_irq_cause_w) // IRQ Acknowledge - AM_RANGE(0x478836, 0x478837) AM_WRITENOP // ? watchdog ? - AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x478850, 0x47885b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x478870, 0x478871) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x478888, 0x478889) AM_WRITEONLY AM_BASE(&gakusai_input_sel) // Inputs + AM_RANGE(0x478836, 0x478837) AM_WRITENOP // ? watchdog ? + AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x478850, 0x47885b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x478870, 0x478871) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x478888, 0x478889) AM_WRITEONLY AM_BASE_MEMBER(metro_state, input_sel) // Inputs AM_RANGE(0x478880, 0x478881) AM_READ(gakusai_input_r) // Inputs - AM_RANGE(0x478882, 0x478883) AM_READ_PORT("IN0") // - AM_RANGE(0x478884, 0x478885) AM_READ_PORT("DSW0") // 2 x DSW - AM_RANGE(0x478886, 0x478887) AM_READ_PORT("DSW1") // - AM_RANGE(0x800000, 0x800001) AM_DEVWRITE("oki", gakusai_oki_bank_hi_w) // Samples Bank? - AM_RANGE(0x900000, 0x900001) AM_WRITENOP // ? 4 - AM_RANGE(0xa00000, 0xa00001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Samples Bank + AM_RANGE(0x478882, 0x478883) AM_READ_PORT("IN0") // + AM_RANGE(0x478884, 0x478885) AM_READ_PORT("DSW0") // 2 x DSW + AM_RANGE(0x478886, 0x478887) AM_READ_PORT("DSW1") // + AM_RANGE(0x800000, 0x800001) AM_DEVWRITE("oki", gakusai_oki_bank_hi_w) // Samples Bank? + AM_RANGE(0x900000, 0x900001) AM_WRITENOP // ? 4 + AM_RANGE(0xa00000, 0xa00001) AM_DEVWRITE("oki", gakusai_oki_bank_lo_w) // Samples Bank AM_RANGE(0xc00000, 0xc00003) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) // - AM_RANGE(0xd00000, 0xd00001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0x00ff) // Sound + AM_RANGE(0xd00000, 0xd00001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff) // Sound ADDRESS_MAP_END @@ -1508,34 +1493,34 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( pangpoms_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0xc00000, 0xc0ffff) AM_RAM // RAM - AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0xc00000, 0xc0ffff) AM_RAM // RAM + AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x470000, 0x473fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x478800, 0x478813) AM_RAM AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x478870, 0x47887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0x478880, 0x478881) AM_WRITENOP // ? increasing - AM_RANGE(0x478890, 0x478891) AM_WRITENOP // ? increasing - AM_RANGE(0x4788a2, 0x4788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x4788a4, 0x4788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x478800, 0x478813) AM_RAM AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x478870, 0x47887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0x478880, 0x478881) AM_WRITENOP // ? increasing + AM_RANGE(0x478890, 0x478891) AM_WRITENOP // ? increasing + AM_RANGE(0x4788a2, 0x4788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x4788a4, 0x4788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0x4788a8, 0x4788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x4788aa, 0x4788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x4788ac, 0x4788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x800000, 0x800001) AM_READWRITE(metro_soundstatus_r,metro_soundstatus_w) // From / To Sound CPU - AM_RANGE(0x800002, 0x800003) AM_READNOP AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout - AM_RANGE(0x800004, 0x800005) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0x800006, 0x800007) AM_READ_PORT("IN1") // - AM_RANGE(0x800008, 0x800009) AM_READ_PORT("IN2") // - AM_RANGE(0x80000a, 0x80000b) AM_READ_PORT("DSW0") // - AM_RANGE(0x80000c, 0x80000d) AM_READ_PORT("DSW1") // - AM_RANGE(0x80000e, 0x80000f) AM_READ_PORT("IN3") // + AM_RANGE(0x4788aa, 0x4788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x4788ac, 0x4788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x800000, 0x800001) AM_READWRITE(metro_soundstatus_r,metro_soundstatus_w) // From / To Sound CPU + AM_RANGE(0x800002, 0x800003) AM_READNOP AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout + AM_RANGE(0x800004, 0x800005) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0x800006, 0x800007) AM_READ_PORT("IN1") // + AM_RANGE(0x800008, 0x800009) AM_READ_PORT("IN2") // + AM_RANGE(0x80000a, 0x80000b) AM_READ_PORT("DSW0") // + AM_RANGE(0x80000c, 0x80000d) AM_READ_PORT("DSW1") // + AM_RANGE(0x80000e, 0x80000f) AM_READ_PORT("IN3") // ADDRESS_MAP_END @@ -1544,27 +1529,27 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( poitto_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0x400000, 0x40ffff) AM_RAM // RAM - AM_RANGE(0xc00000, 0xc1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0xc20000, 0xc3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0xc40000, 0xc5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0xc60000, 0xc6ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0x400000, 0x40ffff) AM_RAM // RAM + AM_RANGE(0xc00000, 0xc1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0xc20000, 0xc3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0xc40000, 0xc5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0xc60000, 0xc6ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0xc70000, 0xc73fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0xc74000, 0xc74fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0xc78000, 0xc787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0xc78800, 0xc78813) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0xc78840, 0xc7884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0xc78860, 0xc7886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0xc78870, 0xc7887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0xc78880, 0xc78881) AM_WRITENOP // ? increasing - AM_RANGE(0xc78890, 0xc78891) AM_WRITENOP // ? increasing - AM_RANGE(0xc788a2, 0xc788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0xc788a4, 0xc788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0xc74000, 0xc74fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0xc78000, 0xc787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0xc78800, 0xc78813) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0xc78840, 0xc7884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0xc78860, 0xc7886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0xc78870, 0xc7887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0xc78880, 0xc78881) AM_WRITENOP // ? increasing + AM_RANGE(0xc78890, 0xc78891) AM_WRITENOP // ? increasing + AM_RANGE(0xc788a2, 0xc788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0xc788a4, 0xc788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0xc788a8, 0xc788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0xc788aa, 0xc788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0xc788ac, 0xc788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x800000, 0x800001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU + AM_RANGE(0xc788aa, 0xc788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0xc788ac, 0xc788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x800000, 0x800001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU AM_RANGE(0x800002, 0x800003) AM_READ_PORT("IN1") AM_RANGE(0x800004, 0x800005) AM_READ_PORT("DSW0") AM_RANGE(0x800006, 0x800007) AM_READ_PORT("IN2") @@ -1577,34 +1562,34 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( skyalert_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM - AM_RANGE(0xc00000, 0xc0ffff) AM_RAM // RAM - AM_RANGE(0x800000, 0x81ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x820000, 0x83ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x840000, 0x85ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x03ffff) AM_ROM // ROM + AM_RANGE(0xc00000, 0xc0ffff) AM_RAM // RAM + AM_RANGE(0x800000, 0x81ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x820000, 0x83ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x840000, 0x85ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x860000, 0x86ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0x870000, 0x873fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x878800, 0x878813) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window ) // Tilemap Window - AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing - AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing - AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0x874000, 0x874fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x878000, 0x8787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x878800, 0x878813) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x878840, 0x87884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x878860, 0x87886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x878870, 0x87887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x878880, 0x878881) AM_WRITENOP // ? increasing + AM_RANGE(0x878890, 0x878891) AM_WRITENOP // ? increasing + AM_RANGE(0x8788a2, 0x8788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x8788a4, 0x8788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0x8788a8, 0x8788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x400000, 0x400001) AM_READWRITE(metro_soundstatus_r,metro_soundstatus_w) // From / To Sound CPU - AM_RANGE(0x400002, 0x400003) AM_READNOP AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout - AM_RANGE(0x400004, 0x400005) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0x400006, 0x400007) AM_READ_PORT("IN1") // - AM_RANGE(0x400008, 0x400009) AM_READ_PORT("IN2") // - AM_RANGE(0x40000a, 0x40000b) AM_READ_PORT("DSW0") // - AM_RANGE(0x40000c, 0x40000d) AM_READ_PORT("DSW1") // - AM_RANGE(0x40000e, 0x40000f) AM_READ_PORT("IN3") // + AM_RANGE(0x8788aa, 0x8788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x8788ac, 0x8788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x400000, 0x400001) AM_READWRITE(metro_soundstatus_r,metro_soundstatus_w) // From / To Sound CPU + AM_RANGE(0x400002, 0x400003) AM_READNOP AM_WRITE(metro_coin_lockout_1word_w) // Coin Lockout + AM_RANGE(0x400004, 0x400005) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0x400006, 0x400007) AM_READ_PORT("IN1") // + AM_RANGE(0x400008, 0x400009) AM_READ_PORT("IN2") // + AM_RANGE(0x40000a, 0x40000b) AM_READ_PORT("DSW0") // + AM_RANGE(0x40000c, 0x40000d) AM_READ_PORT("DSW1") // + AM_RANGE(0x40000e, 0x40000f) AM_READ_PORT("IN3") // ADDRESS_MAP_END @@ -1613,27 +1598,27 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( pururun_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0x800000, 0x80ffff) AM_RAM // RAM - AM_RANGE(0xc00000, 0xc1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0xc20000, 0xc3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0xc40000, 0xc5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0xc60000, 0xc6ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0x800000, 0x80ffff) AM_RAM // RAM + AM_RANGE(0xc00000, 0xc1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0xc20000, 0xc3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0xc40000, 0xc5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0xc60000, 0xc6ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0xc70000, 0xc73fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0xc74000, 0xc74fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0xc78000, 0xc787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0xc78840, 0xc7884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0xc78860, 0xc7886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0xc78870, 0xc7887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0xc78880, 0xc78881) AM_WRITENOP // ? increasing - AM_RANGE(0xc78890, 0xc78891) AM_WRITENOP // ? increasing - AM_RANGE(0xc788a2, 0xc788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0xc788a4, 0xc788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0xc74000, 0xc74fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0xc78000, 0xc787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0xc78840, 0xc7884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0xc78860, 0xc7886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0xc78870, 0xc7887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0xc78880, 0xc78881) AM_WRITENOP // ? increasing + AM_RANGE(0xc78890, 0xc78891) AM_WRITENOP // ? increasing + AM_RANGE(0xc788a2, 0xc788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0xc788a4, 0xc788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0xc788a8, 0xc788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0xc788aa, 0xc788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0xc788ac, 0xc788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0xc79700, 0xc79713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers - AM_RANGE(0x400000, 0x400001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU + AM_RANGE(0xc788aa, 0xc788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0xc788ac, 0xc788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0xc79700, 0xc79713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x400000, 0x400001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU AM_RANGE(0x400002, 0x400003) AM_READ_PORT("IN1") AM_RANGE(0x400004, 0x400005) AM_READ_PORT("DSW0") AM_RANGE(0x400006, 0x400007) AM_READ_PORT("IN2") @@ -1646,28 +1631,28 @@ ADDRESS_MAP_END ***************************************************************************/ static ADDRESS_MAP_START( toride2g_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0x400000, 0x4cffff) AM_RAM // RAM (4xc000-4xffff mirrored?) - AM_RANGE(0xc00000, 0xc1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0xc20000, 0xc3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0xc40000, 0xc5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0xc60000, 0xc6ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0x400000, 0x4cffff) AM_RAM // RAM (4xc000-4xffff mirrored?) + AM_RANGE(0xc00000, 0xc1ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0xc20000, 0xc3ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0xc40000, 0xc5ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0xc60000, 0xc6ffff) AM_READ(metro_bankedrom_r) // Banked ROM AM_RANGE(0xc70000, 0xc73fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0xc74000, 0xc74fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0xc78000, 0xc787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0xc78840, 0xc7884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0xc78860, 0xc7886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0xc78870, 0xc7887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0xc78880, 0xc78881) AM_WRITENOP // ? increasing - AM_RANGE(0xc78890, 0xc78891) AM_WRITENOP // ? increasing - AM_RANGE(0xc788a2, 0xc788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0xc788a4, 0xc788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable + AM_RANGE(0xc74000, 0xc74fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0xc78000, 0xc787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0xc78840, 0xc7884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0xc78860, 0xc7886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0xc78870, 0xc7887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0xc78880, 0xc78881) AM_WRITENOP // ? increasing + AM_RANGE(0xc78890, 0xc78891) AM_WRITENOP // ? increasing + AM_RANGE(0xc788a2, 0xc788a3) AM_READWRITE(metro_irq_cause_r, metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0xc788a4, 0xc788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable AM_RANGE(0xc788a8, 0xc788a9) AM_WRITE(metro_soundlatch_w) // To Sound CPU - AM_RANGE(0xc788aa, 0xc788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0xc788ac, 0xc788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0xc79700, 0xc79713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers + AM_RANGE(0xc788aa, 0xc788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0xc788ac, 0xc788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0xc79700, 0xc79713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers - AM_RANGE(0x800000, 0x800001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU + AM_RANGE(0x800000, 0x800001) AM_READ_PORT("IN0") AM_WRITE(metro_soundstatus_w) // To Sound CPU AM_RANGE(0x800002, 0x800003) AM_READ_PORT("IN1") AM_RANGE(0x800004, 0x800005) AM_READ_PORT("DSW0") AM_RANGE(0x800006, 0x800007) AM_READ_PORT("IN2") @@ -1682,8 +1667,10 @@ ADDRESS_MAP_END static WRITE16_HANDLER( blzntrnd_sound_w ) { + metro_state *state = (metro_state *)space->machine->driver_data; + soundlatch_w(space, offset, data >> 8); - cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); } static WRITE8_HANDLER( blzntrnd_sh_bankswitch_w ) @@ -1697,7 +1684,8 @@ static WRITE8_HANDLER( blzntrnd_sh_bankswitch_w ) static void blzntrnd_irqhandler(running_device *device, int irq) { - cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE); + metro_state *state = (metro_state *)device->machine->driver_data; + cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE); } static const ym2610_interface blzntrnd_ym2610_interface = @@ -1719,35 +1707,35 @@ static ADDRESS_MAP_START( blzntrnd_sound_io_map, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_END static ADDRESS_MAP_START( blzntrnd_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM - AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM + AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM + AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM // AM_RANGE(0x300000, 0x300001) AM_READNOP // Sound - AM_RANGE(0x200000, 0x21ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0) // Layer 0 - AM_RANGE(0x220000, 0x23ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1) // Layer 1 - AM_RANGE(0x240000, 0x25ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2) // Layer 2 - AM_RANGE(0x260000, 0x26ffff) AM_READ(metro_bankedrom_r) // Banked ROM - AM_RANGE(0x260000, 0x26ffff) AM_WRITENOP // ?????? + AM_RANGE(0x200000, 0x21ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x220000, 0x23ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x240000, 0x25ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x260000, 0x26ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x260000, 0x26ffff) AM_WRITENOP // ?????? AM_RANGE(0x270000, 0x273fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x274000, 0x274fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x278000, 0x2787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x278860, 0x27886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x278870, 0x27887b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll - AM_RANGE(0x278890, 0x278891) AM_WRITENOP // ? increasing - AM_RANGE(0x2788a2, 0x2788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge - AM_RANGE(0x2788a4, 0x2788a5) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x2788aa, 0x2788ab) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank - AM_RANGE(0x2788ac, 0x2788ad) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x279700, 0x279713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers + AM_RANGE(0x274000, 0x274fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x278000, 0x2787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x278860, 0x27886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x278870, 0x27887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x278890, 0x278891) AM_WRITENOP // ? increasing + AM_RANGE(0x2788a2, 0x2788a3) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x2788a4, 0x2788a5) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x2788aa, 0x2788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x2788ac, 0x2788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x279700, 0x279713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers - AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(metro_K053936_w) AM_BASE(&metro_K053936_ram) // 053936 - AM_RANGE(0x500000, 0x500fff) AM_DEVWRITE("k053936", k053936_linectrl_w) // 053936 line control - AM_RANGE(0x600000, 0x60001f) AM_DEVWRITE("k053936", k053936_ctrl_w) // 053936 control + AM_RANGE(0x400000, 0x43ffff) AM_RAM_WRITE(metro_k053936_w) AM_BASE_MEMBER(metro_state, k053936_ram) // 053936 + AM_RANGE(0x500000, 0x500fff) AM_DEVWRITE("k053936", k053936_linectrl_w) // 053936 line control + AM_RANGE(0x600000, 0x60001f) AM_DEVWRITE("k053936", k053936_ctrl_w) // 053936 control AM_RANGE(0xe00000, 0xe00001) AM_READ_PORT("DSW0") AM_WRITENOP // Inputs - AM_RANGE(0xe00002, 0xe00003) AM_READ_PORT("DSW1") AM_WRITE(blzntrnd_sound_w) // - AM_RANGE(0xe00004, 0xe00005) AM_READ_PORT("IN0") // - AM_RANGE(0xe00006, 0xe00007) AM_READ_PORT("IN1") // - AM_RANGE(0xe00008, 0xe00009) AM_READ_PORT("IN2") // + AM_RANGE(0xe00002, 0xe00003) AM_READ_PORT("DSW1") AM_WRITE(blzntrnd_sound_w) // + AM_RANGE(0xe00004, 0xe00005) AM_READ_PORT("IN0") // + AM_RANGE(0xe00006, 0xe00007) AM_READ_PORT("IN1") // + AM_RANGE(0xe00008, 0xe00009) AM_READ_PORT("IN2") // ADDRESS_MAP_END @@ -1757,41 +1745,43 @@ ADDRESS_MAP_END static WRITE16_DEVICE_HANDLER( mouja_sound_rombank_w ) { + metro_state *state = (metro_state *)device->machine->driver_data; + if (ACCESSING_BITS_0_7) - okim6295_set_bank_base(devtag_get_device(device->machine, "oki"), ((data >> 3) & 0x07) * 0x40000); + okim6295_set_bank_base(state->oki, ((data >> 3) & 0x07) * 0x40000); } static ADDRESS_MAP_START( mouja_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM - AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE(&metro_vram_0 ) // Layer 0 - AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE(&metro_vram_1 ) // Layer 1 - AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE(&metro_vram_2 ) // Layer 2 + AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM // RAM + AM_RANGE(0x400000, 0x41ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x420000, 0x43ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x440000, 0x45ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 AM_RANGE(0x470000, 0x473fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites - AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size) // Tiles Set - AM_RANGE(0x47880e, 0x47880f) AM_WRITEONLY AM_BASE(&metro_screenctrl) // Screen Control - AM_RANGE(0x478810, 0x47881f) AM_WRITEONLY AM_BASE(&metro_irq_levels) // IRQ Levels - AM_RANGE(0x478820, 0x47882f) AM_WRITEONLY AM_BASE(&metro_irq_vectors) // IRQ Vectors - AM_RANGE(0x478830, 0x478831) AM_WRITEONLY AM_BASE(&metro_irq_enable) // IRQ Enable - AM_RANGE(0x478832, 0x478833) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge + AM_RANGE(0x474000, 0x474fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) // Sprites + AM_RANGE(0x478000, 0x4787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x47880e, 0x47880f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control + AM_RANGE(0x478810, 0x47881f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_levels) // IRQ Levels + AM_RANGE(0x478820, 0x47882f) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_vectors) // IRQ Vectors + AM_RANGE(0x478830, 0x478831) AM_WRITEONLY AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable + AM_RANGE(0x478832, 0x478833) AM_READWRITE(metro_irq_cause_r,metro_irq_cause_w) // IRQ Cause / IRQ Acknowledge AM_RANGE(0x478834, 0x478835) AM_WRITE(mouja_irq_timer_ctrl_w) // IRQ set timer count AM_RANGE(0x478836, 0x478837) AM_WRITE(watchdog_reset16_w) // Watchdog - AM_RANGE(0x478850, 0x47885b) AM_WRITEONLY AM_BASE(&metro_scroll) // Scroll Regs - AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE(&metro_window) // Tilemap Window - AM_RANGE(0x478880, 0x478881) AM_READ_PORT("IN0") // Inputs - AM_RANGE(0x478882, 0x478883) AM_READ_PORT("IN1") // - AM_RANGE(0x478884, 0x478885) AM_READ_PORT("DSW0") // - AM_RANGE(0x478886, 0x478887) AM_READ_PORT("IN2") // - AM_RANGE(0x478888, 0x478889) AM_WRITENOP // ?? - AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_BASE(&metro_videoregs) // Video Registers + AM_RANGE(0x478850, 0x47885b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll Regs + AM_RANGE(0x478860, 0x47886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x478880, 0x478881) AM_READ_PORT("IN0") // Inputs + AM_RANGE(0x478882, 0x478883) AM_READ_PORT("IN1") // + AM_RANGE(0x478884, 0x478885) AM_READ_PORT("DSW0") // + AM_RANGE(0x478886, 0x478887) AM_READ_PORT("IN2") // + AM_RANGE(0x478888, 0x478889) AM_WRITENOP // ?? + AM_RANGE(0x479700, 0x479713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers AM_RANGE(0x800000, 0x800001) AM_DEVWRITE("oki", mouja_sound_rombank_w) AM_RANGE(0xc00000, 0xc00003) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) AM_RANGE(0xd00000, 0xd00001) AM_DEVREADWRITE8("oki", okim6295_r,okim6295_w, 0xffff) #if 0 - AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM - AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE(&metro_blitter_regs) // Tiles Blitter - AM_RANGE(0x47883a, 0x47883b) AM_WRITEONLY AM_BASE(&metro_rombank) // Rom Bank + AM_RANGE(0x460000, 0x46ffff) AM_READ(metro_bankedrom_r) // Banked ROM + AM_RANGE(0x478840, 0x47884d) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x47883a, 0x47883b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank AM_RANGE(0x800002, 0x800009) AM_WRITE(metro_coin_lockout_4words_w) // Coin Lockout #endif ADDRESS_MAP_END @@ -1803,62 +1793,64 @@ ADDRESS_MAP_END static WRITE16_HANDLER( puzzlet_irq_enable_w ) { + metro_state *state = (metro_state *)space->machine->driver_data; + if (ACCESSING_BITS_0_7) - *metro_irq_enable = data^0xffff; + *state->irq_enable = data ^ 0xffff; } // H8/3007 CPU static ADDRESS_MAP_START( puzzlet_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE( 0x000000, 0x1fffff ) AM_ROM - AM_RANGE( 0x430000, 0x433fff ) AM_RAM - AM_RANGE( 0x470000, 0x47dfff ) AM_RAM + AM_RANGE(0x000000, 0x1fffff) AM_ROM + AM_RANGE(0x430000, 0x433fff) AM_RAM + AM_RANGE(0x470000, 0x47dfff) AM_RAM - AM_RANGE( 0x500000, 0x500001 ) AM_DEVREADWRITE8( "oki", okim6295_r, okim6295_w, 0xff00 ) - AM_RANGE( 0x580000, 0x580003 ) AM_DEVWRITE8( "ymsnd", ym2413_w, 0xff00 ) + AM_RANGE(0x500000, 0x500001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0xff00) + AM_RANGE(0x580000, 0x580003) AM_DEVWRITE8("ymsnd", ym2413_w, 0xff00) - AM_RANGE( 0x700000, 0x71ffff ) AM_RAM_WRITE( metro_vram_0_w ) AM_BASE( &metro_vram_0 ) // Layer 0 - AM_RANGE( 0x720000, 0x73ffff ) AM_RAM_WRITE( metro_vram_1_w ) AM_BASE( &metro_vram_1 ) // Layer 1 - AM_RANGE( 0x740000, 0x75ffff ) AM_RAM_WRITE( metro_vram_2_w ) AM_BASE( &metro_vram_2 ) // Layer 2 - AM_RANGE( 0x774000, 0x774fff ) AM_RAM AM_BASE_SIZE_GENERIC( spriteram ) + AM_RANGE(0x700000, 0x71ffff) AM_RAM_WRITE(metro_vram_0_w) AM_BASE_MEMBER(metro_state, vram_0) // Layer 0 + AM_RANGE(0x720000, 0x73ffff) AM_RAM_WRITE(metro_vram_1_w) AM_BASE_MEMBER(metro_state, vram_1) // Layer 1 + AM_RANGE(0x740000, 0x75ffff) AM_RAM_WRITE(metro_vram_2_w) AM_BASE_MEMBER(metro_state, vram_2) // Layer 2 + AM_RANGE(0x774000, 0x774fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) - AM_RANGE( 0x760000, 0x76ffff ) AM_READ( metro_bankedrom_r ) // Banked ROM + AM_RANGE(0x760000, 0x76ffff) AM_READ(metro_bankedrom_r) // Banked ROM -// AM_RANGE( 0x772000, 0x773fff ) AM_RAM - AM_RANGE( 0x770000, 0x773fff ) AM_RAM_WRITE( paletteram16_GGGGGRRRRRBBBBBx_word_w ) AM_BASE_GENERIC( paletteram ) // Palette +// AM_RANGE(0x772000, 0x773fff) AM_RAM + AM_RANGE(0x770000, 0x773fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE( 0x775000, 0x777fff ) AM_RAM + AM_RANGE(0x775000, 0x777fff) AM_RAM - AM_RANGE( 0x778000, 0x7787ff ) AM_RAM AM_BASE(&metro_tiletable) AM_SIZE(&metro_tiletable_size ) // Tiles Set - AM_RANGE( 0x778800, 0x778813 ) AM_WRITEONLY AM_BASE( &metro_videoregs ) // Video Registers - AM_RANGE( 0x778840, 0x77884f ) AM_WRITE( metro_blitter_w ) AM_BASE( &metro_blitter_regs ) // Tiles Blitter - AM_RANGE( 0x778860, 0x77886b ) AM_WRITE( metro_window_w ) AM_BASE( &metro_window ) // Tilemap Window - AM_RANGE( 0x778870, 0x77887b ) AM_WRITEONLY AM_BASE( &metro_scroll ) // Scroll - AM_RANGE( 0x778890, 0x778891 ) AM_WRITENOP // ? increasing - AM_RANGE( 0x7788a2, 0x7788a3 ) AM_WRITE( metro_irq_cause_w ) // IRQ Cause - AM_RANGE( 0x7788a4, 0x7788a5 ) AM_WRITE( puzzlet_irq_enable_w ) AM_BASE( &metro_irq_enable ) // IRQ Enable + AM_RANGE(0x778000, 0x7787ff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, tiletable, tiletable_size) // Tiles Set + AM_RANGE(0x778800, 0x778813) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers + AM_RANGE(0x778840, 0x77884f) AM_WRITE(metro_blitter_w) AM_BASE_MEMBER(metro_state, blitter_regs) // Tiles Blitter + AM_RANGE(0x778860, 0x77886b) AM_WRITE(metro_window_w) AM_BASE_MEMBER(metro_state, window) // Tilemap Window + AM_RANGE(0x778870, 0x77887b) AM_WRITEONLY AM_BASE_MEMBER(metro_state, scroll) // Scroll + AM_RANGE(0x778890, 0x778891) AM_WRITENOP // ? increasing + AM_RANGE(0x7788a2, 0x7788a3) AM_WRITE(metro_irq_cause_w) // IRQ Cause + AM_RANGE(0x7788a4, 0x7788a5) AM_WRITE(puzzlet_irq_enable_w) AM_BASE_MEMBER(metro_state, irq_enable) // IRQ Enable - AM_RANGE( 0x7788aa, 0x7788ab ) AM_WRITEONLY AM_BASE( &metro_rombank ) // Rom Bank - AM_RANGE( 0x7788ac, 0x7788ad ) AM_WRITEONLY AM_BASE( &metro_screenctrl ) // Screen Control + AM_RANGE(0x7788aa, 0x7788ab) AM_WRITEONLY AM_BASE_MEMBER(metro_state, rombank) // Rom Bank + AM_RANGE(0x7788ac, 0x7788ad) AM_WRITEONLY AM_BASE_MEMBER(metro_state, screenctrl) // Screen Control - AM_RANGE( 0x7f2000, 0x7f3fff ) AM_RAM + AM_RANGE(0x7f2000, 0x7f3fff) AM_RAM - AM_RANGE( 0x7f8880, 0x7f8881 ) AM_READ_PORT("IN1") - AM_RANGE( 0x7f8884, 0x7f8885 ) AM_READ_PORT("DSW0") - AM_RANGE( 0x7f8886, 0x7f8887 ) AM_READ_PORT("DSW0") + AM_RANGE(0x7f8880, 0x7f8881) AM_READ_PORT("IN1") + AM_RANGE(0x7f8884, 0x7f8885) AM_READ_PORT("DSW0") + AM_RANGE(0x7f8886, 0x7f8887) AM_READ_PORT("DSW0") - AM_RANGE( 0x7f88a2, 0x7f88a3 ) AM_READ( metro_irq_cause_r ) // IRQ Cause + AM_RANGE(0x7f88a2, 0x7f88a3) AM_READ(metro_irq_cause_r) // IRQ Cause ADDRESS_MAP_END static WRITE8_HANDLER( puzzlet_portb_w ) { -// popmessage("PORTB %02x",data); +// popmessage("PORTB %02x", data); } static ADDRESS_MAP_START( puzzlet_io_map, ADDRESS_SPACE_IO, 8 ) - AM_RANGE( H8_PORT_7, H8_PORT_7 ) AM_READ_PORT("IN2") - AM_RANGE( H8_SERIAL_1, H8_SERIAL_1 ) AM_READ_PORT("IN0") // coin - AM_RANGE( H8_PORT_B, H8_PORT_B ) AM_READ_PORT("DSW0") AM_WRITE( puzzlet_portb_w ) + AM_RANGE(H8_PORT_7, H8_PORT_7) AM_READ_PORT("IN2") + AM_RANGE(H8_SERIAL_1, H8_SERIAL_1) AM_READ_PORT("IN0") // coin + AM_RANGE(H8_PORT_B, H8_PORT_B) AM_READ_PORT("DSW0") AM_WRITE(puzzlet_portb_w) ADDRESS_MAP_END @@ -3525,19 +3517,55 @@ GFXDECODE_END ***************************************************************************/ +static MACHINE_START( metro ) +{ + metro_state *state = (metro_state *)machine->driver_data; + + state->maincpu = devtag_get_device(machine, "maincpu"); + state->audiocpu = devtag_get_device(machine, "audiocpu"); + state->oki = devtag_get_device(machine, "oki"); + state->ymsnd = devtag_get_device(machine, "ymsnd"); + state->k053936 = devtag_get_device(machine, "k053936"); + + state_save_register_global(machine, state->blitter_bit); + state_save_register_global(machine, state->irq_line); + state_save_register_global_array(machine, state->requested_int); + state_save_register_global(machine, state->soundstatus); + state_save_register_global(machine, state->porta); + state_save_register_global(machine, state->portb); + state_save_register_global(machine, state->busy_sndcpu); + state_save_register_global(machine, state->gakusai_oki_bank_lo); + state_save_register_global(machine, state->gakusai_oki_bank_hi); + state_save_register_global(machine, state->sprite_xoffs); + state_save_register_global(machine, state->sprite_yoffs); +} + +static MACHINE_RESET( metro ) +{ + metro_state *state = (metro_state *)machine->driver_data; + + if (state->irq_line == -1) + cpu_set_irq_callback(devtag_get_device(machine, "maincpu"), metro_irq_callback); +} + + static const UPD7810_CONFIG metro_cpu_config = { - TYPE_7810, - metro_io_callback + TYPE_7810, + metro_io_callback }; static MACHINE_DRIVER_START( balcube ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(balcube_map) MDRV_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3566,11 +3594,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( daitoa ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(daitoa_map) MDRV_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3599,11 +3631,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( msgogo ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(msgogo_map) MDRV_CPU_VBLANK_INT("screen", bangball_interrupt) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3632,11 +3668,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( bangball ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(bangball_map) MDRV_CPU_VBLANK_INT("screen", bangball_interrupt) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3665,11 +3705,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( batlbubl ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(batlbubl_map) MDRV_CPU_VBLANK_INT("screen", bangball_interrupt) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3697,6 +3741,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( daitorid ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(daitorid_map) @@ -3707,6 +3754,7 @@ static MACHINE_DRIVER_START( daitorid ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(daitorid_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3740,6 +3788,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( dharma ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(dharma_map) @@ -3750,6 +3801,7 @@ static MACHINE_DRIVER_START( dharma ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3782,6 +3834,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( karatour ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(karatour_map) @@ -3792,6 +3847,7 @@ static MACHINE_DRIVER_START( karatour ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3824,6 +3880,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( 3kokushi ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(kokushi_map) @@ -3834,6 +3893,7 @@ static MACHINE_DRIVER_START( 3kokushi ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3866,6 +3926,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( lastfort ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(lastfort_map) @@ -3876,6 +3939,7 @@ static MACHINE_DRIVER_START( lastfort ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3907,6 +3971,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( lastforg ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(lastforg_map) @@ -3917,6 +3984,7 @@ static MACHINE_DRIVER_START( lastforg ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3948,11 +4016,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( dokyusei ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(dokyusei_map) MDRV_CPU_VBLANK_INT_HACK(dokyusei_interrupt,2) /* ? */ + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -3984,11 +4056,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( dokyusp ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(dokyusp_map) MDRV_CPU_VBLANK_INT("screen", gakusai_interrupt) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) MDRV_EEPROM_93C46_ADD("eeprom") @@ -4022,11 +4098,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( gakusai ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(gakusai_map) MDRV_CPU_VBLANK_INT("screen", gakusai_interrupt) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) MDRV_EEPROM_93C46_ADD("eeprom") @@ -4060,11 +4140,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( gakusai2 ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(gakusai2_map) MDRV_CPU_VBLANK_INT("screen", gakusai_interrupt) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) MDRV_EEPROM_93C46_ADD("eeprom") @@ -4098,6 +4182,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( pangpoms ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(pangpoms_map) @@ -4108,6 +4195,7 @@ static MACHINE_DRIVER_START( pangpoms ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4140,6 +4228,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( poitto ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(poitto_map) @@ -4150,6 +4241,7 @@ static MACHINE_DRIVER_START( poitto ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4182,6 +4274,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( pururun ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(pururun_map) @@ -4192,6 +4287,7 @@ static MACHINE_DRIVER_START( pururun ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(daitorid_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4225,6 +4321,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( skyalert ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(skyalert_map) @@ -4235,6 +4334,7 @@ static MACHINE_DRIVER_START( skyalert ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4267,6 +4367,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( toride2g ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) MDRV_CPU_PROGRAM_MAP(toride2g_map) @@ -4277,6 +4380,7 @@ static MACHINE_DRIVER_START( toride2g ) MDRV_CPU_PROGRAM_MAP(metro_sound_map) MDRV_CPU_IO_MAP(metro_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4309,11 +4413,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( mouja ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 12000000) /* ??? */ MDRV_CPU_PROGRAM_MAP(mouja_map) MDRV_CPU_VBLANK_INT("screen", mouja_interrupt) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4350,6 +4458,9 @@ static const k053936_interface blzntrnd_k053936_intf = static MACHINE_DRIVER_START( blzntrnd ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(blzntrnd_map) @@ -4359,6 +4470,7 @@ static MACHINE_DRIVER_START( blzntrnd ) MDRV_CPU_PROGRAM_MAP(blzntrnd_sound_map) MDRV_CPU_IO_MAP(blzntrnd_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4397,6 +4509,9 @@ static const k053936_interface gstrik2_k053936_intf = static MACHINE_DRIVER_START( gstrik2 ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(blzntrnd_map) @@ -4406,6 +4521,7 @@ static MACHINE_DRIVER_START( gstrik2 ) MDRV_CPU_PROGRAM_MAP(blzntrnd_sound_map) MDRV_CPU_IO_MAP(blzntrnd_sound_io_map) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4438,42 +4554,49 @@ MACHINE_DRIVER_END static INTERRUPT_GEN( puzzlet_interrupt ) { - switch ( cpu_getiloops(device) ) + metro_state *state = (metro_state *)device->machine->driver_data; + + switch (cpu_getiloops(device)) { case 0: - requested_int[1] = 1; + state->requested_int[1] = 1; update_irq_state(device->machine); break; case 1: - requested_int[3] = 1; + state->requested_int[3] = 1; update_irq_state(device->machine); break; case 2: - requested_int[5] = 1; + state->requested_int[5] = 1; update_irq_state(device->machine); break; case 3: - requested_int[2] = 1; + state->requested_int[2] = 1; update_irq_state(device->machine); break; default: // timer - cputag_set_input_line(device->machine, "maincpu", H8_METRO_TIMER_HACK, HOLD_LINE); + cpu_set_input_line(state->maincpu, H8_METRO_TIMER_HACK, HOLD_LINE); break; } } + static MACHINE_DRIVER_START( puzzlet ) + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", H83007, XTAL_20MHz) // H8/3007 - Hitachi HD6413007F20 CPU. Clock 20MHz MDRV_CPU_PROGRAM_MAP(puzzlet_map) MDRV_CPU_IO_MAP(puzzlet_io_map) MDRV_CPU_VBLANK_INT_HACK(puzzlet_interrupt, 5) + MDRV_MACHINE_START(metro) MDRV_MACHINE_RESET(metro) /* video hardware */ @@ -4512,133 +4635,6 @@ MACHINE_DRIVER_END ***************************************************************************/ -static void metro_common(void) -{ - requested_int[0] = 0; - requested_int[1] = 0; - requested_int[2] = 0; - requested_int[3] = 0; - requested_int[4] = 0; - requested_int[5] = 0; - requested_int[6] = 0; - requested_int[7] = 0; - - irq_line = 2; - - blitter_bit = 2; - - *metro_irq_enable = 0; -} - - -static DRIVER_INIT( metro ) -{ - const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); - - metro_common(); - - porta = 0x00; - portb = 0x00; - busy_sndcpu = 0; - metro_sound_rombank_w(space, 0, 0x00); -} - -static DRIVER_INIT( karatour ) -{ - UINT16 *RAM = auto_alloc_array(machine, UINT16, 0x20000*3/2); -int i; - metro_vram_0 = RAM + (0x20000/2) * 0; - metro_vram_1 = RAM + (0x20000/2) * 1; - metro_vram_2 = RAM + (0x20000/2) * 2; -for (i = 0;i < (0x20000*3)/2;i++) - RAM[i] = mame_rand(machine); - - DRIVER_INIT_CALL(metro); -} - -static DRIVER_INIT( daitorid ) -{ - const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); - - metro_common(); - - porta = 0x00; - portb = 0x00; - busy_sndcpu = 0; - daitorid_sound_rombank_w(space, 0, 0x00); -} - - -/* Unscramble the GFX ROMs */ -static DRIVER_INIT( balcube ) -{ - const size_t len = memory_region_length(machine, "gfx1"); - UINT8 *src = memory_region(machine, "gfx1"); - UINT8 *end = src + len; - - while(src < end) - { - static const UINT8 scramble[16] = - { 0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe,0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf }; - - UINT8 data; - - data = *src; - *src = (scramble[data & 0xF] << 4) | scramble[data >> 4]; - src += 2; - } - - metro_common(); - irq_line = 1; -} - - -static DRIVER_INIT( dharmak ) -{ - UINT8 *src = memory_region( machine, "gfx1" ); - int i; - for (i=0;i<0x200000;i+=4) - { - UINT8 dat; - dat = src[i+1]; - dat = BITSWAP8(dat, 7,3,2,4, 5,6,1,0); - src[i+1] = dat; - - dat = src[i+3]; - dat = BITSWAP8(dat, 7,2,5,4, 3,6,1,0); - src[i+3] = dat; - } - - DRIVER_INIT_CALL(metro); -} - -static DRIVER_INIT( blzntrnd ) -{ - metro_common(); - irq_line = 1; -} - -static DRIVER_INIT( mouja ) -{ - metro_common(); - irq_line = -1; /* split interrupt handlers */ - mouja_irq_timer = timer_alloc(machine, mouja_irq_callback, NULL); -} - -static DRIVER_INIT( gakusai ) -{ - metro_common(); - irq_line = -1; - blitter_bit = 3; -} - -static DRIVER_INIT( puzzlet ) -{ - metro_common(); - irq_line = 0; - blitter_bit = 0; -} - /*************************************************************************** Bal Cube @@ -6031,6 +6027,145 @@ ROM_START( toride2j ) ROM_LOAD( "pcm.3g", 0x000000, 0x020000, CRC(6ee32315) SHA1(ef4d59576929deab0aa459a67be21d97c2803dea) ) ROM_END + +/*************************************************************************** + + + Driver Inits + + +***************************************************************************/ + +static void metro_common( running_machine *machine ) +{ + metro_state *state = (metro_state *)machine->driver_data; + + memset(state->requested_int, 0, ARRAY_LENGTH(state->requested_int)); + state->irq_line = 2; + state->blitter_bit = 2; + + *state->irq_enable = 0; +} + + +static DRIVER_INIT( metro ) +{ + metro_state *state = (metro_state *)machine->driver_data; + const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); + + metro_common(machine); + + state->porta = 0x00; + state->portb = 0x00; + state->busy_sndcpu = 0; + metro_sound_rombank_w(space, 0, 0x00); +} + +static DRIVER_INIT( karatour ) +{ + metro_state *state = (metro_state *)machine->driver_data; + UINT16 *RAM = auto_alloc_array(machine, UINT16, 0x20000*3/2); + int i; + + state->vram_0 = RAM + (0x20000/2) * 0; + state->vram_1 = RAM + (0x20000/2) * 1; + state->vram_2 = RAM + (0x20000/2) * 2; + + for (i = 0; i < (0x20000 * 3) / 2; i++) + RAM[i] = mame_rand(machine); + + DRIVER_INIT_CALL(metro); +} + +static DRIVER_INIT( daitorid ) +{ + metro_state *state = (metro_state *)machine->driver_data; + const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); + + metro_common(machine); + + state->porta = 0x00; + state->portb = 0x00; + state->busy_sndcpu = 0; + daitorid_sound_rombank_w(space, 0, 0x00); +} + + +/* Unscramble the GFX ROMs */ +static DRIVER_INIT( balcube ) +{ + metro_state *state = (metro_state *)machine->driver_data; + + const size_t len = memory_region_length(machine, "gfx1"); + UINT8 *src = memory_region(machine, "gfx1"); + UINT8 *end = src + len; + + while (src < end) + { + static const UINT8 scramble[16] = { 0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe,0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf }; + UINT8 data; + + data = *src; + *src = (scramble[data & 0x0f] << 4) | scramble[data >> 4]; + src += 2; + } + + metro_common(machine); + state->irq_line = 1; +} + + +static DRIVER_INIT( dharmak ) +{ + UINT8 *src = memory_region( machine, "gfx1" ); + int i; + + for (i = 0; i < 0x200000; i += 4) + { + UINT8 dat; + dat = src[i + 1]; + dat = BITSWAP8(dat, 7,3,2,4, 5,6,1,0); + src[i + 1] = dat; + + dat = src[i + 3]; + dat = BITSWAP8(dat, 7,2,5,4, 3,6,1,0); + src[i + 3] = dat; + } + + DRIVER_INIT_CALL(metro); +} + +static DRIVER_INIT( blzntrnd ) +{ + metro_state *state = (metro_state *)machine->driver_data; + metro_common(machine); + state->irq_line = 1; +} + +static DRIVER_INIT( mouja ) +{ + metro_state *state = (metro_state *)machine->driver_data; + metro_common(machine); + state->irq_line = -1; /* split interrupt handlers */ + state->mouja_irq_timer = timer_alloc(machine, mouja_irq_callback, NULL); +} + +static DRIVER_INIT( gakusai ) +{ + metro_state *state = (metro_state *)machine->driver_data; + metro_common(machine); + state->irq_line = -1; + state->blitter_bit = 3; +} + +static DRIVER_INIT( puzzlet ) +{ + metro_state *state = (metro_state *)machine->driver_data; + metro_common(machine); + state->irq_line = 0; + state->blitter_bit = 0; +} + /*************************************************************************** @@ -6039,38 +6174,38 @@ ROM_END ***************************************************************************/ -GAME( 1992, karatour, 0, karatour, karatour, karatour, ROT0, "Mitchell", "The Karate Tournament", GAME_IMPERFECT_GRAPHICS ) -GAME( 1992, pangpoms, 0, pangpoms, pangpoms, metro, ROT0, "Metro", "Pang Pom's", 0 ) -GAME( 1992, pangpomsm,pangpoms, pangpoms, pangpoms, metro, ROT0, "Metro (Mitchell license)", "Pang Pom's (Mitchell)", 0 ) -GAME( 1992, skyalert, 0, skyalert, skyalert, metro, ROT270, "Metro", "Sky Alert", 0 ) -GAME( 1993, ladykill, 0, karatour, ladykill, karatour, ROT90, "Yanyaka (Mitchell license)", "Lady Killer", GAME_IMPERFECT_GRAPHICS ) -GAME( 1993, moegonta, ladykill, karatour, moegonta, karatour, ROT90, "Yanyaka", "Moeyo Gonta!! (Japan)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1993, poitto, 0, poitto, poitto, metro, ROT0, "Metro / Able Corp.", "Poitto!", 0 ) -GAME( 1994, blzntrnd, 0, blzntrnd, blzntrnd, blzntrnd, ROT0, "Human Amusement", "Blazing Tornado", GAME_IMPERFECT_GRAPHICS ) -GAME( 1994, dharma, 0, dharma, dharma, metro, ROT0, "Metro", "Dharma Doujou", 0 ) -GAME( 1994, dharmak, dharma, dharma, dharma, dharmak, ROT0, "Metro", "Dharma Doujou (Korea)", 0 ) -GAME( 1994, lastfort, 0, lastfort, lastfort, metro, ROT0, "Metro", "Last Fortress - Toride", 0 ) -GAME( 1994, lastforte,lastfort, lastfort, lastfero, metro, ROT0, "Metro", "Last Fortress - Toride (Erotic)", 0 ) -GAME( 1994, lastfortk,lastfort, lastfort, lastfero, metro, ROT0, "Metro", "Last Fortress - Toride (Korea)", 0 ) -GAME( 1994, lastfortg,lastfort, lastforg, ladykill, metro, ROT0, "Metro", "Last Fortress - Toride (German)", 0 ) -GAME( 1994, toride2g, 0, toride2g, toride2g, metro, ROT0, "Metro", "Toride II Adauchi Gaiden", GAME_IMPERFECT_GRAPHICS ) -GAME( 1994, toride2gg,toride2g, toride2g, toride2g, metro, ROT0, "Metro", "Toride II Adauchi Gaiden (German)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1994, toride2j, toride2g, toride2g, toride2g, metro, ROT0, "Metro", "Toride II (Japan)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1994, gunmast, 0, pururun, gunmast, daitorid, ROT0, "Metro", "Gun Master", 0 ) -GAME( 1995, daitorid, 0, daitorid, daitorid, daitorid, ROT0, "Metro", "Daitoride", GAME_IMPERFECT_GRAPHICS ) -GAME( 1996, daitoa, daitorid, daitoa, daitorid, balcube, ROT0, "Metro", "Daitoride (YMF278B version)", 0 ) -GAME( 1995, dokyusei, 0, dokyusei, dokyusei, gakusai, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei", 0 ) -GAME( 1995, dokyusp, 0, dokyusp, gakusai, gakusai, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei Special", 0 ) -GAME( 1995, msgogo, 0, msgogo, msgogo, balcube, ROT0, "Metro", "Mouse Shooter GoGo", GAME_IMPERFECT_GRAPHICS ) -GAME( 1995, pururun, 0, pururun, pururun, daitorid, ROT0, "Metro / Banpresto", "Pururun", 0 ) -GAME( 1995, puzzli, 0, daitorid, puzzli, daitorid, ROT0, "Metro / Banpresto", "Puzzli", GAME_IMPERFECT_GRAPHICS ) -GAME( 1996, 3kokushi, 0, 3kokushi, 3kokushi, karatour, ROT0, "Mitchell", "Sankokushi (Japan)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1996, balcube, 0, balcube, balcube, balcube, ROT0, "Metro", "Bal Cube", 0 ) -GAME( 1996, bangball, 0, bangball, bangball, balcube, ROT0, "Banpresto / Kunihiko Tashiro+Goodhouse", "Bang Bang Ball (v1.05)", 0 ) -GAME( 1996, gstrik2, 0, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Japan)", GAME_IMPERFECT_GRAPHICS ) // priority between rounds -GAME( 1996, gstrik2e, gstrik2, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Europe and Oceania)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, batlbubl, bangball, batlbubl, batlbubl, balcube, ROT0, "Limenko", "Battle Bubble (v2.00)", 0 ) -GAME( 1996, mouja, 0, mouja, mouja, mouja, ROT0, "Etona", "Mouja (Japan)", GAME_NO_COCKTAIL ) -GAME( 1997, gakusai, 0, gakusai, gakusai, gakusai, ROT0, "MakeSoft", "Mahjong Gakuensai (Japan)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, gakusai2, 0, gakusai2, gakusai, gakusai, ROT0, "MakeSoft", "Mahjong Gakuensai 2 (Japan)", 0 ) -GAME( 2000, puzzlet, 0, puzzlet, puzzlet, puzzlet, ROT0, "Unies Corporation", "Puzzlet (Japan)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 1992, karatour, 0, karatour, karatour, karatour, ROT0, "Mitchell", "The Karate Tournament", GAME_IMPERFECT_GRAPHICS ) +GAME( 1992, pangpoms, 0, pangpoms, pangpoms, metro, ROT0, "Metro", "Pang Pom's", 0 ) +GAME( 1992, pangpomsm, pangpoms, pangpoms, pangpoms, metro, ROT0, "Metro (Mitchell license)", "Pang Pom's (Mitchell)", 0 ) +GAME( 1992, skyalert, 0, skyalert, skyalert, metro, ROT270, "Metro", "Sky Alert", 0 ) +GAME( 1993, ladykill, 0, karatour, ladykill, karatour, ROT90, "Yanyaka (Mitchell license)", "Lady Killer", GAME_IMPERFECT_GRAPHICS ) +GAME( 1993, moegonta, ladykill, karatour, moegonta, karatour, ROT90, "Yanyaka", "Moeyo Gonta!! (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1993, poitto, 0, poitto, poitto, metro, ROT0, "Metro / Able Corp.", "Poitto!", 0 ) +GAME( 1994, blzntrnd, 0, blzntrnd, blzntrnd, blzntrnd, ROT0, "Human Amusement", "Blazing Tornado", GAME_IMPERFECT_GRAPHICS ) +GAME( 1994, dharma, 0, dharma, dharma, metro, ROT0, "Metro", "Dharma Doujou", 0 ) +GAME( 1994, dharmak, dharma, dharma, dharma, dharmak, ROT0, "Metro", "Dharma Doujou (Korea)", 0 ) +GAME( 1994, lastfort, 0, lastfort, lastfort, metro, ROT0, "Metro", "Last Fortress - Toride", 0 ) +GAME( 1994, lastforte, lastfort, lastfort, lastfero, metro, ROT0, "Metro", "Last Fortress - Toride (Erotic)", 0 ) +GAME( 1994, lastfortk, lastfort, lastfort, lastfero, metro, ROT0, "Metro", "Last Fortress - Toride (Korea)", 0 ) +GAME( 1994, lastfortg, lastfort, lastforg, ladykill, metro, ROT0, "Metro", "Last Fortress - Toride (German)", 0 ) +GAME( 1994, toride2g, 0, toride2g, toride2g, metro, ROT0, "Metro", "Toride II Adauchi Gaiden", GAME_IMPERFECT_GRAPHICS ) +GAME( 1994, toride2gg, toride2g, toride2g, toride2g, metro, ROT0, "Metro", "Toride II Adauchi Gaiden (German)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1994, toride2j, toride2g, toride2g, toride2g, metro, ROT0, "Metro", "Toride II (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1994, gunmast, 0, pururun, gunmast, daitorid, ROT0, "Metro", "Gun Master", 0 ) +GAME( 1995, daitorid, 0, daitorid, daitorid, daitorid, ROT0, "Metro", "Daitoride", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, daitoa, daitorid, daitoa, daitorid, balcube, ROT0, "Metro", "Daitoride (YMF278B version)", 0 ) +GAME( 1995, dokyusei, 0, dokyusei, dokyusei, gakusai, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei", 0 ) +GAME( 1995, dokyusp, 0, dokyusp, gakusai, gakusai, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei Special", 0 ) +GAME( 1995, msgogo, 0, msgogo, msgogo, balcube, ROT0, "Metro", "Mouse Shooter GoGo", GAME_IMPERFECT_GRAPHICS ) +GAME( 1995, pururun, 0, pururun, pururun, daitorid, ROT0, "Metro / Banpresto", "Pururun", 0 ) +GAME( 1995, puzzli, 0, daitorid, puzzli, daitorid, ROT0, "Metro / Banpresto", "Puzzli", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, 3kokushi, 0, 3kokushi, 3kokushi, karatour, ROT0, "Mitchell", "Sankokushi (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, balcube, 0, balcube, balcube, balcube, ROT0, "Metro", "Bal Cube", 0 ) +GAME( 1996, bangball, 0, bangball, bangball, balcube, ROT0, "Banpresto / Kunihiko Tashiro+Goodhouse", "Bang Bang Ball (v1.05)", 0 ) +GAME( 1996, gstrik2, 0, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Japan)", GAME_IMPERFECT_GRAPHICS ) // priority between rounds +GAME( 1996, gstrik2e, gstrik2, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Europe and Oceania)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, batlbubl, bangball, batlbubl, batlbubl, balcube, ROT0, "Limenko", "Battle Bubble (v2.00)", 0 ) +GAME( 1996, mouja, 0, mouja, mouja, mouja, ROT0, "Etona", "Mouja (Japan)", GAME_NO_COCKTAIL ) +GAME( 1997, gakusai, 0, gakusai, gakusai, gakusai, ROT0, "MakeSoft", "Mahjong Gakuensai (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, gakusai2, 0, gakusai2, gakusai, gakusai, ROT0, "MakeSoft", "Mahjong Gakuensai 2 (Japan)", 0 ) +GAME( 2000, puzzlet, 0, puzzlet, puzzlet, puzzlet, ROT0, "Unies Corporation", "Puzzlet (Japan)", GAME_NOT_WORKING | GAME_NO_SOUND ) diff --git a/src/mame/drivers/vmetal.c b/src/mame/drivers/vmetal.c index 329de39bf7a..a9ee16a595f 100644 --- a/src/mame/drivers/vmetal.c +++ b/src/mame/drivers/vmetal.c @@ -79,32 +79,20 @@ cleanup #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" #include "sound/es8712.h" - -static UINT16 *vmetal_texttileram; -static UINT16 *vmetal_mid1tileram; -static UINT16 *vmetal_mid2tileram; -static UINT16 *vmetal_tlookup; -static UINT16 *vmetal_videoregs; - - -static tilemap_t *vmetal_texttilemap; -static tilemap_t *vmetal_mid1tilemap; -static tilemap_t *vmetal_mid2tilemap; - -/* video/metro.c */ -extern UINT16 *metro_videoregs; -void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect); +#include "includes/metro.h" static READ16_HANDLER ( varia_crom_read ) { /* game reads the cgrom, result is 7772, verified to be correct on the real board */ + metro_state *state = (metro_state *)space->machine->driver_data; UINT8 *cgrom = memory_region(space->machine, "gfx1"); UINT16 retdat; + offset = offset << 1; - offset |= (vmetal_videoregs[0x0ab/2]&0x7f) << 16; - retdat = ((cgrom[offset] <<8)| (cgrom[offset+1])); -// popmessage("varia romread offset %06x data %04x",offset, retdat); + offset |= (state->vmetal_videoregs[0x0ab / 2] & 0x7f) << 16; + retdat = ((cgrom[offset] << 8) | (cgrom[offset + 1])); + // popmessage("varia romread offset %06x data %04x", offset, retdat); return retdat; } @@ -117,30 +105,36 @@ static READ16_HANDLER ( varia_random ) -static void get_vmetal_tlookup(UINT16 data, UINT16 *tileno, UINT16 *color) +static void get_vmetal_tlookup(running_machine *machine, UINT16 data, UINT16 *tileno, UINT16 *color) { - int idx = ((data & 0x7fff) >> 4)*2; - UINT32 lookup = (vmetal_tlookup[idx]<<16) | vmetal_tlookup[idx+1]; - *tileno = (data & 0xf) | ((lookup>>2) & 0xfff0); - *color = (lookup>>20) & 0xff; + metro_state *state = (metro_state *)machine->driver_data; + int idx = ((data & 0x7fff) >> 4) * 2; + UINT32 lookup = (state->vmetal_tlookup[idx] << 16) | state->vmetal_tlookup[idx + 1]; + + *tileno = (data & 0xf) | ((lookup >> 2) & 0xfff0); + *color = (lookup >> 20) & 0xff; } static WRITE16_HANDLER( vmetal_texttileram_w ) { - COMBINE_DATA(&vmetal_texttileram[offset]); - tilemap_mark_tile_dirty(vmetal_texttilemap,offset); + metro_state *state = (metro_state *)space->machine->driver_data; + COMBINE_DATA(&state->vmetal_texttileram[offset]); + tilemap_mark_tile_dirty(state->vmetal_texttilemap, offset); } static WRITE16_HANDLER( vmetal_mid1tileram_w ) { - COMBINE_DATA(&vmetal_mid1tileram[offset]); - tilemap_mark_tile_dirty(vmetal_mid1tilemap,offset); + metro_state *state = (metro_state *)space->machine->driver_data; + COMBINE_DATA(&state->vmetal_mid1tileram[offset]); + tilemap_mark_tile_dirty(state->vmetal_mid1tilemap, offset); } + static WRITE16_HANDLER( vmetal_mid2tileram_w ) { - COMBINE_DATA(&vmetal_mid2tileram[offset]); - tilemap_mark_tile_dirty(vmetal_mid2tilemap,offset); + metro_state *state = (metro_state *)space->machine->driver_data; + COMBINE_DATA(&state->vmetal_mid2tileram[offset]); + tilemap_mark_tile_dirty(state->vmetal_mid2tilemap, offset); } @@ -157,10 +151,10 @@ static WRITE8_DEVICE_HANDLER( vmetal_control_w ) { /* Lower nibble is the coin control bits shown in service mode, but in game mode they're different */ - coin_counter_w(device->machine, 0,data & 0x04); - coin_counter_w(device->machine, 1,data & 0x08); /* 2nd coin schute activates coin 0 counter in game mode?? */ -// coin_lockout_w(device->machine, 0,data & 0x01); /* always on in game mode?? */ - coin_lockout_w(device->machine, 1,data & 0x02); /* never activated in game mode?? */ + coin_counter_w(device->machine, 0, data & 0x04); + coin_counter_w(device->machine, 1, data & 0x08); /* 2nd coin schute activates coin 0 counter in game mode?? */ +// coin_lockout_w(device->machine, 0, data & 0x01); /* always on in game mode?? */ + coin_lockout_w(device->machine, 1, data & 0x02); /* never activated in game mode?? */ if ((data & 0x40) == 0) device->reset(); @@ -209,45 +203,45 @@ static WRITE8_DEVICE_HANDLER( vmetal_es8712_w ) */ es8712_w(device, offset, data); - logerror("%s:Writing %04x to ES8712 offset %02x\n",cpuexec_describe_context(device->machine),data,offset); + logerror("%s:Writing %04x to ES8712 offset %02x\n", cpuexec_describe_context(device->machine), data, offset); } static ADDRESS_MAP_START( varia_program_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x000000, 0x0fffff) AM_ROM - AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(vmetal_texttileram_w) AM_BASE(&vmetal_texttileram) - AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(vmetal_mid1tileram_w) AM_BASE(&vmetal_mid1tileram) - AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(vmetal_mid2tileram_w) AM_BASE(&vmetal_mid2tileram) + AM_RANGE(0x100000, 0x11ffff) AM_RAM_WRITE(vmetal_texttileram_w) AM_BASE_MEMBER(metro_state, vmetal_texttileram) + AM_RANGE(0x120000, 0x13ffff) AM_RAM_WRITE(vmetal_mid1tileram_w) AM_BASE_MEMBER(metro_state, vmetal_mid1tileram) + AM_RANGE(0x140000, 0x15ffff) AM_RAM_WRITE(vmetal_mid2tileram_w) AM_BASE_MEMBER(metro_state, vmetal_mid2tileram) AM_RANGE(0x160000, 0x16ffff) AM_READ(varia_crom_read) // cgrom read window .. AM_RANGE(0x170000, 0x173fff) AM_RAM_WRITE(paletteram16_GGGGGRRRRRBBBBBx_word_w) AM_BASE_GENERIC(paletteram) // Palette - AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) + AM_RANGE(0x174000, 0x174fff) AM_RAM AM_BASE_SIZE_MEMBER(metro_state, spriteram, spriteram_size) AM_RANGE(0x175000, 0x177fff) AM_RAM - AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE(&vmetal_tlookup) - AM_RANGE(0x178800, 0x1796ff) AM_RAM AM_BASE(&vmetal_videoregs) - AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE(&metro_videoregs ) // Video Registers + AM_RANGE(0x178000, 0x1787ff) AM_RAM AM_BASE_MEMBER(metro_state, vmetal_tlookup) + AM_RANGE(0x178800, 0x1796ff) AM_RAM AM_BASE_MEMBER(metro_state, vmetal_videoregs) + AM_RANGE(0x179700, 0x179713) AM_WRITEONLY AM_BASE_MEMBER(metro_state, videoregs) // Video Registers AM_RANGE(0x200000, 0x200001) AM_READ_PORT("P1_P2") AM_DEVWRITE8("essnd", vmetal_control_w, 0x00ff) AM_RANGE(0x200002, 0x200003) AM_READ_PORT("SYSTEM") /* i have no idea whats meant to be going on here .. it seems to read one bit of the dips from some of them, protection ??? */ - AM_RANGE(0x30fffe, 0x30ffff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x317ffe, 0x317fff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x31bffe, 0x31bfff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x31dffe, 0x31dfff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x31effe, 0x31efff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x31f7fe, 0x31f7ff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x31fbfe, 0x31fbff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x31fdfe, 0x31fdff) AM_READ(varia_random ) // nothing? - AM_RANGE(0x31fefe, 0x31feff) AM_READ(varia_dips_bit8_r ) // 0x40 = dip1-8 , 0x80 = dip2-8 - AM_RANGE(0x31ff7e, 0x31ff7f) AM_READ(varia_dips_bit7_r ) // 0x40 = dip1-7 , 0x80 = dip2-7 - AM_RANGE(0x31ffbe, 0x31ffbf) AM_READ(varia_dips_bit6_r ) // 0x40 = dip1-6 , 0x80 = dip2-6 - AM_RANGE(0x31ffde, 0x31ffdf) AM_READ(varia_dips_bit5_r ) // 0x40 = dip1-5 , 0x80 = dip2-5 - AM_RANGE(0x31ffee, 0x31ffef) AM_READ(varia_dips_bit4_r ) // 0x40 = dip1-4 , 0x80 = dip2-4 - AM_RANGE(0x31fff6, 0x31fff7) AM_READ(varia_dips_bit3_r ) // 0x40 = dip1-3 , 0x80 = dip2-3 - AM_RANGE(0x31fffa, 0x31fffb) AM_READ(varia_dips_bit2_r ) // 0x40 = dip1-2 , 0x80 = dip2-2 - AM_RANGE(0x31fffc, 0x31fffd) AM_READ(varia_dips_bit1_r ) // 0x40 = dip1-1 , 0x80 = dip2-1 + AM_RANGE(0x30fffe, 0x30ffff) AM_READ(varia_random) // nothing? + AM_RANGE(0x317ffe, 0x317fff) AM_READ(varia_random) // nothing? + AM_RANGE(0x31bffe, 0x31bfff) AM_READ(varia_random) // nothing? + AM_RANGE(0x31dffe, 0x31dfff) AM_READ(varia_random) // nothing? + AM_RANGE(0x31effe, 0x31efff) AM_READ(varia_random) // nothing? + AM_RANGE(0x31f7fe, 0x31f7ff) AM_READ(varia_random) // nothing? + AM_RANGE(0x31fbfe, 0x31fbff) AM_READ(varia_random) // nothing? + AM_RANGE(0x31fdfe, 0x31fdff) AM_READ(varia_random) // nothing? + AM_RANGE(0x31fefe, 0x31feff) AM_READ(varia_dips_bit8_r) // 0x40 = dip1-8 , 0x80 = dip2-8 + AM_RANGE(0x31ff7e, 0x31ff7f) AM_READ(varia_dips_bit7_r) // 0x40 = dip1-7 , 0x80 = dip2-7 + AM_RANGE(0x31ffbe, 0x31ffbf) AM_READ(varia_dips_bit6_r) // 0x40 = dip1-6 , 0x80 = dip2-6 + AM_RANGE(0x31ffde, 0x31ffdf) AM_READ(varia_dips_bit5_r) // 0x40 = dip1-5 , 0x80 = dip2-5 + AM_RANGE(0x31ffee, 0x31ffef) AM_READ(varia_dips_bit4_r) // 0x40 = dip1-4 , 0x80 = dip2-4 + AM_RANGE(0x31fff6, 0x31fff7) AM_READ(varia_dips_bit3_r) // 0x40 = dip1-3 , 0x80 = dip2-3 + AM_RANGE(0x31fffa, 0x31fffb) AM_READ(varia_dips_bit2_r) // 0x40 = dip1-2 , 0x80 = dip2-2 + AM_RANGE(0x31fffc, 0x31fffd) AM_READ(varia_dips_bit1_r) // 0x40 = dip1-1 , 0x80 = dip2-1 AM_RANGE(0x31fffe, 0x31ffff) AM_READ(varia_random ) // nothing? AM_RANGE(0x400000, 0x400001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff ) @@ -260,7 +254,7 @@ ADDRESS_MAP_END static INPUT_PORTS_START( varia ) - PORT_START("P1_P2") /* IN0 */ + PORT_START("P1_P2") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) @@ -278,7 +272,7 @@ static INPUT_PORTS_START( varia ) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START1 ) - PORT_START("SYSTEM") /* IN1 */ + PORT_START("SYSTEM") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_TILT ) @@ -286,7 +280,7 @@ static INPUT_PORTS_START( varia ) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SERVICE2 ) // 'Test' PORT_BIT( 0xffe0, IP_ACTIVE_LOW, IPT_UNKNOWN ) // unused? - PORT_START("DSW1") /* Dips 1 */ + PORT_START("DSW1") PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x0005, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x0006, DEF_STR( 2C_1C ) ) @@ -312,7 +306,7 @@ static INPUT_PORTS_START( varia ) PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_START("DSW2") /* Dips 2 */ + PORT_START("DSW2") PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown )) PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) @@ -368,68 +362,95 @@ GFXDECODE_END static TILE_GET_INFO( get_vmetal_texttilemap_tile_info ) { + metro_state *state = (metro_state *)machine->driver_data; UINT32 tile; - UINT16 color, data = vmetal_texttileram[tile_index]; - int idx = ((data & 0x7fff) >> 4)*2; - UINT32 lookup = (vmetal_tlookup[idx]<<16) | vmetal_tlookup[idx+1]; + UINT16 color, data = state->vmetal_texttileram[tile_index]; + int idx = ((data & 0x7fff) >> 4) * 2; + UINT32 lookup = (state->vmetal_tlookup[idx] << 16) | state->vmetal_tlookup[idx + 1]; + tile = (data & 0xf) | (lookup & 0x7fff0); - color = ((lookup>>20) & 0x1f)+0xe0; - if (data & 0x8000) tile = 0; + color = ((lookup >> 20) & 0x1f) + 0xe0; + + if (data & 0x8000) + tile = 0; + SET_TILE_INFO(1, tile, color, TILE_FLIPYX(0x0)); } static TILE_GET_INFO( get_vmetal_mid1tilemap_tile_info ) { - UINT16 tile, color, data = vmetal_mid1tileram[tile_index]; - get_vmetal_tlookup(data, &tile, &color); - if (data & 0x8000) tile = 0; + metro_state *state = (metro_state *)machine->driver_data; + UINT16 tile, color, data = state->vmetal_mid1tileram[tile_index]; + + get_vmetal_tlookup(machine, data, &tile, &color); + + if (data & 0x8000) + tile = 0; + SET_TILE_INFO(0, tile, color, TILE_FLIPYX(0x0)); } + static TILE_GET_INFO( get_vmetal_mid2tilemap_tile_info ) { - UINT16 tile, color, data = vmetal_mid2tileram[tile_index]; - get_vmetal_tlookup(data, &tile, &color); - if (data & 0x8000) tile = 0; + metro_state *state = (metro_state *)machine->driver_data; + UINT16 tile, color, data = state->vmetal_mid2tileram[tile_index]; + + get_vmetal_tlookup(machine, data, &tile, &color); + + if (data & 0x8000) + tile = 0; + SET_TILE_INFO(0, tile, color, TILE_FLIPYX(0x0)); } static VIDEO_START(varia) { - vmetal_texttilemap = tilemap_create(machine, get_vmetal_texttilemap_tile_info,tilemap_scan_rows, 8, 8, 256,256); - vmetal_mid1tilemap = tilemap_create(machine, get_vmetal_mid1tilemap_tile_info,tilemap_scan_rows,16,16, 256,256); - vmetal_mid2tilemap = tilemap_create(machine, get_vmetal_mid2tilemap_tile_info,tilemap_scan_rows,16,16, 256,256); - tilemap_set_transparent_pen(vmetal_texttilemap,15); - tilemap_set_transparent_pen(vmetal_mid1tilemap,15); - tilemap_set_transparent_pen(vmetal_mid2tilemap,15); + metro_state *state = (metro_state *)machine->driver_data; + + state->vmetal_texttilemap = tilemap_create(machine, get_vmetal_texttilemap_tile_info, tilemap_scan_rows, 8, 8, 256, 256); + state->vmetal_mid1tilemap = tilemap_create(machine, get_vmetal_mid1tilemap_tile_info, tilemap_scan_rows, 16, 16, 256, 256); + state->vmetal_mid2tilemap = tilemap_create(machine, get_vmetal_mid2tilemap_tile_info, tilemap_scan_rows, 16, 16, 256, 256); + + tilemap_set_transparent_pen(state->vmetal_texttilemap, 15); + tilemap_set_transparent_pen(state->vmetal_mid1tilemap, 15); + tilemap_set_transparent_pen(state->vmetal_mid2tilemap, 15); } static VIDEO_UPDATE(varia) { + metro_state *state = (metro_state *)screen->machine->driver_data; + bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine)); - bitmap_fill(screen->machine->priority_bitmap,cliprect,0); + bitmap_fill(screen->machine->priority_bitmap, cliprect, 0); - tilemap_set_scrollx(vmetal_mid2tilemap,0, vmetal_videoregs[0x06a/2]-64 /*+ vmetal_videoregs[0x066/2]*/); - tilemap_set_scrollx(vmetal_mid1tilemap,0, vmetal_videoregs[0x07a/2]-64 /*+ vmetal_videoregs[0x076/2]*/); - tilemap_set_scrollx(vmetal_texttilemap,0, -64 /*+ vmetal_videoregs[0x076/2]*/); + tilemap_set_scrollx(state->vmetal_mid2tilemap, 0, state->vmetal_videoregs[0x06a/2]-64 /*+ state->vmetal_videoregs[0x066/2]*/); + tilemap_set_scrollx(state->vmetal_mid1tilemap, 0, state->vmetal_videoregs[0x07a/2]-64 /*+ state->vmetal_videoregs[0x076/2]*/); + tilemap_set_scrollx(state->vmetal_texttilemap, 0, -64 /*+ state->vmetal_videoregs[0x076/2]*/); - tilemap_set_scrolly(vmetal_mid2tilemap,0, -64 ); - tilemap_set_scrolly(vmetal_mid1tilemap,0, -64 ); - tilemap_set_scrolly(vmetal_texttilemap,0, -64 ); + tilemap_set_scrolly(state->vmetal_mid2tilemap, 0, -64); + tilemap_set_scrolly(state->vmetal_mid1tilemap, 0, -64); + tilemap_set_scrolly(state->vmetal_texttilemap, 0, -64); - tilemap_draw(bitmap,cliprect,vmetal_mid1tilemap,0,0); - tilemap_draw(bitmap,cliprect,vmetal_mid2tilemap,0,0); - metro_draw_sprites(screen->machine, bitmap,cliprect); - tilemap_draw(bitmap,cliprect,vmetal_texttilemap,0,0); + tilemap_draw(bitmap, cliprect, state->vmetal_mid1tilemap, 0, 0); + tilemap_draw(bitmap, cliprect, state->vmetal_mid2tilemap, 0, 0); + metro_draw_sprites(screen->machine, bitmap, cliprect); + tilemap_draw(bitmap, cliprect, state->vmetal_texttilemap, 0, 0); return 0; } + static MACHINE_DRIVER_START( varia ) + + /* driver data */ + MDRV_DRIVER_DATA(metro_state) + + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000, 16000000) MDRV_CPU_PROGRAM_MAP(varia_program_map) MDRV_CPU_VBLANK_INT("screen", irq1_line_hold) // also level 3 - + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) @@ -443,6 +464,7 @@ static MACHINE_DRIVER_START( varia ) MDRV_VIDEO_START(varia) MDRV_VIDEO_UPDATE(varia) + /* sound hardware */ MDRV_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MDRV_SOUND_ADD("oki", OKIM6295, 1320000) @@ -494,5 +516,5 @@ ROM_START( vmetaln ) ROM_LOAD( "7.u12", 0x00000, 0x200000, CRC(a88c52f1) SHA1(d74a5a11f84ba6b1042b33a2c156a1071b6fbfe1) ) ROM_END -GAME( 1995, vmetal, 0, varia, varia, 0, ROT270, "Excellent System", "Varia Metal", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) -GAME( 1995, vmetaln, vmetal, varia, varia, 0, ROT270, "[Excellent System] New Ways Trading Co.", "Varia Metal (New Ways Trading Co.)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAME( 1995, vmetal, 0, varia, varia, 0, ROT270, "Excellent System", "Varia Metal", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1995, vmetaln, vmetal, varia, varia, 0, ROT270, "[Excellent System] New Ways Trading Co.", "Varia Metal (New Ways Trading Co.)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/metro.h b/src/mame/includes/metro.h new file mode 100644 index 00000000000..ac044094882 --- /dev/null +++ b/src/mame/includes/metro.h @@ -0,0 +1,100 @@ +/************************************************************************* + + Metro Games + +*************************************************************************/ + +class metro_state +{ +public: + static void *alloc(running_machine &machine) { return auto_alloc_clear(&machine, metro_state(machine)); } + + metro_state(running_machine &machine) { } + + /* memory pointers */ + UINT16 * vram_0; + UINT16 * vram_1; + UINT16 * vram_2; + UINT16 * spriteram; + UINT16 * tiletable; + UINT16 * tiletable_old; + UINT16 * blitter_regs; + UINT16 * scroll; + UINT16 * window; + UINT16 * irq_enable; + UINT16 * irq_levels; + UINT16 * irq_vectors; + UINT16 * rombank; + UINT16 * videoregs; + UINT16 * screenctrl; + UINT16 * input_sel; + UINT16 * k053936_ram; + UINT8 * dirtyindex; + UINT8 * empty_tiles; + + size_t spriteram_size; + size_t tiletable_size; + + +// UINT16 * paletteram; // currently this uses generic palette handling + + /* video-related */ + tilemap_t *k053936_tilemap; + tilemap_t *bg_tilemap[3]; + tilemap_t *tilemap_16x16[3]; + int support_8bpp, support_16x16; + int has_zoom; + int sprite_xoffs, sprite_yoffs; + + /* blitter */ + int blitter_bit; + + /* irq_related */ + int irq_line; + UINT8 requested_int[8]; + emu_timer *mouja_irq_timer; + + /* sound related */ + UINT16 soundstatus; + int porta, portb, busy_sndcpu; + + /* misc */ + int gakusai_oki_bank_lo, gakusai_oki_bank_hi; + + /* used by vmetal.c */ + UINT16 *vmetal_texttileram; + UINT16 *vmetal_mid1tileram; + UINT16 *vmetal_mid2tileram; + UINT16 *vmetal_tlookup; + UINT16 *vmetal_videoregs; + + tilemap_t *vmetal_texttilemap; + tilemap_t *vmetal_mid1tilemap; + tilemap_t *vmetal_mid2tilemap; + + /* devices */ + running_device *maincpu; + running_device *audiocpu; + running_device *oki; + running_device *ymsnd; + running_device *k053936; +}; + + +/*----------- defined in video/metro.c -----------*/ + +WRITE16_HANDLER( metro_window_w ); +WRITE16_HANDLER( metro_vram_0_w ); +WRITE16_HANDLER( metro_vram_1_w ); +WRITE16_HANDLER( metro_vram_2_w ); +WRITE16_HANDLER( metro_k053936_w ); + +VIDEO_START( metro_14100 ); +VIDEO_START( metro_14220 ); +VIDEO_START( metro_14300 ); +VIDEO_START( blzntrnd ); +VIDEO_START( gstrik2 ); + +VIDEO_UPDATE( metro ); + +void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect); diff --git a/src/mame/video/metro.c b/src/mame/video/metro.c index b0b5fc63e45..30f237af2fc 100644 --- a/src/mame/video/metro.c +++ b/src/mame/video/metro.c @@ -52,32 +52,14 @@ Note: if MAME_DEBUG is defined, pressing Z with: ***************************************************************************/ #include "emu.h" +#include "includes/metro.h" #include "video/konicdev.h" -/* Variables that driver has access to: */ -UINT16 *metro_videoregs; -UINT16 *metro_screenctrl; -UINT16 *metro_scroll; -UINT16 *metro_tiletable; -size_t metro_tiletable_size; -UINT16 *metro_vram_0,*metro_vram_1,*metro_vram_2; -UINT16 *metro_window; - -static int support_8bpp,support_16x16; -static int has_zoom; - - -UINT16 *metro_K053936_ram; -static tilemap_t *metro_K053936_tilemap; - -static UINT16 *metro_tiletable_old; -static UINT8 *dirtyindex; - - -static TILE_GET_INFO( metro_K053936_get_tile_info ) +static TILE_GET_INFO( metro_k053936_get_tile_info ) { - int code = metro_K053936_ram[tile_index]; + metro_state *state = (metro_state *)machine->driver_data; + int code = state->k053936_ram[tile_index]; SET_TILE_INFO( 2, @@ -86,9 +68,10 @@ static TILE_GET_INFO( metro_K053936_get_tile_info ) 0); } -static TILE_GET_INFO( metro_K053936_gstrik2_get_tile_info ) +static TILE_GET_INFO( metro_k053936_gstrik2_get_tile_info ) { - int code = metro_K053936_ram[tile_index]; + metro_state *state = (metro_state *)machine->driver_data; + int code = state->k053936_ram[tile_index]; SET_TILE_INFO( 2, @@ -97,10 +80,11 @@ static TILE_GET_INFO( metro_K053936_gstrik2_get_tile_info ) 0); } -WRITE16_HANDLER( metro_K053936_w ) +WRITE16_HANDLER( metro_k053936_w ) { - COMBINE_DATA(&metro_K053936_ram[offset]); - tilemap_mark_tile_dirty(metro_K053936_tilemap,offset); + metro_state *state = (metro_state *)space->machine->driver_data; + COMBINE_DATA(&state->k053936_ram[offset]); + tilemap_mark_tile_dirty(state->k053936_tilemap, offset); } static TILEMAP_MAPPER( tilemap_scan_gstrik2 ) @@ -108,10 +92,10 @@ static TILEMAP_MAPPER( tilemap_scan_gstrik2 ) /* logical (col,row) -> memory offset */ int val; - val = (row&0x3f)*(256*2) + (col*2); + val = (row & 0x3f) * (256 * 2) + (col * 2); - if (row&0x40) val+=1; - if (row&0x80) val+=256; + if (row & 0x40) val += 1; + if (row & 0x80) val += 256; return val; } @@ -129,7 +113,7 @@ static TILEMAP_MAPPER( tilemap_scan_gstrik2 ) WRITE16_HANDLER( metro_paletteram_w ) { data = COMBINE_DATA(&space->machine->generic.paletteram.u16[offset]); - palette_set_color_rgb(space->machine,offset,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1)); + palette_set_color_rgb(space->machine, offset, pal5bit(data >> 6), pal5bit(data >> 11), pal5bit(data >> 1)); } #endif @@ -163,46 +147,41 @@ WRITE16_HANDLER( metro_paletteram_w ) ***************************************************************************/ -static tilemap_t *bg_tilemap[3]; -static tilemap_t *tilemap_16x16[3]; -static UINT8 *empty_tiles; - /* A 2048 x 2048 virtual tilemap */ - -#define BIG_NX (0x100) -#define BIG_NY (0x100) +#define BIG_NX 0x100 +#define BIG_NY 0x100 /* A smaller 512 x 256 window defines the actual tilemap */ -#define WIN_NX (0x40) -#define WIN_NY (0x20) -//#define WIN_NX (0x40+1) -//#define WIN_NY (0x20+1) +#define WIN_NX 0x40 +#define WIN_NY 0x20 +//#define WIN_NX 0x40 + 1 +//#define WIN_NY 0x20 + 1 /* 8x8x4 tiles only */ -INLINE void get_tile_info(running_machine *machine,tile_data *tileinfo,int tile_index,int layer,UINT16 *vram) +INLINE void get_tile_info( running_machine *machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram ) { + metro_state *state = (metro_state *)machine->driver_data; UINT16 code; - int table_index; - UINT32 tile; + int table_index; + UINT32 tile; /* The actual tile index depends on the window */ - tile_index = ((tile_index / WIN_NX + metro_window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX + - ((tile_index % WIN_NX + metro_window[layer * 2 + 1] / 8) % BIG_NX); + tile_index = ((tile_index / WIN_NX + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX + + ((tile_index % WIN_NX + state->window[layer * 2 + 1] / 8) % BIG_NX); /* Fetch the code */ - code = vram[ tile_index ]; + code = vram[tile_index]; /* Use it as an index into the tiles set table */ - table_index = ( (code & 0x1ff0) >> 4 ) * 2; - tile = (metro_tiletable[table_index + 0] << 16 ) + - metro_tiletable[table_index + 1]; + table_index = ((code & 0x1ff0) >> 4) * 2; + tile = (state->tiletable[table_index + 0] << 16) + state->tiletable[table_index + 1]; if (code & 0x8000) /* Special: draw a tile of a single color (i.e. not from the gfx ROMs) */ { int _code = code & 0x000f; - tileinfo->pen_data = empty_tiles + _code*16*16; + tileinfo->pen_data = state->empty_tiles + _code * 16 * 16; tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000; tileinfo->flags = 0; tileinfo->group = 0; @@ -221,33 +200,33 @@ INLINE void get_tile_info(running_machine *machine,tile_data *tileinfo,int tile_ /* 8x8x4 or 8x8x8 tiles. It's the tile's color that decides: if its low 4 bits are high ($f,$1f,$2f etc) the tile is 8bpp, otherwise it's 4bpp */ -INLINE void get_tile_info_8bit(running_machine *machine,tile_data *tileinfo,int tile_index,int layer,UINT16 *vram) +INLINE void get_tile_info_8bit( running_machine *machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram ) { + metro_state *state = (metro_state *)machine->driver_data; UINT16 code; - int table_index; - UINT32 tile; + int table_index; + UINT32 tile; /* The actual tile index depends on the window */ - tile_index = ((tile_index / WIN_NX + metro_window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX + - ((tile_index % WIN_NX + metro_window[layer * 2 + 1] / 8) % BIG_NX); + tile_index = ((tile_index / WIN_NX + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX + + ((tile_index % WIN_NX + state->window[layer * 2 + 1] / 8) % BIG_NX); /* Fetch the code */ - code = vram[ tile_index ]; + code = vram[tile_index]; /* Use it as an index into the tiles set table */ - table_index = ( (code & 0x1ff0) >> 4 ) * 2; - tile = (metro_tiletable[table_index + 0] << 16 ) + - metro_tiletable[table_index + 1]; + table_index = ((code & 0x1ff0) >> 4) * 2; + tile = (state->tiletable[table_index + 0] << 16) + state->tiletable[table_index + 1]; if (code & 0x8000) /* Special: draw a tile of a single color (i.e. not from the gfx ROMs) */ { int _code = code & 0x000f; - tileinfo->pen_data = empty_tiles + _code*16*16; + tileinfo->pen_data = state->empty_tiles + _code * 16 * 16; tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000; tileinfo->flags = 0; tileinfo->group = 0; } - else if ((tile & 0x00f00000)==0x00f00000) /* draw tile as 8bpp */ + else if ((tile & 0x00f00000) == 0x00f00000) /* draw tile as 8bpp */ { tileinfo->group = 1; SET_TILE_INFO( @@ -269,33 +248,33 @@ INLINE void get_tile_info_8bit(running_machine *machine,tile_data *tileinfo,int /* 16x16x4 or 16x16x8 tiles. It's the tile's color that decides: if its low 4 bits are high ($f,$1f,$2f etc) the tile is 8bpp, otherwise it's 4bpp */ -INLINE void get_tile_info_16x16_8bit(running_machine *machine,tile_data *tileinfo,int tile_index,int layer,UINT16 *vram) +INLINE void get_tile_info_16x16_8bit( running_machine *machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram ) { + metro_state *state = (metro_state *)machine->driver_data; UINT16 code; - int table_index; - UINT32 tile; + int table_index; + UINT32 tile; /* The actual tile index depends on the window */ - tile_index = ((tile_index / WIN_NX + metro_window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX + - ((tile_index % WIN_NX + metro_window[layer * 2 + 1] / 8) % BIG_NX); + tile_index = ((tile_index / WIN_NX + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX + + ((tile_index % WIN_NX + state->window[layer * 2 + 1] / 8) % BIG_NX); /* Fetch the code */ - code = vram[ tile_index ]; + code = vram[tile_index]; /* Use it as an index into the tiles set table */ - table_index = ( (code & 0x1ff0) >> 4 ) * 2; - tile = (metro_tiletable[table_index + 0] << 16 ) + - metro_tiletable[table_index + 1]; + table_index = ((code & 0x1ff0) >> 4) * 2; + tile = (state->tiletable[table_index + 0] << 16) + state->tiletable[table_index + 1]; if (code & 0x8000) /* Special: draw a tile of a single color (i.e. not from the gfx ROMs) */ { int _code = code & 0x000f; - tileinfo->pen_data = empty_tiles + _code*16*16; + tileinfo->pen_data = state->empty_tiles + _code * 16 * 16; tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000; tileinfo->flags = 0; tileinfo->group = 0; } - else if ((tile & 0x00f00000)==0x00f00000) /* draw tile as 8bpp */ + else if ((tile & 0x00f00000) == 0x00f00000) /* draw tile as 8bpp */ { tileinfo->group = 1; SET_TILE_INFO( @@ -317,55 +296,58 @@ INLINE void get_tile_info_16x16_8bit(running_machine *machine,tile_data *tileinf } -INLINE void metro_vram_w(offs_t offset,UINT16 data,UINT16 mem_mask,int layer,UINT16 *vram) +INLINE void metro_vram_w( running_machine *machine, offs_t offset, UINT16 data, UINT16 mem_mask, int layer, UINT16 *vram ) { + metro_state *state = (metro_state *)machine->driver_data; + COMBINE_DATA(&vram[offset]); { /* Account for the window */ - int col = (offset % BIG_NX) - ((metro_window[layer * 2 + 1] / 8) % BIG_NX); - int row = (offset / BIG_NX) - ((metro_window[layer * 2 + 0] / 8) % BIG_NY); + int col = (offset % BIG_NX) - ((state->window[layer * 2 + 1] / 8) % BIG_NX); + int row = (offset / BIG_NX) - ((state->window[layer * 2 + 0] / 8) % BIG_NY); if (col < -(BIG_NX-WIN_NX)) col += (BIG_NX-WIN_NX) + WIN_NX; if (row < -(BIG_NY-WIN_NY)) row += (BIG_NY-WIN_NY) + WIN_NY; - if ( (col >= 0) && (col < WIN_NX) && - (row >= 0) && (row < WIN_NY) ) + if ((col >= 0) && (col < WIN_NX) && (row >= 0) && (row < WIN_NY)) { - tilemap_mark_tile_dirty(bg_tilemap[layer], row * WIN_NX + col ); - if (tilemap_16x16[layer]) - tilemap_mark_tile_dirty(tilemap_16x16[layer], row * WIN_NX + col ); + tilemap_mark_tile_dirty(state->bg_tilemap[layer], row * WIN_NX + col); + if (state->tilemap_16x16[layer]) + tilemap_mark_tile_dirty(state->tilemap_16x16[layer], row * WIN_NX + col); } } } -static TILE_GET_INFO( get_tile_info_0 ) { get_tile_info(machine,tileinfo,tile_index,0,metro_vram_0); } -static TILE_GET_INFO( get_tile_info_1 ) { get_tile_info(machine,tileinfo,tile_index,1,metro_vram_1); } -static TILE_GET_INFO( get_tile_info_2 ) { get_tile_info(machine,tileinfo,tile_index,2,metro_vram_2); } +static TILE_GET_INFO( get_tile_info_0 ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info(machine, tileinfo, tile_index, 0, state->vram_0); } +static TILE_GET_INFO( get_tile_info_1 ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info(machine, tileinfo, tile_index, 1, state->vram_1); } +static TILE_GET_INFO( get_tile_info_2 ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info(machine, tileinfo, tile_index, 2, state->vram_2); } -static TILE_GET_INFO( get_tile_info_0_8bit ) { get_tile_info_8bit(machine,tileinfo,tile_index,0,metro_vram_0); } -static TILE_GET_INFO( get_tile_info_1_8bit ) { get_tile_info_8bit(machine,tileinfo,tile_index,1,metro_vram_1); } -static TILE_GET_INFO( get_tile_info_2_8bit ) { get_tile_info_8bit(machine,tileinfo,tile_index,2,metro_vram_2); } +static TILE_GET_INFO( get_tile_info_0_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_8bit(machine, tileinfo, tile_index, 0, state->vram_0); } +static TILE_GET_INFO( get_tile_info_1_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_8bit(machine, tileinfo, tile_index, 1, state->vram_1); } +static TILE_GET_INFO( get_tile_info_2_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_8bit(machine, tileinfo, tile_index, 2, state->vram_2); } -static TILE_GET_INFO( get_tile_info_0_16x16_8bit ) { get_tile_info_16x16_8bit(machine,tileinfo,tile_index,0,metro_vram_0); } -static TILE_GET_INFO( get_tile_info_1_16x16_8bit ) { get_tile_info_16x16_8bit(machine,tileinfo,tile_index,1,metro_vram_1); } -static TILE_GET_INFO( get_tile_info_2_16x16_8bit ) { get_tile_info_16x16_8bit(machine,tileinfo,tile_index,2,metro_vram_2); } +static TILE_GET_INFO( get_tile_info_0_16x16_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_16x16_8bit(machine, tileinfo, tile_index, 0, state->vram_0); } +static TILE_GET_INFO( get_tile_info_1_16x16_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_16x16_8bit(machine, tileinfo, tile_index, 1, state->vram_1); } +static TILE_GET_INFO( get_tile_info_2_16x16_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_16x16_8bit(machine, tileinfo, tile_index, 2, state->vram_2); } -WRITE16_HANDLER( metro_vram_0_w ) { metro_vram_w(offset,data,mem_mask,0,metro_vram_0); } -WRITE16_HANDLER( metro_vram_1_w ) { metro_vram_w(offset,data,mem_mask,1,metro_vram_1); } -WRITE16_HANDLER( metro_vram_2_w ) { metro_vram_w(offset,data,mem_mask,2,metro_vram_2); } +WRITE16_HANDLER( metro_vram_0_w ) { metro_state *state = (metro_state *)space->machine->driver_data; metro_vram_w(space->machine, offset, data, mem_mask, 0, state->vram_0); } +WRITE16_HANDLER( metro_vram_1_w ) { metro_state *state = (metro_state *)space->machine->driver_data; metro_vram_w(space->machine, offset, data, mem_mask, 1, state->vram_1); } +WRITE16_HANDLER( metro_vram_2_w ) { metro_state *state = (metro_state *)space->machine->driver_data; metro_vram_w(space->machine, offset, data, mem_mask, 2, state->vram_2); } /* Dirty the relevant tilemap when its window changes */ WRITE16_HANDLER( metro_window_w ) { - UINT16 olddata = metro_window[offset]; - UINT16 newdata = COMBINE_DATA( &metro_window[offset] ); - if ( newdata != olddata ) + metro_state *state = (metro_state *)space->machine->driver_data; + UINT16 olddata = state->window[offset]; + UINT16 newdata = COMBINE_DATA(&state->window[offset]); + if (newdata != olddata) { offset /= 2; - tilemap_mark_all_tiles_dirty(bg_tilemap[offset]); - if (tilemap_16x16[offset]) tilemap_mark_all_tiles_dirty(tilemap_16x16[offset]); + tilemap_mark_all_tiles_dirty(state->bg_tilemap[offset]); + if (state->tilemap_16x16[offset]) + tilemap_mark_all_tiles_dirty(state->tilemap_16x16[offset]); } } @@ -387,144 +369,198 @@ WRITE16_HANDLER( metro_window_w ) the tile's sizes to be known at startup - which we don't! */ -static int metro_sprite_xoffs, metro_sprite_yoffs; - - -static void alloc_empty_tiles(running_machine *machine) +/* Dirty tilemaps when the tiles set changes */ +static void dirty_tiles( running_machine *machine, int layer, UINT16 *vram ) { - int code,i; + metro_state *state = (metro_state *)machine->driver_data; + int col, row; - empty_tiles = auto_alloc_array(machine, UINT8, 16*16*16); + for (row = 0; row < WIN_NY; row++) + { + for (col = 0; col < WIN_NX; col++) + { + int offset = (col + state->window[layer * 2 + 1] / 8) % BIG_NX + + ((row + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX; + UINT16 code = vram[offset]; - for (code = 0;code < 0x10;code++) - for (i = 0;i < 16*16;i++) - empty_tiles[16*16*code + i] = code; + if (!(code & 0x8000) && state->dirtyindex[(code & 0x1ff0) >> 4]) + { + tilemap_mark_tile_dirty(state->bg_tilemap[layer], row * WIN_NX + col); + if (state->tilemap_16x16[layer]) + tilemap_mark_tile_dirty(state->tilemap_16x16[layer], row * WIN_NX + col); + } + } + } +} + +static STATE_POSTLOAD( metro_tile_dirty_postload ) +{ + metro_state *state = (metro_state *)machine->driver_data; + + /* FIXME: this is still not enough in some games (e.g. 3kokushi) */ + memset(state->dirtyindex, 1, state->tiletable_size / 4); + dirty_tiles(machine, 0, state->vram_0); + dirty_tiles(machine, 1, state->vram_1); + dirty_tiles(machine, 2, state->vram_2); + + memcpy(state->tiletable_old, state->tiletable, state->tiletable_size); +} + +static void alloc_empty_tiles( running_machine *machine ) +{ + metro_state *state = (metro_state *)machine->driver_data; + int code, i; + + state->empty_tiles = auto_alloc_array(machine, UINT8, 16 * 16 * 16); + + for (code = 0; code < 0x10; code++) + for (i = 0; i < 16 * 16; i++) + state->empty_tiles[16 * 16 * code + i] = code; } VIDEO_START( metro_14100 ) { - support_8bpp = 0; - support_16x16 = 0; - has_zoom = 0; + metro_state *state = (metro_state *)machine->driver_data; + + state->support_8bpp = 0; + state->support_16x16 = 0; + state->has_zoom = 0; alloc_empty_tiles(machine); - metro_tiletable_old = auto_alloc_array(machine, UINT16, metro_tiletable_size/2); - dirtyindex = auto_alloc_array(machine, UINT8, metro_tiletable_size/4); - bg_tilemap[0] = tilemap_create(machine, get_tile_info_0,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); - bg_tilemap[1] = tilemap_create(machine, get_tile_info_1,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); - bg_tilemap[2] = tilemap_create(machine, get_tile_info_2,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); + state->tiletable_old = auto_alloc_array(machine, UINT16, state->tiletable_size / 2); + state->dirtyindex = auto_alloc_array(machine, UINT8, state->tiletable_size / 4); - tilemap_16x16[0] = NULL; - tilemap_16x16[1] = NULL; - tilemap_16x16[2] = NULL; + state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); + state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); + state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); - tilemap_map_pen_to_layer(bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->tilemap_16x16[0] = NULL; + state->tilemap_16x16[1] = NULL; + state->tilemap_16x16[2] = NULL; - tilemap_map_pen_to_layer(bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + + state_save_register_global_pointer(machine, state->tiletable_old, state->tiletable_size / 2); + state_save_register_postload(machine, metro_tile_dirty_postload, NULL); } VIDEO_START( metro_14220 ) { - support_8bpp = 1; - support_16x16 = 0; - has_zoom = 0; + metro_state *state = (metro_state *)machine->driver_data; + + state->support_8bpp = 1; + state->support_16x16 = 0; + state->has_zoom = 0; alloc_empty_tiles(machine); - metro_tiletable_old = auto_alloc_array(machine, UINT16, metro_tiletable_size/2); - dirtyindex = auto_alloc_array(machine, UINT8, metro_tiletable_size/4); - bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); - bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); - bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); + state->tiletable_old = auto_alloc_array(machine, UINT16, state->tiletable_size / 2); + state->dirtyindex = auto_alloc_array(machine, UINT8, state->tiletable_size / 4); - tilemap_16x16[0] = NULL; - tilemap_16x16[1] = NULL; - tilemap_16x16[2] = NULL; + state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); + state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); + state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); - tilemap_map_pen_to_layer(bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->tilemap_16x16[0] = NULL; + state->tilemap_16x16[1] = NULL; + state->tilemap_16x16[2] = NULL; - tilemap_map_pen_to_layer(bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_set_scrolldx(bg_tilemap[0], -2, 2); - tilemap_set_scrolldx(bg_tilemap[1], -2, 2); - tilemap_set_scrolldx(bg_tilemap[2], -2, 2); + tilemap_map_pen_to_layer(state->bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + + tilemap_set_scrolldx(state->bg_tilemap[0], -2, 2); + tilemap_set_scrolldx(state->bg_tilemap[1], -2, 2); + tilemap_set_scrolldx(state->bg_tilemap[2], -2, 2); + + state_save_register_global_pointer(machine, state->tiletable_old, state->tiletable_size / 2); + state_save_register_postload(machine, metro_tile_dirty_postload, NULL); } VIDEO_START( metro_14300 ) { - support_8bpp = 1; - support_16x16 = 1; - has_zoom = 0; + metro_state *state = (metro_state *)machine->driver_data; + + state->support_8bpp = 1; + state->support_16x16 = 1; + state->has_zoom = 0; alloc_empty_tiles(machine); - metro_tiletable_old = auto_alloc_array(machine, UINT16, metro_tiletable_size/2); - dirtyindex = auto_alloc_array(machine, UINT8, metro_tiletable_size/4); - bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); - bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); - bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit,tilemap_scan_rows,8,8,WIN_NX,WIN_NY); + state->tiletable_old = auto_alloc_array(machine, UINT16, state->tiletable_size / 2); + state->dirtyindex = auto_alloc_array(machine, UINT8, state->tiletable_size / 4); - tilemap_16x16[0] = tilemap_create(machine, get_tile_info_0_16x16_8bit,tilemap_scan_rows,16,16,WIN_NX,WIN_NY); - tilemap_16x16[1] = tilemap_create(machine, get_tile_info_1_16x16_8bit,tilemap_scan_rows,16,16,WIN_NX,WIN_NY); - tilemap_16x16[2] = tilemap_create(machine, get_tile_info_2_16x16_8bit,tilemap_scan_rows,16,16,WIN_NX,WIN_NY); + state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); + state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); + state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); - tilemap_map_pen_to_layer(bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->tilemap_16x16[0] = tilemap_create(machine, get_tile_info_0_16x16_8bit, tilemap_scan_rows, 16, 16, WIN_NX, WIN_NY); + state->tilemap_16x16[1] = tilemap_create(machine, get_tile_info_1_16x16_8bit, tilemap_scan_rows, 16, 16, WIN_NX, WIN_NY); + state->tilemap_16x16[2] = tilemap_create(machine, get_tile_info_2_16x16_8bit, tilemap_scan_rows, 16, 16, WIN_NX, WIN_NY); - tilemap_map_pen_to_layer(bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(tilemap_16x16[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(tilemap_16x16[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->tilemap_16x16[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->tilemap_16x16[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(tilemap_16x16[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(tilemap_16x16[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->tilemap_16x16[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->tilemap_16x16[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(tilemap_16x16[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(tilemap_16x16[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->tilemap_16x16[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); + tilemap_map_pen_to_layer(state->tilemap_16x16[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + state_save_register_global_pointer(machine, state->tiletable_old, state->tiletable_size / 2); + state_save_register_postload(machine, metro_tile_dirty_postload, NULL); } VIDEO_START( blzntrnd ) { + metro_state *state = (metro_state *)machine->driver_data; + VIDEO_START_CALL(metro_14220); - has_zoom = 1; + state->has_zoom = 1; - metro_K053936_tilemap = tilemap_create(machine, metro_K053936_get_tile_info, tilemap_scan_rows, 8,8, 256, 512 ); + state->k053936_tilemap = tilemap_create(machine, metro_k053936_get_tile_info, tilemap_scan_rows, 8, 8, 256, 512); - tilemap_set_scrolldx(bg_tilemap[0], 8, -8); - tilemap_set_scrolldx(bg_tilemap[1], 8, -8); - tilemap_set_scrolldx(bg_tilemap[2], 8, -8); + tilemap_set_scrolldx(state->bg_tilemap[0], 8, -8); + tilemap_set_scrolldx(state->bg_tilemap[1], 8, -8); + tilemap_set_scrolldx(state->bg_tilemap[2], 8, -8); } VIDEO_START( gstrik2 ) { + metro_state *state = (metro_state *)machine->driver_data; + VIDEO_START_CALL(metro_14220); - has_zoom = 1; + state->has_zoom = 1; - metro_K053936_tilemap = tilemap_create(machine, metro_K053936_gstrik2_get_tile_info, tilemap_scan_gstrik2, 16,16, 128, 256 ); + state->k053936_tilemap = tilemap_create(machine, metro_k053936_gstrik2_get_tile_info, tilemap_scan_gstrik2, 16, 16, 128, 256); - tilemap_set_scrolldx(bg_tilemap[0], 8, -8); - tilemap_set_scrolldx(bg_tilemap[1], 0, 0); - tilemap_set_scrolldx(bg_tilemap[2], 8, -8); + tilemap_set_scrolldx(state->bg_tilemap[0], 8, -8); + tilemap_set_scrolldx(state->bg_tilemap[1], 0, 0); + tilemap_set_scrolldx(state->bg_tilemap[2], 8, -8); } /*************************************************************************** @@ -589,21 +625,22 @@ VIDEO_START( gstrik2 ) /* Draw sprites */ -void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +void metro_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { - UINT8 *base_gfx = memory_region(machine, "gfx1"); - UINT8 *gfx_max = base_gfx + memory_region_length(machine, "gfx1"); + metro_state *state = (metro_state *)machine->driver_data; + UINT8 *base_gfx = memory_region(machine, "gfx1"); + UINT8 *gfx_max = base_gfx + memory_region_length(machine, "gfx1"); int max_x = video_screen_get_width(machine->primary_screen); int max_y = video_screen_get_height(machine->primary_screen); - int max_sprites = machine->generic.spriteram_size / 8; - int sprites = metro_videoregs[0x00/2] % max_sprites; + int max_sprites = state->spriteram_size / 8; + int sprites = state->videoregs[0x00/2] % max_sprites; - int color_start = ((metro_videoregs[0x08/2] & 0xf) << 4 ) + 0x100; + int color_start = ((state->videoregs[0x08/2] & 0x0f) << 4) + 0x100; int i, j, pri; - static const int primask[4] = { 0x0000, 0xff00, 0xff00|0xf0f0, 0xff00|0xf0f0|0xcccc }; + static const int primask[4] = { 0x0000, 0xff00, 0xff00 | 0xf0f0, 0xff00 | 0xf0f0 | 0xcccc }; UINT16 *src; int inc; @@ -611,22 +648,22 @@ void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectan if (sprites == 0) return; - for (i=0; i<0x20; i++) + for (i = 0; i < 0x20; i++) { gfx_element gfx; - if (!(metro_videoregs[0x02/2] & 0x8000)) + if (!(state->videoregs[0x02/2] & 0x8000)) { - src = machine->generic.spriteram.u16 + (sprites - 1) * (8/2); - inc = -(8/2); + src = state->spriteram + (sprites - 1) * (8 / 2); + inc = -(8 / 2); } else { - src = machine->generic.spriteram.u16; - inc = (8/2); + src = state->spriteram; + inc = (8 / 2); } - for (j=0; j> 11; + x = src[0]; + curr_pri = (x & 0xf800) >> 11; if ((curr_pri == 0x1f) || (curr_pri != i)) { @@ -649,31 +686,31 @@ void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectan continue; } - pri = (metro_videoregs[0x02/2] & 0x0300) >> 8; + pri = (state->videoregs[0x02/2] & 0x0300) >> 8; - if (!(metro_videoregs[0x02/2] & 0x8000)) + if (!(state->videoregs[0x02/2] & 0x8000)) { - if (curr_pri > (metro_videoregs[0x02/2] & 0x1f)) - pri = (metro_videoregs[0x02/2] & 0x0c00) >> 10; + if (curr_pri > (state->videoregs[0x02/2] & 0x1f)) + pri = (state->videoregs[0x02/2] & 0x0c00) >> 10; } - y = src[ 1 ]; - attr = src[ 2 ]; - code = src[ 3 ]; + y = src[1]; + attr = src[2]; + code = src[3]; - flipx = attr & 0x8000; - flipy = attr & 0x4000; - color = (attr & 0xf0) >> 4; + flipx = attr & 0x8000; + flipy = attr & 0x4000; + color = (attr & 0xf0) >> 4; - zoom = zoomtable[(y & 0xfc00) >> 10] << (16-8); + zoom = zoomtable[(y & 0xfc00) >> 10] << (16 - 8); - x = (x & 0x07ff) - metro_sprite_xoffs; - y = (y & 0x03ff) - metro_sprite_yoffs; + x = (x & 0x07ff) - state->sprite_xoffs; + y = (y & 0x03ff) - state->sprite_yoffs; - width = (( (attr >> 11) & 0x7 ) + 1 ) * 8; - height = (( (attr >> 8) & 0x7 ) + 1 ) * 8; + width = (((attr >> 11) & 0x7) + 1) * 8; + height = (((attr >> 8) & 0x7) + 1) * 8; - gfxdata = base_gfx + (8*8*4/8) * (((attr & 0x000f) << 16) + code); + gfxdata = base_gfx + (8 * 8 * 4 / 8) * (((attr & 0x000f) << 16) + code); if (flip_screen_get(machine)) { @@ -681,10 +718,10 @@ void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectan flipy = !flipy; y = max_y - y - height; } - if (support_8bpp && color == 0xf) /* 8bpp */ + if (state->support_8bpp && color == 0xf) /* 8bpp */ { /* Bounds checking */ - if ( (gfxdata + width * height - 1) >= gfx_max ) + if ((gfxdata + width * height - 1) >= gfx_max) continue; gfx_element_build_temporary(&gfx, machine, gfxdata, width, height, width, 0, 256, 0); @@ -700,7 +737,7 @@ void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectan else { /* Bounds checking */ - if ( (gfxdata + width/2 * height - 1) >= gfx_max ) + if ((gfxdata + width / 2 * height - 1) >= gfx_max) continue; gfx_element_build_temporary(&gfx, machine, gfxdata, width, height, width/2, 0, 16, GFX_ELEMENT_PACKED); @@ -716,7 +753,7 @@ void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectan #if 0 { /* Display priority + zoom on each sprite */ char buf[80]; - sprintf(buf, "%02X %02X",((src[ 0 ] & 0xf800) >> 11)^0x1f,((src[ 1 ] & 0xfc00) >> 10) ); + sprintf(buf, "%02X %02X", ((src[0] & 0xf800) >> 11) ^ 0x1f, ((src[1] & 0xfc00) >> 10)); ui_draw_text(buf, x, y); } #endif @@ -735,43 +772,43 @@ void metro_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectan ***************************************************************************/ -static void draw_tilemap(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tmap, UINT32 flags, UINT32 priority, - int sx, int sy, int wx, int wy) // scroll & window values +static void draw_tilemap( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tmap, UINT32 flags, UINT32 priority, + int sx, int sy, int wx, int wy ) // scroll & window values { #if 1 tilemap_set_scrollx(tmap, 0, sx - wx + (wx & 7)); tilemap_set_scrolly(tmap, 0, sy - wy + (wy & 7)); - tilemap_draw(bitmap,cliprect,tmap, flags, priority); + tilemap_draw(bitmap, cliprect, tmap, flags, priority); #else - int x,y,i; + int x, y, i; const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen); /* sub tile placement */ -// sx = sx - (wx & ~7) + (wx & 7); - sx = sx - wx; - sx = ( (sx & 0x7fff) - (sx & 0x8000) ) % ((WIN_NX-1)*8); +// sx = sx - (wx & ~7) + (wx & 7); + sx = sx - wx; + sx = ((sx & 0x7fff) - (sx & 0x8000)) % ((WIN_NX - 1) * 8); -// sy = sy - (wy & ~7) + (wy & 7); - sy = sy - wy; - sy = ( (sy & 0x7fff) - (sy & 0x8000) ) % ((WIN_NY-1)*8); +// sy = sy - (wy & ~7) + (wy & 7); + sy = sy - wy; + sy = ((sy & 0x7fff) - (sy & 0x8000)) % ((WIN_NY - 1) * 8); /* splitting point */ - x = (WIN_NX-1)*8 - sx; + x = (WIN_NX - 1) * 8 - sx; - y = (WIN_NY-1)*8 - sy; + y = (WIN_NY - 1) * 8 - sy; - for ( i = 0; i < 4 ; i++ ) + for (i = 0; i < 4 ; i++) { rectangle clip; tilemap_set_scrollx(tmap, 0, sx + ((i & 1) ? -x : 0)); tilemap_set_scrolly(tmap, 0, sy + ((i & 2) ? -y : 0)); - clip.min_x = x - ((i & 1) ? 0 : (WIN_NX-1)*8); - clip.min_y = y - ((i & 2) ? 0 : (WIN_NY-1)*8); + clip.min_x = x - ((i & 1) ? 0 : (WIN_NX - 1) * 8); + clip.min_y = y - ((i & 2) ? 0 : (WIN_NY - 1) * 8); - clip.max_x = clip.min_x + (WIN_NX-1)*8 - 1; - clip.max_y = clip.min_y + (WIN_NY-1)*8 - 1; + clip.max_x = clip.min_x + (WIN_NX - 1) * 8 - 1; + clip.max_y = clip.min_y + (WIN_NY - 1) * 8 - 1; if (clip.min_x > visarea->max_x) continue; if (clip.min_y > visarea->max_y) continue; @@ -789,32 +826,34 @@ static void draw_tilemap(running_machine *machine, bitmap_t *bitmap, const recta This fact renderes the function useless, as far as we are concerned! */ tilemap_set_clip(tmap, &clip); - tilemap_draw(bitmap,cliprect,tmap, flags, priority); + tilemap_draw(bitmap, cliprect, tmap, flags, priority); } #endif } /* Draw all the layers that match the given priority */ -static void draw_layers(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri, int layers_ctrl) +static void draw_layers( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri, int layers_ctrl ) { - UINT16 layers_pri = metro_videoregs[0x10/2]; + metro_state *state = (metro_state *)machine->driver_data; + UINT16 layers_pri = state->videoregs[0x10 / 2]; int layer; /* Draw all the layers with priority == pri */ for (layer = 2; layer >= 0; layer--) // tilemap[2] below? { - if ( pri == ((layers_pri >> (layer*2)) & 3) ) + if (pri == ((layers_pri >> (layer * 2)) & 3)) { /* Scroll and Window values */ - UINT16 sy = metro_scroll[layer * 2 + 0]; UINT16 sx = metro_scroll[layer * 2 + 1]; - UINT16 wy = metro_window[layer * 2 + 0]; UINT16 wx = metro_window[layer * 2 + 1]; + UINT16 sy = state->scroll[layer * 2 + 0]; UINT16 sx = state->scroll[layer * 2 + 1]; + UINT16 wy = state->window[layer * 2 + 0]; UINT16 wx = state->window[layer * 2 + 1]; - if (layers_ctrl & (1<bg_tilemap[layer], 0, 1 << (3 - pri), sx, sy, wx, wy); + if (state->tilemap_16x16[layer]) + draw_tilemap(machine, bitmap, cliprect, state->tilemap_16x16[layer], 0, 1 << (3 - pri), sx, sy, wx, wy); } } } @@ -822,67 +861,43 @@ static void draw_layers(running_machine *machine, bitmap_t *bitmap, const rectan -/* Dirty tilemaps when the tiles set changes */ -static void dirty_tiles(int layer,UINT16 *vram) -{ - int col,row; - - for (row = 0;row < WIN_NY;row++) - { - for (col = 0;col < WIN_NX;col++) - { - int offset = (col + metro_window[layer * 2 + 1] / 8) % BIG_NX + - ((row + metro_window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX; - UINT16 code = vram[offset]; - - if (!(code & 0x8000) && dirtyindex[(code & 0x1ff0) >> 4]) - { - tilemap_mark_tile_dirty(bg_tilemap[layer], row * WIN_NX + col ); - if (tilemap_16x16[layer]) - tilemap_mark_tile_dirty(tilemap_16x16[layer], row * WIN_NX + col ); - } - } - } -} - - VIDEO_UPDATE( metro ) { - running_device *k053936 = devtag_get_device(screen->machine, "k053936"); - int i,pri,layers_ctrl = -1; - UINT16 screenctrl = *metro_screenctrl; + metro_state *state = (metro_state *)screen->machine->driver_data; + int i, pri, layers_ctrl = -1; + UINT16 screenctrl = *state->screenctrl; { int dirty = 0; - memset(dirtyindex,0,metro_tiletable_size/4); - for (i = 0;i < metro_tiletable_size/4;i++) + memset(state->dirtyindex, 0, state->tiletable_size / 4); + for (i = 0; i < state->tiletable_size / 4; i++) { - UINT32 tile_new = (metro_tiletable[2*i + 0] << 16 ) + metro_tiletable[2*i + 1]; - UINT32 tile_old = (metro_tiletable_old[2*i + 0] << 16 ) + metro_tiletable_old[2*i + 1]; + UINT32 tile_new = (state->tiletable[2 * i + 0] << 16 ) + state->tiletable[2 * i + 1]; + UINT32 tile_old = (state->tiletable_old[2 * i + 0] << 16 ) + state->tiletable_old[2 * i + 1]; if ((tile_new ^ tile_old) & 0x0fffffff) { - dirtyindex[i] = 1; + state->dirtyindex[i] = 1; dirty = 1; } } - memcpy(metro_tiletable_old,metro_tiletable,metro_tiletable_size); + memcpy(state->tiletable_old, state->tiletable, state->tiletable_size); if (dirty) { - dirty_tiles(0,metro_vram_0); - dirty_tiles(1,metro_vram_1); - dirty_tiles(2,metro_vram_2); + dirty_tiles(screen->machine, 0, state->vram_0); + dirty_tiles(screen->machine, 1, state->vram_1); + dirty_tiles(screen->machine, 2, state->vram_2); } } - metro_sprite_xoffs = metro_videoregs[0x06/2] - video_screen_get_width(screen) / 2; - metro_sprite_yoffs = metro_videoregs[0x04/2] - video_screen_get_height(screen) / 2; + state->sprite_xoffs = state->videoregs[0x06 / 2] - video_screen_get_width(screen) / 2; + state->sprite_yoffs = state->videoregs[0x04 / 2] - video_screen_get_height(screen) / 2; /* The background color is selected by a register */ - bitmap_fill(screen->machine->priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,((metro_videoregs[0x12/2] & 0x0fff)) + 0x1000); + bitmap_fill(screen->machine->priority_bitmap, cliprect, 0); + bitmap_fill(bitmap, cliprect, ((state->videoregs[0x12/2] & 0x0fff)) + 0x1000); /* Screen Control Register: @@ -895,22 +910,24 @@ VIDEO_UPDATE( metro ) ---- ---- ---4 32-- ---- ---- ---- --1- ? Blank Screen ---- ---- ---- ---0 Flip Screen */ - if (screenctrl & 2) return 0; + if (screenctrl & 2) + return 0; + flip_screen_set(screen->machine, screenctrl & 1); /* If the game supports 16x16 tiles, make sure that the 16x16 and 8x8 tilemaps of a given layer are not simultaneously enabled! */ - if (support_16x16) + if (state->support_16x16) { int layer; - for (layer = 0;layer < 3;layer++) + for (layer = 0; layer < 3; layer++) { int big = screenctrl & (0x0020 << layer); - tilemap_set_enable(bg_tilemap[layer],!big); - tilemap_set_enable(tilemap_16x16[layer],big); + tilemap_set_enable(state->bg_tilemap[layer],!big); + tilemap_set_enable(state->tilemap_16x16[layer], big); } } @@ -925,24 +942,24 @@ if (input_code_pressed(screen->machine, KEYCODE_Z)) if (input_code_pressed(screen->machine, KEYCODE_A)) msk |= 8; if (msk != 0) { - bitmap_fill(bitmap,cliprect,0); + bitmap_fill(bitmap, cliprect, 0); layers_ctrl &= msk; } popmessage("l %x-%x-%x r %04x %04x %04x", - (metro_videoregs[0x10/2]&0x30)>>4,(metro_videoregs[0x10/2]&0xc)>>2,metro_videoregs[0x10/2]&3, - metro_videoregs[0x02/2], metro_videoregs[0x12/2], - *metro_screenctrl); + (state->videoregs[0x10/2] & 0x30) >> 4, (state->videoregs[0x10/2] & 0xc) >> 2, state->videoregs[0x10/2] & 3, + state->videoregs[0x02/2], state->videoregs[0x12/2], + *state->screenctrl); } #endif - if (has_zoom) - k053936_zoom_draw(k053936, bitmap, cliprect, metro_K053936_tilemap, 0, 0, 1); + if (state->has_zoom) + k053936_zoom_draw(state->k053936, bitmap, cliprect, state->k053936_tilemap, 0, 0, 1); for (pri = 3; pri >= 0; pri--) - draw_layers(screen->machine, bitmap,cliprect,pri,layers_ctrl); + draw_layers(screen->machine, bitmap, cliprect, pri, layers_ctrl); if (layers_ctrl & 0x08) - metro_draw_sprites(screen->machine, bitmap,cliprect); + metro_draw_sprites(screen->machine, bitmap, cliprect); return 0; }