Not worth credit: added as complete as possible driver data struct to 1945kiii.c, actfancr.c, aquarium.c and ccastles.c.

some palette/sprite/nvram regions require generic handlers, and are commented out
This commit is contained in:
Fabio Priuli 2009-11-22 00:03:39 +00:00
parent 3045188af1
commit db53fd5203
11 changed files with 574 additions and 411 deletions

1
.gitattributes vendored
View File

@ -2294,6 +2294,7 @@ src/mame/includes/1943.h svneol=native#text/plain
src/mame/includes/20pacgal.h svneol=native#text/plain src/mame/includes/20pacgal.h svneol=native#text/plain
src/mame/includes/4enraya.h svneol=native#text/plain src/mame/includes/4enraya.h svneol=native#text/plain
src/mame/includes/8080bw.h svneol=native#text/plain src/mame/includes/8080bw.h svneol=native#text/plain
src/mame/includes/actfancr.h svneol=native#text/plain
src/mame/includes/aeroboto.h svneol=native#text/plain src/mame/includes/aeroboto.h svneol=native#text/plain
src/mame/includes/aerofgt.h svneol=native#text/plain src/mame/includes/aerofgt.h svneol=native#text/plain
src/mame/includes/ajax.h svneol=native#text/plain src/mame/includes/ajax.h svneol=native#text/plain

View File

