mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
Added driver_data struct and save states to the following drivers: matmania.c, metlclsh.c, mexico86.c, mouser.c, mrflea.c, mrjong.c, munchmo.c and mwarr.c
Added driver_data struct to the following drivers: mgolf.c, minivadr.c, mosaic.c and mrdo.c Enabled save states to mugsmash.c (everything was already saved)
This commit is contained in:
parent
84070c2bfa
commit
a47eb26d5b
7
.gitattributes
vendored
7
.gitattributes
vendored
@ -2640,6 +2640,7 @@ src/mame/includes/megasys1.h svneol=native#text/plain
|
||||
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/mexico86.h svneol=native#text/plain
|
||||
src/mame/includes/mhavoc.h svneol=native#text/plain
|
||||
src/mame/includes/micro3d.h svneol=native#text/plain
|
||||
@ -2656,8 +2657,14 @@ src/mame/includes/model2.h svneol=native#text/plain
|
||||
src/mame/includes/model3.h svneol=native#text/plain
|
||||
src/mame/includes/momoko.h svneol=native#text/plain
|
||||
src/mame/includes/moo.h svneol=native#text/plain
|
||||
src/mame/includes/mosaic.h svneol=native#text/plain
|
||||
src/mame/includes/mouser.h svneol=native#text/plain
|
||||
src/mame/includes/mrdo.h svneol=native#text/plain
|
||||
src/mame/includes/mrflea.h svneol=native#text/plain
|
||||
src/mame/includes/mrjong.h svneol=native#text/plain
|
||||
src/mame/includes/ms32.h svneol=native#text/plain
|
||||
src/mame/includes/mugsmash.h svneol=native#text/plain
|
||||
src/mame/includes/munchmo.h svneol=native#text/plain
|
||||
src/mame/includes/mw8080bw.h svneol=native#text/plain
|
||||
src/mame/includes/mystston.h svneol=native#text/plain
|
||||
src/mame/includes/n64.h svneol=native#text/plain
|
||||
|
@ -39,53 +39,66 @@ The driver has been updated accordingly.
|
||||
#include "sound/3526intf.h"
|
||||
#include "includes/matmania.h"
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static WRITE8_HANDLER( matmania_sh_command_w )
|
||||
{
|
||||
soundlatch_w(space,offset,data);
|
||||
cputag_set_input_line(space->machine, "audiocpu", M6502_IRQ_LINE, HOLD_LINE);
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
soundlatch_w(space, offset, data);
|
||||
cpu_set_input_line(state->audiocpu, M6502_IRQ_LINE, HOLD_LINE);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( maniach_sh_command_w )
|
||||
{
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
soundlatch_w(space, offset, data);
|
||||
cputag_set_input_line(space->machine, "audiocpu", M6809_IRQ_LINE, HOLD_LINE);
|
||||
cpu_set_input_line(state->audiocpu, M6809_IRQ_LINE, HOLD_LINE);
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Address maps
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static ADDRESS_MAP_START( matmania_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x077f) AM_RAM
|
||||
AM_RANGE(0x0780, 0x07df) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram)
|
||||
AM_RANGE(0x1000, 0x13ff) AM_RAM AM_BASE(&matmania_videoram2) AM_SIZE(&matmania_videoram2_size)
|
||||
AM_RANGE(0x1400, 0x17ff) AM_RAM AM_BASE(&matmania_colorram2)
|
||||
AM_RANGE(0x2000, 0x21ff) AM_RAM AM_BASE(&matmania_videoram) AM_SIZE(&matmania_videoram_size)
|
||||
AM_RANGE(0x2200, 0x23ff) AM_RAM AM_BASE(&matmania_colorram)
|
||||
AM_RANGE(0x2400, 0x25ff) AM_RAM AM_BASE(&matmania_videoram3) AM_SIZE(&matmania_videoram3_size)
|
||||
AM_RANGE(0x2600, 0x27ff) AM_RAM AM_BASE(&matmania_colorram3)
|
||||
AM_RANGE(0x3000, 0x3000) AM_READ_PORT("IN0") AM_WRITEONLY AM_BASE(&matmania_pageselect)
|
||||
AM_RANGE(0x0780, 0x07df) AM_WRITEONLY AM_BASE_SIZE_MEMBER(matmania_state, spriteram, spriteram_size)
|
||||
AM_RANGE(0x1000, 0x13ff) AM_RAM AM_BASE_SIZE_MEMBER(matmania_state, videoram2, videoram2_size)
|
||||
AM_RANGE(0x1400, 0x17ff) AM_RAM AM_BASE_MEMBER(matmania_state, colorram2)
|
||||
AM_RANGE(0x2000, 0x21ff) AM_RAM AM_BASE_SIZE_MEMBER(matmania_state, videoram, videoram_size)
|
||||
AM_RANGE(0x2200, 0x23ff) AM_RAM AM_BASE_MEMBER(matmania_state, colorram)
|
||||
AM_RANGE(0x2400, 0x25ff) AM_RAM AM_BASE_SIZE_MEMBER(matmania_state, videoram3, videoram3_size)
|
||||
AM_RANGE(0x2600, 0x27ff) AM_RAM AM_BASE_MEMBER(matmania_state, colorram3)
|
||||
AM_RANGE(0x3000, 0x3000) AM_READ_PORT("IN0") AM_WRITEONLY AM_BASE_MEMBER(matmania_state, pageselect)
|
||||
AM_RANGE(0x3010, 0x3010) AM_READ_PORT("IN1") AM_WRITE(matmania_sh_command_w)
|
||||
AM_RANGE(0x3020, 0x3020) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE(&matmania_scroll)
|
||||
AM_RANGE(0x3020, 0x3020) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE_MEMBER(matmania_state, scroll)
|
||||
AM_RANGE(0x3030, 0x3030) AM_READ_PORT("DSW1") AM_WRITENOP /* ?? */
|
||||
AM_RANGE(0x3050, 0x307f) AM_WRITE(matmania_paletteram_w) AM_BASE_GENERIC(paletteram)
|
||||
AM_RANGE(0x3050, 0x307f) AM_WRITE(matmania_paletteram_w) AM_BASE_MEMBER(matmania_state, paletteram)
|
||||
AM_RANGE(0x4000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( maniach_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x077f) AM_RAM
|
||||
AM_RANGE(0x0780, 0x07df) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
|
||||
AM_RANGE(0x1000, 0x13ff) AM_RAM AM_BASE(&matmania_videoram2) AM_SIZE(&matmania_videoram2_size)
|
||||
AM_RANGE(0x1400, 0x17ff) AM_RAM AM_BASE(&matmania_colorram2)
|
||||
AM_RANGE(0x2000, 0x21ff) AM_RAM AM_BASE(&matmania_videoram) AM_SIZE(&matmania_videoram_size)
|
||||
AM_RANGE(0x2200, 0x23ff) AM_RAM AM_BASE(&matmania_colorram)
|
||||
AM_RANGE(0x2400, 0x25ff) AM_RAM AM_BASE(&matmania_videoram3) AM_SIZE(&matmania_videoram3_size)
|
||||
AM_RANGE(0x2600, 0x27ff) AM_RAM AM_BASE(&matmania_colorram3)
|
||||
AM_RANGE(0x3000, 0x3000) AM_READ_PORT("IN0") AM_WRITEONLY AM_BASE(&matmania_pageselect)
|
||||
AM_RANGE(0x0780, 0x07df) AM_RAM AM_BASE_SIZE_MEMBER(matmania_state, spriteram, spriteram_size)
|
||||
AM_RANGE(0x1000, 0x13ff) AM_RAM AM_BASE_SIZE_MEMBER(matmania_state, videoram2, videoram2_size)
|
||||
AM_RANGE(0x1400, 0x17ff) AM_RAM AM_BASE_MEMBER(matmania_state, colorram2)
|
||||
AM_RANGE(0x2000, 0x21ff) AM_RAM AM_BASE_SIZE_MEMBER(matmania_state, videoram, videoram_size)
|
||||
AM_RANGE(0x2200, 0x23ff) AM_RAM AM_BASE_MEMBER(matmania_state, colorram)
|
||||
AM_RANGE(0x2400, 0x25ff) AM_RAM AM_BASE_SIZE_MEMBER(matmania_state, videoram3, videoram3_size)
|
||||
AM_RANGE(0x2600, 0x27ff) AM_RAM AM_BASE_MEMBER(matmania_state, colorram3)
|
||||
AM_RANGE(0x3000, 0x3000) AM_READ_PORT("IN0") AM_WRITEONLY AM_BASE_MEMBER(matmania_state, pageselect)
|
||||
AM_RANGE(0x3010, 0x3010) AM_READ_PORT("IN1") AM_WRITE(maniach_sh_command_w)
|
||||
AM_RANGE(0x3020, 0x3020) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE(&matmania_scroll)
|
||||
AM_RANGE(0x3020, 0x3020) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE_MEMBER(matmania_state, scroll)
|
||||
AM_RANGE(0x3030, 0x3030) AM_READ_PORT("DSW1") AM_WRITENOP /* ?? */
|
||||
AM_RANGE(0x3040, 0x3040) AM_READWRITE(maniach_mcu_r,maniach_mcu_w)
|
||||
AM_RANGE(0x3041, 0x3041) AM_READ(maniach_mcu_status_r)
|
||||
AM_RANGE(0x3050, 0x307f) AM_WRITE(matmania_paletteram_w) AM_BASE_GENERIC(paletteram)
|
||||
AM_RANGE(0x3050, 0x307f) AM_WRITE(matmania_paletteram_w) AM_BASE_MEMBER(matmania_state, paletteram)
|
||||
AM_RANGE(0x4000, 0xffff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -110,17 +123,23 @@ ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( maniach_mcu_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0x7ff)
|
||||
AM_RANGE(0x0000, 0x0000) AM_READWRITE(maniach_68705_portA_r,maniach_68705_portA_w)
|
||||
AM_RANGE(0x0001, 0x0001) AM_READWRITE(maniach_68705_portB_r,maniach_68705_portB_w)
|
||||
AM_RANGE(0x0002, 0x0002) AM_READWRITE(maniach_68705_portC_r,maniach_68705_portC_w)
|
||||
AM_RANGE(0x0004, 0x0004) AM_WRITE(maniach_68705_ddrA_w)
|
||||
AM_RANGE(0x0005, 0x0005) AM_WRITE(maniach_68705_ddrB_w)
|
||||
AM_RANGE(0x0006, 0x0006) AM_WRITE(maniach_68705_ddrC_w)
|
||||
AM_RANGE(0x0000, 0x0000) AM_READWRITE(maniach_68705_port_a_r,maniach_68705_port_a_w)
|
||||
AM_RANGE(0x0001, 0x0001) AM_READWRITE(maniach_68705_port_b_r,maniach_68705_port_b_w)
|
||||
AM_RANGE(0x0002, 0x0002) AM_READWRITE(maniach_68705_port_c_r,maniach_68705_port_c_w)
|
||||
AM_RANGE(0x0004, 0x0004) AM_WRITE(maniach_68705_ddr_a_w)
|
||||
AM_RANGE(0x0005, 0x0005) AM_WRITE(maniach_68705_ddr_b_w)
|
||||
AM_RANGE(0x0006, 0x0006) AM_WRITE(maniach_68705_ddr_c_w)
|
||||
AM_RANGE(0x0010, 0x007f) AM_RAM
|
||||
AM_RANGE(0x0080, 0x07ff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Input ports
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static INPUT_PORTS_START( matmania )
|
||||
PORT_START("IN0")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
|
||||
@ -191,6 +210,12 @@ static INPUT_PORTS_START( maniach )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Graphics definitions
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const gfx_layout charlayout =
|
||||
{
|
||||
8,8, /* 8*8 characters */
|
||||
@ -268,8 +293,26 @@ GFXDECODE_END
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_START( matmania )
|
||||
{
|
||||
matmania_state *state = (matmania_state *)machine->driver_data;
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
state->audiocpu = devtag_get_device(machine, "audiocpu");
|
||||
state->mcu = devtag_get_device(machine, "mcu");
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( matmania )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(matmania_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", M6502, 1500000) /* 1.5 MHz ???? */
|
||||
MDRV_CPU_PROGRAM_MAP(matmania_map)
|
||||
@ -281,6 +324,8 @@ static MACHINE_DRIVER_START( matmania )
|
||||
/* IRQs are caused by the main CPU */
|
||||
MDRV_QUANTUM_TIME(HZ(600))
|
||||
|
||||
MDRV_MACHINE_START(matmania)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -314,7 +359,8 @@ MACHINE_DRIVER_END
|
||||
/* handler called by the 3526 emulator when the internal timers cause an IRQ */
|
||||
static void irqhandler(running_device *device, int linestate)
|
||||
{
|
||||
cputag_set_input_line(device->machine, "audiocpu", 1, linestate);
|
||||
matmania_state *state = (matmania_state *)device->machine->driver_data;
|
||||
cpu_set_input_line(state->audiocpu, 1, linestate);
|
||||
}
|
||||
|
||||
static const ym3526_interface ym3526_config =
|
||||
@ -323,8 +369,51 @@ static const ym3526_interface ym3526_config =
|
||||
};
|
||||
|
||||
|
||||
static MACHINE_START( maniach )
|
||||
{
|
||||
matmania_state *state = (matmania_state *)machine->driver_data;
|
||||
|
||||
MACHINE_START_CALL(matmania);
|
||||
|
||||
state_save_register_global(machine, state->port_a_in);
|
||||
state_save_register_global(machine, state->port_a_out);
|
||||
state_save_register_global(machine, state->ddr_a);
|
||||
state_save_register_global(machine, state->port_b_in);
|
||||
state_save_register_global(machine, state->port_b_out);
|
||||
state_save_register_global(machine, state->ddr_b);
|
||||
state_save_register_global(machine, state->port_c_in);
|
||||
state_save_register_global(machine, state->port_c_out);
|
||||
state_save_register_global(machine, state->ddr_c);
|
||||
state_save_register_global(machine, state->mcu_sent);
|
||||
state_save_register_global(machine, state->main_sent);
|
||||
state_save_register_global(machine, state->from_main);
|
||||
state_save_register_global(machine, state->from_mcu);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( maniach )
|
||||
{
|
||||
matmania_state *state = (matmania_state *)machine->driver_data;
|
||||
|
||||
state->port_a_in = 0;
|
||||
state->port_a_out = 0;
|
||||
state->ddr_a = 0;
|
||||
state->port_b_in = 0;
|
||||
state->port_b_out = 0;
|
||||
state->ddr_b = 0;
|
||||
state->port_c_in = 0;
|
||||
state->port_c_out = 0;
|
||||
state->ddr_c = 0;
|
||||
state->mcu_sent = 0;
|
||||
state->main_sent = 0;
|
||||
state->from_main = 0;
|
||||
state->from_mcu = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( maniach )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(matmania_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", M6502, 1500000) /* 1.5 MHz ???? */
|
||||
MDRV_CPU_PROGRAM_MAP(maniach_map)
|
||||
@ -339,6 +428,9 @@ static MACHINE_DRIVER_START( maniach )
|
||||
|
||||
MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slice per frame - high interleaving to sync main and mcu */
|
||||
|
||||
MDRV_MACHINE_START(maniach)
|
||||
MDRV_MACHINE_RESET(maniach)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -365,11 +457,11 @@ static MACHINE_DRIVER_START( maniach )
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Mat Mania driver
|
||||
|
||||
***************************************************************************/
|
||||
/*************************************
|
||||
*
|
||||
* ROM definition(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
ROM_START( matmania )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
@ -593,7 +685,13 @@ ROM_END
|
||||
|
||||
|
||||
|
||||
GAME( 1985, matmania, 0, matmania, matmania, 0, ROT270, "Technos Japan (Taito America license)", "Mat Mania", 0 )
|
||||
GAME( 1985, excthour, matmania, matmania, maniach, 0, ROT270, "Technos Japan (Taito license)", "Exciting Hour", 0 )
|
||||
GAME( 1986, maniach, 0, maniach, maniach, 0, ROT270, "Technos Japan (Taito America license)", "Mania Challenge (set 1)", 0 )
|
||||
GAME( 1986, maniach2, maniach, maniach, maniach, 0, ROT270, "Technos Japan (Taito America license)", "Mania Challenge (set 2)" , 0) /* earlier version? */
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
GAME( 1985, matmania, 0, matmania, matmania, 0, ROT270, "Technos Japan (Taito America license)", "Mat Mania", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1985, excthour, matmania, matmania, maniach, 0, ROT270, "Technos Japan (Taito license)", "Exciting Hour", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1986, maniach, 0, maniach, maniach, 0, ROT270, "Technos Japan (Taito America license)", "Mania Challenge (set 1)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1986, maniach2, maniach, maniach, maniach, 0, ROT270, "Technos Japan (Taito America license)", "Mania Challenge (set 2)", GAME_SUPPORTS_SAVE ) /* earlier version? */
|
||||
|
@ -36,20 +36,8 @@ metlclsh:
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "sound/2203intf.h"
|
||||
#include "sound/3526intf.h"
|
||||
#include "includes/metlclsh.h"
|
||||
|
||||
/* Variables defined in video: */
|
||||
|
||||
extern UINT8 *metlclsh_bgram, *metlclsh_fgram, *metlclsh_scrollx;
|
||||
|
||||
/* Functions defined in video: */
|
||||
|
||||
WRITE8_HANDLER( metlclsh_bgram_w );
|
||||
WRITE8_HANDLER( metlclsh_fgram_w );
|
||||
WRITE8_HANDLER( metlclsh_gfxbank_w );
|
||||
WRITE8_HANDLER( metlclsh_rambank_w );
|
||||
|
||||
VIDEO_START( metlclsh );
|
||||
VIDEO_UPDATE( metlclsh );
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -59,12 +47,14 @@ VIDEO_UPDATE( metlclsh );
|
||||
|
||||
static WRITE8_HANDLER( metlclsh_cause_irq )
|
||||
{
|
||||
cputag_set_input_line(space->machine, "sub", M6809_IRQ_LINE, ASSERT_LINE);
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
cpu_set_input_line(state->subcpu, M6809_IRQ_LINE, ASSERT_LINE);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( metlclsh_ack_nmi )
|
||||
{
|
||||
cputag_set_input_line(space->machine, "maincpu", INPUT_LINE_NMI, CLEAR_LINE);
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
cpu_set_input_line(state->maincpu, INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( metlclsh_master_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
@ -81,9 +71,9 @@ static ADDRESS_MAP_START( metlclsh_master_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
/**/AM_RANGE(0xc800, 0xc82f) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_split1_w) AM_BASE_GENERIC(paletteram)
|
||||
/**/AM_RANGE(0xcc00, 0xcc2f) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_split2_w) AM_BASE_GENERIC(paletteram2)
|
||||
AM_RANGE(0xd000, 0xd001) AM_DEVREADWRITE("ym1", ym2203_r,ym2203_w)
|
||||
/**/AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(metlclsh_fgram_w) AM_BASE(&metlclsh_fgram)
|
||||
/**/AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(metlclsh_fgram_w) AM_BASE_MEMBER(metlclsh_state, fgram)
|
||||
AM_RANGE(0xe000, 0xe001) AM_DEVWRITE("ym2", ym3526_w )
|
||||
AM_RANGE(0xe800, 0xe9ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
|
||||
AM_RANGE(0xe800, 0xe9ff) AM_RAM AM_BASE_SIZE_MEMBER(metlclsh_state, spriteram, spriteram_size)
|
||||
AM_RANGE(0xfff0, 0xffff) AM_ROM // Reset/IRQ vectors
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -96,17 +86,20 @@ ADDRESS_MAP_END
|
||||
|
||||
static WRITE8_HANDLER( metlclsh_cause_nmi2 )
|
||||
{
|
||||
cputag_set_input_line(space->machine, "maincpu", INPUT_LINE_NMI, ASSERT_LINE);
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
cpu_set_input_line(state->maincpu, INPUT_LINE_NMI, ASSERT_LINE);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( metlclsh_ack_irq2 )
|
||||
{
|
||||
cputag_set_input_line(space->machine, "sub", M6809_IRQ_LINE, CLEAR_LINE);
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
cpu_set_input_line(state->subcpu, M6809_IRQ_LINE, CLEAR_LINE);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( metlclsh_ack_nmi2 )
|
||||
{
|
||||
cputag_set_input_line(space->machine, "sub", INPUT_LINE_NMI, CLEAR_LINE);
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
cpu_set_input_line(state->subcpu, INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( metlclsh_flipscreen_w )
|
||||
@ -123,10 +116,10 @@ static ADDRESS_MAP_START( metlclsh_slave_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0xc003, 0xc003) AM_READ_PORT("DSW")
|
||||
AM_RANGE(0xc0c0, 0xc0c0) AM_WRITE(metlclsh_cause_nmi2) // cause nmi on cpu #1
|
||||
AM_RANGE(0xc0c1, 0xc0c1) AM_WRITE(metlclsh_ack_irq2) // irq ack
|
||||
AM_RANGE(0xd000, 0xd7ff) AM_ROMBANK("bank1") AM_WRITE(metlclsh_bgram_w) AM_BASE(&metlclsh_bgram) // this is banked
|
||||
AM_RANGE(0xd000, 0xd7ff) AM_ROMBANK("bank1") AM_WRITE(metlclsh_bgram_w) AM_BASE_MEMBER(metlclsh_state, bgram) // this is banked
|
||||
AM_RANGE(0xe301, 0xe301) AM_WRITE(metlclsh_flipscreen_w) // 0/1
|
||||
AM_RANGE(0xe401, 0xe401) AM_WRITE(metlclsh_rambank_w)
|
||||
AM_RANGE(0xe402, 0xe403) AM_WRITEONLY AM_BASE(&metlclsh_scrollx)
|
||||
AM_RANGE(0xe402, 0xe403) AM_WRITEONLY AM_BASE_MEMBER(metlclsh_state, scrollx)
|
||||
// AM_RANGE(0xe404, 0xe404) AM_WRITENOP // ? 0
|
||||
// AM_RANGE(0xe410, 0xe410) AM_WRITENOP // ? 0 on startup only
|
||||
AM_RANGE(0xe417, 0xe417) AM_WRITE(metlclsh_ack_nmi2) // nmi ack
|
||||
@ -167,22 +160,22 @@ static INPUT_PORTS_START( metlclsh )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
PORT_START("IN1") /* c001 */
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
|
||||
|
||||
PORT_START("IN2") /* c002 */
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1)
|
||||
|
||||
@ -262,7 +255,8 @@ GFXDECODE_END
|
||||
|
||||
static void metlclsh_irqhandler(running_device *device, int linestate)
|
||||
{
|
||||
cputag_set_input_line(device->machine, "maincpu", M6809_IRQ_LINE, linestate);
|
||||
metlclsh_state *state = (metlclsh_state *)device->machine->driver_data;
|
||||
cpu_set_input_line(state->maincpu, M6809_IRQ_LINE, linestate);
|
||||
}
|
||||
|
||||
static const ym3526_interface ym3526_config =
|
||||
@ -279,13 +273,32 @@ static INTERRUPT_GEN( metlclsh_interrupt2 )
|
||||
cpu_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE);
|
||||
}
|
||||
|
||||
static MACHINE_START( metlclsh )
|
||||
{
|
||||
metlclsh_state *state = (metlclsh_state *)machine->driver_data;
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
state->subcpu = devtag_get_device(machine, "sub");
|
||||
|
||||
state_save_register_global(machine, state->write_mask);
|
||||
state_save_register_global(machine, state->gfxbank);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( metlclsh )
|
||||
{
|
||||
metlclsh_state *state = (metlclsh_state *)machine->driver_data;
|
||||
|
||||
flip_screen_set(machine, 0);
|
||||
|
||||
state->write_mask = 0;
|
||||
state->gfxbank = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( metlclsh )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(metlclsh_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", M6809, 1500000) // ?
|
||||
MDRV_CPU_PROGRAM_MAP(metlclsh_master_map)
|
||||
@ -296,6 +309,7 @@ static MACHINE_DRIVER_START( metlclsh )
|
||||
MDRV_CPU_VBLANK_INT_HACK(metlclsh_interrupt2,2)
|
||||
// IRQ by cpu #1, NMI by coins insertion
|
||||
|
||||
MDRV_MACHINE_START(metlclsh)
|
||||
MDRV_MACHINE_RESET(metlclsh)
|
||||
|
||||
/* video hardware */
|
||||
@ -430,4 +444,4 @@ ROM_START( metlclsh )
|
||||
ROM_LOAD( "82s123.prm", 0x0000, 0x20, CRC(6844cc88) SHA1(89d23367aa6ff541205416e82781fe938dfeeb52) )
|
||||
ROM_END
|
||||
|
||||
GAME( 1985, metlclsh, 0, metlclsh, metlclsh, 0, ROT0, "Data East", "Metal Clash (Japan)", 0 )
|
||||
GAME( 1985, metlclsh, 0, metlclsh, metlclsh, 0, ROT0, "Data East", "Metal Clash (Japan)", GAME_SUPPORTS_SAVE )
|
||||
|
@ -41,7 +41,7 @@ Notes:
|
||||
|
||||
Note MCU labeling:
|
||||
|
||||
Bubble Bobble KiKi KaiKai Kick and RUN
|
||||
Bubble Bobble KiKi KaiKai Kick and Run
|
||||
------------- ------------- -------------
|
||||
TAITO A78-01 TAITO A85-01 TAITO A87-01
|
||||
JPH1011P JPH1020P JPH1021P
|
||||
@ -57,24 +57,38 @@ PS4 J8635 PS4 J8541 PS4 J8648
|
||||
#include "sound/2203intf.h"
|
||||
#include "includes/mexico86.h"
|
||||
|
||||
//AT
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static READ8_DEVICE_HANDLER( kiki_ym2203_r )
|
||||
{
|
||||
UINT8 result = ym2203_r(device, offset);
|
||||
|
||||
if (offset == 0)
|
||||
result &= 0x7f;
|
||||
|
||||
return result;
|
||||
}
|
||||
//ZT
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Address maps
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static ADDRESS_MAP_START( mexico86_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x7fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") /* banked roms */
|
||||
AM_RANGE(0xc000, 0xe7ff) AM_RAM AM_SHARE("share1") /* shared with sound cpu */
|
||||
AM_RANGE(0xd500, 0xd7ff) AM_RAM AM_BASE(&mexico86_objectram) AM_SIZE(&mexico86_objectram_size)
|
||||
AM_RANGE(0xe800, 0xe8ff) AM_RAM AM_BASE(&mexico86_protection_ram) /* shared with mcu */
|
||||
AM_RANGE(0xd500, 0xd7ff) AM_RAM AM_BASE_SIZE_MEMBER(mexico86_state, objectram, objectram_size)
|
||||
AM_RANGE(0xe800, 0xe8ff) AM_RAM AM_BASE_MEMBER(mexico86_state, protection_ram) /* shared with mcu */
|
||||
AM_RANGE(0xe900, 0xefff) AM_RAM
|
||||
AM_RANGE(0xc000, 0xd4ff) AM_RAM AM_BASE(&mexico86_videoram) //AT: corrected size
|
||||
AM_RANGE(0xc000, 0xd4ff) AM_RAM AM_BASE_MEMBER(mexico86_state, videoram)
|
||||
AM_RANGE(0xf000, 0xf000) AM_WRITE(mexico86_bankswitch_w) /* program and gfx ROM banks */
|
||||
AM_RANGE(0xf008, 0xf008) AM_WRITE(mexico86_f008_w) /* cpu reset lines + other unknown stuff */
|
||||
AM_RANGE(0xf010, 0xf010) AM_READ_PORT("IN3")
|
||||
@ -91,11 +105,11 @@ ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mexico86_m68705_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0x7ff)
|
||||
AM_RANGE(0x0000, 0x0000) AM_READWRITE(mexico86_68705_portA_r,mexico86_68705_portA_w)
|
||||
AM_RANGE(0x0001, 0x0001) AM_READWRITE(mexico86_68705_portB_r,mexico86_68705_portB_w)
|
||||
AM_RANGE(0x0000, 0x0000) AM_READWRITE(mexico86_68705_port_a_r,mexico86_68705_port_a_w)
|
||||
AM_RANGE(0x0001, 0x0001) AM_READWRITE(mexico86_68705_port_b_r,mexico86_68705_port_b_w)
|
||||
AM_RANGE(0x0002, 0x0002) AM_READ_PORT("IN0") /* COIN */
|
||||
AM_RANGE(0x0004, 0x0004) AM_WRITE(mexico86_68705_ddrA_w)
|
||||
AM_RANGE(0x0005, 0x0005) AM_WRITE(mexico86_68705_ddrB_w)
|
||||
AM_RANGE(0x0004, 0x0004) AM_WRITE(mexico86_68705_ddr_a_w)
|
||||
AM_RANGE(0x0005, 0x0005) AM_WRITE(mexico86_68705_ddr_b_w)
|
||||
AM_RANGE(0x000a, 0x000a) AM_WRITENOP /* looks like a bug in the code, writes to */
|
||||
/* 0x0a (=10dec) instead of 0x10 */
|
||||
AM_RANGE(0x0010, 0x007f) AM_RAM
|
||||
@ -121,8 +135,14 @@ static ADDRESS_MAP_START( mexico86_sub_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0xc004, 0xc004) AM_WRITE(mexico86_sub_output_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Input ports
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static INPUT_PORTS_START( mexico86 )
|
||||
PORT_START("IN0") /* IN0 */
|
||||
PORT_START("IN0")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
@ -132,7 +152,7 @@ static INPUT_PORTS_START( mexico86 )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN1") /* IN1 */
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
|
||||
@ -142,7 +162,7 @@ static INPUT_PORTS_START( mexico86 )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) /* service 2 */
|
||||
|
||||
PORT_START("IN2") /* IN2 */
|
||||
PORT_START("IN2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
|
||||
@ -247,7 +267,7 @@ static INPUT_PORTS_START( mexico86 )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( kikikai )
|
||||
PORT_START("IN0") /* IN0 */
|
||||
PORT_START("IN0")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
@ -257,7 +277,7 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN1") /* IN1 */
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
|
||||
@ -267,7 +287,7 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN2") /* IN2 */
|
||||
PORT_START("IN2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
|
||||
@ -277,8 +297,7 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
//AT
|
||||
PORT_START("DSW0") /* DSW0 */
|
||||
PORT_START("DSW0")
|
||||
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:1")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) )
|
||||
@ -315,7 +334,7 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
|
||||
|
||||
PORT_START("DSW1") /* DSW1 */
|
||||
PORT_START("DSW1")
|
||||
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( Normal ) )
|
||||
@ -337,7 +356,6 @@ static INPUT_PORTS_START( kikikai )
|
||||
PORT_DIPNAME( 0x80, 0x00, "Number Match" ) PORT_DIPLOCATION("SW2:8")
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
//ZT
|
||||
|
||||
PORT_START("IN3")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 )
|
||||
@ -352,6 +370,12 @@ INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Graphics definitions
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const gfx_layout charlayout =
|
||||
{
|
||||
8,8,
|
||||
@ -369,6 +393,12 @@ GFXDECODE_END
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sound interfaces
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const ym2203_interface ym2203_config =
|
||||
{
|
||||
{
|
||||
@ -383,15 +413,69 @@ static const ym2203_interface ym2203_config =
|
||||
};
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_START( mexico86 )
|
||||
{
|
||||
mexico86_state *state = (mexico86_state *)machine->driver_data;
|
||||
UINT8 *ROM = memory_region(machine, "maincpu");
|
||||
|
||||
memory_configure_bank(machine, "bank1", 0, 6, &ROM[0x10000], 0x4000);
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
state->audiocpu = devtag_get_device(machine, "audiocpu");
|
||||
state->subcpu = devtag_get_device(machine, "sub");
|
||||
state->mcu = devtag_get_device(machine, "mcu");
|
||||
|
||||
state_save_register_global(machine, state->port_a_in);
|
||||
state_save_register_global(machine, state->port_a_out);
|
||||
state_save_register_global(machine, state->ddr_a);
|
||||
state_save_register_global(machine, state->port_b_in);
|
||||
state_save_register_global(machine, state->port_b_out);
|
||||
state_save_register_global(machine, state->ddr_b);
|
||||
state_save_register_global(machine, state->address);
|
||||
state_save_register_global(machine, state->latch);
|
||||
|
||||
state_save_register_global(machine, state->mcu_running);
|
||||
state_save_register_global(machine, state->mcu_initialised);
|
||||
state_save_register_global(machine, state->coin_last);
|
||||
|
||||
state_save_register_global(machine, state->charbank);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( mexico86 )
|
||||
{
|
||||
mexico86_state *state = (mexico86_state *)machine->driver_data;
|
||||
|
||||
/*TODO: check the PCB and see how the halt / reset lines are connected. */
|
||||
if (devtag_get_device(machine, "sub") != NULL)
|
||||
cputag_set_input_line(machine, "sub", INPUT_LINE_RESET, (input_port_read(machine, "DSW1") & 0x80) ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
state->port_a_in = 0;
|
||||
state->port_a_out = 0;
|
||||
state->ddr_a = 0;
|
||||
state->port_b_in = 0;
|
||||
state->port_b_out = 0;
|
||||
state->ddr_b = 0;
|
||||
state->address = 0;
|
||||
state->latch = 0;
|
||||
|
||||
state->mcu_running = 0;
|
||||
state->mcu_initialised = 0;
|
||||
state->coin_last = 0;
|
||||
|
||||
state->charbank = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mexico86 )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mexico86_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu",Z80, 24000000/4) /* 6 MHz, Uses clock divided 24MHz OSC */
|
||||
MDRV_CPU_PROGRAM_MAP(mexico86_map)
|
||||
@ -408,9 +492,9 @@ static MACHINE_DRIVER_START( mexico86 )
|
||||
MDRV_CPU_PROGRAM_MAP(mexico86_sub_cpu_map)
|
||||
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
|
||||
|
||||
MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper */
|
||||
/* synchronization of the CPUs */
|
||||
MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs */
|
||||
|
||||
MDRV_MACHINE_START(mexico86)
|
||||
MDRV_MACHINE_RESET(mexico86)
|
||||
|
||||
/* video hardware */
|
||||
@ -466,11 +550,11 @@ static MACHINE_DRIVER_START( kikikai )
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Game driver(s)
|
||||
|
||||
***************************************************************************/
|
||||
/*************************************
|
||||
*
|
||||
* ROM definition(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
ROM_START( kikikai )
|
||||
ROM_REGION( 0x28000, "maincpu", 0 )
|
||||
@ -622,8 +706,14 @@ ROM_START( mexico86 )
|
||||
ROM_END
|
||||
|
||||
|
||||
GAME( 1986, kikikai, 0, kikikai, kikikai, 0, ROT90, "Taito Corporation", "KiKi KaiKai", 0 )
|
||||
GAME( 1986, knightb, kikikai, knightb, kikikai, 0, ROT90, "bootleg", "Knight Boy", 0 )
|
||||
GAME( 1986, kicknrun, 0, mexico86, mexico86, 0, ROT0, "Taito Corporation", "Kick and Run (World)", 0 )
|
||||
GAME( 1986, kicknrunu,kicknrun, mexico86, mexico86, 0, ROT0, "Taito America Corp", "Kick and Run (US)", 0 )
|
||||
GAME( 1986, mexico86, kicknrun, mexico86, mexico86, 0, ROT0, "bootleg", "Mexico 86", 0 )
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
GAME( 1986, kikikai, 0, kikikai, kikikai, 0, ROT90, "Taito Corporation", "KiKi KaiKai", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1986, knightb, kikikai, knightb, kikikai, 0, ROT90, "bootleg", "Knight Boy", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1986, kicknrun, 0, mexico86, mexico86, 0, ROT0, "Taito Corporation", "Kick and Run (World)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1986, kicknrunu,kicknrun, mexico86, mexico86, 0, ROT0, "Taito America Corp", "Kick and Run (US)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1986, mexico86, kicknrun, mexico86, mexico86, 0, ROT0, "bootleg", "Mexico 86", GAME_SUPPORTS_SAVE )
|
||||
|
@ -7,20 +7,30 @@
|
||||
#include "emu.h"
|
||||
#include "cpu/m6502/m6502.h"
|
||||
|
||||
static UINT8* mgolf_video_ram;
|
||||
typedef struct _mgolf_state mgolf_state;
|
||||
struct _mgolf_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8* video_ram;
|
||||
|
||||
static attotime time_pushed;
|
||||
static attotime time_released;
|
||||
/* video-related */
|
||||
tilemap_t* bg_tilemap;
|
||||
|
||||
static UINT8 prev = 0;
|
||||
static UINT8 mask = 0;
|
||||
/* misc */
|
||||
UINT8 prev;
|
||||
UINT8 mask;
|
||||
attotime time_pushed;
|
||||
attotime time_released;
|
||||
|
||||
static tilemap_t* bg_tilemap;
|
||||
/* devices */
|
||||
running_device *maincpu;
|
||||
};
|
||||
|
||||
|
||||
static TILE_GET_INFO( get_tile_info )
|
||||
{
|
||||
UINT8 code = mgolf_video_ram[tile_index];
|
||||
mgolf_state *state = (mgolf_state *)machine->driver_data;
|
||||
UINT8 code = state->video_ram[tile_index];
|
||||
|
||||
SET_TILE_INFO(0, code, code >> 7, 0);
|
||||
}
|
||||
@ -28,75 +38,78 @@ static TILE_GET_INFO( get_tile_info )
|
||||
|
||||
static WRITE8_HANDLER( mgolf_vram_w )
|
||||
{
|
||||
mgolf_video_ram[offset] = data;
|
||||
tilemap_mark_tile_dirty(bg_tilemap, offset);
|
||||
mgolf_state *state = (mgolf_state *)space->machine->driver_data;
|
||||
state->video_ram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
|
||||
}
|
||||
|
||||
|
||||
static VIDEO_START( mgolf )
|
||||
{
|
||||
bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
|
||||
mgolf_state *state = (mgolf_state *)machine->driver_data;
|
||||
state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
|
||||
static VIDEO_UPDATE( mgolf )
|
||||
{
|
||||
mgolf_state *state = (mgolf_state *)screen->machine->driver_data;
|
||||
int i;
|
||||
|
||||
/* draw playfield */
|
||||
|
||||
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
|
||||
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
|
||||
|
||||
/* draw sprites */
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1],
|
||||
mgolf_video_ram[0x399 + 4 * i],
|
||||
state->video_ram[0x399 + 4 * i],
|
||||
i,
|
||||
0, 0,
|
||||
mgolf_video_ram[0x390 + 2 * i] - 7,
|
||||
mgolf_video_ram[0x398 + 4 * i] - 16, 0);
|
||||
state->video_ram[0x390 + 2 * i] - 7,
|
||||
state->video_ram[0x398 + 4 * i] - 16, 0);
|
||||
|
||||
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1],
|
||||
mgolf_video_ram[0x39b + 4 * i],
|
||||
state->video_ram[0x39b + 4 * i],
|
||||
i,
|
||||
0, 0,
|
||||
mgolf_video_ram[0x390 + 2 * i] - 15,
|
||||
mgolf_video_ram[0x39a + 4 * i] - 16, 0);
|
||||
state->video_ram[0x390 + 2 * i] - 15,
|
||||
state->video_ram[0x39a + 4 * i] - 16, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void update_plunger(running_machine *machine)
|
||||
static void update_plunger( running_machine *machine )
|
||||
{
|
||||
mgolf_state *state = (mgolf_state *)machine->driver_data;
|
||||
UINT8 val = input_port_read(machine, "BUTTON");
|
||||
|
||||
if (prev != val)
|
||||
if (state->prev != val)
|
||||
{
|
||||
if (val == 0)
|
||||
{
|
||||
time_released = timer_get_time(machine);
|
||||
state->time_released = timer_get_time(machine);
|
||||
|
||||
if (!mask)
|
||||
cputag_set_input_line(machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE);
|
||||
if (!state->mask)
|
||||
cpu_set_input_line(state->maincpu, INPUT_LINE_NMI, PULSE_LINE);
|
||||
}
|
||||
else
|
||||
time_pushed = timer_get_time(machine);
|
||||
state->time_pushed = timer_get_time(machine);
|
||||
|
||||
prev = val;
|
||||
state->prev = val;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static TIMER_CALLBACK( interrupt_callback )
|
||||
{
|
||||
mgolf_state *state = (mgolf_state *)machine->driver_data;
|
||||
int scanline = param;
|
||||
|
||||
update_plunger(machine);
|
||||
|
||||
generic_pulse_irq_line(devtag_get_device(machine, "maincpu"), 0);
|
||||
generic_pulse_irq_line(state->maincpu, 0);
|
||||
|
||||
scanline = scanline + 32;
|
||||
|
||||
@ -109,28 +122,15 @@ static TIMER_CALLBACK( interrupt_callback )
|
||||
|
||||
static double calc_plunger_pos(running_machine *machine)
|
||||
{
|
||||
return (attotime_to_double(timer_get_time(machine)) - attotime_to_double(time_released)) * (attotime_to_double(time_released) - attotime_to_double(time_pushed) + 0.2);
|
||||
}
|
||||
|
||||
|
||||
static MACHINE_RESET( mgolf )
|
||||
{
|
||||
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 16, 0), NULL, 16, interrupt_callback);
|
||||
}
|
||||
|
||||
|
||||
static PALETTE_INIT( mgolf )
|
||||
{
|
||||
palette_set_color(machine, 0, MAKE_RGB(0x80, 0x80, 0x80));
|
||||
palette_set_color(machine, 1, MAKE_RGB(0x00, 0x00, 0x00));
|
||||
palette_set_color(machine, 2, MAKE_RGB(0x80, 0x80, 0x80));
|
||||
palette_set_color(machine, 3, MAKE_RGB(0xff, 0xff, 0xff));
|
||||
mgolf_state *state = (mgolf_state *)machine->driver_data;
|
||||
return (attotime_to_double(timer_get_time(machine)) - attotime_to_double(state->time_released)) * (attotime_to_double(state->time_released) - attotime_to_double(state->time_pushed) + 0.2);
|
||||
}
|
||||
|
||||
|
||||
static READ8_HANDLER( mgolf_wram_r )
|
||||
{
|
||||
return mgolf_video_ram[0x380 + offset];
|
||||
mgolf_state *state = (mgolf_state *)space->machine->driver_data;
|
||||
return state->video_ram[0x380 + offset];
|
||||
}
|
||||
|
||||
|
||||
@ -172,7 +172,8 @@ static READ8_HANDLER( mgolf_misc_r )
|
||||
|
||||
static WRITE8_HANDLER( mgolf_wram_w )
|
||||
{
|
||||
mgolf_video_ram[0x380 + offset] = data;
|
||||
mgolf_state *state = (mgolf_state *)space->machine->driver_data;
|
||||
state->video_ram[0x380 + offset] = data;
|
||||
}
|
||||
|
||||
|
||||
@ -201,7 +202,7 @@ static ADDRESS_MAP_START( cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x006d, 0x006d) AM_WRITENOP
|
||||
AM_RANGE(0x0080, 0x00ff) AM_WRITE(mgolf_wram_w)
|
||||
AM_RANGE(0x0180, 0x01ff) AM_WRITE(mgolf_wram_w)
|
||||
AM_RANGE(0x0800, 0x0bff) AM_WRITE(mgolf_vram_w) AM_BASE(&mgolf_video_ram)
|
||||
AM_RANGE(0x0800, 0x0bff) AM_WRITE(mgolf_vram_w) AM_BASE_MEMBER(mgolf_state, video_ram)
|
||||
|
||||
AM_RANGE(0x2000, 0x3fff) AM_ROM
|
||||
ADDRESS_MAP_END
|
||||
@ -209,7 +210,7 @@ ADDRESS_MAP_END
|
||||
|
||||
static INPUT_PORTS_START( mgolf )
|
||||
|
||||
PORT_START("40") /* 40 */
|
||||
PORT_START("40")
|
||||
PORT_DIPNAME( 0x30, 0x00, DEF_STR( Language ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( English ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( French ) )
|
||||
@ -221,19 +222,19 @@ static INPUT_PORTS_START( mgolf )
|
||||
PORT_DIPSETTING( 0x80, "35" )
|
||||
PORT_DIPSETTING( 0xc0, "40" )
|
||||
|
||||
PORT_START("41") /* 41 */
|
||||
PORT_START("41")
|
||||
PORT_BIT ( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* DIAL A */
|
||||
PORT_BIT ( 0x02, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* DIAL B */
|
||||
PORT_BIT ( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
PORT_BIT ( 0x08, IP_ACTIVE_HIGH, IPT_VBLANK )
|
||||
|
||||
PORT_START("60") /* 60 */
|
||||
PORT_START("60")
|
||||
PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
|
||||
PORT_BIT ( 0x20, IP_ACTIVE_LOW, IPT_TILT )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1)
|
||||
|
||||
PORT_START("61") /* 61 */
|
||||
PORT_START("61")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Course Select") PORT_CODE(KEYCODE_SPACE)
|
||||
PORT_BIT ( 0x20, IP_ACTIVE_LOW, IPT_SPECIAL ) /* PLUNGER 1 */
|
||||
PORT_BIT ( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) /* PLUNGER 2 */
|
||||
@ -248,6 +249,14 @@ static INPUT_PORTS_START( mgolf )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static PALETTE_INIT( mgolf )
|
||||
{
|
||||
palette_set_color(machine, 0, MAKE_RGB(0x80, 0x80, 0x80));
|
||||
palette_set_color(machine, 1, MAKE_RGB(0x00, 0x00, 0x00));
|
||||
palette_set_color(machine, 2, MAKE_RGB(0x80, 0x80, 0x80));
|
||||
palette_set_color(machine, 3, MAKE_RGB(0xff, 0xff, 0xff));
|
||||
}
|
||||
|
||||
static const gfx_layout tile_layout =
|
||||
{
|
||||
8, 8,
|
||||
@ -287,12 +296,36 @@ static GFXDECODE_START( mgolf )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
static MACHINE_START( mgolf )
|
||||
{
|
||||
mgolf_state *state = (mgolf_state *)machine->driver_data;
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
|
||||
state_save_register_global(machine, state->prev);
|
||||
state_save_register_global(machine, state->mask);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( mgolf )
|
||||
{
|
||||
mgolf_state *state = (mgolf_state *)machine->driver_data;
|
||||
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 16, 0), NULL, 16, interrupt_callback);
|
||||
|
||||
state->mask = 0;
|
||||
state->prev = 0;
|
||||
}
|
||||
|
||||
|
||||
static MACHINE_DRIVER_START( mgolf )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mgolf_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", M6502, 12096000 / 16) /* ? */
|
||||
MDRV_CPU_PROGRAM_MAP(cpu_map)
|
||||
|
||||
MDRV_MACHINE_START(mgolf)
|
||||
MDRV_MACHINE_RESET(mgolf)
|
||||
|
||||
/* video hardware */
|
||||
|
@ -14,6 +14,13 @@ Japan). It has no sound.
|
||||
#include "cpu/z80/z80.h"
|
||||
|
||||
|
||||
typedef struct _minivadr_state minivadr_state;
|
||||
struct _minivadr_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * videoram;
|
||||
size_t videoram_size;
|
||||
};
|
||||
|
||||
/*************************************
|
||||
*
|
||||
@ -23,15 +30,16 @@ Japan). It has no sound.
|
||||
|
||||
static VIDEO_UPDATE( minivadr )
|
||||
{
|
||||
minivadr_state *state = (minivadr_state *)screen->machine->driver_data;
|
||||
offs_t offs;
|
||||
|
||||
for (offs = 0; offs < screen->machine->generic.videoram_size; offs++)
|
||||
for (offs = 0; offs < state->videoram_size; offs++)
|
||||
{
|
||||
int i;
|
||||
|
||||
UINT8 x = offs << 3;
|
||||
int y = offs >> 5;
|
||||
UINT8 data = screen->machine->generic.videoram.u8[offs];
|
||||
UINT8 data = state->videoram[offs];
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
@ -49,7 +57,7 @@ static VIDEO_UPDATE( minivadr )
|
||||
|
||||
static ADDRESS_MAP_START( minivadr_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x1fff) AM_ROM
|
||||
AM_RANGE(0xa000, 0xbfff) AM_RAM AM_BASE_GENERIC(videoram) AM_SIZE_GENERIC(videoram)
|
||||
AM_RANGE(0xa000, 0xbfff) AM_RAM AM_BASE_SIZE_MEMBER(minivadr_state, videoram, videoram_size)
|
||||
AM_RANGE(0xe008, 0xe008) AM_READ_PORT("INPUTS") AM_WRITENOP // W - ???
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -69,6 +77,9 @@ INPUT_PORTS_END
|
||||
|
||||
static MACHINE_DRIVER_START( minivadr )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(minivadr_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", Z80,24000000 / 6) /* 4 MHz ? */
|
||||
MDRV_CPU_PROGRAM_MAP(minivadr_map)
|
||||
@ -100,4 +111,4 @@ ROM_START( minivadr )
|
||||
ROM_END
|
||||
|
||||
|
||||
GAME( 1990, minivadr, 0, minivadr, minivadr, 0, ROT0, "Taito Corporation", "Minivader", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW)
|
||||
GAME( 1990, minivadr, 0, minivadr, minivadr, 0, ROT0, "Taito Corporation", "Minivader", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW )
|
||||
|
@ -1,34 +1,25 @@
|
||||
/***************************************************************************
|
||||
|
||||
Mosaic (c) 1990 Space
|
||||
Mosaic (c) 1990 Space
|
||||
|
||||
Notes:
|
||||
- the ROM OK / RAM OK message in service mode is fake: ROM and RAM are not tested.
|
||||
Notes:
|
||||
- the ROM OK / RAM OK message in service mode is fake: ROM and RAM are not tested.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/z180/z180.h"
|
||||
#include "sound/2203intf.h"
|
||||
|
||||
|
||||
extern UINT8 *mosaic_fgvideoram;
|
||||
extern UINT8 *mosaic_bgvideoram;
|
||||
WRITE8_HANDLER( mosaic_fgvideoram_w );
|
||||
WRITE8_HANDLER( mosaic_bgvideoram_w );
|
||||
VIDEO_START( mosaic );
|
||||
VIDEO_UPDATE( mosaic );
|
||||
|
||||
|
||||
|
||||
static int prot_val;
|
||||
#include "includes/mosaic.h"
|
||||
|
||||
static WRITE8_HANDLER( protection_w )
|
||||
{
|
||||
if ((data & 0x80) == 0)
|
||||
mosaic_state *state = (mosaic_state *)space->machine->driver_data;
|
||||
|
||||
if (!BIT(data, 7))
|
||||
{
|
||||
/* simply increment given value */
|
||||
prot_val = (data + 1) << 8;
|
||||
state->prot_val = (data + 1) << 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -43,24 +34,27 @@ static WRITE8_HANDLER( protection_w )
|
||||
0x411f, 0x473f
|
||||
};
|
||||
|
||||
prot_val = jumptable[data & 0x7f];
|
||||
state->prot_val = jumptable[data & 0x7f];
|
||||
}
|
||||
}
|
||||
|
||||
static READ8_HANDLER( protection_r )
|
||||
{
|
||||
int res = (prot_val >> 8) & 0xff;
|
||||
mosaic_state *state = (mosaic_state *)space->machine->driver_data;
|
||||
int res = (state->prot_val >> 8) & 0xff;
|
||||
|
||||
logerror("%06x: protection_r %02x\n",cpu_get_pc(space->cpu),res);
|
||||
logerror("%06x: protection_r %02x\n", cpu_get_pc(space->cpu), res);
|
||||
|
||||
prot_val <<= 8;
|
||||
state->prot_val <<= 8;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( gfire2_protection_w )
|
||||
{
|
||||
logerror("%06x: protection_w %02x\n",cpu_get_pc(space->cpu),data);
|
||||
mosaic_state *state = (mosaic_state *)space->machine->driver_data;
|
||||
|
||||
logerror("%06x: protection_w %02x\n", cpu_get_pc(space->cpu), data);
|
||||
|
||||
switch(data)
|
||||
{
|
||||
@ -68,28 +62,29 @@ static WRITE8_HANDLER( gfire2_protection_w )
|
||||
/* written repeatedly; no effect?? */
|
||||
break;
|
||||
case 0x02:
|
||||
prot_val = 0x0a10;
|
||||
state->prot_val = 0x0a10;
|
||||
break;
|
||||
case 0x04:
|
||||
prot_val = 0x0a15;
|
||||
state->prot_val = 0x0a15;
|
||||
break;
|
||||
case 0x06:
|
||||
prot_val = 0x80e3;
|
||||
state->prot_val = 0x80e3;
|
||||
break;
|
||||
case 0x08:
|
||||
prot_val = 0x0965;
|
||||
state->prot_val = 0x0965;
|
||||
break;
|
||||
case 0x0a:
|
||||
prot_val = 0x04b4;
|
||||
state->prot_val = 0x04b4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static READ8_HANDLER( gfire2_protection_r )
|
||||
{
|
||||
int res = prot_val & 0xff;
|
||||
mosaic_state *state = (mosaic_state *)space->machine->driver_data;
|
||||
int res = state->prot_val & 0xff;
|
||||
|
||||
prot_val >>= 8;
|
||||
state->prot_val >>= 8;
|
||||
|
||||
return res;
|
||||
}
|
||||
@ -99,16 +94,16 @@ static READ8_HANDLER( gfire2_protection_r )
|
||||
static ADDRESS_MAP_START( mosaic_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x00000, 0x0ffff) AM_ROM
|
||||
AM_RANGE(0x20000, 0x21fff) AM_RAM
|
||||
AM_RANGE(0x22000, 0x22fff) AM_RAM_WRITE(mosaic_bgvideoram_w) AM_BASE(&mosaic_bgvideoram)
|
||||
AM_RANGE(0x23000, 0x23fff) AM_RAM_WRITE(mosaic_fgvideoram_w) AM_BASE(&mosaic_fgvideoram)
|
||||
AM_RANGE(0x22000, 0x22fff) AM_RAM_WRITE(mosaic_bgvideoram_w) AM_BASE_MEMBER(mosaic_state, bgvideoram)
|
||||
AM_RANGE(0x23000, 0x23fff) AM_RAM_WRITE(mosaic_fgvideoram_w) AM_BASE_MEMBER(mosaic_state, fgvideoram)
|
||||
AM_RANGE(0x24000, 0x241ff) AM_RAM_WRITE(paletteram_xRRRRRGGGGGBBBBB_le_w) AM_BASE_GENERIC(paletteram)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( gfire2_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x00000, 0x0ffff) AM_ROM
|
||||
AM_RANGE(0x10000, 0x17fff) AM_RAM
|
||||
AM_RANGE(0x22000, 0x22fff) AM_RAM_WRITE(mosaic_bgvideoram_w) AM_BASE(&mosaic_bgvideoram)
|
||||
AM_RANGE(0x23000, 0x23fff) AM_RAM_WRITE(mosaic_fgvideoram_w) AM_BASE(&mosaic_fgvideoram)
|
||||
AM_RANGE(0x22000, 0x22fff) AM_RAM_WRITE(mosaic_bgvideoram_w) AM_BASE_MEMBER(mosaic_state, bgvideoram)
|
||||
AM_RANGE(0x23000, 0x23fff) AM_RAM_WRITE(mosaic_fgvideoram_w) AM_BASE_MEMBER(mosaic_state, fgvideoram)
|
||||
AM_RANGE(0x24000, 0x241ff) AM_RAM_WRITE(paletteram_xRRRRRGGGGGBBBBB_le_w) AM_BASE_GENERIC(paletteram)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -258,12 +253,34 @@ static const ym2203_interface ym2203_config =
|
||||
|
||||
|
||||
|
||||
static MACHINE_START( mosaic )
|
||||
{
|
||||
mosaic_state *state = (mosaic_state *)machine->driver_data;
|
||||
|
||||
state_save_register_global(machine, state->prot_val);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( mosaic )
|
||||
{
|
||||
mosaic_state *state = (mosaic_state *)machine->driver_data;
|
||||
|
||||
state->prot_val = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mosaic )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mosaic_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", Z180, 7000000) /* ??? */
|
||||
MDRV_CPU_PROGRAM_MAP(mosaic_map)
|
||||
MDRV_CPU_IO_MAP(mosaic_io_map)
|
||||
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
|
||||
|
||||
MDRV_MACHINE_START(mosaic)
|
||||
MDRV_MACHINE_RESET(mosaic)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
|
@ -16,30 +16,21 @@
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "deprecat.h"
|
||||
#include "sound/ay8910.h"
|
||||
|
||||
static UINT8 mouser_sound_byte;
|
||||
static UINT8 mouser_nmi_enable;
|
||||
|
||||
/* From "video/mouser.c" */
|
||||
extern UINT8 *mouser_videoram;
|
||||
extern UINT8 *mouser_colorram;
|
||||
|
||||
PALETTE_INIT( mouser );
|
||||
WRITE8_HANDLER( mouser_flip_screen_x_w );
|
||||
WRITE8_HANDLER( mouser_flip_screen_y_w );
|
||||
VIDEO_UPDATE( mouser );
|
||||
#include "includes/mouser.h"
|
||||
|
||||
/* Mouser has external masking circuitry around
|
||||
* the NMI input on the main CPU */
|
||||
|
||||
static WRITE8_HANDLER( mouser_nmi_enable_w )
|
||||
{
|
||||
mouser_nmi_enable = data;
|
||||
mouser_state *state = (mouser_state *)space->machine->driver_data;
|
||||
state->nmi_enable = data;
|
||||
}
|
||||
|
||||
static INTERRUPT_GEN( mouser_nmi_interrupt )
|
||||
{
|
||||
if ((mouser_nmi_enable & 1) == 1)
|
||||
mouser_state *state = (mouser_state *)device->machine->driver_data;
|
||||
|
||||
if (BIT(state->nmi_enable, 0))
|
||||
nmi_line_pulse(device);
|
||||
}
|
||||
|
||||
@ -47,22 +38,24 @@ static INTERRUPT_GEN( mouser_nmi_interrupt )
|
||||
|
||||
static WRITE8_HANDLER( mouser_sound_interrupt_w )
|
||||
{
|
||||
mouser_sound_byte = data;
|
||||
cputag_set_input_line(space->machine, "audiocpu", 0, HOLD_LINE);
|
||||
mouser_state *state = (mouser_state *)space->machine->driver_data;
|
||||
state->sound_byte = data;
|
||||
cpu_set_input_line(state->audiocpu, 0, HOLD_LINE);
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mouser_sound_byte_r )
|
||||
{
|
||||
return mouser_sound_byte;
|
||||
mouser_state *state = (mouser_state *)space->machine->driver_data;
|
||||
return state->sound_byte;
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( mouser_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x5fff) AM_ROM
|
||||
AM_RANGE(0x6000, 0x6bff) AM_RAM
|
||||
AM_RANGE(0x8800, 0x88ff) AM_WRITENOP /* unknown */
|
||||
AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE(&mouser_videoram)
|
||||
AM_RANGE(0x9800, 0x9cff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
|
||||
AM_RANGE(0x9c00, 0x9fff) AM_RAM AM_BASE(&mouser_colorram)
|
||||
AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE_MEMBER(mouser_state, videoram)
|
||||
AM_RANGE(0x9800, 0x9cff) AM_RAM AM_BASE_SIZE_MEMBER(mouser_state, spriteram, spriteram_size)
|
||||
AM_RANGE(0x9c00, 0x9fff) AM_RAM AM_BASE_MEMBER(mouser_state, colorram)
|
||||
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(mouser_nmi_enable_w) /* bit 0 = NMI Enable */
|
||||
AM_RANGE(0xa001, 0xa001) AM_WRITE(mouser_flip_screen_x_w)
|
||||
AM_RANGE(0xa002, 0xa002) AM_WRITE(mouser_flip_screen_y_w)
|
||||
@ -178,8 +171,30 @@ static GFXDECODE_START( mouser )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
static MACHINE_START( mouser )
|
||||
{
|
||||
mouser_state *state = (mouser_state *)machine->driver_data;
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
state->audiocpu = devtag_get_device(machine, "audiocpu");
|
||||
|
||||
state_save_register_global(machine, state->sound_byte);
|
||||
state_save_register_global(machine, state->nmi_enable);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( mouser )
|
||||
{
|
||||
mouser_state *state = (mouser_state *)machine->driver_data;
|
||||
|
||||
state->sound_byte = 0;
|
||||
state->nmi_enable = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mouser )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mouser_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz ? */
|
||||
MDRV_CPU_PROGRAM_MAP(mouser_map)
|
||||
@ -190,6 +205,9 @@ static MACHINE_DRIVER_START( mouser )
|
||||
MDRV_CPU_IO_MAP(mouser_sound_io_map)
|
||||
MDRV_CPU_VBLANK_INT_HACK(nmi_line_pulse,4) /* ??? This controls the sound tempo */
|
||||
|
||||
MDRV_MACHINE_START(mouser)
|
||||
MDRV_MACHINE_RESET(mouser)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -275,12 +293,12 @@ static DRIVER_INIT( mouser )
|
||||
|
||||
memory_set_decrypted_region(space, 0x0000, 0x5fff, decrypted);
|
||||
|
||||
for (i = 0;i < 0x6000;i++)
|
||||
for (i = 0; i < 0x6000; i++)
|
||||
{
|
||||
decrypted[i] = table[rom[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GAME( 1983, mouser, 0, mouser, mouser, mouser, ROT90, "UPL", "Mouser", 0 )
|
||||
GAME( 1983, mouserc, mouser, mouser, mouser, mouser, ROT90, "[UPL] (Cosmos license)", "Mouser (Cosmos)", 0 )
|
||||
GAME( 1983, mouser, 0, mouser, mouser, mouser, ROT90, "UPL", "Mouser", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1983, mouserc, mouser, mouser, mouser, mouser, ROT90, "[UPL] (Cosmos license)", "Mouser (Cosmos)", GAME_SUPPORTS_SAVE )
|
||||
|
@ -22,38 +22,29 @@ There's a chance that certain bootlegs might have the different 8/20 MHz XTALS.
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/sn76496.h"
|
||||
#include "includes/mrdo.h"
|
||||
|
||||
|
||||
#define MAIN_CLOCK XTAL_8_2MHz
|
||||
#define VIDEO_CLOCK XTAL_19_6MHz
|
||||
|
||||
|
||||
extern UINT8 *mrdo_bgvideoram,*mrdo_fgvideoram;
|
||||
WRITE8_HANDLER( mrdo_bgvideoram_w );
|
||||
WRITE8_HANDLER( mrdo_fgvideoram_w );
|
||||
WRITE8_HANDLER( mrdo_scrollx_w );
|
||||
WRITE8_HANDLER( mrdo_scrolly_w );
|
||||
WRITE8_HANDLER( mrdo_flipscreen_w );
|
||||
PALETTE_INIT( mrdo );
|
||||
VIDEO_START( mrdo );
|
||||
VIDEO_UPDATE( mrdo );
|
||||
|
||||
|
||||
|
||||
/* this looks like some kind of protection. The game doesn't clear the screen */
|
||||
/* if a read from this address doesn't return the value it expects. */
|
||||
static READ8_HANDLER( mrdo_SECRE_r )
|
||||
{
|
||||
UINT8 *RAM = memory_region(space->machine, "maincpu");
|
||||
return RAM[ cpu_get_reg(space->cpu, Z80_HL) ];
|
||||
return RAM[cpu_get_reg(space->cpu, Z80_HL)];
|
||||
}
|
||||
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x7fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(mrdo_bgvideoram_w) AM_BASE(&mrdo_bgvideoram)
|
||||
AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(mrdo_fgvideoram_w) AM_BASE(&mrdo_fgvideoram)
|
||||
AM_RANGE(0x9000, 0x90ff) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram)
|
||||
AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(mrdo_bgvideoram_w) AM_BASE_MEMBER(mrdo_state, bgvideoram)
|
||||
AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(mrdo_fgvideoram_w) AM_BASE_MEMBER(mrdo_state, fgvideoram)
|
||||
AM_RANGE(0x9000, 0x90ff) AM_WRITEONLY AM_BASE_SIZE_MEMBER(mrdo_state, spriteram, spriteram_size)
|
||||
AM_RANGE(0x9800, 0x9800) AM_WRITE(mrdo_flipscreen_w) /* screen flip + playfield priority */
|
||||
AM_RANGE(0x9801, 0x9801) AM_DEVWRITE("sn1", sn76496_w)
|
||||
AM_RANGE(0x9802, 0x9802) AM_DEVWRITE("sn2", sn76496_w)
|
||||
@ -176,6 +167,9 @@ GFXDECODE_END
|
||||
|
||||
static MACHINE_DRIVER_START( mrdo )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mrdo_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", Z80, MAIN_CLOCK/2) /* Verified */
|
||||
MDRV_CPU_PROGRAM_MAP(main_map)
|
||||
|
@ -43,19 +43,231 @@ Video Board
|
||||
#include "deprecat.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/ay8910.h"
|
||||
#include "includes/mrflea.h"
|
||||
|
||||
static int mrflea_io;
|
||||
static int mrflea_main;
|
||||
|
||||
static int mrflea_status;
|
||||
/*************************************
|
||||
*
|
||||
* Memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static int mrflea_select1;
|
||||
static WRITE8_HANDLER( mrflea_main_w )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
state->status |= 0x01; // pending command to main CPU
|
||||
state->main = data;
|
||||
}
|
||||
|
||||
extern WRITE8_HANDLER( mrflea_gfx_bank_w );
|
||||
extern WRITE8_HANDLER( mrflea_videoram_w );
|
||||
extern WRITE8_HANDLER( mrflea_spriteram_w );
|
||||
extern VIDEO_START( mrflea );
|
||||
extern VIDEO_UPDATE( mrflea );
|
||||
static WRITE8_HANDLER( mrflea_io_w )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
state->status |= 0x08; // pending command to IO CPU
|
||||
state->io = data;
|
||||
cpu_set_input_line(state->subcpu, 0, HOLD_LINE );
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_main_r )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
state->status &= ~0x01; // main CPU command read
|
||||
return state->main;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_io_r )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
state->status &= ~0x08; // IO CPU command read
|
||||
return state->io;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_main_status_r )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
|
||||
/* 0x01: main CPU command pending
|
||||
0x08: io cpu ready */
|
||||
return state->status ^ 0x08;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_io_status_r )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
|
||||
/* 0x08: IO CPU command pending
|
||||
0x01: main cpu ready */
|
||||
return state->status ^ 0x01;
|
||||
}
|
||||
|
||||
static INTERRUPT_GEN( mrflea_slave_interrupt )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)device->machine->driver_data;
|
||||
if (cpu_getiloops(device) == 0 || (state->status & 0x08))
|
||||
cpu_set_input_line(device, 0, HOLD_LINE);
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_interrupt_type_r )
|
||||
{
|
||||
/* there are two interrupt types:
|
||||
1. triggered (in response to sound command)
|
||||
2. heartbeat (for music timing)
|
||||
*/
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
|
||||
if (state->status & 0x08 )
|
||||
return 0x00; /* process command */
|
||||
|
||||
return 0x01; /* music/sound update? */
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mrflea_select1_w )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
state->select1 = data;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_input1_r )
|
||||
{
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mrflea_data1_w )
|
||||
{
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Address maps
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_master_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0xbfff) AM_ROM
|
||||
AM_RANGE(0xc000, 0xcfff) AM_RAM
|
||||
AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(mrflea_videoram_w) AM_BASE_MEMBER(mrflea_state, videoram)
|
||||
AM_RANGE(0xe800, 0xe83f) AM_RAM_WRITE(paletteram_xxxxRRRRGGGGBBBB_le_w) AM_BASE_GENERIC(paletteram)
|
||||
AM_RANGE(0xec00, 0xecff) AM_RAM_WRITE(mrflea_spriteram_w) AM_BASE_MEMBER(mrflea_state, spriteram)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_master_io_map, ADDRESS_SPACE_IO, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x00) AM_WRITENOP /* watchdog? */
|
||||
AM_RANGE(0x40, 0x40) AM_WRITE(mrflea_io_w)
|
||||
AM_RANGE(0x41, 0x41) AM_READ(mrflea_main_r)
|
||||
AM_RANGE(0x42, 0x42) AM_READ(mrflea_main_status_r)
|
||||
AM_RANGE(0x43, 0x43) AM_WRITENOP /* 0xa6,0x0d,0x05 */
|
||||
AM_RANGE(0x60, 0x60) AM_WRITE(mrflea_gfx_bank_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_slave_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x0fff) AM_ROM
|
||||
AM_RANGE(0x2000, 0x3fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0x80ff) AM_RAM
|
||||
AM_RANGE(0x9000, 0x905a) AM_RAM /* ? */
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_slave_io_map, ADDRESS_SPACE_IO, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x00) AM_WRITENOP /* watchdog */
|
||||
AM_RANGE(0x10, 0x10) AM_READ(mrflea_interrupt_type_r) AM_WRITENOP /* ? / irq ACK */
|
||||
AM_RANGE(0x11, 0x11) AM_WRITENOP /* 0x83,0x00,0xfc */
|
||||
AM_RANGE(0x20, 0x20) AM_READ(mrflea_io_r)
|
||||
AM_RANGE(0x21, 0x21) AM_WRITE(mrflea_main_w)
|
||||
AM_RANGE(0x22, 0x22) AM_READ(mrflea_io_status_r)
|
||||
AM_RANGE(0x23, 0x23) AM_WRITENOP /* 0xb4,0x09,0x05 */
|
||||
AM_RANGE(0x40, 0x40) AM_DEVREAD("ay1", ay8910_r)
|
||||
AM_RANGE(0x40, 0x41) AM_DEVWRITE("ay1", ay8910_data_address_w)
|
||||
AM_RANGE(0x42, 0x42) AM_READWRITE(mrflea_input1_r, mrflea_data1_w)
|
||||
AM_RANGE(0x43, 0x43) AM_WRITE(mrflea_select1_w)
|
||||
AM_RANGE(0x44, 0x44) AM_DEVREAD("ay2", ay8910_r)
|
||||
AM_RANGE(0x44, 0x45) AM_DEVWRITE("ay2", ay8910_data_address_w)
|
||||
AM_RANGE(0x46, 0x46) AM_DEVREAD("ay3", ay8910_r)
|
||||
AM_RANGE(0x46, 0x47) AM_DEVWRITE("ay3", ay8910_data_address_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Input ports
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static INPUT_PORTS_START( mrflea )
|
||||
PORT_START("IN0")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSW1")
|
||||
/*
|
||||
------xx
|
||||
-----x--
|
||||
----x---
|
||||
*/
|
||||
PORT_DIPNAME( 0x03, 0x03, "Bonus?" )
|
||||
PORT_DIPSETTING( 0x03, "A" )
|
||||
PORT_DIPSETTING( 0x02, "B" )
|
||||
PORT_DIPSETTING( 0x01, "C" )
|
||||
PORT_DIPSETTING( 0x00, "D" )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
PORT_START("DSW2")
|
||||
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
|
||||
PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) )
|
||||
PORT_DIPSETTING( 0x0c, "3" )
|
||||
PORT_DIPSETTING( 0x08, "4" )
|
||||
PORT_DIPSETTING( 0x04, "5" )
|
||||
PORT_DIPSETTING( 0x00, "7" )
|
||||
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) )
|
||||
PORT_DIPSETTING( 0x30, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Medium ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Hard ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Graphics definitions
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const gfx_layout tile_layout = {
|
||||
8,8,
|
||||
@ -85,128 +297,11 @@ static GFXDECODE_START( mrflea )
|
||||
GFXDECODE_ENTRY( "gfx2", 0, tile_layout, 0x00, 1 )
|
||||
GFXDECODE_END
|
||||
|
||||
/*******************************************************/
|
||||
|
||||
static WRITE8_HANDLER( mrflea_main_w )
|
||||
{
|
||||
mrflea_status |= 0x01; // pending command to main CPU
|
||||
mrflea_main = data;
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mrflea_io_w )
|
||||
{
|
||||
mrflea_status |= 0x08; // pending command to IO CPU
|
||||
mrflea_io = data;
|
||||
cputag_set_input_line(space->machine, "sub", 0, HOLD_LINE );
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_main_r )
|
||||
{
|
||||
mrflea_status &= ~0x01; // main CPU command read
|
||||
return mrflea_main;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_io_r )
|
||||
{
|
||||
mrflea_status &= ~0x08; // IO CPU command read
|
||||
return mrflea_io;
|
||||
}
|
||||
|
||||
/*******************************************************/
|
||||
|
||||
static READ8_HANDLER( mrflea_main_status_r )
|
||||
{
|
||||
/* 0x01: main CPU command pending
|
||||
0x08: io cpu ready */
|
||||
return mrflea_status^0x08;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_io_status_r )
|
||||
{
|
||||
/* 0x08: IO CPU command pending
|
||||
0x01: main cpu ready */
|
||||
return mrflea_status^0x01;
|
||||
}
|
||||
|
||||
static INTERRUPT_GEN( mrflea_slave_interrupt )
|
||||
{
|
||||
if( cpu_getiloops(device)==0 || (mrflea_status&0x08) )
|
||||
cpu_set_input_line(device, 0, HOLD_LINE);
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_interrupt_type_r )
|
||||
{
|
||||
/* there are two interrupt types:
|
||||
1. triggered (in response to sound command)
|
||||
2. heartbeat (for music timing)
|
||||
*/
|
||||
if( mrflea_status&0x08 ) return 0x00; /* process command */
|
||||
return 0x01; /* music/sound update? */
|
||||
}
|
||||
|
||||
/*******************************************************/
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_master_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0xbfff) AM_ROM
|
||||
AM_RANGE(0xc000, 0xcfff) AM_RAM
|
||||
AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(mrflea_videoram_w) AM_BASE_GENERIC(videoram)
|
||||
AM_RANGE(0xe800, 0xe83f) AM_RAM_WRITE(paletteram_xxxxRRRRGGGGBBBB_le_w) AM_BASE_GENERIC(paletteram)
|
||||
AM_RANGE(0xec00, 0xecff) AM_RAM_WRITE(mrflea_spriteram_w) AM_BASE_GENERIC(spriteram)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_master_io_map, ADDRESS_SPACE_IO, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x00) AM_WRITENOP /* watchdog? */
|
||||
AM_RANGE(0x40, 0x40) AM_WRITE(mrflea_io_w)
|
||||
AM_RANGE(0x41, 0x41) AM_READ(mrflea_main_r)
|
||||
AM_RANGE(0x42, 0x42) AM_READ(mrflea_main_status_r)
|
||||
AM_RANGE(0x43, 0x43) AM_WRITENOP /* 0xa6,0x0d,0x05 */
|
||||
AM_RANGE(0x60, 0x60) AM_WRITE(mrflea_gfx_bank_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/*******************************************************/
|
||||
|
||||
static WRITE8_HANDLER( mrflea_select1_w )
|
||||
{
|
||||
mrflea_select1 = data;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( mrflea_input1_r )
|
||||
{
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mrflea_data1_w )
|
||||
{
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_slave_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x0fff) AM_ROM
|
||||
AM_RANGE(0x2000, 0x3fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0x80ff) AM_RAM
|
||||
AM_RANGE(0x9000, 0x905a) AM_RAM /* ? */
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mrflea_slave_io_map, ADDRESS_SPACE_IO, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x00) AM_WRITENOP /* watchdog */
|
||||
AM_RANGE(0x10, 0x10) AM_READ(mrflea_interrupt_type_r) AM_WRITENOP /* ? / irq ACK */
|
||||
AM_RANGE(0x11, 0x11) AM_WRITENOP /* 0x83,0x00,0xfc */
|
||||
AM_RANGE(0x20, 0x20) AM_READ(mrflea_io_r)
|
||||
AM_RANGE(0x21, 0x21) AM_WRITE(mrflea_main_w)
|
||||
AM_RANGE(0x22, 0x22) AM_READ(mrflea_io_status_r)
|
||||
AM_RANGE(0x23, 0x23) AM_WRITENOP /* 0xb4,0x09,0x05 */
|
||||
AM_RANGE(0x40, 0x40) AM_DEVREAD("ay1", ay8910_r)
|
||||
AM_RANGE(0x40, 0x41) AM_DEVWRITE("ay1", ay8910_data_address_w)
|
||||
AM_RANGE(0x42, 0x42) AM_READWRITE(mrflea_input1_r, mrflea_data1_w)
|
||||
AM_RANGE(0x43, 0x43) AM_WRITE(mrflea_select1_w)
|
||||
AM_RANGE(0x44, 0x44) AM_DEVREAD("ay2", ay8910_r)
|
||||
AM_RANGE(0x44, 0x45) AM_DEVWRITE("ay2", ay8910_data_address_w)
|
||||
AM_RANGE(0x46, 0x46) AM_DEVREAD("ay3", ay8910_r)
|
||||
AM_RANGE(0x46, 0x47) AM_DEVWRITE("ay3", ay8910_data_address_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/*******************************************************/
|
||||
/*************************************
|
||||
*
|
||||
* Sound interfaces
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const ay8910_interface mrflea_ay8910_interface_0 =
|
||||
{
|
||||
@ -224,8 +319,42 @@ static const ay8910_interface mrflea_ay8910_interface_1 =
|
||||
DEVCB_INPUT_PORT("DSW1")
|
||||
};
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_START( mrflea )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)machine->driver_data;
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
state->subcpu = devtag_get_device(machine, "sub");
|
||||
|
||||
state_save_register_global(machine, state->gfx_bank);
|
||||
state_save_register_global(machine, state->io);
|
||||
state_save_register_global(machine, state->main);
|
||||
state_save_register_global(machine, state->status);
|
||||
state_save_register_global(machine, state->select1);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( mrflea )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)machine->driver_data;
|
||||
|
||||
state->gfx_bank = 0;
|
||||
state->io = 0;
|
||||
state->main = 0;
|
||||
state->status = 0;
|
||||
state->select1 = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mrflea )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mrflea_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz? */
|
||||
MDRV_CPU_PROGRAM_MAP(mrflea_master_map)
|
||||
@ -239,6 +368,9 @@ static MACHINE_DRIVER_START( mrflea )
|
||||
|
||||
MDRV_QUANTUM_TIME(HZ(6000))
|
||||
|
||||
MDRV_MACHINE_START(mrflea)
|
||||
MDRV_MACHINE_RESET(mrflea)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -250,7 +382,6 @@ static MACHINE_DRIVER_START( mrflea )
|
||||
MDRV_GFXDECODE(mrflea)
|
||||
MDRV_PALETTE_LENGTH(32)
|
||||
|
||||
MDRV_VIDEO_START(mrflea)
|
||||
MDRV_VIDEO_UPDATE(mrflea)
|
||||
|
||||
/* sound hardware */
|
||||
@ -268,6 +399,12 @@ static MACHINE_DRIVER_START( mrflea )
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* ROM definition(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
ROM_START( mrflea )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* Z80 code; main CPU */
|
||||
ROM_LOAD( "cpu_d1", 0x0000, 0x2000, CRC(d286217c) SHA1(d750d64bb70f735a38b737881abb9a5fbde1c98c) )
|
||||
@ -303,76 +440,10 @@ ROM_START( mrflea )
|
||||
ROM_LOAD( "vd_l4", 0xe000, 0x2000, CRC(423735a5) SHA1(4ee93f93cd2b08560e148525e08880d64c64fcd2) )
|
||||
ROM_END
|
||||
|
||||
static INPUT_PORTS_START( mrflea )
|
||||
PORT_START("IN0")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSW1") /* DSW1 */
|
||||
/*
|
||||
------xx
|
||||
-----x--
|
||||
----x---
|
||||
*/
|
||||
PORT_DIPNAME( 0x03, 0x03, "Bonus?" )
|
||||
PORT_DIPSETTING( 0x03, "A" )
|
||||
PORT_DIPSETTING( 0x02, "B" )
|
||||
PORT_DIPSETTING( 0x01, "C" )
|
||||
PORT_DIPSETTING( 0x00, "D" )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
PORT_START("DSW2") /* DSW2 */
|
||||
PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) )
|
||||
PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) )
|
||||
PORT_DIPSETTING( 0x0c, "3" )
|
||||
PORT_DIPSETTING( 0x08, "4" )
|
||||
PORT_DIPSETTING( 0x04, "5" )
|
||||
PORT_DIPSETTING( 0x00, "7" )
|
||||
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) )
|
||||
PORT_DIPSETTING( 0x30, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Medium ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Hard ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
GAME( 1982, mrflea, 0, mrflea, mrflea, 0, ROT270, "Pacific Novelty", "The Amazing Adventures of Mr. F. Lea" , 0 )
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
GAME( 1982, mrflea, 0, mrflea, mrflea, 0, ROT270, "Pacific Novelty", "The Amazing Adventures of Mr. F. Lea" , GAME_SUPPORTS_SAVE )
|
||||
|
@ -1,15 +1,16 @@
|
||||
/***************************************************************************
|
||||
|
||||
Mr.Jong
|
||||
(c)1983 Kiwako (This game is distributed by Sanritsu.)
|
||||
Mr. Jong
|
||||
(c)1983 Kiwako (This game is distributed by Sanritsu.)
|
||||
|
||||
Crazy Blocks
|
||||
(c)1983 Kiwako/ECI
|
||||
Crazy Blocks
|
||||
(c)1983 Kiwako/ECI
|
||||
|
||||
Driver by Takahiro Nogi (nogi@kt.rim.or.jp) 2000/03/20 -
|
||||
Driver by Takahiro Nogi (nogi@kt.rim.or.jp) 2000/03/20 -
|
||||
|
||||
Block Buster
|
||||
(c)1983 Kiwako/ECI
|
||||
|
||||
Block Buster
|
||||
(c)1983 Kiwako/ECI
|
||||
|
||||
PCB Layout
|
||||
----------
|
||||
@ -45,32 +46,14 @@ ROMs 6A, 7A, 8A, 9A: 2764
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/sn76496.h"
|
||||
#include "includes/mrjong.h"
|
||||
|
||||
|
||||
extern UINT8 *mrjong_videoram;
|
||||
extern UINT8 *mrjong_colorram;
|
||||
|
||||
extern WRITE8_HANDLER( mrjong_videoram_w );
|
||||
extern WRITE8_HANDLER( mrjong_colorram_w );
|
||||
extern WRITE8_HANDLER( mrjong_flipscreen_w );
|
||||
|
||||
extern PALETTE_INIT( mrjong );
|
||||
extern VIDEO_START( mrjong );
|
||||
extern VIDEO_UPDATE( mrjong );
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( mrjong_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x7fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0x87ff) AM_RAM
|
||||
AM_RANGE(0xa000, 0xa7ff) AM_RAM
|
||||
AM_RANGE(0xe000, 0xe3ff) AM_RAM_WRITE(mrjong_videoram_w) AM_BASE(&mrjong_videoram)
|
||||
AM_RANGE(0xe400, 0xe7ff) AM_RAM_WRITE(mrjong_colorram_w) AM_BASE(&mrjong_colorram)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static WRITE8_HANDLER( io_0x00_w )
|
||||
{
|
||||
mrjong_flipscreen_w(space, 0, ((data & 0x04) > 2));
|
||||
}
|
||||
/*************************************
|
||||
*
|
||||
* Memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static READ8_HANDLER( io_0x03_r )
|
||||
{
|
||||
@ -78,14 +61,34 @@ static READ8_HANDLER( io_0x03_r )
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Address maps
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static ADDRESS_MAP_START( mrjong_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x7fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0x87ff) AM_RAM
|
||||
AM_RANGE(0xa000, 0xa7ff) AM_RAM
|
||||
AM_RANGE(0xe000, 0xe3ff) AM_RAM_WRITE(mrjong_videoram_w) AM_BASE_MEMBER(mrjong_state, videoram)
|
||||
AM_RANGE(0xe400, 0xe7ff) AM_RAM_WRITE(mrjong_colorram_w) AM_BASE_MEMBER(mrjong_state, colorram)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mrjong_io_map, ADDRESS_SPACE_IO, 8 )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE(0x00, 0x00) AM_READ_PORT("P2") AM_WRITE(io_0x00_w)
|
||||
AM_RANGE(0x00, 0x00) AM_READ_PORT("P2") AM_WRITE(mrjong_flipscreen_w)
|
||||
AM_RANGE(0x01, 0x01) AM_READ_PORT("P1") AM_DEVWRITE("sn1", sn76496_w)
|
||||
AM_RANGE(0x02, 0x02) AM_READ_PORT("DSW") AM_DEVWRITE("sn2", sn76496_w)
|
||||
AM_RANGE(0x03, 0x03) AM_READ(io_0x03_r) // Unknown
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Input ports
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static INPUT_PORTS_START( mrjong )
|
||||
PORT_START("P2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
|
||||
@ -133,6 +136,12 @@ static INPUT_PORTS_START( mrjong )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Graphics definitions
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const gfx_layout tilelayout =
|
||||
{
|
||||
8, 8, /* 8*8 characters */
|
||||
@ -163,8 +172,17 @@ static GFXDECODE_START( mrjong )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_DRIVER_START( mrjong )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mrjong_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", Z80,15468000/6) /* 2.578 MHz?? */
|
||||
MDRV_CPU_PROGRAM_MAP(mrjong_map)
|
||||
@ -189,19 +207,19 @@ static MACHINE_DRIVER_START( mrjong )
|
||||
/* sound hardware */
|
||||
MDRV_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MDRV_SOUND_ADD("sn1", SN76489, 15468000/6)
|
||||
MDRV_SOUND_ADD("sn1", SN76489, 15468000/6)
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
|
||||
MDRV_SOUND_ADD("sn2", SN76489, 15468000/6)
|
||||
MDRV_SOUND_ADD("sn2", SN76489, 15468000/6)
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Game driver(s)
|
||||
|
||||
***************************************************************************/
|
||||
/*************************************
|
||||
*
|
||||
* ROM definition(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
ROM_START( mrjong )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* code */
|
||||
@ -251,7 +269,12 @@ ROM_START( blkbustr )
|
||||
ROM_LOAD( "clr.g5", 0x0020, 0x0100, CRC(bcb1e2e3) SHA1(c09731836a9d4e50316a84b86f61b599a1ef944d) )
|
||||
ROM_END
|
||||
|
||||
GAME( 1983, mrjong, 0, mrjong, mrjong, 0, ROT90, "Kiwako", "Mr. Jong (Japan)", 0 )
|
||||
GAME( 1983, crazyblk, mrjong, mrjong, mrjong, 0, ROT90, "Kiwako (ECI license)", "Crazy Blocks", 0 )
|
||||
GAME( 1983, blkbustr, mrjong, mrjong, mrjong, 0, ROT90, "Kiwako (ECI license)", "BlockBuster", 0 )
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
GAME( 1983, mrjong, 0, mrjong, mrjong, 0, ROT90, "Kiwako", "Mr. Jong (Japan)", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1983, crazyblk, mrjong, mrjong, mrjong, 0, ROT90, "Kiwako (ECI license)", "Crazy Blocks", GAME_SUPPORTS_SAVE )
|
||||
GAME( 1983, blkbustr, mrjong, mrjong, mrjong, 0, ROT90, "Kiwako (ECI license)", "BlockBuster", GAME_SUPPORTS_SAVE )
|
||||
|
@ -49,6 +49,7 @@ behavior we use .
|
||||
static WRITE16_HANDLER( mugsmash_reg2_w )
|
||||
{
|
||||
mugsmash_state *state = (mugsmash_state *)space->machine->driver_data;
|
||||
|
||||
state->regs2[offset] = data;
|
||||
//popmessage ("Regs2 %04x, %04x, %04x, %04x", state->regs2[0], state->regs2[1], state->regs2[2], state->regs2[3]);
|
||||
|
||||
@ -56,7 +57,7 @@ static WRITE16_HANDLER( mugsmash_reg2_w )
|
||||
{
|
||||
case 1:
|
||||
soundlatch_w(space, 1, data & 0xff);
|
||||
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE );
|
||||
cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE );
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -173,14 +174,14 @@ static READ16_HANDLER ( mugsmash_input_ports_r )
|
||||
|
||||
static ADDRESS_MAP_START( mugsmash_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||
AM_RANGE(0x000000, 0x07ffff) AM_ROM
|
||||
AM_RANGE(0x080000, 0x080fff) AM_RAM_WRITE(mugsmash_videoram1_w) AM_BASE_MEMBER(mugsmash_state,videoram1)
|
||||
AM_RANGE(0x082000, 0x082fff) AM_RAM_WRITE(mugsmash_videoram2_w) AM_BASE_MEMBER(mugsmash_state,videoram2)
|
||||
AM_RANGE(0x0c0000, 0x0c0007) AM_WRITE(mugsmash_reg_w) AM_BASE_MEMBER(mugsmash_state,regs1) /* video registers*/
|
||||
AM_RANGE(0x080000, 0x080fff) AM_RAM_WRITE(mugsmash_videoram1_w) AM_BASE_MEMBER(mugsmash_state, videoram1)
|
||||
AM_RANGE(0x082000, 0x082fff) AM_RAM_WRITE(mugsmash_videoram2_w) AM_BASE_MEMBER(mugsmash_state, videoram2)
|
||||
AM_RANGE(0x0c0000, 0x0c0007) AM_WRITE(mugsmash_reg_w) AM_BASE_MEMBER(mugsmash_state, regs1) /* video registers*/
|
||||
AM_RANGE(0x100000, 0x1005ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
|
||||
AM_RANGE(0x140000, 0x140007) AM_WRITE(mugsmash_reg2_w) AM_BASE_MEMBER(mugsmash_state,regs2) /* sound + ? */
|
||||
AM_RANGE(0x140000, 0x140007) AM_WRITE(mugsmash_reg2_w) AM_BASE_MEMBER(mugsmash_state, regs2) /* sound + ? */
|
||||
AM_RANGE(0x1c0000, 0x1c3fff) AM_RAM /* main ram? */
|
||||
AM_RANGE(0x1c4000, 0x1cffff) AM_RAM
|
||||
AM_RANGE(0x200000, 0x203fff) AM_RAM AM_BASE_MEMBER(mugsmash_state,spriteram) /* sprite ram */
|
||||
AM_RANGE(0x200000, 0x203fff) AM_RAM AM_BASE_MEMBER(mugsmash_state, spriteram) /* sprite ram */
|
||||
#if USE_FAKE_INPUT_PORTS
|
||||
AM_RANGE(0x180000, 0x180007) AM_READ(mugsmash_input_ports_r)
|
||||
#else
|
||||
@ -390,7 +391,8 @@ GFXDECODE_END
|
||||
|
||||
static void irq_handler(running_device *device, int irq)
|
||||
{
|
||||
cputag_set_input_line(device->machine, "audiocpu", 0 , irq ? ASSERT_LINE : CLEAR_LINE );
|
||||
mugsmash_state *state = (mugsmash_state *)device->machine->driver_data;
|
||||
cpu_set_input_line(state->audiocpu, 0 , irq ? ASSERT_LINE : CLEAR_LINE );
|
||||
}
|
||||
|
||||
static const ym2151_interface ym2151_config =
|
||||
@ -398,6 +400,14 @@ static const ym2151_interface ym2151_config =
|
||||
irq_handler
|
||||
};
|
||||
|
||||
static MACHINE_START( mugsmash )
|
||||
{
|
||||
mugsmash_state *state = (mugsmash_state *)machine->driver_data;
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
state->audiocpu = devtag_get_device(machine, "audiocpu");
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mugsmash )
|
||||
|
||||
MDRV_DRIVER_DATA( mugsmash_state )
|
||||
@ -409,6 +419,8 @@ static MACHINE_DRIVER_START( mugsmash )
|
||||
MDRV_CPU_ADD("audiocpu", Z80, 4000000) /* Guess */
|
||||
MDRV_CPU_PROGRAM_MAP(mugsmash_sound_map)
|
||||
|
||||
MDRV_MACHINE_START(mugsmash)
|
||||
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
||||
@ -462,4 +474,4 @@ ROM_START( mugsmash )
|
||||
ROM_LOAD( "mugs_15.bin", 0x180000, 0x080000, CRC(82e8187c) SHA1(c7a0e1b3d90dbbe2588886a27a07a9c336447ae3) )
|
||||
ROM_END
|
||||
|
||||
GAME( 1990?, mugsmash, 0, mugsmash, mugsmash, 0, ROT0, "Electronic Devices Italy / 3D Games England", "Mug Smashers", 0 )
|
||||
GAME( 1990?, mugsmash, 0, mugsmash, mugsmash, 0, ROT0, "Electronic Devices Italy / 3D Games England", "Mug Smashers", GAME_SUPPORTS_SAVE )
|
||||
|
@ -28,58 +28,62 @@ Stephh's notes (based on the game Z80 code and some tests) :
|
||||
#include "deprecat.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/ay8910.h"
|
||||
|
||||
extern UINT8 *mnchmobl_vreg;
|
||||
extern UINT8 *mnchmobl_status_vram;
|
||||
extern UINT8 *mnchmobl_sprite_xpos;
|
||||
extern UINT8 *mnchmobl_sprite_attr;
|
||||
extern UINT8 *mnchmobl_sprite_tile;
|
||||
|
||||
PALETTE_INIT( mnchmobl );
|
||||
VIDEO_START( mnchmobl );
|
||||
WRITE8_HANDLER( mnchmobl_palette_bank_w );
|
||||
WRITE8_HANDLER( mnchmobl_flipscreen_w );
|
||||
VIDEO_UPDATE( mnchmobl );
|
||||
#include "includes/munchmo.h"
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
static int mnchmobl_nmi_enable = 0;
|
||||
/*************************************
|
||||
*
|
||||
* Memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static WRITE8_HANDLER( mnchmobl_nmi_enable_w )
|
||||
{
|
||||
mnchmobl_nmi_enable = data;
|
||||
munchmo_state *state = (munchmo_state *)space->machine->driver_data;
|
||||
state->nmi_enable = data;
|
||||
}
|
||||
|
||||
static INTERRUPT_GEN( mnchmobl_interrupt )
|
||||
{
|
||||
static int which;
|
||||
which = !which;
|
||||
if( which ) cpu_set_input_line(device, 0, HOLD_LINE);
|
||||
else if( mnchmobl_nmi_enable ) cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
|
||||
munchmo_state *state = (munchmo_state *)device->machine->driver_data;
|
||||
state->which = !state->which;
|
||||
|
||||
if (state->which)
|
||||
cpu_set_input_line(device, 0, HOLD_LINE);
|
||||
else if (state->nmi_enable)
|
||||
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( mnchmobl_soundlatch_w )
|
||||
{
|
||||
soundlatch_w( space, offset, data );
|
||||
cputag_set_input_line(space->machine, "audiocpu", 0, HOLD_LINE );
|
||||
munchmo_state *state = (munchmo_state *)space->machine->driver_data;
|
||||
|
||||
soundlatch_w(space, offset, data);
|
||||
cpu_set_input_line(state->audiocpu, 0, HOLD_LINE );
|
||||
}
|
||||
|
||||
static WRITE8_HANDLER( sound_nmi_ack_w )
|
||||
{
|
||||
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, CLEAR_LINE);
|
||||
munchmo_state *state = (munchmo_state *)space->machine->driver_data;
|
||||
cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Address maps
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static ADDRESS_MAP_START( mnchmobl_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x3fff) AM_ROM
|
||||
AM_RANGE(0x8000, 0x83ff) AM_RAM
|
||||
AM_RANGE(0xa000, 0xa3ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(&mnchmobl_sprite_xpos)
|
||||
AM_RANGE(0xa800, 0xabff) AM_MIRROR(0x0400) AM_RAM AM_BASE(&mnchmobl_sprite_tile)
|
||||
AM_RANGE(0xb000, 0xb3ff) AM_MIRROR(0x0400) AM_RAM AM_BASE(&mnchmobl_sprite_attr)
|
||||
AM_RANGE(0xb800, 0xb8ff) AM_MIRROR(0x0100) AM_RAM AM_BASE_GENERIC(videoram)
|
||||
AM_RANGE(0xa000, 0xa3ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(munchmo_state, sprite_xpos)
|
||||
AM_RANGE(0xa800, 0xabff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(munchmo_state, sprite_tile)
|
||||
AM_RANGE(0xb000, 0xb3ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(munchmo_state, sprite_attr)
|
||||
AM_RANGE(0xb800, 0xb8ff) AM_MIRROR(0x0100) AM_RAM AM_BASE_MEMBER(munchmo_state, videoram)
|
||||
AM_RANGE(0xbaba, 0xbaba) AM_WRITENOP /* ? */
|
||||
AM_RANGE(0xbc00, 0xbc7f) AM_RAM AM_BASE(&mnchmobl_status_vram)
|
||||
AM_RANGE(0xbc00, 0xbc7f) AM_RAM AM_BASE_MEMBER(munchmo_state, status_vram)
|
||||
AM_RANGE(0xbe00, 0xbe00) AM_WRITE(mnchmobl_soundlatch_w)
|
||||
AM_RANGE(0xbe01, 0xbe01) AM_WRITE(mnchmobl_palette_bank_w)
|
||||
AM_RANGE(0xbe02, 0xbe02) AM_READ_PORT("DSW1")
|
||||
@ -89,7 +93,7 @@ static ADDRESS_MAP_START( mnchmobl_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0xbe31, 0xbe31) AM_WRITENOP /* ? */
|
||||
AM_RANGE(0xbe41, 0xbe41) AM_WRITE(mnchmobl_flipscreen_w)
|
||||
AM_RANGE(0xbe61, 0xbe61) AM_WRITE(mnchmobl_nmi_enable_w) /* ENI 1-10C */
|
||||
AM_RANGE(0xbf00, 0xbf07) AM_WRITEONLY AM_BASE(&mnchmobl_vreg) /* MY0 1-8C */
|
||||
AM_RANGE(0xbf00, 0xbf07) AM_WRITEONLY AM_BASE_MEMBER(munchmo_state, vreg) /* MY0 1-8C */
|
||||
AM_RANGE(0xbf01, 0xbf01) AM_READ_PORT("SYSTEM")
|
||||
AM_RANGE(0xbf02, 0xbf02) AM_READ_PORT("P1")
|
||||
AM_RANGE(0xbf03, 0xbf03) AM_READ_PORT("P2")
|
||||
@ -109,6 +113,12 @@ static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Input ports
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static INPUT_PORTS_START( mnchmobl )
|
||||
PORT_START("SYSTEM")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
@ -199,6 +209,12 @@ static INPUT_PORTS_START( mnchmobl )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Yes ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Graphics definitions
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const gfx_layout char_layout =
|
||||
{
|
||||
8,8,
|
||||
@ -268,8 +284,40 @@ static GFXDECODE_START( mnchmobl )
|
||||
GFXDECODE_ENTRY( "gfx4", 0, sprite_layout2, 128, 16 ) /* colors 128-255 */
|
||||
GFXDECODE_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_START( munchmo )
|
||||
{
|
||||
munchmo_state *state = (munchmo_state *)machine->driver_data;
|
||||
|
||||
state->maincpu = devtag_get_device(machine, "maincpu");
|
||||
state->audiocpu = devtag_get_device(machine, "audiocpu");
|
||||
|
||||
state_save_register_global(machine, state->palette_bank);
|
||||
state_save_register_global(machine, state->flipscreen);
|
||||
state_save_register_global(machine, state->nmi_enable);
|
||||
state_save_register_global(machine, state->which);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( munchmo )
|
||||
{
|
||||
munchmo_state *state = (munchmo_state *)machine->driver_data;
|
||||
|
||||
state->palette_bank = 0;
|
||||
state->flipscreen = 0;
|
||||
state->nmi_enable = 0;
|
||||
state->which = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mnchmobl )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(munchmo_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", Z80, XTAL_15MHz/4) /* ? */
|
||||
MDRV_CPU_PROGRAM_MAP(mnchmobl_map)
|
||||
@ -279,6 +327,9 @@ static MACHINE_DRIVER_START( mnchmobl )
|
||||
MDRV_CPU_PROGRAM_MAP(sound_map)
|
||||
MDRV_CPU_VBLANK_INT("screen", nmi_line_assert)
|
||||
|
||||
MDRV_MACHINE_START(munchmo)
|
||||
MDRV_MACHINE_RESET(munchmo)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(57)
|
||||
@ -306,6 +357,12 @@ static MACHINE_DRIVER_START( mnchmobl )
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* ROM definition(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
ROM_START( joyfulr )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for CPUA */
|
||||
ROM_LOAD( "m1j.10e", 0x0000, 0x2000, CRC(1fe86e25) SHA1(e13abc20741dfd8a260f354efda3b3a25c820343) )
|
||||
@ -363,5 +420,11 @@ ROM_START( mnchmobl )
|
||||
ROM_END
|
||||
|
||||
|
||||
GAME( 1983, joyfulr, 0, mnchmobl, mnchmobl, 0, ROT270, "SNK", "Joyful Road (Japan)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL )
|
||||
GAME( 1983, mnchmobl, joyfulr, mnchmobl, mnchmobl, 0, ROT270, "SNK (Centuri license)", "Munch Mobile (US)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL )
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
GAME( 1983, joyfulr, 0, mnchmobl, mnchmobl, 0, ROT270, "SNK", "Joyful Road (Japan)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
|
||||
GAME( 1983, mnchmobl, joyfulr, mnchmobl, mnchmobl, 0, ROT270, "SNK (Centuri license)", "Munch Mobile (US)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE )
|
||||
|
@ -42,36 +42,64 @@ Notes:
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "sound/okim6295.h"
|
||||
|
||||
#define MASTER_CLOCK XTAL_12MHz
|
||||
#define SOUND_CLOCK XTAL_45MHz
|
||||
#define MASTER_CLOCK XTAL_12MHz
|
||||
#define SOUND_CLOCK XTAL_45MHz
|
||||
|
||||
static tilemap_t *bg_tilemap, *mlow_tilemap, *mhigh_tilemap, *tx_tilemap;
|
||||
static UINT16 *bg_videoram, *mlow_videoram, *mhigh_videoram, *tx_videoram, *sprites_buffer;
|
||||
static UINT16 *bg_scrollram, *mlow_scrollram, *mhigh_scrollram, *vidattrram;
|
||||
static UINT16 *mwarr_ram;
|
||||
|
||||
typedef struct _mwarr_state mwarr_state;
|
||||
struct _mwarr_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT16 *bg_videoram, *mlow_videoram, *mhigh_videoram, *tx_videoram, *sprites_buffer;
|
||||
UINT16 *bg_scrollram, *mlow_scrollram, *mhigh_scrollram, *vidattrram;
|
||||
UINT16 *spriteram;
|
||||
// UINT16 *paletteram; // currently this uses generic palette handling
|
||||
UINT16 *mwarr_ram;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *bg_tilemap, *mlow_tilemap, *mhigh_tilemap, *tx_tilemap;
|
||||
|
||||
/* misc */
|
||||
int which;
|
||||
};
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static WRITE16_HANDLER( bg_videoram_w )
|
||||
{
|
||||
COMBINE_DATA(&bg_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(bg_tilemap,offset);
|
||||
mwarr_state *state = (mwarr_state *)space->machine->driver_data;
|
||||
|
||||
COMBINE_DATA(&state->bg_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap,offset);
|
||||
}
|
||||
|
||||
static WRITE16_HANDLER( mlow_videoram_w )
|
||||
{
|
||||
COMBINE_DATA(&mlow_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(mlow_tilemap,offset);
|
||||
mwarr_state *state = (mwarr_state *)space->machine->driver_data;
|
||||
|
||||
COMBINE_DATA(&state->mlow_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(state->mlow_tilemap,offset);
|
||||
}
|
||||
|
||||
static WRITE16_HANDLER( mhigh_videoram_w )
|
||||
{
|
||||
COMBINE_DATA(&mhigh_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(mhigh_tilemap,offset);
|
||||
mwarr_state *state = (mwarr_state *)space->machine->driver_data;
|
||||
|
||||
COMBINE_DATA(&state->mhigh_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(state->mhigh_tilemap,offset);
|
||||
}
|
||||
|
||||
static WRITE16_HANDLER( tx_videoram_w )
|
||||
{
|
||||
COMBINE_DATA(&tx_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(tx_tilemap,offset);
|
||||
mwarr_state *state = (mwarr_state *)space->machine->driver_data;
|
||||
|
||||
COMBINE_DATA(&state->tx_videoram[offset]);
|
||||
tilemap_mark_tile_dirty(state->tx_tilemap,offset);
|
||||
}
|
||||
|
||||
static WRITE16_DEVICE_HANDLER( oki1_bank_w )
|
||||
@ -81,30 +109,30 @@ static WRITE16_DEVICE_HANDLER( oki1_bank_w )
|
||||
|
||||
static WRITE16_HANDLER( sprites_commands_w )
|
||||
{
|
||||
static int which = 0;
|
||||
mwarr_state *state = (mwarr_state *)space->machine->driver_data;
|
||||
|
||||
if( which )
|
||||
if (state->which)
|
||||
{
|
||||
int i;
|
||||
|
||||
switch(data)
|
||||
switch (data)
|
||||
{
|
||||
case 0:
|
||||
/* clear sprites on screen */
|
||||
for( i = 0; i < 0x800; i++)
|
||||
for (i = 0; i < 0x800; i++)
|
||||
{
|
||||
sprites_buffer[i] = 0;
|
||||
state->sprites_buffer[i] = 0;
|
||||
}
|
||||
which = 0;
|
||||
state->which = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("used unknown sprites command %02X\n",data);
|
||||
case 0xf:
|
||||
/* refresh sprites on screen */
|
||||
for( i = 0; i < 0x800; i++)
|
||||
for (i = 0; i < 0x800; i++)
|
||||
{
|
||||
sprites_buffer[i] = space->machine->generic.spriteram.u16[i];
|
||||
state->sprites_buffer[i] = state->spriteram[i];
|
||||
}
|
||||
break;
|
||||
|
||||
@ -114,47 +142,61 @@ static WRITE16_HANDLER( sprites_commands_w )
|
||||
}
|
||||
}
|
||||
|
||||
which ^= 1;
|
||||
state->which ^= 1;
|
||||
}
|
||||
|
||||
static WRITE16_HANDLER( mwarr_brightness_w )
|
||||
{
|
||||
mwarr_state *state = (mwarr_state *)space->machine->driver_data;
|
||||
int i;
|
||||
double brightness;
|
||||
|
||||
COMBINE_DATA(&mwarr_ram[0x14/2]);
|
||||
COMBINE_DATA(&state->mwarr_ram[0x14 / 2]);
|
||||
|
||||
brightness = (double)(data & 0xff);
|
||||
for (i=0;i<0x800;i++)
|
||||
for (i = 0; i < 0x800; i++)
|
||||
{
|
||||
palette_set_pen_contrast(space->machine, i, brightness/255);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Address maps
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static ADDRESS_MAP_START( mwarr_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM
|
||||
AM_RANGE(0x100000, 0x1007ff) AM_RAM_WRITE(bg_videoram_w) AM_BASE(&bg_videoram)
|
||||
AM_RANGE(0x100800, 0x100fff) AM_RAM_WRITE(mlow_videoram_w) AM_BASE(&mlow_videoram)
|
||||
AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(mhigh_videoram_w) AM_BASE(&mhigh_videoram)
|
||||
AM_RANGE(0x101800, 0x1027ff) AM_RAM_WRITE(tx_videoram_w) AM_BASE(&tx_videoram)
|
||||
AM_RANGE(0x103000, 0x1033ff) AM_RAM AM_BASE(&bg_scrollram)
|
||||
AM_RANGE(0x103400, 0x1037ff) AM_RAM AM_BASE(&mlow_scrollram)
|
||||
AM_RANGE(0x103800, 0x103bff) AM_RAM AM_BASE(&mhigh_scrollram)
|
||||
AM_RANGE(0x103c00, 0x103fff) AM_RAM AM_BASE(&vidattrram)
|
||||
AM_RANGE(0x100000, 0x1007ff) AM_RAM_WRITE(bg_videoram_w) AM_BASE_MEMBER(mwarr_state, bg_videoram)
|
||||
AM_RANGE(0x100800, 0x100fff) AM_RAM_WRITE(mlow_videoram_w) AM_BASE_MEMBER(mwarr_state, mlow_videoram)
|
||||
AM_RANGE(0x101000, 0x1017ff) AM_RAM_WRITE(mhigh_videoram_w) AM_BASE_MEMBER(mwarr_state, mhigh_videoram)
|
||||
AM_RANGE(0x101800, 0x1027ff) AM_RAM_WRITE(tx_videoram_w) AM_BASE_MEMBER(mwarr_state, tx_videoram)
|
||||
AM_RANGE(0x103000, 0x1033ff) AM_RAM AM_BASE_MEMBER(mwarr_state, bg_scrollram)
|
||||
AM_RANGE(0x103400, 0x1037ff) AM_RAM AM_BASE_MEMBER(mwarr_state, mlow_scrollram)
|
||||
AM_RANGE(0x103800, 0x103bff) AM_RAM AM_BASE_MEMBER(mwarr_state, mhigh_scrollram)
|
||||
AM_RANGE(0x103c00, 0x103fff) AM_RAM AM_BASE_MEMBER(mwarr_state, vidattrram)
|
||||
AM_RANGE(0x104000, 0x104fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)
|
||||
AM_RANGE(0x108000, 0x108fff) AM_RAM AM_BASE_GENERIC(spriteram)
|
||||
AM_RANGE(0x108000, 0x108fff) AM_RAM AM_BASE_MEMBER(mwarr_state, spriteram)
|
||||
AM_RANGE(0x110000, 0x110001) AM_READ_PORT("P1_P2")
|
||||
AM_RANGE(0x110002, 0x110003) AM_READ_PORT("SYSTEM")
|
||||
AM_RANGE(0x110004, 0x110005) AM_READ_PORT("DSW")
|
||||
AM_RANGE(0x110010, 0x110011) AM_DEVWRITE("oki2", oki1_bank_w)
|
||||
AM_RANGE(0x110014, 0x110015) AM_WRITE(mwarr_brightness_w)
|
||||
AM_RANGE(0x110016, 0x110017) AM_WRITE(sprites_commands_w)
|
||||
AM_RANGE(0x110000, 0x11ffff) AM_RAM AM_BASE(&mwarr_ram)
|
||||
AM_RANGE(0x110000, 0x11ffff) AM_RAM AM_BASE_MEMBER(mwarr_state, mwarr_ram)
|
||||
AM_RANGE(0x180000, 0x180001) AM_DEVREADWRITE8("oki1", okim6295_r, okim6295_w, 0x00ff)
|
||||
AM_RANGE(0x190000, 0x190001) AM_DEVREADWRITE8("oki2", okim6295_r, okim6295_w, 0x00ff)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Input ports
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static INPUT_PORTS_START( mwarr )
|
||||
PORT_START("P1_P2")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
|
||||
@ -229,6 +271,12 @@ static INPUT_PORTS_START( mwarr )
|
||||
PORT_SERVICE_NO_TOGGLE( 0x8000, IP_ACTIVE_LOW )
|
||||
INPUT_PORTS_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Graphics definitions
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static const gfx_layout mwarr_tile8_layout =
|
||||
{
|
||||
8,8,
|
||||
@ -271,75 +319,82 @@ static GFXDECODE_START( mwarr )
|
||||
GFXDECODE_ENTRY( "gfx5", 0, mwarr_tile16_layout, 0, 8 )
|
||||
GFXDECODE_END
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Video emulation
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static TILE_GET_INFO( get_bg_tile_info )
|
||||
{
|
||||
int tileno,colour;
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
int tileno = state->bg_videoram[tile_index] & 0x1fff;
|
||||
int colour = (state->bg_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
tileno = bg_videoram[tile_index] & 0x1fff;
|
||||
colour = (bg_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
SET_TILE_INFO(4,tileno,colour,0);
|
||||
SET_TILE_INFO(4, tileno, colour, 0);
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_mlow_tile_info )
|
||||
{
|
||||
int tileno,colour;
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
int tileno = state->mlow_videoram[tile_index] & 0x1fff;
|
||||
int colour = (state->mlow_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
tileno = mlow_videoram[tile_index] & 0x1fff;
|
||||
colour = (mlow_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
SET_TILE_INFO(3,tileno,colour,0);
|
||||
SET_TILE_INFO(3, tileno, colour, 0);
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_mhigh_tile_info )
|
||||
{
|
||||
int tileno,colour;
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
int tileno = state->mhigh_videoram[tile_index] & 0x1fff;
|
||||
int colour = (state->mhigh_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
tileno = mhigh_videoram[tile_index] & 0x1fff;
|
||||
colour = (mhigh_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
SET_TILE_INFO(2,tileno,colour,0);
|
||||
SET_TILE_INFO(2, tileno, colour, 0);
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_tx_tile_info )
|
||||
{
|
||||
int tileno,colour;
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
int tileno = state->tx_videoram[tile_index] & 0x1fff;
|
||||
int colour = (state->tx_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
tileno = tx_videoram[tile_index] & 0x1fff;
|
||||
colour = (tx_videoram[tile_index] & 0xe000) >> 13;
|
||||
|
||||
SET_TILE_INFO(1,tileno,colour,0);
|
||||
SET_TILE_INFO(1, tileno, colour, 0);
|
||||
}
|
||||
|
||||
static VIDEO_START( mwarr )
|
||||
{
|
||||
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16,64,16);
|
||||
mlow_tilemap = tilemap_create(machine, get_mlow_tile_info, tilemap_scan_cols, 16, 16,64,16);
|
||||
mhigh_tilemap = tilemap_create(machine, get_mhigh_tile_info,tilemap_scan_cols, 16, 16,64,16);
|
||||
tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8,64,32);
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
|
||||
sprites_buffer = auto_alloc_array(machine, UINT16, 0x800);
|
||||
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 64, 16);
|
||||
state->mlow_tilemap = tilemap_create(machine, get_mlow_tile_info, tilemap_scan_cols, 16, 16, 64, 16);
|
||||
state->mhigh_tilemap = tilemap_create(machine, get_mhigh_tile_info, tilemap_scan_cols, 16, 16, 64, 16);
|
||||
state->tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
|
||||
|
||||
tilemap_set_transparent_pen(mlow_tilemap,0);
|
||||
tilemap_set_transparent_pen(mhigh_tilemap,0);
|
||||
tilemap_set_transparent_pen(tx_tilemap,0);
|
||||
state->sprites_buffer = auto_alloc_array(machine, UINT16, 0x800);
|
||||
|
||||
tilemap_set_scroll_rows(bg_tilemap, 256);
|
||||
tilemap_set_scroll_rows(mlow_tilemap, 256);
|
||||
tilemap_set_scroll_rows(mhigh_tilemap, 256);
|
||||
tilemap_set_transparent_pen(state->mlow_tilemap, 0);
|
||||
tilemap_set_transparent_pen(state->mhigh_tilemap, 0);
|
||||
tilemap_set_transparent_pen(state->tx_tilemap, 0);
|
||||
|
||||
tilemap_set_scroll_rows(state->bg_tilemap, 256);
|
||||
tilemap_set_scroll_rows(state->mlow_tilemap, 256);
|
||||
tilemap_set_scroll_rows(state->mhigh_tilemap, 256);
|
||||
|
||||
state_save_register_global_pointer(machine, state->sprites_buffer, 0x800);
|
||||
}
|
||||
|
||||
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
const UINT16 *source = sprites_buffer+0x800-4;
|
||||
const UINT16 *finish = sprites_buffer;
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
const UINT16 *source = state->sprites_buffer + 0x800 - 4;
|
||||
const UINT16 *finish = state->sprites_buffer;
|
||||
const gfx_element *gfx = machine->gfx[0];
|
||||
int x, y, color, flipx, dy, pri, pri_mask, i;
|
||||
|
||||
while( source>=finish )
|
||||
while (source >= finish)
|
||||
{
|
||||
/* draw sprite */
|
||||
if( source[0] & 0x0800 )
|
||||
if (source[0] & 0x0800)
|
||||
{
|
||||
y = 512 - (source[0] & 0x01ff);
|
||||
x = (source[3] & 0x3ff) - 9;
|
||||
@ -347,12 +402,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
|
||||
color = source[1] & 0x000f;
|
||||
flipx = source[1] & 0x0200;
|
||||
|
||||
dy = (source[0] & 0xf000)>>12;
|
||||
dy = (source[0] & 0xf000) >> 12;
|
||||
|
||||
pri = ((source[1] & 0x3c00)>>10); // Priority (1 = Low)
|
||||
pri_mask = ~((1 << (pri+1)) - 1); // Above the first "pri" levels
|
||||
pri = ((source[1] & 0x3c00) >> 10); // Priority (1 = Low)
|
||||
pri_mask = ~((1 << (pri + 1)) - 1); // Above the first "pri" levels
|
||||
|
||||
for(i=0;i<=dy;i++)
|
||||
for (i = 0; i <= dy; i++)
|
||||
{
|
||||
pdrawgfx_transpen( bitmap,
|
||||
cliprect,
|
||||
@ -401,66 +456,93 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
|
||||
|
||||
static VIDEO_UPDATE( mwarr )
|
||||
{
|
||||
mwarr_state *state = (mwarr_state *)screen->machine->driver_data;
|
||||
int i;
|
||||
|
||||
bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
|
||||
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
|
||||
|
||||
if(vidattrram[6] & 1)
|
||||
if (BIT(state->vidattrram[6], 0))
|
||||
{
|
||||
for(i=0;i<256;i++)
|
||||
tilemap_set_scrollx(bg_tilemap, i, bg_scrollram[i]+20);
|
||||
for (i = 0; i < 256; i++)
|
||||
tilemap_set_scrollx(state->bg_tilemap, i, state->bg_scrollram[i] + 20);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(i=0;i<256;i++)
|
||||
tilemap_set_scrollx(bg_tilemap, i, bg_scrollram[0]+19);
|
||||
for (i = 0; i < 256; i++)
|
||||
tilemap_set_scrollx(state->bg_tilemap, i, state->bg_scrollram[0] + 19);
|
||||
}
|
||||
|
||||
if(vidattrram[6] & 4)
|
||||
if (BIT(state->vidattrram[6], 2))
|
||||
{
|
||||
for(i=0;i<256;i++)
|
||||
tilemap_set_scrollx(mlow_tilemap, i, mlow_scrollram[i]+19);
|
||||
for (i = 0; i < 256; i++)
|
||||
tilemap_set_scrollx(state->mlow_tilemap, i, state->mlow_scrollram[i] + 19);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(i=0;i<256;i++)
|
||||
tilemap_set_scrollx(mlow_tilemap, i, mlow_scrollram[0]+19);
|
||||
for (i = 0; i < 256; i++)
|
||||
tilemap_set_scrollx(state->mlow_tilemap, i, state->mlow_scrollram[0] + 19);
|
||||
}
|
||||
|
||||
if(vidattrram[6] & 0x10)
|
||||
if (BIT(state->vidattrram[6], 4))
|
||||
{
|
||||
for(i=0;i<256;i++)
|
||||
tilemap_set_scrollx(mhigh_tilemap, i, mhigh_scrollram[i]+19);
|
||||
for (i = 0; i < 256; i++)
|
||||
tilemap_set_scrollx(state->mhigh_tilemap, i, state->mhigh_scrollram[i] + 19);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(i=0;i<256;i++)
|
||||
tilemap_set_scrollx(mhigh_tilemap, i, mhigh_scrollram[0]+19);
|
||||
for (i = 0; i < 256; i++)
|
||||
tilemap_set_scrollx(state->mhigh_tilemap, i, state->mhigh_scrollram[0] + 19);
|
||||
}
|
||||
|
||||
tilemap_set_scrolly(bg_tilemap, 0, vidattrram[1]+1);
|
||||
tilemap_set_scrolly(mlow_tilemap, 0, vidattrram[2]+1);
|
||||
tilemap_set_scrolly(mhigh_tilemap, 0, vidattrram[3]+1);
|
||||
tilemap_set_scrolly(state->bg_tilemap, 0, state->vidattrram[1] + 1);
|
||||
tilemap_set_scrolly(state->mlow_tilemap, 0, state->vidattrram[2] + 1);
|
||||
tilemap_set_scrolly(state->mhigh_tilemap, 0, state->vidattrram[3] + 1);
|
||||
|
||||
tilemap_set_scrollx(tx_tilemap, 0, vidattrram[0]+16);
|
||||
tilemap_set_scrolly(tx_tilemap, 0, vidattrram[4]+1);
|
||||
tilemap_set_scrollx(state->tx_tilemap, 0, state->vidattrram[0] + 16);
|
||||
tilemap_set_scrolly(state->tx_tilemap, 0, state->vidattrram[4] + 1);
|
||||
|
||||
tilemap_draw(bitmap,cliprect,bg_tilemap, 0,0x01);
|
||||
tilemap_draw(bitmap,cliprect,mlow_tilemap, 0,0x02);
|
||||
tilemap_draw(bitmap,cliprect,mhigh_tilemap,0,0x04);
|
||||
tilemap_draw(bitmap,cliprect,tx_tilemap, 0,0x10);
|
||||
draw_sprites(screen->machine, bitmap,cliprect);
|
||||
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0x01);
|
||||
tilemap_draw(bitmap, cliprect, state->mlow_tilemap, 0, 0x02);
|
||||
tilemap_draw(bitmap, cliprect, state->mhigh_tilemap, 0, 0x04);
|
||||
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0x10);
|
||||
draw_sprites(screen->machine, bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static MACHINE_START( mwarr )
|
||||
{
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
|
||||
state_save_register_global(machine, state->which);
|
||||
}
|
||||
|
||||
static MACHINE_RESET( mwarr )
|
||||
{
|
||||
mwarr_state *state = (mwarr_state *)machine->driver_data;
|
||||
|
||||
state->which = 0;
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( mwarr )
|
||||
|
||||
/* driver data */
|
||||
MDRV_DRIVER_DATA(mwarr_state)
|
||||
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", M68000, MASTER_CLOCK)
|
||||
MDRV_CPU_PROGRAM_MAP(mwarr_map)
|
||||
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold)
|
||||
|
||||
MDRV_GFXDECODE(mwarr)
|
||||
|
||||
MDRV_MACHINE_START(mwarr)
|
||||
MDRV_MACHINE_RESET(mwarr)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(54)
|
||||
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
|
||||
@ -468,11 +550,13 @@ static MACHINE_DRIVER_START( mwarr )
|
||||
MDRV_SCREEN_SIZE(64*8, 32*8)
|
||||
MDRV_SCREEN_VISIBLE_AREA(8+1, 48*8-1-8-1, 0, 30*8-1)
|
||||
|
||||
MDRV_GFXDECODE(mwarr)
|
||||
MDRV_PALETTE_LENGTH(0x800)
|
||||
|
||||
MDRV_VIDEO_START(mwarr)
|
||||
MDRV_VIDEO_UPDATE(mwarr)
|
||||
|
||||
/* sound hardware */
|
||||
MDRV_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MDRV_SOUND_ADD("oki1", OKIM6295, SOUND_CLOCK/48 )
|
||||
@ -485,6 +569,12 @@ static MACHINE_DRIVER_START( mwarr )
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* ROM definition(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
ROM_START( mwarr )
|
||||
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
|
||||
ROM_LOAD16_BYTE( "prg_ev", 0x00000, 0x80000, CRC(d1d5e0a6) SHA1(f47955459d41c904b96de000b32cae156ee3bcba) )
|
||||
@ -545,4 +635,10 @@ ROM_START( mwarr )
|
||||
ROM_COPY( "user1", 0x060000, 0x0e0000, 0x020000)
|
||||
ROM_END
|
||||
|
||||
GAME( 199?, mwarr, 0, mwarr, mwarr, 0, ROT0, "Elettronica Video-Games S.R.L.", "Mighty Warriors", 0 )
|
||||
/*************************************
|
||||
*
|
||||
* Game driver(s)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
GAME( 199?, mwarr, 0, mwarr, mwarr, 0, ROT0, "Elettronica Video-Games S.R.L.", "Mighty Warriors", GAME_SUPPORTS_SAVE )
|
||||
|
@ -1,14 +1,52 @@
|
||||
|
||||
typedef struct _matmania_state matmania_state;
|
||||
struct _matmania_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * videoram;
|
||||
UINT8 * videoram2;
|
||||
UINT8 * videoram3;
|
||||
UINT8 * colorram;
|
||||
UINT8 * colorram2;
|
||||
UINT8 * colorram3;
|
||||
UINT8 * scroll;
|
||||
UINT8 * pageselect;
|
||||
UINT8 * spriteram;
|
||||
UINT8 * paletteram;
|
||||
size_t videoram_size;
|
||||
size_t videoram2_size;
|
||||
size_t videoram3_size;
|
||||
size_t spriteram_size;
|
||||
|
||||
/* video-related */
|
||||
bitmap_t *tmpbitmap;
|
||||
bitmap_t *tmpbitmap2;
|
||||
|
||||
/* mcu */
|
||||
/* maniach 68705 protection */
|
||||
UINT8 port_a_in, port_a_out, ddr_a;
|
||||
UINT8 port_b_in, port_b_out, ddr_b;
|
||||
UINT8 port_c_in, port_c_out, ddr_c;
|
||||
UINT8 from_main, from_mcu;
|
||||
int mcu_sent, main_sent;
|
||||
|
||||
/* devices */
|
||||
running_device *maincpu;
|
||||
running_device *audiocpu;
|
||||
running_device *mcu;
|
||||
};
|
||||
|
||||
/*----------- defined in machine/maniach.c -----------*/
|
||||
|
||||
READ8_HANDLER( maniach_68705_portA_r );
|
||||
WRITE8_HANDLER( maniach_68705_portA_w );
|
||||
READ8_HANDLER( maniach_68705_portB_r );
|
||||
WRITE8_HANDLER( maniach_68705_portB_w );
|
||||
READ8_HANDLER( maniach_68705_portC_r );
|
||||
WRITE8_HANDLER( maniach_68705_portC_w );
|
||||
WRITE8_HANDLER( maniach_68705_ddrA_w );
|
||||
WRITE8_HANDLER( maniach_68705_ddrB_w );
|
||||
WRITE8_HANDLER( maniach_68705_ddrC_w );
|
||||
READ8_HANDLER( maniach_68705_port_a_r );
|
||||
WRITE8_HANDLER( maniach_68705_port_a_w );
|
||||
READ8_HANDLER( maniach_68705_port_b_r );
|
||||
WRITE8_HANDLER( maniach_68705_port_b_w );
|
||||
READ8_HANDLER( maniach_68705_port_c_r );
|
||||
WRITE8_HANDLER( maniach_68705_port_c_w );
|
||||
WRITE8_HANDLER( maniach_68705_ddr_a_w );
|
||||
WRITE8_HANDLER( maniach_68705_ddr_b_w );
|
||||
WRITE8_HANDLER( maniach_68705_ddr_c_w );
|
||||
WRITE8_HANDLER( maniach_mcu_w );
|
||||
READ8_HANDLER( maniach_mcu_r );
|
||||
READ8_HANDLER( maniach_mcu_status_r );
|
||||
@ -16,15 +54,6 @@ READ8_HANDLER( maniach_mcu_status_r );
|
||||
|
||||
/*----------- defined in video/matmania.c -----------*/
|
||||
|
||||
extern UINT8 *matmania_videoram,*matmania_colorram;
|
||||
extern size_t matmania_videoram_size;
|
||||
extern UINT8 *matmania_videoram2,*matmania_colorram2;
|
||||
extern size_t matmania_videoram2_size;
|
||||
extern UINT8 *matmania_videoram3,*matmania_colorram3;
|
||||
extern size_t matmania_videoram3_size;
|
||||
extern UINT8 *matmania_scroll;
|
||||
extern UINT8 *matmania_pageselect;
|
||||
|
||||
WRITE8_HANDLER( matmania_paletteram_w );
|
||||
PALETTE_INIT( matmania );
|
||||
VIDEO_UPDATE( maniach );
|
||||
|
38
src/mame/includes/metlclsh.h
Normal file
38
src/mame/includes/metlclsh.h
Normal file
@ -0,0 +1,38 @@
|
||||
/*************************************************************************
|
||||
|
||||
Metal Clash
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
typedef struct _metlclsh_state metlclsh_state;
|
||||
struct _metlclsh_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * bgram;
|
||||
UINT8 * fgram;
|
||||
UINT8 * scrollx;
|
||||
UINT8 * otherram;
|
||||
// UINT8 * paletteram; // currently this uses generic palette handling
|
||||
// UINT8 * paletteram2; // currently this uses generic palette handling
|
||||
UINT8 * spriteram;
|
||||
size_t spriteram_size;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *bg_tilemap,*fg_tilemap;
|
||||
UINT8 write_mask, gfxbank;
|
||||
|
||||
/* devices */
|
||||
running_device *maincpu;
|
||||
running_device *subcpu;
|
||||
};
|
||||
|
||||
|
||||
/*----------- defined in video/metlclsh.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( metlclsh_bgram_w );
|
||||
WRITE8_HANDLER( metlclsh_fgram_w );
|
||||
WRITE8_HANDLER( metlclsh_gfxbank_w );
|
||||
WRITE8_HANDLER( metlclsh_rambank_w );
|
||||
|
||||
VIDEO_START( metlclsh );
|
||||
VIDEO_UPDATE( metlclsh );
|
@ -1,23 +1,49 @@
|
||||
/*----------- defined in machine/mexico86.c -----------*/
|
||||
|
||||
extern UINT8 *mexico86_protection_ram;
|
||||
typedef struct _mexico86_state mexico86_state;
|
||||
struct _mexico86_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * protection_ram;
|
||||
UINT8 * videoram;
|
||||
UINT8 * objectram;
|
||||
size_t objectram_size;
|
||||
|
||||
/* video-related */
|
||||
int charbank;
|
||||
|
||||
/* mcu */
|
||||
/* mexico86 68705 protection */
|
||||
UINT8 port_a_in, port_a_out, ddr_a;
|
||||
UINT8 port_b_in, port_b_out, ddr_b;
|
||||
int address, latch;
|
||||
/* kikikai mcu simulation */
|
||||
int mcu_running, mcu_initialised;
|
||||
int coin_last;
|
||||
|
||||
/* devices */
|
||||
running_device *maincpu;
|
||||
running_device *audiocpu;
|
||||
running_device *subcpu;
|
||||
running_device *mcu;
|
||||
};
|
||||
|
||||
|
||||
/*----------- defined in machine/mexico86.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mexico86_f008_w );
|
||||
INTERRUPT_GEN( kikikai_interrupt );
|
||||
INTERRUPT_GEN( mexico86_m68705_interrupt );
|
||||
READ8_HANDLER( mexico86_68705_portA_r );
|
||||
WRITE8_HANDLER( mexico86_68705_portA_w );
|
||||
WRITE8_HANDLER( mexico86_68705_ddrA_w );
|
||||
READ8_HANDLER( mexico86_68705_portB_r );
|
||||
WRITE8_HANDLER( mexico86_68705_portB_w );
|
||||
WRITE8_HANDLER( mexico86_68705_ddrB_w );
|
||||
READ8_HANDLER( mexico86_68705_port_a_r );
|
||||
WRITE8_HANDLER( mexico86_68705_port_a_w );
|
||||
WRITE8_HANDLER( mexico86_68705_ddr_a_w );
|
||||
READ8_HANDLER( mexico86_68705_port_b_r );
|
||||
WRITE8_HANDLER( mexico86_68705_port_b_w );
|
||||
WRITE8_HANDLER( mexico86_68705_ddr_b_w );
|
||||
|
||||
|
||||
/*----------- defined in video/mexico86.c -----------*/
|
||||
|
||||
extern UINT8 *mexico86_videoram,*mexico86_objectram;
|
||||
extern size_t mexico86_objectram_size;
|
||||
|
||||
WRITE8_HANDLER( mexico86_bankswitch_w );
|
||||
|
||||
VIDEO_UPDATE( mexico86 );
|
||||
VIDEO_UPDATE( kikikai );
|
||||
|
29
src/mame/includes/mosaic.h
Normal file
29
src/mame/includes/mosaic.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*************************************************************************
|
||||
|
||||
Mosaic
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
typedef struct _mosaic_state mosaic_state;
|
||||
struct _mosaic_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * fgvideoram;
|
||||
UINT8 * bgvideoram;
|
||||
// UINT8 * paletteram; // currently this uses generic palette handling
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *bg_tilemap,*fg_tilemap;
|
||||
|
||||
/* misc */
|
||||
int prot_val;
|
||||
};
|
||||
|
||||
|
||||
/*----------- defined in video/mosaic.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mosaic_fgvideoram_w );
|
||||
WRITE8_HANDLER( mosaic_bgvideoram_w );
|
||||
|
||||
VIDEO_START( mosaic );
|
||||
VIDEO_UPDATE( mosaic );
|
31
src/mame/includes/mouser.h
Normal file
31
src/mame/includes/mouser.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*************************************************************************
|
||||
|
||||
Mouser
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
typedef struct _mouser_state mouser_state;
|
||||
struct _mouser_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * videoram;
|
||||
UINT8 * colorram;
|
||||
UINT8 * spriteram;
|
||||
size_t spriteram_size;
|
||||
|
||||
/* misc */
|
||||
UINT8 sound_byte;
|
||||
UINT8 nmi_enable;
|
||||
|
||||
/* devices */
|
||||
running_device *maincpu;
|
||||
running_device *audiocpu;
|
||||
};
|
||||
|
||||
/*----------- defined in video/mouser.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mouser_flip_screen_x_w );
|
||||
WRITE8_HANDLER( mouser_flip_screen_y_w );
|
||||
|
||||
PALETTE_INIT( mouser );
|
||||
VIDEO_UPDATE( mouser );
|
32
src/mame/includes/mrdo.h
Normal file
32
src/mame/includes/mrdo.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*************************************************************************
|
||||
|
||||
Mr. Do
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
typedef struct _mrdo_state mrdo_state;
|
||||
struct _mrdo_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * bgvideoram;
|
||||
UINT8 * fgvideoram;
|
||||
UINT8 * spriteram;
|
||||
size_t spriteram_size;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *bg_tilemap, *fg_tilemap;
|
||||
int flipscreen;
|
||||
};
|
||||
|
||||
|
||||
/*----------- defined in video/mrdo.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mrdo_bgvideoram_w );
|
||||
WRITE8_HANDLER( mrdo_fgvideoram_w );
|
||||
WRITE8_HANDLER( mrdo_scrollx_w );
|
||||
WRITE8_HANDLER( mrdo_scrolly_w );
|
||||
WRITE8_HANDLER( mrdo_flipscreen_w );
|
||||
|
||||
PALETTE_INIT( mrdo );
|
||||
VIDEO_START( mrdo );
|
||||
VIDEO_UPDATE( mrdo );
|
36
src/mame/includes/mrflea.h
Normal file
36
src/mame/includes/mrflea.h
Normal file
@ -0,0 +1,36 @@
|
||||
/*************************************************************************
|
||||
|
||||
Mr. Flea
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
typedef struct _mrflea_state mrflea_state;
|
||||
struct _mrflea_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * videoram;
|
||||
UINT8 * spriteram;
|
||||
// UINT8 * paletteram; // currently this uses generic palette handling
|
||||
|
||||
/* video-related */
|
||||
int gfx_bank;
|
||||
|
||||
/* misc */
|
||||
int io;
|
||||
int main;
|
||||
int status;
|
||||
int select1;
|
||||
|
||||
/* devices */
|
||||
running_device *maincpu;
|
||||
running_device *subcpu;
|
||||
};
|
||||
|
||||
|
||||
/*----------- defined in video/mrflea.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mrflea_gfx_bank_w );
|
||||
WRITE8_HANDLER( mrflea_videoram_w );
|
||||
WRITE8_HANDLER( mrflea_spriteram_w );
|
||||
|
||||
VIDEO_UPDATE( mrflea );
|
27
src/mame/includes/mrjong.h
Normal file
27
src/mame/includes/mrjong.h
Normal file
@ -0,0 +1,27 @@
|
||||
/*************************************************************************
|
||||
|
||||
Mr. Jong
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
typedef struct _mrjong_state mrjong_state;
|
||||
struct _mrjong_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * videoram;
|
||||
UINT8 * colorram;
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *bg_tilemap;
|
||||
};
|
||||
|
||||
|
||||
/*----------- defined in video/mrjong.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mrjong_videoram_w );
|
||||
WRITE8_HANDLER( mrjong_colorram_w );
|
||||
WRITE8_HANDLER( mrjong_flipscreen_w );
|
||||
|
||||
PALETTE_INIT( mrjong );
|
||||
VIDEO_START( mrjong );
|
||||
VIDEO_UPDATE( mrjong );
|
@ -1,3 +1,4 @@
|
||||
|
||||
typedef struct _mugsmash_state mugsmash_state;
|
||||
struct _mugsmash_state
|
||||
{
|
||||
@ -6,8 +7,12 @@ struct _mugsmash_state
|
||||
UINT16 *spriteram;
|
||||
UINT16 *regs1;
|
||||
UINT16 *regs2;
|
||||
|
||||
tilemap_t *tilemap1;
|
||||
tilemap_t *tilemap2;
|
||||
|
||||
running_device *maincpu;
|
||||
running_device *audiocpu;
|
||||
};
|
||||
|
||||
|
||||
|
40
src/mame/includes/munchmo.h
Normal file
40
src/mame/includes/munchmo.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*************************************************************************
|
||||
|
||||
Munch Mobile
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
typedef struct _munchmo_state munchmo_state;
|
||||
struct _munchmo_state
|
||||
{
|
||||
/* memory pointers */
|
||||
UINT8 * vreg;
|
||||
UINT8 * status_vram;
|
||||
UINT8 * sprite_xpos;
|
||||
UINT8 * sprite_attr;
|
||||
UINT8 * sprite_tile;
|
||||
UINT8 * videoram;
|
||||
|
||||
/* video-related */
|
||||
bitmap_t *tmpbitmap;
|
||||
int palette_bank;
|
||||
int flipscreen;
|
||||
|
||||
/* misc */
|
||||
int nmi_enable;
|
||||
int which;
|
||||
|
||||
/* devices */
|
||||
running_device *maincpu;
|
||||
running_device *audiocpu;
|
||||
};
|
||||
|
||||
|
||||
/*----------- defined in video/munchmo.c -----------*/
|
||||
|
||||
WRITE8_HANDLER( mnchmobl_palette_bank_w );
|
||||
WRITE8_HANDLER( mnchmobl_flipscreen_w );
|
||||
|
||||
PALETTE_INIT( mnchmobl );
|
||||
VIDEO_START( mnchmobl );
|
||||
VIDEO_UPDATE( mnchmobl );
|
@ -11,10 +11,6 @@
|
||||
#include "includes/matmania.h"
|
||||
|
||||
|
||||
static UINT8 from_main,from_mcu;
|
||||
static int mcu_sent = 0,main_sent = 0;
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Mania Challenge 68705 protection interface
|
||||
@ -23,23 +19,26 @@ static int mcu_sent = 0,main_sent = 0;
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static UINT8 portA_in,portA_out,ddrA;
|
||||
|
||||
READ8_HANDLER( maniach_68705_portA_r )
|
||||
READ8_HANDLER( maniach_68705_port_a_r )
|
||||
{
|
||||
//logerror("%04x: 68705 port A read %02x\n",cpu_get_pc(space->cpu),portA_in);
|
||||
return (portA_out & ddrA) | (portA_in & ~ddrA);
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
|
||||
//logerror("%04x: 68705 port A read %02x\n", cpu_get_pc(space->cpu), state->port_a_in);
|
||||
return (state->port_a_out & state->ddr_a) | (state->port_a_in & ~state->ddr_a);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( maniach_68705_portA_w )
|
||||
WRITE8_HANDLER( maniach_68705_port_a_w )
|
||||
{
|
||||
//logerror("%04x: 68705 port A write %02x\n",cpu_get_pc(space->cpu),data);
|
||||
portA_out = data;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
|
||||
//logerror("%04x: 68705 port A write %02x\n", cpu_get_pc(space->cpu), data);
|
||||
state->port_a_out = data;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( maniach_68705_ddrA_w )
|
||||
WRITE8_HANDLER( maniach_68705_ddr_a_w )
|
||||
{
|
||||
ddrA = data;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
state->ddr_a = data;
|
||||
}
|
||||
|
||||
|
||||
@ -53,85 +52,103 @@ WRITE8_HANDLER( maniach_68705_ddrA_w )
|
||||
* 2 W when 0->1, copies port A to the latch for the main CPU
|
||||
*/
|
||||
|
||||
static UINT8 portB_in,portB_out,ddrB;
|
||||
|
||||
READ8_HANDLER( maniach_68705_portB_r )
|
||||
READ8_HANDLER( maniach_68705_port_b_r )
|
||||
{
|
||||
return (portB_out & ddrB) | (portB_in & ~ddrB);
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
return (state->port_b_out & state->ddr_b) | (state->port_b_in & ~state->ddr_b);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( maniach_68705_portB_w )
|
||||
WRITE8_HANDLER( maniach_68705_port_b_w )
|
||||
{
|
||||
//logerror("%04x: 68705 port B write %02x\n",cpu_get_pc(space->cpu),data);
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
|
||||
if ((ddrB & 0x02) && (~data & 0x02) && (portB_out & 0x02))
|
||||
//logerror("%04x: 68705 port B write %02x\n", cpu_get_pc(space->cpu), data);
|
||||
|
||||
if (BIT(state->ddr_b, 1) && BIT(~data, 1) && BIT(state->port_b_out, 1))
|
||||
{
|
||||
portA_in = from_main;
|
||||
main_sent = 0;
|
||||
//logerror("read command %02x from main cpu\n",portA_in);
|
||||
state->port_a_in = state->from_main;
|
||||
state->main_sent = 0;
|
||||
//logerror("read command %02x from main cpu\n", state->port_a_in);
|
||||
}
|
||||
if ((ddrB & 0x04) && (data & 0x04) && (~portB_out & 0x04))
|
||||
if (BIT(state->ddr_b, 2) && BIT(data, 2) && BIT(~state->port_b_out, 2))
|
||||
{
|
||||
//logerror("send command %02x to main cpu\n",portA_out);
|
||||
from_mcu = portA_out;
|
||||
mcu_sent = 1;
|
||||
//logerror("send command %02x to main cpu\n", state->port_a_out);
|
||||
state->from_mcu = state->port_a_out;
|
||||
state->mcu_sent = 1;
|
||||
}
|
||||
|
||||
portB_out = data;
|
||||
state->port_b_out = data;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( maniach_68705_ddrB_w )
|
||||
WRITE8_HANDLER( maniach_68705_ddr_b_w )
|
||||
{
|
||||
ddrB = data;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
state->ddr_b = data;
|
||||
}
|
||||
|
||||
|
||||
static UINT8 portC_in,portC_out,ddrC;
|
||||
|
||||
READ8_HANDLER( maniach_68705_portC_r )
|
||||
READ8_HANDLER( maniach_68705_port_c_r )
|
||||
{
|
||||
portC_in = 0;
|
||||
if (main_sent) portC_in |= 0x01;
|
||||
if (!mcu_sent) portC_in |= 0x02;
|
||||
//logerror("%04x: 68705 port C read %02x\n",cpu_get_pc(space->cpu),portC_in);
|
||||
return (portC_out & ddrC) | (portC_in & ~ddrC);
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
|
||||
state->port_c_in = 0;
|
||||
|
||||
if (state->main_sent)
|
||||
state->port_c_in |= 0x01;
|
||||
|
||||
if (!state->mcu_sent)
|
||||
state->port_c_in |= 0x02;
|
||||
|
||||
//logerror("%04x: 68705 port C read %02x\n",state->cpu_get_pc(space->cpu), state->port_c_in);
|
||||
|
||||
return (state->port_c_out & state->ddr_c) | (state->port_c_in & ~state->ddr_c);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( maniach_68705_portC_w )
|
||||
WRITE8_HANDLER( maniach_68705_port_c_w )
|
||||
{
|
||||
//logerror("%04x: 68705 port C write %02x\n",cpu_get_pc(space->cpu),data);
|
||||
portC_out = data;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
|
||||
//logerror("%04x: 68705 port C write %02x\n", cpu_get_pc(space->cpu), data);
|
||||
state->port_c_out = data;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( maniach_68705_ddrC_w )
|
||||
WRITE8_HANDLER( maniach_68705_ddr_c_w )
|
||||
{
|
||||
ddrC = data;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
state->ddr_c = data;
|
||||
}
|
||||
|
||||
|
||||
WRITE8_HANDLER( maniach_mcu_w )
|
||||
{
|
||||
//logerror("%04x: 3040_w %02x\n",cpu_get_pc(space->cpu),data);
|
||||
from_main = data;
|
||||
main_sent = 1;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
|
||||
//logerror("%04x: 3040_w %02x\n", cpu_get_pc(space->cpu), data);
|
||||
state->from_main = data;
|
||||
state->main_sent = 1;
|
||||
}
|
||||
|
||||
READ8_HANDLER( maniach_mcu_r )
|
||||
{
|
||||
//logerror("%04x: 3040_r %02x\n",cpu_get_pc(space->cpu),from_mcu);
|
||||
mcu_sent = 0;
|
||||
return from_mcu;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
|
||||
//logerror("%04x: 3040_r %02x\n", cpu_get_pc(space->cpu), state->from_mcu);
|
||||
state->mcu_sent = 0;
|
||||
return state->from_mcu;
|
||||
}
|
||||
|
||||
READ8_HANDLER( maniach_mcu_status_r )
|
||||
{
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
int res = 0;
|
||||
|
||||
/* bit 0 = when 0, mcu has sent data to the main cpu */
|
||||
/* bit 1 = when 1, mcu is ready to receive data from main cpu */
|
||||
//logerror("%04x: 3041_r\n",cpu_get_pc(space->cpu));
|
||||
if (!mcu_sent) res |= 0x01;
|
||||
if (!main_sent) res |= 0x02;
|
||||
//logerror("%04x: 3041_r\n", cpu_get_pc(space->cpu));
|
||||
if (!state->mcu_sent)
|
||||
res |= 0x01;
|
||||
if (!state->main_sent)
|
||||
res |= 0x02;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -2,13 +2,6 @@
|
||||
#include "deprecat.h"
|
||||
#include "includes/mexico86.h"
|
||||
|
||||
|
||||
UINT8 *mexico86_protection_ram;
|
||||
|
||||
|
||||
static int kikikai_mcu_running, kikikai_mcu_initialised;
|
||||
|
||||
|
||||
/*
|
||||
$f008 - write
|
||||
bit 7 = ? (unused?)
|
||||
@ -22,18 +15,22 @@ bit 0 = ? (unused?)
|
||||
*/
|
||||
WRITE8_HANDLER( mexico86_f008_w )
|
||||
{
|
||||
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_RESET, (data & 4) ? CLEAR_LINE : ASSERT_LINE);
|
||||
if (devtag_get_device(space->machine, "mcu") != NULL)
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
|
||||
cpu_set_input_line(state->audiocpu, INPUT_LINE_RESET, (data & 4) ? CLEAR_LINE : ASSERT_LINE);
|
||||
|
||||
if (state->mcu != NULL)
|
||||
{
|
||||
// mexico 86, knight boy
|
||||
cputag_set_input_line(space->machine, "mcu", INPUT_LINE_RESET, (data & 2) ? CLEAR_LINE : ASSERT_LINE);
|
||||
cpu_set_input_line(state->mcu, INPUT_LINE_RESET, (data & 2) ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
else
|
||||
{
|
||||
// simulation for KiKi KaiKai
|
||||
kikikai_mcu_running = data & 2;
|
||||
if (!kikikai_mcu_running)
|
||||
kikikai_mcu_initialised = 0;
|
||||
state->mcu_running = data & 2;
|
||||
|
||||
if (!state->mcu_running)
|
||||
state->mcu_initialised = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,67 +44,66 @@ WRITE8_HANDLER( mexico86_f008_w )
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static void mcu_simulate(running_machine *machine)
|
||||
static void mcu_simulate( running_machine *machine )
|
||||
{
|
||||
if (!kikikai_mcu_initialised)
|
||||
mexico86_state *state = (mexico86_state *)machine->driver_data;
|
||||
|
||||
if (!state->mcu_initialised)
|
||||
{
|
||||
if (mexico86_protection_ram[0x01] == 0x00)
|
||||
if (state->protection_ram[0x01] == 0x00)
|
||||
{
|
||||
logerror("initialising MCU\n");
|
||||
mexico86_protection_ram[0x04] = 0xfc; // coin inputs
|
||||
mexico86_protection_ram[0x02] = 0xff; // player 1
|
||||
mexico86_protection_ram[0x03] = 0xff; // player 2
|
||||
mexico86_protection_ram[0x1b] = 0xff; // active player
|
||||
mexico86_protection_ram[0x06] = 0xff; // must be FF otherwise PS4 ERROR
|
||||
mexico86_protection_ram[0x07] = 0x03; // must be 03 otherwise PS4 ERROR
|
||||
mexico86_protection_ram[0x00] = 0x00;
|
||||
kikikai_mcu_initialised = 1;
|
||||
logerror("initialising MCU\n");
|
||||
state->protection_ram[0x04] = 0xfc; // coin inputs
|
||||
state->protection_ram[0x02] = 0xff; // player 1
|
||||
state->protection_ram[0x03] = 0xff; // player 2
|
||||
state->protection_ram[0x1b] = 0xff; // active player
|
||||
state->protection_ram[0x06] = 0xff; // must be FF otherwise PS4 ERROR
|
||||
state->protection_ram[0x07] = 0x03; // must be 03 otherwise PS4 ERROR
|
||||
state->protection_ram[0x00] = 0x00;
|
||||
state->mcu_initialised = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (kikikai_mcu_initialised)
|
||||
if (state->mcu_initialised)
|
||||
{
|
||||
int i;
|
||||
static int coin_last;
|
||||
int coin_curr;
|
||||
|
||||
|
||||
coin_curr = ~input_port_read(machine, "IN0") & 1;
|
||||
if (coin_curr && !coin_last && mexico86_protection_ram[0x01] < 9)
|
||||
if (coin_curr && !state->coin_last && state->protection_ram[0x01] < 9)
|
||||
{
|
||||
mexico86_protection_ram[0x01]++; // increase credits counter
|
||||
mexico86_protection_ram[0x0a] = 0x01; // set flag (coin inserted sound is not played otherwise)
|
||||
state->protection_ram[0x01]++; // increase credits counter
|
||||
state->protection_ram[0x0a] = 0x01; // set flag (coin inserted sound is not played otherwise)
|
||||
}
|
||||
coin_last = coin_curr;
|
||||
state->coin_last = coin_curr;
|
||||
|
||||
mexico86_protection_ram[0x04] = 0x3c; // coin inputs
|
||||
state->protection_ram[0x04] = 0x3c; // coin inputs
|
||||
|
||||
mexico86_protection_ram[0x02] = BITSWAP8(input_port_read(machine, "IN1"), 7,6,5,4,2,3,1,0); // player 1
|
||||
mexico86_protection_ram[0x03] = BITSWAP8(input_port_read(machine, "IN2"), 7,6,5,4,2,3,1,0); // player 2
|
||||
state->protection_ram[0x02] = BITSWAP8(input_port_read(machine, "IN1"), 7,6,5,4,2,3,1,0); // player 1
|
||||
state->protection_ram[0x03] = BITSWAP8(input_port_read(machine, "IN2"), 7,6,5,4,2,3,1,0); // player 2
|
||||
|
||||
if (mexico86_protection_ram[0x19] == 0xaa) // player 2 active
|
||||
mexico86_protection_ram[0x1b] = mexico86_protection_ram[0x03];
|
||||
if (state->protection_ram[0x19] == 0xaa) // player 2 active
|
||||
state->protection_ram[0x1b] = state->protection_ram[0x03];
|
||||
else
|
||||
mexico86_protection_ram[0x1b] = mexico86_protection_ram[0x02];
|
||||
state->protection_ram[0x1b] = state->protection_ram[0x02];
|
||||
|
||||
|
||||
for (i = 0; i < 0x10; i += 2)
|
||||
mexico86_protection_ram[i + 0xb1] = mexico86_protection_ram[i + 0xb0];
|
||||
state->protection_ram[i + 0xb1] = state->protection_ram[i + 0xb0];
|
||||
|
||||
for (i = 0; i < 0x0a; i++)
|
||||
mexico86_protection_ram[i + 0xc0] = mexico86_protection_ram[i + 0x90] + 1;
|
||||
state->protection_ram[i + 0xc0] = state->protection_ram[i + 0x90] + 1;
|
||||
|
||||
if (mexico86_protection_ram[0xd1] == 0xff)
|
||||
if (state->protection_ram[0xd1] == 0xff)
|
||||
{
|
||||
if (mexico86_protection_ram[0xd0] > 0 && mexico86_protection_ram[0xd0] < 4)
|
||||
if (state->protection_ram[0xd0] > 0 && state->protection_ram[0xd0] < 4)
|
||||
{
|
||||
mexico86_protection_ram[0xd2] = 0x81;
|
||||
mexico86_protection_ram[0xd0] = 0xff;
|
||||
state->protection_ram[0xd2] = 0x81;
|
||||
state->protection_ram[0xd0] = 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (mexico86_protection_ram[0xe0] > 0 && mexico86_protection_ram[0xe0] < 4)
|
||||
if (state->protection_ram[0xe0] > 0 && state->protection_ram[0xe0] < 4)
|
||||
{
|
||||
static const UINT8 answers[3][16] =
|
||||
{
|
||||
@ -115,17 +111,17 @@ logerror("initialising MCU\n");
|
||||
{ 0x00,0x04,0x08,0x0C,0x10,0x14,0x18,0x1C,0x20,0x31,0x2B,0x35,0x00,0x00,0x00,0x00 },
|
||||
{ 0x00,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x03,0x0A,0x0B,0x14,0x00,0x00,0x00,0x00 },
|
||||
};
|
||||
int table = mexico86_protection_ram[0xe0] - 1;
|
||||
int table = state->protection_ram[0xe0] - 1;
|
||||
|
||||
for (i = 1; i < 0x10; i++)
|
||||
mexico86_protection_ram[0xe0 + i] = answers[table][i];
|
||||
mexico86_protection_ram[0xe0] = 0xff;
|
||||
state->protection_ram[0xe0 + i] = answers[table][i];
|
||||
state->protection_ram[0xe0] = 0xff;
|
||||
}
|
||||
|
||||
if (mexico86_protection_ram[0xf0] > 0 && mexico86_protection_ram[0xf0] < 4)
|
||||
if (state->protection_ram[0xf0] > 0 && state->protection_ram[0xf0] < 4)
|
||||
{
|
||||
mexico86_protection_ram[0xf1] = 0xb3;
|
||||
mexico86_protection_ram[0xf0] = 0xff;
|
||||
state->protection_ram[0xf1] = 0xb3;
|
||||
state->protection_ram[0xf0] = 0xff;
|
||||
}
|
||||
|
||||
|
||||
@ -133,21 +129,21 @@ logerror("initialising MCU\n");
|
||||
// this should be equivalent to the obfuscated kiki_clogic() below
|
||||
{
|
||||
static const UINT8 db[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x18,0x00,0x00,0x00,0x00};
|
||||
UINT16 sy = mexico86_protection_ram[0xa0] + ((0x18)>>1);
|
||||
UINT16 sx = mexico86_protection_ram[0xa1] + ((0x18)>>1);
|
||||
UINT16 sy = state->protection_ram[0xa0] + ((0x18) >> 1);
|
||||
UINT16 sx = state->protection_ram[0xa1] + ((0x18) >> 1);
|
||||
|
||||
for (i = 0; i < 0x38; i += 8)
|
||||
{
|
||||
UINT8 hw = db[mexico86_protection_ram[0x20 + i] & 0xf];
|
||||
UINT8 hw = db[state->protection_ram[0x20 + i] & 0xf];
|
||||
|
||||
if (hw)
|
||||
{
|
||||
UINT16 xdiff = sx - ((UINT16)mexico86_protection_ram[0x20 + i+6] << 8 | mexico86_protection_ram[0x20 + i+7]);
|
||||
UINT16 xdiff = sx - ((UINT16)state->protection_ram[0x20 + i + 6] << 8 | state->protection_ram[0x20 + i + 7]);
|
||||
if (xdiff < hw)
|
||||
{
|
||||
UINT16 ydiff = sy - ((UINT16)mexico86_protection_ram[0x20 + i+4] << 8 | mexico86_protection_ram[0x20 + i+5]);
|
||||
UINT16 ydiff = sy - ((UINT16)state->protection_ram[0x20 + i + 4] << 8 | state->protection_ram[0x20 + i + 5]);
|
||||
if (ydiff < hw)
|
||||
mexico86_protection_ram[0xa2] = 1; // we have a collision
|
||||
state->protection_ram[0xa2] = 1; // we have a collision
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -158,11 +154,13 @@ logerror("initialising MCU\n");
|
||||
|
||||
INTERRUPT_GEN( kikikai_interrupt )
|
||||
{
|
||||
if (kikikai_mcu_running)
|
||||
mexico86_state *state = (mexico86_state *)device->machine->driver_data;
|
||||
|
||||
if (state->mcu_running)
|
||||
mcu_simulate(device->machine);
|
||||
|
||||
cpu_set_input_line_vector(device,0,mexico86_protection_ram[0]);
|
||||
cpu_set_input_line(device,0,HOLD_LINE);
|
||||
cpu_set_input_line_vector(device, 0, state->protection_ram[0]);
|
||||
cpu_set_input_line(device, 0, HOLD_LINE);
|
||||
}
|
||||
|
||||
|
||||
@ -179,8 +177,9 @@ INTERRUPT_GEN( kikikai_interrupt )
|
||||
#define DCWIDTH 0
|
||||
#define DCHEIGHT 0
|
||||
|
||||
static void kiki_clogic(int address, int latch)
|
||||
static void kiki_clogic(running_machine *machine, int address, int latch)
|
||||
{
|
||||
mexico86_state *state = (mexico86_state *)machine->driver_data;
|
||||
static const UINT8 db[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x18,0x00,0x00,0x00,0x00};
|
||||
static UINT8 queue[64];
|
||||
static int qfront = 0, state = 0;
|
||||
@ -208,7 +207,7 @@ static void kiki_clogic(int address, int latch)
|
||||
diff1 = sy - (short)(queue[(qptr+4)&0x3f]<<8|queue[(qptr+5)&0x3f]) + DCHEIGHT;
|
||||
diff2 = diff1 - (hw + DCHEIGHT);
|
||||
if ((diff1^diff2)<0)
|
||||
mexico86_protection_ram[KIKI_CL_OUT] = 1; // we have a collision
|
||||
state->protection_ram[KIKI_CL_OUT] = 1; // we have a collision
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -229,30 +228,32 @@ INTERRUPT_GEN( mexico86_m68705_interrupt )
|
||||
{
|
||||
/* I don't know how to handle the interrupt line so I just toggle it every time. */
|
||||
if (cpu_getiloops(device) & 1)
|
||||
cpu_set_input_line(device,0,CLEAR_LINE);
|
||||
cpu_set_input_line(device, 0, CLEAR_LINE);
|
||||
else
|
||||
cpu_set_input_line(device,0,ASSERT_LINE);
|
||||
cpu_set_input_line(device, 0, ASSERT_LINE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static UINT8 portA_in,portA_out,ddrA;
|
||||
|
||||
READ8_HANDLER( mexico86_68705_portA_r )
|
||||
READ8_HANDLER( mexico86_68705_port_a_r )
|
||||
{
|
||||
//logerror("%04x: 68705 port A read %02x\n",cpu_get_pc(space->cpu),portA_in);
|
||||
return (portA_out & ddrA) | (portA_in & ~ddrA);
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
|
||||
//logerror("%04x: 68705 port A read %02x\n", cpu_get_pc(space->cpu), state->port_a_in);
|
||||
return (state->port_a_out & state->ddr_a) | (state->port_a_in & ~state->ddr_a);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mexico86_68705_portA_w )
|
||||
WRITE8_HANDLER( mexico86_68705_port_a_w )
|
||||
{
|
||||
//logerror("%04x: 68705 port A write %02x\n",cpu_get_pc(space->cpu),data);
|
||||
portA_out = data;
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
|
||||
//logerror("%04x: 68705 port A write %02x\n", cpu_get_pc(space->cpu), data);
|
||||
state->port_a_out = data;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mexico86_68705_ddrA_w )
|
||||
WRITE8_HANDLER( mexico86_68705_ddr_a_w )
|
||||
{
|
||||
ddrA = data;
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
state->ddr_a = data;
|
||||
}
|
||||
|
||||
|
||||
@ -273,67 +274,71 @@ WRITE8_HANDLER( mexico86_68705_ddrA_w )
|
||||
* 7 W not used?
|
||||
*/
|
||||
|
||||
static UINT8 portB_in,portB_out,ddrB;
|
||||
|
||||
READ8_HANDLER( mexico86_68705_portB_r )
|
||||
READ8_HANDLER( mexico86_68705_port_b_r )
|
||||
{
|
||||
return (portB_out & ddrB) | (portB_in & ~ddrB);
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
return (state->port_b_out & state->ddr_b) | (state->port_b_in & ~state->ddr_b);
|
||||
}
|
||||
|
||||
static int address,latch;
|
||||
|
||||
WRITE8_HANDLER( mexico86_68705_portB_w )
|
||||
WRITE8_HANDLER( mexico86_68705_port_b_w )
|
||||
{
|
||||
//logerror("%04x: 68705 port B write %02x\n",cpu_get_pc(space->cpu),data);
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
//logerror("%04x: 68705 port B write %02x\n", cpu_get_pc(space->cpu), data);
|
||||
|
||||
if ((ddrB & 0x01) && (~data & 0x01) && (portB_out & 0x01))
|
||||
if (BIT(state->ddr_b, 0) && BIT(~data, 0) && BIT(state->port_b_out, 0))
|
||||
{
|
||||
portA_in = latch;
|
||||
state->port_a_in = state->latch;
|
||||
}
|
||||
if ((ddrB & 0x02) && (data & 0x02) && (~portB_out & 0x02)) /* positive edge trigger */
|
||||
|
||||
if (BIT(state->ddr_b, 1) && BIT(data, 1) && BIT(~state->port_b_out, 1)) /* positive edge trigger */
|
||||
{
|
||||
address = portA_out;
|
||||
//if (address >= 0x80) logerror("%04x: 68705 address %02x\n",cpu_get_pc(space->cpu),portA_out);
|
||||
state->address = state->port_a_out;
|
||||
//if (state->address >= 0x80) logerror("%04x: 68705 address %02x\n", cpu_get_pc(space->cpu), state->port_a_out);
|
||||
}
|
||||
if ((ddrB & 0x08) && (~data & 0x08) && (portB_out & 0x08))
|
||||
|
||||
if (BIT(state->ddr_b, 3) && BIT(~data, 3) && BIT(state->port_b_out, 3))
|
||||
{
|
||||
if (data & 0x10) /* read */
|
||||
{
|
||||
if (data & 0x04)
|
||||
{
|
||||
//logerror("%04x: 68705 read %02x from address %04x\n",cpu_get_pc(space->cpu),shared[0x800+address],address);
|
||||
latch = mexico86_protection_ram[address];
|
||||
//logerror("%04x: 68705 read %02x from address %04x\n", cpu_get_pc(space->cpu), state->protection_ram[state->address], state->address);
|
||||
state->latch = state->protection_ram[state->address];
|
||||
}
|
||||
else
|
||||
{
|
||||
//logerror("%04x: 68705 read input port %04x\n",cpu_get_pc(space->cpu),address);
|
||||
latch = input_port_read(space->machine, (address & 1) ? "IN2" : "IN1");
|
||||
//logerror("%04x: 68705 read input port %04x\n", cpu_get_pc(space->cpu), state->address);
|
||||
state->latch = input_port_read(space->machine, (state->address & 1) ? "IN2" : "IN1");
|
||||
}
|
||||
}
|
||||
else /* write */
|
||||
{
|
||||
//logerror("%04x: 68705 write %02x to address %04x\n",cpu_get_pc(space->cpu),portA_out,address);
|
||||
mexico86_protection_ram[address] = portA_out;
|
||||
//logerror("%04x: 68705 write %02x to address %04x\n",cpu_get_pc(space->cpu), port_a_out, state->address);
|
||||
state->protection_ram[state->address] = state->port_a_out;
|
||||
}
|
||||
}
|
||||
if ((ddrB & 0x20) && (data & 0x20) && (~portB_out & 0x20))
|
||||
|
||||
if (BIT(state->ddr_b, 5) && BIT(data, 5) && BIT(~state->port_b_out, 5))
|
||||
{
|
||||
cpu_set_input_line_vector(devtag_get_device(space->machine, "maincpu"), 0, mexico86_protection_ram[0]);
|
||||
cputag_set_input_line(space->machine, "maincpu", 0, HOLD_LINE); //AT: HOLD_LINE works better in Z80 interrupt mode 1.
|
||||
}
|
||||
if ((ddrB & 0x40) && (~data & 0x40) && (portB_out & 0x40))
|
||||
{
|
||||
logerror("%04x: 68705 unknown port B bit %02x\n",cpu_get_pc(space->cpu),data);
|
||||
}
|
||||
if ((ddrB & 0x80) && (~data & 0x80) && (portB_out & 0x80))
|
||||
{
|
||||
logerror("%04x: 68705 unknown port B bit %02x\n",cpu_get_pc(space->cpu),data);
|
||||
cpu_set_input_line_vector(state->maincpu, 0, state->protection_ram[0]);
|
||||
cpu_set_input_line(state->maincpu, 0, HOLD_LINE); //AT: HOLD_LINE works better in Z80 interrupt mode 1.
|
||||
}
|
||||
|
||||
portB_out = data;
|
||||
if (BIT(state->ddr_b, 6) && BIT(~data, 6) && BIT(state->port_b_out, 6))
|
||||
{
|
||||
logerror("%04x: 68705 unknown port B bit %02x\n", cpu_get_pc(space->cpu), data);
|
||||
}
|
||||
|
||||
if (BIT(state->ddr_b, 7) && BIT(~data, 7) && BIT(state->port_b_out, 7))
|
||||
{
|
||||
logerror("%04x: 68705 unknown port B bit %02x\n", cpu_get_pc(space->cpu), data);
|
||||
}
|
||||
|
||||
state->port_b_out = data;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mexico86_68705_ddrB_w )
|
||||
WRITE8_HANDLER( mexico86_68705_ddr_b_w )
|
||||
{
|
||||
ddrB = data;
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
state->ddr_b = data;
|
||||
}
|
||||
|
@ -16,19 +16,6 @@
|
||||
#include "includes/matmania.h"
|
||||
|
||||
|
||||
|
||||
UINT8 *matmania_videoram,*matmania_colorram;
|
||||
size_t matmania_videoram_size;
|
||||
UINT8 *matmania_videoram2,*matmania_colorram2;
|
||||
size_t matmania_videoram2_size;
|
||||
UINT8 *matmania_videoram3,*matmania_colorram3;
|
||||
size_t matmania_videoram3_size;
|
||||
UINT8 *matmania_scroll;
|
||||
static bitmap_t *tmpbitmap;
|
||||
static bitmap_t *tmpbitmap2;
|
||||
|
||||
UINT8 *matmania_pageselect;
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs into a more useable format.
|
||||
@ -58,25 +45,24 @@ PALETTE_INIT( matmania )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0;i < 64;i++)
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
int bit0,bit1,bit2,bit3,r,g,b;
|
||||
int bit0, bit1, bit2, bit3, r, g, b;
|
||||
|
||||
|
||||
bit0 = (color_prom[0] >> 0) & 0x01;
|
||||
bit1 = (color_prom[0] >> 1) & 0x01;
|
||||
bit2 = (color_prom[0] >> 2) & 0x01;
|
||||
bit3 = (color_prom[0] >> 3) & 0x01;
|
||||
bit0 = BIT(color_prom[0], 0);
|
||||
bit1 = BIT(color_prom[0], 1);
|
||||
bit2 = BIT(color_prom[0], 2);
|
||||
bit3 = BIT(color_prom[0], 3);
|
||||
r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
|
||||
bit0 = (color_prom[0] >> 4) & 0x01;
|
||||
bit1 = (color_prom[0] >> 5) & 0x01;
|
||||
bit2 = (color_prom[0] >> 6) & 0x01;
|
||||
bit3 = (color_prom[0] >> 7) & 0x01;
|
||||
bit0 = BIT(color_prom[0], 4);
|
||||
bit1 = BIT(color_prom[0], 5);
|
||||
bit2 = BIT(color_prom[0], 6);
|
||||
bit3 = BIT(color_prom[0], 7);
|
||||
g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
|
||||
bit0 = (color_prom[64] >> 0) & 0x01;
|
||||
bit1 = (color_prom[64] >> 1) & 0x01;
|
||||
bit2 = (color_prom[64] >> 2) & 0x01;
|
||||
bit3 = (color_prom[64] >> 3) & 0x01;
|
||||
bit0 = BIT(color_prom[64], 0);
|
||||
bit1 = BIT(color_prom[64], 1);
|
||||
bit2 = BIT(color_prom[64], 2);
|
||||
bit3 = BIT(color_prom[64], 3);
|
||||
b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
|
||||
|
||||
palette_set_color(machine,i,MAKE_RGB(r,g,b));
|
||||
@ -88,33 +74,33 @@ PALETTE_INIT( matmania )
|
||||
|
||||
WRITE8_HANDLER( matmania_paletteram_w )
|
||||
{
|
||||
int bit0,bit1,bit2,bit3,val;
|
||||
int r,g,b;
|
||||
matmania_state *state = (matmania_state *)space->machine->driver_data;
|
||||
int bit0, bit1, bit2, bit3, val;
|
||||
int r, g, b;
|
||||
int offs2;
|
||||
|
||||
|
||||
space->machine->generic.paletteram.u8[offset] = data;
|
||||
state->paletteram[offset] = data;
|
||||
offs2 = offset & 0x0f;
|
||||
|
||||
val = space->machine->generic.paletteram.u8[offs2];
|
||||
bit0 = (val >> 0) & 0x01;
|
||||
bit1 = (val >> 1) & 0x01;
|
||||
bit2 = (val >> 2) & 0x01;
|
||||
bit3 = (val >> 3) & 0x01;
|
||||
val = state->paletteram[offs2];
|
||||
bit0 = BIT(val, 0);
|
||||
bit1 = BIT(val, 1);
|
||||
bit2 = BIT(val, 2);
|
||||
bit3 = BIT(val, 3);
|
||||
r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
|
||||
|
||||
val = space->machine->generic.paletteram.u8[offs2 | 0x10];
|
||||
bit0 = (val >> 0) & 0x01;
|
||||
bit1 = (val >> 1) & 0x01;
|
||||
bit2 = (val >> 2) & 0x01;
|
||||
bit3 = (val >> 3) & 0x01;
|
||||
val = state->paletteram[offs2 | 0x10];
|
||||
bit0 = BIT(val, 0);
|
||||
bit1 = BIT(val, 1);
|
||||
bit2 = BIT(val, 2);
|
||||
bit3 = BIT(val, 3);
|
||||
g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
|
||||
|
||||
val = space->machine->generic.paletteram.u8[offs2 | 0x20];
|
||||
bit0 = (val >> 0) & 0x01;
|
||||
bit1 = (val >> 1) & 0x01;
|
||||
bit2 = (val >> 2) & 0x01;
|
||||
bit3 = (val >> 3) & 0x01;
|
||||
val = state->paletteram[offs2 | 0x20];
|
||||
bit0 = BIT(val, 0);
|
||||
bit1 = BIT(val, 1);
|
||||
bit2 = BIT(val, 2);
|
||||
bit3 = BIT(val, 3);
|
||||
b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
|
||||
|
||||
palette_set_color(space->machine,offs2 + 64,MAKE_RGB(r,g,b));
|
||||
@ -126,97 +112,87 @@ WRITE8_HANDLER( matmania_paletteram_w )
|
||||
Start the video hardware emulation.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
VIDEO_START( matmania )
|
||||
{
|
||||
matmania_state *state = (matmania_state *)machine->driver_data;
|
||||
int width = video_screen_get_width(machine->primary_screen);
|
||||
int height = video_screen_get_height(machine->primary_screen);
|
||||
bitmap_format format = video_screen_get_format(machine->primary_screen);
|
||||
|
||||
/* Mat Mania has a virtual screen twice as large as the visible screen */
|
||||
tmpbitmap = auto_bitmap_alloc(machine, width, 2*height, format);
|
||||
tmpbitmap2 = auto_bitmap_alloc(machine, width, 2*height, format);
|
||||
state->tmpbitmap = auto_bitmap_alloc(machine, width, 2 * height, format);
|
||||
state->tmpbitmap2 = auto_bitmap_alloc(machine, width, 2 * height, format);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VIDEO_UPDATE( matmania )
|
||||
{
|
||||
UINT8 *spriteram = screen->machine->generic.spriteram.u8;
|
||||
matmania_state *state = (matmania_state *)screen->machine->driver_data;
|
||||
UINT8 *spriteram = state->spriteram;
|
||||
int offs;
|
||||
|
||||
|
||||
/* Update the tiles in the left tile ram bank */
|
||||
for (offs = matmania_videoram_size - 1;offs >= 0;offs--)
|
||||
for (offs = state->videoram_size - 1; offs >= 0; offs--)
|
||||
{
|
||||
int sx,sy;
|
||||
int sx = 15 - offs / 32;
|
||||
int sy = offs % 32;
|
||||
|
||||
|
||||
sx = 15 - offs / 32;
|
||||
sy = offs % 32;
|
||||
|
||||
drawgfx_opaque(tmpbitmap,0,screen->machine->gfx[1],
|
||||
matmania_videoram[offs] + ((matmania_colorram[offs] & 0x08) << 5),
|
||||
(matmania_colorram[offs] & 0x30) >> 4,
|
||||
drawgfx_opaque(state->tmpbitmap, 0, screen->machine->gfx[1],
|
||||
state->videoram[offs] + ((state->colorram[offs] & 0x08) << 5),
|
||||
(state->colorram[offs] & 0x30) >> 4,
|
||||
0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */
|
||||
16*sx,16*sy);
|
||||
16 * sx, 16 * sy);
|
||||
}
|
||||
|
||||
/* Update the tiles in the right tile ram bank */
|
||||
for (offs = matmania_videoram3_size - 1;offs >= 0;offs--)
|
||||
for (offs = state->videoram3_size - 1; offs >= 0; offs--)
|
||||
{
|
||||
int sx,sy;
|
||||
int sx = 15 - offs / 32;
|
||||
int sy = offs % 32;
|
||||
|
||||
|
||||
sx = 15 - offs / 32;
|
||||
sy = offs % 32;
|
||||
|
||||
drawgfx_opaque(tmpbitmap2,0,screen->machine->gfx[1],
|
||||
matmania_videoram3[offs] + ((matmania_colorram3[offs] & 0x08) << 5),
|
||||
(matmania_colorram3[offs] & 0x30) >> 4,
|
||||
drawgfx_opaque(state->tmpbitmap2, 0, screen->machine->gfx[1],
|
||||
state->videoram3[offs] + ((state->colorram3[offs] & 0x08) << 5),
|
||||
(state->colorram3[offs] & 0x30) >> 4,
|
||||
0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */
|
||||
16*sx,16*sy);
|
||||
}
|
||||
|
||||
|
||||
/* copy the temporary bitmap to the screen */
|
||||
{
|
||||
int scrolly;
|
||||
|
||||
|
||||
scrolly = -*matmania_scroll;
|
||||
if (matmania_pageselect[0]&0x01) // maniach sets 0x20 sometimes, which must have a different meaning
|
||||
copyscrollbitmap(bitmap,tmpbitmap2,0,0,1,&scrolly,cliprect);
|
||||
int scrolly = -*state->scroll;
|
||||
if (state->pageselect[0] & 0x01) // maniach sets 0x20 sometimes, which must have a different meaning
|
||||
copyscrollbitmap(bitmap, state->tmpbitmap2, 0, 0, 1, &scrolly, cliprect);
|
||||
else
|
||||
copyscrollbitmap(bitmap,tmpbitmap,0,0,1,&scrolly,cliprect);
|
||||
copyscrollbitmap(bitmap, state->tmpbitmap, 0, 0, 1, &scrolly, cliprect);
|
||||
}
|
||||
|
||||
|
||||
/* Draw the sprites */
|
||||
for (offs = 0;offs < screen->machine->generic.spriteram_size;offs += 4)
|
||||
for (offs = 0; offs < state->spriteram_size; offs += 4)
|
||||
{
|
||||
if (spriteram[offs] & 0x01)
|
||||
{
|
||||
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[2],
|
||||
spriteram[offs+1] + ((spriteram[offs] & 0xf0) << 4),
|
||||
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[2],
|
||||
spriteram[offs + 1] + ((spriteram[offs] & 0xf0) << 4),
|
||||
(spriteram[offs] & 0x08) >> 3,
|
||||
spriteram[offs] & 0x04,spriteram[offs] & 0x02,
|
||||
239 - spriteram[offs+3],(240 - spriteram[offs+2]) & 0xff,0);
|
||||
spriteram[offs] & 0x04, spriteram[offs] & 0x02,
|
||||
239 - spriteram[offs + 3],(240 - spriteram[offs + 2]) & 0xff,0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* draw the frontmost playfield. They are characters, but draw them as sprites */
|
||||
for (offs = matmania_videoram2_size - 1;offs >= 0;offs--)
|
||||
for (offs = state->videoram2_size - 1; offs >= 0; offs--)
|
||||
{
|
||||
int sx,sy;
|
||||
|
||||
|
||||
sx = 31 - offs / 32;
|
||||
sy = offs % 32;
|
||||
int sx = 31 - offs / 32;
|
||||
int sy = offs % 32;
|
||||
|
||||
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[0],
|
||||
matmania_videoram2[offs] + 256 * (matmania_colorram2[offs] & 0x07),
|
||||
(matmania_colorram2[offs] & 0x30) >> 4,
|
||||
state->videoram2[offs] + 256 * (state->colorram2[offs] & 0x07),
|
||||
(state->colorram2[offs] & 0x30) >> 4,
|
||||
0,0,
|
||||
8*sx,8*sy,0);
|
||||
}
|
||||
@ -225,38 +201,33 @@ VIDEO_UPDATE( matmania )
|
||||
|
||||
VIDEO_UPDATE( maniach )
|
||||
{
|
||||
UINT8 *spriteram = screen->machine->generic.spriteram.u8;
|
||||
matmania_state *state = (matmania_state *)screen->machine->driver_data;
|
||||
UINT8 *spriteram = state->spriteram;
|
||||
int offs;
|
||||
|
||||
|
||||
/* Update the tiles in the left tile ram bank */
|
||||
for (offs = matmania_videoram_size - 1;offs >= 0;offs--)
|
||||
for (offs = state->videoram_size - 1; offs >= 0; offs--)
|
||||
{
|
||||
int sx,sy;
|
||||
int sx = 15 - offs / 32;
|
||||
int sy = offs % 32;
|
||||
|
||||
|
||||
sx = 15 - offs / 32;
|
||||
sy = offs % 32;
|
||||
|
||||
drawgfx_opaque(tmpbitmap,0,screen->machine->gfx[1],
|
||||
matmania_videoram[offs] + ((matmania_colorram[offs] & 0x03) << 8),
|
||||
(matmania_colorram[offs] & 0x30) >> 4,
|
||||
drawgfx_opaque(state->tmpbitmap, 0, screen->machine->gfx[1],
|
||||
state->videoram[offs] + ((state->colorram[offs] & 0x03) << 8),
|
||||
(state->colorram[offs] & 0x30) >> 4,
|
||||
0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */
|
||||
16*sx,16*sy);
|
||||
}
|
||||
|
||||
/* Update the tiles in the right tile ram bank */
|
||||
for (offs = matmania_videoram3_size - 1;offs >= 0;offs--)
|
||||
for (offs = state->videoram3_size - 1; offs >= 0; offs--)
|
||||
{
|
||||
int sx,sy;
|
||||
int sx = 15 - offs / 32;
|
||||
int sy = offs % 32;
|
||||
|
||||
|
||||
sx = 15 - offs / 32;
|
||||
sy = offs % 32;
|
||||
|
||||
drawgfx_opaque(tmpbitmap2,0,screen->machine->gfx[1],
|
||||
matmania_videoram3[offs] + ((matmania_colorram3[offs] & 0x03) << 8),
|
||||
(matmania_colorram3[offs] & 0x30) >> 4,
|
||||
drawgfx_opaque(state->tmpbitmap2, 0, screen->machine->gfx[1],
|
||||
state->videoram3[offs] + ((state->colorram3[offs] & 0x03) << 8),
|
||||
(state->colorram3[offs] & 0x30) >> 4,
|
||||
0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */
|
||||
16*sx,16*sy);
|
||||
}
|
||||
@ -264,20 +235,17 @@ VIDEO_UPDATE( maniach )
|
||||
|
||||
/* copy the temporary bitmap to the screen */
|
||||
{
|
||||
int scrolly;
|
||||
int scrolly = -*state->scroll;
|
||||
|
||||
|
||||
scrolly = -*matmania_scroll;
|
||||
|
||||
if (matmania_pageselect[0]&0x01) // this sets 0x20 sometimes, which must have a different meaning
|
||||
copyscrollbitmap(bitmap,tmpbitmap2,0,0,1,&scrolly,cliprect);
|
||||
if (state->pageselect[0] & 0x01) // this sets 0x20 sometimes, which must have a different meaning
|
||||
copyscrollbitmap(bitmap, state->tmpbitmap2, 0, 0, 1, &scrolly, cliprect);
|
||||
else
|
||||
copyscrollbitmap(bitmap,tmpbitmap,0,0,1,&scrolly,cliprect);
|
||||
copyscrollbitmap(bitmap, state->tmpbitmap, 0, 0, 1, &scrolly, cliprect);
|
||||
}
|
||||
|
||||
|
||||
/* Draw the sprites */
|
||||
for (offs = 0;offs < screen->machine->generic.spriteram_size;offs += 4)
|
||||
for (offs = 0; offs < state->spriteram_size; offs += 4)
|
||||
{
|
||||
if (spriteram[offs] & 0x01)
|
||||
{
|
||||
@ -291,17 +259,14 @@ VIDEO_UPDATE( maniach )
|
||||
|
||||
|
||||
/* draw the frontmost playfield. They are characters, but draw them as sprites */
|
||||
for (offs = matmania_videoram2_size - 1;offs >= 0;offs--)
|
||||
for (offs = state->videoram2_size - 1; offs >= 0; offs--)
|
||||
{
|
||||
int sx,sy;
|
||||
|
||||
|
||||
sx = 31 - offs / 32;
|
||||
sy = offs % 32;
|
||||
int sx = 31 - offs / 32;
|
||||
int sy = offs % 32;
|
||||
|
||||
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[0],
|
||||
matmania_videoram2[offs] + 256 * (matmania_colorram2[offs] & 0x07),
|
||||
(matmania_colorram2[offs] & 0x30) >> 4,
|
||||
state->videoram2[offs] + 256 * (state->colorram2[offs] & 0x07),
|
||||
(state->colorram2[offs] & 0x30) >> 4,
|
||||
0,0,
|
||||
8*sx,8*sy,0);
|
||||
}
|
||||
|
@ -19,40 +19,33 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "includes/metlclsh.h"
|
||||
|
||||
/* Local variables: */
|
||||
|
||||
static tilemap_t *bg_tilemap,*fg_tilemap;
|
||||
|
||||
static UINT8 metlclsh_write_mask, *metlclsh_otherram;
|
||||
|
||||
/* Variables that driver has access to: */
|
||||
|
||||
UINT8 *metlclsh_bgram, *metlclsh_fgram, *metlclsh_scrollx;
|
||||
|
||||
/* Functions that driver has access to: */
|
||||
|
||||
WRITE8_HANDLER( metlclsh_rambank_w )
|
||||
{
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
|
||||
if (data & 1)
|
||||
{
|
||||
metlclsh_write_mask = 0;
|
||||
memory_set_bankptr(space->machine, "bank1", metlclsh_bgram);
|
||||
state->write_mask = 0;
|
||||
memory_set_bankptr(space->machine, "bank1", state->bgram);
|
||||
}
|
||||
else
|
||||
{
|
||||
metlclsh_write_mask = 1 << (data >> 1);
|
||||
memory_set_bankptr(space->machine, "bank1", metlclsh_otherram);
|
||||
state->write_mask = 1 << (data >> 1);
|
||||
memory_set_bankptr(space->machine, "bank1", state->otherram);
|
||||
}
|
||||
}
|
||||
|
||||
static UINT8 metlclsh_gfxbank;
|
||||
WRITE8_HANDLER( metlclsh_gfxbank_w )
|
||||
{
|
||||
if (!(data & 4) && (metlclsh_gfxbank != data))
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
|
||||
if (!(data & 4) && (state->gfxbank != data))
|
||||
{
|
||||
tilemap_mark_all_tiles_dirty(bg_tilemap);
|
||||
metlclsh_gfxbank = data & 3;
|
||||
tilemap_mark_all_tiles_dirty(state->bg_tilemap);
|
||||
state->gfxbank = data & 3;
|
||||
}
|
||||
}
|
||||
|
||||
@ -80,14 +73,17 @@ static TILEMAP_MAPPER( metlclsh_bgtilemap_scan )
|
||||
|
||||
static TILE_GET_INFO( get_bg_tile_info )
|
||||
{
|
||||
SET_TILE_INFO(1, metlclsh_bgram[tile_index] + (metlclsh_gfxbank << 7),0,0);
|
||||
metlclsh_state *state = (metlclsh_state *)machine->driver_data;
|
||||
SET_TILE_INFO(1, state->bgram[tile_index] + (state->gfxbank << 7), 0, 0);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( metlclsh_bgram_w )
|
||||
{
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
|
||||
/* This ram is banked: it's either the tilemap (e401 = 1)
|
||||
or bit n of another area (e401 = n << 1)? (that I don't understand) */
|
||||
if (metlclsh_write_mask)
|
||||
if (state->write_mask)
|
||||
{
|
||||
/* unknown area - the following is almost surely wrong */
|
||||
// 405b (e401 = e c a 8 6 4 2 0) writes d400++
|
||||
@ -95,14 +91,14 @@ WRITE8_HANDLER( metlclsh_bgram_w )
|
||||
// 4085 (e401 = e a 6 2) writes d000++
|
||||
// 405b (e401 = e a 6 2) writes d000++
|
||||
|
||||
// metlclsh_otherram[offset] |= (data & metlclsh_write_mask);
|
||||
metlclsh_otherram[offset] = (metlclsh_otherram[offset] & ~metlclsh_write_mask) | (data & metlclsh_write_mask);
|
||||
// state->otherram[offset] |= (data & state->write_mask);
|
||||
state->otherram[offset] = (state->otherram[offset] & ~state->write_mask) | (data & state->write_mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* tilemap */
|
||||
metlclsh_bgram[offset] = data;
|
||||
tilemap_mark_tile_dirty(bg_tilemap,offset & 0x1ff);
|
||||
state->bgram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap,offset & 0x1ff);
|
||||
}
|
||||
}
|
||||
|
||||
@ -121,16 +117,18 @@ WRITE8_HANDLER( metlclsh_bgram_w )
|
||||
|
||||
static TILE_GET_INFO( get_fg_tile_info )
|
||||
{
|
||||
UINT8 code = metlclsh_fgram[tile_index + 0x000];
|
||||
UINT8 attr = metlclsh_fgram[tile_index + 0x400];
|
||||
metlclsh_state *state = (metlclsh_state *)machine->driver_data;
|
||||
UINT8 code = state->fgram[tile_index + 0x000];
|
||||
UINT8 attr = state->fgram[tile_index + 0x400];
|
||||
SET_TILE_INFO(2, code + ((attr & 0x03) << 8), (attr >> 5) & 3, 0);
|
||||
tileinfo->category = ((attr & 0x80) ? 1 : 2);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( metlclsh_fgram_w )
|
||||
{
|
||||
metlclsh_fgram[offset] = data;
|
||||
tilemap_mark_tile_dirty(fg_tilemap,offset & 0x3ff);
|
||||
metlclsh_state *state = (metlclsh_state *)space->machine->driver_data;
|
||||
state->fgram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->fg_tilemap, offset & 0x3ff);
|
||||
}
|
||||
|
||||
|
||||
@ -142,13 +140,17 @@ WRITE8_HANDLER( metlclsh_fgram_w )
|
||||
|
||||
VIDEO_START( metlclsh )
|
||||
{
|
||||
metlclsh_otherram = auto_alloc_array(machine, UINT8, 0x800); // banked ram
|
||||
metlclsh_state *state = (metlclsh_state *)machine->driver_data;
|
||||
|
||||
bg_tilemap = tilemap_create(machine, get_bg_tile_info,metlclsh_bgtilemap_scan,16,16,32,16);
|
||||
fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32,32);
|
||||
state->otherram = auto_alloc_array(machine, UINT8, 0x800); // banked ram
|
||||
|
||||
tilemap_set_transparent_pen( bg_tilemap, 0 );
|
||||
tilemap_set_transparent_pen( fg_tilemap, 0 );
|
||||
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, metlclsh_bgtilemap_scan, 16, 16, 32, 16);
|
||||
state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
|
||||
|
||||
tilemap_set_transparent_pen(state->bg_tilemap, 0);
|
||||
tilemap_set_transparent_pen(state->fg_tilemap, 0);
|
||||
|
||||
state_save_register_global_pointer(machine, state->otherram, 0x800);
|
||||
}
|
||||
|
||||
|
||||
@ -172,38 +174,42 @@ VIDEO_START( metlclsh )
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect)
|
||||
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
UINT8 *spriteram = machine->generic.spriteram.u8;
|
||||
metlclsh_state *state = (metlclsh_state *)machine->driver_data;
|
||||
UINT8 *spriteram = state->spriteram;
|
||||
gfx_element *gfx = machine->gfx[0];
|
||||
int offs;
|
||||
|
||||
for (offs = 0;offs < machine->generic.spriteram_size; offs += 4)
|
||||
for (offs = 0; offs < state->spriteram_size; offs += 4)
|
||||
{
|
||||
int attr,code,color,sx,sy,flipx,flipy,wrapy,sizey;
|
||||
int attr, code, color, sx, sy, flipx, flipy, wrapy, sizey;
|
||||
|
||||
attr = spriteram[offs];
|
||||
if (!(attr & 0x01)) continue; // enable
|
||||
attr = spriteram[offs];
|
||||
if (!(attr & 0x01))
|
||||
continue; // enable
|
||||
|
||||
flipy = (attr & 0x02);
|
||||
flipx = (attr & 0x04);
|
||||
color = (attr & 0x08) >> 3;
|
||||
sizey = (attr & 0x10); // double height
|
||||
code = ((attr & 0x60) << 3) + spriteram[offs+1];
|
||||
flipy = (attr & 0x02);
|
||||
flipx = (attr & 0x04);
|
||||
color = (attr & 0x08) >> 3;
|
||||
sizey = (attr & 0x10); // double height
|
||||
code = ((attr & 0x60) << 3) + spriteram[offs + 1];
|
||||
|
||||
sx = 240 - spriteram[offs+3];
|
||||
if (sx < -7) sx += 256;
|
||||
sy = 240 - spriteram[offs+2];
|
||||
sx = 240 - spriteram[offs + 3];
|
||||
if (sx < -7)
|
||||
sx += 256;
|
||||
|
||||
sy = 240 - spriteram[offs + 2];
|
||||
|
||||
if (flip_screen_get(machine))
|
||||
{
|
||||
sx = 240 - sx; flipx = !flipx;
|
||||
sy = 240 - sy; flipy = !flipy; if (sizey) sy+=16;
|
||||
sy = 240 - sy; flipy = !flipy; if (sizey) sy += 16;
|
||||
if (sy > 240) sy -= 256;
|
||||
}
|
||||
|
||||
/* Draw twice, at sy and sy + 256 (wrap around) */
|
||||
for ( wrapy = 0; wrapy <= 256; wrapy += 256 )
|
||||
for (wrapy = 0; wrapy <= 256; wrapy += 256)
|
||||
{
|
||||
if (sizey)
|
||||
{
|
||||
@ -238,20 +244,23 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
|
||||
|
||||
VIDEO_UPDATE( metlclsh )
|
||||
{
|
||||
bitmap_fill(bitmap,cliprect,0x10);
|
||||
metlclsh_state *state = (metlclsh_state *)screen->machine->driver_data;
|
||||
|
||||
tilemap_draw(bitmap,cliprect,fg_tilemap,1,0); // low priority tiles of foreground
|
||||
if (metlclsh_scrollx[0] & 0x08) // background (if enabled)
|
||||
bitmap_fill(bitmap, cliprect, 0x10);
|
||||
|
||||
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 1, 0); // low priority tiles of foreground
|
||||
|
||||
if (state->scrollx[0] & 0x08) // background (if enabled)
|
||||
{
|
||||
/* The background seems to be always flipped along x */
|
||||
tilemap_set_flip(bg_tilemap, (flip_screen_get(screen->machine) ? (TILEMAP_FLIPX|TILEMAP_FLIPY) : 0) ^ TILEMAP_FLIPX);
|
||||
tilemap_set_scrollx(bg_tilemap, 0,metlclsh_scrollx[1] + ((metlclsh_scrollx[0]&0x02)<<7) );
|
||||
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
|
||||
tilemap_set_flip(state->bg_tilemap, (flip_screen_get(screen->machine) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0) ^ TILEMAP_FLIPX);
|
||||
tilemap_set_scrollx(state->bg_tilemap, 0, state->scrollx[1] + ((state->scrollx[0] & 0x02) << 7) );
|
||||
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
|
||||
}
|
||||
draw_sprites(screen->machine,bitmap,cliprect); // sprites
|
||||
tilemap_draw(bitmap,cliprect,fg_tilemap,2,0); // high priority tiles of foreground
|
||||
draw_sprites(screen->machine, bitmap, cliprect); // sprites
|
||||
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 2, 0); // high priority tiles of foreground
|
||||
|
||||
// popmessage("%02X",metlclsh_scrollx[0]);
|
||||
// popmessage("%02X", state->scrollx[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,58 +1,57 @@
|
||||
#include "emu.h"
|
||||
#include "includes/mexico86.h"
|
||||
|
||||
UINT8 *mexico86_videoram,*mexico86_objectram;
|
||||
size_t mexico86_objectram_size;
|
||||
static int charbank;
|
||||
|
||||
|
||||
|
||||
WRITE8_HANDLER( mexico86_bankswitch_w )
|
||||
{
|
||||
UINT8 *RAM = memory_region(space->machine, "maincpu");
|
||||
mexico86_state *state = (mexico86_state *)space->machine->driver_data;
|
||||
|
||||
if ((data & 7) > 5)
|
||||
popmessage( "Switching to invalid bank!" );
|
||||
popmessage("Switching to invalid bank!");
|
||||
|
||||
memory_set_bankptr(space->machine, "bank1", &RAM[0x10000 + 0x4000 * (data & 0x07)]);
|
||||
memory_set_bank(space->machine, "bank1", data & 0x07);
|
||||
|
||||
charbank = (data & 0x20) >> 5;
|
||||
state->charbank = BIT(data, 5);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VIDEO_UPDATE( mexico86 )
|
||||
{
|
||||
mexico86_state *state = (mexico86_state *)screen->machine->driver_data;
|
||||
int offs;
|
||||
int sx,sy,xc,yc;
|
||||
int gfx_num,gfx_attr,gfx_offs;
|
||||
int sx, sy, xc, yc;
|
||||
int gfx_num, gfx_attr, gfx_offs;
|
||||
|
||||
|
||||
/* Bubble Bobble doesn't have a real video RAM. All graphics (characters */
|
||||
/* and sprites) are stored in the same memory region, and information on */
|
||||
/* the background character columns is stored inthe area dd00-dd3f */
|
||||
|
||||
bitmap_fill(bitmap,cliprect,255);
|
||||
bitmap_fill(bitmap, cliprect, 255);
|
||||
|
||||
sx = 0;
|
||||
/* the score display seems to be outside of the main objectram. */
|
||||
for (offs = 0;offs < mexico86_objectram_size+0x200;offs += 4)
|
||||
|
||||
/* the score display seems to be outside of the main objectram. */
|
||||
for (offs = 0; offs < state->objectram_size + 0x200; offs += 4)
|
||||
{
|
||||
int height;
|
||||
|
||||
if (offs >= mexico86_objectram_size && offs < mexico86_objectram_size+0x180) continue;
|
||||
if (offs >= mexico86_objectram_size+0x1c0) continue;
|
||||
if (offs >= state->objectram_size && offs < state->objectram_size + 0x180)
|
||||
continue;
|
||||
|
||||
if (offs >= state->objectram_size + 0x1c0)
|
||||
continue;
|
||||
|
||||
/* skip empty sprites */
|
||||
/* this is dword aligned so the UINT32 * cast shouldn't give problems */
|
||||
/* on any architecture */
|
||||
if (*(UINT32 *)(&mexico86_objectram[offs]) == 0)
|
||||
if (*(UINT32 *)(&state->objectram[offs]) == 0)
|
||||
continue;
|
||||
|
||||
gfx_num = mexico86_objectram[offs + 1];
|
||||
gfx_attr = mexico86_objectram[offs + 3];
|
||||
gfx_num = state->objectram[offs + 1];
|
||||
gfx_attr = state->objectram[offs + 3];
|
||||
|
||||
if ((gfx_num & 0x80) == 0) /* 16x16 sprites */
|
||||
if (!BIT(gfx_num, 7)) /* 16x16 sprites */
|
||||
{
|
||||
gfx_offs = ((gfx_num & 0x1f) * 0x80) + ((gfx_num & 0x60) >> 1) + 12;
|
||||
height = 2;
|
||||
@ -67,24 +66,25 @@ if (offs >= mexico86_objectram_size+0x1c0) continue;
|
||||
sx += 16;
|
||||
else
|
||||
{
|
||||
sx = mexico86_objectram[offs + 2];
|
||||
// if (gfx_attr & 0x40) sx -= 256;
|
||||
sx = state->objectram[offs + 2];
|
||||
//if (gfx_attr & 0x40) sx -= 256;
|
||||
}
|
||||
sy = 256 - height*8 - (mexico86_objectram[offs + 0]);
|
||||
sy = 256 - height * 8 - (state->objectram[offs + 0]);
|
||||
|
||||
for (xc = 0;xc < 2;xc++)
|
||||
for (xc = 0; xc < 2; xc++)
|
||||
{
|
||||
for (yc = 0;yc < height;yc++)
|
||||
for (yc = 0; yc < height; yc++)
|
||||
{
|
||||
int goffs,code,color,flipx,flipy,x,y;
|
||||
int goffs, code, color, flipx, flipy, x, y;
|
||||
|
||||
goffs = gfx_offs + xc * 0x40 + yc * 0x02;
|
||||
code = mexico86_videoram[goffs] + ((mexico86_videoram[goffs + 1] & 0x07) << 8)
|
||||
+ ((mexico86_videoram[goffs + 1] & 0x80) << 4) + (charbank << 12);
|
||||
color = ((mexico86_videoram[goffs + 1] & 0x38) >> 3) + ((gfx_attr & 0x02) << 2);
|
||||
flipx = mexico86_videoram[goffs + 1] & 0x40;
|
||||
code = state->videoram[goffs] + ((state->videoram[goffs + 1] & 0x07) << 8)
|
||||
+ ((state->videoram[goffs + 1] & 0x80) << 4) + (state->charbank << 12);
|
||||
color = ((state->videoram[goffs + 1] & 0x38) >> 3) + ((gfx_attr & 0x02) << 2);
|
||||
flipx = state->videoram[goffs + 1] & 0x40;
|
||||
flipy = 0;
|
||||
// x = sx + xc * 8;
|
||||
|
||||
//x = sx + xc * 8;
|
||||
x = (sx + xc * 8) & 0xff;
|
||||
y = (sy + yc * 8) & 0xff;
|
||||
|
||||
@ -101,23 +101,25 @@ if (offs >= mexico86_objectram_size+0x1c0) continue;
|
||||
|
||||
VIDEO_UPDATE( kikikai )
|
||||
{
|
||||
mexico86_state *state = (mexico86_state *)screen->machine->driver_data;
|
||||
int offs;
|
||||
int sx,sy,yc;
|
||||
int gfx_num,gfx_attr,gfx_offs;
|
||||
int sx, sy, yc;
|
||||
int gfx_num, gfx_attr, gfx_offs;
|
||||
int height;
|
||||
int goffs,code,color,y;
|
||||
int goffs, code, color, y;
|
||||
int tx, ty;
|
||||
|
||||
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
|
||||
sx = 0;
|
||||
for (offs=0; offs<mexico86_objectram_size; offs+=4)
|
||||
for (offs = 0; offs < state->objectram_size; offs += 4)
|
||||
{
|
||||
if (*(UINT32*)(mexico86_objectram + offs) == 0) continue;
|
||||
if (*(UINT32*)(state->objectram + offs) == 0)
|
||||
continue;
|
||||
|
||||
ty = mexico86_objectram[offs];
|
||||
gfx_num = mexico86_objectram[offs + 1];
|
||||
tx = mexico86_objectram[offs + 2];
|
||||
gfx_attr = mexico86_objectram[offs + 3];
|
||||
ty = state->objectram[offs];
|
||||
gfx_num = state->objectram[offs + 1];
|
||||
tx = state->objectram[offs + 2];
|
||||
gfx_attr = state->objectram[offs + 3];
|
||||
|
||||
if (gfx_num & 0x80)
|
||||
{
|
||||
@ -133,15 +135,16 @@ VIDEO_UPDATE( kikikai )
|
||||
height = 2;
|
||||
sx = tx;
|
||||
}
|
||||
|
||||
sy = 256 - (height << 3) - ty;
|
||||
|
||||
height <<= 1;
|
||||
for (yc=0; yc<height; yc+=2)
|
||||
for (yc = 0; yc < height; yc += 2)
|
||||
{
|
||||
y = (sy + (yc << 2)) & 0xff;
|
||||
goffs = gfx_offs + yc;
|
||||
code = mexico86_videoram[goffs] + ((mexico86_videoram[goffs + 1] & 0x1f) << 8);
|
||||
color = (mexico86_videoram[goffs + 1] & 0xe0) >> 5;
|
||||
code = state->videoram[goffs] + ((state->videoram[goffs + 1] & 0x1f) << 8);
|
||||
color = (state->videoram[goffs + 1] & 0xe0) >> 5;
|
||||
goffs += 0x40;
|
||||
|
||||
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[0],
|
||||
@ -150,8 +153,8 @@ VIDEO_UPDATE( kikikai )
|
||||
0,0,
|
||||
sx&0xff,y,15);
|
||||
|
||||
code = mexico86_videoram[goffs] + ((mexico86_videoram[goffs + 1] & 0x1f) << 8);
|
||||
color = (mexico86_videoram[goffs + 1] & 0xe0) >> 5;
|
||||
code = state->videoram[goffs] + ((state->videoram[goffs + 1] & 0x1f) << 8);
|
||||
color = (state->videoram[goffs + 1] & 0xe0) >> 5;
|
||||
|
||||
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[0],
|
||||
code,
|
||||
|
@ -7,14 +7,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
|
||||
UINT8 *mosaic_fgvideoram;
|
||||
UINT8 *mosaic_bgvideoram;
|
||||
|
||||
static tilemap_t *bg_tilemap,*fg_tilemap;
|
||||
|
||||
|
||||
#include "includes/mosaic.h"
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -24,20 +17,22 @@ static tilemap_t *bg_tilemap,*fg_tilemap;
|
||||
|
||||
static TILE_GET_INFO( get_fg_tile_info )
|
||||
{
|
||||
mosaic_state *state = (mosaic_state *)machine->driver_data;
|
||||
tile_index *= 2;
|
||||
SET_TILE_INFO(
|
||||
0,
|
||||
mosaic_fgvideoram[tile_index] + (mosaic_fgvideoram[tile_index+1] << 8),
|
||||
state->fgvideoram[tile_index] + (state->fgvideoram[tile_index+1] << 8),
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_bg_tile_info )
|
||||
{
|
||||
mosaic_state *state = (mosaic_state *)machine->driver_data;
|
||||
tile_index *= 2;
|
||||
SET_TILE_INFO(
|
||||
1,
|
||||
mosaic_bgvideoram[tile_index] + (mosaic_bgvideoram[tile_index+1] << 8),
|
||||
state->bgvideoram[tile_index] + (state->bgvideoram[tile_index+1] << 8),
|
||||
0,
|
||||
0);
|
||||
}
|
||||
@ -52,10 +47,12 @@ static TILE_GET_INFO( get_bg_tile_info )
|
||||
|
||||
VIDEO_START( mosaic )
|
||||
{
|
||||
fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,64,32);
|
||||
bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows, 8,8,64,32);
|
||||
mosaic_state *state = (mosaic_state *)machine->driver_data;
|
||||
|
||||
tilemap_set_transparent_pen(fg_tilemap,0xff);
|
||||
state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
|
||||
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
|
||||
|
||||
tilemap_set_transparent_pen(state->fg_tilemap, 0xff);
|
||||
}
|
||||
|
||||
|
||||
@ -67,21 +64,27 @@ VIDEO_START( mosaic )
|
||||
|
||||
WRITE8_HANDLER( mosaic_fgvideoram_w )
|
||||
{
|
||||
mosaic_fgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(fg_tilemap,offset/2);
|
||||
mosaic_state *state = (mosaic_state *)space->machine->driver_data;
|
||||
|
||||
state->fgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->fg_tilemap, offset / 2);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mosaic_bgvideoram_w )
|
||||
{
|
||||
mosaic_bgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(bg_tilemap,offset/2);
|
||||
mosaic_state *state = (mosaic_state *)space->machine->driver_data;
|
||||
|
||||
state->bgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VIDEO_UPDATE( mosaic )
|
||||
{
|
||||
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
|
||||
tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
|
||||
mosaic_state *state = (mosaic_state *)screen->machine->driver_data;
|
||||
|
||||
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
|
||||
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
@ -14,31 +14,29 @@
|
||||
*******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
UINT8 *mouser_videoram;
|
||||
UINT8 *mouser_colorram;
|
||||
#include "includes/mouser.h"
|
||||
|
||||
PALETTE_INIT( mouser )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0;i < machine->config->total_colors;i++)
|
||||
for (i = 0; i < machine->config->total_colors; i++)
|
||||
{
|
||||
int bit0,bit1,bit2,r,g,b;
|
||||
int bit0, bit1, bit2, r, g, b;
|
||||
|
||||
/* red component */
|
||||
bit0 = BIT(*color_prom,0);
|
||||
bit1 = BIT(*color_prom,1);
|
||||
bit2 = BIT(*color_prom,2);
|
||||
bit0 = BIT(*color_prom, 0);
|
||||
bit1 = BIT(*color_prom, 1);
|
||||
bit2 = BIT(*color_prom, 2);
|
||||
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
/* green component */
|
||||
bit0 = BIT(*color_prom,3);
|
||||
bit1 = BIT(*color_prom,4);
|
||||
bit2 = BIT(*color_prom,5);
|
||||
bit0 = BIT(*color_prom, 3);
|
||||
bit1 = BIT(*color_prom, 4);
|
||||
bit2 = BIT(*color_prom, 5);
|
||||
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
/* blue component */
|
||||
bit0 = BIT(*color_prom,6);
|
||||
bit1 = BIT(*color_prom,7);
|
||||
bit0 = BIT(*color_prom, 6);
|
||||
bit1 = BIT(*color_prom, 7);
|
||||
b = 0x4f * bit0 + 0xa8 * bit1;
|
||||
|
||||
palette_set_color(machine,i,MAKE_RGB(r,g,b));
|
||||
@ -58,10 +56,11 @@ WRITE8_HANDLER( mouser_flip_screen_y_w )
|
||||
|
||||
VIDEO_UPDATE( mouser )
|
||||
{
|
||||
UINT8 *spriteram = screen->machine->generic.spriteram.u8;
|
||||
mouser_state *state = (mouser_state *)screen->machine->driver_data;
|
||||
UINT8 *spriteram = state->spriteram;
|
||||
int offs;
|
||||
int sx,sy;
|
||||
int flipx,flipy;
|
||||
int sx, sy;
|
||||
int flipx, flipy;
|
||||
|
||||
/* for every character in the Video RAM */
|
||||
for (offs = 0x3ff; offs >= 0; offs--)
|
||||
@ -89,11 +88,11 @@ VIDEO_UPDATE( mouser )
|
||||
/* Ideally we would merge these on a pixel-by-pixel basis, but it's ok to do this char-by-char, */
|
||||
/* Since it's only for the MOUSER logo and it looks fine */
|
||||
/* Note: this is _not_ dependant on flipping */
|
||||
color_offs = offs%32 + ((256 + 8*(offs/32) - spriteram[offs%32])%256)/8*32;
|
||||
color_offs = offs % 32 + ((256 + 8 * (offs / 32) - spriteram[offs % 32] )% 256) / 8 * 32;
|
||||
|
||||
drawgfx_opaque(bitmap,cliprect,screen->machine->gfx[0],
|
||||
mouser_videoram[offs] | (mouser_colorram[color_offs]>>5)*256 | ((mouser_colorram[color_offs]>>4)&1)*512,
|
||||
mouser_colorram[color_offs]%16,
|
||||
state->videoram[offs] | (state->colorram[color_offs] >> 5) * 256 | ((state->colorram[color_offs] >> 4) & 1) * 512,
|
||||
state->colorram[color_offs]%16,
|
||||
flip_screen_x_get(screen->machine),flip_screen_y_get(screen->machine),
|
||||
8*sx,scrolled_y_position);
|
||||
}
|
||||
@ -103,11 +102,11 @@ VIDEO_UPDATE( mouser )
|
||||
/* This is the first set of 7 sprites */
|
||||
for(offs = 0x0084; offs < 0x00A0; offs += 4)
|
||||
{
|
||||
sx = spriteram[offs+3];
|
||||
sy = 0xef-spriteram[offs+2];
|
||||
sx = spriteram[offs + 3];
|
||||
sy = 0xef - spriteram[offs + 2];
|
||||
|
||||
flipx = (spriteram[offs]&0x40)>>6;
|
||||
flipy = (spriteram[offs]&0x80)>>7;
|
||||
flipx = BIT(spriteram[offs], 6);
|
||||
flipy = BIT(spriteram[offs], 7);
|
||||
|
||||
if (flip_screen_x_get(screen->machine))
|
||||
{
|
||||
@ -121,7 +120,7 @@ VIDEO_UPDATE( mouser )
|
||||
sy = 238 - sy;
|
||||
}
|
||||
|
||||
if ((spriteram[offs+1]&0x10)>>4)
|
||||
if (BIT(spriteram[offs + 1], 4))
|
||||
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[1+((spriteram[offs+1]&0x20)>>5)],
|
||||
spriteram[offs]&0x3f,
|
||||
spriteram[offs+1]%16,
|
||||
@ -130,13 +129,13 @@ VIDEO_UPDATE( mouser )
|
||||
}
|
||||
|
||||
/* This is the second set of 8 sprites */
|
||||
for(offs = 0x00C4; offs < 0x00E4; offs += 4)
|
||||
for(offs = 0x00C4; offs < 0x00e4; offs += 4)
|
||||
{
|
||||
sx = spriteram[offs+3];
|
||||
sy = 0xef-spriteram[offs+2];
|
||||
sx = spriteram[offs + 3];
|
||||
sy = 0xef - spriteram[offs + 2];
|
||||
|
||||
flipx = (spriteram[offs]&0x40)>>6;
|
||||
flipy = (spriteram[offs]&0x80)>>7;
|
||||
flipx = BIT(spriteram[offs], 6);
|
||||
flipy = BIT(spriteram[offs], 7);
|
||||
|
||||
if (flip_screen_x_get(screen->machine))
|
||||
{
|
||||
@ -150,7 +149,7 @@ VIDEO_UPDATE( mouser )
|
||||
sy = 238 - sy;
|
||||
}
|
||||
|
||||
if ((spriteram[offs+1]&0x10)>>4)
|
||||
if (BIT(spriteram[offs + 1], 4))
|
||||
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[1+((spriteram[offs+1]&0x20)>>5)],
|
||||
spriteram[offs]&0x3f,
|
||||
spriteram[offs+1]%16,
|
||||
|
@ -7,12 +7,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
|
||||
UINT8 *mrdo_bgvideoram,*mrdo_fgvideoram;
|
||||
static tilemap_t *bg_tilemap,*fg_tilemap;
|
||||
static int flipscreen;
|
||||
|
||||
#include "includes/mrdo.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
@ -46,6 +41,7 @@ static int flipscreen;
|
||||
200 ohm pulldown on all three components
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
PALETTE_INIT( mrdo )
|
||||
{
|
||||
int i;
|
||||
@ -138,20 +134,22 @@ PALETTE_INIT( mrdo )
|
||||
|
||||
static TILE_GET_INFO( get_bg_tile_info )
|
||||
{
|
||||
UINT8 attr = mrdo_bgvideoram[tile_index];
|
||||
mrdo_state *state = (mrdo_state *)machine->driver_data;
|
||||
UINT8 attr = state->bgvideoram[tile_index];
|
||||
SET_TILE_INFO(
|
||||
1,
|
||||
mrdo_bgvideoram[tile_index+0x400] + ((attr & 0x80) << 1),
|
||||
state->bgvideoram[tile_index + 0x400] + ((attr & 0x80) << 1),
|
||||
attr & 0x3f,
|
||||
(attr & 0x40) ? TILE_FORCE_LAYER0 : 0);
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_fg_tile_info )
|
||||
{
|
||||
UINT8 attr = mrdo_fgvideoram[tile_index];
|
||||
mrdo_state *state = (mrdo_state *)machine->driver_data;
|
||||
UINT8 attr = state->fgvideoram[tile_index];
|
||||
SET_TILE_INFO(
|
||||
0,
|
||||
mrdo_fgvideoram[tile_index+0x400] + ((attr & 0x80) << 1),
|
||||
state->fgvideoram[tile_index+0x400] + ((attr & 0x80) << 1),
|
||||
attr & 0x3f,
|
||||
(attr & 0x40) ? TILE_FORCE_LAYER0 : 0);
|
||||
}
|
||||
@ -166,18 +164,22 @@ static TILE_GET_INFO( get_fg_tile_info )
|
||||
|
||||
VIDEO_START( mrdo )
|
||||
{
|
||||
bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,32,32);
|
||||
fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32,32);
|
||||
mrdo_state *state = (mrdo_state *)machine->driver_data;
|
||||
|
||||
tilemap_set_transparent_pen(bg_tilemap,0);
|
||||
tilemap_set_transparent_pen(fg_tilemap,0);
|
||||
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,32,32);
|
||||
state->fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32,32);
|
||||
|
||||
tilemap_set_scrolldx(bg_tilemap, 0, 56);
|
||||
tilemap_set_scrolldx(fg_tilemap, 0, 56);
|
||||
tilemap_set_scrolldy(bg_tilemap, 0, 6);
|
||||
tilemap_set_scrolldy(fg_tilemap, 0, 6);
|
||||
tilemap_set_transparent_pen(state->bg_tilemap,0);
|
||||
tilemap_set_transparent_pen(state->fg_tilemap,0);
|
||||
|
||||
state_save_register_global(machine, flipscreen);
|
||||
tilemap_set_scrolldx(state->bg_tilemap, 0, 56);
|
||||
tilemap_set_scrolldx(state->fg_tilemap, 0, 56);
|
||||
tilemap_set_scrolldy(state->bg_tilemap, 0, 6);
|
||||
tilemap_set_scrolldy(state->fg_tilemap, 0, 6);
|
||||
|
||||
state->flipscreen = 0;
|
||||
|
||||
state_save_register_global(machine, state->flipscreen);
|
||||
}
|
||||
|
||||
|
||||
@ -190,38 +192,46 @@ VIDEO_START( mrdo )
|
||||
|
||||
WRITE8_HANDLER( mrdo_bgvideoram_w )
|
||||
{
|
||||
mrdo_bgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(bg_tilemap,offset & 0x3ff);
|
||||
mrdo_state *state = (mrdo_state *)space->machine->driver_data;
|
||||
state->bgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap, offset & 0x3ff);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mrdo_fgvideoram_w )
|
||||
{
|
||||
mrdo_fgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(fg_tilemap,offset & 0x3ff);
|
||||
mrdo_state *state = (mrdo_state *)space->machine->driver_data;
|
||||
state->fgvideoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->fg_tilemap, offset & 0x3ff);
|
||||
}
|
||||
|
||||
|
||||
WRITE8_HANDLER( mrdo_scrollx_w )
|
||||
{
|
||||
tilemap_set_scrollx(bg_tilemap,0,data);
|
||||
mrdo_state *state = (mrdo_state *)space->machine->driver_data;
|
||||
tilemap_set_scrollx(state->bg_tilemap, 0, data);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mrdo_scrolly_w )
|
||||
{
|
||||
/* This is NOT affected by flipscreen (so stop it happening) */
|
||||
mrdo_state *state = (mrdo_state *)space->machine->driver_data;
|
||||
|
||||
if (flipscreen) tilemap_set_scrolly(bg_tilemap,0,((256-data) & 0xff));
|
||||
else tilemap_set_scrolly(bg_tilemap,0,data);
|
||||
/* This is NOT affected by flipscreen (so stop it happening) */
|
||||
if (state->flipscreen)
|
||||
tilemap_set_scrolly(state->bg_tilemap, 0,((256 - data) & 0xff));
|
||||
else
|
||||
tilemap_set_scrolly(state->bg_tilemap, 0, data);
|
||||
}
|
||||
|
||||
|
||||
WRITE8_HANDLER( mrdo_flipscreen_w )
|
||||
{
|
||||
mrdo_state *state = (mrdo_state *)space->machine->driver_data;
|
||||
|
||||
/* bits 1-3 control the playfield priority, but they are not used by */
|
||||
/* Mr. Do! so we don't emulate them */
|
||||
|
||||
flipscreen = data & 0x01;
|
||||
tilemap_set_flip_all(space->machine,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
|
||||
state->flipscreen = data & 0x01;
|
||||
tilemap_set_flip_all(space->machine, state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
|
||||
}
|
||||
|
||||
|
||||
@ -232,29 +242,31 @@ WRITE8_HANDLER( mrdo_flipscreen_w )
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect)
|
||||
static void draw_sprites( running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect )
|
||||
{
|
||||
UINT8 *spriteram = machine->generic.spriteram.u8;
|
||||
mrdo_state *state = (mrdo_state *)machine->driver_data;
|
||||
UINT8 *spriteram = state->spriteram;
|
||||
int offs;
|
||||
|
||||
|
||||
for (offs = machine->generic.spriteram_size - 4;offs >= 0;offs -= 4)
|
||||
for (offs = state->spriteram_size - 4; offs >= 0; offs -= 4)
|
||||
{
|
||||
if (spriteram[offs + 1] != 0)
|
||||
{
|
||||
drawgfx_transpen(bitmap,cliprect,machine->gfx[2],
|
||||
spriteram[offs],spriteram[offs + 2] & 0x0f,
|
||||
spriteram[offs + 2] & 0x10,spriteram[offs + 2] & 0x20,
|
||||
spriteram[offs + 3],256 - spriteram[offs + 1],0);
|
||||
drawgfx_transpen(bitmap, cliprect, machine->gfx[2],
|
||||
spriteram[offs], spriteram[offs + 2] & 0x0f,
|
||||
spriteram[offs + 2] & 0x10, spriteram[offs + 2] & 0x20,
|
||||
spriteram[offs + 3], 256 - spriteram[offs + 1], 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VIDEO_UPDATE( mrdo )
|
||||
{
|
||||
bitmap_fill(bitmap,cliprect,0);
|
||||
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
|
||||
tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
|
||||
draw_sprites(screen->machine,bitmap,cliprect);
|
||||
mrdo_state *state = (mrdo_state *)screen->machine->driver_data;
|
||||
|
||||
bitmap_fill(bitmap, cliprect,0);
|
||||
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
|
||||
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
|
||||
draw_sprites(screen->machine, bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
@ -6,46 +6,59 @@ Mr. F. Lea
|
||||
******************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "includes/mrflea.h"
|
||||
|
||||
static int mrflea_gfx_bank;
|
||||
WRITE8_HANDLER( mrflea_gfx_bank_w )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
state->gfx_bank = data;
|
||||
|
||||
WRITE8_HANDLER( mrflea_gfx_bank_w ){
|
||||
mrflea_gfx_bank = data;
|
||||
if( data & ~0x14 ){
|
||||
logerror( "unknown gfx bank: 0x%02x\n", data );
|
||||
}
|
||||
if (data & ~0x14)
|
||||
logerror("unknown gfx bank: 0x%02x\n", data);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mrflea_videoram_w ){
|
||||
int bank = offset/0x400;
|
||||
WRITE8_HANDLER( mrflea_videoram_w )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
int bank = offset / 0x400;
|
||||
|
||||
offset &= 0x3ff;
|
||||
space->machine->generic.videoram.u8[offset] = data;
|
||||
space->machine->generic.videoram.u8[offset+0x400] = bank;
|
||||
/* the address range that tile data is written to sets one bit of
|
||||
** the bank select. The remaining bits are from a video register.
|
||||
*/
|
||||
state->videoram[offset] = data;
|
||||
state->videoram[offset + 0x400] = bank;
|
||||
/* the address range that tile data is written to sets one bit of
|
||||
the bank select. The remaining bits are from a video register. */
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mrflea_spriteram_w ){
|
||||
if( offset&2 ){ /* tile_number */
|
||||
space->machine->generic.spriteram.u8[offset|1] = offset&1;
|
||||
WRITE8_HANDLER( mrflea_spriteram_w )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)space->machine->driver_data;
|
||||
|
||||
if (offset & 2)
|
||||
{
|
||||
/* tile_number */
|
||||
state->spriteram[offset | 1] = offset & 1;
|
||||
offset &= ~1;
|
||||
}
|
||||
space->machine->generic.spriteram.u8[offset] = data;
|
||||
|
||||
state->spriteram[offset] = data;
|
||||
}
|
||||
|
||||
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
|
||||
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
mrflea_state *state = (mrflea_state *)machine->driver_data;
|
||||
const gfx_element *gfx = machine->gfx[0];
|
||||
const UINT8 *source = machine->generic.spriteram.u8;
|
||||
const UINT8 *finish = source+0x100;
|
||||
const UINT8 *source = state->spriteram;
|
||||
const UINT8 *finish = source + 0x100;
|
||||
rectangle clip = *video_screen_get_visible_area(machine->primary_screen);
|
||||
|
||||
clip.max_x -= 24;
|
||||
clip.min_x += 16;
|
||||
while( source<finish ){
|
||||
int xpos = source[1]-3;
|
||||
int ypos = source[0]-16+3;
|
||||
int tile_number = source[2]+source[3]*0x100;
|
||||
|
||||
while (source < finish)
|
||||
{
|
||||
int xpos = source[1] - 3;
|
||||
int ypos = source[0] - 16 + 3;
|
||||
int tile_number = source[2] + source[3] * 0x100;
|
||||
|
||||
drawgfx_transpen( bitmap, &clip,gfx,
|
||||
tile_number,
|
||||
@ -57,21 +70,29 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
|
||||
0, /* color */
|
||||
0,0, /* no flip */
|
||||
xpos,256+ypos,0 );
|
||||
source+=4;
|
||||
source += 4;
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_background(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
|
||||
static void draw_background( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
const UINT8 *source = machine->generic.videoram.u8;
|
||||
mrflea_state *state = (mrflea_state *)machine->driver_data;
|
||||
const UINT8 *source = state->videoram;
|
||||
const gfx_element *gfx = machine->gfx[1];
|
||||
int sx,sy;
|
||||
int sx, sy;
|
||||
int base = 0;
|
||||
if( mrflea_gfx_bank&0x04 ) base |= 0x400;
|
||||
if( mrflea_gfx_bank&0x10 ) base |= 0x200;
|
||||
for( sy=0; sy<256; sy+=8 ){
|
||||
for( sx=0; sx<256; sx+=8 ){
|
||||
int tile_number = base+source[0]+source[0x400]*0x100;
|
||||
|
||||
if (BIT(state->gfx_bank, 2))
|
||||
base |= 0x400;
|
||||
|
||||
if (BIT(state->gfx_bank, 4))
|
||||
base |= 0x200;
|
||||
|
||||
for (sy = 0; sy < 256; sy += 8)
|
||||
{
|
||||
for (sx = 0; sx < 256; sx += 8)
|
||||
{
|
||||
int tile_number = base + source[0] + source[0x400] * 0x100;
|
||||
source++;
|
||||
drawgfx_opaque( bitmap, cliprect,
|
||||
gfx,
|
||||
@ -83,9 +104,6 @@ static void draw_background(running_machine *machine, bitmap_t *bitmap, const re
|
||||
}
|
||||
}
|
||||
|
||||
VIDEO_START( mrflea ){
|
||||
}
|
||||
|
||||
VIDEO_UPDATE( mrflea )
|
||||
{
|
||||
draw_background(screen->machine, bitmap, cliprect);
|
||||
|
@ -7,16 +7,15 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "includes/mrjong.h"
|
||||
|
||||
UINT8 *mrjong_videoram;
|
||||
UINT8 *mrjong_colorram;
|
||||
static tilemap_t *bg_tilemap;
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Convert the color PROMs. (from video/pengo.c)
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
PALETTE_INIT( mrjong )
|
||||
{
|
||||
int i;
|
||||
@ -31,21 +30,21 @@ PALETTE_INIT( mrjong )
|
||||
int r, g, b;
|
||||
|
||||
/* red component */
|
||||
bit0 = (color_prom[i] >> 0) & 0x01;
|
||||
bit1 = (color_prom[i] >> 1) & 0x01;
|
||||
bit2 = (color_prom[i] >> 2) & 0x01;
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
/* green component */
|
||||
bit0 = (color_prom[i] >> 3) & 0x01;
|
||||
bit1 = (color_prom[i] >> 4) & 0x01;
|
||||
bit2 = (color_prom[i] >> 5) & 0x01;
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
/* blue component */
|
||||
bit0 = 0;
|
||||
bit1 = (color_prom[i] >> 6) & 0x01;
|
||||
bit2 = (color_prom[i] >> 7) & 0x01;
|
||||
bit1 = BIT(color_prom[i], 6);
|
||||
bit2 = BIT(color_prom[i], 7);
|
||||
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
|
||||
colortable_palette_set_color(machine->colortable, i, MAKE_RGB(r, g, b));
|
||||
@ -68,46 +67,52 @@ PALETTE_INIT( mrjong )
|
||||
Display control parameter.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
WRITE8_HANDLER( mrjong_videoram_w )
|
||||
{
|
||||
mrjong_videoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(bg_tilemap, offset);
|
||||
mrjong_state *state = (mrjong_state *)space->machine->driver_data;
|
||||
state->videoram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mrjong_colorram_w )
|
||||
{
|
||||
mrjong_colorram[offset] = data;
|
||||
tilemap_mark_tile_dirty(bg_tilemap, offset);
|
||||
mrjong_state *state = (mrjong_state *)space->machine->driver_data;
|
||||
state->colorram[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mrjong_flipscreen_w )
|
||||
{
|
||||
if (flip_screen_get(space->machine) != (data & 0x01))
|
||||
if (flip_screen_get(space->machine) != BIT(data, 2))
|
||||
{
|
||||
flip_screen_set(space->machine, data & 0x01);
|
||||
flip_screen_set(space->machine, BIT(data, 2));
|
||||
tilemap_mark_all_tiles_dirty_all(space->machine);
|
||||
}
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_bg_tile_info )
|
||||
{
|
||||
int code = mrjong_videoram[tile_index] | ((mrjong_colorram[tile_index] & 0x20) << 3);
|
||||
int color = mrjong_colorram[tile_index] & 0x1f;
|
||||
int flags = ((mrjong_colorram[tile_index] & 0x40) ? TILE_FLIPX : 0) | ((mrjong_colorram[tile_index] & 0x80) ? TILE_FLIPY : 0);
|
||||
mrjong_state *state = (mrjong_state *)machine->driver_data;
|
||||
int code = state->videoram[tile_index] | ((state->colorram[tile_index] & 0x20) << 3);
|
||||
int color = state->colorram[tile_index] & 0x1f;
|
||||
int flags = ((state->colorram[tile_index] & 0x40) ? TILE_FLIPX : 0) | ((state->colorram[tile_index] & 0x80) ? TILE_FLIPY : 0);
|
||||
|
||||
SET_TILE_INFO(0, code, color, flags);
|
||||
}
|
||||
|
||||
VIDEO_START( mrjong )
|
||||
{
|
||||
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows_flip_xy, 8, 8, 32, 32);
|
||||
mrjong_state *state = (mrjong_state *)machine->driver_data;
|
||||
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows_flip_xy, 8, 8, 32, 32);
|
||||
}
|
||||
|
||||
/*
|
||||
Note: First 0x40 entries in the videoram are actually spriteram
|
||||
*/
|
||||
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
|
||||
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
mrjong_state *state = (mrjong_state *)machine->driver_data;
|
||||
int offs;
|
||||
|
||||
for (offs = (0x40 - 4); offs >= 0; offs -= 4)
|
||||
@ -117,13 +122,13 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
|
||||
int sx, sy;
|
||||
int flipx, flipy;
|
||||
|
||||
sprt = (((mrjong_videoram[offs + 1] >> 2) & 0x3f) | ((mrjong_videoram[offs + 3] & 0x20) << 1));
|
||||
flipx = (mrjong_videoram[offs + 1] & 0x01) >> 0;
|
||||
flipy = (mrjong_videoram[offs + 1] & 0x02) >> 1;
|
||||
color = (mrjong_videoram[offs + 3] & 0x1f);
|
||||
sprt = (((state->videoram[offs + 1] >> 2) & 0x3f) | ((state->videoram[offs + 3] & 0x20) << 1));
|
||||
flipx = (state->videoram[offs + 1] & 0x01) >> 0;
|
||||
flipy = (state->videoram[offs + 1] & 0x02) >> 1;
|
||||
color = (state->videoram[offs + 3] & 0x1f);
|
||||
|
||||
sx = 224 - mrjong_videoram[offs + 2];
|
||||
sy = mrjong_videoram[offs + 0];
|
||||
sx = 224 - state->videoram[offs + 2];
|
||||
sy = state->videoram[offs + 0];
|
||||
if (flip_screen_get(machine))
|
||||
{
|
||||
sx = 208 - sx;
|
||||
@ -142,7 +147,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
|
||||
|
||||
VIDEO_UPDATE( mrjong )
|
||||
{
|
||||
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
|
||||
mrjong_state *state = (mrjong_state *)screen->machine->driver_data;
|
||||
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
|
||||
draw_sprites(screen->machine, bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
@ -27,16 +27,16 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
|
||||
|
||||
mugsmash_state *state = (mugsmash_state *)machine->driver_data;
|
||||
const UINT16 *source = state->spriteram;
|
||||
const UINT16 *finish = source+0x2000;
|
||||
const UINT16 *finish = source + 0x2000;
|
||||
const gfx_element *gfx = machine->gfx[0];
|
||||
|
||||
while( source<finish )
|
||||
while (source < finish)
|
||||
{
|
||||
int xpos = source[0] & 0x00ff;
|
||||
int ypos = source[4] & 0x00ff;
|
||||
int num = (source[3] & 0x00ff) | ((source[2] & 0x00ff) << 8);
|
||||
int attr = source[1];
|
||||
int flipx = (attr & 0x0080)>>7;
|
||||
int flipx = (attr & 0x0080) >> 7;
|
||||
int colour = (attr & 0x000f);
|
||||
|
||||
xpos += ((attr & 0x0020) >> 5) * 0x100;
|
||||
@ -71,13 +71,13 @@ static TILE_GET_INFO( get_mugsmash_tile_info1 )
|
||||
*/
|
||||
|
||||
mugsmash_state *state = (mugsmash_state *)machine->driver_data;
|
||||
int tileno,colour,fx;
|
||||
int tileno, colour, fx;
|
||||
|
||||
tileno = state->videoram1[tile_index *2 +1];
|
||||
colour = state->videoram1[tile_index *2] & 0x000f;
|
||||
fx = (state->videoram1[tile_index *2] & 0xc0) >>6;
|
||||
tileno = state->videoram1[tile_index * 2 + 1];
|
||||
colour = state->videoram1[tile_index * 2] & 0x000f;
|
||||
fx = (state->videoram1[tile_index * 2] & 0xc0) >> 6;
|
||||
|
||||
SET_TILE_INFO(1,tileno,colour,TILE_FLIPYX(fx));
|
||||
SET_TILE_INFO(1, tileno, colour, TILE_FLIPYX(fx));
|
||||
}
|
||||
|
||||
WRITE16_HANDLER( mugsmash_videoram1_w )
|
||||
@ -85,7 +85,7 @@ WRITE16_HANDLER( mugsmash_videoram1_w )
|
||||
mugsmash_state *state = (mugsmash_state *)space->machine->driver_data;
|
||||
|
||||
state->videoram1[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->tilemap1,offset/2);
|
||||
tilemap_mark_tile_dirty(state->tilemap1, offset / 2);
|
||||
}
|
||||
|
||||
static TILE_GET_INFO( get_mugsmash_tile_info2 )
|
||||
@ -100,13 +100,13 @@ static TILE_GET_INFO( get_mugsmash_tile_info2 )
|
||||
*/
|
||||
|
||||
mugsmash_state *state = (mugsmash_state *)machine->driver_data;
|
||||
int tileno,colour,fx;
|
||||
int tileno, colour, fx;
|
||||
|
||||
tileno = state->videoram2[tile_index *2 +1];
|
||||
colour = state->videoram2[tile_index *2] & 0x000f;
|
||||
fx = (state->videoram2[tile_index *2] & 0xc0) >>6;
|
||||
tileno = state->videoram2[tile_index * 2 + 1];
|
||||
colour = state->videoram2[tile_index * 2] & 0x000f;
|
||||
fx = (state->videoram2[tile_index * 2] & 0xc0) >> 6;
|
||||
|
||||
SET_TILE_INFO(1,tileno,16+colour,TILE_FLIPYX(fx));
|
||||
SET_TILE_INFO(1, tileno, 16 + colour, TILE_FLIPYX(fx));
|
||||
}
|
||||
|
||||
WRITE16_HANDLER( mugsmash_videoram2_w )
|
||||
@ -114,7 +114,7 @@ WRITE16_HANDLER( mugsmash_videoram2_w )
|
||||
mugsmash_state *state = (mugsmash_state *)space->machine->driver_data;
|
||||
|
||||
state->videoram2[offset] = data;
|
||||
tilemap_mark_tile_dirty(state->tilemap2,offset/2);
|
||||
tilemap_mark_tile_dirty(state->tilemap2, offset / 2);
|
||||
}
|
||||
|
||||
WRITE16_HANDLER (mugsmash_reg_w)
|
||||
@ -127,16 +127,16 @@ WRITE16_HANDLER (mugsmash_reg_w)
|
||||
switch (offset)
|
||||
{
|
||||
case 0:
|
||||
tilemap_set_scrollx(state->tilemap2,0, state->regs1[2]+7);
|
||||
tilemap_set_scrollx(state->tilemap2, 0, state->regs1[2] + 7);
|
||||
break;
|
||||
case 1:
|
||||
tilemap_set_scrolly(state->tilemap2,0, state->regs1[3]+4);
|
||||
tilemap_set_scrolly(state->tilemap2, 0, state->regs1[3] + 4);
|
||||
break;
|
||||
case 2:
|
||||
tilemap_set_scrollx(state->tilemap1,0, state->regs1[0]+3);
|
||||
tilemap_set_scrollx(state->tilemap1, 0, state->regs1[0] + 3);
|
||||
break;
|
||||
case 3:
|
||||
tilemap_set_scrolly(state->tilemap1,0, state->regs1[1]+4);
|
||||
tilemap_set_scrolly(state->tilemap1, 0, state->regs1[1] + 4);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -145,18 +145,18 @@ VIDEO_START( mugsmash )
|
||||
{
|
||||
mugsmash_state *state = (mugsmash_state *)machine->driver_data;
|
||||
|
||||
state->tilemap1 = tilemap_create(machine, get_mugsmash_tile_info1,tilemap_scan_rows, 16, 16,32,32);
|
||||
tilemap_set_transparent_pen(state->tilemap1,0);
|
||||
state->tilemap1 = tilemap_create(machine, get_mugsmash_tile_info1, tilemap_scan_rows, 16, 16, 32, 32);
|
||||
tilemap_set_transparent_pen(state->tilemap1, 0);
|
||||
|
||||
state->tilemap2 = tilemap_create(machine, get_mugsmash_tile_info2,tilemap_scan_rows, 16, 16,32,32);
|
||||
state->tilemap2 = tilemap_create(machine, get_mugsmash_tile_info2, tilemap_scan_rows, 16, 16, 32, 32);
|
||||
}
|
||||
|
||||
VIDEO_UPDATE( mugsmash )
|
||||
{
|
||||
mugsmash_state *state = (mugsmash_state *)screen->machine->driver_data;
|
||||
|
||||
tilemap_draw(bitmap,cliprect,state->tilemap2,0,0);
|
||||
tilemap_draw(bitmap,cliprect,state->tilemap1,0,0);
|
||||
draw_sprites(screen->machine,bitmap,cliprect);
|
||||
tilemap_draw(bitmap, cliprect, state->tilemap2, 0, 0);
|
||||
tilemap_draw(bitmap, cliprect, state->tilemap1, 0, 0);
|
||||
draw_sprites(screen->machine, bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,73 +1,70 @@
|
||||
#include "emu.h"
|
||||
#include "includes/munchmo.h"
|
||||
|
||||
|
||||
UINT8 *mnchmobl_vreg;
|
||||
UINT8 *mnchmobl_status_vram;
|
||||
UINT8 *mnchmobl_sprite_xpos;
|
||||
UINT8 *mnchmobl_sprite_attr;
|
||||
UINT8 *mnchmobl_sprite_tile;
|
||||
|
||||
static int mnchmobl_palette_bank;
|
||||
static int flipscreen;
|
||||
|
||||
PALETTE_INIT( mnchmobl )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0;i < machine->config->total_colors;i++)
|
||||
for (i = 0; i < machine->config->total_colors; i++)
|
||||
{
|
||||
int bit0,bit1,bit2,r,g,b;
|
||||
int bit0, bit1, bit2, r, g, b;
|
||||
|
||||
/* red component */
|
||||
bit0 = (color_prom[i] >> 0) & 0x01;
|
||||
bit1 = (color_prom[i] >> 1) & 0x01;
|
||||
bit2 = (color_prom[i] >> 2) & 0x01;
|
||||
bit0 = BIT(color_prom[i], 0);
|
||||
bit1 = BIT(color_prom[i], 1);
|
||||
bit2 = BIT(color_prom[i], 2);
|
||||
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
/* green component */
|
||||
bit0 = (color_prom[i] >> 3) & 0x01;
|
||||
bit1 = (color_prom[i] >> 4) & 0x01;
|
||||
bit2 = (color_prom[i] >> 5) & 0x01;
|
||||
bit0 = BIT(color_prom[i], 3);
|
||||
bit1 = BIT(color_prom[i], 4);
|
||||
bit2 = BIT(color_prom[i], 5);
|
||||
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
|
||||
/* blue component */
|
||||
bit0 = (color_prom[i] >> 6) & 0x01;
|
||||
bit1 = (color_prom[i] >> 7) & 0x01;
|
||||
bit0 = BIT(color_prom[i], 6);
|
||||
bit1 = BIT(color_prom[i], 7);
|
||||
b = 0x4f * bit0 + 0xa8 * bit1;
|
||||
|
||||
palette_set_color(machine,i,MAKE_RGB(r,g,b));
|
||||
palette_set_color(machine, i, MAKE_RGB(r, g, b));
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mnchmobl_palette_bank_w )
|
||||
{
|
||||
mnchmobl_palette_bank = data&0x3;
|
||||
munchmo_state *state = (munchmo_state *)space->machine->driver_data;
|
||||
state->palette_bank = data & 0x3;
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( mnchmobl_flipscreen_w )
|
||||
{
|
||||
flipscreen = data;
|
||||
munchmo_state *state = (munchmo_state *)space->machine->driver_data;
|
||||
state->flipscreen = data;
|
||||
}
|
||||
|
||||
|
||||
VIDEO_START( mnchmobl )
|
||||
{
|
||||
machine->generic.tmpbitmap = auto_bitmap_alloc(machine,512,512,video_screen_get_format(machine->primary_screen));
|
||||
munchmo_state *state = (munchmo_state *)machine->driver_data;
|
||||
state->tmpbitmap = auto_bitmap_alloc(machine, 512, 512, video_screen_get_format(machine->primary_screen));
|
||||
}
|
||||
|
||||
static void draw_status(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
|
||||
static void draw_status( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
munchmo_state *state = (munchmo_state *)machine->driver_data;
|
||||
const gfx_element *gfx = machine->gfx[0];
|
||||
int row;
|
||||
|
||||
for( row=0; row<4; row++ )
|
||||
for (row = 0; row < 4; row++)
|
||||
{
|
||||
int sy,sx = (row&1)*8;
|
||||
const UINT8 *source = mnchmobl_status_vram + (~row&1)*32;
|
||||
if( row<=1 )
|
||||
int sy, sx = (row & 1) * 8;
|
||||
const UINT8 *source = state->status_vram + (~row & 1) * 32;
|
||||
if (row <= 1)
|
||||
{
|
||||
source+=2*32;
|
||||
sx+=256+32+16;
|
||||
source += 2 * 32;
|
||||
sx += 256 + 32 + 16;
|
||||
}
|
||||
for( sy=0; sy<256; sy+=8 )
|
||||
|
||||
for (sy = 0; sy < 256; sy += 8)
|
||||
{
|
||||
drawgfx_opaque( bitmap, cliprect,
|
||||
gfx,
|
||||
@ -79,62 +76,64 @@ static void draw_status(running_machine *machine, bitmap_t *bitmap, const rectan
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_background(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
|
||||
static void draw_background( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
/*
|
||||
ROM B1.2C contains 256 tilemaps defining 4x4 configurations of
|
||||
the tiles in ROM B2.2B
|
||||
*/
|
||||
munchmo_state *state = (munchmo_state *)machine->driver_data;
|
||||
UINT8 *rom = memory_region(machine, "gfx2");
|
||||
const gfx_element *gfx = machine->gfx[1];
|
||||
int offs;
|
||||
|
||||
for( offs=0; offs<0x100; offs++ )
|
||||
for (offs = 0; offs < 0x100; offs++)
|
||||
{
|
||||
int sy = (offs%16)*32;
|
||||
int sx = (offs/16)*32;
|
||||
int tile_number = machine->generic.videoram.u8[offs];
|
||||
int row,col;
|
||||
int sy = (offs % 16) * 32;
|
||||
int sx = (offs / 16) * 32;
|
||||
int tile_number = state->videoram[offs];
|
||||
int row, col;
|
||||
|
||||
for( row=0; row<4; row++ )
|
||||
for (row = 0; row < 4; row++)
|
||||
{
|
||||
for( col=0; col<4; col++ )
|
||||
for (col = 0; col < 4; col++)
|
||||
{
|
||||
drawgfx_opaque( machine->generic.tmpbitmap,0, gfx,
|
||||
rom[col+tile_number*4+row*0x400],
|
||||
mnchmobl_palette_bank,
|
||||
drawgfx_opaque(state->tmpbitmap, 0, gfx,
|
||||
rom[col + tile_number * 4 + row * 0x400],
|
||||
state->palette_bank,
|
||||
0,0, /* flip */
|
||||
sx+col*8, sy+row*8 );
|
||||
sx + col * 8, sy + row * 8 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
int scrollx = -(mnchmobl_vreg[6]*2+(mnchmobl_vreg[7]>>7))-64-128-16;
|
||||
int scrollx = -(state->vreg[6] *2 + (state->vreg[7] >> 7)) - 64 - 128 - 16;
|
||||
int scrolly = 0;
|
||||
|
||||
copyscrollbitmap(bitmap,machine->generic.tmpbitmap, 1,&scrollx,1,&scrolly, cliprect);
|
||||
copyscrollbitmap(bitmap, state->tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
|
||||
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
|
||||
{
|
||||
int scroll = mnchmobl_vreg[6];
|
||||
int flags = mnchmobl_vreg[7]; /* XB?????? */
|
||||
munchmo_state *state = (munchmo_state *)machine->driver_data;
|
||||
int scroll = state->vreg[6];
|
||||
int flags = state->vreg[7]; /* XB?????? */
|
||||
int xadjust = - 128 - 16 - ((flags & 0x80) ? 1 : 0);
|
||||
int bank = (flags & 0x40) ? 1 : 0;
|
||||
const gfx_element *gfx = machine->gfx[2 + bank];
|
||||
int color_base = mnchmobl_palette_bank * 4 + 3;
|
||||
int color_base = state->palette_bank * 4 + 3;
|
||||
int i, j;
|
||||
int firstsprite = mnchmobl_vreg[4] & 0x3f;
|
||||
for( i = firstsprite; i < firstsprite + 0x40; i++ )
|
||||
int firstsprite = state->vreg[4] & 0x3f;
|
||||
for (i = firstsprite; i < firstsprite + 0x40; i++)
|
||||
{
|
||||
for( j = 0; j < 8; j++ )
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
int offs = (j << 6) | ( i & 0x3f );
|
||||
int tile_number = mnchmobl_sprite_tile[offs]; /* ETTTTTTT */
|
||||
int attributes = mnchmobl_sprite_attr[offs]; /* XYYYYYCC */
|
||||
int sx = mnchmobl_sprite_xpos[offs]; /* XXXXXXX? */
|
||||
int offs = (j << 6) | (i & 0x3f);
|
||||
int tile_number = state->sprite_tile[offs]; /* ETTTTTTT */
|
||||
int attributes = state->sprite_attr[offs]; /* XYYYYYCC */
|
||||
int sx = state->sprite_xpos[offs]; /* XXXXXXX? */
|
||||
int sy = (offs >> 6) << 5; /* Y YY------ */
|
||||
sy += (attributes >> 2) & 0x1f;
|
||||
if( attributes & 0x80 )
|
||||
|
Loading…
Reference in New Issue
Block a user