Added save states to the following drivers: ddayjlc.c, ddealer.c, deniam.c, discoboy.c, diverboy.c, dorachan.c, dragrace.c, dreamwld.c, dribling.c, drmicro.c, drtomy.c

This commit is contained in:
Fabio Priuli 2009-11-25 01:13:14 +00:00
parent 3ac828ef36
commit c2d537c3dd
22 changed files with 1454 additions and 961 deletions

3
.gitattributes vendored
View File

@ -2406,6 +2406,7 @@ src/mame/includes/deco16ic.h svneol=native#text/plain
src/mame/includes/deco32.h svneol=native#text/plain src/mame/includes/deco32.h svneol=native#text/plain
src/mame/includes/decocrpt.h svneol=native#text/plain src/mame/includes/decocrpt.h svneol=native#text/plain
src/mame/includes/decoprot.h svneol=native#text/plain src/mame/includes/decoprot.h svneol=native#text/plain
src/mame/includes/deniam.h svneol=native#text/plain
src/mame/includes/dkong.h svneol=native#text/plain src/mame/includes/dkong.h svneol=native#text/plain
src/mame/includes/docastle.h svneol=native#text/plain src/mame/includes/docastle.h svneol=native#text/plain
src/mame/includes/dogfgt.h svneol=native#text/plain src/mame/includes/dogfgt.h svneol=native#text/plain
@ -2413,6 +2414,7 @@ src/mame/includes/dooyong.h svneol=native#text/plain
src/mame/includes/dragrace.h svneol=native#text/plain src/mame/includes/dragrace.h svneol=native#text/plain
src/mame/includes/drgnmst.h svneol=native#text/plain src/mame/includes/drgnmst.h svneol=native#text/plain
src/mame/includes/dribling.h svneol=native#text/plain src/mame/includes/dribling.h svneol=native#text/plain
src/mame/includes/drmicro.h svneol=native#text/plain
src/mame/includes/dynax.h svneol=native#text/plain src/mame/includes/dynax.h svneol=native#text/plain
src/mame/includes/eolithsp.h svneol=native#text/plain src/mame/includes/eolithsp.h svneol=native#text/plain
src/mame/includes/epos.h svneol=native#text/plain src/mame/includes/epos.h svneol=native#text/plain
@ -3145,7 +3147,6 @@ src/mame/video/decocass.c svneol=native#text/plain
src/mame/video/deniam.c svneol=native#text/plain src/mame/video/deniam.c svneol=native#text/plain
src/mame/video/dietgo.c svneol=native#text/plain src/mame/video/dietgo.c svneol=native#text/plain
src/mame/video/digdug.c svneol=native#text/plain src/mame/video/digdug.c svneol=native#text/plain
src/mame/video/diverboy.c svneol=native#text/plain
src/mame/video/djboy.c svneol=native#text/plain src/mame/video/djboy.c svneol=native#text/plain
src/mame/video/djmain.c svneol=native#text/plain src/mame/video/djmain.c svneol=native#text/plain
src/mame/video/dkong.c svneol=native#text/plain src/mame/video/dkong.c svneol=native#text/plain

View File