@ -59,37 +59,54 @@ There are no static local variables.
#define MASTER_CLOCK XTAL_16MHz #define MASTER_CLOCK XTAL_16MHz
static UINT16* k3_spriteram_1;
static UINT16* k3_spriteram_2; typedef struct _k3_state k3_state;
static UINT16* k3_bgram; struct _k3_state
static tilemap *k3_bg_tilemap; {
/* memory pointers */
UINT16 * spriteram_1;
UINT16 * spriteram_2;
UINT16 * bgram;
// UINT16 * paletteram16; // currently this uses generic palette handling
/* video-related */
tilemap *bg_tilemap;
/* devices */
const device_config *oki1;
const device_config *oki2;
};
static WRITE16_HANDLER( k3_bgram_w ) static WRITE16_HANDLER( k3_bgram_w )
{ {
COMBINE_DATA(&k3_bgram[offset]); k3_state *state = (k3_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(k3_bg_tilemap,offset); COMBINE_DATA(&state->bgram[offset]);
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
static TILE_GET_INFO( get_k3_bg_tile_info ) static TILE_GET_INFO( get_k3_bg_tile_info )
{ {
int tileno; k3_state *state = (k3_state *)machine->driver_data;
tileno = k3_bgram[tile_index]; int tileno = state->bgram[tile_index];
SET_TILE_INFO(1,tileno,0,0); SET_TILE_INFO(1, tileno, 0, 0);
} }
static VIDEO_START(k3) static VIDEO_START(k3)
{ {
k3_bg_tilemap = tilemap_create(machine, get_k3_bg_tile_info,tilemap_scan_rows,16, 16, 32,64); k3_state *state = (k3_state *)machine->driver_data;
state->bg_tilemap = tilemap_create(machine, get_k3_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 64);
} }
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 )
{ {
k3_state *state = (k3_state *)machine->driver_data;
const gfx_element *gfx = machine->gfx[0]; const gfx_element *gfx = machine->gfx[0];
UINT16 *source = k3_spriteram_1; UINT16 *source = state->spriteram_1;
UINT16 *source2 = k3_spriteram_2; UINT16 *source2 = state->spriteram_2;
UINT16 *finish = source + 0x1000/2; UINT16 *finish = source + 0x1000 / 2;
while( source<finish ) while (source < finish)
{ {
int xpos, ypos; int xpos, ypos;
int tileno; int tileno;
@ -97,41 +114,44 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
ypos = (source[0] & 0x00ff) >> 0; ypos = (source[0] & 0x00ff) >> 0;
tileno = (source2[0] & 0x7ffe) >> 1; tileno = (source2[0] & 0x7ffe) >> 1;
xpos |= (source2[0] & 0x0001) << 8; xpos |= (source2[0] & 0x0001) << 8;
drawgfx_transpen(bitmap,cliprect,gfx, tileno,1,0,0,xpos,ypos,0); drawgfx_transpen(bitmap, cliprect, gfx, tileno, 1, 0, 0, xpos, ypos, 0);
drawgfx_transpen(bitmap,cliprect,gfx, tileno,1,0,0,xpos,ypos-0x100,0); // wrap drawgfx_transpen(bitmap, cliprect, gfx, tileno, 1, 0, 0, xpos, ypos - 0x100, 0); // wrap
drawgfx_transpen(bitmap,cliprect,gfx, tileno,1,0,0,xpos-0x200,ypos,0); // wrap drawgfx_transpen(bitmap, cliprect, gfx, tileno, 1, 0, 0, xpos - 0x200, ypos, 0); // wrap
drawgfx_transpen(bitmap,cliprect,gfx, tileno,1,0,0,xpos-0x200,ypos-0x100,0); // wrap drawgfx_transpen(bitmap, cliprect, gfx, tileno, 1, 0, 0, xpos - 0x200, ypos - 0x100, 0); // wrap
source++;source2++; source++;
source2++;
} }
} }
static VIDEO_UPDATE(k3) static VIDEO_UPDATE(k3)
{ {
tilemap_draw(bitmap,cliprect,k3_bg_tilemap,0,0); k3_state *state = (k3_state *)screen->machine->driver_data;
draw_sprites(screen->machine,bitmap,cliprect); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }
static WRITE16_HANDLER( k3_scrollx_w ) static WRITE16_HANDLER( k3_scrollx_w )
{ {
tilemap_set_scrollx( k3_bg_tilemap,0, data); k3_state *state = (k3_state *)space->machine->driver_data;
tilemap_set_scrollx(state->bg_tilemap, 0, data);
} }
static WRITE16_HANDLER( k3_scrolly_w ) static WRITE16_HANDLER( k3_scrolly_w )
{ {
tilemap_set_scrolly( k3_bg_tilemap,0, data); k3_state *state = (k3_state *)space->machine->driver_data;
tilemap_set_scrolly(state->bg_tilemap, 0, data);
} }
static WRITE16_HANDLER( k3_soundbanks_w ) static WRITE16_HANDLER( k3_soundbanks_w )
{ {
okim6295_set_bank_base(devtag_get_device(space->machine, "oki1"), (data & 4) ? 0x40000 : 0); k3_state *state = (k3_state *)space->machine->driver_data;
okim6295_set_bank_base(devtag_get_device(space->machine, "oki2"), (data & 2) ? 0x40000 : 0); okim6295_set_bank_base(state->oki1, (data & 4) ? 0x40000 : 0);
okim6295_set_bank_base(state->oki2, (data & 2) ? 0x40000 : 0);
} }
static ADDRESS_MAP_START( k3_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( k3_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x0009ce, 0x0009cf) AM_WRITENOP // bug in code? (clean up log) AM_RANGE(0x0009ce, 0x0009cf) AM_WRITENOP // bug in code? (clean up log)
AM_RANGE(0x0009d2, 0x0009d3) AM_WRITENOP // bug in code? (clean up log) AM_RANGE(0x0009d2, 0x0009d3) AM_WRITENOP // bug in code? (clean up log)
@ -139,9 +159,9 @@ static ADDRESS_MAP_START( k3_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM // Main Ram AM_RANGE(0x100000, 0x10ffff) AM_RAM // Main Ram
AM_RANGE(0x200000, 0x200fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE(&paletteram16) // palette AM_RANGE(0x200000, 0x200fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE(&paletteram16) // palette
AM_RANGE(0x240000, 0x240fff) AM_RAM AM_BASE(&k3_spriteram_1) AM_RANGE(0x240000, 0x240fff) AM_RAM AM_BASE_MEMBER(k3_state, spriteram_1)
AM_RANGE(0x280000, 0x280fff) AM_RAM AM_BASE(&k3_spriteram_2) AM_RANGE(0x280000, 0x280fff) AM_RAM AM_BASE_MEMBER(k3_state, spriteram_2)
AM_RANGE(0x2c0000, 0x2c0fff) AM_RAM_WRITE(k3_bgram_w) AM_BASE(&k3_bgram) AM_RANGE(0x2c0000, 0x2c0fff) AM_RAM_WRITE(k3_bgram_w) AM_BASE_MEMBER(k3_state, bgram)
AM_RANGE(0x340000, 0x340001) AM_WRITE(k3_scrollx_w) AM_RANGE(0x340000, 0x340001) AM_WRITE(k3_scrollx_w)
AM_RANGE(0x380000, 0x380001) AM_WRITE(k3_scrolly_w) AM_RANGE(0x380000, 0x380001) AM_WRITE(k3_scrolly_w)
AM_RANGE(0x3c0000, 0x3c0001) AM_WRITE(k3_soundbanks_w) AM_RANGE(0x3c0000, 0x3c0001) AM_WRITE(k3_soundbanks_w)
@ -179,7 +199,6 @@ static INPUT_PORTS_START( k3 )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0xfff0, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Are these used at all? */ PORT_BIT( 0xfff0, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Are these used at all? */
PORT_START("DSW") PORT_START("DSW")
PORT_DIPNAME( 0x007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3") PORT_DIPNAME( 0x007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
PORT_DIPSETTING( 0x0002, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x0002, DEF_STR( 5C_1C ) )
@ -234,13 +253,26 @@ static GFXDECODE_START( 1945kiii )
GFXDECODE_END GFXDECODE_END
static MACHINE_START( 1945kiii )
{
k3_state *state = (k3_state *)machine->driver_data;
state->oki1 = devtag_get_device(machine, "oki1");
state->oki2 = devtag_get_device(machine, "oki2");
}
static MACHINE_DRIVER_START( k3 ) static MACHINE_DRIVER_START( k3 )
/* driver data */
MDRV_DRIVER_DATA(k3_state)
MDRV_CPU_ADD("maincpu", M68000, MASTER_CLOCK) MDRV_CPU_ADD("maincpu", M68000, MASTER_CLOCK)
MDRV_CPU_PROGRAM_MAP(k3_map) MDRV_CPU_PROGRAM_MAP(k3_map)
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold) MDRV_CPU_VBLANK_INT("screen", irq4_line_hold)
MDRV_GFXDECODE(1945kiii) MDRV_MACHINE_START(1945kiii)
MDRV_GFXDECODE(1945kiii)
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)

View File

@ -28,33 +28,21 @@
#include "sound/2203intf.h" #include "sound/2203intf.h"
#include "sound/3812intf.h" #include "sound/3812intf.h"
#include "sound/okim6295.h" #include "sound/okim6295.h"
#include "actfancr.h"
VIDEO_UPDATE( actfancr );
VIDEO_UPDATE( triothep );
WRITE8_HANDLER( actfancr_pf1_data_w );
READ8_HANDLER( actfancr_pf1_data_r );
WRITE8_HANDLER( actfancr_pf1_control_w );
WRITE8_HANDLER( actfancr_pf2_data_w );
READ8_HANDLER( actfancr_pf2_data_r );
WRITE8_HANDLER( actfancr_pf2_control_w );
VIDEO_START( actfancr );
VIDEO_START( triothep );
extern UINT8 *actfancr_pf1_data,*actfancr_pf2_data,*actfancr_pf1_rowscroll_data;
static UINT8 *actfancr_ram;
/******************************************************************************/ /******************************************************************************/
static int trio_control_select;
static WRITE8_HANDLER( triothep_control_select_w ) static WRITE8_HANDLER( triothep_control_select_w )
{ {
trio_control_select=data; actfancr_state *state = (actfancr_state *)space->machine->driver_data;
state->trio_control_select = data;
} }
static READ8_HANDLER( triothep_control_r ) static READ8_HANDLER( triothep_control_r )
{ {
switch (trio_control_select) actfancr_state *state = (actfancr_state *)space->machine->driver_data;
switch (state->trio_control_select)
{ {
case 0: return input_port_read(space->machine, "P1"); case 0: return input_port_read(space->machine, "P1");
case 1: return input_port_read(space->machine, "P2"); case 1: return input_port_read(space->machine, "P2");
@ -68,7 +56,7 @@ static READ8_HANDLER( triothep_control_r )
static WRITE8_HANDLER( actfancr_sound_w ) static WRITE8_HANDLER( actfancr_sound_w )
{ {
soundlatch_w(space,0,data & 0xff); soundlatch_w(space, 0, data & 0xff);
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE);
} }
@ -77,9 +65,9 @@ static WRITE8_HANDLER( actfancr_sound_w )
static ADDRESS_MAP_START( actfan_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( actfan_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x000000, 0x02ffff) AM_ROM AM_RANGE(0x000000, 0x02ffff) AM_ROM
AM_RANGE(0x060000, 0x06001f) AM_WRITE(actfancr_pf1_control_w) AM_RANGE(0x060000, 0x06001f) AM_WRITE(actfancr_pf1_control_w)
AM_RANGE(0x062000, 0x063fff) AM_READWRITE(actfancr_pf1_data_r, actfancr_pf1_data_w) AM_BASE(&actfancr_pf1_data) AM_RANGE(0x062000, 0x063fff) AM_READWRITE(actfancr_pf1_data_r, actfancr_pf1_data_w) AM_BASE_MEMBER(actfancr_state, pf1_data)
AM_RANGE(0x070000, 0x07001f) AM_WRITE(actfancr_pf2_control_w) AM_RANGE(0x070000, 0x07001f) AM_WRITE(actfancr_pf2_control_w)
AM_RANGE(0x072000, 0x0727ff) AM_READWRITE(actfancr_pf2_data_r, actfancr_pf2_data_w) AM_BASE(&actfancr_pf2_data) AM_RANGE(0x072000, 0x0727ff) AM_READWRITE(actfancr_pf2_data_r, actfancr_pf2_data_w) AM_BASE_MEMBER(actfancr_state, pf2_data)
AM_RANGE(0x100000, 0x1007ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0x100000, 0x1007ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0x110000, 0x110001) AM_WRITE(buffer_spriteram_w) AM_RANGE(0x110000, 0x110001) AM_WRITE(buffer_spriteram_w)
AM_RANGE(0x120000, 0x1205ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE(&paletteram) AM_RANGE(0x120000, 0x1205ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE(&paletteram)
@ -89,23 +77,23 @@ static ADDRESS_MAP_START( actfan_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x130003, 0x130003) AM_READ_PORT("DSW2") AM_RANGE(0x130003, 0x130003) AM_READ_PORT("DSW2")
AM_RANGE(0x140000, 0x140001) AM_READ_PORT("SYSTEM") /* VBL */ AM_RANGE(0x140000, 0x140001) AM_READ_PORT("SYSTEM") /* VBL */
AM_RANGE(0x150000, 0x150001) AM_WRITE(actfancr_sound_w) AM_RANGE(0x150000, 0x150001) AM_WRITE(actfancr_sound_w)
AM_RANGE(0x1f0000, 0x1f3fff) AM_RAM AM_BASE(&actfancr_ram) /* Main ram */ AM_RANGE(0x1f0000, 0x1f3fff) AM_RAM AM_BASE_MEMBER(actfancr_state, main_ram) /* Main ram */
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( triothep_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( triothep_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x040000, 0x04001f) AM_WRITE(actfancr_pf2_control_w) AM_RANGE(0x040000, 0x04001f) AM_WRITE(actfancr_pf2_control_w)
AM_RANGE(0x044000, 0x045fff) AM_READWRITE(actfancr_pf2_data_r, actfancr_pf2_data_w) AM_BASE(&actfancr_pf2_data) AM_RANGE(0x044000, 0x045fff) AM_READWRITE(actfancr_pf2_data_r, actfancr_pf2_data_w) AM_BASE_MEMBER(actfancr_state, pf2_data)
AM_RANGE(0x046400, 0x0467ff) AM_WRITENOP /* Pf2 rowscroll - is it used? */ AM_RANGE(0x046400, 0x0467ff) AM_WRITENOP /* Pf2 rowscroll - is it used? */
AM_RANGE(0x060000, 0x06001f) AM_WRITE(actfancr_pf1_control_w) AM_RANGE(0x060000, 0x06001f) AM_WRITE(actfancr_pf1_control_w)
AM_RANGE(0x064000, 0x0647ff) AM_READWRITE(actfancr_pf1_data_r, actfancr_pf1_data_w) AM_BASE(&actfancr_pf1_data) AM_RANGE(0x064000, 0x0647ff) AM_READWRITE(actfancr_pf1_data_r, actfancr_pf1_data_w) AM_BASE_MEMBER(actfancr_state, pf1_data)
AM_RANGE(0x066400, 0x0667ff) AM_WRITEONLY AM_BASE(&actfancr_pf1_rowscroll_data) AM_RANGE(0x066400, 0x0667ff) AM_WRITEONLY AM_BASE_MEMBER(actfancr_state, pf1_rowscroll_data)
AM_RANGE(0x100000, 0x100001) AM_WRITE(actfancr_sound_w) AM_RANGE(0x100000, 0x100001) AM_WRITE(actfancr_sound_w)
AM_RANGE(0x110000, 0x110001) AM_WRITE(buffer_spriteram_w) AM_RANGE(0x110000, 0x110001) AM_WRITE(buffer_spriteram_w)
AM_RANGE(0x120000, 0x1207ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0x120000, 0x1207ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0x130000, 0x1305ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE(&paletteram) AM_RANGE(0x130000, 0x1305ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE(&paletteram)
AM_RANGE(0x140000, 0x140001) AM_READNOP /* Value doesn't matter */ AM_RANGE(0x140000, 0x140001) AM_READNOP /* Value doesn't matter */
AM_RANGE(0x1f0000, 0x1f3fff) AM_RAM AM_BASE(&actfancr_ram) /* Main ram */ AM_RANGE(0x1f0000, 0x1f3fff) AM_RAM AM_BASE_MEMBER(actfancr_state, main_ram) /* Main ram */
AM_RANGE(0x1ff000, 0x1ff001) AM_READWRITE(triothep_control_r, triothep_control_select_w) AM_RANGE(0x1ff000, 0x1ff001) AM_READWRITE(triothep_control_r, triothep_control_select_w)
AM_RANGE(0x1ff400, 0x1ff403) AM_WRITE(h6280_irq_status_w) AM_RANGE(0x1ff400, 0x1ff403) AM_WRITE(h6280_irq_status_w)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -288,13 +276,38 @@ static const ym3812_interface ym3812_config =
static MACHINE_START( triothep ) static MACHINE_START( triothep )
{ {
state_save_register_global(machine, trio_control_select); actfancr_state *state = (actfancr_state *)machine->driver_data;
state_save_register_global(machine, state->trio_control_select);
}
static MACHINE_RESET( actfancr )
{
actfancr_state *state = (actfancr_state *)machine->driver_data;
int i;
state->flipscreen = 0;
for (i = 0; i < 0x20; i++)
{
state->control_1[i] = 0;
state->control_2[i] = 0;
}
}
static MACHINE_RESET( triothep )
{
actfancr_state *state = (actfancr_state *)machine->driver_data;
MACHINE_RESET_CALL(actfancr);
state->trio_control_select = 0;
} }
/******************************************************************************/ /******************************************************************************/
static MACHINE_DRIVER_START( actfancr ) static MACHINE_DRIVER_START( actfancr )
/* driver data */
MDRV_DRIVER_DATA(actfancr_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu",H6280,21477200/3) /* Should be accurate */ MDRV_CPU_ADD("maincpu",H6280,21477200/3) /* Should be accurate */
MDRV_CPU_PROGRAM_MAP(actfan_map) MDRV_CPU_PROGRAM_MAP(actfan_map)
@ -303,6 +316,8 @@ static MACHINE_DRIVER_START( actfancr )
MDRV_CPU_ADD("audiocpu",M6502, 1500000) /* Should be accurate */ MDRV_CPU_ADD("audiocpu",M6502, 1500000) /* Should be accurate */
MDRV_CPU_PROGRAM_MAP(dec0_s_map) MDRV_CPU_PROGRAM_MAP(dec0_s_map)
MDRV_MACHINE_RESET(actfancr)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
@ -338,6 +353,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( triothep ) static MACHINE_DRIVER_START( triothep )
/* driver data */
MDRV_DRIVER_DATA(actfancr_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu",H6280,XTAL_21_4772MHz/3) /* XIN=21.4772Mhz, verified on pcb */ MDRV_CPU_ADD("maincpu",H6280,XTAL_21_4772MHz/3) /* XIN=21.4772Mhz, verified on pcb */
MDRV_CPU_PROGRAM_MAP(triothep_map) MDRV_CPU_PROGRAM_MAP(triothep_map)
@ -346,7 +364,8 @@ static MACHINE_DRIVER_START( triothep )
MDRV_CPU_ADD("audiocpu",M6502, XTAL_12MHz/8) /* verified on pcb */ MDRV_CPU_ADD("audiocpu",M6502, XTAL_12MHz/8) /* verified on pcb */
MDRV_CPU_PROGRAM_MAP(dec0_s_map) MDRV_CPU_PROGRAM_MAP(dec0_s_map)
MDRV_MACHINE_START(triothep) MDRV_MACHINE_START(triothep)
MDRV_MACHINE_RESET(triothep)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
@ -553,12 +572,15 @@ ROM_END
static READ8_HANDLER( cycle_r ) static READ8_HANDLER( cycle_r )
{ {
int pc=cpu_get_pc(space->cpu); actfancr_state *state = (actfancr_state *)space->machine->driver_data;
int ret=actfancr_ram[0x26]; int pc = cpu_get_pc(space->cpu);
int ret = state->main_ram[0x26];
if (offset==1) return actfancr_ram[0x27]; if (offset == 1)
return state->main_ram[0x27];
if (pc==0xe29a && ret==0) { if (pc == 0xe29a && ret == 0)
{
cpu_spinuntil_int(space->cpu); cpu_spinuntil_int(space->cpu);
return 1; return 1;
} }
@ -568,12 +590,15 @@ static READ8_HANDLER( cycle_r )
static READ8_HANDLER( cyclej_r ) static READ8_HANDLER( cyclej_r )
{ {
int pc=cpu_get_pc(space->cpu); actfancr_state *state = (actfancr_state *)space->machine->driver_data;
int ret=actfancr_ram[0x26]; int pc = cpu_get_pc(space->cpu);
int ret = state->main_ram[0x26];
if (offset==1) return actfancr_ram[0x27]; if (offset == 1)
return state->main_ram[0x27];
if (pc==0xe2b1 && ret==0) { if (pc == 0xe2b1 && ret == 0)
{
cpu_spinuntil_int(space->cpu); cpu_spinuntil_int(space->cpu);
return 1; return 1;
} }
@ -592,7 +617,6 @@ static DRIVER_INIT( actfancj )
} }
GAME( 1989, actfancr, 0, actfancr, actfancr, actfancr, ROT0, "Data East Corporation", "Act-Fancer Cybernetick Hyper Weapon (World revision 2)", GAME_SUPPORTS_SAVE ) GAME( 1989, actfancr, 0, actfancr, actfancr, actfancr, ROT0, "Data East Corporation", "Act-Fancer Cybernetick Hyper Weapon (World revision 2)", GAME_SUPPORTS_SAVE )
GAME( 1989, actfancr1,actfancr, actfancr, actfancr, actfancr, ROT0, "Data East Corporation", "Act-Fancer Cybernetick Hyper Weapon (World revision 1)", GAME_SUPPORTS_SAVE ) GAME( 1989, actfancr1,actfancr, actfancr, actfancr, actfancr, ROT0, "Data East Corporation", "Act-Fancer Cybernetick Hyper Weapon (World revision 1)", GAME_SUPPORTS_SAVE )
GAME( 1989, actfancrj,actfancr, actfancr, actfancr, actfancj, ROT0, "Data East Corporation", "Act-Fancer Cybernetick Hyper Weapon (Japan revision 1)", GAME_SUPPORTS_SAVE ) GAME( 1989, actfancrj,actfancr, actfancr, actfancr, actfancj, ROT0, "Data East Corporation", "Act-Fancer Cybernetick Hyper Weapon (Japan revision 1)", GAME_SUPPORTS_SAVE )

View File

@ -58,58 +58,52 @@ Stephh's notes (based on the game M68000 code and some tests) :
#define AQUARIUS_HACK 0 #define AQUARIUS_HACK 0
static int aquarium_snd_ack;
UINT16 *aquarium_scroll;
//UINT16 *aquarium_priority;
UINT16 *aquarium_txt_videoram;
UINT16 *aquarium_mid_videoram;
UINT16 *aquarium_bak_videoram;
#if AQUARIUS_HACK #if AQUARIUS_HACK
static MACHINE_RESET( aquarium ) static MACHINE_RESET( aquarium_hack )
{ {
UINT16 *RAM = (UINT16 *)memory_region(machine, "maincpu"); UINT16 *RAM = (UINT16 *)memory_region(machine, "maincpu");
int data = input_port_read(machine, "FAKE"); int data = input_port_read(machine, "FAKE");
/* Language : 0x0000 = Japanese - Other value = English */ /* Language : 0x0000 = Japanese - Other value = English */
RAM[0x000a5c/2] = data; RAM[0x000a5c / 2] = data;
} }
#endif #endif
static READ16_HANDLER( aquarium_coins_r ) static READ16_HANDLER( aquarium_coins_r )
{ {
aquarium_state *state = (aquarium_state *)space->machine->driver_data;
int data; int data;
data = (input_port_read(space->machine, "SYSTEM") & 0x7fff); data = (input_port_read(space->machine, "SYSTEM") & 0x7fff);
data |= aquarium_snd_ack; data |= state->aquarium_snd_ack;
aquarium_snd_ack = 0; state->aquarium_snd_ack = 0;
return data; return data;
} }
static WRITE8_HANDLER( aquarium_snd_ack_w ) static WRITE8_HANDLER( aquarium_snd_ack_w )
{ {
aquarium_snd_ack = 0x8000; aquarium_state *state = (aquarium_state *)space->machine->driver_data;
state->aquarium_snd_ack = 0x8000;
} }
static WRITE16_HANDLER( aquarium_sound_w ) static WRITE16_HANDLER( aquarium_sound_w )
{ {
// popmessage("sound write %04x",data); // popmessage("sound write %04x",data);
soundlatch_w(space,1,data&0xff); soundlatch_w(space, 1, data & 0xff);
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE ); cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE );
} }
static WRITE8_HANDLER( aquarium_z80_bank_w ) static WRITE8_HANDLER( aquarium_z80_bank_w )
{ {
int soundbank = ((data & 0x7) + 1) * 0x8000; memory_set_bank(space->machine, 1, data & 0x07);
UINT8 *Z80 = (UINT8 *)memory_region(space->machine, "audiocpu");
memory_set_bankptr(space->machine, 1, &Z80[soundbank + 0x10000]);
} }
static UINT8 aquarium_snd_bitswap(UINT8 scrambled_data) static UINT8 aquarium_snd_bitswap( UINT8 scrambled_data )
{ {
UINT8 data = 0; UINT8 data = 0;
@ -127,13 +121,13 @@ static UINT8 aquarium_snd_bitswap(UINT8 scrambled_data)
static READ8_DEVICE_HANDLER( aquarium_oki_r ) static READ8_DEVICE_HANDLER( aquarium_oki_r )
{ {
return (aquarium_snd_bitswap(okim6295_r(device,0)) ); return aquarium_snd_bitswap(okim6295_r(device, 0));
} }
static WRITE8_DEVICE_HANDLER( aquarium_oki_w ) static WRITE8_DEVICE_HANDLER( aquarium_oki_w )
{ {
logerror("%s:Writing %04x to the OKI M6295\n",cpuexec_describe_context(device->machine),aquarium_snd_bitswap(data)); logerror("%s:Writing %04x to the OKI M6295\n", cpuexec_describe_context(device->machine), aquarium_snd_bitswap(data));
okim6295_w( device, 0, (aquarium_snd_bitswap(data)) ); okim6295_w(device, 0, (aquarium_snd_bitswap(data)));
} }
@ -141,12 +135,12 @@ static WRITE8_DEVICE_HANDLER( aquarium_oki_w )
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0xc00000, 0xc00fff) AM_RAM_WRITE(aquarium_mid_videoram_w) AM_BASE(&aquarium_mid_videoram) AM_RANGE(0xc00000, 0xc00fff) AM_RAM_WRITE(aquarium_mid_videoram_w) AM_BASE_MEMBER(aquarium_state, mid_videoram)
AM_RANGE(0xc01000, 0xc01fff) AM_RAM_WRITE(aquarium_bak_videoram_w) AM_BASE(&aquarium_bak_videoram) AM_RANGE(0xc01000, 0xc01fff) AM_RAM_WRITE(aquarium_bak_videoram_w) AM_BASE_MEMBER(aquarium_state, bak_videoram)
AM_RANGE(0xc02000, 0xc03fff) AM_RAM_WRITE(aquarium_txt_videoram_w) AM_BASE(&aquarium_txt_videoram) AM_RANGE(0xc02000, 0xc03fff) AM_RAM_WRITE(aquarium_txt_videoram_w) AM_BASE_MEMBER(aquarium_state, txt_videoram)
AM_RANGE(0xc80000, 0xc81fff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) AM_RANGE(0xc80000, 0xc81fff) AM_RAM AM_BASE_MEMBER(aquarium_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd00000, 0xd00fff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE(&paletteram16) AM_RANGE(0xd00000, 0xd00fff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE(&paletteram16)
AM_RANGE(0xd80014, 0xd8001f) AM_WRITEONLY AM_BASE(&aquarium_scroll) AM_RANGE(0xd80014, 0xd8001f) AM_WRITEONLY AM_BASE_MEMBER(aquarium_state, scroll)
AM_RANGE(0xd80068, 0xd80069) AM_WRITENOP /* probably not used */ AM_RANGE(0xd80068, 0xd80069) AM_WRITENOP /* probably not used */
AM_RANGE(0xd80080, 0xd80081) AM_READ_PORT("DSW") AM_RANGE(0xd80080, 0xd80081) AM_READ_PORT("DSW")
AM_RANGE(0xd80082, 0xd80083) AM_READNOP /* stored but not read back ? check code at 0x01f440 */ AM_RANGE(0xd80082, 0xd80083) AM_READNOP /* stored but not read back ? check code at 0x01f440 */
@ -282,43 +276,45 @@ static const gfx_layout tilelayout =
static DRIVER_INIT( aquarium ) static DRIVER_INIT( aquarium )
{ {
UINT8 *Z80 = memory_region(machine, "audiocpu");
/* The BG tiles are 5bpp, this rearranges the data from /* The BG tiles are 5bpp, this rearranges the data from
the roms containing the 1bpp data so we can decode it the roms containing the 1bpp data so we can decode it
correctly */ correctly */
UINT8 *DAT2 = memory_region(machine, "gfx1") + 0x080000;
UINT8 *DAT2 = memory_region(machine, "gfx1")+0x080000;
UINT8 *DAT = memory_region(machine, "user1"); UINT8 *DAT = memory_region(machine, "user1");
int len = 0x0200000; int len = 0x0200000;
for (len = 0 ; len < 0x020000 ; len ++ ) for (len = 0; len < 0x020000; len++)
{ {
DAT2[len*4+1] = (DAT[len] & 0x80) << 0; DAT2[len * 4 + 1] = (DAT[len] & 0x80) << 0;
DAT2[len*4+1] |= (DAT[len] & 0x40) >> 3; DAT2[len * 4 + 1] |= (DAT[len] & 0x40) >> 3;
DAT2[len*4+0] = (DAT[len] & 0x20) << 2; DAT2[len * 4 + 0] = (DAT[len] & 0x20) << 2;
DAT2[len*4+0] |= (DAT[len] & 0x10) >> 1; DAT2[len * 4 + 0] |= (DAT[len] & 0x10) >> 1;
DAT2[len*4+3] = (DAT[len] & 0x08) << 4; DAT2[len * 4 + 3] = (DAT[len] & 0x08) << 4;
DAT2[len*4+3] |= (DAT[len] & 0x04) << 1; DAT2[len * 4 + 3] |= (DAT[len] & 0x04) << 1;
DAT2[len*4+2] = (DAT[len] & 0x02) << 6; DAT2[len * 4 + 2] = (DAT[len] & 0x02) << 6;
DAT2[len*4+2] |= (DAT[len] & 0x01) << 3; DAT2[len * 4 + 2] |= (DAT[len] & 0x01) << 3;
} }
DAT2 = memory_region(machine, "gfx4")+0x080000; DAT2 = memory_region(machine, "gfx4") + 0x080000;
DAT = memory_region(machine, "user2"); DAT = memory_region(machine, "user2");
for (len = 0 ; len < 0x020000 ; len ++ ) for (len = 0; len < 0x020000; len++)
{ {
DAT2[len*4+1] = (DAT[len] & 0x80) << 0; DAT2[len * 4 + 1] = (DAT[len] & 0x80) << 0;
DAT2[len*4+1] |= (DAT[len] & 0x40) >> 3; DAT2[len * 4 + 1] |= (DAT[len] & 0x40) >> 3;
DAT2[len*4+0] = (DAT[len] & 0x20) << 2; DAT2[len * 4 + 0] = (DAT[len] & 0x20) << 2;
DAT2[len*4+0] |= (DAT[len] & 0x10) >> 1; DAT2[len * 4 + 0] |= (DAT[len] & 0x10) >> 1;
DAT2[len*4+3] = (DAT[len] & 0x08) << 4; DAT2[len * 4 + 3] = (DAT[len] & 0x08) << 4;
DAT2[len*4+3] |= (DAT[len] & 0x04) << 1; DAT2[len * 4 + 3] |= (DAT[len] & 0x04) << 1;
DAT2[len*4+2] = (DAT[len] & 0x02) << 6; DAT2[len * 4 + 2] = (DAT[len] & 0x02) << 6;
DAT2[len*4+2] |= (DAT[len] & 0x01) << 3; DAT2[len * 4 + 2] |= (DAT[len] & 0x01) << 3;
} }
/* reset the sound bank */ /* configure and set up the sound bank */
aquarium_z80_bank_w(cputag_get_address_space(machine, "audiocpu", ADDRESS_SPACE_IO), 0, 0); memory_configure_bank(machine, 1, 0, 7, &Z80[0x18000], 0x8000);
memory_set_bank(machine, 1, 1);
} }
@ -329,9 +325,9 @@ static GFXDECODE_START( aquarium )
GFXDECODE_ENTRY( "gfx4", 0, char5bpplayout, 0x400, 32 ) GFXDECODE_ENTRY( "gfx4", 0, char5bpplayout, 0x400, 32 )
GFXDECODE_END GFXDECODE_END
static void irq_handler(const device_config *device, int irq) static void irq_handler( const device_config *device, int irq )
{ {
cputag_set_input_line(device->machine, "audiocpu", 0 , irq ? ASSERT_LINE : CLEAR_LINE ); cputag_set_input_line(device->machine, "audiocpu", 0 , irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2151_interface ym2151_config = static const ym2151_interface ym2151_config =
@ -342,11 +338,25 @@ static const ym2151_interface ym2151_config =
static MACHINE_START( aquarium ) static MACHINE_START( aquarium )
{ {
state_save_register_global(machine, aquarium_snd_ack); aquarium_state *state = (aquarium_state *)machine->driver_data;
state_save_register_global(machine, state->aquarium_snd_ack);
}
static MACHINE_RESET( aquarium )
{
aquarium_state *state = (aquarium_state *)machine->driver_data;
state->aquarium_snd_ack = 0;
#if AQUARIUS_HACK
MACHINE_RESET_CALL(aquarium_hack);
#endif
} }
static MACHINE_DRIVER_START( aquarium ) static MACHINE_DRIVER_START( aquarium )
/* driver data */
MDRV_DRIVER_DATA(aquarium_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 32000000/2) MDRV_CPU_ADD("maincpu", M68000, 32000000/2)
MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_PROGRAM_MAP(main_map)
@ -356,10 +366,8 @@ static MACHINE_DRIVER_START( aquarium )
MDRV_CPU_PROGRAM_MAP(snd_map) MDRV_CPU_PROGRAM_MAP(snd_map)
MDRV_CPU_IO_MAP(snd_portmap) MDRV_CPU_IO_MAP(snd_portmap)
MDRV_MACHINE_START(aquarium) MDRV_MACHINE_START(aquarium)
#if AQUARIUS_HACK
MDRV_MACHINE_RESET(aquarium) MDRV_MACHINE_RESET(aquarium)
#endif
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)

View File

@ -139,43 +139,37 @@
* *
*************************************/ *************************************/
static const UINT8 *syncprom;
static emu_timer *irq_timer;
static UINT8 irq_state;
static UINT8 *nvram_stage; static UINT8 *nvram_stage;
static UINT8 nvram_store[2];
int ccastles_vblank_start;
int ccastles_vblank_end;
/************************************* *
/*************************************
*
* VBLANK and IRQ generation * VBLANK and IRQ generation
* *
*************************************/ *************************************/
INLINE void schedule_next_irq(running_machine *machine, int curscanline) INLINE void schedule_next_irq( running_machine *machine, int curscanline )
{ {
ccastles_state *state = (ccastles_state *)machine->driver_data;
/* scan for a rising edge on the IRQCK signal */ /* scan for a rising edge on the IRQCK signal */
for (curscanline++; ; curscanline = (curscanline + 1) & 0xff) for (curscanline++; ; curscanline = (curscanline + 1) & 0xff)
if ((syncprom[(curscanline - 1) & 0xff] & 8) == 0 && (syncprom[curscanline] & 8) != 0) if ((state->syncprom[(curscanline - 1) & 0xff] & 8) == 0 && (state->syncprom[curscanline] & 8) != 0)
break; break;
/* next one at the start of this scanline */ /* next one at the start of this scanline */
timer_adjust_oneshot(irq_timer, video_screen_get_time_until_pos(machine->primary_screen, curscanline, 0), curscanline); timer_adjust_oneshot(state->irq_timer, video_screen_get_time_until_pos(machine->primary_screen, curscanline, 0), curscanline);
} }
static TIMER_CALLBACK( clock_irq ) static TIMER_CALLBACK( clock_irq )
{ {
ccastles_state *state = (ccastles_state *)machine->driver_data;
/* assert the IRQ if not already asserted */ /* assert the IRQ if not already asserted */
if (!irq_state) if (!state->irq_state)
{ {
cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE);
irq_state = 1; state->irq_state = 1;
} }
/* force an update now */ /* force an update now */
@ -188,8 +182,9 @@ static TIMER_CALLBACK( clock_irq )
static CUSTOM_INPUT( get_vblank ) static CUSTOM_INPUT( get_vblank )
{ {
ccastles_state *state = (ccastles_state *)field->port->machine->driver_data;
int scanline = video_screen_get_vpos(field->port->machine->primary_screen); int scanline = video_screen_get_vpos(field->port->machine->primary_screen);
return syncprom[scanline & 0xff] & 1; return state->syncprom[scanline & 0xff] & 1;
} }
@ -202,55 +197,57 @@ static CUSTOM_INPUT( get_vblank )
static MACHINE_START( ccastles ) static MACHINE_START( ccastles )
{ {
ccastles_state *state = (ccastles_state *)machine->driver_data;
rectangle visarea; rectangle visarea;
/* initialize globals */ /* initialize globals */
syncprom = memory_region(machine, "proms") + 0x000; state->syncprom = memory_region(machine, "proms") + 0x000;
/* find the start of VBLANK in the SYNC PROM */ /* find the start of VBLANK in the SYNC PROM */
for (ccastles_vblank_start = 0; ccastles_vblank_start < 256; ccastles_vblank_start++) for (state->vblank_start = 0; state->vblank_start < 256; state->vblank_start++)
if ((syncprom[(ccastles_vblank_start - 1) & 0xff] & 1) == 0 && (syncprom[ccastles_vblank_start] & 1) != 0) if ((state->syncprom[(state->vblank_start - 1) & 0xff] & 1) == 0 && (state->syncprom[state->vblank_start] & 1) != 0)
break; break;
if (ccastles_vblank_start == 0) if (state->vblank_start == 0)
ccastles_vblank_start = 256; state->vblank_start = 256;
/* find the end of VBLANK in the SYNC PROM */ /* find the end of VBLANK in the SYNC PROM */
for (ccastles_vblank_end = 0; ccastles_vblank_end < 256; ccastles_vblank_end++) for (state->vblank_end = 0; state->vblank_end < 256; state->vblank_end++)
if ((syncprom[(ccastles_vblank_end - 1) & 0xff] & 1) != 0 && (syncprom[ccastles_vblank_end] & 1) == 0) if ((state->syncprom[(state->vblank_end - 1) & 0xff] & 1) != 0 && (state->syncprom[state->vblank_end] & 1) == 0)
break; break;
/* can't handle the wrapping case */ /* can't handle the wrapping case */
assert(ccastles_vblank_end < ccastles_vblank_start); assert(state->vblank_end < state->vblank_start);
/* reconfigure the visible area to match */ /* reconfigure the visible area to match */
visarea.min_x = 0; visarea.min_x = 0;
visarea.max_x = 255; visarea.max_x = 255;
visarea.min_y = ccastles_vblank_end; visarea.min_y = state->vblank_end;
visarea.max_y = ccastles_vblank_start - 1; visarea.max_y = state->vblank_start - 1;
video_screen_configure(machine->primary_screen, 320, 256, &visarea, HZ_TO_ATTOSECONDS(PIXEL_CLOCK) * VTOTAL * HTOTAL); video_screen_configure(machine->primary_screen, 320, 256, &visarea, HZ_TO_ATTOSECONDS(PIXEL_CLOCK) * VTOTAL * HTOTAL);
/* configure the ROM banking */ /* configure the ROM banking */
memory_configure_bank(machine, 1, 0, 2, memory_region(machine, "maincpu") + 0xa000, 0x6000); memory_configure_bank(machine, 1, 0, 2, memory_region(machine, "maincpu") + 0xa000, 0x6000);
/* create a timer for IRQs and set up the first callback */ /* create a timer for IRQs and set up the first callback */
irq_timer = timer_alloc(machine, clock_irq, NULL); state->irq_timer = timer_alloc(machine, clock_irq, NULL);
irq_state = 0; state->irq_state = 0;
schedule_next_irq(machine, 0); schedule_next_irq(machine, 0);
/* allocate backing memory for the NVRAM */ /* allocate backing memory for the NVRAM */
generic_nvram = auto_alloc_array(machine, UINT8, generic_nvram_size); generic_nvram = auto_alloc_array(machine, UINT8, generic_nvram_size);
/* setup for save states */ /* setup for save states */
state_save_register_global(machine, irq_state); state_save_register_global(machine, state->irq_state);
state_save_register_global_array(machine, nvram_store); state_save_register_global_array(machine, state->nvram_store);
state_save_register_global_pointer(machine, generic_nvram, generic_nvram_size); state_save_register_global_pointer(machine, generic_nvram, generic_nvram_size);
} }
static MACHINE_RESET( ccastles ) static MACHINE_RESET( ccastles )
{ {
ccastles_state *state = (ccastles_state *)machine->driver_data;
cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE); cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE);
irq_state = 0; state->irq_state = 0;
} }
@ -263,10 +260,11 @@ static MACHINE_RESET( ccastles )
static WRITE8_HANDLER( irq_ack_w ) static WRITE8_HANDLER( irq_ack_w )
{ {
if (irq_state) ccastles_state *state = (ccastles_state *)space->machine->driver_data;
if (state->irq_state)
{ {
cputag_set_input_line(space->machine, "maincpu", 0, CLEAR_LINE); cputag_set_input_line(space->machine, "maincpu", 0, CLEAR_LINE);
irq_state = 0; state->irq_state = 0;
} }
} }
@ -327,8 +325,10 @@ static WRITE8_HANDLER( nvram_recall_w )
static WRITE8_HANDLER( nvram_store_w ) static WRITE8_HANDLER( nvram_store_w )
{ {
nvram_store[offset] = data & 1; ccastles_state *state = (ccastles_state *)space->machine->driver_data;
if (!nvram_store[0] && nvram_store[1])
state->nvram_store[offset] = data & 1;
if (!state->nvram_store[0] && state->nvram_store[1])
memcpy(generic_nvram, nvram_stage, generic_nvram_size); memcpy(generic_nvram, nvram_stage, generic_nvram_size);
} }
@ -344,9 +344,9 @@ static WRITE8_HANDLER( nvram_store_w )
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0001) AM_WRITE(ccastles_bitmode_addr_w) AM_RANGE(0x0000, 0x0001) AM_WRITE(ccastles_bitmode_addr_w)
AM_RANGE(0x0002, 0x0002) AM_READWRITE(ccastles_bitmode_r, ccastles_bitmode_w) AM_RANGE(0x0002, 0x0002) AM_READWRITE(ccastles_bitmode_r, ccastles_bitmode_w)
AM_RANGE(0x0000, 0x7fff) AM_RAM_WRITE(ccastles_videoram_w) AM_BASE(&videoram) AM_RANGE(0x0000, 0x7fff) AM_RAM_WRITE(ccastles_videoram_w) AM_BASE_MEMBER(ccastles_state, videoram)
AM_RANGE(0x8000, 0x8fff) AM_RAM AM_RANGE(0x8000, 0x8fff) AM_RAM
AM_RANGE(0x8e00, 0x8fff) AM_BASE(&spriteram) AM_RANGE(0x8e00, 0x8fff) AM_BASE_MEMBER(ccastles_state, spriteram)
AM_RANGE(0x9000, 0x90ff) AM_MIRROR(0x0300) AM_RAM AM_BASE(&nvram_stage) AM_SIZE(&generic_nvram_size) AM_RANGE(0x9000, 0x90ff) AM_MIRROR(0x0300) AM_RAM AM_BASE(&nvram_stage) AM_SIZE(&generic_nvram_size)
AM_RANGE(0x9400, 0x9403) AM_MIRROR(0x01fc) AM_READ(leta_r) AM_RANGE(0x9400, 0x9403) AM_MIRROR(0x01fc) AM_READ(leta_r)
AM_RANGE(0x9600, 0x97ff) AM_READ_PORT("IN0") AM_RANGE(0x9600, 0x97ff) AM_READ_PORT("IN0")
@ -488,6 +488,9 @@ static const pokey_interface pokey_config =
static MACHINE_DRIVER_START( ccastles ) static MACHINE_DRIVER_START( ccastles )
/* driver data */
MDRV_DRIVER_DATA(ccastles_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M6502, MASTER_CLOCK/8) MDRV_CPU_ADD("maincpu", M6502, MASTER_CLOCK/8)
MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_PROGRAM_MAP(main_map)

View File

@ -0,0 +1,41 @@
/*************************************************************************
Act Fancer
*************************************************************************/
typedef struct _actfancr_state actfancr_state;
struct _actfancr_state
{
/* memory pointers */
UINT8 * pf1_data;
UINT8 * pf2_data;
UINT8 * pf1_rowscroll_data;
UINT8 * main_ram;
// UINT8 * spriteram; // currently this uses buffered_spriteram
// UINT8 * paletteram; // currently this uses generic palette handling
/* video-related */
tilemap *pf1_tilemap, *pf1_alt_tilemap, *pf2_tilemap;
UINT8 control_1[0x20], control_2[0x20];
int flipscreen;
/* misc */
int trio_control_select;
};
/*----------- defined in video/actfancr.c -----------*/
WRITE8_HANDLER( actfancr_pf1_data_w );
READ8_HANDLER( actfancr_pf1_data_r );
WRITE8_HANDLER( actfancr_pf1_control_w );
WRITE8_HANDLER( actfancr_pf2_data_w );
READ8_HANDLER( actfancr_pf2_data_r );
WRITE8_HANDLER( actfancr_pf2_control_w );
VIDEO_START( actfancr );
VIDEO_START( triothep );
VIDEO_UPDATE( actfancr );
VIDEO_UPDATE( triothep );

View File

@ -1,10 +1,23 @@
/*----------- defined in drivers/aquarium.c -----------*/
extern UINT16 *aquarium_scroll;
extern UINT16 *aquarium_txt_videoram;
extern UINT16 *aquarium_mid_videoram; typedef struct _aquarium_state aquarium_state;
extern UINT16 *aquarium_bak_videoram; struct _aquarium_state
{
/* memory pointers */
UINT16 * scroll;
UINT16 * txt_videoram;
UINT16 * mid_videoram;
UINT16 * bak_videoram;
UINT16 * spriteram;
// UINT16 * paletteram16; // currently this uses generic palette handling
/* video-related */
tilemap *txt_tilemap, *mid_tilemap, *bak_tilemap;
/* misc */
int aquarium_snd_ack;
};
/*----------- defined in video/aquarium.c -----------*/ /*----------- defined in video/aquarium.c -----------*/

View File

@ -4,10 +4,34 @@
*************************************************************************/ *************************************************************************/
/*----------- defined in drivers/ccastles.c -----------*/ typedef struct _ccastles_state ccastles_state;
struct _ccastles_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * spriteram;
// UINT8 * nvram_stage; // currently this uses generic nvram handlers
// UINT8 * nvram; // currently this uses generic nvram handlers
/* video-related */
const UINT8 *syncprom;
const UINT8 *wpprom;
const UINT8 *priprom;
bitmap_t *spritebitmap;
double rweights[3], gweights[3], bweights[3];
UINT8 video_control[8];
UINT8 bitmode_addr[2];
UINT8 hscroll;
UINT8 vscroll;
/* misc */
int vblank_start;
int vblank_end;
emu_timer *irq_timer;
UINT8 irq_state;
UINT8 nvram_store[2];
};
extern int ccastles_vblank_start;
extern int ccastles_vblank_end;
/*----------- defined in video/ccastles.c -----------*/ /*----------- defined in video/ccastles.c -----------*/

View File

@ -5,13 +5,9 @@
*******************************************************************************/ *******************************************************************************/
#include "driver.h" #include "driver.h"
#include "actfancr.h"
static UINT8 actfancr_control_1[0x20],actfancr_control_2[0x20];
UINT8 *actfancr_pf1_data,*actfancr_pf2_data,*actfancr_pf1_rowscroll_data;
static tilemap *pf1_tilemap,*pf1_alt_tilemap,*pf2_tilemap;
static int flipscreen;
static TILEMAP_MAPPER( actfancr_scan ) static TILEMAP_MAPPER( actfancr_scan )
{ {
/* logical (col,row) -> memory offset */ /* logical (col,row) -> memory offset */
@ -26,11 +22,11 @@ static TILEMAP_MAPPER( actfancr_scan2 )
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
int tile,color; actfancr_state *state = (actfancr_state *)machine->driver_data;
int tile = state->pf1_data[2 * tile_index] + (state->pf1_data[2 * tile_index + 1] << 8);
int color = tile >> 12;
tile=actfancr_pf1_data[2*tile_index]+(actfancr_pf1_data[2*tile_index+1]<<8); tile = tile & 0xfff;
color=tile >> 12;
tile=tile&0xfff;
SET_TILE_INFO( SET_TILE_INFO(
2, 2,
@ -47,11 +43,11 @@ static TILEMAP_MAPPER( triothep_scan )
static TILE_GET_INFO( get_trio_tile_info ) static TILE_GET_INFO( get_trio_tile_info )
{ {
int tile,color; actfancr_state *state = (actfancr_state *)machine->driver_data;
int tile = state->pf1_data[2 * tile_index] + (state->pf1_data[2 * tile_index + 1] << 8);
int color = tile >> 12;
tile=actfancr_pf1_data[2*tile_index]+(actfancr_pf1_data[2*tile_index+1]<<8); tile = tile & 0xfff;
color=tile >> 12;
tile=tile&0xfff;
SET_TILE_INFO( SET_TILE_INFO(
2, 2,
@ -62,12 +58,12 @@ static TILE_GET_INFO( get_trio_tile_info )
static TILE_GET_INFO( get_pf2_tile_info ) static TILE_GET_INFO( get_pf2_tile_info )
{ {
int tile,color; actfancr_state *state = (actfancr_state *)machine->driver_data;
int tile = state->pf2_data[2 * tile_index] + (state->pf2_data[2 * tile_index + 1] << 8);
int color = tile >> 12;
tile=actfancr_pf2_data[2*tile_index]+(actfancr_pf2_data[2*tile_index+1]<<8); tile = tile & 0xfff;
color=tile>>12;
tile=tile&0xfff;
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
@ -78,31 +74,34 @@ static TILE_GET_INFO( get_pf2_tile_info )
/******************************************************************************/ /******************************************************************************/
static void register_savestate(running_machine *machine) static void register_savestate( running_machine *machine )
{ {
state_save_register_global_array(machine, actfancr_control_1); actfancr_state *state = (actfancr_state *)machine->driver_data;
state_save_register_global_array(machine, actfancr_control_2); state_save_register_global_array(machine, state->control_1);
state_save_register_global_array(machine, state->control_2);
state_save_register_global(machine, state->flipscreen);
} }
VIDEO_START( actfancr ) VIDEO_START( actfancr )
{ {
pf1_tilemap = tilemap_create(machine, get_tile_info,actfancr_scan,16,16,256,16); actfancr_state *state = (actfancr_state *)machine->driver_data;
pf1_alt_tilemap = tilemap_create(machine, get_tile_info,actfancr_scan2,16,16,128,32); state->pf1_tilemap = tilemap_create(machine, get_tile_info, actfancr_scan, 16, 16, 256, 16);
pf2_tilemap = tilemap_create(machine, get_pf2_tile_info,tilemap_scan_rows,8,8,32,32); state->pf1_alt_tilemap = tilemap_create(machine, get_tile_info, actfancr_scan2, 16, 16, 128, 32);
state->pf2_tilemap = tilemap_create(machine, get_pf2_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(pf2_tilemap,0); tilemap_set_transparent_pen(state->pf2_tilemap, 0);
register_savestate(machine); register_savestate(machine);
} }
VIDEO_START( triothep ) VIDEO_START( triothep )
{ {
pf1_tilemap = tilemap_create(machine, get_trio_tile_info,triothep_scan,16,16,32,32); actfancr_state *state = (actfancr_state *)machine->driver_data;
pf2_tilemap = tilemap_create(machine, get_pf2_tile_info,tilemap_scan_rows,8,8,32,32); state->pf1_tilemap = tilemap_create(machine, get_trio_tile_info, triothep_scan, 16, 16, 32, 32);
state->pf2_tilemap = tilemap_create(machine, get_pf2_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
state->pf1_alt_tilemap = NULL;
tilemap_set_transparent_pen(pf2_tilemap,0); tilemap_set_transparent_pen(state->pf2_tilemap, 0);
pf1_alt_tilemap=NULL;
register_savestate(machine); register_savestate(machine);
} }
@ -111,77 +110,88 @@ VIDEO_START( triothep )
WRITE8_HANDLER( actfancr_pf1_control_w ) WRITE8_HANDLER( actfancr_pf1_control_w )
{ {
actfancr_control_1[offset]=data; actfancr_state *state = (actfancr_state *)space->machine->driver_data;
state->control_1[offset] = data;
} }
WRITE8_HANDLER( actfancr_pf2_control_w ) WRITE8_HANDLER( actfancr_pf2_control_w )
{ {
actfancr_control_2[offset]=data; actfancr_state *state = (actfancr_state *)space->machine->driver_data;
state->control_2[offset] = data;
} }
WRITE8_HANDLER( actfancr_pf1_data_w ) WRITE8_HANDLER( actfancr_pf1_data_w )
{ {
actfancr_pf1_data[offset]=data; actfancr_state *state = (actfancr_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(pf1_tilemap,offset/2); state->pf1_data[offset] = data;
if (pf1_alt_tilemap) tilemap_mark_tile_dirty(pf1_alt_tilemap,offset/2); tilemap_mark_tile_dirty(state->pf1_tilemap, offset / 2);
if (state->pf1_alt_tilemap)
tilemap_mark_tile_dirty(state->pf1_alt_tilemap, offset / 2);
} }
READ8_HANDLER( actfancr_pf1_data_r ) READ8_HANDLER( actfancr_pf1_data_r )
{ {
return actfancr_pf1_data[offset]; actfancr_state *state = (actfancr_state *)space->machine->driver_data;
return state->pf1_data[offset];
} }
WRITE8_HANDLER( actfancr_pf2_data_w ) WRITE8_HANDLER( actfancr_pf2_data_w )
{ {
actfancr_pf2_data[offset]=data; actfancr_state *state = (actfancr_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(pf2_tilemap,offset/2); state->pf2_data[offset] = data;
tilemap_mark_tile_dirty(state->pf2_tilemap, offset / 2);
} }
READ8_HANDLER( actfancr_pf2_data_r ) READ8_HANDLER( actfancr_pf2_data_r )
{ {
return actfancr_pf2_data[offset]; actfancr_state *state = (actfancr_state *)space->machine->driver_data;
return state->pf2_data[offset];
} }
/******************************************************************************/ /******************************************************************************/
VIDEO_UPDATE( actfancr ) VIDEO_UPDATE( actfancr )
{ {
int offs,mult; actfancr_state *state = (actfancr_state *)screen->machine->driver_data;
int scrollx=(actfancr_control_1[0x10]+(actfancr_control_1[0x11]<<8)); int offs, mult;
int scrolly=(actfancr_control_1[0x12]+(actfancr_control_1[0x13]<<8)); int scrollx = (state->control_1[0x10] + (state->control_1[0x11] << 8));
int scrolly = (state->control_1[0x12] + (state->control_1[0x13] << 8));
/* Draw playfield */ /* Draw playfield */
flipscreen=actfancr_control_2[0]&0x80; state->flipscreen = state->control_2[0] & 0x80;
tilemap_set_flip_all(screen->machine,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); tilemap_set_flip_all(screen->machine, state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
tilemap_set_scrollx( pf1_tilemap,0, scrollx ); tilemap_set_scrollx(state->pf1_tilemap,0, scrollx );
tilemap_set_scrolly( pf1_tilemap,0, scrolly ); tilemap_set_scrolly(state->pf1_tilemap,0, scrolly );
tilemap_set_scrollx( pf1_alt_tilemap,0, scrollx ); tilemap_set_scrollx(state->pf1_alt_tilemap, 0, scrollx );
tilemap_set_scrolly( pf1_alt_tilemap,0, scrolly ); tilemap_set_scrolly(state->pf1_alt_tilemap, 0, scrolly );
if (actfancr_control_1[6]==1) if (state->control_1[6] == 1)
tilemap_draw(bitmap,cliprect,pf1_alt_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->pf1_alt_tilemap, 0, 0);
else else
tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->pf1_tilemap, 0, 0);
/* Sprites */ /* Sprites */
for (offs = 0;offs < 0x800;offs += 8) for (offs = 0; offs < 0x800; offs += 8)
{ {
int x,y,sprite,colour,multi,fx,fy,inc,flash; int x, y, sprite, colour, multi, fx, fy, inc, flash;
y=buffered_spriteram[offs]+(buffered_spriteram[offs+1]<<8); y = buffered_spriteram[offs] + (buffered_spriteram[offs + 1] << 8);
if ((y&0x8000) == 0) continue; if ((y & 0x8000) == 0)
x = buffered_spriteram[offs+4]+(buffered_spriteram[offs+5]<<8); continue;
x = buffered_spriteram[offs + 4] + (buffered_spriteram[offs + 5] << 8);
colour = ((x & 0xf000) >> 12); colour = ((x & 0xf000) >> 12);
flash=x&0x800; flash = x & 0x800;
if (flash && (video_screen_get_frame_number(screen) & 1)) continue; if (flash && (video_screen_get_frame_number(screen) & 1))
continue;
fx = y & 0x2000; fx = y & 0x2000;
fy = y & 0x4000; fy = y & 0x4000;
multi = (1 << ((y & 0x1800) >> 11)) - 1; /* 1x, 2x, 4x, 8x height */ multi = (1 << ((y & 0x1800) >> 11)) - 1; /* 1x, 2x, 4x, 8x height */
/* multi = 0 1 3 7 */
/* multi = 0 1 3 7 */ sprite = buffered_spriteram[offs + 2] + (buffered_spriteram[offs + 3] << 8);
sprite = buffered_spriteram[offs+2]+(buffered_spriteram[offs+3]<<8);
sprite &= 0x0fff; sprite &= 0x0fff;
x = x & 0x01ff; x = x & 0x01ff;
@ -200,14 +210,15 @@ VIDEO_UPDATE( actfancr )
inc = 1; inc = 1;
} }
if (flipscreen) { if (state->flipscreen)
y=240-y; {
x=240-x; y = 240 - y;
if (fx) fx=0; else fx=1; x = 240 - x;
if (fy) fy=0; else fy=1; if (fx) fx = 0; else fx = 1;
mult=16; if (fy) fy = 0; else fy = 1;
mult = 16;
} }
else mult=-16; else mult = -16;
while (multi >= 0) while (multi >= 0)
{ {
@ -220,52 +231,58 @@ VIDEO_UPDATE( actfancr )
} }
} }
tilemap_draw(bitmap,cliprect,pf2_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->pf2_tilemap, 0, 0);
return 0; return 0;
} }
VIDEO_UPDATE( triothep ) VIDEO_UPDATE( triothep )
{ {
int offs,i,mult; actfancr_state *state = (actfancr_state *)screen->machine->driver_data;
int scrollx=(actfancr_control_1[0x10]+(actfancr_control_1[0x11]<<8)); int offs, i, mult;
int scrolly=(actfancr_control_1[0x12]+(actfancr_control_1[0x13]<<8)); int scrollx = (state->control_1[0x10] + (state->control_1[0x11] << 8));
int scrolly = (state->control_1[0x12] + (state->control_1[0x13] << 8));
/* Draw playfield */ /* Draw playfield */
flipscreen=actfancr_control_2[0]&0x80; state->flipscreen = state->control_2[0] & 0x80;
tilemap_set_flip_all(screen->machine,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); tilemap_set_flip_all(screen->machine, state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
if (actfancr_control_2[0]&0x4) { if (state->control_2[0] & 0x4)
tilemap_set_scroll_rows(pf1_tilemap,32); {
tilemap_set_scrolly( pf1_tilemap,0, scrolly ); tilemap_set_scroll_rows(state->pf1_tilemap, 32);
for (i=0; i<32; i++) tilemap_set_scrolly(state->pf1_tilemap, 0, scrolly);
tilemap_set_scrollx( pf1_tilemap,i, scrollx+(actfancr_pf1_rowscroll_data[i*2] | actfancr_pf1_rowscroll_data[i*2+1]<<8) ); for (i = 0; i < 32; i++)
tilemap_set_scrollx(state->pf1_tilemap, i, scrollx + (state->pf1_rowscroll_data[i * 2] | state->pf1_rowscroll_data[i * 2 + 1] << 8) );
} }
else { else
tilemap_set_scroll_rows(pf1_tilemap,1); {
tilemap_set_scrollx( pf1_tilemap,0, scrollx ); tilemap_set_scroll_rows(state->pf1_tilemap, 1);
tilemap_set_scrolly( pf1_tilemap,0, scrolly ); tilemap_set_scrollx(state->pf1_tilemap, 0, scrollx);
tilemap_set_scrolly(state->pf1_tilemap, 0, scrolly);
} }
tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->pf1_tilemap, 0, 0);
/* Sprites */ /* Sprites */
for (offs = 0;offs < 0x800;offs += 8) for (offs = 0; offs < 0x800; offs += 8)
{ {
int x,y,sprite,colour,multi,fx,fy,inc,flash; int x, y, sprite, colour, multi, fx, fy, inc, flash;
y=buffered_spriteram[offs]+(buffered_spriteram[offs+1]<<8); y = buffered_spriteram[offs] + (buffered_spriteram[offs + 1] << 8);
if ((y&0x8000) == 0) continue; if ((y & 0x8000) == 0)
x = buffered_spriteram[offs+4]+(buffered_spriteram[offs+5]<<8); continue;
x = buffered_spriteram[offs + 4] + (buffered_spriteram[offs + 5] << 8);
colour = ((x & 0xf000) >> 12); colour = ((x & 0xf000) >> 12);
flash=x&0x800; flash = x & 0x800;
if (flash && (video_screen_get_frame_number(screen) & 1)) continue; if (flash && (video_screen_get_frame_number(screen) & 1))
continue;
fx = y & 0x2000; fx = y & 0x2000;
fy = y & 0x4000; fy = y & 0x4000;
multi = (1 << ((y & 0x1800) >> 11)) - 1; /* 1x, 2x, 4x, 8x height */ multi = (1 << ((y & 0x1800) >> 11)) - 1; /* 1x, 2x, 4x, 8x height */
/* multi = 0 1 3 7 */ /* multi = 0 1 3 7 */
sprite = buffered_spriteram[offs+2]+(buffered_spriteram[offs+3]<<8);
sprite = buffered_spriteram[offs + 2] + (buffered_spriteram[offs + 3] << 8);
sprite &= 0x0fff; sprite &= 0x0fff;
x = x & 0x01ff; x = x & 0x01ff;
@ -284,14 +301,15 @@ VIDEO_UPDATE( triothep )
inc = 1; inc = 1;
} }
if (flipscreen) { if (state->flipscreen)
y=240-y; {
x=240-x; y = 240 - y;
if (fx) fx=0; else fx=1; x = 240 - x;
if (fy) fy=0; else fy=1; if (fx) fx = 0; else fx = 1;
mult=16; if (fy) fy = 0; else fy = 1;
mult = 16;
} }
else mult=-16; else mult = -16;
while (multi >= 0) while (multi >= 0)
{ {
@ -304,6 +322,6 @@ VIDEO_UPDATE( triothep )
} }
} }
tilemap_draw(bitmap,cliprect,pf2_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->pf2_tilemap, 0, 0);
return 0; return 0;
} }

View File

@ -3,48 +3,45 @@
#include "driver.h" #include "driver.h"
#include "includes/aquarium.h" #include "includes/aquarium.h"
static tilemap *aquarium_txt_tilemap;
static tilemap *aquarium_mid_tilemap;
static tilemap *aquarium_bak_tilemap;
/* gcpinbal.c modified */ /* gcpinbal.c modified */
static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect,int y_offs) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs )
{ {
int offs,chain_pos; aquarium_state *state = (aquarium_state *)machine->driver_data;
int x,y,curx,cury; int offs, chain_pos;
UINT8 col,flipx,flipy,chain; int x, y, curx, cury;
UINT8 col, flipx, flipy, chain;
UINT16 code; UINT16 code;
for (offs = 0;offs < spriteram_size/2;offs += 8) for (offs = 0; offs < spriteram_size / 2; offs += 8)
{ {
code = ((spriteram16[offs+5])&0xff) + (((spriteram16[offs+6]) &0xff) << 8); code = ((state->spriteram[offs + 5]) & 0xff) + (((state->spriteram[offs + 6]) & 0xff) << 8);
code &= 0x3fff; code &= 0x3fff;
if (!(spriteram16[offs+4] &0x80)) /* active sprite ? */ if (!(state->spriteram[offs + 4] &0x80)) /* active sprite ? */
{ {
x = ((spriteram16[offs+0]) &0xff) + (((spriteram16[offs+1]) &0xff) << 8); x = ((state->spriteram[offs + 0]) &0xff) + (((state->spriteram[offs + 1]) & 0xff) << 8);
y = ((spriteram16[offs+2]) &0xff) + (((spriteram16[offs+3]) &0xff) << 8); y = ((state->spriteram[offs + 2]) &0xff) + (((state->spriteram[offs + 3]) & 0xff) << 8);
/* Treat coords as signed */ /* Treat coords as signed */
if (x & 0x8000) x -= 0x10000; if (x & 0x8000) x -= 0x10000;
if (y & 0x8000) y -= 0x10000; if (y & 0x8000) y -= 0x10000;
col = ((spriteram16[offs+7]) &0x0f); col = ((state->spriteram[offs + 7]) & 0x0f);
chain = (spriteram16[offs+4]) &0x07; chain = (state->spriteram[offs + 4]) & 0x07;
flipy = (spriteram16[offs+4]) &0x10; flipy = (state->spriteram[offs + 4]) & 0x10;
flipx = (spriteram16[offs+4]) &0x20; flipx = (state->spriteram[offs + 4]) & 0x20;
curx = x; curx = x;
cury = y; cury = y;
if (((spriteram16[offs+4]) &0x08) && flipy) if (((state->spriteram[offs + 4]) & 0x08) && flipy)
cury += (chain * 16); cury += (chain * 16);
if (!(((spriteram16[offs+4]) &0x08)) && flipx) if (!(((state->spriteram[offs + 4]) & 0x08)) && flipx)
curx += (chain * 16); curx += (chain * 16);
for (chain_pos = chain;chain_pos >= 0;chain_pos--) for (chain_pos = chain; chain_pos >= 0; chain_pos--)
{ {
drawgfx_transpen(bitmap, cliprect,machine->gfx[0], drawgfx_transpen(bitmap, cliprect,machine->gfx[0],
code, code,
@ -57,19 +54,23 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
code, code,
col, col,
flipx, flipy, flipx, flipy,
curx,cury+256,0); curx,cury + 256,0);
code++; code++;
if ((spriteram16[offs+4]) &0x08) /* Y chain */ if ((state->spriteram[offs + 4]) &0x08) /* Y chain */
{ {
if (flipy) cury -= 16; if (flipy)
else cury += 16; cury -= 16;
else
cury += 16;
} }
else /* X chain */ else /* X chain */
{ {
if (flipx) curx -= 16; if (flipx)
else curx += 16; curx -= 16;
else
curx += 16;
} }
} }
} }
@ -78,98 +79,102 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
if (rotate) if (rotate)
{ {
char buf[80]; char buf[80];
sprintf(buf,"sprite rotate offs %04x ?",rotate); sprintf(buf, "sprite rotate offs %04x ?", rotate);
popmessage(buf); popmessage(buf);
} }
#endif #endif
} }
/* TXT Layer */ /* TXT Layer */
static TILE_GET_INFO( get_aquarium_txt_tile_info ) static TILE_GET_INFO( get_aquarium_txt_tile_info )
{ {
int tileno,colour; aquarium_state *state = (aquarium_state *)machine->driver_data;
int tileno, colour;
tileno = (aquarium_txt_videoram[tile_index] & 0x0fff); tileno = (state->txt_videoram[tile_index] & 0x0fff);
colour = (aquarium_txt_videoram[tile_index] & 0xf000) >> 12; colour = (state->txt_videoram[tile_index] & 0xf000) >> 12;
SET_TILE_INFO(2,tileno,colour,0); SET_TILE_INFO(2, tileno, colour, 0);
} }
WRITE16_HANDLER( aquarium_txt_videoram_w ) WRITE16_HANDLER( aquarium_txt_videoram_w )
{ {
aquarium_txt_videoram[offset] = data; aquarium_state *state = (aquarium_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(aquarium_txt_tilemap,offset); state->txt_videoram[offset] = data;
tilemap_mark_tile_dirty(state->txt_tilemap, offset);
} }
/* MID Layer */ /* MID Layer */
static TILE_GET_INFO( get_aquarium_mid_tile_info ) static TILE_GET_INFO( get_aquarium_mid_tile_info )
{ {
int tileno,colour,flag; aquarium_state *state = (aquarium_state *)machine->driver_data;
int tileno, colour, flag;
tileno = (aquarium_mid_videoram[tile_index*2] & 0x0fff); tileno = (state->mid_videoram[tile_index * 2] & 0x0fff);
colour = (aquarium_mid_videoram[tile_index*2+1] & 0x001f); colour = (state->mid_videoram[tile_index * 2 + 1] & 0x001f);
flag = TILE_FLIPYX((aquarium_mid_videoram[tile_index*2+1] & 0x300) >> 8); flag = TILE_FLIPYX((state->mid_videoram[tile_index * 2 + 1] & 0x300) >> 8);
SET_TILE_INFO(1,tileno,colour,flag); SET_TILE_INFO(1, tileno, colour, flag);
tileinfo->category = (aquarium_mid_videoram[tile_index*2+1] & 0x20) >> 5; tileinfo->category = (state->mid_videoram[tile_index * 2 + 1] & 0x20) >> 5;
} }
WRITE16_HANDLER( aquarium_mid_videoram_w ) WRITE16_HANDLER( aquarium_mid_videoram_w )
{ {
aquarium_mid_videoram[offset] = data; aquarium_state *state = (aquarium_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(aquarium_mid_tilemap,offset/2); state->mid_videoram[offset] = data;
tilemap_mark_tile_dirty(state->mid_tilemap, offset / 2);
} }
/* BAK Layer */ /* BAK Layer */
static TILE_GET_INFO( get_aquarium_bak_tile_info ) static TILE_GET_INFO( get_aquarium_bak_tile_info )
{ {
int tileno,colour,flag; aquarium_state *state = (aquarium_state *)machine->driver_data;
int tileno, colour, flag;
tileno = (aquarium_bak_videoram[tile_index*2] & 0x0fff); tileno = (state->bak_videoram[tile_index * 2] & 0x0fff);
colour = (aquarium_bak_videoram[tile_index*2+1] & 0x001f); colour = (state->bak_videoram[tile_index * 2 + 1] & 0x001f);
flag = TILE_FLIPYX((aquarium_bak_videoram[tile_index*2+1] & 0x300) >> 8); flag = TILE_FLIPYX((state->bak_videoram[tile_index * 2 + 1] & 0x300) >> 8);
SET_TILE_INFO(3,tileno,colour,flag); SET_TILE_INFO(3, tileno, colour, flag);
tileinfo->category = (aquarium_bak_videoram[tile_index*2+1] & 0x20) >> 5; tileinfo->category = (state->bak_videoram[tile_index * 2 + 1] & 0x20) >> 5;
} }
WRITE16_HANDLER( aquarium_bak_videoram_w ) WRITE16_HANDLER( aquarium_bak_videoram_w )
{ {
aquarium_bak_videoram[offset] = data; aquarium_state *state = (aquarium_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(aquarium_bak_tilemap,offset/2); state->bak_videoram[offset] = data;
tilemap_mark_tile_dirty(state->bak_tilemap, offset / 2);
} }
VIDEO_START(aquarium) VIDEO_START(aquarium)
{ {
aquarium_txt_tilemap = tilemap_create(machine, get_aquarium_txt_tile_info,tilemap_scan_rows, 8, 8,64,64); aquarium_state *state = (aquarium_state *)machine->driver_data;
tilemap_set_transparent_pen(aquarium_txt_tilemap,0); state->txt_tilemap = tilemap_create(machine, get_aquarium_txt_tile_info, tilemap_scan_rows, 8, 8, 64, 64);
state->bak_tilemap = tilemap_create(machine, get_aquarium_bak_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
state->mid_tilemap = tilemap_create(machine, get_aquarium_mid_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
aquarium_bak_tilemap = tilemap_create(machine, get_aquarium_bak_tile_info,tilemap_scan_rows, 16, 16,32,32); tilemap_set_transparent_pen(state->txt_tilemap, 0);
aquarium_mid_tilemap = tilemap_create(machine, get_aquarium_mid_tile_info,tilemap_scan_rows, 16, 16,32,32); tilemap_set_transparent_pen(state->mid_tilemap, 0);
tilemap_set_transparent_pen(aquarium_mid_tilemap,0);
} }
VIDEO_UPDATE(aquarium) VIDEO_UPDATE(aquarium)
{ {
tilemap_set_scrollx(aquarium_mid_tilemap, 0, aquarium_scroll[0]); aquarium_state *state = (aquarium_state *)screen->machine->driver_data;
tilemap_set_scrolly(aquarium_mid_tilemap, 0, aquarium_scroll[1]); tilemap_set_scrollx(state->mid_tilemap, 0, state->scroll[0]);
tilemap_set_scrollx(aquarium_bak_tilemap, 0, aquarium_scroll[2]); tilemap_set_scrolly(state->mid_tilemap, 0, state->scroll[1]);
tilemap_set_scrolly(aquarium_bak_tilemap, 0, aquarium_scroll[3]); tilemap_set_scrollx(state->bak_tilemap, 0, state->scroll[2]);
tilemap_set_scrollx(aquarium_txt_tilemap, 0, aquarium_scroll[4]); tilemap_set_scrolly(state->bak_tilemap, 0, state->scroll[3]);
tilemap_set_scrolly(aquarium_txt_tilemap, 0, aquarium_scroll[5]); tilemap_set_scrollx(state->txt_tilemap, 0, state->scroll[4]);
tilemap_set_scrolly(state->txt_tilemap, 0, state->scroll[5]);
tilemap_draw(bitmap,cliprect,aquarium_bak_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->bak_tilemap, 0, 0);
tilemap_draw(bitmap,cliprect,aquarium_mid_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->mid_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap,cliprect,16); draw_sprites(screen->machine, bitmap, cliprect, 16);
tilemap_draw(bitmap,cliprect,aquarium_bak_tilemap,1,0); tilemap_draw(bitmap, cliprect, state->bak_tilemap, 1, 0);
tilemap_draw(bitmap,cliprect,aquarium_mid_tilemap,1,0); tilemap_draw(bitmap, cliprect, state->mid_tilemap, 1, 0);
tilemap_draw(bitmap, cliprect, state->txt_tilemap, 0, 0);
tilemap_draw(bitmap,cliprect,aquarium_txt_tilemap,0,0);
return 0; return 0;
} }

View File

@ -9,27 +9,6 @@
#include "video/resnet.h" #include "video/resnet.h"
/*************************************
*
* Globals
*
*************************************/
static double rweights[3], gweights[3], bweights[3];
static bitmap_t *spritebitmap;
static UINT8 video_control[8];
static UINT8 bitmode_addr[2];
static UINT8 hscroll;
static UINT8 vscroll;
static const UINT8 *syncprom;
static const UINT8 *wpprom;
static const UINT8 *priprom;
/************************************* /*************************************
* *
* Video startup * Video startup
@ -38,27 +17,28 @@ static const UINT8 *priprom;
VIDEO_START( ccastles ) VIDEO_START( ccastles )
{ {
ccastles_state *state = (ccastles_state *)machine->driver_data;
static const int resistances[3] = { 22000, 10000, 4700 }; static const int resistances[3] = { 22000, 10000, 4700 };
/* get pointers to our PROMs */ /* get pointers to our PROMs */
syncprom = memory_region(machine, "proms") + 0x000; state->syncprom = memory_region(machine, "proms") + 0x000;
wpprom = memory_region(machine, "proms") + 0x200; state->wpprom = memory_region(machine, "proms") + 0x200;
priprom = memory_region(machine, "proms") + 0x300; state->priprom = memory_region(machine, "proms") + 0x300;
/* compute the color output resistor weights at startup */ /* compute the color output resistor weights at startup */
compute_resistor_weights(0, 255, -1.0, compute_resistor_weights(0, 255, -1.0,
3, resistances, rweights, 1000, 0, 3, resistances, state->rweights, 1000, 0,
3, resistances, gweights, 1000, 0, 3, resistances, state->gweights, 1000, 0,
3, resistances, bweights, 1000, 0); 3, resistances, state->bweights, 1000, 0);
/* allocate a bitmap for drawing sprites */ /* allocate a bitmap for drawing sprites */
spritebitmap = video_screen_auto_bitmap_alloc(machine->primary_screen); state->spritebitmap = video_screen_auto_bitmap_alloc(machine->primary_screen);
/* register for savestates */ /* register for savestates */
state_save_register_global_array(machine, video_control); state_save_register_global_array(machine, state->video_control);
state_save_register_global_array(machine, bitmode_addr); state_save_register_global_array(machine, state->bitmode_addr);
state_save_register_global(machine, hscroll); state_save_register_global(machine, state->hscroll);
state_save_register_global(machine, vscroll); state_save_register_global(machine, state->vscroll);
} }
@ -71,21 +51,24 @@ VIDEO_START( ccastles )
WRITE8_HANDLER( ccastles_hscroll_w ) WRITE8_HANDLER( ccastles_hscroll_w )
{ {
ccastles_state *state = (ccastles_state *)space->machine->driver_data;
video_screen_update_partial(space->machine->primary_screen, video_screen_get_vpos(space->machine->primary_screen)); video_screen_update_partial(space->machine->primary_screen, video_screen_get_vpos(space->machine->primary_screen));
hscroll = data; state->hscroll = data;
} }
WRITE8_HANDLER( ccastles_vscroll_w ) WRITE8_HANDLER( ccastles_vscroll_w )
{ {
vscroll = data; ccastles_state *state = (ccastles_state *)space->machine->driver_data;
state->vscroll = data;
} }
WRITE8_HANDLER( ccastles_video_control_w ) WRITE8_HANDLER( ccastles_video_control_w )
{ {
ccastles_state *state = (ccastles_state *)space->machine->driver_data;
/* only D3 matters */ /* only D3 matters */
video_control[offset] = (data >> 3) & 1; state->video_control[offset] = (data >> 3) & 1;
} }
@ -98,6 +81,7 @@ WRITE8_HANDLER( ccastles_video_control_w )
WRITE8_HANDLER( ccastles_paletteram_w ) WRITE8_HANDLER( ccastles_paletteram_w )
{ {
ccastles_state *state = (ccastles_state *)space->machine->driver_data;
int bit0, bit1, bit2; int bit0, bit1, bit2;
int r, g, b; int r, g, b;
@ -110,19 +94,19 @@ WRITE8_HANDLER( ccastles_paletteram_w )
bit0 = (~r >> 0) & 0x01; bit0 = (~r >> 0) & 0x01;
bit1 = (~r >> 1) & 0x01; bit1 = (~r >> 1) & 0x01;
bit2 = (~r >> 2) & 0x01; bit2 = (~r >> 2) & 0x01;
r = combine_3_weights(rweights, bit0, bit1, bit2); r = combine_3_weights(state->rweights, bit0, bit1, bit2);
/* green component (inverted) */ /* green component (inverted) */
bit0 = (~g >> 0) & 0x01; bit0 = (~g >> 0) & 0x01;
bit1 = (~g >> 1) & 0x01; bit1 = (~g >> 1) & 0x01;
bit2 = (~g >> 2) & 0x01; bit2 = (~g >> 2) & 0x01;
g = combine_3_weights(gweights, bit0, bit1, bit2); g = combine_3_weights(state->gweights, bit0, bit1, bit2);
/* blue component (inverted) */ /* blue component (inverted) */
bit0 = (~b >> 0) & 0x01; bit0 = (~b >> 0) & 0x01;
bit1 = (~b >> 1) & 0x01; bit1 = (~b >> 1) & 0x01;
bit2 = (~b >> 2) & 0x01; bit2 = (~b >> 2) & 0x01;
b = combine_3_weights(bweights, bit0, bit1, bit2); b = combine_3_weights(state->bweights, bit0, bit1, bit2);
palette_set_color(space->machine, offset & 0x1f, MAKE_RGB(r, g, b)); palette_set_color(space->machine, offset & 0x1f, MAKE_RGB(r, g, b));
} }
@ -136,9 +120,10 @@ WRITE8_HANDLER( ccastles_paletteram_w )
* *
*************************************/ *************************************/
INLINE void ccastles_write_vram(UINT16 addr, UINT8 data, UINT8 bitmd, UINT8 pixba) INLINE void ccastles_write_vram( running_machine *machine, UINT16 addr, UINT8 data, UINT8 bitmd, UINT8 pixba )
{ {
UINT8 *dest = &videoram[addr & 0x7ffe]; ccastles_state *state = (ccastles_state *)machine->driver_data;
UINT8 *dest = &state->videoram[addr & 0x7ffe];
UINT8 promaddr = 0; UINT8 promaddr = 0;
UINT8 wpbits; UINT8 wpbits;
@ -161,7 +146,7 @@ INLINE void ccastles_write_vram(UINT16 addr, UINT8 data, UINT8 bitmd, UINT8 pixb
promaddr |= (pixba << 0); promaddr |= (pixba << 0);
/* look up the PROM result */ /* look up the PROM result */
wpbits = wpprom[promaddr]; wpbits = state->wpprom[promaddr];
/* write to the appropriate parts of VRAM depending on the result */ /* write to the appropriate parts of VRAM depending on the result */
if (!(wpbits & 1)) if (!(wpbits & 1))
@ -182,24 +167,26 @@ INLINE void ccastles_write_vram(UINT16 addr, UINT8 data, UINT8 bitmd, UINT8 pixb
* *
*************************************/ *************************************/
INLINE void bitmode_autoinc(void) INLINE void bitmode_autoinc( running_machine *machine )
{ {
ccastles_state *state = (ccastles_state *)machine->driver_data;
/* auto increment in the x-direction if it's enabled */ /* auto increment in the x-direction if it's enabled */
if (!video_control[0]) /* /AX */ if (!state->video_control[0]) /* /AX */
{ {
if (!video_control[2]) /* /XINC */ if (!state->video_control[2]) /* /XINC */
bitmode_addr[0]++; state->bitmode_addr[0]++;
else else
bitmode_addr[0]--; state->bitmode_addr[0]--;
} }
/* auto increment in the y-direction if it's enabled */ /* auto increment in the y-direction if it's enabled */
if (!video_control[1]) /* /AY */ if (!state->video_control[1]) /* /AY */
{ {
if (!video_control[3]) /* /YINC */ if (!state->video_control[3]) /* /YINC */
bitmode_addr[1]++; state->bitmode_addr[1]++;
else else
bitmode_addr[1]--; state->bitmode_addr[1]--;
} }
} }
@ -214,7 +201,7 @@ INLINE void bitmode_autoinc(void)
WRITE8_HANDLER( ccastles_videoram_w ) WRITE8_HANDLER( ccastles_videoram_w )
{ {
/* direct writes to VRAM go through the write protect PROM as well */ /* direct writes to VRAM go through the write protect PROM as well */
ccastles_write_vram(offset, data, 0, 0); ccastles_write_vram(space->machine, offset, data, 0, 0);
} }
@ -227,14 +214,16 @@ WRITE8_HANDLER( ccastles_videoram_w )
READ8_HANDLER( ccastles_bitmode_r ) READ8_HANDLER( ccastles_bitmode_r )
{ {
ccastles_state *state = (ccastles_state *)space->machine->driver_data;
/* in bitmode, the address comes from the autoincrement latches */ /* in bitmode, the address comes from the autoincrement latches */
UINT16 addr = (bitmode_addr[1] << 7) | (bitmode_addr[0] >> 1); UINT16 addr = (state->bitmode_addr[1] << 7) | (state->bitmode_addr[0] >> 1);
/* the appropriate pixel is selected into the upper 4 bits */ /* the appropriate pixel is selected into the upper 4 bits */
UINT8 result = videoram[addr] << ((~bitmode_addr[0] & 1) * 4); UINT8 result = state->videoram[addr] << ((~state->bitmode_addr[0] & 1) * 4);
/* autoincrement because /BITMD was selected */ /* autoincrement because /BITMD was selected */
bitmode_autoinc(); bitmode_autoinc(space->machine);
/* the low 4 bits of the data lines are not driven so make them all 1's */ /* the low 4 bits of the data lines are not driven so make them all 1's */
return result | 0x0f; return result | 0x0f;
@ -243,25 +232,29 @@ READ8_HANDLER( ccastles_bitmode_r )
WRITE8_HANDLER( ccastles_bitmode_w ) WRITE8_HANDLER( ccastles_bitmode_w )
{ {
ccastles_state *state = (ccastles_state *)space->machine->driver_data;
/* in bitmode, the address comes from the autoincrement latches */ /* in bitmode, the address comes from the autoincrement latches */
UINT16 addr = (bitmode_addr[1] << 7) | (bitmode_addr[0] >> 1); UINT16 addr = (state->bitmode_addr[1] << 7) | (state->bitmode_addr[0] >> 1);
/* the upper 4 bits of data are replicated to the lower 4 bits */ /* the upper 4 bits of data are replicated to the lower 4 bits */
data = (data & 0xf0) | (data >> 4); data = (data & 0xf0) | (data >> 4);
/* write through the generic VRAM routine, passing the low 2 X bits as PIXB/PIXA */ /* write through the generic VRAM routine, passing the low 2 X bits as PIXB/PIXA */
ccastles_write_vram(addr, data, 1, bitmode_addr[0] & 3); ccastles_write_vram(space->machine, addr, data, 1, state->bitmode_addr[0] & 3);
/* autoincrement because /BITMD was selected */ /* autoincrement because /BITMD was selected */
bitmode_autoinc(); bitmode_autoinc(space->machine);
} }
WRITE8_HANDLER( ccastles_bitmode_addr_w ) WRITE8_HANDLER( ccastles_bitmode_addr_w )
{ {
ccastles_state *state = (ccastles_state *)space->machine->driver_data;
/* write through to video RAM and also to the addressing latches */ /* write through to video RAM and also to the addressing latches */
ccastles_write_vram(offset, data, 0, 0); ccastles_write_vram(space->machine, offset, data, 0, 0);
bitmode_addr[offset] = data; state->bitmode_addr[offset] = data;
} }
@ -274,21 +267,22 @@ WRITE8_HANDLER( ccastles_bitmode_addr_w )
VIDEO_UPDATE( ccastles ) VIDEO_UPDATE( ccastles )
{ {
UINT8 *spriteaddr = &spriteram[video_control[7] * 0x100]; /* BUF1/BUF2 */ ccastles_state *state = (ccastles_state *)screen->machine->driver_data;
int flip = video_control[4] ? 0xff : 0x00; /* PLAYER2 */ UINT8 *spriteaddr = &state->spriteram[state->video_control[7] * 0x100]; /* BUF1/BUF2 */
int flip = state->video_control[4] ? 0xff : 0x00; /* PLAYER2 */
pen_t black = get_black_pen(screen->machine); pen_t black = get_black_pen(screen->machine);
int x, y, offs; int x, y, offs;
/* draw the sprites */ /* draw the sprites */
bitmap_fill(spritebitmap, cliprect, 0x0f); bitmap_fill(state->spritebitmap, cliprect, 0x0f);
for (offs = 0; offs < 320/2; offs += 4) for (offs = 0; offs < 320/2; offs += 4)
{ {
int x = spriteaddr[offs+3]; int x = spriteaddr[offs + 3];
int y = 256 - 16 - spriteaddr[offs+1]; int y = 256 - 16 - spriteaddr[offs + 1];
int which = spriteaddr[offs]; int which = spriteaddr[offs];
int color = spriteaddr[offs+2] >> 7; int color = spriteaddr[offs + 2] >> 7;
drawgfx_transpen(spritebitmap, cliprect, screen->machine->gfx[0], which, color, flip, flip, x, y, 7); drawgfx_transpen(state->spritebitmap, cliprect, screen->machine->gfx[0], which, color, flip, flip, x, y, 7);
} }
/* draw the bitmap to the screen, looping over Y */ /* draw the bitmap to the screen, looping over Y */
@ -297,7 +291,7 @@ VIDEO_UPDATE( ccastles )
UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels;
/* if we're in the VBLANK region, just fill with black */ /* if we're in the VBLANK region, just fill with black */
if (syncprom[y] & 1) if (state->syncprom[y] & 1)
{ {
for (x = cliprect->min_x; x <= cliprect->max_x; x++) for (x = cliprect->min_x; x <= cliprect->max_x; x++)
dst[x] = black; dst[x] = black;
@ -306,14 +300,14 @@ VIDEO_UPDATE( ccastles )
/* non-VBLANK region: merge the sprites and the bitmap */ /* non-VBLANK region: merge the sprites and the bitmap */
else else
{ {
UINT16 *mosrc = (UINT16 *)spritebitmap->base + y * spritebitmap->rowpixels; UINT16 *mosrc = (UINT16 *)state->spritebitmap->base + y * state->spritebitmap->rowpixels;
int effy = (((y - ccastles_vblank_end) + (flip ? 0 : vscroll)) ^ flip) & 0xff; int effy = (((y - state->vblank_end) + (flip ? 0 : state->vscroll)) ^ flip) & 0xff;
UINT8 *src; UINT8 *src;
/* the "POTATO" chip does some magic here; this is just a guess */ /* the "POTATO" chip does some magic here; this is just a guess */
if (effy < 24) if (effy < 24)
effy = 24; effy = 24;
src = &videoram[effy * 128]; src = &state->videoram[effy * 128];
/* loop over X */ /* loop over X */
for (x = cliprect->min_x; x <= cliprect->max_x; x++) for (x = cliprect->min_x; x <= cliprect->max_x; x++)
@ -325,7 +319,7 @@ VIDEO_UPDATE( ccastles )
/* otherwise, process normally */ /* otherwise, process normally */
else else
{ {
int effx = (hscroll + (x ^ flip)) & 255; int effx = (state->hscroll + (x ^ flip)) & 255;
/* low 4 bits = left pixel, high 4 bits = right pixel */ /* low 4 bits = left pixel, high 4 bits = right pixel */
UINT8 pix = (src[effx / 2] >> ((effx & 1) * 4)) & 0x0f; UINT8 pix = (src[effx / 2] >> ((effx & 1) * 4)) & 0x0f;
@ -347,7 +341,7 @@ VIDEO_UPDATE( ccastles )
prindex |= (mopix & 7) << 2; prindex |= (mopix & 7) << 2;
prindex |= (mopix & 8) >> 2; prindex |= (mopix & 8) >> 2;
prindex |= (pix & 8) >> 3; prindex |= (pix & 8) >> 3;
prvalue = priprom[prindex]; prvalue = state->priprom[prindex];
/* Bit 1 of prvalue selects the low 4 bits of the final pixel */ /* Bit 1 of prvalue selects the low 4 bits of the final pixel */
if (prvalue & 2) if (prvalue & 2)