Added driver data struct and save states to fitfight.c, flstory.c and funkybee.c

Also, added driver data struct to flyball.c and merged video emulation
This commit is contained in:
Fabio Priuli 2009-11-27 22:15:46 +00:00
parent abb8ad1fb6
commit 6ab509cb8d
14 changed files with 854 additions and 552 deletions

2
.gitattributes vendored
View File

@ -2448,6 +2448,7 @@ src/mame/includes/flstory.h svneol=native#text/plain
src/mame/includes/foodf.h svneol=native#text/plain src/mame/includes/foodf.h svneol=native#text/plain
src/mame/includes/fromanc2.h svneol=native#text/plain src/mame/includes/fromanc2.h svneol=native#text/plain
src/mame/includes/fromance.h svneol=native#text/plain src/mame/includes/fromance.h svneol=native#text/plain
src/mame/includes/funkybee.h svneol=native#text/plain
src/mame/includes/gaelco2.h svneol=native#text/plain src/mame/includes/gaelco2.h svneol=native#text/plain
src/mame/includes/gaelco3d.h svneol=native#text/plain src/mame/includes/gaelco3d.h svneol=native#text/plain
src/mame/includes/gaelcrpt.h svneol=native#text/plain src/mame/includes/gaelcrpt.h svneol=native#text/plain
@ -3198,7 +3199,6 @@ src/mame/video/fitfight.c svneol=native#text/plain
src/mame/video/flkatck.c svneol=native#text/plain src/mame/video/flkatck.c svneol=native#text/plain
src/mame/video/flower.c svneol=native#text/plain src/mame/video/flower.c svneol=native#text/plain
src/mame/video/flstory.c svneol=native#text/plain src/mame/video/flstory.c svneol=native#text/plain
src/mame/video/flyball.c svneol=native#text/plain
src/mame/video/foodf.c svneol=native#text/plain src/mame/video/foodf.c svneol=native#text/plain
src/mame/video/freekick.c svneol=native#text/plain src/mame/video/freekick.c svneol=native#text/plain
src/mame/video/fromanc2.c svneol=native#text/plain src/mame/video/fromanc2.c svneol=native#text/plain

View File