@ -55,19 +55,29 @@ $842f = lives
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
static INT32 char_bank = 0;
static tilemap *bg_tilemap;
static UINT8 *bgram;
static UINT8 *mainram;
static INT32 bgadr = 0;
static INT32 sound_nmi_enable = 0; typedef struct _ddayjlc_state ddayjlc_state;
static INT32 main_nmi_enable = 0; struct _ddayjlc_state
{
/* memory pointers */
UINT8 * bgram;
UINT8 * mainram;
UINT8 * videoram;
UINT8 * spriteram;
static INT32 e00x_l[4]; /* video-related */
static INT32 e00x_d[4][2]; tilemap *bg_tilemap;
INT32 char_bank;
INT32 bgadr;
/* misc */
INT32 sound_nmi_enable;
INT32 main_nmi_enable;
INT32 e00x_l[4];
INT32 e00x_d[4][2];
UINT8 prot_addr;
};
static UINT8 protAdr;
/* /*
@ -104,7 +114,7 @@ static UINT8 protAdr;
*/ */
static const UINT8 protData[0x10] = static const UINT8 prot_data[0x10] =
{ {
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
@ -114,81 +124,98 @@ static const UINT8 protData[0x10] =
static CUSTOM_INPUT( prot_r ) static CUSTOM_INPUT( prot_r )
{ {
return protData[protAdr]; ddayjlc_state *state = (ddayjlc_state *)field->port->machine->driver_data;
return prot_data[state->prot_addr];
} }
static WRITE8_HANDLER( prot_w ) static WRITE8_HANDLER( prot_w )
{ {
protAdr = (protAdr & (~(1<<offset))) | ((data & 1)<<offset); ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
state->prot_addr = (state->prot_addr & (~(1 << offset))) | ((data & 1) << offset);
} }
static WRITE8_HANDLER( char_bank_w ) static WRITE8_HANDLER( char_bank_w )
{ {
char_bank = data; ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
state->char_bank = data;
} }
static WRITE8_HANDLER( ddayjlc_bgram_w ) static WRITE8_HANDLER( ddayjlc_bgram_w )
{ {
if(!offset) ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
tilemap_set_scrollx(bg_tilemap, 0, data + 8);
bgram[offset] = data; if (!offset)
tilemap_mark_tile_dirty(bg_tilemap, offset & 0x3ff); tilemap_set_scrollx(state->bg_tilemap, 0, data + 8);
state->bgram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset & 0x3ff);
} }
static WRITE8_HANDLER( ddayjlc_videoram_w ) static WRITE8_HANDLER( ddayjlc_videoram_w )
{ {
videoram[offset] = data; ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
state->videoram[offset] = data;
} }
static WRITE8_HANDLER(sound_nmi_w) static WRITE8_HANDLER(sound_nmi_w)
{ {
sound_nmi_enable = data; ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
state->sound_nmi_enable = data;
} }
static WRITE8_HANDLER(main_nmi_w) static WRITE8_HANDLER(main_nmi_w)
{ {
main_nmi_enable = data; ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
state->main_nmi_enable = data;
} }
static WRITE8_HANDLER( bg0_w ) static WRITE8_HANDLER( bg0_w )
{ {
bgadr = (bgadr & 0xfe) | (data & 1); ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
state->bgadr = (state->bgadr & 0xfe) | (data & 1);
} }
static WRITE8_HANDLER( bg1_w ) static WRITE8_HANDLER( bg1_w )
{ {
bgadr = (bgadr & 0xfd) | ((data & 1)<<1); ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
state->bgadr = (state->bgadr & 0xfd) | ((data & 1) << 1);
} }
static WRITE8_HANDLER(bg2_w) static WRITE8_HANDLER( bg2_w )
{ {
bgadr = (bgadr & 0xfb) | ((data & 1)<<2); ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
if(bgadr > 2)
bgadr = 0; state->bgadr = (state->bgadr & 0xfb) | ((data & 1) << 2);
memory_set_bankptr(space->machine, 1, memory_region(space->machine, "user1") + bgadr * 0x4000 ); if (state->bgadr > 2)
state->bgadr = 0;
memory_set_bank(space->machine, 1, state->bgadr);
} }
static WRITE8_HANDLER( sound_w ) static WRITE8_HANDLER( sound_w )
{ {
soundlatch_w(space,offset,data); soundlatch_w(space, offset, data);
cputag_set_input_line_and_vector(space->machine, "audiocpu", 0, HOLD_LINE, 0xff); cputag_set_input_line_and_vector(space->machine, "audiocpu", 0, HOLD_LINE, 0xff);
} }
static WRITE8_HANDLER( i8257_CH0_w ) static WRITE8_HANDLER( i8257_CH0_w )
{ {
e00x_d[offset][e00x_l[offset]] = data; ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
e00x_l[offset] ^= 1;
state->e00x_d[offset][state->e00x_l[offset]] = data;
state->e00x_l[offset] ^= 1;
} }
static WRITE8_HANDLER( i8257_LMSR_w ) static WRITE8_HANDLER( i8257_LMSR_w )
{ {
if(!data) ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data;
if (!data)
{ {
INT32 src = e00x_d[0][1] * 256 + e00x_d[0][0]; INT32 src = state->e00x_d[0][1] * 256 + state->e00x_d[0][0];
INT32 dst = e00x_d[2][1] * 256 + e00x_d[2][0]; INT32 dst = state->e00x_d[2][1] * 256 + state->e00x_d[2][0];
INT32 size = (e00x_d[1][1] * 256 + e00x_d[1][0]) & 0x3ff; INT32 size = (state->e00x_d[1][1] * 256 + state->e00x_d[1][0]) & 0x3ff;
INT32 i; INT32 i;
size++; //?? size++; //??
@ -198,19 +225,19 @@ static WRITE8_HANDLER( i8257_LMSR_w )
memory_write_byte(space, dst++, memory_read_byte(space, src++)); memory_write_byte(space, dst++, memory_read_byte(space, src++));
} }
e00x_l[0] = 0; state->e00x_l[0] = 0;
e00x_l[1] = 0; state->e00x_l[1] = 0;
e00x_l[2] = 0; state->e00x_l[2] = 0;
e00x_l[3] = 0; state->e00x_l[3] = 0;
} }
} }
static ADDRESS_MAP_START( main_cpu, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_cpu, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x8fff) AM_RAM AM_BASE(&mainram) AM_RANGE(0x8000, 0x8fff) AM_RAM AM_BASE_MEMBER(ddayjlc_state, mainram)
AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE(&spriteram) AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE_MEMBER(ddayjlc_state, spriteram)
AM_RANGE(0x9400, 0x97ff) AM_RAM_WRITE(ddayjlc_videoram_w) AM_BASE(&videoram) AM_RANGE(0x9400, 0x97ff) AM_RAM_WRITE(ddayjlc_videoram_w) AM_BASE_MEMBER(ddayjlc_state, videoram)
AM_RANGE(0x9800, 0x9fff) AM_RAM_WRITE(ddayjlc_bgram_w) AM_BASE(&bgram) /* 9800-981f - videoregs */ AM_RANGE(0x9800, 0x9fff) AM_RAM_WRITE(ddayjlc_bgram_w) AM_BASE_MEMBER(ddayjlc_state, bgram) /* 9800-981f - videoregs */
AM_RANGE(0xa000, 0xdfff) AM_ROMBANK(1) AM_WRITENOP AM_RANGE(0xa000, 0xdfff) AM_ROMBANK(1) AM_WRITENOP
AM_RANGE(0xe000, 0xe003) AM_WRITE(i8257_CH0_w) AM_RANGE(0xe000, 0xe003) AM_WRITE(i8257_CH0_w)
AM_RANGE(0xe008, 0xe008) AM_WRITENOP AM_RANGE(0xe008, 0xe008) AM_WRITENOP
@ -234,13 +261,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_cpu, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sound_cpu, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x2000, 0x23ff) AM_RAM AM_RANGE(0x2000, 0x23ff) AM_RAM
AM_RANGE(0x7000, 0x7000) AM_WRITE(sound_nmi_w)
AM_RANGE(0x3000, 0x3000) AM_DEVREADWRITE("ay1", ay8910_r, ay8910_data_w) AM_RANGE(0x3000, 0x3000) AM_DEVREADWRITE("ay1", ay8910_r, ay8910_data_w)
AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("ay1", ay8910_address_w) AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("ay1", ay8910_address_w)
AM_RANGE(0x5000, 0x5000) AM_DEVREADWRITE("ay2", ay8910_r, ay8910_data_w) AM_RANGE(0x5000, 0x5000) AM_DEVREADWRITE("ay2", ay8910_r, ay8910_data_w)
AM_RANGE(0x6000, 0x6000) AM_DEVWRITE("ay2", ay8910_address_w) AM_RANGE(0x6000, 0x6000) AM_DEVWRITE("ay2", ay8910_address_w)
AM_RANGE(0x7000, 0x7000) AM_WRITE(sound_nmi_w)
ADDRESS_MAP_END ADDRESS_MAP_END
static INPUT_PORTS_START( ddayjlc ) static INPUT_PORTS_START( ddayjlc )
@ -334,45 +359,48 @@ GFXDECODE_END
static TILE_GET_INFO( get_tile_info_bg ) static TILE_GET_INFO( get_tile_info_bg )
{ {
int code = bgram[tile_index]+((bgram[tile_index+0x400]&(1<<3))<<(8-3)); ddayjlc_state *state = (ddayjlc_state *)machine->driver_data;
int code = state->bgram[tile_index] + ((state->bgram[tile_index + 0x400] & (1 << 3)) << (8 - 3));
SET_TILE_INFO(2, code, 0, 0); SET_TILE_INFO(2, code, 0, 0);
} }
static VIDEO_START( ddayjlc ) static VIDEO_START( ddayjlc )
{ {
bg_tilemap = tilemap_create(machine, get_tile_info_bg,tilemap_scan_rows,8,8,32,32); ddayjlc_state *state = (ddayjlc_state *)machine->driver_data;
state->bg_tilemap = tilemap_create(machine, get_tile_info_bg, tilemap_scan_rows, 8, 8, 32, 32);
} }
static VIDEO_UPDATE( ddayjlc ) static VIDEO_UPDATE( ddayjlc )
{ {
ddayjlc_state *state = (ddayjlc_state *)screen->machine->driver_data;
UINT32 i; UINT32 i;
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
for (i = 0; i < 0x400; i += 4) for (i = 0; i < 0x400; i += 4)
{ {
INT32 flags = spriteram[i + 2]; INT32 flags = state->spriteram[i + 2];
INT32 y = 256-spriteram[i + 0]-8; INT32 y = 256 - state->spriteram[i + 0] - 8;
INT32 code = spriteram[i + 1]; INT32 code = state->spriteram[i + 1];
INT32 x = spriteram[i + 3]-16; INT32 x = state->spriteram[i + 3] - 16;
INT32 xflip = flags&0x80; INT32 xflip = flags & 0x80;
INT32 yflip = (code&0x80); INT32 yflip = (code & 0x80);
code=(code&0x7f)|((flags&0x30)<<3); code = (code & 0x7f) | ((flags & 0x30) << 3);
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[0], code, 1, xflip, yflip, x, y, 0); drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[0], code, 1, xflip, yflip, x, y, 0);
} }
{ {
UINT32 x,y,c; UINT32 x, y, c;
for(y=0;y<32;y++) for (y = 0; y < 32; y++)
for(x=0;x<32;x++) for (x = 0; x < 32; x++)
{ {
c=videoram[y*32+x]; c = state->videoram[y * 32 + x];
if(x>1&&x<30) if (x > 1 && x < 30)
drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1], c+char_bank*0x100, 1, 0, 0, x*8, y*8, 0); drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1], c + state->char_bank * 0x100, 1, 0, 0, x*8, y*8, 0);
else else
drawgfx_opaque(bitmap, cliprect, screen->machine->gfx[1], c+char_bank*0x100, 1, 0, 0, x*8, y*8); drawgfx_opaque(bitmap, cliprect, screen->machine->gfx[1], c + state->char_bank * 0x100, 1, 0, 0, x*8, y*8);
} }
} }
return 0; return 0;
@ -390,17 +418,61 @@ static const ay8910_interface ay8910_config =
static INTERRUPT_GEN( ddayjlc_interrupt ) static INTERRUPT_GEN( ddayjlc_interrupt )
{ {
if(main_nmi_enable) ddayjlc_state *state = (ddayjlc_state *)device->machine->driver_data;
if(state->main_nmi_enable)
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
} }
static INTERRUPT_GEN( ddayjlc_snd_interrupt ) static INTERRUPT_GEN( ddayjlc_snd_interrupt )
{ {
if(sound_nmi_enable) ddayjlc_state *state = (ddayjlc_state *)device->machine->driver_data;
if(state->sound_nmi_enable)
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
} }
static MACHINE_START( ddayjlc )
{
ddayjlc_state *state = (ddayjlc_state *)machine->driver_data;
state_save_register_global(machine, state->char_bank);
state_save_register_global(machine, state->bgadr);
state_save_register_global(machine, state->sound_nmi_enable);
state_save_register_global(machine, state->main_nmi_enable);
state_save_register_global(machine, state->prot_addr);
state_save_register_global_array(machine, state->e00x_l);
state_save_register_global_array(machine, state->e00x_d[0]);
state_save_register_global_array(machine, state->e00x_d[1]);
state_save_register_global_array(machine, state->e00x_d[2]);
state_save_register_global_array(machine, state->e00x_d[3]);
}
static MACHINE_RESET( ddayjlc )
{
ddayjlc_state *state = (ddayjlc_state *)machine->driver_data;
int i;
state->char_bank = 0;
state->bgadr = 0;
state->sound_nmi_enable = 0;
state->main_nmi_enable = 0;
state->prot_addr = 0;
for (i = 0; i < 4; i++)
{
state->e00x_l[i] = 0;
state->e00x_d[i][0] = 0;
state->e00x_d[i][1] = 0;
}
}
static MACHINE_DRIVER_START( ddayjlc ) static MACHINE_DRIVER_START( ddayjlc )
/* driver data */
MDRV_DRIVER_DATA(ddayjlc_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,12000000/3) MDRV_CPU_ADD("maincpu", Z80,12000000/3)
MDRV_CPU_PROGRAM_MAP(main_cpu) MDRV_CPU_PROGRAM_MAP(main_cpu)
MDRV_CPU_VBLANK_INT("screen", ddayjlc_interrupt) MDRV_CPU_VBLANK_INT("screen", ddayjlc_interrupt)
@ -411,6 +483,9 @@ static MACHINE_DRIVER_START( ddayjlc )
MDRV_QUANTUM_TIME(HZ(6000)) MDRV_QUANTUM_TIME(HZ(6000))
MDRV_MACHINE_START(ddayjlc)
MDRV_MACHINE_RESET(ddayjlc)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -561,21 +636,21 @@ static DRIVER_INIT( ddayjlc )
dst = memory_region(machine, "gfx1"); dst = memory_region(machine, "gfx1");
length = memory_region_length(machine, "gfx1"); length = memory_region_length(machine, "gfx1");
memcpy(src, dst, length); memcpy(src, dst, length);
newadr=0; newadr = 0;
oldaddr=0; oldaddr = 0;
for (j = 0; j < length/2; j+=32) for (j = 0; j < length / 2; j += 32)
{ {
repack(0); repack(0);
repack(0x4000) repack(0x4000)
newadr+=32; newadr += 32;
oldaddr+=16; oldaddr += 16;
} }
free(temp); free(temp);
} }
memory_set_bankptr(machine, 1, memory_region(machine, "user1") ); memory_configure_bank(machine, 1, 0, 3, memory_region(machine, "user1"), 0x4000);
memory_set_bank(machine, 1, 0);
} }
GAME( 1984, ddayjlc, 0, ddayjlc, ddayjlc, ddayjlc, ROT90, "Jaleco", "D-Day (Jaleco set 1)", GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) GAME( 1984, ddayjlc, 0, ddayjlc, ddayjlc, ddayjlc, ROT90, "Jaleco", "D-Day (Jaleco set 1)", GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1984, ddayjlca, ddayjlc, ddayjlc, ddayjlc, ddayjlc, ROT90, "Jaleco", "D-Day (Jaleco set 2)", GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) GAME( 1984, ddayjlca, ddayjlc, ddayjlc, ddayjlc, ddayjlc, ROT90, "Jaleco", "D-Day (Jaleco set 2)", GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -113,21 +113,42 @@ Few words about protection:
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "sound/2203intf.h" #include "sound/2203intf.h"
static UINT16 *mcu_shared_ram,*work_ram; typedef struct _ddealer_state ddealer_state;
static UINT16 *back_vram,*left_fg_vram_top, *right_fg_vram_top, *right_fg_vram_bottom, *left_fg_vram_bottom; struct _ddealer_state
static UINT16 *ddealer_vregs; {
static tilemap *back_tilemap; /* memory pointers */
static int respcount; UINT16 * mcu_shared_ram;
static int ddealer_flipscreen; UINT16 * work_ram;
UINT16 * back_vram;
UINT16 * left_fg_vram_top;
UINT16 * right_fg_vram_top;
UINT16 * left_fg_vram_bottom;
UINT16 * right_fg_vram_bottom;
UINT16 * vregs;
// UINT16 * paletteram16; // currently this uses generic palette handling
/* video-related */
tilemap *back_tilemap;
int respcount;
int flipscreen;
/* misc */
UINT8 input_pressed;
UINT16 coin_input;
};
static WRITE16_HANDLER( ddealer_flipscreen_w ) static WRITE16_HANDLER( ddealer_flipscreen_w )
{ {
ddealer_flipscreen = data & 0x01; ddealer_state *state = (ddealer_state *)space->machine->driver_data;
state->flipscreen = data & 0x01;
} }
static TILE_GET_INFO( get_back_tile_info ) static TILE_GET_INFO( get_back_tile_info )
{ {
int code = back_vram[tile_index]; ddealer_state *state = (ddealer_state *)machine->driver_data;
int code = state->back_vram[tile_index];
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
code & 0xfff, code & 0xfff,
@ -137,58 +158,56 @@ static TILE_GET_INFO( get_back_tile_info )
static VIDEO_START( ddealer ) static VIDEO_START( ddealer )
{ {
ddealer_flipscreen = 0; ddealer_state *state = (ddealer_state *)machine->driver_data;
back_tilemap = tilemap_create(machine, get_back_tile_info,tilemap_scan_cols,8,8,64,32); state->flipscreen = 0;
state->back_tilemap = tilemap_create(machine, get_back_tile_info, tilemap_scan_cols, 8, 8, 64, 32);
} }
static void ddealer_draw_video_layer( running_machine *machine, UINT16* vreg_base, UINT16* top, UINT16* bottom, bitmap_t* bitmap, const rectangle *cliprect, int flipy) static void ddealer_draw_video_layer( running_machine *machine, UINT16* vreg_base, UINT16* top, UINT16* bottom, bitmap_t* bitmap, const rectangle *cliprect, int flipy)
{ {
const gfx_element *gfx = machine->gfx[1]; const gfx_element *gfx = machine->gfx[1];
{
INT16 sx, sy; INT16 sx, sy;
int x,y, count; int x,y, count;
UINT16* src; UINT16* src;
sx = ((vreg_base[0x4/2] & 0xff)); sx = ((vreg_base[0x4 / 2] & 0xff));
sx |= ((vreg_base[0x2/2] & 0xff) << 8); sx |= ((vreg_base[0x2 / 2] & 0xff) << 8);
sx &=0x7ff; sx &= 0x7ff;
if (sx & 0x400) sx-=0x800; if (sx & 0x400) sx -= 0x800;
sy = ((vreg_base[0x8/2] & 0xff));
sy |= ((vreg_base[0x6/2] & 0xff) << 8);
sy = ((vreg_base[0x8 / 2] & 0xff));
sy |= ((vreg_base[0x6 / 2] & 0xff) << 8);
if (!flipy) if (!flipy)
{ {
sx -= 64; // video shift sx -= 64; // video shift
/* the tilemaps seems to be split into top / bottom pieces */ /* the tilemaps seems to be split into top / bottom pieces */
count = 0; count = 0;
src = top; src = top;
for (x=0;x<128;x++) for (x = 0; x < 128; x++)
{ {
for (y=0;y<16;y++) for (y = 0; y < 16; y++)
{ {
UINT16 tile = (src[count]&0x0fff); UINT16 tile = (src[count] & 0x0fff);
UINT16 colr = (src[count]&0xf000)>>12; UINT16 colr = (src[count] & 0xf000) >> 12;
count++; count++;
drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,0,flipy,(x*16)-sx,(y*16)-sy,15); drawgfx_transpen(bitmap, cliprect, gfx, tile, colr, 0, flipy, (x * 16) - sx, (y * 16) - sy, 15);
} }
} }
count = 0; count = 0;
src = bottom; src = bottom;
sy -= 256; sy -= 256;
for (x=0;x<128;x++) for (x = 0; x < 128; x++)
{ {
for (y=0;y<16;y++) for (y = 0; y < 16; y++)
{ {
UINT16 tile = (src[count]&0x0fff); UINT16 tile = (src[count] & 0x0fff);
UINT16 colr = (src[count]&0xf000)>>12; UINT16 colr = (src[count] & 0xf000) >> 12;
count++; count++;
drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,0,flipy,(x*16)-sx,(y*16)-sy,15); drawgfx_transpen(bitmap, cliprect, gfx, tile, colr, 0, flipy, (x * 16) - sx, (y * 16) - sy, 15);
} }
} }
} }
@ -200,28 +219,27 @@ static void ddealer_draw_video_layer( running_machine *machine, UINT16* vreg_bas
/* the tilemaps seems to be split into top / bottom pieces */ /* the tilemaps seems to be split into top / bottom pieces */
count = 0; count = 0;
src = top; src = top;
for (x=128;x>0;x--) for (x = 128; x > 0; x--)
{ {
for (y=16;y>0;y--) for (y = 16; y > 0; y--)
{ {
UINT16 tile = (src[count]&0x0fff); UINT16 tile = (src[count] & 0x0fff);
UINT16 colr = (src[count]&0xf000)>>12; UINT16 colr = (src[count] & 0xf000) >> 12;
count++; count++;
drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,flipy,flipy,(x*16)+sx,(y*16)+sy,15); drawgfx_transpen(bitmap, cliprect, gfx, tile, colr, flipy, flipy, (x * 16) + sx, (y * 16) + sy, 15);
} }
} }
count = 0; count = 0;
src = bottom; src = bottom;
sy -= 256; sy -= 256;
for (x=128;x>0;x--) for (x = 128; x > 0; x--)
{ {
for (y=16;y>0;y--) for (y = 16; y > 0; y--)
{ {
UINT16 tile = (src[count]&0x0fff); UINT16 tile = (src[count] & 0x0fff);
UINT16 colr = (src[count]&0xf000)>>12; UINT16 colr = (src[count] & 0xf000) >> 12;
count++; count++;
drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,flipy,flipy,(x*16)+sx,(y*16)+sy,15); drawgfx_transpen(bitmap, cliprect, gfx, tile, colr, flipy, flipy, (x * 16) + sx, (y * 16) + sy, 15);
}
} }
} }
} }
@ -230,9 +248,10 @@ static void ddealer_draw_video_layer( running_machine *machine, UINT16* vreg_bas
static VIDEO_UPDATE( ddealer ) static VIDEO_UPDATE( ddealer )
{ {
tilemap_set_scrollx( back_tilemap, 0, ddealer_flipscreen? -192: -64); ddealer_state *state = (ddealer_state *)screen->machine->driver_data;
tilemap_set_flip(back_tilemap, ddealer_flipscreen? TILEMAP_FLIPY|TILEMAP_FLIPX:0); tilemap_set_scrollx(state->back_tilemap, 0, state->flipscreen ? -192 : -64);
tilemap_draw(bitmap,cliprect,back_tilemap,0,0); tilemap_set_flip(state->back_tilemap, state->flipscreen ? TILEMAP_FLIPY | TILEMAP_FLIPX : 0);
tilemap_draw(bitmap, cliprect, state->back_tilemap, 0, 0);
/* the fg tilemap handling is a little hacky right now, /* the fg tilemap handling is a little hacky right now,
i'm not sure if it should be a single tilemap with i'm not sure if it should be a single tilemap with
@ -240,28 +259,28 @@ static VIDEO_UPDATE( ddealer )
combined, the flipscreen case makes things more combined, the flipscreen case makes things more
difficult to understand */ difficult to understand */
if (!ddealer_flipscreen) if (!state->flipscreen)
{ {
if (ddealer_vregs[0xcc/2] & 0x80) if (state->vregs[0xcc / 2] & 0x80)
{ {
ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &state->vregs[0x1e0 / 2], state->left_fg_vram_top, state->left_fg_vram_bottom, bitmap, cliprect, state->flipscreen);
ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0xcc/2], right_fg_vram_top, right_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &state->vregs[0xcc / 2], state->right_fg_vram_top, state->right_fg_vram_bottom, bitmap, cliprect, state->flipscreen);
} }
else else
{ {
ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &state->vregs[0x1e0 / 2], state->left_fg_vram_top, state->left_fg_vram_bottom, bitmap, cliprect, state->flipscreen);
} }
} }
else else
{ {
if (ddealer_vregs[0xcc/2] & 0x80) if (state->vregs[0xcc / 2] & 0x80)
{ {
ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0xcc/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &state->vregs[0xcc / 2], state->left_fg_vram_top, state->left_fg_vram_bottom, bitmap, cliprect, state->flipscreen);
ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], right_fg_vram_top, right_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &state->vregs[0x1e0 / 2], state->right_fg_vram_top, state->right_fg_vram_bottom, bitmap, cliprect, state->flipscreen);
} }
else else
{ {
ddealer_draw_video_layer(screen->machine, &ddealer_vregs[0x1e0/2], left_fg_vram_top, left_fg_vram_bottom, bitmap, cliprect, ddealer_flipscreen); ddealer_draw_video_layer(screen->machine, &state->vregs[0x1e0 / 2], state->left_fg_vram_top, state->left_fg_vram_bottom, bitmap, cliprect, state->flipscreen);
} }
} }
@ -271,82 +290,83 @@ static VIDEO_UPDATE( ddealer )
static TIMER_DEVICE_CALLBACK( ddealer_mcu_sim ) static TIMER_DEVICE_CALLBACK( ddealer_mcu_sim )
{ {
ddealer_state *state = (ddealer_state *)timer->machine->driver_data;
/*coin/credit simulation*/ /*coin/credit simulation*/
/*$fe002 is used,might be for multiple coins for one credit settings.*/ /*$fe002 is used,might be for multiple coins for one credit settings.*/
static UINT8 input_pressed; state->coin_input = (~(input_port_read(timer->machine, "IN0")));
static UINT16 coin_input;
coin_input = (~(input_port_read(timer->machine, "IN0"))); if (state->coin_input & 0x01)//coin 1
if(coin_input & 0x01)//coin 1
{ {
if((input_pressed & 0x01) == 0) if((state->input_pressed & 0x01) == 0)
mcu_shared_ram[0x000/2]++; state->mcu_shared_ram[0x000 / 2]++;
input_pressed = (input_pressed & 0xfe) | 1; state->input_pressed = (state->input_pressed & 0xfe) | 1;
} }
else else
input_pressed = (input_pressed & 0xfe); state->input_pressed = (state->input_pressed & 0xfe);
if(coin_input & 0x02)//coin 2 if (state->coin_input & 0x02)//coin 2
{ {
if((input_pressed & 0x02) == 0) if ((state->input_pressed & 0x02) == 0)
mcu_shared_ram[0x000/2]++; state->mcu_shared_ram[0x000 / 2]++;
input_pressed = (input_pressed & 0xfd) | 2; state->input_pressed = (state->input_pressed & 0xfd) | 2;
} }
else else
input_pressed = (input_pressed & 0xfd); state->input_pressed = (state->input_pressed & 0xfd);
if(coin_input & 0x04)//service 1 if (state->coin_input & 0x04)//service 1
{ {
if((input_pressed & 0x04) == 0) if ((state->input_pressed & 0x04) == 0)
mcu_shared_ram[0x000/2]++; state->mcu_shared_ram[0x000 / 2]++;
input_pressed = (input_pressed & 0xfb) | 4; state->input_pressed = (state->input_pressed & 0xfb) | 4;
} }
else else
input_pressed = (input_pressed & 0xfb); state->input_pressed = (state->input_pressed & 0xfb);
/*0x104/2 is some sort of "start-lock",i.e. used on the girl selection. /*0x104/2 is some sort of "start-lock",i.e. used on the girl selection.
Without it,the game "steals" one credit if you press the start button on that.*/ Without it,the game "steals" one credit if you press the start button on that.*/
if(mcu_shared_ram[0x000/2] > 0 && work_ram[0x104/2] & 1) if (state->mcu_shared_ram[0x000 / 2] > 0 && state->work_ram[0x104 / 2] & 1)
{ {
if(coin_input & 0x08)//start 1 if (state->coin_input & 0x08)//start 1
{ {
if((input_pressed & 0x08) == 0 && (~(work_ram[0x100/2] & 1))) if ((state->input_pressed & 0x08) == 0 && (~(state->work_ram[0x100 / 2] & 1)))
mcu_shared_ram[0x000/2]--; state->mcu_shared_ram[0x000 / 2]--;
input_pressed = (input_pressed & 0xf7) | 8; state->input_pressed = (state->input_pressed & 0xf7) | 8;
} }
else else
input_pressed = (input_pressed & 0xf7); state->input_pressed = (state->input_pressed & 0xf7);
if(coin_input & 0x10)//start 2 if (state->coin_input & 0x10)//start 2
{ {
if((input_pressed & 0x10) == 0 && (~(work_ram[0x100/2] & 2))) if((state->input_pressed & 0x10) == 0 && (~(state->work_ram[0x100 / 2] & 2)))
mcu_shared_ram[0x000/2]--; state->mcu_shared_ram[0x000 / 2]--;
input_pressed = (input_pressed & 0xef) | 0x10; state->input_pressed = (state->input_pressed & 0xef) | 0x10;
} }
else else
input_pressed = (input_pressed & 0xef); state->input_pressed = (state->input_pressed & 0xef);
} }
/*random number generators,controls order of cards*/ /*random number generators,controls order of cards*/
mcu_shared_ram[0x10/2] = mame_rand(timer->machine) & 0xffff; state->mcu_shared_ram[0x10 / 2] = mame_rand(timer->machine) & 0xffff;
mcu_shared_ram[0x12/2] = mame_rand(timer->machine) & 0xffff; state->mcu_shared_ram[0x12 / 2] = mame_rand(timer->machine) & 0xffff;
mcu_shared_ram[0x14/2] = mame_rand(timer->machine) & 0xffff; state->mcu_shared_ram[0x14 / 2] = mame_rand(timer->machine) & 0xffff;
mcu_shared_ram[0x16/2] = mame_rand(timer->machine) & 0xffff; state->mcu_shared_ram[0x16 / 2] = mame_rand(timer->machine) & 0xffff;
} }
static WRITE16_HANDLER( back_vram_w ) static WRITE16_HANDLER( back_vram_w )
{ {
COMBINE_DATA(&back_vram[offset]); ddealer_state *state = (ddealer_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(back_tilemap,offset); COMBINE_DATA(&state->back_vram[offset]);
tilemap_mark_tile_dirty(state->back_tilemap, offset);
} }
static WRITE16_HANDLER( ddealer_vregs_w ) static WRITE16_HANDLER( ddealer_vregs_w )
{ {
COMBINE_DATA(&ddealer_vregs[offset]); ddealer_state *state = (ddealer_state *)space->machine->driver_data;
COMBINE_DATA(&state->vregs[offset]);
} }
/****************************************************************************************************** /******************************************************************************************************
@ -356,24 +376,25 @@ Protection handling,identical to Hacha Mecha Fighter / Thunder Dragon with diffe
******************************************************************************************************/ ******************************************************************************************************/
#define PROT_JSR(_offs_,_protvalue_,_pc_) \ #define PROT_JSR(_offs_,_protvalue_,_pc_) \
if(mcu_shared_ram[(_offs_)/2] == _protvalue_) \ if(state->mcu_shared_ram[(_offs_)/2] == _protvalue_) \
{ \ { \
mcu_shared_ram[(_offs_)/2] = 0xffff; /*(MCU job done)*/ \ state->mcu_shared_ram[(_offs_)/2] = 0xffff; /*(MCU job done)*/ \
mcu_shared_ram[(_offs_+2-0x10)/2] = 0x4ef9;/*JMP*/\ state->mcu_shared_ram[(_offs_+2-0x10)/2] = 0x4ef9;/*JMP*/\
mcu_shared_ram[(_offs_+4-0x10)/2] = 0x0000;/*HI-DWORD*/\ state->mcu_shared_ram[(_offs_+4-0x10)/2] = 0x0000;/*HI-DWORD*/\
mcu_shared_ram[(_offs_+6-0x10)/2] = _pc_; /*LO-DWORD*/\ state->mcu_shared_ram[(_offs_+6-0x10)/2] = _pc_; /*LO-DWORD*/\
} \ } \
#define PROT_INPUT(_offs_,_protvalue_,_protinput_,_input_) \ #define PROT_INPUT(_offs_,_protvalue_,_protinput_,_input_) \
if(mcu_shared_ram[_offs_] == _protvalue_) \ if(state->mcu_shared_ram[_offs_] == _protvalue_) \
{\ {\
mcu_shared_ram[_protinput_] = ((_input_ & 0xffff0000)>>16);\ state->mcu_shared_ram[_protinput_] = ((_input_ & 0xffff0000)>>16);\
mcu_shared_ram[_protinput_+1] = (_input_ & 0x0000ffff);\ state->mcu_shared_ram[_protinput_+1] = (_input_ & 0x0000ffff);\
} }
static WRITE16_HANDLER( ddealer_mcu_shared_w ) static WRITE16_HANDLER( ddealer_mcu_shared_w )
{ {
COMBINE_DATA(&mcu_shared_ram[offset]); ddealer_state *state = (ddealer_state *)space->machine->driver_data;
COMBINE_DATA(&state->mcu_shared_ram[offset]);
switch(offset) switch(offset)
{ {
@ -405,25 +426,26 @@ static WRITE16_HANDLER( ddealer_mcu_shared_w )
case 0x4fe/2: PROT_JSR(0x4fe,0x8018,0x9818); break; case 0x4fe/2: PROT_JSR(0x4fe,0x8018,0x9818); break;
/*Start-up vector,I think that only the first ram address can be written by the main CPU,or it is a whole sequence.*/ /*Start-up vector,I think that only the first ram address can be written by the main CPU,or it is a whole sequence.*/
case 0x000/2: case 0x000/2:
if(mcu_shared_ram[0x000/2] == 0x60fe) if (state->mcu_shared_ram[0x000 / 2] == 0x60fe)
{ {
mcu_shared_ram[0x000/2] = 0x0000;//coin counter state->mcu_shared_ram[0x000 / 2] = 0x0000;//coin counter
mcu_shared_ram[0x002/2] = 0x0000;//coin counter "decimal point" state->mcu_shared_ram[0x002 / 2] = 0x0000;//coin counter "decimal point"
mcu_shared_ram[0x004/2] = 0x4ef9; state->mcu_shared_ram[0x004 / 2] = 0x4ef9;
} }
break; break;
case 0x002/2: case 0x002/2:
case 0x004/2: case 0x004/2:
if(mcu_shared_ram[0x002/2] == 0x0000 && mcu_shared_ram[0x004/2] == 0x0214) if (state->mcu_shared_ram[0x002 / 2] == 0x0000 && state->mcu_shared_ram[0x004 / 2] == 0x0214)
mcu_shared_ram[0x004/2] = 0x4ef9; state->mcu_shared_ram[0x004 / 2] = 0x4ef9;
break; break;
case 0x008/2: case 0x008/2:
if(mcu_shared_ram[0x008/2] == 0x000f) if (state->mcu_shared_ram[0x008 / 2] == 0x000f)
mcu_shared_ram[0x008/2] = 0x0604; state->mcu_shared_ram[0x008 / 2] = 0x0604;
break; break;
case 0x00c/2: case 0x00c/2:
if(mcu_shared_ram[0x00c/2] == 0x000f) if (state->mcu_shared_ram[0x00c / 2] == 0x000f)
mcu_shared_ram[0x00c/2] = 0x0000; state->mcu_shared_ram[0x00c / 2] = 0x0000;
break;
} }
} }
@ -435,18 +457,18 @@ static ADDRESS_MAP_START( ddealer, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x08000a, 0x08000b) AM_READ_PORT("UNK") AM_RANGE(0x08000a, 0x08000b) AM_READ_PORT("UNK")
AM_RANGE(0x084000, 0x084003) AM_DEVWRITE8("ymsnd", ym2203_w, 0x00ff) // ym ? AM_RANGE(0x084000, 0x084003) AM_DEVWRITE8("ymsnd", ym2203_w, 0x00ff) // ym ?
AM_RANGE(0x088000, 0x0887ff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE(&paletteram16) // palette ram AM_RANGE(0x088000, 0x0887ff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE(&paletteram16) // palette ram
AM_RANGE(0x08c000, 0x08cfff) AM_RAM_WRITE(ddealer_vregs_w) AM_BASE(&ddealer_vregs) // palette ram AM_RANGE(0x08c000, 0x08cfff) AM_RAM_WRITE(ddealer_vregs_w) AM_BASE_MEMBER(ddealer_state, vregs) // palette ram
/* this might actually be 1 tilemap with some funky rowscroll / columnscroll enabled, I'm not sure */ /* this might actually be 1 tilemap with some funky rowscroll / columnscroll enabled, I'm not sure */
AM_RANGE(0x090000, 0x090fff) AM_RAM AM_BASE(&left_fg_vram_top) AM_RANGE(0x090000, 0x090fff) AM_RAM AM_BASE_MEMBER(ddealer_state, left_fg_vram_top)
AM_RANGE(0x091000, 0x091fff) AM_RAM AM_BASE(&right_fg_vram_top) AM_RANGE(0x091000, 0x091fff) AM_RAM AM_BASE_MEMBER(ddealer_state, right_fg_vram_top)
AM_RANGE(0x092000, 0x092fff) AM_RAM AM_BASE(&left_fg_vram_bottom) AM_RANGE(0x092000, 0x092fff) AM_RAM AM_BASE_MEMBER(ddealer_state, left_fg_vram_bottom)
AM_RANGE(0x093000, 0x093fff) AM_RAM AM_BASE(&right_fg_vram_bottom) AM_RANGE(0x093000, 0x093fff) AM_RAM AM_BASE_MEMBER(ddealer_state, right_fg_vram_bottom)
//AM_RANGE(0x094000, 0x094001) AM_NOP // always 0? //AM_RANGE(0x094000, 0x094001) AM_NOP // always 0?
AM_RANGE(0x098000, 0x098001) AM_WRITE(ddealer_flipscreen_w) AM_RANGE(0x098000, 0x098001) AM_WRITE(ddealer_flipscreen_w)
AM_RANGE(0x09c000, 0x09cfff) AM_RAM_WRITE(back_vram_w) AM_BASE(&back_vram) // bg tilemap AM_RANGE(0x09c000, 0x09cfff) AM_RAM_WRITE(back_vram_w) AM_BASE_MEMBER(ddealer_state, back_vram) // bg tilemap
AM_RANGE(0x0f0000, 0x0fdfff) AM_RAM AM_BASE(&work_ram) AM_RANGE(0x0f0000, 0x0fdfff) AM_RAM AM_BASE_MEMBER(ddealer_state, work_ram)
AM_RANGE(0x0fe000, 0x0fefff) AM_RAM_WRITE(ddealer_mcu_shared_w) AM_BASE(&mcu_shared_ram) AM_RANGE(0x0fe000, 0x0fefff) AM_RAM_WRITE(ddealer_mcu_shared_w) AM_BASE_MEMBER(ddealer_state, mcu_shared_ram)
AM_RANGE(0x0ff000, 0x0fffff) AM_RAM AM_RANGE(0x0ff000, 0x0fffff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -563,9 +585,24 @@ static GFXDECODE_START( ddealer )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0x100, 16 ) GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0x100, 16 )
GFXDECODE_END GFXDECODE_END
static MACHINE_START( ddealer )
{
ddealer_state *state = (ddealer_state *)machine->driver_data;
state_save_register_global(machine, state->respcount);
state_save_register_global(machine, state->flipscreen);
state_save_register_global(machine, state->input_pressed);
state_save_register_global(machine, state->coin_input);
}
static MACHINE_RESET (ddealer) static MACHINE_RESET (ddealer)
{ {
respcount = 0; ddealer_state *state = (ddealer_state *)machine->driver_data;
state->respcount = 0;
state->flipscreen = 0;
state->input_pressed = 0;
state->coin_input = 0;
} }
static INTERRUPT_GEN( ddealer_interrupt ) static INTERRUPT_GEN( ddealer_interrupt )
@ -574,6 +611,8 @@ static INTERRUPT_GEN( ddealer_interrupt )
} }
static MACHINE_DRIVER_START( ddealer ) static MACHINE_DRIVER_START( ddealer )
MDRV_DRIVER_DATA(ddealer_state)
MDRV_CPU_ADD("maincpu" , M68000, 10000000) MDRV_CPU_ADD("maincpu" , M68000, 10000000)
MDRV_CPU_PROGRAM_MAP(ddealer) MDRV_CPU_PROGRAM_MAP(ddealer)
MDRV_CPU_VBLANK_INT("screen", ddealer_interrupt) MDRV_CPU_VBLANK_INT("screen", ddealer_interrupt)
@ -581,6 +620,9 @@ static MACHINE_DRIVER_START( ddealer )
// M50747 or NMK-110 8131 MCU // M50747 or NMK-110 8131 MCU
MDRV_MACHINE_START(ddealer)
MDRV_MACHINE_RESET(ddealer)
MDRV_GFXDECODE(ddealer) MDRV_GFXDECODE(ddealer)
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
@ -591,7 +633,6 @@ static MACHINE_DRIVER_START( ddealer )
MDRV_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) MDRV_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1)
MDRV_PALETTE_LENGTH(0x400) MDRV_PALETTE_LENGTH(0x400)
MDRV_MACHINE_RESET(ddealer)
MDRV_VIDEO_START(ddealer) MDRV_VIDEO_START(ddealer)
MDRV_VIDEO_UPDATE(ddealer) MDRV_VIDEO_UPDATE(ddealer)
@ -607,6 +648,7 @@ MACHINE_DRIVER_END
static READ16_HANDLER( ddealer_mcu_r ) static READ16_HANDLER( ddealer_mcu_r )
{ {
ddealer_state *state = (ddealer_state *)space->machine->driver_data;
static const int resp[] = static const int resp[] =
{ {
0x93, 0xc7, 0x00, 0x8000, 0x93, 0xc7, 0x00, 0x8000,
@ -618,9 +660,9 @@ static READ16_HANDLER( ddealer_mcu_r )
int res; int res;
res = resp[respcount++]; res = resp[state->respcount++];
if (resp[respcount]<0) if (resp[state->respcount] < 0)
respcount = 0; state->respcount = 0;
return res; return res;
} }
@ -649,5 +691,4 @@ ROM_START( ddealer )
ROM_LOAD( "6.ic86", 0x100, 0x100, NO_DUMP ) ROM_LOAD( "6.ic86", 0x100, 0x100, NO_DUMP )
ROM_END ROM_END
GAME( 1991, ddealer, 0, ddealer, ddealer, ddealer, ROT0, "NMK", "Double Dealer", 0 ) GAME( 1991, ddealer, 0, ddealer, ddealer, ddealer, ROT0, "NMK", "Double Dealer", GAME_SUPPORTS_SAVE )

View File

@ -47,55 +47,36 @@ Notes:
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/okim6295.h" #include "sound/okim6295.h"
#include "sound/3812intf.h" #include "sound/3812intf.h"
#include "deniam.h"
extern UINT16 *deniam_videoram,*deniam_textram;
DRIVER_INIT( logicpro );
DRIVER_INIT( karianx );
WRITE16_HANDLER( deniam_videoram_w );
WRITE16_HANDLER( deniam_textram_w );
WRITE16_HANDLER( deniam_palette_w );
READ16_HANDLER( deniam_coinctrl_r );
WRITE16_HANDLER( deniam_coinctrl_w );
VIDEO_START( deniam );
VIDEO_UPDATE( deniam );
static WRITE16_HANDLER( sound_command_w ) static WRITE16_HANDLER( sound_command_w )
{ {
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
{ {
soundlatch_w(space,offset,(data >> 8) & 0xff); soundlatch_w(space,offset, (data >> 8) & 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_DEVICE_HANDLER( deniam16b_oki_rom_bank_w ) static WRITE8_DEVICE_HANDLER( deniam16b_oki_rom_bank_w )
{ {
okim6295_set_bank_base(device,(data & 0x40) ? 0x40000 : 0x00000); okim6295_set_bank_base(device, (data & 0x40) ? 0x40000 : 0x00000);
} }
static WRITE16_DEVICE_HANDLER( deniam16c_oki_rom_bank_w ) static WRITE16_DEVICE_HANDLER( deniam16c_oki_rom_bank_w )
{ {
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
okim6295_set_bank_base(device,(data & 0x01) ? 0x40000 : 0x00000); okim6295_set_bank_base(device, (data & 0x01) ? 0x40000 : 0x00000);
}
static MACHINE_RESET( deniam )
{
/* logicpr2 does not reset the bank base on startup */
okim6295_set_bank_base(devtag_get_device(machine, "oki"),0x00000);
} }
static ADDRESS_MAP_START( deniam16b_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( deniam16b_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x400000, 0x40ffff) AM_RAM_WRITE(deniam_videoram_w) AM_BASE(&deniam_videoram) AM_RANGE(0x400000, 0x40ffff) AM_RAM_WRITE(deniam_videoram_w) AM_BASE_MEMBER(deniam_state, videoram)
AM_RANGE(0x410000, 0x410fff) AM_RAM_WRITE(deniam_textram_w) AM_BASE(&deniam_textram) AM_RANGE(0x410000, 0x410fff) AM_RAM_WRITE(deniam_textram_w) AM_BASE_MEMBER(deniam_state, textram)
AM_RANGE(0x440000, 0x4407ff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) AM_RANGE(0x440000, 0x4407ff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(deniam_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0x840000, 0x840fff) AM_WRITE(deniam_palette_w) AM_BASE(&paletteram16) AM_RANGE(0x840000, 0x840fff) AM_WRITE(deniam_palette_w) AM_BASE_MEMBER(deniam_state, paletteram)
AM_RANGE(0xc40000, 0xc40001) AM_WRITE(sound_command_w) AM_RANGE(0xc40000, 0xc40001) AM_WRITE(sound_command_w)
AM_RANGE(0xc40002, 0xc40003) AM_READWRITE(deniam_coinctrl_r, deniam_coinctrl_w) AM_RANGE(0xc40002, 0xc40003) AM_READWRITE(deniam_coinctrl_r, deniam_coinctrl_w)
AM_RANGE(0xc44000, 0xc44001) AM_READ_PORT("SYSTEM") AM_RANGE(0xc44000, 0xc44001) AM_READ_PORT("SYSTEM")
@ -122,10 +103,10 @@ ADDRESS_MAP_END
/* identical to 16b, but handles sound directly */ /* identical to 16b, but handles sound directly */
static ADDRESS_MAP_START( deniam16c_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( deniam16c_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x400000, 0x40ffff) AM_RAM_WRITE(deniam_videoram_w) AM_BASE(&deniam_videoram) AM_RANGE(0x400000, 0x40ffff) AM_RAM_WRITE(deniam_videoram_w) AM_BASE_MEMBER(deniam_state, videoram)
AM_RANGE(0x410000, 0x410fff) AM_RAM_WRITE(deniam_textram_w) AM_BASE(&deniam_textram) AM_RANGE(0x410000, 0x410fff) AM_RAM_WRITE(deniam_textram_w) AM_BASE_MEMBER(deniam_state, textram)
AM_RANGE(0x440000, 0x4407ff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) AM_RANGE(0x440000, 0x4407ff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(deniam_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0x840000, 0x840fff) AM_WRITE(deniam_palette_w) AM_BASE(&paletteram16) AM_RANGE(0x840000, 0x840fff) AM_WRITE(deniam_palette_w) AM_BASE_MEMBER(deniam_state, paletteram)
AM_RANGE(0xc40000, 0xc40001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff) AM_RANGE(0xc40000, 0xc40001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff)
AM_RANGE(0xc40002, 0xc40003) AM_READWRITE(deniam_coinctrl_r, deniam_coinctrl_w) AM_RANGE(0xc40002, 0xc40003) AM_READWRITE(deniam_coinctrl_r, deniam_coinctrl_w)
AM_RANGE(0xc44000, 0xc44001) AM_READ_PORT("SYSTEM") AM_RANGE(0xc44000, 0xc44001) AM_READ_PORT("SYSTEM")
@ -231,10 +212,12 @@ static GFXDECODE_START( deniam )
GFXDECODE_END GFXDECODE_END
static void irqhandler(const device_config *device, int linestate) static void irqhandler( const device_config *device, int linestate )
{ {
deniam_state *state = (deniam_state *)device->machine->driver_data;
/* system 16c doesn't have the sound CPU */ /* system 16c doesn't have the sound CPU */
if (cputag_get_cpu(device->machine, "audiocpu") != NULL) if (state->audio_cpu != NULL)
cputag_set_input_line(device->machine, "audiocpu", 0, linestate); cputag_set_input_line(device->machine, "audiocpu", 0, linestate);
} }
@ -245,8 +228,41 @@ static const ym3812_interface ym3812_config =
static MACHINE_START( deniam )
{
deniam_state *state = (deniam_state *)machine->driver_data;
state->audio_cpu = devtag_get_device(machine, "audiocpu");
state_save_register_global(machine, state->display_enable);
state_save_register_global(machine, state->coinctrl);
state_save_register_global(machine, state->bg_scrollx_offs);
state_save_register_global(machine, state->bg_scrolly_offs);
state_save_register_global(machine, state->fg_scrollx_offs);
state_save_register_global(machine, state->fg_scrolly_offs);
state_save_register_global(machine, state->bg_scrollx_reg);
state_save_register_global(machine, state->bg_scrolly_reg);
state_save_register_global(machine, state->fg_scrollx_reg);
state_save_register_global(machine, state->fg_scrolly_reg);
state_save_register_global(machine, state->bg_page_reg);
state_save_register_global(machine, state->fg_page_reg);
state_save_register_global_array(machine, state->bg_page);
state_save_register_global_array(machine, state->fg_page);
}
static MACHINE_RESET( deniam )
{
/* logicpr2 does not reset the bank base on startup */
okim6295_set_bank_base(devtag_get_device(machine, "oki"), 0x00000);
}
static MACHINE_DRIVER_START( deniam16b ) static MACHINE_DRIVER_START( deniam16b )
/* driver data */
MDRV_DRIVER_DATA(deniam_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,XTAL_25MHz/2) /* 12.5Mhz verified */ MDRV_CPU_ADD("maincpu", M68000,XTAL_25MHz/2) /* 12.5Mhz verified */
MDRV_CPU_PROGRAM_MAP(deniam16b_map) MDRV_CPU_PROGRAM_MAP(deniam16b_map)
@ -256,6 +272,7 @@ static MACHINE_DRIVER_START( deniam16b )
MDRV_CPU_PROGRAM_MAP(sound_map) MDRV_CPU_PROGRAM_MAP(sound_map)
MDRV_CPU_IO_MAP(sound_io_map) MDRV_CPU_IO_MAP(sound_io_map)
MDRV_MACHINE_START(deniam)
MDRV_MACHINE_RESET(deniam) MDRV_MACHINE_RESET(deniam)
/* video hardware */ /* video hardware */
@ -287,11 +304,15 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( deniam16c ) static MACHINE_DRIVER_START( deniam16c )
/* driver data */
MDRV_DRIVER_DATA(deniam_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,XTAL_25MHz/2) /* 12.5Mhz verified */ MDRV_CPU_ADD("maincpu", M68000,XTAL_25MHz/2) /* 12.5Mhz verified */
MDRV_CPU_PROGRAM_MAP(deniam16c_map) MDRV_CPU_PROGRAM_MAP(deniam16c_map)
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold) MDRV_CPU_VBLANK_INT("screen", irq4_line_hold)
MDRV_MACHINE_START(deniam)
MDRV_MACHINE_RESET(deniam) MDRV_MACHINE_RESET(deniam)
/* video hardware */ /* video hardware */
@ -415,7 +436,7 @@ ROM_END
GAME( 1996, logicpro, 0, deniam16b, logicpr2, logicpro, ROT0, "Deniam", "Logic Pro (Japan)", GAME_IMPERFECT_GRAPHICS ) GAME( 1996, logicpro, 0, deniam16b, logicpr2, logicpro, ROT0, "Deniam", "Logic Pro (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )
GAME( 1996, croquis, logicpro, deniam16b, logicpr2, logicpro, ROT0, "Deniam", "Croquis (Germany)", 0 ) GAME( 1996, croquis, logicpro, deniam16b, logicpr2, logicpro, ROT0, "Deniam", "Croquis (Germany)", GAME_SUPPORTS_SAVE )
GAME( 1996, karianx, 0, deniam16b, karianx, karianx, ROT0, "Deniam", "Karian Cross (Rev. 1.0)", 0 ) GAME( 1996, karianx, 0, deniam16b, karianx, karianx, ROT0, "Deniam", "Karian Cross (Rev. 1.0)", GAME_SUPPORTS_SAVE )
GAME( 1997, logicpr2, 0, deniam16c, logicpr2, logicpro, ROT0, "Deniam", "Logic Pro 2 (Japan)", GAME_IMPERFECT_SOUND ) GAME( 1997, logicpr2, 0, deniam16c, logicpr2, logicpro, ROT0, "Deniam", "Logic Pro 2 (Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -41,50 +41,61 @@ Notes:
#include "sound/msm5205.h" #include "sound/msm5205.h"
#include "sound/3812intf.h" #include "sound/3812intf.h"
static UINT8* discoboy_ram_part1;
static UINT8* discoboy_ram_part2;
static UINT8* discoboy_ram_part3;
static UINT8* discoboy_ram_part4;
static UINT8* discoboy_ram_att;
static UINT8 discoboy_ram_bank;
static UINT8 port_00; typedef struct _discoboy_state discoboy_state;
static UINT8 discoboy_gfxbank; struct _discoboy_state
static int adpcm_data; {
/* memory pointers */
UINT8 * ram_1;
UINT8 * ram_2;
UINT8 * ram_3;
UINT8 * ram_4;
UINT8 * ram_att;
/* video-related */
UINT8 ram_bank;
UINT8 gfxbank;
UINT8 port_00;
int adpcm_data;
};
static VIDEO_START( discoboy ) static VIDEO_START( discoboy )
{ {
} }
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 )
{ {
discoboy_state *state = (discoboy_state *)machine->driver_data;
int flipscreen = 0; int flipscreen = 0;
int offs,sx,sy; int offs, sx, sy;
for (offs = 0x1000-0x40;offs >= 0;offs -= 0x20) for (offs = 0x1000 - 0x40; offs >= 0; offs -= 0x20)
{ {
int code = discoboy_ram_part4[offs]; int code = state->ram_4[offs];
int attr = discoboy_ram_part4[offs+1]; int attr = state->ram_4[offs + 1];
int color = attr & 0x0f; int color = attr & 0x0f;
sx = discoboy_ram_part4[offs+3] + ((attr & 0x10) << 4); sx = state->ram_4[offs + 3] + ((attr & 0x10) << 4);
sy = ((discoboy_ram_part4[offs+2] + 8) & 0xff) - 8; sy = ((state->ram_4[offs + 2] + 8) & 0xff) - 8;
code += (attr & 0xe0) << 3; code += (attr & 0xe0) << 3;
if (code>=0x400) if (code >= 0x400)
{ {
if ((discoboy_gfxbank&0x30) == 0x00) if ((state->gfxbank & 0x30) == 0x00)
{ {
code = 0x400 + (code & 0x3ff); code = 0x400 + (code & 0x3ff);
} }
else if ((discoboy_gfxbank&0x30) == 0x10) else if ((state->gfxbank & 0x30) == 0x10)
{ {
code = 0x400 + (code & 0x3ff) + 0x400; code = 0x400 + (code & 0x3ff) + 0x400;
} }
else if ((discoboy_gfxbank&0x30) == 0x20) else if ((state->gfxbank & 0x30) == 0x20)
{ {
code = 0x400 + (code & 0x3ff) + 0x800; code = 0x400 + (code & 0x3ff) + 0x800;
} }
else if ((discoboy_gfxbank&0x30) == 0x30) else if ((state->gfxbank & 0x30) == 0x30)
{ {
code = 0x400 + (code & 0x3ff) + 0xc00; code = 0x400 + (code & 0x3ff) + 0xc00;
} }
@ -103,101 +114,98 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
} }
static VIDEO_UPDATE( discoboy ) static VIDEO_UPDATE( discoboy )
{ {
UINT16 x,y; discoboy_state *state = (discoboy_state *)screen->machine->driver_data;
UINT16 x, y;
int i; int i;
int count; int count = 0;
count = 0;
for (i=0;i<0x800;i+=2) for (i = 0; i < 0x800; i += 2)
{ {
UINT16 pal; UINT16 pal;
int r,g,b; int r, g, b;
pal = discoboy_ram_part1[i] | (discoboy_ram_part1[i+1] << 8); pal = state->ram_1[i] | (state->ram_1[i + 1] << 8);
b = ((pal >> 0) & 0xf) << 4; b = ((pal >> 0) & 0xf) << 4;
g = ((pal >> 4) & 0xf) << 4; g = ((pal >> 4) & 0xf) << 4;
r = ((pal >> 8) & 0xf) << 4; r = ((pal >> 8) & 0xf) << 4;
palette_set_color(screen->machine, i/2, MAKE_RGB(r, g, b)); palette_set_color(screen->machine, i / 2, MAKE_RGB(r, g, b));
} }
for (i=0;i<0x800;i+=2) for (i = 0; i < 0x800; i += 2)
{ {
UINT16 pal; UINT16 pal;
int r,g,b; int r,g,b;
pal = discoboy_ram_part2[i] | (discoboy_ram_part2[i+1] << 8); pal = state->ram_2[i] | (state->ram_2[i + 1] << 8);
b = ((pal >> 0) & 0xf) << 4; b = ((pal >> 0) & 0xf) << 4;
g = ((pal >> 4) & 0xf) << 4; g = ((pal >> 4) & 0xf) << 4;
r = ((pal >> 8) & 0xf) << 4; r = ((pal >> 8) & 0xf) << 4;
palette_set_color(screen->machine, (i/2)+0x400, MAKE_RGB(r, g, b)); palette_set_color(screen->machine, (i / 2) + 0x400, MAKE_RGB(r, g, b));
} }
bitmap_fill(bitmap, cliprect, 0x3ff); bitmap_fill(bitmap, cliprect, 0x3ff);
for (y=0;y<32;y++) for (y = 0; y < 32; y++)
{ {
for (x=0;x<64;x++) for (x = 0; x < 64; x++)
{ {
UINT16 tileno = discoboy_ram_part3[count]|(discoboy_ram_part3[count+1]<<8); UINT16 tileno = state->ram_3[count] | (state->ram_3[count + 1] << 8);
if (tileno>0x2000) if (tileno > 0x2000)
{ {
if ((discoboy_gfxbank & 0x40) == 0x40) if ((state->gfxbank & 0x40) == 0x40)
tileno = 0x2000 + (tileno&0x1fff) + 0x2000; tileno = 0x2000 + (tileno & 0x1fff) + 0x2000;
else else
tileno = 0x2000 + (tileno&0x1fff) + 0x0000; tileno = 0x2000 + (tileno & 0x1fff) + 0x0000;
} }
drawgfx_opaque(bitmap,cliprect,screen->machine->gfx[1], tileno ,discoboy_ram_att[count/2],0,0,x*8,y*8); drawgfx_opaque(bitmap, cliprect, screen->machine->gfx[1], tileno, state->ram_att[count / 2], 0, 0, x*8, y*8);
count+=2; count += 2;
} }
} }
draw_sprites(screen->machine,bitmap,cliprect); draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }
#ifdef UNUSED_FUNCTION #ifdef UNUSED_FUNCTION
void discoboy_setrombank(UINT8 data) void discoboy_setrombank( running_machine *machine, UINT8 data )
{ {
UINT8 *ROM = memory_region(machine, "maincpu"); UINT8 *ROM = memory_region(machine, "maincpu");
data &=0x2f; data &= 0x2f;
memory_set_bankptr(space->machine, 1, &ROM[0x6000+(data*0x1000)] ); memory_set_bankptr(space->machine, 1, &ROM[0x6000 + (data * 0x1000)] );
} }
#endif #endif
static WRITE8_HANDLER( rambank_select_w ) static WRITE8_HANDLER( rambank_select_w )
{ {
discoboy_ram_bank = data; discoboy_state *state = (discoboy_state *)space->machine->driver_data;
if (data&=0x83) logerror("rambank_select_w !!!!!"); state->ram_bank = data;
if (data &= 0x83) logerror("rambank_select_w !!!!!");
} }
static WRITE8_HANDLER( discoboy_port_00_w ) static WRITE8_HANDLER( discoboy_port_00_w )
{ {
discoboy_state *state = (discoboy_state *)space->machine->driver_data;
if (data & 0xfe) logerror("unk discoboy_port_00_w %02x\n",data); if (data & 0xfe) logerror("unk discoboy_port_00_w %02x\n",data);
port_00 = data; state->port_00 = data;
} }
static WRITE8_HANDLER( discoboy_port_01_w ) static WRITE8_HANDLER( discoboy_port_01_w )
{ {
UINT8 *ROM = memory_region(space->machine, "maincpu"); discoboy_state *state = (discoboy_state *)space->machine->driver_data;
int rombank;
// 00 10 20 30 during gameplay 1,2,3 other times?? title screen bit 0x40 toggle // 00 10 20 30 during gameplay 1,2,3 other times?? title screen bit 0x40 toggle
//printf("unk discoboy_port_01_w %02x\n",data); //printf("unk discoboy_port_01_w %02x\n",data);
// discoboy gfxbank // discoboy gfxbank
discoboy_gfxbank = data&0xf0; state->gfxbank = data & 0xf0;
rombank = data&0x07;
memory_set_bankptr(space->machine, 1, &ROM[0x10000 + rombank * 0x4000] ); memory_set_bank(space->machine, 1, data & 0x07);
} }
static WRITE8_HANDLER( discoboy_port_03_w ) // sfx? (to sound cpu) static WRITE8_HANDLER( discoboy_port_03_w ) // sfx? (to sound cpu)
@ -211,77 +219,66 @@ static WRITE8_HANDLER( discoboy_port_03_w ) // sfx? (to sound cpu)
static WRITE8_HANDLER( discoboy_port_06_w ) static WRITE8_HANDLER( discoboy_port_06_w )
{ {
//printf("unk discoboy_port_06_w %02x\n",data); //printf("unk discoboy_port_06_w %02x\n",data);
if (data!=0) logerror("port 06!!!! %02x\n",data); if (data != 0) logerror("port 06!!!! %02x\n",data);
} }
static WRITE8_HANDLER( rambank_w ) static WRITE8_HANDLER( rambank_w )
{ {
if (discoboy_ram_bank&0x20) discoboy_state *state = (discoboy_state *)space->machine->driver_data;
{
discoboy_ram_part2[offset] = data; if (state->ram_bank & 0x20)
} state->ram_2[offset] = data;
else else
{ state->ram_1[offset] = data;
discoboy_ram_part1[offset] = data;
}
} }
static READ8_HANDLER( rambank_r ) static READ8_HANDLER( rambank_r )
{ {
if (discoboy_ram_bank&0x20) discoboy_state *state = (discoboy_state *)space->machine->driver_data;
{
return discoboy_ram_part2[offset]; if (state->ram_bank & 0x20)
} return state->ram_2[offset];
else else
{ return state->ram_1[offset];
return discoboy_ram_part1[offset];
}
} }
static READ8_HANDLER( rambank2_r ) static READ8_HANDLER( rambank2_r )
{ {
if (port_00 == 0x00) discoboy_state *state = (discoboy_state *)space->machine->driver_data;
{
return discoboy_ram_part3[offset]; if (state->port_00 == 0x00)
} return state->ram_3[offset];
else if (port_00 == 0x01) else if (state->port_00 == 0x01)
{ return state->ram_4[offset];
return discoboy_ram_part4[offset];
}
else else
{ printf("unk rb2_r\n");
printf( "unk rb2_r\n");
}
return mame_rand(space->machine); return mame_rand(space->machine);
} }
static WRITE8_HANDLER( rambank2_w ) static WRITE8_HANDLER( rambank2_w )
{ {
discoboy_state *state = (discoboy_state *)space->machine->driver_data;
if (port_00 == 0x00) if (state->port_00 == 0x00)
{ state->ram_3[offset] = data;
discoboy_ram_part3[offset] = data; else if (state->port_00 == 0x01)
} state->ram_4[offset] = data;
else if (port_00 == 0x01)
{
discoboy_ram_part4[offset] = data;
}
else else
{ printf("unk rb2_w\n");
printf( "unk rb2_w\n");
}
} }
static READ8_HANDLER( discoboy_ram_att_r ) static READ8_HANDLER( discoboy_ram_att_r )
{ {
return discoboy_ram_att[offset]; discoboy_state *state = (discoboy_state *)space->machine->driver_data;
return state->ram_att[offset];
} }
static WRITE8_HANDLER( discoboy_ram_att_w ) static WRITE8_HANDLER( discoboy_ram_att_w )
{ {
discoboy_ram_att[offset] = data; discoboy_state *state = (discoboy_state *)space->machine->driver_data;
state->ram_att[offset] = data;
} }
static ADDRESS_MAP_START( discoboy_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( discoboy_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -314,13 +311,14 @@ ADDRESS_MAP_END
/* Sound */ /* Sound */
//static WRITE8_HANDLER( splash_adpcm_data_w ){ //static WRITE8_HANDLER( splash_adpcm_data_w ){
// adpcm_data = data; // state->adpcm_data = data;
//} //}
static void splash_msm5205_int(const device_config *device) static void splash_msm5205_int( const device_config *device )
{ {
msm5205_data_w(device,adpcm_data >> 4); discoboy_state *state = (discoboy_state *)device->machine->driver_data;
// adpcm_data = (adpcm_data << 4) & 0xf0; msm5205_data_w(device, state->adpcm_data >> 4);
// state->adpcm_data = (state->adpcm_data << 4) & 0xf0;
} }
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -434,15 +432,32 @@ static const msm5205_interface discoboy_msm5205_interface =
MSM5205_S48_4B /* ??? unknown hz */ MSM5205_S48_4B /* ??? unknown hz */
}; };
static MACHINE_START( discoboy )
{
discoboy_state *state = (discoboy_state *)machine->driver_data;
state_save_register_global(machine, state->ram_bank);
state_save_register_global(machine, state->port_00);
state_save_register_global(machine, state->gfxbank);
state_save_register_global(machine, state->adpcm_data);
}
static MACHINE_RESET( discoboy ) static MACHINE_RESET( discoboy )
{ {
discoboy_ram_bank = 0; discoboy_state *state = (discoboy_state *)machine->driver_data;
port_00 = 0;
discoboy_gfxbank = 0; state->ram_bank = 0;
adpcm_data = 0x80; state->port_00 = 0;
state->gfxbank = 0;
state->adpcm_data = 0x80;
} }
static MACHINE_DRIVER_START( discoboy ) static MACHINE_DRIVER_START( discoboy )
/* driver data */
MDRV_DRIVER_DATA(discoboy_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz? */ MDRV_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz? */
MDRV_CPU_PROGRAM_MAP(discoboy_map) MDRV_CPU_PROGRAM_MAP(discoboy_map)
@ -455,6 +470,9 @@ static MACHINE_DRIVER_START( discoboy )
// MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) // MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
MDRV_CPU_VBLANK_INT_HACK(nmi_line_pulse,32) MDRV_CPU_VBLANK_INT_HACK(nmi_line_pulse,32)
MDRV_MACHINE_START( discoboy )
MDRV_MACHINE_RESET( discoboy )
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
@ -469,8 +487,6 @@ static MACHINE_DRIVER_START( discoboy )
MDRV_VIDEO_START(discoboy) MDRV_VIDEO_START(discoboy)
MDRV_VIDEO_UPDATE(discoboy) MDRV_VIDEO_UPDATE(discoboy)
MDRV_MACHINE_RESET( discoboy )
/* sound hardware */ /* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono") MDRV_SPEAKER_STANDARD_MONO("mono")
@ -481,37 +497,8 @@ static MACHINE_DRIVER_START( discoboy )
MDRV_SOUND_ADD("msm", MSM5205, 384000) // ???? unknown MDRV_SOUND_ADD("msm", MSM5205, 384000) // ???? unknown
MDRV_SOUND_CONFIG(discoboy_msm5205_interface) MDRV_SOUND_CONFIG(discoboy_msm5205_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static DRIVER_INIT( discoboy )
{
UINT8 *ROM = memory_region(machine, "maincpu");
discoboy_ram_part1 = auto_alloc_array(machine, UINT8, 0x800);
discoboy_ram_part2 = auto_alloc_array(machine, UINT8, 0x800);
discoboy_ram_att = auto_alloc_array(machine, UINT8, 0x800);
discoboy_ram_part3 = auto_alloc_array(machine, UINT8, 0x1000);
discoboy_ram_part4 = auto_alloc_array(machine, UINT8, 0x1000);
memset(discoboy_ram_part1,0,0x800);
memset(discoboy_ram_part2,0,0x800);
memset(discoboy_ram_att,0,0x800);
memset(discoboy_ram_part3,0,0x1000);
memset(discoboy_ram_part4,0,0x1000);
state_save_register_global_pointer(machine, discoboy_ram_part1, 0x800);
state_save_register_global_pointer(machine, discoboy_ram_part2, 0x800);
state_save_register_global_pointer(machine, discoboy_ram_att, 0x800);
state_save_register_global_pointer(machine, discoboy_ram_part3, 0x1000);
state_save_register_global_pointer(machine, discoboy_ram_part4, 0x1000);
discoboy_ram_bank = 0;
memory_set_bankptr(machine, 1, &ROM[0x10000] );
}
ROM_START( discoboy ) ROM_START( discoboy )
ROM_REGION( 0x30000, "maincpu", 0 ) ROM_REGION( 0x30000, "maincpu", 0 )
@ -540,4 +527,33 @@ ROM_START( discoboy )
ROM_END ROM_END
GAME( 1993, discoboy, 0, discoboy, discoboy, discoboy, ROT270, "Soft Art Co.", "Disco Boy", 0 ) static DRIVER_INIT( discoboy )
{
discoboy_state *state = (discoboy_state *)machine->driver_data;
UINT8 *ROM = memory_region(machine, "maincpu");
state->ram_1 = auto_alloc_array(machine, UINT8, 0x800);
state->ram_2 = auto_alloc_array(machine, UINT8, 0x800);
state->ram_att = auto_alloc_array(machine, UINT8, 0x800);
state->ram_3 = auto_alloc_array(machine, UINT8, 0x1000);
state->ram_4 = auto_alloc_array(machine, UINT8, 0x1000);
memset(state->ram_1, 0, 0x800);
memset(state->ram_2, 0, 0x800);
memset(state->ram_att,0, 0x800);
memset(state->ram_3, 0, 0x1000);
memset(state->ram_4, 0, 0x1000);
state_save_register_global_pointer(machine, state->ram_1, 0x800);
state_save_register_global_pointer(machine, state->ram_2, 0x800);
state_save_register_global_pointer(machine, state->ram_att, 0x800);
state_save_register_global_pointer(machine, state->ram_3, 0x1000);
state_save_register_global_pointer(machine, state->ram_4, 0x1000);
memory_configure_bank(machine, 1, 0, 8, &ROM[0x10000], 0x4000);
memory_set_bank(machine, 1, 0);
}
GAME( 1993, discoboy, 0, discoboy, discoboy, discoboy, ROT270, "Soft Art Co.", "Disco Boy", GAME_SUPPORTS_SAVE )

View File

@ -51,18 +51,70 @@
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "sound/okim6295.h" #include "sound/okim6295.h"
extern UINT16 *diverboy_spriteram;
extern size_t diverboy_spriteram_size;
VIDEO_START(diverboy);
VIDEO_UPDATE(diverboy); typedef struct _diverboy_state diverboy_state;
struct _diverboy_state
{
/* memory pointers */
UINT16 * spriteram;
// UINT16 * paletteram16; // currently this uses generic palette handling
};
VIDEO_START(diverboy)
{
}
static void draw_sprites( running_machine* machine, bitmap_t *bitmap, const rectangle *cliprect )
{
diverboy_state *state = (diverboy_state *)machine->driver_data;
UINT16 *source = state->spriteram;
UINT16 *finish = source + (spriteram_size / 2);
while (source < finish)
{
INT16 xpos, ypos, number, colr, bank, flash;
ypos = source[4];
xpos = source[0];
colr = (source[1] & 0x00f0) >> 4;
number = source[3];
flash = source[1] & 0x1000;
colr |= ((source[1] & 0x000c) << 2);
ypos = 0x100 - ypos;
bank = (source[1] & 0x0002) >> 1;
if (!flash || (video_screen_get_frame_number(machine->primary_screen) & 1))
{
drawgfx_transpen(bitmap,cliprect,machine->gfx[bank],
number,
colr,
0,0,
xpos,ypos,
(source[1] & 0x0008) ? -1 : 0);
}
source += 8;
}
}
VIDEO_UPDATE(diverboy)
{
// bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine));
draw_sprites(screen->machine, bitmap, cliprect);
return 0;
}
static WRITE16_HANDLER( soundcmd_w ) static WRITE16_HANDLER( soundcmd_w )
{ {
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
soundlatch_w(space,0,data & 0xff); soundlatch_w(space, 0, data & 0xff);
cputag_set_input_line(space->machine, "audiocpu", 0, HOLD_LINE); cputag_set_input_line(space->machine, "audiocpu", 0, HOLD_LINE);
} }
} }
@ -72,7 +124,7 @@ static WRITE8_DEVICE_HANDLER( okibank_w )
/* bit 2 might be reset */ /* bit 2 might be reset */
// popmessage("%02x",data); // popmessage("%02x",data);
okim6295_set_bank_base(device,(data & 3) * 0x40000); okim6295_set_bank_base(device, (data & 3) * 0x40000);
} }
@ -80,7 +132,7 @@ static WRITE8_DEVICE_HANDLER( okibank_w )
static ADDRESS_MAP_START( diverboy_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( diverboy_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x040000, 0x04ffff) AM_RAM AM_RANGE(0x040000, 0x04ffff) AM_RAM
AM_RANGE(0x080000, 0x083fff) AM_RAM AM_BASE(&diverboy_spriteram) AM_SIZE(&diverboy_spriteram_size) AM_RANGE(0x080000, 0x083fff) AM_RAM AM_BASE_MEMBER(diverboy_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0x100000, 0x100001) AM_WRITE(soundcmd_w) AM_RANGE(0x100000, 0x100001) AM_WRITE(soundcmd_w)
AM_RANGE(0x140000, 0x1407ff) AM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE(&paletteram16) AM_RANGE(0x140000, 0x1407ff) AM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE(&paletteram16)
AM_RANGE(0x180000, 0x180001) AM_READ_PORT("P1_P2") AM_RANGE(0x180000, 0x180001) AM_READ_PORT("P1_P2")
@ -182,6 +234,8 @@ GFXDECODE_END
static MACHINE_DRIVER_START( diverboy ) static MACHINE_DRIVER_START( diverboy )
MDRV_DRIVER_DATA(diverboy_state)
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* guess */ MDRV_CPU_ADD("maincpu", M68000, 12000000) /* guess */
MDRV_CPU_PROGRAM_MAP(diverboy_map) MDRV_CPU_PROGRAM_MAP(diverboy_map)
MDRV_CPU_VBLANK_INT("screen", irq6_line_hold) MDRV_CPU_VBLANK_INT("screen", irq6_line_hold)
@ -245,4 +299,4 @@ ROM_END
GAME( 1992, diverboy, 0, diverboy, diverboy, 0, ORIENTATION_FLIP_X, "Electronic Devices Italy", "Diver Boy", 0 ) GAME( 1992, diverboy, 0, diverboy, diverboy, 0, ORIENTATION_FLIP_X, "Electronic Devices Italy", "Diver Boy", GAME_SUPPORTS_SAVE )

View File

@ -16,10 +16,18 @@ Todo:
#define NUM_PENS (8) #define NUM_PENS (8)
static UINT8 *dorachan_videoram; typedef struct _dorachan_state dorachan_state;
static size_t dorachan_videoram_size; struct _dorachan_state
static UINT8 dorachan_flip_screen; {
/* memory pointers */
UINT8 * videoram;
/* video-related */
UINT8 flip_screen;
/* devices */
const device_config *main_cpu;
};
/************************************* /*************************************
@ -30,16 +38,17 @@ static UINT8 dorachan_flip_screen;
static CUSTOM_INPUT( dorachan_protection_r ) static CUSTOM_INPUT( dorachan_protection_r )
{ {
dorachan_state *state = (dorachan_state *)field->port->machine->driver_data;
UINT8 ret = 0; UINT8 ret = 0;
switch (cpu_get_previouspc(cputag_get_cpu(field->port->machine, "maincpu"))) switch (cpu_get_previouspc(state->main_cpu))
{ {
case 0x70ce: ret = 0xf2; break; case 0x70ce: ret = 0xf2; break;
case 0x72a2: ret = 0xd5; break; case 0x72a2: ret = 0xd5; break;
case 0x72b5: ret = 0xcb; break; case 0x72b5: ret = 0xcb; break;
default: default:
mame_printf_debug("unhandled $2400 read @ %x\n", cpu_get_previouspc(cputag_get_cpu(field->port->machine, "maincpu"))); mame_printf_debug("unhandled $2400 read @ %x\n", cpu_get_previouspc(state->main_cpu));
break; break;
} }
@ -67,6 +76,7 @@ static void get_pens(pen_t *pens)
static VIDEO_UPDATE( dorachan ) static VIDEO_UPDATE( dorachan )
{ {
dorachan_state *state = (dorachan_state *)screen->machine->driver_data;
pen_t pens[NUM_PENS]; pen_t pens[NUM_PENS];
offs_t offs; offs_t offs;
const UINT8 *color_map_base; const UINT8 *color_map_base;
@ -75,7 +85,7 @@ static VIDEO_UPDATE( dorachan )
color_map_base = memory_region(screen->machine, "proms"); color_map_base = memory_region(screen->machine, "proms");
for (offs = 0; offs < dorachan_videoram_size; offs++) for (offs = 0; offs < videoram_size; offs++)
{ {
int i; int i;
UINT8 fore_color; UINT8 fore_color;
@ -86,9 +96,9 @@ static VIDEO_UPDATE( dorachan )
/* the need for +1 is extremely unusual, but definetely correct */ /* the need for +1 is extremely unusual, but definetely correct */
offs_t color_address = ((((offs << 2) & 0x03e0) | (offs >> 8)) + 1) & 0x03ff; offs_t color_address = ((((offs << 2) & 0x03e0) | (offs >> 8)) + 1) & 0x03ff;
UINT8 data = dorachan_videoram[offs]; UINT8 data = state->videoram[offs];
if (dorachan_flip_screen) if (state->flip_screen)
fore_color = (color_map_base[color_address] >> 3) & 0x07; fore_color = (color_map_base[color_address] >> 3) & 0x07;
else else
fore_color = (color_map_base[color_address] >> 0) & 0x07; fore_color = (color_map_base[color_address] >> 0) & 0x07;
@ -109,15 +119,17 @@ static VIDEO_UPDATE( dorachan )
static WRITE8_HANDLER(dorachan_ctrl_w) static WRITE8_HANDLER(dorachan_ctrl_w)
{ {
dorachan_flip_screen = (data >> 6) & 0x01; dorachan_state *state = (dorachan_state *)space->machine->driver_data;
state->flip_screen = (data >> 6) & 0x01;
} }
static CUSTOM_INPUT( dorachan_v128_r ) static CUSTOM_INPUT( dorachan_v128_r )
{ {
/* to avoid resetting (when player 2 starts) bit 0 need to be dorachan_state *state = (dorachan_state *)field->port->machine->driver_data;
inverted when screen is flipped */
return ((video_screen_get_vpos(field->port->machine->primary_screen) >> 7) & 0x01) ^ dorachan_flip_screen; /* to avoid resetting (when player 2 starts) bit 0 need to be inverted when screen is flipped */
return ((video_screen_get_vpos(field->port->machine->primary_screen) >> 7) & 0x01) ^ state->flip_screen;
} }
@ -136,7 +148,7 @@ static ADDRESS_MAP_START( dorachan_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x2800, 0x2800) AM_MIRROR(0x03ff) AM_READ_PORT("SYSTEM") AM_RANGE(0x2800, 0x2800) AM_MIRROR(0x03ff) AM_READ_PORT("SYSTEM")
AM_RANGE(0x2c00, 0x2c00) AM_MIRROR(0x03ff) AM_READ_PORT("JOY") AM_RANGE(0x2c00, 0x2c00) AM_MIRROR(0x03ff) AM_READ_PORT("JOY")
AM_RANGE(0x3800, 0x3800) AM_MIRROR(0x03ff) AM_READ_PORT("V128") AM_RANGE(0x3800, 0x3800) AM_MIRROR(0x03ff) AM_READ_PORT("V128")
AM_RANGE(0x4000, 0x5fff) AM_RAM AM_BASE(&dorachan_videoram) AM_SIZE(&dorachan_videoram_size) AM_RANGE(0x4000, 0x5fff) AM_RAM AM_BASE_MEMBER(dorachan_state, videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x6000, 0x77ff) AM_ROM AM_RANGE(0x6000, 0x77ff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -206,14 +218,36 @@ INPUT_PORTS_END
* *
*************************************/ *************************************/
static MACHINE_START( dorachan )
{
dorachan_state *state = (dorachan_state *)machine->driver_data;
state->main_cpu = devtag_get_device(machine, "maincpu");
state_save_register_global(machine, state->flip_screen);
}
static MACHINE_RESET( dorachan )
{
dorachan_state *state = (dorachan_state *)machine->driver_data;
state->flip_screen = 0;
}
static MACHINE_DRIVER_START( dorachan ) static MACHINE_DRIVER_START( dorachan )
/* driver data */
MDRV_DRIVER_DATA(dorachan_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 2000000) MDRV_CPU_ADD("maincpu", Z80, 2000000)
MDRV_CPU_PROGRAM_MAP(dorachan_map) MDRV_CPU_PROGRAM_MAP(dorachan_map)
MDRV_CPU_IO_MAP(dorachan_io_map) MDRV_CPU_IO_MAP(dorachan_io_map)
MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold,2) MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold,2)
MDRV_MACHINE_START(dorachan)
MDRV_MACHINE_RESET(dorachan)
/* video hardware */ /* video hardware */
MDRV_VIDEO_UPDATE(dorachan) MDRV_VIDEO_UPDATE(dorachan)
@ -261,4 +295,4 @@ ROM_END
* *
*************************************/ *************************************/
GAME( 1980, dorachan, 0, dorachan, dorachan, 0, ROT270, "Craul Denshi", "Dorachan", GAME_NO_SOUND) GAME( 1980, dorachan, 0, dorachan, dorachan, 0, ROT270, "Craul Denshi", "Dorachan", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -11,12 +11,9 @@ Atari Drag Race Driver
#include "sound/discrete.h" #include "sound/discrete.h"
static unsigned dragrace_misc_flags = 0;
static int dragrace_gear[2];
static TIMER_CALLBACK( dragrace_frame_callback ) static TIMER_CALLBACK( dragrace_frame_callback )
{ {
dragrace_state *state = (dragrace_state *)machine->driver_data;
int i; int i;
static const char *const portnames[] = { "P1", "P2" }; static const char *const portnames[] = { "P1", "P2" };
@ -24,11 +21,11 @@ static TIMER_CALLBACK( dragrace_frame_callback )
{ {
switch (input_port_read(machine, portnames[i])) switch (input_port_read(machine, portnames[i]))
{ {
case 0x01: dragrace_gear[i] = 1; break; case 0x01: state->gear[i] = 1; break;
case 0x02: dragrace_gear[i] = 2; break; case 0x02: state->gear[i] = 2; break;
case 0x04: dragrace_gear[i] = 3; break; case 0x04: state->gear[i] = 3; break;
case 0x08: dragrace_gear[i] = 4; break; case 0x08: state->gear[i] = 4; break;
case 0x10: dragrace_gear[i] = 0; break; case 0x10: state->gear[i] = 0; break;
} }
} }
@ -37,15 +34,9 @@ static TIMER_CALLBACK( dragrace_frame_callback )
} }
static MACHINE_RESET( dragrace ) static void dragrace_update_misc_flags( running_machine *machine )
{ {
timer_pulse(machine, video_screen_get_frame_period(machine->primary_screen), NULL, 0, dragrace_frame_callback); dragrace_state *state = (dragrace_state *)machine->driver_data;
}
static void dragrace_update_misc_flags(const address_space *space)
{
const device_config *discrete = devtag_get_device(space->machine, "discrete");
/* 0x0900 = set 3SPEED1 0x00000001 /* 0x0900 = set 3SPEED1 0x00000001
* 0x0901 = set 4SPEED1 0x00000002 * 0x0901 = set 4SPEED1 0x00000002
* 0x0902 = set 5SPEED1 0x00000004 * 0x0902 = set 5SPEED1 0x00000004
@ -77,49 +68,54 @@ static void dragrace_update_misc_flags(const address_space *space)
* 0x091f = set Player 2 Start Lamp 0x80000000 * 0x091f = set Player 2 Start Lamp 0x80000000
* 0x0938 = clear 0x0918 - 0x091f * 0x0938 = clear 0x0918 - 0x091f
*/ */
set_led_status(0, dragrace_misc_flags & 0x00008000); set_led_status(0, state->misc_flags & 0x00008000);
set_led_status(1, dragrace_misc_flags & 0x80000000); set_led_status(1, state->misc_flags & 0x80000000);
discrete_sound_w(discrete, DRAGRACE_MOTOR1_DATA, ~dragrace_misc_flags & 0x0000001f); // Speed1 data* discrete_sound_w(state->discrete, DRAGRACE_MOTOR1_DATA, ~state->misc_flags & 0x0000001f); // Speed1 data*
discrete_sound_w(discrete, DRAGRACE_EXPLODE1_EN, (dragrace_misc_flags & 0x00000020) ? 1: 0); // Explosion1 enable discrete_sound_w(state->discrete, DRAGRACE_EXPLODE1_EN, (state->misc_flags & 0x00000020) ? 1: 0); // Explosion1 enable
discrete_sound_w(discrete, DRAGRACE_SCREECH1_EN, (dragrace_misc_flags & 0x00000040) ? 1: 0); // Screech1 enable discrete_sound_w(state->discrete, DRAGRACE_SCREECH1_EN, (state->misc_flags & 0x00000040) ? 1: 0); // Screech1 enable
discrete_sound_w(discrete, DRAGRACE_KLEXPL1_EN, (dragrace_misc_flags & 0x00000200) ? 1: 0); // KLEXPL1 enable discrete_sound_w(state->discrete, DRAGRACE_KLEXPL1_EN, (state->misc_flags & 0x00000200) ? 1: 0); // KLEXPL1 enable
discrete_sound_w(discrete, DRAGRACE_MOTOR1_EN, (dragrace_misc_flags & 0x00000800) ? 1: 0); // Motor1 enable discrete_sound_w(state->discrete, DRAGRACE_MOTOR1_EN, (state->misc_flags & 0x00000800) ? 1: 0); // Motor1 enable
discrete_sound_w(discrete, DRAGRACE_MOTOR2_DATA, (~dragrace_misc_flags & 0x001f0000) >> 0x10); // Speed2 data* discrete_sound_w(state->discrete, DRAGRACE_MOTOR2_DATA, (~state->misc_flags & 0x001f0000) >> 0x10); // Speed2 data*
discrete_sound_w(discrete, DRAGRACE_EXPLODE2_EN, (dragrace_misc_flags & 0x00200000) ? 1: 0); // Explosion2 enable discrete_sound_w(state->discrete, DRAGRACE_EXPLODE2_EN, (state->misc_flags & 0x00200000) ? 1: 0); // Explosion2 enable
discrete_sound_w(discrete, DRAGRACE_SCREECH2_EN, (dragrace_misc_flags & 0x00400000) ? 1: 0); // Screech2 enable discrete_sound_w(state->discrete, DRAGRACE_SCREECH2_EN, (state->misc_flags & 0x00400000) ? 1: 0); // Screech2 enable
discrete_sound_w(discrete, DRAGRACE_KLEXPL2_EN, (dragrace_misc_flags & 0x02000000) ? 1: 0); // KLEXPL2 enable discrete_sound_w(state->discrete, DRAGRACE_KLEXPL2_EN, (state->misc_flags & 0x02000000) ? 1: 0); // KLEXPL2 enable
discrete_sound_w(discrete, DRAGRACE_MOTOR2_EN, (dragrace_misc_flags & 0x08000000) ? 1: 0); // Motor2 enable discrete_sound_w(state->discrete, DRAGRACE_MOTOR2_EN, (state->misc_flags & 0x08000000) ? 1: 0); // Motor2 enable
discrete_sound_w(discrete, DRAGRACE_ATTRACT_EN, (dragrace_misc_flags & 0x00001000) ? 1: 0); // Attract enable discrete_sound_w(state->discrete, DRAGRACE_ATTRACT_EN, (state->misc_flags & 0x00001000) ? 1: 0); // Attract enable
discrete_sound_w(discrete, DRAGRACE_LOTONE_EN, (dragrace_misc_flags & 0x00002000) ? 1: 0); // LoTone enable discrete_sound_w(state->discrete, DRAGRACE_LOTONE_EN, (state->misc_flags & 0x00002000) ? 1: 0); // LoTone enable
discrete_sound_w(discrete, DRAGRACE_HITONE_EN, (dragrace_misc_flags & 0x20000000) ? 1: 0); // HiTone enable discrete_sound_w(state->discrete, DRAGRACE_HITONE_EN, (state->misc_flags & 0x20000000) ? 1: 0); // HiTone enable
} }
static WRITE8_HANDLER( dragrace_misc_w ) static WRITE8_HANDLER( dragrace_misc_w )
{ {
dragrace_state *state = (dragrace_state *)space->machine->driver_data;
/* Set/clear individual bit */ /* Set/clear individual bit */
UINT32 mask = 1 << offset; UINT32 mask = 1 << offset;
if (data & 0x01) if (data & 0x01)
dragrace_misc_flags |= mask; state->misc_flags |= mask;
else else
dragrace_misc_flags &= (~mask); state->misc_flags &= (~mask);
logerror("Set %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0900+offset, mask, dragrace_misc_flags, data & 0x01); logerror("Set %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0900 + offset, mask, state->misc_flags, data & 0x01);
dragrace_update_misc_flags(space); dragrace_update_misc_flags(space->machine);
} }
static WRITE8_HANDLER( dragrace_misc_clear_w ) static WRITE8_HANDLER( dragrace_misc_clear_w )
{ {
dragrace_state *state = (dragrace_state *)space->machine->driver_data;
/* Clear 8 bits */ /* Clear 8 bits */
UINT32 mask = 0xff << (((offset >> 3) & 0x03) * 8); UINT32 mask = 0xff << (((offset >> 3) & 0x03) * 8);
dragrace_misc_flags &= (~mask); state->misc_flags &= (~mask);
logerror("Clear %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0920+offset, mask, dragrace_misc_flags, data & 0x01); logerror("Clear %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0920 + offset, mask, state->misc_flags, data & 0x01);
dragrace_update_misc_flags(space); dragrace_update_misc_flags(space->machine);
} }
static READ8_HANDLER( dragrace_input_r ) static READ8_HANDLER( dragrace_input_r )
{ {
dragrace_state *state = (dragrace_state *)space->machine->driver_data;
int val = input_port_read(space->machine, "IN2"); int val = input_port_read(space->machine, "IN2");
static const char *const portnames[] = { "IN0", "IN1" }; static const char *const portnames[] = { "IN0", "IN1" };
@ -132,18 +128,14 @@ static READ8_HANDLER( dragrace_input_r )
{ {
int in = input_port_read(space->machine, portnames[i]); int in = input_port_read(space->machine, portnames[i]);
if (dragrace_gear[i] != 0) if (state->gear[i] != 0)
{ in &= ~(1 << state->gear[i]);
in &= ~(1 << dragrace_gear[i]);
}
if (in & maskA) if (in & maskA)
{
val |= 1 << i; val |= 1 << i;
} }
}
return (val & maskB) ? 0xFF : 0x7F; return (val & maskB) ? 0xff : 0x7f;
} }
@ -180,8 +172,8 @@ static ADDRESS_MAP_START( dragrace_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0800, 0x083f) AM_READ(dragrace_input_r) AM_RANGE(0x0800, 0x083f) AM_READ(dragrace_input_r)
AM_RANGE(0x0900, 0x091f) AM_WRITE(dragrace_misc_w) AM_RANGE(0x0900, 0x091f) AM_WRITE(dragrace_misc_w)
AM_RANGE(0x0920, 0x093f) AM_WRITE(dragrace_misc_clear_w) AM_RANGE(0x0920, 0x093f) AM_WRITE(dragrace_misc_clear_w)
AM_RANGE(0x0a00, 0x0aff) AM_WRITE(SMH_RAM) AM_BASE(&dragrace_playfield_ram) AM_RANGE(0x0a00, 0x0aff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(dragrace_state, playfield_ram)
AM_RANGE(0x0b00, 0x0bff) AM_WRITE(SMH_RAM) AM_BASE(&dragrace_position_ram) AM_RANGE(0x0b00, 0x0bff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(dragrace_state, position_ram)
AM_RANGE(0x0c00, 0x0c00) AM_READ(dragrace_steering_r) AM_RANGE(0x0c00, 0x0c00) AM_READ(dragrace_steering_r)
AM_RANGE(0x0d00, 0x0d00) AM_READ(dragrace_scanline_r) AM_RANGE(0x0d00, 0x0d00) AM_READ(dragrace_scanline_r)
AM_RANGE(0x0e00, 0x0eff) AM_WRITE(watchdog_reset_w) AM_RANGE(0x0e00, 0x0eff) AM_WRITE(watchdog_reset_w)
@ -191,7 +183,7 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( dragrace ) static INPUT_PORTS_START( dragrace )
PORT_START("IN0") /* IN0 */ PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Player 1 Gas") PORT_PLAYER(1) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Player 1 Gas") PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 1 gear 1 */ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 1 gear 1 */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 1 gear 2 */ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 1 gear 2 */
@ -204,7 +196,7 @@ static INPUT_PORTS_START( dragrace )
PORT_DIPSETTING( 0x40, "4.9 seconds" ) PORT_DIPSETTING( 0x40, "4.9 seconds" )
PORT_DIPSETTING( 0xc0, "Never" ) PORT_DIPSETTING( 0xc0, "Never" )
PORT_START("IN1") /* IN1 */ PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Player 2 Gas") PORT_PLAYER(2) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Player 2 Gas") PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 2 gear 1 */ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 2 gear 1 */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 2 gear 2 */ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 2 gear 2 */
@ -216,7 +208,7 @@ static INPUT_PORTS_START( dragrace )
PORT_DIPSETTING( 0x80, "4" ) PORT_DIPSETTING( 0x80, "4" )
PORT_DIPSETTING( 0x00, "5" ) PORT_DIPSETTING( 0x00, "5" )
PORT_START("IN2") /* IN2 */ PORT_START("IN2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) /* IN0 connects here */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) /* IN0 connects here */
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) /* IN1 connects here */ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) /* IN1 connects here */
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 )
@ -229,20 +221,20 @@ static INPUT_PORTS_START( dragrace )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) )
PORT_START("DIAL1") /* IN3 */ PORT_START("DIAL1")
PORT_BIT( 0xff, 0x00, IPT_DIAL_V ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(1) PORT_BIT( 0xff, 0x00, IPT_DIAL_V ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(1)
PORT_START("DIAL2") /* IN4 */ PORT_START("DIAL2")
PORT_BIT( 0xff, 0x00, IPT_DIAL_V ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(2) PORT_BIT( 0xff, 0x00, IPT_DIAL_V ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_PLAYER(2)
PORT_START("P1") /* IN5 */ PORT_START("P1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Player 1 Gear 1") PORT_PLAYER(1) PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Player 1 Gear 1") PORT_PLAYER(1)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Player 1 Gear 2") PORT_PLAYER(1) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Player 1 Gear 2") PORT_PLAYER(1)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Player 1 Gear 3") PORT_PLAYER(1) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Player 1 Gear 3") PORT_PLAYER(1)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Player 1 Gear 4") PORT_PLAYER(1) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Player 1 Gear 4") PORT_PLAYER(1)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Player 1 Neutral") PORT_PLAYER(1) PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Player 1 Neutral") PORT_PLAYER(1)
PORT_START("P2") /* IN6 */ PORT_START("P2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Player 2 Gear 1") PORT_PLAYER(2) PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Player 2 Gear 1") PORT_PLAYER(2)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Player 2 Gear 2") PORT_PLAYER(2) PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Player 2 Gear 2") PORT_PLAYER(2)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Player 2 Gear 3") PORT_PLAYER(2) PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Player 2 Gear 3") PORT_PLAYER(2)
@ -322,14 +314,39 @@ static PALETTE_INIT( dragrace )
} }
static MACHINE_START( dragrace )
{
dragrace_state *state = (dragrace_state *)machine->driver_data;
state->discrete = devtag_get_device(machine, "discrete");
state_save_register_global(machine, state->misc_flags);
state_save_register_global_array(machine, state->gear);
}
static MACHINE_RESET( dragrace )
{
dragrace_state *state = (dragrace_state *)machine->driver_data;
timer_pulse(machine, video_screen_get_frame_period(machine->primary_screen), NULL, 0, dragrace_frame_callback);
state->misc_flags = 0;
state->gear[0] = 0;
state->gear[1] = 0;
}
static MACHINE_DRIVER_START( dragrace ) static MACHINE_DRIVER_START( dragrace )
/* driver data */
MDRV_DRIVER_DATA(dragrace_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M6800, 12096000 / 12) MDRV_CPU_ADD("maincpu", M6800, 12096000 / 12)
MDRV_CPU_PROGRAM_MAP(dragrace_map) MDRV_CPU_PROGRAM_MAP(dragrace_map)
MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold, 4) MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold, 4)
MDRV_WATCHDOG_VBLANK_INIT(8) MDRV_WATCHDOG_VBLANK_INIT(8)
MDRV_MACHINE_START(dragrace)
MDRV_MACHINE_RESET(dragrace) MDRV_MACHINE_RESET(dragrace)
/* video hardware */ /* video hardware */
@ -374,4 +391,4 @@ ROM_START( dragrace )
ROM_END ROM_END
GAME( 1977, dragrace, 0, dragrace, dragrace, 0, 0, "Atari", "Drag Race", 0 ) GAME( 1977, dragrace, 0, dragrace, dragrace, 0, 0, "Atari", "Drag Race", GAME_SUPPORTS_SAVE )

View File

@ -87,23 +87,35 @@ Stephh's notes (based on the game M68EC020 code and some tests) :
#define MASTER_CLOCK 32000000 #define MASTER_CLOCK 32000000
typedef struct _dreamwld_state dreamwld_state;
static UINT32*dreamwld_bg_videoram; struct _dreamwld_state
static UINT32*dreamwld_bg2_videoram;
static UINT32*dreamwld_bg_scroll;
static int dreamwld_tilebank[2], dreamwld_tilebankold[2];
static tilemap *dreamwld_bg_tilemap;
static tilemap *dreamwld_bg2_tilemap;
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
/* memory pointers */
UINT32 * bg_videoram;
UINT32 * bg2_videoram;
UINT32 * bg_scroll;
UINT32 * paletteram;
UINT32 * spriteram;
/* video-related */
tilemap *bg_tilemap,*bg2_tilemap;
int tilebank[2], tilebankold[2];
/* misc */
int protindex;
};
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{
dreamwld_state *state = (dreamwld_state *)machine->driver_data;
const gfx_element *gfx = machine->gfx[0]; const gfx_element *gfx = machine->gfx[0];
UINT32 *source = spriteram32; UINT32 *source = state->spriteram;
UINT32 *finish = spriteram32 + 0x1000/4; UINT32 *finish = state->spriteram + 0x1000 / 4;
UINT16 *redirect = (UINT16 *)memory_region(machine, "gfx3"); UINT16 *redirect = (UINT16 *)memory_region(machine, "gfx3");
while( source<finish ) while (source < finish)
{ {
int xpos, ypos, tileno; int xpos, ypos, tileno;
int xsize, ysize, xinc; int xsize, ysize, xinc;
@ -111,116 +123,120 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
int xflip; int xflip;
int colour; int colour;
xpos = (source[0]&0x000001ff) >> 0; xpos = (source[0] & 0x000001ff) >> 0;
ypos = (source[0]&0x01ff0000) >> 16; ypos = (source[0] & 0x01ff0000) >> 16;
xsize = (source[0]&0x00000e00) >> 9; xsize = (source[0] & 0x00000e00) >> 9;
ysize = (source[0]&0x0e000000) >> 25; ysize = (source[0] & 0x0e000000) >> 25;
tileno = (source[1] & 0x0000ffff) >>0;
tileno = (source[1]&0x0000ffff) >>0; colour = (source[1] & 0x3f000000) >>24;
colour = (source[1]&0x3f000000) >>24; xflip = (source[1] & 0x40000000);
xflip = (source[1]&0x40000000);
xinc = 16; xinc = 16;
if (xflip) if (xflip)
{ {
xinc = -16; xinc = -16;
xpos+=16*xsize; xpos += 16 * xsize;
} }
ysize++;xsize++; // size 0 = 1 tile ysize++; xsize++; // size 0 = 1 tile
xpos -=16; xpos -=16;
for (yct=0;yct<ysize;yct++) for (yct = 0; yct < ysize; yct++)
{ {
for (xct=0;xct<xsize;xct++) for (xct = 0; xct < xsize; xct++)
{ {
drawgfx_transpen(bitmap,cliprect,gfx,redirect[tileno],colour,xflip,0,xpos+xct*xinc,ypos+yct*16,0); drawgfx_transpen(bitmap, cliprect, gfx, redirect[tileno], colour, xflip, 0, xpos + xct * xinc, ypos + yct * 16, 0);
drawgfx_transpen(bitmap,cliprect,gfx,redirect[tileno],colour,xflip,0,(xpos+xct*xinc)-0x200,ypos+yct*16,0); drawgfx_transpen(bitmap, cliprect, gfx, redirect[tileno], colour, xflip, 0, (xpos + xct * xinc) - 0x200, ypos + yct * 16, 0);
drawgfx_transpen(bitmap,cliprect,gfx,redirect[tileno],colour,xflip,0,(xpos+xct*xinc)-0x200,(ypos+yct*16)-0x200,0); drawgfx_transpen(bitmap, cliprect, gfx, redirect[tileno], colour, xflip, 0, (xpos + xct * xinc) - 0x200, (ypos + yct * 16) - 0x200, 0);
drawgfx_transpen(bitmap,cliprect,gfx,redirect[tileno],colour,xflip,0,xpos+xct*xinc,(ypos+yct*16)-0x200,0); drawgfx_transpen(bitmap, cliprect, gfx, redirect[tileno], colour, xflip, 0, xpos + xct * xinc, (ypos + yct * 16) - 0x200 , 0);
tileno++; tileno++;
} }
} }
source+=2; source += 2;
} }
} }
static WRITE32_HANDLER( dreamwld_bg_videoram_w ) static WRITE32_HANDLER( dreamwld_bg_videoram_w )
{ {
COMBINE_DATA(&dreamwld_bg_videoram[offset]); dreamwld_state *state = (dreamwld_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(dreamwld_bg_tilemap,offset*2); COMBINE_DATA(&state->bg_videoram[offset]);
tilemap_mark_tile_dirty(dreamwld_bg_tilemap,offset*2+1); tilemap_mark_tile_dirty(state->bg_tilemap, offset * 2);
tilemap_mark_tile_dirty(state->bg_tilemap, offset * 2 + 1);
} }
static TILE_GET_INFO( get_dreamwld_bg_tile_info ) static TILE_GET_INFO( get_dreamwld_bg_tile_info )
{ {
int tileno,colour; dreamwld_state *state = (dreamwld_state *)machine->driver_data;
tileno = (tile_index&1)?(dreamwld_bg_videoram[tile_index>>1]&0xffff):((dreamwld_bg_videoram[tile_index>>1]>>16)&0xffff); int tileno, colour;
tileno = (tile_index & 1) ? (state->bg_videoram[tile_index >> 1] & 0xffff) : ((state->bg_videoram[tile_index >> 1] >> 16) & 0xffff);
colour = tileno >> 13; colour = tileno >> 13;
tileno &=0x1fff; tileno &= 0x1fff;
SET_TILE_INFO(1,tileno+dreamwld_tilebank[0]*0x2000,0x80+colour,0); SET_TILE_INFO(1, tileno + state->tilebank[0] * 0x2000, 0x80 + colour, 0);
} }
static WRITE32_HANDLER( dreamwld_bg2_videoram_w ) static WRITE32_HANDLER( dreamwld_bg2_videoram_w )
{ {
COMBINE_DATA(&dreamwld_bg2_videoram[offset]); dreamwld_state *state = (dreamwld_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(dreamwld_bg2_tilemap,offset*2); COMBINE_DATA(&state->bg2_videoram[offset]);
tilemap_mark_tile_dirty(dreamwld_bg2_tilemap,offset*2+1); tilemap_mark_tile_dirty(state->bg2_tilemap, offset * 2);
tilemap_mark_tile_dirty(state->bg2_tilemap, offset * 2 + 1);
} }
static TILE_GET_INFO( get_dreamwld_bg2_tile_info ) static TILE_GET_INFO( get_dreamwld_bg2_tile_info )
{ {
UINT16 tileno,colour; dreamwld_state *state = (dreamwld_state *)machine->driver_data;
tileno = (tile_index&1)?(dreamwld_bg2_videoram[tile_index>>1]&0xffff):((dreamwld_bg2_videoram[tile_index>>1]>>16)&0xffff); UINT16 tileno, colour;
tileno = (tile_index & 1) ? (state->bg2_videoram[tile_index >> 1] & 0xffff) : ((state->bg2_videoram[tile_index >> 1] >> 16) & 0xffff);
colour = tileno >> 13; colour = tileno >> 13;
tileno &=0x1fff; tileno &= 0x1fff;
SET_TILE_INFO(1,tileno+dreamwld_tilebank[1]*0x2000,0xc0+colour,0); SET_TILE_INFO(1, tileno + state->tilebank[1] * 0x2000, 0xc0 + colour, 0);
} }
static VIDEO_START( dreamwld ) static VIDEO_START( dreamwld )
{ {
dreamwld_bg_tilemap = tilemap_create(machine, get_dreamwld_bg_tile_info,tilemap_scan_rows, 16, 16, 64,32); dreamwld_state *state = (dreamwld_state *)machine->driver_data;
dreamwld_bg2_tilemap = tilemap_create(machine, get_dreamwld_bg2_tile_info,tilemap_scan_rows, 16, 16, 64,32);
tilemap_set_transparent_pen(dreamwld_bg2_tilemap,0); state->bg_tilemap = tilemap_create(machine, get_dreamwld_bg_tile_info,tilemap_scan_rows, 16, 16, 64,32);
dreamwld_tilebankold[0] = dreamwld_tilebankold[1] = -1; state->bg2_tilemap = tilemap_create(machine, get_dreamwld_bg2_tile_info,tilemap_scan_rows, 16, 16, 64,32);
dreamwld_tilebank[0] = dreamwld_tilebank[1] = 0; tilemap_set_transparent_pen(state->bg2_tilemap,0);
} }
static VIDEO_UPDATE( dreamwld ) static VIDEO_UPDATE( dreamwld )
{ {
tilemap_set_scrolly( dreamwld_bg_tilemap,0, dreamwld_bg_scroll[(0x400/4)]+32 ); dreamwld_state *state = (dreamwld_state *)screen->machine->driver_data;
tilemap_set_scrolly( dreamwld_bg2_tilemap,0, dreamwld_bg_scroll[(0x400/4)+2]+32 );
tilemap_set_scrollx( dreamwld_bg_tilemap,0, dreamwld_bg_scroll[(0x400/4)+1]+3 );
tilemap_set_scrollx( dreamwld_bg2_tilemap,0, dreamwld_bg_scroll[(0x400/4)+3]+5 );
dreamwld_tilebank[0] = (dreamwld_bg_scroll[(0x400/4)+4]>>6)&1; tilemap_set_scrolly(state->bg_tilemap, 0, state->bg_scroll[(0x400 / 4)] + 32);
dreamwld_tilebank[1] = (dreamwld_bg_scroll[(0x400/4)+5]>>6)&1; tilemap_set_scrolly(state->bg2_tilemap, 0, state->bg_scroll[(0x400 / 4) + 2] + 32);
tilemap_set_scrollx(state->bg_tilemap, 0, state->bg_scroll[(0x400 / 4) + 1] + 3);
tilemap_set_scrollx(state->bg2_tilemap, 0, state->bg_scroll[(0x400 / 4) + 3] + 5);
if (dreamwld_tilebank[0] != dreamwld_tilebankold[0]) state->tilebank[0] = (state->bg_scroll[(0x400 / 4) + 4] >> 6) & 1;
state->tilebank[1] = (state->bg_scroll[(0x400 / 4) + 5] >> 6) & 1;
if (state->tilebank[0] != state->tilebankold[0])
{ {
dreamwld_tilebankold[0] = dreamwld_tilebank[0]; state->tilebankold[0] = state->tilebank[0];
tilemap_mark_all_tiles_dirty (dreamwld_bg_tilemap); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
} }
if (dreamwld_tilebank[1] != dreamwld_tilebankold[1]) if (state->tilebank[1] != state->tilebankold[1])
{ {
dreamwld_tilebankold[1] = dreamwld_tilebank[1]; state->tilebankold[1] = state->tilebank[1];
tilemap_mark_all_tiles_dirty (dreamwld_bg2_tilemap); tilemap_mark_all_tiles_dirty(state->bg2_tilemap);
} }
tilemap_draw(bitmap,cliprect,dreamwld_bg_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
tilemap_draw(bitmap,cliprect,dreamwld_bg2_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->bg2_tilemap, 0, 0);
draw_sprites(screen->machine,bitmap,cliprect); draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }
@ -228,26 +244,28 @@ static VIDEO_UPDATE( dreamwld )
static READ32_HANDLER( dreamwld_protdata_r ) static READ32_HANDLER( dreamwld_protdata_r )
{ {
static int protindex = 0; dreamwld_state *state = (dreamwld_state *)space->machine->driver_data;
UINT8 *protdata = memory_region( space->machine, "user1" );
size_t protsize = memory_region_length( space->machine, "user1" ); UINT8 *protdata = memory_region(space->machine, "user1");
UINT8 dat = protdata[(protindex++)%protsize]; size_t protsize = memory_region_length(space->machine, "user1");
return dat<<24; UINT8 dat = protdata[(state->protindex++) % protsize];
return dat << 24;
} }
static WRITE32_HANDLER( dreamwld_palette_w ) static WRITE32_HANDLER( dreamwld_palette_w )
{ {
dreamwld_state *state = (dreamwld_state *)space->machine->driver_data;
UINT16 dat; UINT16 dat;
int color; int color;
COMBINE_DATA(&paletteram32[offset]); COMBINE_DATA(&state->paletteram[offset]);
color = offset * 2; color = offset * 2;
dat = paletteram32[offset] & 0x7fff; dat = state->paletteram[offset] & 0x7fff;
palette_set_color_rgb(space->machine, color + 1, pal5bit(dat >> 10), pal5bit(dat >> 5), pal5bit(dat >> 0)); palette_set_color_rgb(space->machine, color + 1, pal5bit(dat >> 10), pal5bit(dat >> 5), pal5bit(dat >> 0));
dat = (paletteram32[offset] >> 16) & 0x7fff; dat = (state->paletteram[offset] >> 16) & 0x7fff;
palette_set_color_rgb(space->machine, color, pal5bit(dat >> 10), pal5bit(dat >> 5), pal5bit(dat >> 0)); palette_set_color_rgb(space->machine, color, pal5bit(dat >> 10), pal5bit(dat >> 5), pal5bit(dat >> 0));
} }
@ -256,52 +274,44 @@ static void dreamwld_oki_setbank( running_machine *machine, UINT8 chip, UINT8 ba
/* 0x30000-0x3ffff is banked. /* 0x30000-0x3ffff is banked.
banks are at 0x30000,0x40000,0x50000 and 0x60000 in rom */ banks are at 0x30000,0x40000,0x50000 and 0x60000 in rom */
UINT8 *sound = memory_region(machine, chip ? "oki1" : "oki2"); UINT8 *sound = memory_region(machine, chip ? "oki1" : "oki2");
logerror("OKI%d: set bank %02x\n",chip,bank); logerror("OKI%d: set bank %02x\n", chip, bank);
memcpy(sound+0x30000, sound+0xb0000+0x10000*bank, 0x10000); memcpy(sound + 0x30000, sound + 0xb0000 + 0x10000 * bank, 0x10000);
} }
static WRITE32_HANDLER( dreamwld_6295_0_bank_w ) static WRITE32_HANDLER( dreamwld_6295_0_bank_w )
{ {
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ dreamwld_oki_setbank(space->machine, 0, data & 0x3);
dreamwld_oki_setbank(space->machine,0,data&0x3);
}
else else
{
logerror("OKI0: unk bank write %x mem_mask %8x\n", data, mem_mask); logerror("OKI0: unk bank write %x mem_mask %8x\n", data, mem_mask);
}
} }
static WRITE32_HANDLER( dreamwld_6295_1_bank_w ) static WRITE32_HANDLER( dreamwld_6295_1_bank_w )
{ {
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ dreamwld_oki_setbank(space->machine, 1, data & 0x3);
dreamwld_oki_setbank(space->machine,1,data&0x3);
}
else else
{
logerror("OKI1: unk bank write %x mem_mask %8x\n", data, mem_mask); logerror("OKI1: unk bank write %x mem_mask %8x\n", data, mem_mask);
}
} }
static ADDRESS_MAP_START( dreamwld_map, ADDRESS_SPACE_PROGRAM, 32 ) static ADDRESS_MAP_START( dreamwld_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_WRITENOP AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_WRITENOP
AM_RANGE(0x400000, 0x401fff) AM_RAM AM_BASE( &spriteram32 ) AM_RANGE(0x400000, 0x401fff) AM_RAM AM_BASE_MEMBER(dreamwld_state, spriteram)
AM_RANGE(0x600000, 0x601fff) AM_RAM_WRITE(dreamwld_palette_w) AM_BASE(&paletteram32) // real palette? AM_RANGE(0x600000, 0x601fff) AM_RAM_WRITE(dreamwld_palette_w) AM_BASE_MEMBER(dreamwld_state, paletteram) // real palette?
AM_RANGE(0x800000, 0x801fff) AM_RAM_WRITE(dreamwld_bg_videoram_w ) AM_BASE( &dreamwld_bg_videoram ) AM_RANGE(0x800000, 0x801fff) AM_RAM_WRITE(dreamwld_bg_videoram_w ) AM_BASE_MEMBER(dreamwld_state, bg_videoram)
AM_RANGE(0x802000, 0x803fff) AM_RAM_WRITE(dreamwld_bg2_videoram_w ) AM_BASE( &dreamwld_bg2_videoram ) AM_RANGE(0x802000, 0x803fff) AM_RAM_WRITE(dreamwld_bg2_videoram_w ) AM_BASE_MEMBER(dreamwld_state, bg2_videoram)
AM_RANGE(0x804000, 0x805fff) AM_RAM AM_BASE( &dreamwld_bg_scroll ) // scroll regs etc. AM_RANGE(0x804000, 0x805fff) AM_RAM AM_BASE_MEMBER(dreamwld_state, bg_scroll) // scroll regs etc.
AM_RANGE(0xc00000, 0xc00003) AM_READ_PORT("INPUTS") AM_RANGE(0xc00000, 0xc00003) AM_READ_PORT("INPUTS")
AM_RANGE(0xc00004, 0xc00007) AM_READ_PORT("c00004") AM_RANGE(0xc00004, 0xc00007) AM_READ_PORT("c00004")
AM_RANGE(0xc0000c, 0xc0000f) AM_WRITE( dreamwld_6295_0_bank_w ) // sfx AM_RANGE(0xc0000c, 0xc0000f) AM_WRITE(dreamwld_6295_0_bank_w) // sfx
AM_RANGE(0xc00018, 0xc0001b) AM_DEVREADWRITE8( "oki1", okim6295_r, okim6295_w, 0xff000000 ) // sfx AM_RANGE(0xc00018, 0xc0001b) AM_DEVREADWRITE8("oki1", okim6295_r, okim6295_w, 0xff000000) // sfx
AM_RANGE(0xc0002c, 0xc0002f) AM_WRITE( dreamwld_6295_1_bank_w ) // sfx AM_RANGE(0xc0002c, 0xc0002f) AM_WRITE(dreamwld_6295_1_bank_w) // sfx
AM_RANGE(0xc00028, 0xc0002b) AM_DEVREADWRITE8( "oki2", okim6295_r, okim6295_w, 0xff000000 ) // sfx AM_RANGE(0xc00028, 0xc0002b) AM_DEVREADWRITE8("oki2", okim6295_r, okim6295_w, 0xff000000) // sfx
AM_RANGE(0xc00030, 0xc00033) AM_READ(dreamwld_protdata_r) // it reads protection data (irq code) from here and puts it at ffd000 AM_RANGE(0xc00030, 0xc00033) AM_READ(dreamwld_protdata_r) // it reads protection data (irq code) from here and puts it at ffd000
@ -310,7 +320,7 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( dreamwld ) static INPUT_PORTS_START( dreamwld )
PORT_START("INPUTS") /* 32bit */ PORT_START("INPUTS")
PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x0000fffc, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0000fffc, IP_ACTIVE_LOW, IPT_UNUSED )
@ -331,11 +341,11 @@ static INPUT_PORTS_START( dreamwld )
PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_START("c00004") /* 32bit */ PORT_START("c00004")
PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "DSW") PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "DSW")
PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "DSW") PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "DSW")
PORT_START("DSW") /* 16bit */ PORT_START("DSW")
PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0002, "2" ) PORT_DIPSETTING( 0x0002, "2" )
PORT_DIPSETTING( 0x0003, "3" ) PORT_DIPSETTING( 0x0003, "3" )
@ -383,12 +393,38 @@ static GFXDECODE_START( dreamwld )
GFXDECODE_ENTRY( "gfx2", 0, tiles16x16_layout, 0, 0x100 ) GFXDECODE_ENTRY( "gfx2", 0, tiles16x16_layout, 0, 0x100 )
GFXDECODE_END GFXDECODE_END
static MACHINE_START( dreamwld )
{
dreamwld_state *state = (dreamwld_state *)machine->driver_data;
state_save_register_global(machine, state->protindex);
state_save_register_global_array(machine, state->tilebank);
state_save_register_global_array(machine, state->tilebankold);
}
static MACHINE_RESET( dreamwld )
{
dreamwld_state *state = (dreamwld_state *)machine->driver_data;
state->tilebankold[0] = state->tilebankold[1] = -1;
state->tilebank[0] = state->tilebank[1] = 0;
state->protindex = 0;
}
static MACHINE_DRIVER_START( dreamwld ) static MACHINE_DRIVER_START( dreamwld )
/* driver data */
MDRV_DRIVER_DATA(dreamwld_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68EC020, MASTER_CLOCK/2) MDRV_CPU_ADD("maincpu", M68EC020, MASTER_CLOCK/2)
MDRV_CPU_PROGRAM_MAP(dreamwld_map) MDRV_CPU_PROGRAM_MAP(dreamwld_map)
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold) // 4, 5, or 6, all point to the same place MDRV_CPU_VBLANK_INT("screen", irq4_line_hold) // 4, 5, or 6, all point to the same place
MDRV_MACHINE_START(dreamwld)
MDRV_MACHINE_RESET(dreamwld)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(58) MDRV_SCREEN_REFRESH_RATE(58)
@ -436,7 +472,6 @@ ROM_START( dreamwld )
ram. The interrupt vectors point at the code placed in RAM. */ ram. The interrupt vectors point at the code placed in RAM. */
ROM_LOAD( "protdata.bin", 0x000, 0x6c9 , CRC(f284b2fd) SHA1(9e8096c8aa8a288683f002311b38787b120748d1) ) /* extracted */ ROM_LOAD( "protdata.bin", 0x000, 0x6c9 , CRC(f284b2fd) SHA1(9e8096c8aa8a288683f002311b38787b120748d1) ) /* extracted */
ROM_REGION( 0x100000, "oki1", 0 ) /* OKI Samples - 1st chip*/ ROM_REGION( 0x100000, "oki1", 0 ) /* OKI Samples - 1st chip*/
ROM_LOAD( "5.bin", 0x000000, 0x80000, CRC(9689570a) SHA1(4414233da8f46214ca7e9022df70953922a63aa4) ) ROM_LOAD( "5.bin", 0x000000, 0x80000, CRC(9689570a) SHA1(4414233da8f46214ca7e9022df70953922a63aa4) )
ROM_RELOAD(0x80000,0x80000) // fot the banks ROM_RELOAD(0x80000,0x80000) // fot the banks
@ -460,4 +495,4 @@ ROM_START( dreamwld )
ROM_END ROM_END
GAME( 2000, dreamwld, 0, dreamwld, dreamwld, 0, ROT0, "SemiCom", "Dream World", 0 ) GAME( 2000, dreamwld, 0, dreamwld, dreamwld, 0, ROT0, "SemiCom", "Dream World", GAME_SUPPORTS_SAVE )