@ -88,55 +88,45 @@ Stephh's notes :
#include "includes/fitfight.h" #include "includes/fitfight.h"
UINT16 *fitfight_spriteram;
static UINT16 *fof_100000;
static UINT16 *fof_600000;
UINT16 *fof_700000;
static UINT16 *fof_800000;
UINT16 *fof_900000;
UINT16 *fof_a00000;
UINT16 *fof_bak_tileram;
UINT16 *fof_mid_tileram;
UINT16 *fof_txt_tileram;
char bbprot_kludge;
static UINT16 fitfight_700000_data = 0;
static READ16_HANDLER(fitfight_700000_r) static READ16_HANDLER(fitfight_700000_r)
{ {
UINT16 data = fitfight_700000_data; fitfight_state *state = (fitfight_state *)space->machine->driver_data;
UINT16 data = state->fof_700000_data;
return (data << 2); return (data << 2);
} }
static READ16_HANDLER(histryma_700000_r) static READ16_HANDLER(histryma_700000_r)
{ {
UINT16 data = (fitfight_700000_data & 0x00AA); fitfight_state *state = (fitfight_state *)space->machine->driver_data;
data |= ((fitfight_700000_data & 0x0055) >> 2); UINT16 data = (state->fof_700000_data & 0x00AA);
data |= ((state->fof_700000_data & 0x0055) >> 2);
return (data); return (data);
} }
static READ16_HANDLER(bbprot_700000_r) static READ16_HANDLER(bbprot_700000_r)
{ {
fitfight_state *state = (fitfight_state *)space->machine->driver_data;
UINT16 data = 0; UINT16 data = 0;
data = (fitfight_700000_data & 0x000b); data = (state->fof_700000_data & 0x000b);
data |= ((fitfight_700000_data & 0x01d0) >> 2); data |= ((state->fof_700000_data & 0x01d0) >> 2);
data |= ((fitfight_700000_data & 0x0004) << 6); data |= ((state->fof_700000_data & 0x0004) << 6);
data |= ((fitfight_700000_data & 0x0020) << 2); data |= ((state->fof_700000_data & 0x0020) << 2);
return (data); return (data);
} }
static WRITE16_HANDLER(fitfight_700000_w) static WRITE16_HANDLER(fitfight_700000_w)
{ {
COMBINE_DATA(&fof_700000[offset]); // needed for scrolling fitfight_state *state = (fitfight_state *)space->machine->driver_data;
COMBINE_DATA(&state->fof_700000[offset]); // needed for scrolling
if (data < 0x0200) // to avoid considering writes of 0x0200 if (data < 0x0200) // to avoid considering writes of 0x0200
fitfight_700000_data = data; state->fof_700000_data = data;
} }
static ADDRESS_MAP_START( fitfight_main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( fitfight_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x100001) AM_WRITE(SMH_RAM) AM_BASE(&fof_100000) AM_RANGE(0x100000, 0x100001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_100000)
//written at scanline 5, allways 1. Used by histryma/fitfight @0x0000ec2c/@0x0000f076 //written at scanline 5, allways 1. Used by histryma/fitfight @0x0000ec2c/@0x0000f076
AM_RANGE(0x200000, 0x200001) AM_READ_PORT("P1_P2") AM_RANGE(0x200000, 0x200001) AM_READ_PORT("P1_P2")
@ -144,7 +134,7 @@ static ADDRESS_MAP_START( fitfight_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x400000, 0x400001) AM_READ_PORT("SYSTEM_DSW2") AM_RANGE(0x400000, 0x400001) AM_READ_PORT("SYSTEM_DSW2")
AM_RANGE(0x500000, 0x500001) AM_READ_PORT("DSW3_DSW1") AM_RANGE(0x500000, 0x500001) AM_READ_PORT("DSW3_DSW1")
AM_RANGE(0x600000, 0x600001) AM_WRITE(SMH_RAM) AM_BASE(&fof_600000) AM_RANGE(0x600000, 0x600001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_600000)
// Is 0x600000 controlling the slave audio CPU? data is 0x1111000zzzzzzzzz (9 sign. bits) // Is 0x600000 controlling the slave audio CPU? data is 0x1111000zzzzzzzzz (9 sign. bits)
// Used by histryma/fitfight: // Used by histryma/fitfight:
// @0x000031ae/0x00002b3a: 0xF000, once, during POST // @0x000031ae/0x00002b3a: 0xF000, once, during POST
@ -155,24 +145,24 @@ static ADDRESS_MAP_START( fitfight_main_map, ADDRESS_SPACE_PROGRAM, 16 )
// @0x000037a6/0x000030e6: 0x??dd byte from 0xe08c05, 0xF101 then 0xF001/0xF157 then 0xF057 // @0x000037a6/0x000030e6: 0x??dd byte from 0xe08c05, 0xF101 then 0xF001/0xF157 then 0xF057
// AM_RANGE(0x700000, 0x700001) AM_READ(xxxx) /* see init */ // AM_RANGE(0x700000, 0x700001) AM_READ(xxxx) /* see init */
AM_RANGE(0x700000, 0x700001) AM_WRITE(fitfight_700000_w) AM_BASE(&fof_700000) AM_RANGE(0x700000, 0x700001) AM_WRITE(fitfight_700000_w) AM_BASE_MEMBER(fitfight_state, fof_700000)
// kept at 0xe07900/0xe04c56 // kept at 0xe07900/0xe04c56
AM_RANGE(0x800000, 0x800001) AM_WRITE(SMH_RAM) AM_BASE(&fof_800000) AM_RANGE(0x800000, 0x800001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_800000)
//written at scanline 1, allways 0. Used by histryma/fitfight @0x00001d76/@0x00000f6a //written at scanline 1, allways 0. Used by histryma/fitfight @0x00001d76/@0x00000f6a
AM_RANGE(0x900000, 0x900001) AM_WRITE(SMH_RAM) AM_BASE(&fof_900000) //mid tilemap scroll AM_RANGE(0x900000, 0x900001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_900000) //mid tilemap scroll
// fitfigth: @0x00002b42,@0x00000f76 // fitfigth: @0x00002b42,@0x00000f76
// histryma: @0x000031b6,@0x00001d82 // histryma: @0x000031b6,@0x00001d82
AM_RANGE(0xa00000, 0xa00001) AM_WRITE(SMH_RAM) AM_BASE(&fof_a00000) //bak tilemap scroll AM_RANGE(0xa00000, 0xa00001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_a00000) //bak tilemap scroll
// fitfight: @0x00002b4a,@0x00000f82 // fitfight: @0x00002b4a,@0x00000f82
// histryma: @0x000031be,@0x00001d8e // histryma: @0x000031be,@0x00001d8e
AM_RANGE(0xb00000, 0xb03fff) AM_WRITENOP /* unused layer? */ AM_RANGE(0xb00000, 0xb03fff) AM_WRITENOP /* unused layer? */
AM_RANGE(0xb04000, 0xb07fff) AM_READWRITE(SMH_RAM,fof_bak_tileram_w) AM_BASE(&fof_bak_tileram) AM_RANGE(0xb04000, 0xb07fff) AM_READWRITE(SMH_RAM, fof_bak_tileram_w) AM_BASE_MEMBER(fitfight_state, fof_bak_tileram)
AM_RANGE(0xb08000, 0xb0bfff) AM_READWRITE(SMH_RAM,fof_mid_tileram_w) AM_BASE(&fof_mid_tileram) AM_RANGE(0xb08000, 0xb0bfff) AM_READWRITE(SMH_RAM, fof_mid_tileram_w) AM_BASE_MEMBER(fitfight_state, fof_mid_tileram)
AM_RANGE(0xb0c000, 0xb0ffff) AM_READWRITE(SMH_RAM,fof_txt_tileram_w) AM_BASE(&fof_txt_tileram) AM_RANGE(0xb0c000, 0xb0ffff) AM_READWRITE(SMH_RAM, fof_txt_tileram_w) AM_BASE_MEMBER(fitfight_state, fof_txt_tileram)
AM_RANGE(0xb10000, 0xb13fff) AM_WRITENOP //used by histryma @0x0000b25a AM_RANGE(0xb10000, 0xb13fff) AM_WRITENOP //used by histryma @0x0000b25a
AM_RANGE(0xb14000, 0xb17fff) AM_WRITENOP //used by histryma @0x0000b25a,b270 AM_RANGE(0xb14000, 0xb17fff) AM_WRITENOP //used by histryma @0x0000b25a,b270
@ -180,7 +170,7 @@ static ADDRESS_MAP_START( fitfight_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xc00000, 0xc00fff) AM_READWRITE(SMH_RAM,paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE(&paletteram16) AM_RANGE(0xc00000, 0xc00fff) AM_READWRITE(SMH_RAM,paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE(&paletteram16)
AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE(&fitfight_spriteram) AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE_MEMBER(fitfight_state, spriteram)
AM_RANGE(0xe00000, 0xe0ffff) AM_RAM AM_RANGE(0xe00000, 0xe0ffff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -188,30 +178,30 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bbprot_main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( bbprot_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x100001) AM_WRITE(SMH_RAM) AM_BASE(&fof_100000) AM_RANGE(0x100000, 0x100001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_100000)
AM_RANGE(0x300000, 0x300001) AM_READ_PORT("P1_P2") AM_RANGE(0x300000, 0x300001) AM_READ_PORT("P1_P2")
AM_RANGE(0x380000, 0x380001) AM_READ_PORT("EXTRA") AM_RANGE(0x380000, 0x380001) AM_READ_PORT("EXTRA")
AM_RANGE(0x400000, 0x400001) AM_READ_PORT("SYSTEM_DSW2") AM_RANGE(0x400000, 0x400001) AM_READ_PORT("SYSTEM_DSW2")
AM_RANGE(0x480000, 0x480001) AM_READ_PORT("DSW3_DSW1") AM_RANGE(0x480000, 0x480001) AM_READ_PORT("DSW3_DSW1")
AM_RANGE(0x600000, 0x600001) AM_WRITE(SMH_RAM) AM_BASE(&fof_600000) AM_RANGE(0x600000, 0x600001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_600000)
AM_RANGE(0x700000, 0x700001) AM_READWRITE(bbprot_700000_r,fitfight_700000_w) AM_BASE(&fof_700000) AM_RANGE(0x700000, 0x700001) AM_READWRITE(bbprot_700000_r, fitfight_700000_w) AM_BASE_MEMBER(fitfight_state, fof_700000)
AM_RANGE(0x800000, 0x800001) AM_WRITE(SMH_RAM) AM_BASE(&fof_800000) AM_RANGE(0x800000, 0x800001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_800000)
AM_RANGE(0x900000, 0x900001) AM_WRITE(SMH_RAM) AM_BASE(&fof_900000) AM_RANGE(0x900000, 0x900001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_900000)
AM_RANGE(0xa00000, 0xa00001) AM_WRITE(SMH_RAM) AM_BASE(&fof_a00000) AM_RANGE(0xa00000, 0xa00001) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fitfight_state, fof_a00000)
AM_RANGE(0xb00000, 0xb03fff) AM_WRITENOP /* unused layer? */ AM_RANGE(0xb00000, 0xb03fff) AM_WRITENOP /* unused layer? */
AM_RANGE(0xb04000, 0xb07fff) AM_READWRITE(SMH_RAM,fof_bak_tileram_w) AM_BASE(&fof_bak_tileram) AM_RANGE(0xb04000, 0xb07fff) AM_READWRITE(SMH_RAM, fof_bak_tileram_w) AM_BASE_MEMBER(fitfight_state, fof_bak_tileram)
AM_RANGE(0xb08000, 0xb0bfff) AM_READWRITE(SMH_RAM,fof_mid_tileram_w) AM_BASE(&fof_mid_tileram) AM_RANGE(0xb08000, 0xb0bfff) AM_READWRITE(SMH_RAM, fof_mid_tileram_w) AM_BASE_MEMBER(fitfight_state, fof_mid_tileram)
AM_RANGE(0xb0c000, 0xb0ffff) AM_READWRITE(SMH_RAM,fof_txt_tileram_w) AM_BASE(&fof_txt_tileram) AM_RANGE(0xb0c000, 0xb0ffff) AM_READWRITE(SMH_RAM, fof_txt_tileram_w) AM_BASE_MEMBER(fitfight_state, fof_txt_tileram)
AM_RANGE(0xc00000, 0xc00fff) AM_READ(SMH_RAM) AM_RANGE(0xc00000, 0xc00fff) AM_READ(SMH_RAM)
AM_RANGE(0xc00000, 0xc03fff) AM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE(&paletteram16) AM_RANGE(0xc00000, 0xc03fff) AM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE(&paletteram16)
AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE(&fitfight_spriteram) AM_RANGE(0xd00000, 0xd007ff) AM_RAM AM_BASE_MEMBER(fitfight_state, spriteram)
AM_RANGE(0xe00000, 0xe0ffff) AM_RAM AM_RANGE(0xe00000, 0xe0ffff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -267,7 +257,7 @@ ADDRESS_MAP_END
static INTERRUPT_GEN( snd_irq ) static INTERRUPT_GEN( snd_irq )
{ {
cpu_set_input_line(device,UPD7810_INTF2,HOLD_LINE); cpu_set_input_line(device, UPD7810_INTF2, HOLD_LINE);
} }
static const UPD7810_CONFIG sound_cpu_config = static const UPD7810_CONFIG sound_cpu_config =
@ -727,7 +717,23 @@ static GFXDECODE_START( prot )
GFXDECODE_END GFXDECODE_END
static MACHINE_START( fitfight )
{
fitfight_state *state = (fitfight_state *)machine->driver_data;
state_save_register_global(machine, state->fof_700000_data);
}
static MACHINE_RESET( fitfight )
{
fitfight_state *state = (fitfight_state *)machine->driver_data;
state->fof_700000_data = 0;
}
static MACHINE_DRIVER_START( fitfight ) static MACHINE_DRIVER_START( fitfight )
MDRV_DRIVER_DATA(fitfight_state)
MDRV_CPU_ADD("maincpu",M68000, 12000000) MDRV_CPU_ADD("maincpu",M68000, 12000000)
MDRV_CPU_PROGRAM_MAP(fitfight_main_map) MDRV_CPU_PROGRAM_MAP(fitfight_main_map)
MDRV_CPU_VBLANK_INT("screen", irq2_line_hold) MDRV_CPU_VBLANK_INT("screen", irq2_line_hold)
@ -738,8 +744,10 @@ static MACHINE_DRIVER_START( fitfight )
MDRV_CPU_IO_MAP(snd_io) MDRV_CPU_IO_MAP(snd_io)
MDRV_CPU_VBLANK_INT("screen", snd_irq) MDRV_CPU_VBLANK_INT("screen", snd_irq)
MDRV_GFXDECODE(fitfight) MDRV_MACHINE_START(fitfight)
MDRV_MACHINE_RESET(fitfight)
MDRV_GFXDECODE(fitfight)
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -761,12 +769,16 @@ static MACHINE_DRIVER_START( fitfight )
MACHINE_DRIVER_END MACHINE_DRIVER_END
static MACHINE_DRIVER_START( bbprot ) static MACHINE_DRIVER_START( bbprot )
MDRV_DRIVER_DATA(fitfight_state)
MDRV_CPU_ADD("maincpu",M68000, 12000000) MDRV_CPU_ADD("maincpu",M68000, 12000000)
MDRV_CPU_PROGRAM_MAP(bbprot_main_map) MDRV_CPU_PROGRAM_MAP(bbprot_main_map)
MDRV_CPU_VBLANK_INT("screen", irq2_line_hold) MDRV_CPU_VBLANK_INT("screen", irq2_line_hold)
MDRV_GFXDECODE(prot) MDRV_MACHINE_START(fitfight)
MDRV_MACHINE_RESET(fitfight)
MDRV_GFXDECODE(prot)
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -969,25 +981,28 @@ static DRIVER_INIT( fitfight )
{ {
// UINT16 *mem16 = (UINT16 *)memory_region(machine, "maincpu"); // UINT16 *mem16 = (UINT16 *)memory_region(machine, "maincpu");
// mem16[0x0165B2/2] = 0x4e71; // for now so it boots // mem16[0x0165B2/2] = 0x4e71; // for now so it boots
fitfight_state *state = (fitfight_state *)machine->driver_data;
memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x700000, 0x700001, 0, 0, fitfight_700000_r); memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x700000, 0x700001, 0, 0, fitfight_700000_r);
bbprot_kludge = 0; state->bbprot_kludge = 0;
} }
static DRIVER_INIT( histryma ) static DRIVER_INIT( histryma )
{ {
// UINT16 *mem16 = (UINT16 *)memory_region(machine, "maincpu"); // UINT16 *mem16 = (UINT16 *)memory_region(machine, "maincpu");
// mem16[0x017FDC/2] = 0x4e71; // for now so it boots // mem16[0x017FDC/2] = 0x4e71; // for now so it boots
fitfight_state *state = (fitfight_state *)machine->driver_data;
memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x700000, 0x700001, 0, 0, histryma_700000_r); memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x700000, 0x700001, 0, 0, histryma_700000_r);
bbprot_kludge = 0; state->bbprot_kludge = 0;
} }
static DRIVER_INIT( bbprot ) static DRIVER_INIT( bbprot )
{ {
bbprot_kludge = 1; fitfight_state *state = (fitfight_state *)machine->driver_data;
state->bbprot_kludge = 1;
} }
/* GAME */ /* GAME */
GAME( 199?, fitfight, 0, fitfight, fitfight, fitfight, ROT0, "bootleg", "Fit of Fighting", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) GAME( 199?, fitfight, 0, fitfight, fitfight, fitfight, ROT0, "bootleg", "Fit of Fighting", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
GAME( 199?, histryma, 0, fitfight, histryma, histryma, ROT0, "bootleg", "The History of Martial Arts", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) GAME( 199?, histryma, 0, fitfight, histryma, histryma, ROT0, "bootleg", "The History of Martial Arts", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
GAME( 199?, bbprot, 0, bbprot, bbprot, bbprot, ROT0, "<unknown>", "Untitled Fighter 'BB' (prototype)", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) GAME( 199?, bbprot, 0, bbprot, bbprot, bbprot, ROT0, "<unknown>", "Untitled Fighter 'BB' (prototype)", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -1,11 +1,11 @@
/*************************************************************************** /***************************************************************************
The FairyLand Story The FairyLand Story
added Victorious Nine by BUT added Victorious Nine by BUT
TODO: TODO:
- TA7630 emulation needs filter support (bass sounds from MSM5232 should be about 2 times louder) - TA7630 emulation needs filter support (bass sounds from MSM5232 should be about 2 times louder)
***************************************************************************/ ***************************************************************************/
@ -18,37 +18,33 @@ TODO:
#include "sound/dac.h" #include "sound/dac.h"
#include "includes/flstory.h" #include "includes/flstory.h"
UINT8 *onna34ro_workram;
UINT8 *victnine_workram;
static UINT8 snd_data;
static UINT8 snd_flag;
static READ8_HANDLER( from_snd_r ) static READ8_HANDLER( from_snd_r )
{ {
snd_flag = 0; flstory_state *state = (flstory_state *)space->machine->driver_data;
return snd_data; state->snd_flag = 0;
return state->snd_data;
} }
static READ8_HANDLER( snd_flag_r ) static READ8_HANDLER( snd_flag_r )
{ {
return snd_flag | 0xfd; flstory_state *state = (flstory_state *)space->machine->driver_data;
return state->snd_flag | 0xfd;
} }
static WRITE8_HANDLER( to_main_w ) static WRITE8_HANDLER( to_main_w )
{ {
snd_data = data; flstory_state *state = (flstory_state *)space->machine->driver_data;
snd_flag = 2; state->snd_data = data;
state->snd_flag = 2;
} }
static int sound_nmi_enable,pending_nmi;
static TIMER_CALLBACK( nmi_callback ) static TIMER_CALLBACK( nmi_callback )
{ {
if (sound_nmi_enable) flstory_state *state = (flstory_state *)machine->driver_data;
cputag_set_input_line(machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); if (state->sound_nmi_enable)
else pending_nmi = 1; cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
else
state->pending_nmi = 1;
} }
static WRITE8_HANDLER( sound_command_w ) static WRITE8_HANDLER( sound_command_w )
@ -60,22 +56,24 @@ static WRITE8_HANDLER( sound_command_w )
static WRITE8_HANDLER( nmi_disable_w ) static WRITE8_HANDLER( nmi_disable_w )
{ {
sound_nmi_enable = 0; flstory_state *state = (flstory_state *)space->machine->driver_data;
state->sound_nmi_enable = 0;
} }
static WRITE8_HANDLER( nmi_enable_w ) static WRITE8_HANDLER( nmi_enable_w )
{ {
sound_nmi_enable = 1; flstory_state *state = (flstory_state *)space->machine->driver_data;
if (pending_nmi) state->sound_nmi_enable = 1;
if (state->pending_nmi)
{ {
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
pending_nmi = 0; state->pending_nmi = 0;
} }
} }
static ADDRESS_MAP_START( flstory_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( flstory_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(flstory_videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size) AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(flstory_videoram_w) AM_BASE_MEMBER(flstory_state, videoram) AM_SIZE(&videoram_size)
AM_RANGE(0xc800, 0xcfff) AM_RAM /* unknown */ AM_RANGE(0xc800, 0xcfff) AM_RAM /* unknown */
AM_RANGE(0xd000, 0xd000) AM_READWRITE(flstory_mcu_r, flstory_mcu_w) AM_RANGE(0xd000, 0xd000) AM_READWRITE(flstory_mcu_r, flstory_mcu_w)
AM_RANGE(0xd001, 0xd001) AM_WRITENOP /* watchdog? */ AM_RANGE(0xd001, 0xd001) AM_WRITENOP /* watchdog? */
@ -91,8 +89,8 @@ static ADDRESS_MAP_START( flstory_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xd805, 0xd805) AM_READ(flstory_mcu_status_r) AM_RANGE(0xd805, 0xd805) AM_READ(flstory_mcu_status_r)
AM_RANGE(0xd806, 0xd806) AM_READ_PORT("P2") AM_RANGE(0xd806, 0xd806) AM_READ_PORT("P2")
// AM_RANGE(0xda00, 0xda00) AM_WRITE(SMH_RAM) // AM_RANGE(0xda00, 0xda00) AM_WRITE(SMH_RAM)
AM_RANGE(0xdc00, 0xdc9f) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xdc00, 0xdc9f) AM_RAM AM_BASE_MEMBER(flstory_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xdca0, 0xdcbf) AM_RAM_WRITE(flstory_scrlram_w) AM_BASE(&flstory_scrlram) AM_RANGE(0xdca0, 0xdcbf) AM_RAM_WRITE(flstory_scrlram_w) AM_BASE_MEMBER(flstory_state, scrlram)
AM_RANGE(0xdcc0, 0xdcff) AM_RAM /* unknown */ AM_RANGE(0xdcc0, 0xdcff) AM_RAM /* unknown */
AM_RANGE(0xdd00, 0xdeff) AM_READWRITE(flstory_palette_r, flstory_palette_w) AM_RANGE(0xdd00, 0xdeff) AM_READWRITE(flstory_palette_r, flstory_palette_w)
AM_RANGE(0xdf03, 0xdf03) AM_WRITE(flstory_gfxctrl_w) AM_RANGE(0xdf03, 0xdf03) AM_WRITE(flstory_gfxctrl_w)
@ -101,7 +99,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( onna34ro_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( onna34ro_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(flstory_videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size) AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(flstory_videoram_w) AM_BASE_MEMBER(flstory_state, videoram) AM_SIZE(&videoram_size)
AM_RANGE(0xc800, 0xcfff) AM_RAM /* unknown */ AM_RANGE(0xc800, 0xcfff) AM_RAM /* unknown */
AM_RANGE(0xd000, 0xd000) AM_READWRITE(onna34ro_mcu_r, onna34ro_mcu_w) AM_RANGE(0xd000, 0xd000) AM_READWRITE(onna34ro_mcu_r, onna34ro_mcu_w)
AM_RANGE(0xd001, 0xd001) AM_WRITENOP /* watchdog? */ AM_RANGE(0xd001, 0xd001) AM_WRITENOP /* watchdog? */
@ -117,24 +115,25 @@ static ADDRESS_MAP_START( onna34ro_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xd805, 0xd805) AM_READ(onna34ro_mcu_status_r) AM_RANGE(0xd805, 0xd805) AM_READ(onna34ro_mcu_status_r)
AM_RANGE(0xd806, 0xd806) AM_READ_PORT("P2") AM_RANGE(0xd806, 0xd806) AM_READ_PORT("P2")
// AM_RANGE(0xda00, 0xda00) AM_WRITE(SMH_RAM) // AM_RANGE(0xda00, 0xda00) AM_WRITE(SMH_RAM)
AM_RANGE(0xdc00, 0xdc9f) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xdc00, 0xdc9f) AM_RAM AM_BASE_MEMBER(flstory_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xdca0, 0xdcbf) AM_RAM_WRITE(flstory_scrlram_w) AM_BASE(&flstory_scrlram) AM_RANGE(0xdca0, 0xdcbf) AM_RAM_WRITE(flstory_scrlram_w) AM_BASE_MEMBER(flstory_state, scrlram)
AM_RANGE(0xdcc0, 0xdcff) AM_RAM /* unknown */ AM_RANGE(0xdcc0, 0xdcff) AM_RAM /* unknown */
AM_RANGE(0xdd00, 0xdeff) AM_READWRITE(flstory_palette_r, flstory_palette_w) AM_RANGE(0xdd00, 0xdeff) AM_READWRITE(flstory_palette_r, flstory_palette_w)
AM_RANGE(0xdf03, 0xdf03) AM_WRITE(flstory_gfxctrl_w) AM_RANGE(0xdf03, 0xdf03) AM_WRITE(flstory_gfxctrl_w)
AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE(&onna34ro_workram) /* work RAM */ AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_MEMBER(flstory_state, workram) /* work RAM */
ADDRESS_MAP_END ADDRESS_MAP_END
static CUSTOM_INPUT( victnine_mcu_status_bit01_r ) static CUSTOM_INPUT( victnine_mcu_status_bit01_r )
{ {
const address_space *space = cputag_get_address_space(field->port->machine, "maincpu", ADDRESS_SPACE_PROGRAM); flstory_state *state = (flstory_state *)field->port->machine->driver_data;
const address_space *space = cpu_get_address_space(state->maincpu, ADDRESS_SPACE_PROGRAM);
return (victnine_mcu_status_r(space, 0) & 3); return (victnine_mcu_status_r(space, 0) & 3);
} }
static ADDRESS_MAP_START( victnine_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( victnine_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(flstory_videoram_w) AM_BASE(&videoram) AM_SIZE(&videoram_size) AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(flstory_videoram_w) AM_BASE_MEMBER(flstory_state, videoram) AM_SIZE(&videoram_size)
AM_RANGE(0xc800, 0xcfff) AM_RAM /* unknown */ AM_RANGE(0xc800, 0xcfff) AM_RAM /* unknown */
AM_RANGE(0xd000, 0xd000) AM_READWRITE(victnine_mcu_r, victnine_mcu_w) AM_RANGE(0xd000, 0xd000) AM_READWRITE(victnine_mcu_r, victnine_mcu_w)
AM_RANGE(0xd001, 0xd001) AM_WRITENOP /* watchdog? */ AM_RANGE(0xd001, 0xd001) AM_WRITENOP /* watchdog? */
@ -151,82 +150,84 @@ static ADDRESS_MAP_START( victnine_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xd806, 0xd806) AM_READ_PORT("P2") AM_RANGE(0xd806, 0xd806) AM_READ_PORT("P2")
AM_RANGE(0xd807, 0xd807) AM_READ_PORT("EXTRA_P2") AM_RANGE(0xd807, 0xd807) AM_READ_PORT("EXTRA_P2")
// AM_RANGE(0xda00, 0xda00) AM_WRITE(SMH_RAM) // AM_RANGE(0xda00, 0xda00) AM_WRITE(SMH_RAM)
AM_RANGE(0xdc00, 0xdc9f) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xdc00, 0xdc9f) AM_RAM AM_BASE_MEMBER(flstory_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xdca0, 0xdcbf) AM_RAM_WRITE(flstory_scrlram_w) AM_BASE(&flstory_scrlram) AM_RANGE(0xdca0, 0xdcbf) AM_RAM_WRITE(flstory_scrlram_w) AM_BASE_MEMBER(flstory_state, scrlram)
AM_RANGE(0xdce0, 0xdce0) AM_READWRITE(victnine_gfxctrl_r, victnine_gfxctrl_w) AM_RANGE(0xdce0, 0xdce0) AM_READWRITE(victnine_gfxctrl_r, victnine_gfxctrl_w)
AM_RANGE(0xdce1, 0xdce1) AM_WRITENOP /* unknown */ AM_RANGE(0xdce1, 0xdce1) AM_WRITENOP /* unknown */
AM_RANGE(0xdd00, 0xdeff) AM_READWRITE(flstory_palette_r, flstory_palette_w) AM_RANGE(0xdd00, 0xdeff) AM_READWRITE(flstory_palette_r, flstory_palette_w)
AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE(&victnine_workram) /* work RAM */ AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_MEMBER(flstory_state, workram) /* work RAM */
ADDRESS_MAP_END ADDRESS_MAP_END
static int vol_ctrl[16];
static MACHINE_RESET( ta7630 ) static MACHINE_RESET( ta7630 )
{ {
flstory_state *state = (flstory_state *)machine->driver_data;
int i; int i;
double db = 0.0; double db = 0.0;
double db_step = 1.50; /* 1.50 dB step (at least, maybe more) */ double db_step = 1.50; /* 1.50 dB step (at least, maybe more) */
double db_step_inc = 0.125; double db_step_inc = 0.125;
for (i=0; i<16; i++) for (i = 0; i < 16; i++)
{ {
double max = 100.0 / pow(10.0, db/20.0 ); double max = 100.0 / pow(10.0, db/20.0 );
vol_ctrl[ 15-i ] = max; state->vol_ctrl[15 - i] = max;
/*logerror("vol_ctrl[%x] = %i (%f dB)\n",15-i,vol_ctrl[ 15-i ],db);*/ /*logerror("vol_ctrl[%x] = %i (%f dB)\n", 15 - i, state->vol_ctrl[15 - i], db);*/
db += db_step; db += db_step;
db_step += db_step_inc; db_step += db_step_inc;
} }
/* for (i=0; i<8; i++) /* for (i = 0; i < 8; i++)
logerror("SOUND Chan#%i name=%s\n", i, mixer_get_name(i) ); */ logerror("SOUND Chan#%i name=%s\n", i, mixer_get_name(i)); */
/* /*
channels 0-2 AY#0 channels 0-2 AY#0
channels 3,4 MSM5232 group1,group2 channels 3,4 MSM5232 group1,group2
*/ */
} }
static UINT8 snd_ctrl0=0;
static UINT8 snd_ctrl1=0;
static UINT8 snd_ctrl2=0;
static UINT8 snd_ctrl3=0;
static WRITE8_DEVICE_HANDLER( sound_control_0_w ) static WRITE8_DEVICE_HANDLER( sound_control_0_w )
{ {
snd_ctrl0 = data & 0xff; flstory_state *state = (flstory_state *)device->machine->driver_data;
// popmessage("SND0 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3);
state->snd_ctrl0 = data & 0xff;
// popmessage("SND0 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3);
/* this definitely controls main melody voice on 2'-1 and 4'-1 outputs */ /* this definitely controls main melody voice on 2'-1 and 4'-1 outputs */
sound_set_output_gain(device, 0, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ sound_set_output_gain(device, 0, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */
sound_set_output_gain(device, 1, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ sound_set_output_gain(device, 1, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */
sound_set_output_gain(device, 2, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ sound_set_output_gain(device, 2, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */
sound_set_output_gain(device, 3, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ sound_set_output_gain(device, 3, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */
} }
static WRITE8_DEVICE_HANDLER( sound_control_1_w ) static WRITE8_DEVICE_HANDLER( sound_control_1_w )
{ {
snd_ctrl1 = data & 0xff; flstory_state *state = (flstory_state *)device->machine->driver_data;
// popmessage("SND1 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3);
sound_set_output_gain(device, 4, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ state->snd_ctrl1 = data & 0xff;
sound_set_output_gain(device, 5, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ // popmessage("SND1 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3);
sound_set_output_gain(device, 6, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ sound_set_output_gain(device, 4, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */
sound_set_output_gain(device, 7, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ sound_set_output_gain(device, 5, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */
sound_set_output_gain(device, 6, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */
sound_set_output_gain(device, 7, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */
} }
static WRITE8_DEVICE_HANDLER( sound_control_2_w ) static WRITE8_DEVICE_HANDLER( sound_control_2_w )
{ {
flstory_state *state = (flstory_state *)device->machine->driver_data;
int i; int i;
snd_ctrl2 = data & 0xff; state->snd_ctrl2 = data & 0xff;
// popmessage("SND2 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3); // popmessage("SND2 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3);
for (i=0; i<3; i++) for (i = 0; i < 3; i++)
sound_set_output_gain (device, i, vol_ctrl[ (snd_ctrl2>>4) & 15 ] / 100.0); /* ym2149f all */ sound_set_output_gain(device, i, state->vol_ctrl[(state->snd_ctrl2 >> 4) & 15] / 100.0); /* ym2149f all */
} }
static WRITE8_DEVICE_HANDLER( sound_control_3_w ) /* unknown */ static WRITE8_DEVICE_HANDLER( sound_control_3_w ) /* unknown */
{ {
snd_ctrl3 = data & 0xff; flstory_state *state = (flstory_state *)device->machine->driver_data;
// popmessage("SND3 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3);
state->snd_ctrl3 = data & 0xff;
// popmessage("SND3 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3);
} }
@ -246,12 +247,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( flstory_m68705_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( flstory_m68705_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_GLOBAL_MASK(0x7ff) ADDRESS_MAP_GLOBAL_MASK(0x7ff)
AM_RANGE(0x0000, 0x0000) AM_READWRITE(flstory_68705_portA_r, flstory_68705_portA_w) AM_RANGE(0x0000, 0x0000) AM_READWRITE(flstory_68705_port_a_r, flstory_68705_port_a_w)
AM_RANGE(0x0001, 0x0001) AM_READWRITE(flstory_68705_portB_r, flstory_68705_portB_w) AM_RANGE(0x0001, 0x0001) AM_READWRITE(flstory_68705_port_b_r, flstory_68705_port_b_w)
AM_RANGE(0x0002, 0x0002) AM_READWRITE(flstory_68705_portC_r, flstory_68705_portC_w) AM_RANGE(0x0002, 0x0002) AM_READWRITE(flstory_68705_port_c_r, flstory_68705_port_c_w)
AM_RANGE(0x0004, 0x0004) AM_WRITE(flstory_68705_ddrA_w) AM_RANGE(0x0004, 0x0004) AM_WRITE(flstory_68705_ddr_a_w)
AM_RANGE(0x0005, 0x0005) AM_WRITE(flstory_68705_ddrB_w) AM_RANGE(0x0005, 0x0005) AM_WRITE(flstory_68705_ddr_b_w)
AM_RANGE(0x0006, 0x0006) AM_WRITE(flstory_68705_ddrC_w) AM_RANGE(0x0006, 0x0006) AM_WRITE(flstory_68705_ddr_c_w)
AM_RANGE(0x0010, 0x007f) AM_RAM AM_RANGE(0x0010, 0x007f) AM_RAM
AM_RANGE(0x0080, 0x07ff) AM_ROM AM_RANGE(0x0080, 0x07ff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -653,8 +654,88 @@ static const msm5232_interface msm5232_config =
}; };
static MACHINE_START( flstory )
{
flstory_state *state = (flstory_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");
/* video */
state_save_register_global(machine, state->char_bank);
state_save_register_global(machine, state->palette_bank);
state_save_register_global(machine, state->flipscreen);
state_save_register_global(machine, state->gfxctrl);
/* sound */
state_save_register_global(machine, state->snd_data);
state_save_register_global(machine, state->snd_flag);
state_save_register_global(machine, state->sound_nmi_enable);
state_save_register_global(machine, state->pending_nmi);
state_save_register_global_array(machine, state->vol_ctrl);
state_save_register_global(machine, state->snd_ctrl0);
state_save_register_global(machine, state->snd_ctrl1);
state_save_register_global(machine, state->snd_ctrl2);
state_save_register_global(machine, state->snd_ctrl3);
/* mcu */
state_save_register_global(machine, state->from_main);
state_save_register_global(machine, state->from_mcu);
state_save_register_global(machine, state->mcu_sent);
state_save_register_global(machine, state->main_sent);
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_select);
}
static MACHINE_RESET( flstory )
{
flstory_state *state = (flstory_state *)machine->driver_data;
MACHINE_RESET_CALL(ta7630);
/* video */
state->char_bank = 0;
state->palette_bank = 0;
state->flipscreen = 0;
state->gfxctrl = 0;
/* sound */
state->snd_data = 0;
state->snd_flag = 0;
state->sound_nmi_enable = 0;
state->pending_nmi = 0;
state->snd_ctrl0 = 0;
state->snd_ctrl1 = 0;
state->snd_ctrl2 = 0;
state->snd_ctrl3 = 0;
/* mcu */
state->from_main = 0;
state->from_mcu = 0;
state->mcu_sent = 0;
state->main_sent = 0;
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_select = 0;
}
static MACHINE_DRIVER_START( flstory ) static MACHINE_DRIVER_START( flstory )
/* driver data */
MDRV_DRIVER_DATA(flstory_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,XTAL_10_733MHz/2) /* verified on pcb */ MDRV_CPU_ADD("maincpu", Z80,XTAL_10_733MHz/2) /* verified on pcb */
MDRV_CPU_PROGRAM_MAP(flstory_map) MDRV_CPU_PROGRAM_MAP(flstory_map)
@ -670,7 +751,8 @@ static MACHINE_DRIVER_START( flstory )
MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper */
/* synchronization of the CPUs */ /* synchronization of the CPUs */
MDRV_MACHINE_RESET(ta7630) MDRV_MACHINE_START(flstory)
MDRV_MACHINE_RESET(flstory)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
@ -713,6 +795,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( onna34ro ) static MACHINE_DRIVER_START( onna34ro )
/* driver data */
MDRV_DRIVER_DATA(flstory_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,10733000/2) /* ??? */ MDRV_CPU_ADD("maincpu", Z80,10733000/2) /* ??? */
MDRV_CPU_PROGRAM_MAP(onna34ro_map) MDRV_CPU_PROGRAM_MAP(onna34ro_map)
@ -727,7 +812,8 @@ static MACHINE_DRIVER_START( onna34ro )
MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper */
/* synchronization of the CPUs */ /* synchronization of the CPUs */
MDRV_MACHINE_RESET(ta7630) MDRV_MACHINE_START(flstory)
MDRV_MACHINE_RESET(flstory)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
@ -770,6 +856,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( victnine ) static MACHINE_DRIVER_START( victnine )
/* driver data */
MDRV_DRIVER_DATA(flstory_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,8000000/2) /* 4 MHz */ MDRV_CPU_ADD("maincpu", Z80,8000000/2) /* 4 MHz */
MDRV_CPU_PROGRAM_MAP(victnine_map) MDRV_CPU_PROGRAM_MAP(victnine_map)
@ -784,7 +873,8 @@ static MACHINE_DRIVER_START( victnine )
MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ MDRV_QUANTUM_TIME(HZ(6000)) /* 100 CPU slices per frame - an high value to ensure proper */
/* synchronization of the CPUs */ /* synchronization of the CPUs */
MDRV_MACHINE_RESET(ta7630) MDRV_MACHINE_START(flstory)
MDRV_MACHINE_RESET(flstory)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
@ -1050,8 +1140,8 @@ ROM_START( victnine )
ROM_END ROM_END
GAME( 1985, flstory, 0, flstory, flstory, 0, ROT180, "Taito", "The FairyLand Story", GAME_IMPERFECT_SOUND ) GAME( 1985, flstory, 0, flstory, flstory, 0, ROT180, "Taito", "The FairyLand Story", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1985, flstoryj, flstory, flstory, flstory, 0, ROT180, "Taito", "The FairyLand Story (Japan)", GAME_IMPERFECT_SOUND ) GAME( 1985, flstoryj, flstory, flstory, flstory, 0, ROT180, "Taito", "The FairyLand Story (Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1985, onna34ro, 0, onna34ro, onna34ro, 0, ROT0, "Taito", "Onna Sansirou - Typhoon Gal (set 1)", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND ) GAME( 1985, onna34ro, 0, onna34ro, onna34ro, 0, ROT0, "Taito", "Onna Sansirou - Typhoon Gal (set 1)", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1985, onna34roa,onna34ro, onna34ro, onna34ro, 0, ROT0, "Taito", "Onna Sansirou - Typhoon Gal (set 2)", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND ) GAME( 1985, onna34roa, onna34ro, onna34ro, onna34ro, 0, ROT0, "Taito", "Onna Sansirou - Typhoon Gal (set 2)", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1984, victnine, 0, victnine, victnine, 0, ROT0, "Taito", "Victorious Nine", GAME_IMPERFECT_SOUND ) GAME( 1984, victnine, 0, victnine, victnine, 0, ROT0, "Taito", "Victorious Nine", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -9,36 +9,118 @@ Atari Flyball Driver
#define MASTER_CLOCK ( XTAL_12_096MHz ) #define MASTER_CLOCK ( XTAL_12_096MHz )
extern VIDEO_START( flyball );
extern VIDEO_UPDATE( flyball );
extern UINT8 flyball_pitcher_pic;
extern UINT8 flyball_pitcher_vert;
extern UINT8 flyball_pitcher_horz;
extern UINT8 flyball_ball_vert;
extern UINT8 flyball_ball_horz;
extern UINT8* flyball_playfield_ram; typedef struct _flyball_state flyball_state;
struct _flyball_state
{
/* memory pointers */
UINT8 * rombase;
UINT8 * playfield_ram;
static UINT8 flyball_potmask; /* video-related */
static UINT8 flyball_potsense; tilemap *tmap;
UINT8 pitcher_vert;
UINT8 pitcher_horz;
UINT8 pitcher_pic;
UINT8 ball_vert;
UINT8 ball_horz;
static UINT8 *rombase; /* misc */
UINT8 potmask;
UINT8 potsense;
/* devices */
const device_config *maincpu;
};
/*************************************
*
* Video emulation
*
*************************************/
static TILEMAP_MAPPER( flyball_get_memory_offset )
{
if (col == 0)
col = num_cols;
return num_cols * (num_rows - row) - col;
}
static TILE_GET_INFO( flyball_get_tile_info )
{
flyball_state *state = (flyball_state *)machine->driver_data;
UINT8 data = state->playfield_ram[tile_index];
int flags = ((data & 0x40) ? TILE_FLIPX : 0) | ((data & 0x80) ? TILE_FLIPY : 0);
int code = data & 63;
if ((flags & TILE_FLIPX) && (flags & TILE_FLIPY))
{
code += 64;
}
SET_TILE_INFO(0, code, 0, flags);
}
VIDEO_START( flyball )
{
flyball_state *state = (flyball_state *)machine->driver_data;
state->tmap = tilemap_create(machine, flyball_get_tile_info, flyball_get_memory_offset, 8, 16, 32, 16);
}
VIDEO_UPDATE( flyball )
{
flyball_state *state = (flyball_state *)screen->machine->driver_data;
int pitcherx = state->pitcher_horz;
int pitchery = state->pitcher_vert - 31;
int ballx = state->ball_horz - 1;
int bally = state->ball_vert - 17;
int x;
int y;
tilemap_mark_all_tiles_dirty(state->tmap);
/* draw playfield */
tilemap_draw(bitmap, cliprect, state->tmap, 0, 0);
/* draw pitcher */
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1], state->pitcher_pic ^ 0xf, 0, 1, 0, pitcherx, pitchery, 1);
/* draw ball */
for (y = bally; y < bally + 2; y++)
for (x = ballx; x < ballx + 2; x++)
if (x >= cliprect->min_x &&
x <= cliprect->max_x &&
y >= cliprect->min_y &&
y <= cliprect->max_y)
*BITMAP_ADDR16(bitmap, y, x) = 1;
return 0;
}
static TIMER_CALLBACK( flyball_joystick_callback ) static TIMER_CALLBACK( flyball_joystick_callback )
{ {
flyball_state *state = (flyball_state *)machine->driver_data;
int potsense = param; int potsense = param;
if (potsense & ~flyball_potmask) if (potsense & ~state->potmask)
generic_pulse_irq_line(cputag_get_cpu(machine, "maincpu"), 0); generic_pulse_irq_line(state->maincpu, 0);
flyball_potsense |= potsense; state->potsense |= potsense;
} }
static TIMER_CALLBACK( flyball_quarter_callback ) static TIMER_CALLBACK( flyball_quarter_callback )
{ {
flyball_state *state = (flyball_state *)machine->driver_data;
int scanline = param; int scanline = param;
int potsense[64], i; int potsense[64], i;
@ -58,29 +140,18 @@ static TIMER_CALLBACK( flyball_quarter_callback )
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, scanline, 0), NULL, scanline, flyball_quarter_callback); timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, scanline, 0), NULL, scanline, flyball_quarter_callback);
flyball_potsense = 0; state->potsense = 0;
flyball_potmask = 0; state->potmask = 0;
} }
static MACHINE_RESET( flyball ) /*************************************
{ *
int i; * Memory handlers
*
/* address bits 0 through 8 are inverted */ *************************************/
UINT8* ROM = memory_region(machine, "maincpu") + 0x2000;
for (i = 0; i < 0x1000; i++)
rombase[i] = ROM[i ^ 0x1ff];
device_reset(cputag_get_cpu(machine, "maincpu"));
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 0, 0), NULL, 0, flyball_quarter_callback);
}
/* two physical buttons (start game and stop runner) share the same port bit */ /* two physical buttons (start game and stop runner) share the same port bit */
static READ8_HANDLER( flyball_input_r ) static READ8_HANDLER( flyball_input_r )
{ {
return input_port_read(space->machine, "IN0") & input_port_read(space->machine, "IN1"); return input_port_read(space->machine, "IN0") & input_port_read(space->machine, "IN1");
@ -93,37 +164,44 @@ static READ8_HANDLER( flyball_scanline_r )
static READ8_HANDLER( flyball_potsense_r ) static READ8_HANDLER( flyball_potsense_r )
{ {
return flyball_potsense & ~flyball_potmask; flyball_state *state = (flyball_state *)space->machine->driver_data;
return state->potsense & ~state->potmask;
} }
static WRITE8_HANDLER( flyball_potmask_w ) static WRITE8_HANDLER( flyball_potmask_w )
{ {
flyball_potmask |= data & 0xf; flyball_state *state = (flyball_state *)space->machine->driver_data;
state->potmask |= data & 0xf;
} }
static WRITE8_HANDLER( flyball_pitcher_pic_w ) static WRITE8_HANDLER( flyball_pitcher_pic_w )
{ {
flyball_pitcher_pic = data & 0xf; flyball_state *state = (flyball_state *)space->machine->driver_data;
state->pitcher_pic = data & 0xf;
} }
static WRITE8_HANDLER( flyball_ball_vert_w ) static WRITE8_HANDLER( flyball_ball_vert_w )
{ {
flyball_ball_vert = data; flyball_state *state = (flyball_state *)space->machine->driver_data;
state->ball_vert = data;
} }
static WRITE8_HANDLER( flyball_ball_horz_w ) static WRITE8_HANDLER( flyball_ball_horz_w )
{ {
flyball_ball_horz = data; flyball_state *state = (flyball_state *)space->machine->driver_data;
state->ball_horz = data;
} }
static WRITE8_HANDLER( flyball_pitcher_vert_w ) static WRITE8_HANDLER( flyball_pitcher_vert_w )
{ {
flyball_pitcher_vert = data; flyball_state *state = (flyball_state *)space->machine->driver_data;
state->pitcher_vert = data;
} }
static WRITE8_HANDLER( flyball_pitcher_horz_w ) static WRITE8_HANDLER( flyball_pitcher_horz_w )
{ {
flyball_pitcher_horz = data; flyball_state *state = (flyball_state *)space->machine->driver_data;
state->pitcher_horz = data;
} }
static WRITE8_HANDLER( flyball_misc_w ) static WRITE8_HANDLER( flyball_misc_w )
@ -154,6 +232,12 @@ static WRITE8_HANDLER( flyball_misc_w )
} }
/*************************************
*
* Address maps
*
*************************************/
static ADDRESS_MAP_START( flyball_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( flyball_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_GLOBAL_MASK(0x1fff) ADDRESS_MAP_GLOBAL_MASK(0x1fff)
AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x100) AM_RAM AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x100) AM_RAM
@ -168,11 +252,17 @@ static ADDRESS_MAP_START( flyball_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0900, 0x0900) AM_WRITE(flyball_potmask_w) AM_RANGE(0x0900, 0x0900) AM_WRITE(flyball_potmask_w)
AM_RANGE(0x0a00, 0x0a07) AM_WRITE(flyball_misc_w) AM_RANGE(0x0a00, 0x0a07) AM_WRITE(flyball_misc_w)
AM_RANGE(0x0b00, 0x0b00) AM_READ(flyball_input_r) AM_RANGE(0x0b00, 0x0b00) AM_READ(flyball_input_r)
AM_RANGE(0x0d00, 0x0eff) AM_WRITE(SMH_RAM) AM_BASE(&flyball_playfield_ram) AM_RANGE(0x0d00, 0x0eff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(flyball_state, playfield_ram)
AM_RANGE(0x1000, 0x1fff) AM_ROM AM_BASE(&rombase) /* program */ AM_RANGE(0x1000, 0x1fff) AM_ROM AM_BASE_MEMBER(flyball_state, rombase) /* program */
ADDRESS_MAP_END ADDRESS_MAP_END
/*************************************
*
* Input ports
*
*************************************/
static INPUT_PORTS_START( flyball ) static INPUT_PORTS_START( flyball )
PORT_START("IN0") /* IN0 */ PORT_START("IN0") /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START2 )
@ -206,6 +296,12 @@ static INPUT_PORTS_START( flyball )
INPUT_PORTS_END INPUT_PORTS_END
/*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout flyball_tiles_layout = static const gfx_layout flyball_tiles_layout =
{ {
8, 16, /* width, height */ 8, 16, /* width, height */
@ -254,13 +350,63 @@ static PALETTE_INIT( flyball )
} }
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_START( flyball )
{
flyball_state *state = (flyball_state *)machine->driver_data;
state->maincpu = devtag_get_device(machine, "maincpu");
state_save_register_global(machine, state->pitcher_vert);
state_save_register_global(machine, state->pitcher_horz);
state_save_register_global(machine, state->pitcher_pic);
state_save_register_global(machine, state->ball_vert);
state_save_register_global(machine, state->ball_horz);
state_save_register_global(machine, state->potmask);
state_save_register_global(machine, state->potsense);
}
static MACHINE_RESET( flyball )
{
flyball_state *state = (flyball_state *)machine->driver_data;
int i;
/* address bits 0 through 8 are inverted */
UINT8* ROM = memory_region(machine, "maincpu") + 0x2000;
for (i = 0; i < 0x1000; i++)
state->rombase[i] = ROM[i ^ 0x1ff];
device_reset(devtag_get_device(machine, "maincpu"));
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 0, 0), NULL, 0, flyball_quarter_callback);
state->pitcher_vert = 0;
state->pitcher_horz = 0;
state->pitcher_pic = 0;
state->ball_vert = 0;
state->ball_horz = 0;
state->potmask = 0;
state->potsense = 0;
}
static MACHINE_DRIVER_START( flyball ) static MACHINE_DRIVER_START( flyball )
/* driver data */
MDRV_DRIVER_DATA(flyball_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M6502, MASTER_CLOCK/16) MDRV_CPU_ADD("maincpu", M6502, MASTER_CLOCK/16)
MDRV_CPU_PROGRAM_MAP(flyball_map) MDRV_CPU_PROGRAM_MAP(flyball_map)
MDRV_CPU_VBLANK_INT("screen", nmi_line_pulse) MDRV_CPU_VBLANK_INT("screen", nmi_line_pulse)
MDRV_MACHINE_START(flyball)
MDRV_MACHINE_RESET(flyball) MDRV_MACHINE_RESET(flyball)
/* video hardware */ /* video hardware */
@ -281,6 +427,12 @@ static MACHINE_DRIVER_START( flyball )
MACHINE_DRIVER_END MACHINE_DRIVER_END
/*************************************
*
* ROM definition(s)
*
*************************************/
ROM_START( flyball ) ROM_START( flyball )
ROM_REGION( 0x3000, "maincpu", 0 ) /* program */ ROM_REGION( 0x3000, "maincpu", 0 ) /* program */
ROM_LOAD( "6129.d5", 0x2000, 0x0200, CRC(17eda069) SHA1(e4ef0bf4546cf00668d759a188e0989a4f003825) ) ROM_LOAD( "6129.d5", 0x2000, 0x0200, CRC(17eda069) SHA1(e4ef0bf4546cf00668d759a188e0989a4f003825) )
@ -304,4 +456,10 @@ ROM_START( flyball )
ROM_END ROM_END
/*************************************
*
* Game driver(s)
*
*************************************/
GAME( 1976, flyball, 0, flyball, flyball, 0, 0, "Atari", "Flyball", GAME_NO_SOUND ) GAME( 1976, flyball, 0, flyball, flyball, 0, 0, "Atari", "Flyball", GAME_NO_SOUND )

View File

@ -74,17 +74,7 @@ Stephh's notes (based on the games Z80 code and some tests) :
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "funkybee.h"
extern WRITE8_HANDLER( funkybee_videoram_w );
extern WRITE8_HANDLER( funkybee_colorram_w );
extern WRITE8_HANDLER( funkybee_gfx_bank_w );
extern WRITE8_HANDLER( funkybee_scroll_w );
extern WRITE8_HANDLER( funkybee_flipscreen_w );
extern PALETTE_INIT( funkybee );
extern VIDEO_START( funkybee );
extern VIDEO_UPDATE( funkybee );
static READ8_HANDLER( funkybee_input_port_0_r ) static READ8_HANDLER( funkybee_input_port_0_r )
@ -95,14 +85,14 @@ static READ8_HANDLER( funkybee_input_port_0_r )
static WRITE8_HANDLER( funkybee_coin_counter_w ) static WRITE8_HANDLER( funkybee_coin_counter_w )
{ {
coin_counter_w(space->machine, offset,data); coin_counter_w(space->machine, offset, data);
} }
static ADDRESS_MAP_START( funkybee_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( funkybee_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x4fff) AM_ROM AM_RANGE(0x0000, 0x4fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0xa000, 0xbfff) AM_RAM_WRITE(funkybee_videoram_w) AM_BASE(&videoram) AM_RANGE(0xa000, 0xbfff) AM_RAM_WRITE(funkybee_videoram_w) AM_BASE_MEMBER(funkybee_state, videoram)
AM_RANGE(0xc000, 0xdfff) AM_RAM_WRITE(funkybee_colorram_w) AM_BASE(&colorram) AM_RANGE(0xc000, 0xdfff) AM_RAM_WRITE(funkybee_colorram_w) AM_BASE_MEMBER(funkybee_state, colorram)
AM_RANGE(0xe000, 0xe000) AM_WRITE(funkybee_scroll_w) AM_RANGE(0xe000, 0xe000) AM_WRITE(funkybee_scroll_w)
AM_RANGE(0xe800, 0xe800) AM_WRITE(funkybee_flipscreen_w) AM_RANGE(0xe800, 0xe800) AM_WRITE(funkybee_flipscreen_w)
AM_RANGE(0xe802, 0xe803) AM_WRITE(funkybee_coin_counter_w) AM_RANGE(0xe802, 0xe803) AM_WRITE(funkybee_coin_counter_w)
@ -288,14 +278,34 @@ static const ay8910_interface ay8910_config =
}; };
static MACHINE_START( funkybee )
{
funkybee_state *state = (funkybee_state *)machine->driver_data;
state_save_register_global(machine, state->gfx_bank);
}
static MACHINE_RESET( funkybee )
{
funkybee_state *state = (funkybee_state *)machine->driver_data;
state->gfx_bank = 0;
}
static MACHINE_DRIVER_START( funkybee ) static MACHINE_DRIVER_START( funkybee )
/* driver data */
MDRV_DRIVER_DATA(funkybee_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz */ MDRV_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz */
MDRV_CPU_PROGRAM_MAP(funkybee_map) MDRV_CPU_PROGRAM_MAP(funkybee_map)
MDRV_CPU_IO_MAP(io_map) MDRV_CPU_IO_MAP(io_map)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
MDRV_MACHINE_START(funkybee)
MDRV_MACHINE_RESET(funkybee)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -425,8 +435,7 @@ ROM_START( skylancre )
ROM_LOAD( "18s030.1a", 0x0000, 0x0020, CRC(e645bacb) SHA1(5f4c299c4cf165fd229731c0e5799a34892bf28e) ) ROM_LOAD( "18s030.1a", 0x0000, 0x0020, CRC(e645bacb) SHA1(5f4c299c4cf165fd229731c0e5799a34892bf28e) )
ROM_END ROM_END
GAME( 1982, funkybee, 0, funkybee, funkybee, 0, ROT90, "Orca", "Funky Bee", 0 ) GAME( 1982, funkybee, 0, funkybee, funkybee, 0, ROT90, "Orca", "Funky Bee", GAME_SUPPORTS_SAVE )
GAME( 1982, funkybeeb,funkybee, funkybee, funkbeeb, 0, ROT90, "bootleg", "Funky Bee (bootleg, harder)", 0 ) GAME( 1982, funkybeeb, funkybee, funkybee, funkbeeb, 0, ROT90, "bootleg", "Funky Bee (bootleg, harder)", GAME_SUPPORTS_SAVE )
GAME( 1983, skylancr, 0, funkybee, skylancr, 0, ROT90, "Orca", "Sky Lancer", 0 ) GAME( 1983, skylancr, 0, funkybee, skylancr, 0, ROT90, "Orca", "Sky Lancer", GAME_SUPPORTS_SAVE )
GAME( 1983, skylancre,skylancr, funkybee, skylance, 0, ROT90, "Orca (Esco Trading Co license)", "Sky Lancer (Esco Trading Co license)", 0 ) GAME( 1983, skylancre, skylancr, funkybee, skylance, 0, ROT90, "Orca (Esco Trading Co license)", "Sky Lancer (Esco Trading Co license)", GAME_SUPPORTS_SAVE )

View File

@ -1,14 +1,27 @@
/*----------- defined in drivers/fitfight.c -----------*/
extern UINT16 *fitfight_spriteram; typedef struct _fitfight_state fitfight_state;
extern UINT16 *fof_700000; struct _fitfight_state
extern UINT16 *fof_900000; {
extern UINT16 *fof_a00000; /* memory pointers */
UINT16 * fof_100000;
UINT16 * fof_600000;
UINT16 * fof_700000;
UINT16 * fof_800000;
UINT16 * fof_900000;
UINT16 * fof_a00000;
UINT16 * fof_bak_tileram;
UINT16 * fof_mid_tileram;
UINT16 * fof_txt_tileram;
UINT16 * spriteram;
// UINT16 * paletteram16; // currently this uses generic palette handling
extern UINT16 *fof_bak_tileram; /* video-related */
extern UINT16 *fof_mid_tileram; tilemap *fof_bak_tilemap, *fof_mid_tilemap, *fof_txt_tilemap;
extern UINT16 *fof_txt_tileram;
extern char bbprot_kludge; /* misc */
int bbprot_kludge;
UINT16 fof_700000_data;
};
/*----------- defined in video/fitfight.c -----------*/ /*----------- defined in video/fitfight.c -----------*/
@ -16,5 +29,6 @@ extern char bbprot_kludge;
WRITE16_HANDLER( fof_bak_tileram_w ); WRITE16_HANDLER( fof_bak_tileram_w );
WRITE16_HANDLER( fof_mid_tileram_w ); WRITE16_HANDLER( fof_mid_tileram_w );
WRITE16_HANDLER( fof_txt_tileram_w ); WRITE16_HANDLER( fof_txt_tileram_w );
VIDEO_START(fitfight); VIDEO_START(fitfight);
VIDEO_UPDATE(fitfight); VIDEO_UPDATE(fitfight);

View File

@ -1,20 +1,55 @@
/*----------- defined in drivers/flstory.c -----------*/
extern UINT8 *onna34ro_workram; typedef struct _flstory_state flstory_state;
extern UINT8 *victnine_workram; struct _flstory_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * workram;
UINT8 * scrlram;
UINT8 * spriteram;
// UINT8 * paletteram; // currently this uses generic palette handling
// UINT8 * paletteram_2; // currently this uses generic palette handling
/* video-related */
tilemap *bg_tilemap;
int char_bank, palette_bank, flipscreen, gfxctrl;
/* sound-related */
UINT8 snd_data;
UINT8 snd_flag;
int sound_nmi_enable, pending_nmi;
int vol_ctrl[16];
UINT8 snd_ctrl0;
UINT8 snd_ctrl1;
UINT8 snd_ctrl2;
UINT8 snd_ctrl3;
/* protection */
UINT8 from_main, from_mcu;
int mcu_sent, main_sent;
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;
int mcu_select;
/* devices */
const device_config *maincpu;
const device_config *audiocpu;
const device_config *mcu;
};
/*----------- defined in machine/flstory.c -----------*/ /*----------- defined in machine/flstory.c -----------*/
READ8_HANDLER( flstory_68705_portA_r ); READ8_HANDLER( flstory_68705_port_a_r );
WRITE8_HANDLER( flstory_68705_portA_w ); WRITE8_HANDLER( flstory_68705_port_a_w );
READ8_HANDLER( flstory_68705_portB_r ); READ8_HANDLER( flstory_68705_port_b_r );
WRITE8_HANDLER( flstory_68705_portB_w ); WRITE8_HANDLER( flstory_68705_port_b_w );
READ8_HANDLER( flstory_68705_portC_r ); READ8_HANDLER( flstory_68705_port_c_r );
WRITE8_HANDLER( flstory_68705_portC_w ); WRITE8_HANDLER( flstory_68705_port_c_w );
WRITE8_HANDLER( flstory_68705_ddrA_w ); WRITE8_HANDLER( flstory_68705_ddr_a_w );
WRITE8_HANDLER( flstory_68705_ddrB_w ); WRITE8_HANDLER( flstory_68705_ddr_b_w );
WRITE8_HANDLER( flstory_68705_ddrC_w ); WRITE8_HANDLER( flstory_68705_ddr_c_w );
WRITE8_HANDLER( flstory_mcu_w ); WRITE8_HANDLER( flstory_mcu_w );
READ8_HANDLER( flstory_mcu_r ); READ8_HANDLER( flstory_mcu_r );
READ8_HANDLER( flstory_mcu_status_r ); READ8_HANDLER( flstory_mcu_status_r );
@ -28,8 +63,6 @@ READ8_HANDLER( victnine_mcu_status_r );
/*----------- defined in video/flstory.c -----------*/ /*----------- defined in video/flstory.c -----------*/
extern UINT8 *flstory_scrlram;
VIDEO_START( flstory ); VIDEO_START( flstory );
VIDEO_UPDATE( flstory ); VIDEO_UPDATE( flstory );
VIDEO_START( victnine ); VIDEO_START( victnine );

View File

@ -0,0 +1,26 @@
typedef struct _funkybee_state funkybee_state;
struct _funkybee_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * colorram;
/* video-related */
tilemap *bg_tilemap;
int gfx_bank;
};
/*----------- defined in video/funkybee.c -----------*/
WRITE8_HANDLER( funkybee_videoram_w );
WRITE8_HANDLER( funkybee_colorram_w );
WRITE8_HANDLER( funkybee_gfx_bank_w );
WRITE8_HANDLER( funkybee_scroll_w );
WRITE8_HANDLER( funkybee_flipscreen_w );
PALETTE_INIT( funkybee );
VIDEO_START( funkybee );
VIDEO_UPDATE( funkybee );

View File

@ -10,10 +10,6 @@
#include "driver.h" #include "driver.h"
#include "includes/flstory.h" #include "includes/flstory.h"
static UINT8 from_main,from_mcu;
static int mcu_sent = 0,main_sent = 0;
/*************************************************************************** /***************************************************************************
Fairy Land Story 68705 protection interface Fairy Land Story 68705 protection interface
@ -24,23 +20,26 @@ static int mcu_sent = 0,main_sent = 0;
***************************************************************************/ ***************************************************************************/
static UINT8 portA_in,portA_out,ddrA; READ8_HANDLER( flstory_68705_port_a_r )
READ8_HANDLER( flstory_68705_portA_r )
{ {
//logerror("%04x: 68705 port A read %02x\n",cpu_get_pc(space->cpu),portA_in); flstory_state *state = (flstory_state *)space->machine->driver_data;
return (portA_out & ddrA) | (portA_in & ~ddrA);
//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( flstory_68705_portA_w ) WRITE8_HANDLER( flstory_68705_port_a_w )
{ {
//logerror("%04x: 68705 port A write %02x\n",cpu_get_pc(space->cpu),data); flstory_state *state = (flstory_state *)space->machine->driver_data;
portA_out = data;
//logerror("%04x: 68705 port A write %02x\n", cpu_get_pc(space->cpu), data);
state->port_a_out = data;
} }
WRITE8_HANDLER( flstory_68705_ddrA_w ) WRITE8_HANDLER( flstory_68705_ddr_a_w )
{ {
ddrA = data; flstory_state *state = (flstory_state *)space->machine->driver_data;
state->ddr_a = data;
} }
@ -54,123 +53,139 @@ WRITE8_HANDLER( flstory_68705_ddrA_w )
* 2 W when 0->1, copies port A to the latch for the main CPU * 2 W when 0->1, copies port A to the latch for the main CPU
*/ */
static UINT8 portB_in,portB_out,ddrB; READ8_HANDLER( flstory_68705_port_b_r )
READ8_HANDLER( flstory_68705_portB_r )
{ {
return (portB_out & ddrB) | (portB_in & ~ddrB); flstory_state *state = (flstory_state *)space->machine->driver_data;
return (state->port_b_out & state->ddr_b) | (state->port_b_in & ~state->ddr_b);
} }
WRITE8_HANDLER( flstory_68705_portB_w ) WRITE8_HANDLER( flstory_68705_port_b_w )
{ {
//logerror("%04x: 68705 port B write %02x\n",cpu_get_pc(space->cpu),data); flstory_state *state = (flstory_state *)space->machine->driver_data;
//logerror("%04x: 68705 port B write %02x\n",cpu_get_pc(space->cpu),data);
if ((ddrB & 0x02) && (~data & 0x02) && (portB_out & 0x02)) if ((state->ddr_b & 0x02) && (~data & 0x02) && (state->port_b_out & 0x02))
{ {
portA_in = from_main; state->port_a_in = state->from_main;
if (main_sent) if (state->main_sent)
cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE); cpu_set_input_line(state->mcu, 0, CLEAR_LINE);
main_sent = 0; state->main_sent = 0;
logerror("read command %02x from main cpu\n", portA_in); logerror("read command %02x from main cpu\n", state->port_a_in);
} }
if ((ddrB & 0x04) && (data & 0x04) && (~portB_out & 0x04)) if ((state->ddr_b & 0x04) && (data & 0x04) && (~state->port_b_out & 0x04))
{ {
logerror("send command %02x to main cpu\n", portA_out); logerror("send command %02x to main cpu\n", state->port_a_out);
from_mcu = portA_out; state->from_mcu = state->port_a_out;
mcu_sent = 1; state->mcu_sent = 1;
} }
portB_out = data; state->port_b_out = data;
} }
WRITE8_HANDLER( flstory_68705_ddrB_w ) WRITE8_HANDLER( flstory_68705_ddr_b_w )
{ {
ddrB = data; flstory_state *state = (flstory_state *)space->machine->driver_data;
state->ddr_b = data;
} }
static UINT8 portC_in,portC_out,ddrC; READ8_HANDLER( flstory_68705_port_c_r )
READ8_HANDLER( flstory_68705_portC_r )
{ {
portC_in = 0; flstory_state *state = (flstory_state *)space->machine->driver_data;
if (main_sent) portC_in |= 0x01;
if (!mcu_sent) portC_in |= 0x02; state->port_c_in = 0;
//logerror("%04x: 68705 port C read %02x\n", cpu_get_pc(space->cpu), portC_in); if (state->main_sent)
return (portC_out & ddrC) | (portC_in & ~ddrC); state->port_c_in |= 0x01;
if (!state->mcu_sent)
state->port_c_in |= 0x02;
//logerror("%04x: 68705 port C read %02x\n", cpu_get_pc(space->cpu), port_c_in);
return (state->port_c_out & state->ddr_c) | (state->port_c_in & ~state->ddr_c);
} }
WRITE8_HANDLER( flstory_68705_portC_w ) WRITE8_HANDLER( flstory_68705_port_c_w )
{ {
logerror("%04x: 68705 port C write %02x\n", cpu_get_pc(space->cpu), data); flstory_state *state = (flstory_state *)space->machine->driver_data;
portC_out = data; logerror("%04x: 68705 port C write %02x\n", cpu_get_pc(space->cpu), data);
state->port_c_out = data;
} }
WRITE8_HANDLER( flstory_68705_ddrC_w ) WRITE8_HANDLER( flstory_68705_ddr_c_w )
{ {
ddrC = data; flstory_state *state = (flstory_state *)space->machine->driver_data;
state->ddr_c = data;
} }
WRITE8_HANDLER( flstory_mcu_w ) WRITE8_HANDLER( flstory_mcu_w )
{ {
logerror("%04x: mcu_w %02x\n", cpu_get_pc(space->cpu), data); flstory_state *state = (flstory_state *)space->machine->driver_data;
from_main = data;
main_sent = 1; logerror("%04x: mcu_w %02x\n", cpu_get_pc(space->cpu), data);
cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE); state->from_main = data;
state->main_sent = 1;
cpu_set_input_line(state->mcu, 0, ASSERT_LINE);
} }
READ8_HANDLER( flstory_mcu_r ) READ8_HANDLER( flstory_mcu_r )
{ {
logerror("%04x: mcu_r %02x\n",cpu_get_pc(space->cpu), from_mcu); flstory_state *state = (flstory_state *)space->machine->driver_data;
mcu_sent = 0;
return from_mcu; logerror("%04x: mcu_r %02x\n",cpu_get_pc(space->cpu), state->from_mcu);
state->mcu_sent = 0;
return state->from_mcu;
} }
READ8_HANDLER( flstory_mcu_status_r ) READ8_HANDLER( flstory_mcu_status_r )
{ {
flstory_state *state = (flstory_state *)space->machine->driver_data;
int res = 0; int res = 0;
/* bit 0 = when 1, mcu is ready to receive data from main cpu */ /* bit 0 = when 1, mcu is ready to receive data from main cpu */
/* bit 1 = when 1, mcu has sent data to the main cpu */ /* bit 1 = when 1, mcu has sent data to the main cpu */
//logerror("%04x: mcu_status_r\n", cpu_get_pc(space->cpu)); //logerror("%04x: mcu_status_r\n", cpu_get_pc(space->cpu));
if (!main_sent) res |= 0x01; if (!state->main_sent)
if (mcu_sent) res |= 0x02; res |= 0x01;
if (state->mcu_sent)
res |= 0x02;
return res; return res;
} }
WRITE8_HANDLER( onna34ro_mcu_w ) WRITE8_HANDLER( onna34ro_mcu_w )
{ {
UINT16 score_adr = onna34ro_workram[0x29e] * 0x100 + onna34ro_workram[0x29d]; flstory_state *state = (flstory_state *)space->machine->driver_data;
UINT16 score_adr = state->workram[0x29e] * 0x100 + state->workram[0x29d];
switch (data) switch (data)
{ {
case 0x0e: case 0x0e:
from_mcu = 0xff; state->from_mcu = 0xff;
break; break;
case 0x01: case 0x01:
from_mcu = 0x6a; state->from_mcu = 0x6a;
break; break;
case 0x40: case 0x40:
if(score_adr >= 0xe000 && score_adr < 0xe800) if(score_adr >= 0xe000 && score_adr < 0xe800)
from_mcu = onna34ro_workram[score_adr - 0xe000]; /* score l*/ state->from_mcu = state->workram[score_adr - 0xe000]; /* score l*/
break; break;
case 0x41: case 0x41:
if(score_adr >= 0xe000 && score_adr < 0xe800) if(score_adr >= 0xe000 && score_adr < 0xe800)
from_mcu = onna34ro_workram[(score_adr+1) - 0xe000]; /* score m*/ state->from_mcu = state->workram[(score_adr + 1) - 0xe000]; /* score m*/
break; break;
case 0x42: case 0x42:
if(score_adr >= 0xe000 && score_adr < 0xe800) if(score_adr >= 0xe000 && score_adr < 0xe800)
from_mcu = onna34ro_workram[(score_adr+2) - 0xe000] & 0x0f; /* score h*/ state->from_mcu = state->workram[(score_adr + 2) - 0xe000] & 0x0f; /* score h*/
break; break;
default: default:
from_mcu = 0x80; state->from_mcu = 0x80;
} }
} }
READ8_HANDLER( onna34ro_mcu_r ) READ8_HANDLER( onna34ro_mcu_r )
{ {
return from_mcu; flstory_state *state = (flstory_state *)space->machine->driver_data;
return state->from_mcu;
} }
READ8_HANDLER( onna34ro_mcu_status_r ) READ8_HANDLER( onna34ro_mcu_status_r )
@ -181,7 +196,7 @@ READ8_HANDLER( onna34ro_mcu_status_r )
} }
#define VICTNINE_MCU_SEED (victnine_workram[0x685]) #define VICTNINE_MCU_SEED (state->workram[0x685])
static const UINT8 victnine_mcu_data[0x100] = static const UINT8 victnine_mcu_data[0x100] =
{ {
@ -219,15 +234,14 @@ static const UINT8 victnine_mcu_data[0x100] =
0x06, 0x07, 0x02, 0x03, 0x15, 0x17, 0x11, 0x13 0x06, 0x07, 0x02, 0x03, 0x15, 0x17, 0x11, 0x13
}; };
static int mcu_select = 0;
WRITE8_HANDLER( victnine_mcu_w ) WRITE8_HANDLER( victnine_mcu_w )
{ {
flstory_state *state = (flstory_state *)space->machine->driver_data;
UINT8 seed = VICTNINE_MCU_SEED; UINT8 seed = VICTNINE_MCU_SEED;
if (!seed && (data & 0x37) == 0x37) if (!seed && (data & 0x37) == 0x37)
{ {
from_mcu = 0xa6; state->from_mcu = 0xa6;
logerror("mcu initialize (%02x)\n", data); logerror("mcu initialize (%02x)\n", data);
} }
else else
@ -236,19 +250,19 @@ WRITE8_HANDLER( victnine_mcu_w )
if ((data & ~0x1f) == 0xa0) if ((data & ~0x1f) == 0xa0)
{ {
mcu_select = data & 0x1f; state->mcu_select = data & 0x1f;
//logerror("mcu select: 0x%02x\n", mcu_select); //logerror("mcu select: 0x%02x\n", state->mcu_select);
} }
else if (data < 0x20) else if (data < 0x20)
{ {
int offset = mcu_select * 8 + data; int offset = state->mcu_select * 8 + data;
//logerror("mcu fetch: 0x%02x\n", offset); //logerror("mcu fetch: 0x%02x\n", offset);
from_mcu = victnine_mcu_data[offset]; state->from_mcu = victnine_mcu_data[offset];
} }
else if (data >= 0x38 && data <= 0x3a) else if (data >= 0x38 && data <= 0x3a)
{ {
from_mcu = victnine_workram[0x691 - 0x38 + data]; state->from_mcu = state->workram[0x691 - 0x38 + data];
} }
else else
{ {
@ -259,9 +273,10 @@ WRITE8_HANDLER( victnine_mcu_w )
READ8_HANDLER( victnine_mcu_r ) READ8_HANDLER( victnine_mcu_r )
{ {
//logerror("%04x: mcu read (0x%02x)\n", cpu_get_previouspc(space->cpu), from_mcu); flstory_state *state = (flstory_state *)space->machine->driver_data;
//logerror("%04x: mcu read (0x%02x)\n", cpu_get_previouspc(space->cpu), state->from_mcu);
return from_mcu - VICTNINE_MCU_SEED; return state->from_mcu - VICTNINE_MCU_SEED;
} }
READ8_HANDLER( victnine_mcu_status_r ) READ8_HANDLER( victnine_mcu_status_r )

View File

@ -407,7 +407,7 @@ $(MAMEOBJ)/atari.a: \
$(DRIVERS)/eprom.o $(VIDEO)/eprom.o \ $(DRIVERS)/eprom.o $(VIDEO)/eprom.o \
$(DRIVERS)/firefox.o \ $(DRIVERS)/firefox.o \
$(DRIVERS)/firetrk.o $(AUDIO)/firetrk.o $(VIDEO)/firetrk.o \ $(DRIVERS)/firetrk.o $(AUDIO)/firetrk.o $(VIDEO)/firetrk.o \
$(DRIVERS)/flyball.o $(VIDEO)/flyball.o \ $(DRIVERS)/flyball.o \
$(DRIVERS)/foodf.o $(VIDEO)/foodf.o \ $(DRIVERS)/foodf.o $(VIDEO)/foodf.o \
$(DRIVERS)/gauntlet.o $(VIDEO)/gauntlet.o \ $(DRIVERS)/gauntlet.o $(VIDEO)/gauntlet.o \
$(DRIVERS)/harddriv.o $(MACHINE)/harddriv.o $(AUDIO)/harddriv.o $(VIDEO)/harddriv.o \ $(DRIVERS)/harddriv.o $(MACHINE)/harddriv.o $(AUDIO)/harddriv.o $(VIDEO)/harddriv.o \

View File

@ -3,19 +3,17 @@
#include "driver.h" #include "driver.h"
#include "includes/fitfight.h" #include "includes/fitfight.h"
static tilemap *fof_bak_tilemap;
static tilemap *fof_mid_tilemap;
static tilemap *fof_txt_tilemap;
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int layer ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int layer )
{ {
fitfight_state *state = (fitfight_state *)machine->driver_data;
const gfx_element *gfx = machine->gfx[3]; const gfx_element *gfx = machine->gfx[3];
UINT16 *source = fitfight_spriteram; UINT16 *source = state->spriteram;
UINT16 *finish = source + 0x800/2; UINT16 *finish = source + 0x800 / 2;
while( source<finish ) while (source < finish)
{ {
int xpos, ypos, number,xflip,yflip, end, colr, prio; int xpos, ypos, number, xflip, yflip, end, colr, prio;
ypos = source[0]; ypos = source[0];
xpos = source[3]; xpos = source[3];
@ -24,137 +22,151 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
yflip = (source[1] & 0x0002); yflip = (source[1] & 0x0002);
prio = (source[1] & 0x0400) >> 10; prio = (source[1] & 0x0400) >> 10;
colr = (source[1] & 0x00fc) >> 2; colr = (source[1] & 0x00fc) >> 2;
if (bbprot_kludge==1) colr = (source[1] & 0x00f8) >> 3;
if (state->bbprot_kludge == 1)
colr = (source[1] & 0x00f8) >> 3;
end = source[0] & 0x8000; end = source[0] & 0x8000;
ypos = 0xff-ypos; ypos = 0xff - ypos;
xpos -=38;//48; xpos -= 38;//48;
ypos -=14;//16; ypos -= 14;//16;
if (end) break; if (end) break;
if (prio == layer) if (prio == layer)
drawgfx_transpen(bitmap,cliprect,gfx,number,colr,xflip,yflip,xpos,ypos,0); drawgfx_transpen(bitmap, cliprect, gfx, number, colr, xflip, yflip, xpos, ypos, 0);
source+=4; source += 4;
} }
} }
static TILE_GET_INFO( get_fof_bak_tile_info ) static TILE_GET_INFO( get_fof_bak_tile_info )
{ {
int code = fof_bak_tileram[tile_index*2+1]; fitfight_state *state = (fitfight_state *)machine->driver_data;
int colr = fof_bak_tileram[tile_index*2] & 0x1f; int code = state->fof_bak_tileram[tile_index * 2 + 1];
int xflip = (fof_bak_tileram[tile_index*2] & 0x0020)>>5; int colr = state->fof_bak_tileram[tile_index * 2] & 0x1f;
int xflip = (state->fof_bak_tileram[tile_index * 2] & 0x0020) >> 5;
xflip ^= 1; xflip ^= 1;
SET_TILE_INFO(2,code,colr,TILE_FLIPYX(xflip)); SET_TILE_INFO(2, code, colr, TILE_FLIPYX(xflip));
} }
WRITE16_HANDLER( fof_bak_tileram_w ) WRITE16_HANDLER( fof_bak_tileram_w )
{ {
COMBINE_DATA(&fof_bak_tileram[offset]); fitfight_state *state = (fitfight_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(fof_bak_tilemap,offset/2);
COMBINE_DATA(&state->fof_bak_tileram[offset]);
tilemap_mark_tile_dirty(state->fof_bak_tilemap, offset / 2);
} }
static TILE_GET_INFO( get_fof_mid_tile_info ) static TILE_GET_INFO( get_fof_mid_tile_info )
{ {
int code = fof_mid_tileram[tile_index*2+1]; fitfight_state *state = (fitfight_state *)machine->driver_data;
int colr = fof_mid_tileram[tile_index*2] & 0x1f; int code = state->fof_mid_tileram[tile_index * 2 + 1];
int xflip = (fof_mid_tileram[tile_index*2] & 0x0020)>>5; int colr = state->fof_mid_tileram[tile_index * 2] & 0x1f;
int xflip = (state->fof_mid_tileram[tile_index * 2] & 0x0020) >> 5;
xflip ^= 1; xflip ^= 1;
SET_TILE_INFO(1,code,colr,TILE_FLIPYX(xflip)); SET_TILE_INFO(1, code, colr, TILE_FLIPYX(xflip));
} }
WRITE16_HANDLER( fof_mid_tileram_w ) WRITE16_HANDLER( fof_mid_tileram_w )
{ {
COMBINE_DATA(&fof_mid_tileram[offset]); fitfight_state *state = (fitfight_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(fof_mid_tilemap,offset/2); COMBINE_DATA(&state->fof_mid_tileram[offset]);
tilemap_mark_tile_dirty(state->fof_mid_tilemap, offset / 2);
} }
static TILE_GET_INFO( get_fof_txt_tile_info ) static TILE_GET_INFO( get_fof_txt_tile_info )
{ {
int code = fof_txt_tileram[tile_index*2+1]; fitfight_state *state = (fitfight_state *)machine->driver_data;
int colr = fof_txt_tileram[tile_index*2] & 0x1f; int code = state->fof_txt_tileram[tile_index * 2 + 1];
int xflip = (fof_txt_tileram[tile_index*2] & 0x0020)>>5; int colr = state->fof_txt_tileram[tile_index * 2] & 0x1f;
int xflip = (state->fof_txt_tileram[tile_index * 2] & 0x0020) >> 5;
xflip ^= 1; xflip ^= 1;
SET_TILE_INFO(0,code,colr,TILE_FLIPYX(xflip)); SET_TILE_INFO(0, code, colr, TILE_FLIPYX(xflip));
} }
WRITE16_HANDLER( fof_txt_tileram_w ) WRITE16_HANDLER( fof_txt_tileram_w )
{ {
COMBINE_DATA(&fof_txt_tileram[offset]); fitfight_state *state = (fitfight_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(fof_txt_tilemap,offset/2);
COMBINE_DATA(&state->fof_txt_tileram[offset]);
tilemap_mark_tile_dirty(state->fof_txt_tilemap, offset / 2);
} }
/* video start / update */ /* video start / update */
VIDEO_START(fitfight) VIDEO_START(fitfight)
{ {
fof_bak_tilemap = tilemap_create(machine, get_fof_bak_tile_info,tilemap_scan_cols,8,8,128, 32); fitfight_state *state = (fitfight_state *)machine->driver_data;
state->fof_bak_tilemap = tilemap_create(machine, get_fof_bak_tile_info, tilemap_scan_cols, 8, 8, 128, 32);
/* opaque */ /* opaque */
fof_mid_tilemap = tilemap_create(machine, get_fof_mid_tile_info,tilemap_scan_cols,8,8,128, 32); state->fof_mid_tilemap = tilemap_create(machine, get_fof_mid_tile_info, tilemap_scan_cols, 8, 8, 128, 32);
tilemap_set_transparent_pen(fof_mid_tilemap,0); tilemap_set_transparent_pen(state->fof_mid_tilemap, 0);
fof_txt_tilemap = tilemap_create(machine, get_fof_txt_tile_info,tilemap_scan_cols,8,8,128, 32); state->fof_txt_tilemap = tilemap_create(machine, get_fof_txt_tile_info, tilemap_scan_cols, 8, 8, 128, 32);
tilemap_set_transparent_pen(fof_txt_tilemap,0); tilemap_set_transparent_pen(state->fof_txt_tilemap, 0);
} }
VIDEO_UPDATE(fitfight) VIDEO_UPDATE(fitfight)
{ {
fitfight_state *state = (fitfight_state *)screen->machine->driver_data;
/* scroll isn't right */ /* scroll isn't right */
int vblank; int vblank;
int scrollbak,scrollmid; int scrollbak, scrollmid;
vblank = (fof_700000[0] & 0x8000); vblank = (state->fof_700000[0] & 0x8000);
if (vblank > 0) if (vblank > 0)
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine)); bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
else { else {
// if (input_code_pressed(screen->machine, KEYCODE_Q)) // if (input_code_pressed(screen->machine, KEYCODE_Q))
// scrollbak = ((fof_a00000[0]&0xff00) >> 5) - ((fof_700000[0] & 0x0038) >> 3); // scrollbak = ((state->fof_a00000[0] & 0xff00) >> 5) - ((state->fof_700000[0] & 0x0038) >> 3);
// else if (input_code_pressed(screen->machine, KEYCODE_W)) // else if (input_code_pressed(screen->machine, KEYCODE_W))
// scrollbak = ((fof_a00000[0]&0xff00) >> 5) + ((fof_700000[0] & 0x01c0) >> 6); // scrollbak = ((state->fof_a00000[0] & 0xff00) >> 5) + ((state->fof_700000[0] & 0x01c0) >> 6);
// else if (input_code_pressed(screen->machine, KEYCODE_E)) // else if (input_code_pressed(screen->machine, KEYCODE_E))
// scrollbak = ((fof_a00000[0]&0xff00) >> 5) - ((fof_700000[0] & 0x01c0) >> 6); // scrollbak = ((state->fof_a00000[0] & 0xff00) >> 5) - ((state->fof_700000[0] & 0x01c0) >> 6);
// else if (input_code_pressed(screen->machine, KEYCODE_R)) // else if (input_code_pressed(screen->machine, KEYCODE_R))
// scrollbak = ((fof_a00000[0]&0xff00) >> 5) + ((fof_700000[0] & 0x0038) >> 3); // scrollbak = ((state->fof_a00000[0] & 0xff00) >> 5) + ((state->fof_700000[0] & 0x0038) >> 3);
// else // else
scrollbak = ((fof_a00000[0]&0xff00) >> 5); scrollbak = ((state->fof_a00000[0] & 0xff00) >> 5);
tilemap_set_scrollx(fof_bak_tilemap,0, scrollbak ); tilemap_set_scrollx(state->fof_bak_tilemap,0, scrollbak );
tilemap_set_scrolly(fof_bak_tilemap,0, fof_a00000[0]&0xff); tilemap_set_scrolly(state->fof_bak_tilemap,0, state->fof_a00000[0] & 0xff);
tilemap_draw(bitmap,cliprect,fof_bak_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->fof_bak_tilemap, 0, 0);
draw_sprites(screen->machine,bitmap,cliprect,0); draw_sprites(screen->machine, bitmap, cliprect, 0);
// if (input_code_pressed(screen->machine, KEYCODE_A)) // if (input_code_pressed(screen->machine, KEYCODE_A))
// scrollmid = ((fof_900000[0]&0xff00) >> 5) - ((fof_700000[0] & 0x01c0) >> 6); // scrollmid = ((state->fof_900000[0] & 0xff00) >> 5) - ((state->fof_700000[0] & 0x01c0) >> 6);
// else if (input_code_pressed(screen->machine, KEYCODE_S)) // else if (input_code_pressed(screen->machine, KEYCODE_S))
// scrollmid = ((fof_900000[0]&0xff00) >> 5) + ((fof_700000[0] & 0x0038) >> 3); // scrollmid = ((state->fof_900000[0] & 0xff00) >> 5) + ((state->fof_700000[0] & 0x0038) >> 3);
// else if (input_code_pressed(screen->machine, KEYCODE_D)) // else if (input_code_pressed(screen->machine, KEYCODE_D))
// scrollmid = ((fof_900000[0]&0xff00) >> 5) - ((fof_700000[0] & 0x0038) >> 3); // scrollmid = ((state->fof_900000[0] & 0xff00) >> 5) - ((state->fof_700000[0] & 0x0038) >> 3);
// else if (input_code_pressed(screen->machine, KEYCODE_F)) // else if (input_code_pressed(screen->machine, KEYCODE_F))
// scrollmid = ((fof_900000[0]&0xff00) >> 5) + ((fof_700000[0] & 0x01c0) >> 6); // scrollmid = ((state->fof_900000[0] & 0xff00) >> 5) + ((state->fof_700000[0] & 0x01c0) >> 6);
// else // else
scrollmid = ((fof_900000[0]&0xff00) >> 5); scrollmid = ((state->fof_900000[0] & 0xff00) >> 5);
tilemap_set_scrollx(fof_mid_tilemap,0, scrollmid ); tilemap_set_scrollx(state->fof_mid_tilemap, 0, scrollmid );
tilemap_set_scrolly(fof_mid_tilemap,0, fof_900000[0]&0xff); tilemap_set_scrolly(state->fof_mid_tilemap, 0, state->fof_900000[0] & 0xff);
// if (!input_code_pressed(screen->machine, KEYCODE_F)) // if (!input_code_pressed(screen->machine, KEYCODE_F))
tilemap_draw(bitmap,cliprect,fof_mid_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->fof_mid_tilemap, 0, 0);
draw_sprites(screen->machine,bitmap,cliprect,1); draw_sprites(screen->machine, bitmap, cliprect, 1);
tilemap_draw(bitmap,cliprect,fof_txt_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->fof_txt_tilemap, 0, 0);
} }
/* popmessage ("Regs %04x %04x %04x %04x %04x %04x", /* popmessage ("Regs %04x %04x %04x %04x %04x %04x",
fof_100000[0], fof_600000[0], fof_700000[0], state->fof_100000[0], state->fof_600000[0], state->fof_700000[0],
fof_800000[0], fof_900000[0], state->fof_800000[0], state->fof_900000[0],
fof_a00000[0] ); state->fof_a00000[0] );
*/ */
return 0; return 0;
} }

View File

@ -5,21 +5,16 @@
Functions to emulate the video hardware of the machine. Functions to emulate the video hardware of the machine.
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
#include "includes/flstory.h" #include "includes/flstory.h"
static tilemap *bg_tilemap;
static int char_bank,palette_bank,flipscreen,gfxctrl;
UINT8 *flstory_scrlram;
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
int code = videoram[tile_index*2]; flstory_state *state = (flstory_state *)machine->driver_data;
int attr = videoram[tile_index*2+1]; int code = state->videoram[tile_index * 2];
int tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * char_bank; int attr = state->videoram[tile_index * 2 + 1];
int tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * state->char_bank;
int flags = TILE_FLIPYX((attr & 0x18) >> 3); int flags = TILE_FLIPYX((attr & 0x18) >> 3);
tileinfo->category = (attr & 0x20) >> 5; tileinfo->category = (attr & 0x20) >> 5;
tileinfo->group = (attr & 0x20) >> 5; tileinfo->group = (attr & 0x20) >> 5;
@ -32,8 +27,9 @@ static TILE_GET_INFO( get_tile_info )
static TILE_GET_INFO( victnine_get_tile_info ) static TILE_GET_INFO( victnine_get_tile_info )
{ {
int code = videoram[tile_index*2]; flstory_state *state = (flstory_state *)machine->driver_data;
int attr = videoram[tile_index*2+1]; int code = state->videoram[tile_index * 2];
int attr = state->videoram[tile_index * 2 + 1];
int tile_number = ((attr & 0x38) << 5) + code; int tile_number = ((attr & 0x38) << 5) + code;
int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0); int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0);
@ -47,115 +43,129 @@ static TILE_GET_INFO( victnine_get_tile_info )
VIDEO_START( flstory ) VIDEO_START( flstory )
{ {
bg_tilemap = tilemap_create( machine, get_tile_info,tilemap_scan_rows,8,8,32,32 ); flstory_state *state = (flstory_state *)machine->driver_data;
// tilemap_set_transparent_pen( bg_tilemap,15 ); state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transmask(bg_tilemap,0,0x3fff,0xc000); /* split type 0 has pens 0-13 transparent in front half */ // tilemap_set_transparent_pen(state->bg_tilemap, 15);
tilemap_set_transmask(bg_tilemap,1,0x8000,0x7fff); /* split type 1 has pen 15 transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 0, 0x3fff, 0xc000); /* split type 0 has pens 0-13 transparent in front half */
tilemap_set_scroll_cols(bg_tilemap,32); tilemap_set_transmask(state->bg_tilemap, 1, 0x8000, 0x7fff); /* split type 1 has pen 15 transparent in front half */
tilemap_set_scroll_cols(state->bg_tilemap, 32);
paletteram = auto_alloc_array(machine, UINT8, 0x200); paletteram = auto_alloc_array(machine, UINT8, 0x200);
paletteram_2 = auto_alloc_array(machine, UINT8, 0x200); paletteram_2 = auto_alloc_array(machine, UINT8, 0x200);
state_save_register_global_pointer(machine, paletteram, 0x200);
state_save_register_global_pointer(machine, paletteram_2, 0x200);
} }
VIDEO_START( victnine ) VIDEO_START( victnine )
{ {
bg_tilemap = tilemap_create( machine, victnine_get_tile_info,tilemap_scan_rows,8,8,32,32 ); flstory_state *state = (flstory_state *)machine->driver_data;
tilemap_set_scroll_cols(bg_tilemap,32); state->bg_tilemap = tilemap_create(machine, victnine_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(state->bg_tilemap, 32);
paletteram = auto_alloc_array(machine, UINT8, 0x200); paletteram = auto_alloc_array(machine, UINT8, 0x200);
paletteram_2 = auto_alloc_array(machine, UINT8, 0x200); paletteram_2 = auto_alloc_array(machine, UINT8, 0x200);
state_save_register_global_pointer(machine, paletteram, 0x200);
state_save_register_global_pointer(machine, paletteram_2, 0x200);
} }
WRITE8_HANDLER( flstory_videoram_w ) WRITE8_HANDLER( flstory_videoram_w )
{ {
videoram[offset] = data; flstory_state *state = (flstory_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap,offset/2); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
} }
WRITE8_HANDLER( flstory_palette_w ) WRITE8_HANDLER( flstory_palette_w )
{ {
flstory_state *state = (flstory_state *)space->machine->driver_data;
if (offset & 0x100) if (offset & 0x100)
paletteram_xxxxBBBBGGGGRRRR_split2_w(space, (offset & 0xff) + (palette_bank << 8),data); paletteram_xxxxBBBBGGGGRRRR_split2_w(space, (offset & 0xff) + (state->palette_bank << 8),data);
else else
paletteram_xxxxBBBBGGGGRRRR_split1_w(space, (offset & 0xff) + (palette_bank << 8),data); paletteram_xxxxBBBBGGGGRRRR_split1_w(space, (offset & 0xff) + (state->palette_bank << 8),data);
} }
READ8_HANDLER( flstory_palette_r ) READ8_HANDLER( flstory_palette_r )
{ {
flstory_state *state = (flstory_state *)space->machine->driver_data;
if (offset & 0x100) if (offset & 0x100)
return paletteram_2[ (offset & 0xff) + (palette_bank << 8) ]; return paletteram_2[ (offset & 0xff) + (state->palette_bank << 8) ];
else else
return paletteram [ (offset & 0xff) + (palette_bank << 8) ]; return paletteram [ (offset & 0xff) + (state->palette_bank << 8) ];
} }
WRITE8_HANDLER( flstory_gfxctrl_w ) WRITE8_HANDLER( flstory_gfxctrl_w )
{ {
if (gfxctrl == data) flstory_state *state = (flstory_state *)space->machine->driver_data;
if (state->gfxctrl == data)
return; return;
gfxctrl = data; state->gfxctrl = data;
flipscreen = (~data & 0x01); state->flipscreen = (~data & 0x01);
if (char_bank != ((data & 0x10) >> 4)) if (state->char_bank != ((data & 0x10) >> 4))
{ {
char_bank = (data & 0x10) >> 4; state->char_bank = (data & 0x10) >> 4;
tilemap_mark_all_tiles_dirty(bg_tilemap); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
} }
palette_bank = (data & 0x20) >> 5; state->palette_bank = (data & 0x20) >> 5;
flip_screen_set(space->machine, flipscreen); flip_screen_set(space->machine, state->flipscreen);
//popmessage("%04x: gfxctrl = %02x\n",cpu_get_pc(space->cpu),data); //popmessage("%04x: gfxctrl = %02x\n", cpu_get_pc(space->cpu), data);
} }
READ8_HANDLER( victnine_gfxctrl_r ) READ8_HANDLER( victnine_gfxctrl_r )
{ {
return gfxctrl; flstory_state *state = (flstory_state *)space->machine->driver_data;
return state->gfxctrl;
} }
WRITE8_HANDLER( victnine_gfxctrl_w ) WRITE8_HANDLER( victnine_gfxctrl_w )
{ {
if (gfxctrl == data) flstory_state *state = (flstory_state *)space->machine->driver_data;
if (state->gfxctrl == data)
return; return;
gfxctrl = data; state->gfxctrl = data;
palette_bank = (data & 0x20) >> 5; state->palette_bank = (data & 0x20) >> 5;
if (data & 0x04) if (data & 0x04)
{ {
flipscreen = (data & 0x01); state->flipscreen = (data & 0x01);
flip_screen_set(space->machine, flipscreen); flip_screen_set(space->machine, state->flipscreen);
} }
//popmessage("%04x: gfxctrl = %02x\n",cpu_get_pc(space->cpu),data); //popmessage("%04x: gfxctrl = %02x\n", cpu_get_pc(space->cpu), data);
} }
WRITE8_HANDLER( flstory_scrlram_w ) WRITE8_HANDLER( flstory_scrlram_w )
{ {
flstory_scrlram[offset] = data; flstory_state *state = (flstory_state *)space->machine->driver_data;
tilemap_set_scrolly(bg_tilemap, offset, data ); state->scrlram[offset] = data;
tilemap_set_scrolly(state->bg_tilemap, offset, data);
} }
static void flstory_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri) static void flstory_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri )
{ {
flstory_state *state = (flstory_state *)machine->driver_data;
int i; int i;
for (i = 0; i < 0x20; i++) for (i = 0; i < 0x20; i++)
{ {
int pr = spriteram[spriteram_size-1 -i]; int pr = state->spriteram[spriteram_size - 1 - i];
int offs = (pr & 0x1f) * 4; int offs = (pr & 0x1f) * 4;
if ((pr & 0x80) == pri) if ((pr & 0x80) == pri)
{ {
int code,sx,sy,flipx,flipy; int code, sx, sy, flipx, flipy;
code = spriteram[offs+2] + ((spriteram[offs+1] & 0x30) << 4); code = state->spriteram[offs + 2] + ((state->spriteram[offs + 1] & 0x30) << 4);
sx = spriteram[offs+3]; sx = state->spriteram[offs + 3];
sy = spriteram[offs+0]; sy = state->spriteram[offs + 0];
if (flipscreen) if (state->flipscreen)
{ {
sx = (240 - sx) & 0xff ; sx = (240 - sx) & 0xff ;
sy = sy - 1 ; sy = sy - 1 ;
@ -163,19 +173,19 @@ static void flstory_draw_sprites(running_machine *machine, bitmap_t *bitmap, con
else else
sy = 240 - sy - 1 ; sy = 240 - sy - 1 ;
flipx = ((spriteram[offs+1]&0x40)>>6)^flipscreen; flipx = ((state->spriteram[offs + 1] & 0x40) >> 6) ^ state->flipscreen;
flipy = ((spriteram[offs+1]&0x80)>>7)^flipscreen; flipy = ((state->spriteram[offs + 1] & 0x80) >> 7) ^ state->flipscreen;
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
code, code,
spriteram[offs+1] & 0x0f, state->spriteram[offs + 1] & 0x0f,
flipx,flipy, flipx,flipy,
sx,sy,15); sx,sy,15);
/* wrap around */ /* wrap around */
if (sx > 240) if (sx > 240)
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
code, code,
spriteram[offs+1] & 0x0f, state->spriteram[offs + 1] & 0x0f,
flipx,flipy, flipx,flipy,
sx-256,sy,15); sx-256,sy,15);
} }
@ -184,33 +194,35 @@ static void flstory_draw_sprites(running_machine *machine, bitmap_t *bitmap, con
VIDEO_UPDATE( flstory ) VIDEO_UPDATE( flstory )
{ {
tilemap_draw(bitmap,cliprect,bg_tilemap,0|TILEMAP_DRAW_LAYER1,0); flstory_state *state = (flstory_state *)screen->machine->driver_data;
tilemap_draw(bitmap,cliprect,bg_tilemap,1|TILEMAP_DRAW_LAYER1,0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0 | TILEMAP_DRAW_LAYER1, 0);
flstory_draw_sprites(screen->machine,bitmap,cliprect,0x00); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 1 | TILEMAP_DRAW_LAYER1, 0);
tilemap_draw(bitmap,cliprect,bg_tilemap,0|TILEMAP_DRAW_LAYER0,0); flstory_draw_sprites(screen->machine, bitmap, cliprect, 0x00);
flstory_draw_sprites(screen->machine,bitmap,cliprect,0x80); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0 | TILEMAP_DRAW_LAYER0, 0);
tilemap_draw(bitmap,cliprect,bg_tilemap,1|TILEMAP_DRAW_LAYER0,0); flstory_draw_sprites(screen->machine, bitmap, cliprect, 0x80);
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 1 | TILEMAP_DRAW_LAYER0, 0);
return 0; return 0;
} }
static void victnine_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void victnine_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
flstory_state *state = (flstory_state *)machine->driver_data;
int i; int i;
for (i = 0; i < 0x20; i++) for (i = 0; i < 0x20; i++)
{ {
int pr = spriteram[spriteram_size-1 -i]; int pr = state->spriteram[spriteram_size - 1 - i];
int offs = (pr & 0x1f) * 4; int offs = (pr & 0x1f) * 4;
//if ((pr & 0x80) == pri) //if ((pr & 0x80) == pri)
{ {
int code,sx,sy,flipx,flipy; int code, sx, sy, flipx, flipy;
code = spriteram[offs+2] + ((spriteram[offs+1] & 0x20) << 3); code = state->spriteram[offs + 2] + ((state->spriteram[offs + 1] & 0x20) << 3);
sx = spriteram[offs+3]; sx = state->spriteram[offs + 3];
sy = spriteram[offs+0]; sy = state->spriteram[offs + 0];
if (flipscreen) if (state->flipscreen)
{ {
sx = (240 - sx + 1) & 0xff ; sx = (240 - sx + 1) & 0xff ;
sy = sy + 1 ; sy = sy + 1 ;
@ -218,19 +230,19 @@ static void victnine_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
else else
sy = 240 - sy + 1 ; sy = 240 - sy + 1 ;
flipx = ((spriteram[offs+1]&0x40)>>6)^flipscreen; flipx = ((state->spriteram[offs + 1] & 0x40) >> 6) ^ state->flipscreen;
flipy = ((spriteram[offs+1]&0x80)>>7)^flipscreen; flipy = ((state->spriteram[offs + 1] & 0x80) >> 7) ^ state->flipscreen;
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
code, code,
spriteram[offs+1] & 0x0f, state->spriteram[offs + 1] & 0x0f,
flipx,flipy, flipx,flipy,
sx,sy,15); sx,sy,15);
/* wrap around */ /* wrap around */
if (sx > 240) if (sx > 240)
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
code, code,
spriteram[offs+1] & 0x0f, state->spriteram[offs + 1] & 0x0f,
flipx,flipy, flipx,flipy,
sx-256,sy,15); sx-256,sy,15);
} }
@ -239,7 +251,8 @@ static void victnine_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
VIDEO_UPDATE( victnine ) VIDEO_UPDATE( victnine )
{ {
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); flstory_state *state = (flstory_state *)screen->machine->driver_data;
victnine_draw_sprites(screen->machine,bitmap,cliprect); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
victnine_draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }

View File

@ -1,89 +0,0 @@
/***************************************************************************
Atari Flyball video emulation
***************************************************************************/
#include "driver.h"
static tilemap* flyball_tilemap;
UINT8 flyball_pitcher_vert;
UINT8 flyball_pitcher_horz;
UINT8 flyball_pitcher_pic;
UINT8 flyball_ball_vert;
UINT8 flyball_ball_horz;
UINT8* flyball_playfield_ram;
static TILEMAP_MAPPER( flyball_get_memory_offset )
{
if (col == 0)
{
col = num_cols;
}
return num_cols * (num_rows - row) - col;
}
static TILE_GET_INFO( flyball_get_tile_info )
{
UINT8 data = flyball_playfield_ram[tile_index];
int flags =
((data & 0x40) ? TILE_FLIPX : 0) |
((data & 0x80) ? TILE_FLIPY : 0);
int code = data & 63;
if ((flags & TILE_FLIPX) && (flags & TILE_FLIPY))
{
code += 64;
}
SET_TILE_INFO(0, code, 0, flags);
}
VIDEO_START( flyball )
{
flyball_tilemap = tilemap_create(machine, flyball_get_tile_info,
flyball_get_memory_offset, 8, 16, 32, 16);
}
VIDEO_UPDATE( flyball )
{
int pitcherx = flyball_pitcher_horz;
int pitchery = flyball_pitcher_vert - 31;
int ballx = flyball_ball_horz - 1;
int bally = flyball_ball_vert - 17;
int x;
int y;
tilemap_mark_all_tiles_dirty(flyball_tilemap);
/* draw playfield */
tilemap_draw(bitmap, cliprect, flyball_tilemap, 0, 0);
/* draw pitcher */
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1], flyball_pitcher_pic ^ 0xf,
0, 1, 0, pitcherx, pitchery, 1);
/* draw ball */
for (y = bally; y < bally + 2; y++)
for (x = ballx; x < ballx + 2; x++)
if (x >= cliprect->min_x &&
x <= cliprect->max_x &&
y >= cliprect->min_y &&
y <= cliprect->max_y)
*BITMAP_ADDR16(bitmap, y, x) = 1;
return 0;
}

View File

@ -7,19 +7,16 @@
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
#include "funkybee.h"
static int gfx_bank;
static tilemap *bg_tilemap;
PALETTE_INIT( funkybee ) PALETTE_INIT( funkybee )
{ {
int i; int i;
/* first, the character/sprite palette */ /* first, the character/sprite palette */
for (i = 0;i < 32;i++) for (i = 0; i < 32; i++)
{ {
int bit0,bit1,bit2,r,g,b; int bit0, bit1, bit2, r, g, b;
/* red component */ /* red component */
bit0 = (*color_prom >> 0) & 0x01; bit0 = (*color_prom >> 0) & 0x01;
@ -37,35 +34,39 @@ PALETTE_INIT( funkybee )
bit2 = (*color_prom >> 7) & 0x01; bit2 = (*color_prom >> 7) & 0x01;
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette_set_color(machine,i,MAKE_RGB(r,g,b)); palette_set_color(machine, i, MAKE_RGB(r,g,b));
color_prom++; color_prom++;
} }
} }
WRITE8_HANDLER( funkybee_videoram_w ) WRITE8_HANDLER( funkybee_videoram_w )
{ {
videoram[offset] = data; funkybee_state *state = (funkybee_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
WRITE8_HANDLER( funkybee_colorram_w ) WRITE8_HANDLER( funkybee_colorram_w )
{ {
colorram[offset] = data; funkybee_state *state = (funkybee_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset); state->colorram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
WRITE8_HANDLER( funkybee_gfx_bank_w ) WRITE8_HANDLER( funkybee_gfx_bank_w )
{ {
if (gfx_bank != (data & 0x01)) funkybee_state *state = (funkybee_state *)space->machine->driver_data;
if (state->gfx_bank != (data & 0x01))
{ {
gfx_bank = data & 0x01; state->gfx_bank = data & 0x01;
tilemap_mark_all_tiles_dirty_all(space->machine); tilemap_mark_all_tiles_dirty_all(space->machine);
} }
} }
WRITE8_HANDLER( funkybee_scroll_w ) WRITE8_HANDLER( funkybee_scroll_w )
{ {
tilemap_set_scrollx(bg_tilemap, 0, flip_screen_get(space->machine) ? -data : data); funkybee_state *state = (funkybee_state *)space->machine->driver_data;
tilemap_set_scrollx(state->bg_tilemap, 0, flip_screen_get(space->machine) ? -data : data);
} }
WRITE8_HANDLER( funkybee_flipscreen_w ) WRITE8_HANDLER( funkybee_flipscreen_w )
@ -75,10 +76,11 @@ WRITE8_HANDLER( funkybee_flipscreen_w )
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
int code = videoram[tile_index] + ((colorram[tile_index] & 0x80) << 1); funkybee_state *state = (funkybee_state *)machine->driver_data;
int color = colorram[tile_index] & 0x03; int code = state->videoram[tile_index] + ((state->colorram[tile_index] & 0x80) << 1);
int color = state->colorram[tile_index] & 0x03;
SET_TILE_INFO(gfx_bank, code, color, 0); SET_TILE_INFO(state->gfx_bank, code, color, 0);
} }
static TILEMAP_MAPPER( funkybee_tilemap_scan ) static TILEMAP_MAPPER( funkybee_tilemap_scan )
@ -89,23 +91,25 @@ static TILEMAP_MAPPER( funkybee_tilemap_scan )
VIDEO_START( funkybee ) VIDEO_START( funkybee )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, funkybee_tilemap_scan, 8, 8, 32, 32); funkybee_state *state = (funkybee_state *)machine->driver_data;
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, funkybee_tilemap_scan, 8, 8, 32, 32);
} }
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 )
{ {
funkybee_state *state = (funkybee_state *)machine->driver_data;
int offs; int offs;
for (offs = 0x0f; offs >= 0; offs--) for (offs = 0x0f; offs >= 0; offs--)
{ {
int offs2 = offs + 0x1e00; int offs2 = offs + 0x1e00;
int attr = videoram[offs2]; int attr = state->videoram[offs2];
int code = (attr >> 2) | ((attr & 2) << 5); int code = (attr >> 2) | ((attr & 2) << 5);
int color = colorram[offs2 + 0x10]; int color = state->colorram[offs2 + 0x10];
int flipx = 0; int flipx = 0;
int flipy = attr & 0x01; int flipy = attr & 0x01;
int sx = videoram[offs2 + 0x10]; int sx = state->videoram[offs2 + 0x10];
int sy = 224 - colorram[offs2]; int sy = 224 - state->colorram[offs2];
if (flip_screen_get(machine)) if (flip_screen_get(machine))
{ {
@ -113,42 +117,43 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
flipx = !flipx; flipx = !flipx;
} }
drawgfx_transpen(bitmap,cliprect, machine->gfx[2+gfx_bank], drawgfx_transpen(bitmap,cliprect, machine->gfx[2 + state->gfx_bank],
code, color, code, color,
flipx, flipy, flipx, flipy,
sx, sy, 0); sx, sy, 0);
} }
} }
static void draw_columns(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void draw_columns( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
funkybee_state *state = (funkybee_state *)machine->driver_data;
int offs; int offs;
for (offs = 0x1f;offs >= 0;offs--) for (offs = 0x1f; offs >= 0; offs--)
{ {
int const flip = flip_screen_get(machine); int const flip = flip_screen_get(machine);
int code = videoram[0x1c00 + offs]; int code = state->videoram[0x1c00 + offs];
int color = colorram[0x1f10] & 0x03; int color = state->colorram[0x1f10] & 0x03;
int sx = flip ? videoram[0x1f1f] : videoram[0x1f10]; int sx = flip ? state->videoram[0x1f1f] : state->videoram[0x1f10];
int sy = offs * 8; int sy = offs * 8;
if (flip) if (flip)
sy = 248 - sy; sy = 248 - sy;
drawgfx_transpen(bitmap,cliprect,machine->gfx[gfx_bank], drawgfx_transpen(bitmap,cliprect,machine->gfx[state->gfx_bank],
code, color, code, color,
flip, flip, flip, flip,
sx, sy,0); sx, sy,0);
code = videoram[0x1d00 + offs]; code = state->videoram[0x1d00 + offs];
color = colorram[0x1f11] & 0x03; color = state->colorram[0x1f11] & 0x03;
sx = flip ? videoram[0x1f1e] : videoram[0x1f11]; sx = flip ? state->videoram[0x1f1e] : state->videoram[0x1f11];
sy = offs * 8; sy = offs * 8;
if (flip) if (flip)
sy = 248 - sy; sy = 248 - sy;
drawgfx_transpen(bitmap,cliprect,machine->gfx[gfx_bank], drawgfx_transpen(bitmap,cliprect,machine->gfx[state->gfx_bank],
code, color, code, color,
flip, flip, flip, flip,
sx, sy,0); sx, sy,0);
@ -157,7 +162,8 @@ static void draw_columns(running_machine *machine, bitmap_t *bitmap, const recta
VIDEO_UPDATE( funkybee ) VIDEO_UPDATE( funkybee )
{ {
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); funkybee_state *state = (funkybee_state *)screen->machine->driver_data;
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect); draw_sprites(screen->machine, bitmap, cliprect);
draw_columns(screen->machine, bitmap, cliprect); draw_columns(screen->machine, bitmap, cliprect);
return 0; return 0;