View File

@ -32,21 +32,6 @@
/*************************************
*
* Global variables
*
*************************************/
/* referenced by the video hardware */
UINT8 dribling_abca;
static UINT8 dr, ds, sh;
static UINT8 input_mux;
static UINT8 di;
/************************************* /*************************************
* *
* Interrupt generation * Interrupt generation
@ -55,7 +40,8 @@ static UINT8 di;
static INTERRUPT_GEN( dribling_irq_gen ) static INTERRUPT_GEN( dribling_irq_gen )
{ {
if (di) dribling_state *state = (dribling_state *)device->machine->driver_data;
if (state->di)
cpu_set_input_line(device, 0, ASSERT_LINE); cpu_set_input_line(device, 0, ASSERT_LINE);
} }
@ -69,19 +55,23 @@ static INTERRUPT_GEN( dribling_irq_gen )
static READ8_DEVICE_HANDLER( dsr_r ) static READ8_DEVICE_HANDLER( dsr_r )
{ {
dribling_state *state = (dribling_state *)device->machine->driver_data;
/* return DSR0-7 */ /* return DSR0-7 */
return (ds << sh) | (dr >> (8 - sh)); return (state->ds << state->sh) | (state->dr >> (8 - state->sh));
} }
static READ8_DEVICE_HANDLER( input_mux0_r ) static READ8_DEVICE_HANDLER( input_mux0_r )
{ {
dribling_state *state = (dribling_state *)device->machine->driver_data;
/* low value in the given bit selects */ /* low value in the given bit selects */
if (!(input_mux & 0x01)) if (!(state->input_mux & 0x01))
return input_port_read(device->machine, "MUX0"); return input_port_read(device->machine, "MUX0");
else if (!(input_mux & 0x02)) else if (!(state->input_mux & 0x02))
return input_port_read(device->machine, "MUX1"); return input_port_read(device->machine, "MUX1");
else if (!(input_mux & 0x04)) else if (!(state->input_mux & 0x04))
return input_port_read(device->machine, "MUX2"); return input_port_read(device->machine, "MUX2");
return 0xff; return 0xff;
} }
@ -96,15 +86,17 @@ static READ8_DEVICE_HANDLER( input_mux0_r )
static WRITE8_DEVICE_HANDLER( misc_w ) static WRITE8_DEVICE_HANDLER( misc_w )
{ {
dribling_state *state = (dribling_state *)device->machine->driver_data;
/* bit 7 = di */ /* bit 7 = di */
di = (data >> 7) & 1; state->di = (data >> 7) & 1;
if (!di) if (!state->di)
cputag_set_input_line(device->machine, "maincpu", 0, CLEAR_LINE); cputag_set_input_line(device->machine, "maincpu", 0, CLEAR_LINE);
/* bit 6 = parata */ /* bit 6 = parata */
/* bit 5 = ab. campo */ /* bit 5 = ab. campo */
dribling_abca = (data >> 5) & 1; state->abca = (data >> 5) & 1;
/* bit 4 = ab. a.b.f. */ /* bit 4 = ab. a.b.f. */
/* bit 3 = n/c */ /* bit 3 = n/c */
@ -112,7 +104,7 @@ static WRITE8_DEVICE_HANDLER( misc_w )
/* bit 2 = (9) = PC2 */ /* bit 2 = (9) = PC2 */
/* bit 1 = (10) = PC1 */ /* bit 1 = (10) = PC1 */
/* bit 0 = (32) = PC0 */ /* bit 0 = (32) = PC0 */
input_mux = data & 7; state->input_mux = data & 7;
logerror("%s:misc_w(%02X)\n", cpuexec_describe_context(device->machine), data); logerror("%s:misc_w(%02X)\n", cpuexec_describe_context(device->machine), data);
} }
@ -121,7 +113,7 @@ static WRITE8_DEVICE_HANDLER( sound_w )
{ {
/* bit 7 = stop palla */ /* bit 7 = stop palla */
/* bit 6 = contrasto */ /* bit 6 = contrasto */
/* bit 5 = calgio a */ /* bit 5 = calcio a */
/* bit 4 = fischio */ /* bit 4 = fischio */
/* bit 3 = calcio b */ /* bit 3 = calcio b */
/* bit 2 = folla a */ /* bit 2 = folla a */
@ -140,12 +132,14 @@ static WRITE8_DEVICE_HANDLER( pb_w )
static WRITE8_DEVICE_HANDLER( shr_w ) static WRITE8_DEVICE_HANDLER( shr_w )
{ {
dribling_state *state = (dribling_state *)device->machine->driver_data;
/* bit 3 = watchdog */ /* bit 3 = watchdog */
if (data & 0x08) if (data & 0x08)
watchdog_reset(device->machine); watchdog_reset(device->machine);
/* bit 2-0 = SH0-2 */ /* bit 2-0 = SH0-2 */
sh = data & 0x07; state->sh = data & 0x07;
} }
@ -158,24 +152,28 @@ static WRITE8_DEVICE_HANDLER( shr_w )
static READ8_HANDLER( ioread ) static READ8_HANDLER( ioread )
{ {
dribling_state *state = (dribling_state *)space->machine->driver_data;
if (offset & 0x08) if (offset & 0x08)
return ppi8255_r(devtag_get_device(space->machine, "ppi8255_0"), offset & 3); return ppi8255_r(state->ppi_0, offset & 3);
else if (offset & 0x10) else if (offset & 0x10)
return ppi8255_r(devtag_get_device(space->machine, "ppi8255_1"), offset & 3); return ppi8255_r(state->ppi_1, offset & 3);
return 0xff; return 0xff;
} }
static WRITE8_HANDLER( iowrite ) static WRITE8_HANDLER( iowrite )
{ {
dribling_state *state = (dribling_state *)space->machine->driver_data;
if (offset & 0x08) if (offset & 0x08)
ppi8255_w(devtag_get_device(space->machine, "ppi8255_0"), offset & 3, data); ppi8255_w(state->ppi_0, offset & 3, data);
else if (offset & 0x10) else if (offset & 0x10)
ppi8255_w(devtag_get_device(space->machine, "ppi8255_1"), offset & 3, data); ppi8255_w(state->ppi_1, offset & 3, data);
else if (offset & 0x40) else if (offset & 0x40)
{ {
dr = ds; state->dr = state->ds;
ds = data; state->ds = data;
} }
} }
@ -217,9 +215,9 @@ static const ppi8255_interface ppi8255_intf[2] =
static ADDRESS_MAP_START( dribling_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( dribling_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x2000, 0x3fff) AM_RAM AM_BASE(&videoram) AM_RANGE(0x2000, 0x3fff) AM_RAM AM_BASE_MEMBER(dribling_state, videoram)
AM_RANGE(0x4000, 0x7fff) AM_ROM AM_RANGE(0x4000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xdfff) AM_RAM_WRITE(dribling_colorram_w) AM_BASE(&colorram) AM_RANGE(0xc000, 0xdfff) AM_RAM_WRITE(dribling_colorram_w) AM_BASE_MEMBER(dribling_state, colorram)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -237,7 +235,7 @@ ADDRESS_MAP_END
*************************************/ *************************************/
static INPUT_PORTS_START( dribling ) static INPUT_PORTS_START( dribling )
PORT_START("MUX0") /* IN0 (mux 0) */ PORT_START("MUX0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(1) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(1) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(1)
@ -247,7 +245,7 @@ static INPUT_PORTS_START( dribling )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(1) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(1)
PORT_START("MUX1") /* IN0 (mux 1) */ PORT_START("MUX1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2)
@ -257,7 +255,7 @@ static INPUT_PORTS_START( dribling )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2)
PORT_START("MUX2") /* IN0 (mux 2) */ PORT_START("MUX2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
@ -265,7 +263,7 @@ static INPUT_PORTS_START( dribling )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0") /* IN0 */ PORT_START("IN0")
PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
@ -285,8 +283,39 @@ INPUT_PORTS_END
* *
*************************************/ *************************************/
static MACHINE_START( dribling )
{
dribling_state *state = (dribling_state *)machine->driver_data;
state->ppi_0 = devtag_get_device(machine, "ppi8255_0");
state->ppi_1 = devtag_get_device(machine, "ppi8255_1");
state_save_register_global(machine, state->abca);
state_save_register_global(machine, state->di);
state_save_register_global(machine, state->dr);
state_save_register_global(machine, state->ds);
state_save_register_global(machine, state->sh);
state_save_register_global(machine, state->input_mux);
}
static MACHINE_RESET( dribling )
{
dribling_state *state = (dribling_state *)machine->driver_data;
state->abca = 0;
state->di = 0;
state->dr = 0;
state->ds = 0;
state->sh = 0;
state->input_mux = 0;
}
static MACHINE_DRIVER_START( dribling ) static MACHINE_DRIVER_START( dribling )
/* driver data */
MDRV_DRIVER_DATA(dribling_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 5000000) MDRV_CPU_ADD("maincpu", Z80, 5000000)
MDRV_CPU_PROGRAM_MAP(dribling_map) MDRV_CPU_PROGRAM_MAP(dribling_map)
@ -296,6 +325,9 @@ static MACHINE_DRIVER_START( dribling )
MDRV_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] ) MDRV_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] )
MDRV_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] ) MDRV_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] )
MDRV_MACHINE_START(dribling)
MDRV_MACHINE_RESET(dribling)
/* video hardware */ /* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
@ -367,5 +399,5 @@ ROM_END
* *
*************************************/ *************************************/
GAME( 1983, dribling, 0, dribling, dribling, 0, ROT0, "Model Racing", "Dribbling", GAME_NO_SOUND ) GAME( 1983, dribling, 0, dribling, dribling, 0, ROT0, "Model Racing", "Dribbling", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1983, driblingo,dribling, dribling, dribling, 0, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", GAME_NO_SOUND ) GAME( 1983, driblingo,dribling, dribling, dribling, 0, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -12,52 +12,53 @@ Quite similar to Appoooh
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "drmicro.h"
#define MCLK 18432000 #define MCLK 18432000
PALETTE_INIT( drmicro );
VIDEO_START( drmicro );
VIDEO_UPDATE( drmicro );
WRITE8_HANDLER( drmicro_videoram_w ); /*************************************
*
extern void drmicro_flip_w( running_machine *machine, int flip ); * Memory handlers
*
/****************************************************************************/ *************************************/
static int drmicro_nmi_enable;
static INTERRUPT_GEN( drmicro_interrupt ) static INTERRUPT_GEN( drmicro_interrupt )
{ {
if (drmicro_nmi_enable) drmicro_state *state = (drmicro_state *)device->machine->driver_data;
if (state->nmi_enable)
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
} }
static WRITE8_HANDLER( nmi_enable_w ) static WRITE8_HANDLER( nmi_enable_w )
{ // bit2,3 unknown {
drmicro_nmi_enable = data & 1; drmicro_state *state = (drmicro_state *)space->machine->driver_data;
drmicro_flip_w(space->machine, data & 2);
state->nmi_enable = data & 1;
state->flipscreen = (data & 2) ? 1 : 0;
flip_screen_set(space->machine, data & 2);
// bit2,3 unknown
} }
/****************************************************************************/
static int pcm_adr;
static void pcm_w(const device_config *device) static void pcm_w(const device_config *device)
{ {
drmicro_state *state = (drmicro_state *)device->machine->driver_data;
UINT8 *PCM = memory_region(device->machine, "adpcm"); UINT8 *PCM = memory_region(device->machine, "adpcm");
int data = PCM[pcm_adr / 2]; int data = PCM[state->pcm_adr / 2];
if (data != 0x70) // ?? if (data != 0x70) // ??
{ {
if (~pcm_adr & 1) if (~state->pcm_adr & 1)
data >>= 4; data >>= 4;
msm5205_data_w(device, data & 0x0f); msm5205_data_w(device, data & 0x0f);
msm5205_reset_w(device, 0); msm5205_reset_w(device, 0);
pcm_adr = (pcm_adr + 1) & 0x7fff; state->pcm_adr = (state->pcm_adr + 1) & 0x7fff;
} }
else else
msm5205_reset_w(device, 1); msm5205_reset_w(device, 1);
@ -65,11 +66,16 @@ static void pcm_w(const device_config *device)
static WRITE8_HANDLER( pcm_set_w ) static WRITE8_HANDLER( pcm_set_w )
{ {
pcm_adr = ((data & 0x3f) << 9); drmicro_state *state = (drmicro_state *)space->machine->driver_data;
pcm_w(devtag_get_device(space->machine, "msm")); state->pcm_adr = ((data & 0x3f) << 9);
pcm_w(state->msm);
} }
/****************************************************************************/ /*************************************
*
* Address maps
*
*************************************/
static ADDRESS_MAP_START( drmicro_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( drmicro_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0x0000, 0xbfff) AM_ROM
@ -88,7 +94,11 @@ static ADDRESS_MAP_START( io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x05, 0x05) AM_READWRITE(SMH_NOP, SMH_NOP) // unused? / watchdog? AM_RANGE(0x05, 0x05) AM_READWRITE(SMH_NOP, SMH_NOP) // unused? / watchdog?
ADDRESS_MAP_END ADDRESS_MAP_END
/****************************************************************************/ /*************************************
*
* Input ports
*
*************************************/
static INPUT_PORTS_START( drmicro ) static INPUT_PORTS_START( drmicro )
PORT_START("P1") PORT_START("P1")
@ -146,7 +156,11 @@ static INPUT_PORTS_START( drmicro )
PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // 4-8 PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // 4-8
INPUT_PORTS_END INPUT_PORTS_END
/****************************************************************************/ /*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout spritelayout4 = static const gfx_layout spritelayout4 =
{ {
@ -205,10 +219,39 @@ static const msm5205_interface msm5205_config =
MSM5205_S64_4B /* 6 KHz */ MSM5205_S64_4B /* 6 KHz */
}; };
/****************************************************************************/
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_START( drmicro )
{
drmicro_state *state = (drmicro_state *)machine->driver_data;
state->msm = devtag_get_device(machine, "msm");
state_save_register_global(machine, state->nmi_enable);
state_save_register_global(machine, state->pcm_adr);
state_save_register_global(machine, state->flipscreen);
}
static MACHINE_RESET( drmicro )
{
drmicro_state *state = (drmicro_state *)machine->driver_data;
state->nmi_enable = 0;
state->pcm_adr = 0;
state->flipscreen = 0;
}
static MACHINE_DRIVER_START( drmicro ) static MACHINE_DRIVER_START( drmicro )
/* driver data */
MDRV_DRIVER_DATA(drmicro_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,MCLK/6) /* 3.072MHz? */ MDRV_CPU_ADD("maincpu", Z80,MCLK/6) /* 3.072MHz? */
MDRV_CPU_PROGRAM_MAP(drmicro_map) MDRV_CPU_PROGRAM_MAP(drmicro_map)
@ -217,6 +260,9 @@ static MACHINE_DRIVER_START( drmicro )
MDRV_QUANTUM_TIME(HZ(60)) MDRV_QUANTUM_TIME(HZ(60))
MDRV_MACHINE_START(drmicro)
MDRV_MACHINE_RESET(drmicro)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -249,7 +295,11 @@ static MACHINE_DRIVER_START( drmicro )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
MACHINE_DRIVER_END MACHINE_DRIVER_END
/****************************************************************************/ /*************************************
*
* ROM definition(s)
*
*************************************/
ROM_START( drmicro ) ROM_START( drmicro )
ROM_REGION( 0x10000, "maincpu", 0 ) // CPU ROM_REGION( 0x10000, "maincpu", 0 ) // CPU
@ -279,5 +329,12 @@ ROM_START( drmicro )
ROM_LOAD( "dm-60.6e", 0x0120, 0x0100, CRC(540a3953) SHA1(bc65388a1019dadf8c71705e234763f5c735e282) ) ROM_LOAD( "dm-60.6e", 0x0120, 0x0100, CRC(540a3953) SHA1(bc65388a1019dadf8c71705e234763f5c735e282) )
ROM_END ROM_END
GAME( 1983, drmicro, 0, drmicro, drmicro, 0, ROT270, "Sanritsu", "Dr. Micro", 0 )
/*************************************
*
* Game driver(s)
*
*************************************/
GAME( 1983, drmicro, 0, drmicro, drmicro, 0, ROT270, "Sanritsu", "Dr. Micro", GAME_SUPPORTS_SAVE )

View File

@ -11,22 +11,38 @@ similar hardware.
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "sound/okim6295.h" #include "sound/okim6295.h"
static UINT16 *drtomy_spriteram; typedef struct _drtomy_state drtomy_state;
static UINT16 *drtomy_videoram_bg, *drtomy_videoram_fg; struct _drtomy_state
static tilemap *tilemap_bg, *tilemap_fg; {
/* memory pointers */
UINT16 * spriteram;
UINT16 * videoram_bg;
UINT16 * videoram_fg;
// UINT16 * paletteram16; // currently this uses generic palette handling
/* video-related */
tilemap *tilemap_bg,*tilemap_fg;
/* misc */
int oki_bank;
};
static TILE_GET_INFO( get_tile_info_fg ) static TILE_GET_INFO( get_tile_info_fg )
{ {
int code = drtomy_videoram_fg[tile_index] & 0xfff; drtomy_state *state = (drtomy_state *)machine->driver_data;
int color = (drtomy_videoram_fg[tile_index] & 0xf000) >> 12; int code = state->videoram_fg[tile_index] & 0xfff;
int color = (state->videoram_fg[tile_index] & 0xf000) >> 12;
SET_TILE_INFO(2, code, color, 0); SET_TILE_INFO(2, code, color, 0);
} }
static TILE_GET_INFO( get_tile_info_bg ) static TILE_GET_INFO( get_tile_info_bg )
{ {
int code = drtomy_videoram_bg[tile_index] & 0xfff; drtomy_state *state = (drtomy_state *)machine->driver_data;
int color = (drtomy_videoram_bg[tile_index] & 0xf000) >> 12; int code = state->videoram_bg[tile_index] & 0xfff;
int color = (state->videoram_bg[tile_index] & 0xf000) >> 12;
SET_TILE_INFO(1, code, color, 0); SET_TILE_INFO(1, code, color, 0);
} }
@ -48,38 +64,42 @@ static TILE_GET_INFO( get_tile_info_bg )
3 | xxxxxxxx xxxxxx-- | sprite code 3 | xxxxxxxx xxxxxx-- | sprite code
*/ */
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 )
{ {
drtomy_state *state = (drtomy_state *)machine->driver_data;
int i, x, y, ex, ey; int i, x, y, ex, ey;
const gfx_element *gfx = machine->gfx[0]; const gfx_element *gfx = machine->gfx[0];
static const int x_offset[2] = {0x0,0x2}; static const int x_offset[2] = {0x0, 0x2};
static const int y_offset[2] = {0x0,0x1}; static const int y_offset[2] = {0x0, 0x1};
for (i = 3; i < 0x1000/2; i+=4){ for (i = 3; i < 0x1000 / 2; i += 4)
int sx = drtomy_spriteram[i+2] & 0x01ff; {
int sy = (240 - (drtomy_spriteram[i] & 0x00ff)) & 0x00ff; int sx = state->spriteram[i + 2] & 0x01ff;
int number = drtomy_spriteram[i+3]; int sy = (240 - (state->spriteram[i] & 0x00ff)) & 0x00ff;
int color = (drtomy_spriteram[i+2] & 0x1e00) >> 9; int number = state->spriteram[i + 3];
int attr = (drtomy_spriteram[i] & 0xfe00) >> 9; int color = (state->spriteram[i + 2] & 0x1e00) >> 9;
int attr = (state->spriteram[i] & 0xfe00) >> 9;
int xflip = attr & 0x20; int xflip = attr & 0x20;
int yflip = attr & 0x40; int yflip = attr & 0x40;
int spr_size; int spr_size;
if (attr & 0x04){ if (attr & 0x04)
spr_size = 1; spr_size = 1;
} else
else{ {
spr_size = 2; spr_size = 2;
number &= (~3); number &= (~3);
} }
for (y = 0; y < spr_size; y++){ for (y = 0; y < spr_size; y++)
for (x = 0; x < spr_size; x++){ {
for (x = 0; x < spr_size; x++)
{
ex = xflip ? (spr_size-1-x) : x; ex = xflip ? (spr_size - 1 - x) : x;
ey = yflip ? (spr_size-1-y) : y; ey = yflip ? (spr_size - 1 - y) : y;
drawgfx_transpen(bitmap,cliprect,gfx,number + x_offset[ex] + y_offset[ey], drawgfx_transpen(bitmap,cliprect,gfx,number + x_offset[ex] + y_offset[ey],
color,xflip,yflip, color,xflip,yflip,
@ -91,40 +111,45 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
static VIDEO_START( drtomy ) static VIDEO_START( drtomy )
{ {
tilemap_bg = tilemap_create(machine, get_tile_info_bg,tilemap_scan_rows,16,16,32,32); drtomy_state *state = (drtomy_state *)machine->driver_data;
tilemap_fg = tilemap_create(machine, get_tile_info_fg,tilemap_scan_rows,16,16,32,32);
tilemap_set_transparent_pen(tilemap_fg,0); state->tilemap_bg = tilemap_create(machine, get_tile_info_bg, tilemap_scan_rows, 16, 16, 32, 32);
state->tilemap_fg = tilemap_create(machine, get_tile_info_fg, tilemap_scan_rows, 16, 16, 32, 32);
tilemap_set_transparent_pen(state->tilemap_fg, 0);
} }
static VIDEO_UPDATE( drtomy ) static VIDEO_UPDATE( drtomy )
{ {
tilemap_draw(bitmap,cliprect,tilemap_bg,0,0); drtomy_state *state = (drtomy_state *)screen->machine->driver_data;
tilemap_draw(bitmap,cliprect,tilemap_fg,0,0);
draw_sprites(screen->machine,bitmap,cliprect); tilemap_draw(bitmap, cliprect, state->tilemap_bg, 0, 0);
tilemap_draw(bitmap, cliprect, state->tilemap_fg, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }
static WRITE16_HANDLER( drtomy_vram_fg_w ) static WRITE16_HANDLER( drtomy_vram_fg_w )
{ {
COMBINE_DATA(&drtomy_videoram_fg[offset]); drtomy_state *state = (drtomy_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(tilemap_fg,offset); COMBINE_DATA(&state->videoram_fg[offset]);
tilemap_mark_tile_dirty(state->tilemap_fg, offset);
} }
static WRITE16_HANDLER( drtomy_vram_bg_w ) static WRITE16_HANDLER( drtomy_vram_bg_w )
{ {
COMBINE_DATA(&drtomy_videoram_bg[offset]); drtomy_state *state = (drtomy_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(tilemap_bg,offset); COMBINE_DATA(&state->videoram_bg[offset]);
tilemap_mark_tile_dirty(state->tilemap_bg, offset);
} }
static WRITE16_DEVICE_HANDLER( drtomy_okibank_w ) static WRITE16_DEVICE_HANDLER( drtomy_okibank_w )
{ {
static int oki_bank; drtomy_state *state = (drtomy_state *)device->machine->driver_data;
if (state->oki_bank != (data & 3))
if(oki_bank != (data & 3))
{ {
oki_bank = data & 3; state->oki_bank = data & 3;
okim6295_set_bank_base(device, oki_bank * 0x40000); okim6295_set_bank_base(device, state->oki_bank * 0x40000);
} }
/* unknown bit 2 -> (data & 4) */ /* unknown bit 2 -> (data & 4) */
@ -132,10 +157,10 @@ static WRITE16_DEVICE_HANDLER( drtomy_okibank_w )
static ADDRESS_MAP_START( drtomy_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( drtomy_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM /* ROM */ AM_RANGE(0x000000, 0x03ffff) AM_ROM /* ROM */
AM_RANGE(0x100000, 0x100fff) AM_RAM_WRITE(drtomy_vram_fg_w) AM_BASE(&drtomy_videoram_fg) /* Video RAM FG */ AM_RANGE(0x100000, 0x100fff) AM_RAM_WRITE(drtomy_vram_fg_w) AM_BASE_MEMBER(drtomy_state, videoram_fg) /* Video RAM FG */
AM_RANGE(0x101000, 0x101fff) AM_RAM_WRITE(drtomy_vram_bg_w) AM_BASE(&drtomy_videoram_bg) /* Video RAM BG */ AM_RANGE(0x101000, 0x101fff) AM_RAM_WRITE(drtomy_vram_bg_w) AM_BASE_MEMBER(drtomy_state, videoram_bg) /* Video RAM BG */
AM_RANGE(0x200000, 0x2007ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE(&paletteram16) /* Palette */ AM_RANGE(0x200000, 0x2007ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE(&paletteram16) /* Palette */
AM_RANGE(0x440000, 0x440fff) AM_RAM AM_BASE(&drtomy_spriteram) /* Sprite RAM */ AM_RANGE(0x440000, 0x440fff) AM_RAM AM_BASE_MEMBER(drtomy_state, spriteram) /* Sprite RAM */
AM_RANGE(0x700000, 0x700001) AM_READ_PORT("DSW1") AM_RANGE(0x700000, 0x700001) AM_READ_PORT("DSW1")
AM_RANGE(0x700002, 0x700003) AM_READ_PORT("DSW2") AM_RANGE(0x700002, 0x700003) AM_READ_PORT("DSW2")
AM_RANGE(0x700004, 0x700005) AM_READ_PORT("P1") AM_RANGE(0x700004, 0x700005) AM_READ_PORT("P1")
@ -247,13 +272,33 @@ static INPUT_PORTS_START( drtomy )
INPUT_PORTS_END INPUT_PORTS_END
static MACHINE_START( drtomy )
{
drtomy_state *state = (drtomy_state *)machine->driver_data;
state_save_register_global(machine, state->oki_bank);
}
static MACHINE_RESET( drtomy )
{
drtomy_state *state = (drtomy_state *)machine->driver_data;
state->oki_bank = 0;
}
static MACHINE_DRIVER_START( drtomy ) static MACHINE_DRIVER_START( drtomy )
/* driver data */
MDRV_DRIVER_DATA(drtomy_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,24000000/2) /* ? MHz */ MDRV_CPU_ADD("maincpu", M68000,24000000/2) /* ? MHz */
MDRV_CPU_PROGRAM_MAP(drtomy_map) MDRV_CPU_PROGRAM_MAP(drtomy_map)
MDRV_CPU_VBLANK_INT("screen", irq6_line_hold) MDRV_CPU_VBLANK_INT("screen", irq6_line_hold)
MDRV_MACHINE_START(drtomy)
MDRV_MACHINE_RESET(drtomy)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -303,4 +348,4 @@ ROM_START( drtomy )
ROM_END ROM_END
GAME( 1993, drtomy, 0, drtomy, drtomy, 0, ROT0, "Playmark", "Dr. Tomy", 0 ) GAME( 1993, drtomy, 0, drtomy, drtomy, 0, ROT0, "Playmark", "Dr. Tomy", GAME_SUPPORTS_SAVE )

View File

@ -0,0 +1,44 @@
/*************************************************************************
Deniam games
*************************************************************************/
typedef struct _deniam_state deniam_state;
struct _deniam_state
{
/* memory pointers */
UINT16 * videoram;
UINT16 * textram;
UINT16 * spriteram;
UINT16 * paletteram;
/* video-related */
tilemap *fg_tilemap, *bg_tilemap, *tx_tilemap;
int display_enable;
int bg_scrollx_offs, bg_scrolly_offs;
int fg_scrollx_offs, fg_scrolly_offs;
int bg_scrollx_reg, bg_scrolly_reg, bg_page_reg;
int fg_scrollx_reg, fg_scrolly_reg, fg_page_reg;
int bg_page[4], fg_page[4];
UINT16 coinctrl;
/* devices */
const device_config *audio_cpu; // system 16c does not have sound CPU
};
/*----------- defined in video/deniam.c -----------*/
WRITE16_HANDLER( deniam_videoram_w );
WRITE16_HANDLER( deniam_textram_w );
WRITE16_HANDLER( deniam_palette_w );
READ16_HANDLER( deniam_coinctrl_r );
WRITE16_HANDLER( deniam_coinctrl_w );
VIDEO_START( deniam );
VIDEO_UPDATE( deniam );
DRIVER_INIT( logicpro );
DRIVER_INIT( karianx );

View File

@ -22,6 +22,25 @@
#define DRAGRACE_ATTRACT_EN NODE_09 #define DRAGRACE_ATTRACT_EN NODE_09
typedef struct _dragrace_state dragrace_state;
struct _dragrace_state
{
/* memory pointers */
UINT8 * playfield_ram;
UINT8 * position_ram;
/* video-related */
tilemap *bg_tilemap;
/* misc */
unsigned misc_flags;
int gear[2];
/* devices */
const device_config *discrete;
};
/*----------- defined in audio/dragrace.c -----------*/ /*----------- defined in audio/dragrace.c -----------*/
DISCRETE_SOUND_EXTERN( dragrace ); DISCRETE_SOUND_EXTERN( dragrace );
@ -30,7 +49,3 @@ DISCRETE_SOUND_EXTERN( dragrace );
VIDEO_START( dragrace ); VIDEO_START( dragrace );
VIDEO_UPDATE( dragrace ); VIDEO_UPDATE( dragrace );
extern UINT8* dragrace_playfield_ram;
extern UINT8* dragrace_position_ram;

View File

@ -4,9 +4,26 @@
*************************************************************************/ *************************************************************************/
/*----------- defined in drivers/dribling.c -----------*/
extern UINT8 dribling_abca;
typedef struct _dribling_state dribling_state;
struct _dribling_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * colorram;
/* misc */
UINT8 abca;
UINT8 dr, ds, sh;
UINT8 input_mux;
UINT8 di;
/* devices */
const device_config *ppi_0;
const device_config *ppi_1;
};
/*----------- defined in video/dribling.c -----------*/ /*----------- defined in video/dribling.c -----------*/

View File

@ -0,0 +1,33 @@
/*************************************************************************
Dr. Micro
*************************************************************************/
typedef struct _drmicro_state drmicro_state;
struct _drmicro_state
{
/* memory pointers */
UINT8 * videoram;
/* video-related */
tilemap *bg1, *bg2;
int flipscreen;
/* misc */
int nmi_enable;
int pcm_adr;
/* devices */
const device_config *msm;
};
/*----------- defined in video/drmicro.c -----------*/
PALETTE_INIT( drmicro );
VIDEO_START( drmicro );
VIDEO_UPDATE( drmicro );
WRITE8_HANDLER( drmicro_videoram_w );

View File

@ -603,7 +603,7 @@ $(MAMEOBJ)/dynax.a: \
$(DRIVERS)/royalmah.o \ $(DRIVERS)/royalmah.o \
$(MAMEOBJ)/edevices.a: \ $(MAMEOBJ)/edevices.a: \
$(DRIVERS)/diverboy.o $(VIDEO)/diverboy.o \ $(DRIVERS)/diverboy.o \
$(DRIVERS)/fantland.o $(VIDEO)/fantland.o \ $(DRIVERS)/fantland.o $(VIDEO)/fantland.o \
$(DRIVERS)/mwarr.o \ $(DRIVERS)/mwarr.o \
$(DRIVERS)/mugsmash.o $(VIDEO)/mugsmash.o \ $(DRIVERS)/mugsmash.o $(VIDEO)/mugsmash.o \

View File

@ -1,44 +1,51 @@
#include "driver.h" #include "driver.h"
#include "deniam.h"
UINT16 *deniam_videoram,*deniam_textram; static void deniam_common_init( running_machine *machine )
static int display_enable; {
static int bg_scrollx_offs,bg_scrolly_offs,fg_scrollx_offs,fg_scrolly_offs; deniam_state *state = (deniam_state *)machine->driver_data;
static int bg_scrollx_reg,bg_scrolly_reg,bg_page_reg; int i;
static int fg_scrollx_reg,fg_scrolly_reg,fg_page_reg;
static int bg_page[4],fg_page[4];
static tilemap *bg_tilemap,*fg_tilemap,*tx_tilemap; state->bg_scrollx_reg = 0x00a4/2;
state->bg_scrolly_reg = 0x00a8/2;
state->bg_page_reg = 0x00ac/2;
state->fg_scrollx_reg = 0x00a2/2;
state->fg_scrolly_reg = 0x00a6/2;
state->fg_page_reg = 0x00aa/2;
state->display_enable = 0;
state->coinctrl = 0;
for (i = 0; i < 4; i++)
{
state->bg_page[i] = 0;
state->fg_page[i] = 0;
}
}
DRIVER_INIT( logicpro ) DRIVER_INIT( logicpro )
{ {
bg_scrollx_reg = 0x00a4/2; deniam_state *state = (deniam_state *)machine->driver_data;
bg_scrolly_reg = 0x00a8/2;
bg_page_reg = 0x00ac/2;
fg_scrollx_reg = 0x00a2/2;
fg_scrolly_reg = 0x00a6/2;
fg_page_reg = 0x00aa/2;
bg_scrollx_offs = 0x00d; deniam_common_init(machine);
bg_scrolly_offs = 0x000;
fg_scrollx_offs = 0x009; state->bg_scrollx_offs = 0x00d;
fg_scrolly_offs = 0x000; state->bg_scrolly_offs = 0x000;
state->fg_scrollx_offs = 0x009;
state->fg_scrolly_offs = 0x000;
} }
DRIVER_INIT( karianx ) DRIVER_INIT( karianx )
{ {
bg_scrollx_reg = 0x00a4/2; deniam_state *state = (deniam_state *)machine->driver_data;
bg_scrolly_reg = 0x00a8/2;
bg_page_reg = 0x00ac/2;
fg_scrollx_reg = 0x00a2/2;
fg_scrolly_reg = 0x00a6/2;
fg_page_reg = 0x00aa/2;
bg_scrollx_offs = 0x10d; deniam_common_init(machine);
bg_scrolly_offs = 0x080;
fg_scrollx_offs = 0x109; state->bg_scrollx_offs = 0x10d;
fg_scrolly_offs = 0x080; state->bg_scrolly_offs = 0x080;
state->fg_scrollx_offs = 0x109;
state->fg_scrolly_offs = 0x080;
} }
@ -57,8 +64,9 @@ static TILEMAP_MAPPER( scan_pages )
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
deniam_state *state = (deniam_state *)machine->driver_data;
int page = tile_index >> 11; int page = tile_index >> 11;
UINT16 attr = deniam_videoram[bg_page[page] * 0x0800 + (tile_index & 0x7ff)]; UINT16 attr = state->videoram[state->bg_page[page] * 0x0800 + (tile_index & 0x7ff)];
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
attr, attr,
@ -68,8 +76,9 @@ static TILE_GET_INFO( get_bg_tile_info )
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
{ {
deniam_state *state = (deniam_state *)machine->driver_data;
int page = tile_index >> 11; int page = tile_index >> 11;
UINT16 attr = deniam_videoram[fg_page[page] * 0x0800 + (tile_index & 0x7ff)]; UINT16 attr = state->videoram[state->fg_page[page] * 0x0800 + (tile_index & 0x7ff)];
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
attr, attr,
@ -79,7 +88,8 @@ static TILE_GET_INFO( get_fg_tile_info )
static TILE_GET_INFO( get_tx_tile_info ) static TILE_GET_INFO( get_tx_tile_info )
{ {
UINT16 attr = deniam_textram[tile_index]; deniam_state *state = (deniam_state *)machine->driver_data;
UINT16 attr = state->textram[tile_index];
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
attr & 0xf1ff, attr & 0xf1ff,
@ -97,12 +107,13 @@ static TILE_GET_INFO( get_tx_tile_info )
VIDEO_START( deniam ) VIDEO_START( deniam )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info,scan_pages, 8,8,128,64); deniam_state *state = (deniam_state *)machine->driver_data;
fg_tilemap = tilemap_create(machine, get_fg_tile_info,scan_pages, 8,8,128,64); state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, scan_pages, 8, 8, 128, 64);
tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows,8,8, 64,32); state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, scan_pages, 8, 8, 128, 64);
state->tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
tilemap_set_transparent_pen(fg_tilemap,0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_set_transparent_pen(tx_tilemap,0); tilemap_set_transparent_pen(state->tx_tilemap, 0);
} }
@ -115,56 +126,58 @@ VIDEO_START( deniam )
WRITE16_HANDLER( deniam_videoram_w ) WRITE16_HANDLER( deniam_videoram_w )
{ {
int page,i; deniam_state *state = (deniam_state *)space->machine->driver_data;
COMBINE_DATA(&deniam_videoram[offset]); int page, i;
COMBINE_DATA(&state->videoram[offset]);
page = offset >> 11; page = offset >> 11;
for (i = 0;i < 4;i++) for (i = 0; i < 4; i++)
{ {
if (bg_page[i] == page) if (state->bg_page[i] == page)
tilemap_mark_tile_dirty(bg_tilemap,i * 0x800 + (offset & 0x7ff)); tilemap_mark_tile_dirty(state->bg_tilemap, i * 0x800 + (offset & 0x7ff));
if (fg_page[i] == page) if (state->fg_page[i] == page)
tilemap_mark_tile_dirty(fg_tilemap,i * 0x800 + (offset & 0x7ff)); tilemap_mark_tile_dirty(state->fg_tilemap, i * 0x800 + (offset & 0x7ff));
} }
} }
WRITE16_HANDLER( deniam_textram_w ) WRITE16_HANDLER( deniam_textram_w )
{ {
COMBINE_DATA(&deniam_textram[offset]); deniam_state *state = (deniam_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(tx_tilemap,offset); COMBINE_DATA(&state->textram[offset]);
tilemap_mark_tile_dirty(state->tx_tilemap, offset);
} }
WRITE16_HANDLER( deniam_palette_w ) WRITE16_HANDLER( deniam_palette_w )
{ {
int r,g,b; deniam_state *state = (deniam_state *)space->machine->driver_data;
int r, g, b;
data = COMBINE_DATA(&paletteram16[offset]); data = COMBINE_DATA(&state->paletteram[offset]);
r = ((data << 1) & 0x1e) | ((data >> 12) & 0x01); r = ((data << 1) & 0x1e) | ((data >> 12) & 0x01);
g = ((data >> 3) & 0x1e) | ((data >> 13) & 0x01); g = ((data >> 3) & 0x1e) | ((data >> 13) & 0x01);
b = ((data >> 7) & 0x1e) | ((data >> 14) & 0x01); b = ((data >> 7) & 0x1e) | ((data >> 14) & 0x01);
palette_set_color_rgb(space->machine,offset,pal5bit(r),pal5bit(g),pal5bit(b)); palette_set_color_rgb(space->machine, offset, pal5bit(r), pal5bit(g), pal5bit(b));
} }
static UINT16 coinctrl;
READ16_HANDLER( deniam_coinctrl_r ) READ16_HANDLER( deniam_coinctrl_r )
{ {
return coinctrl; deniam_state *state = (deniam_state *)space->machine->driver_data;
return state->coinctrl;
} }
WRITE16_HANDLER( deniam_coinctrl_w ) WRITE16_HANDLER( deniam_coinctrl_w )
{ {
COMBINE_DATA(&coinctrl); deniam_state *state = (deniam_state *)space->machine->driver_data;
COMBINE_DATA(&state->coinctrl);
/* bit 0 is coin counter */ /* bit 0 is coin counter */
coin_counter_w(0,coinctrl & 0x01); coin_counter_w(0, state->coinctrl & 0x01);
/* bit 6 is display enable (0 freezes screen) */ /* bit 6 is display enable (0 freezes screen) */
display_enable = coinctrl & 0x20; state->display_enable = state->coinctrl & 0x20;
/* other bits unknown (unused?) */ /* other bits unknown (unused?) */
} }
@ -201,46 +214,47 @@ WRITE16_HANDLER( deniam_coinctrl_w )
* c | ---------------- | zoomy like in System 16? * c | ---------------- | zoomy like in System 16?
* e | ---------------- | * e | ---------------- |
*/ */
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 )
{ {
deniam_state *state = (deniam_state *)machine->driver_data;
int offs; int offs;
UINT8 *gfx = memory_region(machine, "gfx2"); UINT8 *gfx = memory_region(machine, "gfx2");
for (offs = spriteram_size/2-8;offs >= 0;offs -= 8) for (offs = spriteram_size / 2 - 8; offs >= 0; offs -= 8)
{ {
int sx,starty,endy,x,y,start,color,width,flipx,primask; int sx, starty, endy, x, y, start, color, width, flipx, primask;
UINT8 *rom = gfx; UINT8 *rom = gfx;
sx = (spriteram16[offs+1] & 0x01ff) + 16*8 - 1; sx = (state->spriteram[offs + 1] & 0x01ff) + 16 * 8 - 1;
if (sx >= 512) sx -= 512; if (sx >= 512) sx -= 512;
starty = spriteram16[offs+0] & 0xff; starty = state->spriteram[offs + 0] & 0xff;
endy = spriteram16[offs+0] >> 8; endy = state->spriteram[offs + 0] >> 8;
width = spriteram16[offs+2] & 0x007f; width = state->spriteram[offs + 2] & 0x007f;
flipx = spriteram16[offs+2] & 0x0100; flipx = state->spriteram[offs + 2] & 0x0100;
if (flipx) sx++; if (flipx) sx++;
color = 0x40 + (spriteram16[offs+4] & 0x3f); color = 0x40 + (state->spriteram[offs + 4] & 0x3f);
primask = 8; primask = 8;
switch (spriteram16[offs+4] & 0xc0) switch (state->spriteram[offs + 4] & 0xc0)
{ {
case 0x00: primask |= 4|2|1; break; /* below everything */ case 0x00: primask |= 4 | 2 | 1; break; /* below everything */
case 0x40: primask |= 4|2; break; /* below fg and tx */ case 0x40: primask |= 4 | 2; break; /* below fg and tx */
case 0x80: primask |= 4; break; /* below tx */ case 0x80: primask |= 4; break; /* below tx */
case 0xc0: break; /* above everything */ case 0xc0: break; /* above everything */
} }
start = spriteram16[offs+3] + ((spriteram16[offs+4] & 0x1f00) << 8); start = state->spriteram[offs + 3] + ((state->spriteram[offs + 4] & 0x1f00) << 8);
rom += 2*start; rom += 2 * start;
for (y = starty+1;y <= endy;y++) for (y = starty + 1; y <= endy; y++)
{ {
int drawing = 0; int drawing = 0;
int i=0; int i = 0;
rom += 2*width; /* note that the first line is skipped */ rom += 2 * width; /* note that the first line is skipped */
x = 0; x = 0;
while (i < 512) /* safety check */ while (i < 512) /* safety check */
{ {
@ -255,12 +269,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
{ {
if (rom[i] & 0x0f) if (rom[i] & 0x0f)
{ {
if (sx+x >= cliprect->min_x && sx+x <= cliprect->max_x && if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x &&
y >= cliprect->min_y && y <= cliprect->max_y) y >= cliprect->min_y && y <= cliprect->max_y)
{ {
if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0)
*BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]&0x0f); *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] & 0x0f);
*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8;
} }
} }
x++; x++;
@ -275,12 +289,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
{ {
if (rom[i] & 0xf0) if (rom[i] & 0xf0)
{ {
if (sx+x >= cliprect->min_x && sx+x <= cliprect->max_x && if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x &&
y >= cliprect->min_y && y <= cliprect->max_y) y >= cliprect->min_y && y <= cliprect->max_y)
{ {
if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0)
*BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]>>4); *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16+(rom[i] >> 4);
*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8;
} }
} }
x++; x++;
@ -299,12 +313,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
{ {
if (rom[i] & 0xf0) if (rom[i] & 0xf0)
{ {
if (sx+x >= cliprect->min_x && sx+x <= cliprect->max_x && if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x &&
y >= cliprect->min_y && y <= cliprect->max_y) y >= cliprect->min_y && y <= cliprect->max_y)
{ {
if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0)
*BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]>>4); *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] >> 4);
*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8;
} }
} }
x++; x++;
@ -319,12 +333,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
{ {
if (rom[i] & 0x0f) if (rom[i] & 0x0f)
{ {
if (sx+x >= cliprect->min_x && sx+x <= cliprect->max_x && if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x &&
y >= cliprect->min_y && y <= cliprect->max_y) y >= cliprect->min_y && y <= cliprect->max_y)
{ {
if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0)
*BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]&0x0f); *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] & 0x0f);
*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8;
} }
} }
x++; x++;
@ -337,65 +351,68 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
} }
} }
static void set_bg_page(int page,int value) static void set_bg_page( running_machine *machine, int page, int value )
{ {
deniam_state *state = (deniam_state *)machine->driver_data;
int tile_index; int tile_index;
if (bg_page[page] != value) if (state->bg_page[page] != value)
{ {
bg_page[page] = value; state->bg_page[page] = value;
for (tile_index = page * 0x800;tile_index < (page+1)*0x800;tile_index++) for (tile_index = page * 0x800; tile_index < (page + 1) * 0x800; tile_index++)
tilemap_mark_tile_dirty(bg_tilemap,tile_index); tilemap_mark_tile_dirty(state->bg_tilemap, tile_index);
} }
} }
static void set_fg_page(int page,int value) static void set_fg_page( running_machine *machine, int page, int value )
{ {
deniam_state *state = (deniam_state *)machine->driver_data;
int tile_index; int tile_index;
if (fg_page[page] != value) if (state->fg_page[page] != value)
{ {
fg_page[page] = value; state->fg_page[page] = value;
for (tile_index = page * 0x800;tile_index < (page+1)*0x800;tile_index++) for (tile_index = page * 0x800; tile_index < (page + 1) * 0x800; tile_index++)
tilemap_mark_tile_dirty(fg_tilemap,tile_index); tilemap_mark_tile_dirty(state->fg_tilemap, tile_index);
} }
} }
VIDEO_UPDATE( deniam ) VIDEO_UPDATE( deniam )
{ {
int bg_scrollx,bg_scrolly,fg_scrollx,fg_scrolly; deniam_state *state = (deniam_state *)screen->machine->driver_data;
int bg_scrollx, bg_scrolly, fg_scrollx, fg_scrolly;
int page; int page;
if (!state->display_enable)
return 0; /* don't update (freeze display) */
if (!display_enable) return 0; /* don't update (freeze display) */ bg_scrollx = state->textram[state->bg_scrollx_reg] - state->bg_scrollx_offs;
bg_scrolly = (state->textram[state->bg_scrolly_reg] & 0xff) - state->bg_scrolly_offs;
page = state->textram[state->bg_page_reg];
set_bg_page(screen->machine, 3, (page >>12) & 0x0f);
set_bg_page(screen->machine, 2, (page >> 8) & 0x0f);
set_bg_page(screen->machine, 1, (page >> 4) & 0x0f);
set_bg_page(screen->machine, 0, (page >> 0) & 0x0f);
bg_scrollx = deniam_textram[bg_scrollx_reg] - bg_scrollx_offs; fg_scrollx = state->textram[state->fg_scrollx_reg] - state->fg_scrollx_offs;
bg_scrolly = (deniam_textram[bg_scrolly_reg] & 0xff) - bg_scrolly_offs; fg_scrolly = (state->textram[state->fg_scrolly_reg] & 0xff) - state->fg_scrolly_offs;
page = deniam_textram[bg_page_reg]; page = state->textram[state->fg_page_reg];
set_bg_page(3,(page >>12) & 0x0f); set_fg_page(screen->machine, 3, (page >>12) & 0x0f);
set_bg_page(2,(page >> 8) & 0x0f); set_fg_page(screen->machine, 2, (page >> 8) & 0x0f);
set_bg_page(1,(page >> 4) & 0x0f); set_fg_page(screen->machine, 1, (page >> 4) & 0x0f);
set_bg_page(0,(page >> 0) & 0x0f); set_fg_page(screen->machine, 0, (page >> 0) & 0x0f);
fg_scrollx = deniam_textram[fg_scrollx_reg] - fg_scrollx_offs; tilemap_set_scrollx(state->bg_tilemap, 0, bg_scrollx & 0x1ff);
fg_scrolly = (deniam_textram[fg_scrolly_reg] & 0xff) - fg_scrolly_offs; tilemap_set_scrolly(state->bg_tilemap, 0, bg_scrolly & 0x0ff);
page = deniam_textram[fg_page_reg]; tilemap_set_scrollx(state->fg_tilemap, 0, fg_scrollx & 0x1ff);
set_fg_page(3,(page >>12) & 0x0f); tilemap_set_scrolly(state->fg_tilemap, 0, fg_scrolly & 0x0ff);
set_fg_page(2,(page >> 8) & 0x0f);
set_fg_page(1,(page >> 4) & 0x0f);
set_fg_page(0,(page >> 0) & 0x0f);
tilemap_set_scrollx(bg_tilemap,0,bg_scrollx & 0x1ff); bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
tilemap_set_scrolly(bg_tilemap,0,bg_scrolly & 0x0ff);
tilemap_set_scrollx(fg_tilemap,0,fg_scrollx & 0x1ff);
tilemap_set_scrolly(fg_tilemap,0,fg_scrolly & 0x0ff);
bitmap_fill(screen->machine->priority_bitmap,cliprect,0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 1);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 2);
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 4);
tilemap_draw(bitmap,cliprect,bg_tilemap,0,1); draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap,cliprect,fg_tilemap,0,2);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,4);
draw_sprites(screen->machine,bitmap,cliprect);
return 0; return 0;
} }

View File

@ -1,53 +0,0 @@
/* Diver Boy - Video Hardware */
#include "driver.h"
UINT16 *diverboy_spriteram;
size_t diverboy_spriteram_size;
VIDEO_START(diverboy)
{
}
static void draw_sprites(running_machine* machine, bitmap_t *bitmap, const rectangle *cliprect )
{
UINT16 *source = diverboy_spriteram;
UINT16 *finish = source + (diverboy_spriteram_size/2);
while (source < finish)
{
INT16 xpos,ypos,number,colr,bank,flash;
ypos = source[4];
xpos = source[0];
colr = (source[1]& 0x00f0) >> 4;
number = source[3];
flash = source[1] & 0x1000;
colr |= ((source[1] & 0x000c) << 2);
ypos = 0x100 - ypos;
bank = (source[1]&0x0002) >> 1;
if (!flash || (video_screen_get_frame_number(machine->primary_screen) & 1))
{
drawgfx_transpen(bitmap,cliprect,machine->gfx[bank],
number,
colr,
0,0,
xpos,ypos,
(source[1] & 0x0008) ? -1 : 0);
}
source+=8;
}
}
VIDEO_UPDATE(diverboy)
{
// bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine));
draw_sprites(screen->machine,bitmap,cliprect);
return 0;
}

View File

@ -7,25 +7,18 @@ Atari Drag Race video emulation
#include "driver.h" #include "driver.h"
#include "includes/dragrace.h" #include "includes/dragrace.h"
UINT8* dragrace_playfield_ram;
UINT8* dragrace_position_ram;
static tilemap* bg_tilemap;
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
UINT8 code = dragrace_playfield_ram[tile_index]; dragrace_state *state = (dragrace_state *)machine->driver_data;
UINT8 code = state->playfield_ram[tile_index];
int num = 0; int num = 0;
int col = 0; int col = 0;
num = code & 0x1f; num = code & 0x1f;
if ((code & 0xc0) == 0x40) if ((code & 0xc0) == 0x40)
{
num |= 0x20; num |= 0x20;
}
switch (code & 0xA0) switch (code & 0xA0)
{ {
@ -49,33 +42,34 @@ static TILE_GET_INFO( get_tile_info )
VIDEO_START( dragrace ) VIDEO_START( dragrace )
{ {
bg_tilemap = tilemap_create(machine, dragrace_state *state = (dragrace_state *)machine->driver_data;
get_tile_info, tilemap_scan_rows, 16, 16, 16, 16); state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 16, 16, 16, 16);
} }
VIDEO_UPDATE( dragrace ) VIDEO_UPDATE( dragrace )
{ {
dragrace_state *state = (dragrace_state *)screen->machine->driver_data;
int y; int y;
tilemap_mark_all_tiles_dirty(bg_tilemap); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
for (y = 0; y < 256; y += 4) for (y = 0; y < 256; y += 4)
{ {
rectangle rect = *cliprect; rectangle rect = *cliprect;
int xl = dragrace_position_ram[y + 0] & 15; int xl = state->position_ram[y + 0] & 15;
int xh = dragrace_position_ram[y + 1] & 15; int xh = state->position_ram[y + 1] & 15;
int yl = dragrace_position_ram[y + 2] & 15; int yl = state->position_ram[y + 2] & 15;
int yh = dragrace_position_ram[y + 3] & 15; int yh = state->position_ram[y + 3] & 15;
tilemap_set_scrollx(bg_tilemap, 0, 16 * xh + xl - 8); tilemap_set_scrollx(state->bg_tilemap, 0, 16 * xh + xl - 8);
tilemap_set_scrolly(bg_tilemap, 0, 16 * yh + yl); tilemap_set_scrolly(state->bg_tilemap, 0, 16 * yh + yl);
if (rect.min_y < y + 0) rect.min_y = y + 0; if (rect.min_y < y + 0) rect.min_y = y + 0;
if (rect.max_y > y + 3) rect.max_y = y + 3; if (rect.max_y > y + 3) rect.max_y = y + 3;
tilemap_draw(bitmap, &rect, bg_tilemap, 0, 0); tilemap_draw(bitmap, &rect, state->bg_tilemap, 0, 0);
} }
return 0; return 0;
} }

View File

@ -30,7 +30,7 @@ PALETTE_INIT( dribling )
g *= 0x55; g *= 0x55;
b *= 0xff; b *= 0xff;
palette_set_color(machine,i,MAKE_RGB(r,g,b)); palette_set_color(machine, i, MAKE_RGB(r,g,b));
} }
} }
@ -44,8 +44,10 @@ PALETTE_INIT( dribling )
WRITE8_HANDLER( dribling_colorram_w ) WRITE8_HANDLER( dribling_colorram_w )
{ {
dribling_state *state = (dribling_state *)space->machine->driver_data;
/* it is very important that we mask off the two bits here */ /* it is very important that we mask off the two bits here */
colorram[offset & 0x1f9f] = data; state->colorram[offset & 0x1f9f] = data;
} }
@ -58,6 +60,7 @@ WRITE8_HANDLER( dribling_colorram_w )
VIDEO_UPDATE( dribling ) VIDEO_UPDATE( dribling )
{ {
dribling_state *state = (dribling_state *)screen->machine->driver_data;
UINT8 *prombase = memory_region(screen->machine, "proms"); UINT8 *prombase = memory_region(screen->machine, "proms");
UINT8 *gfxbase = memory_region(screen->machine, "gfx1"); UINT8 *gfxbase = memory_region(screen->machine, "gfx1");
int x, y; int x, y;
@ -71,11 +74,11 @@ VIDEO_UPDATE( dribling )
for (x = cliprect->min_x; x <= cliprect->max_x; x++) for (x = cliprect->min_x; x <= cliprect->max_x; x++)
{ {
int b7 = prombase[(x >> 3) | ((y >> 3) << 5)] & 1; int b7 = prombase[(x >> 3) | ((y >> 3) << 5)] & 1;
int b6 = dribling_abca; int b6 = state->abca;
int b5 = (x >> 3) & 1; int b5 = (x >> 3) & 1;
int b4 = (gfxbase[(x >> 3) | (y << 5)] >> (x & 7)) & 1; int b4 = (gfxbase[(x >> 3) | (y << 5)] >> (x & 7)) & 1;
int b3 = (videoram[(x >> 3) | (y << 5)] >> (x & 7)) & 1; int b3 = (state->videoram[(x >> 3) | (y << 5)] >> (x & 7)) & 1;
int b2_0 = colorram[(x >> 3) | ((y >> 2) << 7)] & 7; int b2_0 = state->colorram[(x >> 3) | ((y >> 2) << 7)] & 7;
/* assemble the various bits into a palette PROM index */ /* assemble the various bits into a palette PROM index */
dst[x] = (b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) | (b3 << 3) | b2_0; dst[x] = (b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) | (b3 << 3) | b2_0;

View File

@ -8,29 +8,20 @@ Video hardware
*******************************************************************************/ *******************************************************************************/
#include "driver.h" #include "driver.h"
#include "drmicro.h"
static int flipscreen;
static UINT8 *drmicro_videoram;
static tilemap *drmicro_bg1;
static tilemap *drmicro_bg2;
/****************************************************************************/ /****************************************************************************/
void drmicro_flip_w( running_machine *machine, int flip )
{
flipscreen = flip ? 1 : 0;
flip_screen_set(machine, flip);
}
WRITE8_HANDLER( drmicro_videoram_w ) WRITE8_HANDLER( drmicro_videoram_w )
{ {
drmicro_videoram[offset] = data; drmicro_state *state = (drmicro_state *)space->machine->driver_data;
state->videoram[offset] = data;
if (offset<0x800) if (offset < 0x800)
tilemap_mark_tile_dirty(drmicro_bg2,(offset & 0x3ff)); tilemap_mark_tile_dirty(state->bg2, (offset & 0x3ff));
else else
tilemap_mark_tile_dirty(drmicro_bg1,(offset & 0x3ff)); tilemap_mark_tile_dirty(state->bg1, (offset & 0x3ff));
} }
@ -38,10 +29,11 @@ WRITE8_HANDLER( drmicro_videoram_w )
static TILE_GET_INFO( get_bg1_tile_info ) static TILE_GET_INFO( get_bg1_tile_info )
{ {
int code,col,flags; drmicro_state *state = (drmicro_state *)machine->driver_data;
int code, col, flags;
code = drmicro_videoram[tile_index + 0x0800]; code = state->videoram[tile_index + 0x0800];
col = drmicro_videoram[tile_index + 0x0c00]; col = state->videoram[tile_index + 0x0c00];
code += (col & 0xc0) << 2; code += (col & 0xc0) << 2;
flags = ((col & 0x20) ? TILEMAP_FLIPY : 0) | ((col & 0x10) ? TILEMAP_FLIPX : 0); flags = ((col & 0x20) ? TILEMAP_FLIPY : 0) | ((col & 0x10) ? TILEMAP_FLIPX : 0);
@ -52,10 +44,11 @@ static TILE_GET_INFO( get_bg1_tile_info )
static TILE_GET_INFO( get_bg2_tile_info ) static TILE_GET_INFO( get_bg2_tile_info )
{ {
int code,col,flags; drmicro_state *state = (drmicro_state *)machine->driver_data;
int code, col, flags;
code = drmicro_videoram[tile_index + 0x0000]; code = state->videoram[tile_index + 0x0000];
col = drmicro_videoram[tile_index + 0x0400]; col = state->videoram[tile_index + 0x0400];
code += (col & 0xc0) << 2; code += (col & 0xc0) << 2;
flags = ((col & 0x20) ? TILEMAP_FLIPY : 0) | ((col & 0x10) ? TILEMAP_FLIPX : 0); flags = ((col & 0x20) ? TILEMAP_FLIPY : 0) | ((col & 0x10) ? TILEMAP_FLIPX : 0);
@ -112,47 +105,50 @@ PALETTE_INIT( drmicro )
VIDEO_START( drmicro) VIDEO_START( drmicro)
{ {
drmicro_videoram = auto_alloc_array(machine, UINT8, 0x1000); drmicro_state *state = (drmicro_state *)machine->driver_data;
drmicro_bg1 = tilemap_create(machine, get_bg1_tile_info, tilemap_scan_rows, 8,8,32,32); state->videoram = auto_alloc_array(machine, UINT8, 0x1000);
drmicro_bg2 = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 8,8,32,32); state_save_register_global_pointer(machine, state->videoram, 0x1000);
tilemap_set_transparent_pen(drmicro_bg2,0); state->bg1 = tilemap_create(machine, get_bg1_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
state->bg2 = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->bg2, 0);
} }
VIDEO_UPDATE( drmicro ) VIDEO_UPDATE( drmicro )
{ {
int offs,adr,g; drmicro_state *state = (drmicro_state *)screen->machine->driver_data;
int chr,col,attr; int offs, adr, g;
int x,y,fx,fy; int chr, col, attr;
int x, y, fx, fy;
tilemap_draw(bitmap, cliprect, drmicro_bg1, 0, 0); tilemap_draw(bitmap, cliprect, state->bg1, 0, 0);
tilemap_draw(bitmap, cliprect, drmicro_bg2, 0, 0); tilemap_draw(bitmap, cliprect, state->bg2, 0, 0);
/* draw sprites */ /* draw sprites */
for (g = 0; g < 2; g++)
for (g=0;g<2;g++)
{ {
adr = 0x800*g; adr = 0x800 * g;
for (offs=0x00; offs<0x20; offs +=4) for (offs = 0x00; offs < 0x20; offs += 4)
{ {
x = drmicro_videoram[offs + adr + 3]; x = state->videoram[offs + adr + 3];
y = drmicro_videoram[offs + adr + 0]; y = state->videoram[offs + adr + 0];
attr = drmicro_videoram[offs + adr + 2]; attr = state->videoram[offs + adr + 2];
chr = drmicro_videoram[offs + adr + 1]; chr = state->videoram[offs + adr + 1];
fx = (chr & 0x01) ^ flipscreen; fx = (chr & 0x01) ^ state->flipscreen;
fy = ((chr & 0x02) >> 1) ^ flipscreen; fy = ((chr & 0x02) >> 1) ^ state->flipscreen;
chr = (chr >> 2) | (attr & 0xc0); chr = (chr >> 2) | (attr & 0xc0);
col = (attr & 0x0f) + 0x00; col = (attr & 0x0f) + 0x00;
if (!flipscreen) if (!state->flipscreen)
y = (240-y) & 0xff; y = (240 - y) & 0xff;
else else
x = (240-x) & 0xff; x = (240 - x) & 0xff;
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[3-g], drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[3-g],
chr, chr,
@ -160,7 +156,7 @@ VIDEO_UPDATE( drmicro )
fx,fy, fx,fy,
x,y,0); x,y,0);
if (x>240) if (x > 240)
{ {
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[3-g], drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[3-g],
chr, chr,
@ -172,4 +168,3 @@ VIDEO_UPDATE( drmicro )
} }
return 0; return 0;
} }