From c2d537c3ddac1a4d1c15af0011e97ada9cf62e87 Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Wed, 25 Nov 2009 01:13:14 +0000 Subject: [PATCH] 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 --- .gitattributes | 3 +- src/mame/drivers/ddayjlc.c | 223 +++++++++++++++------- src/mame/drivers/ddealer.c | 361 +++++++++++++++++++---------------- src/mame/drivers/deniam.c | 95 +++++---- src/mame/drivers/discoboy.c | 284 ++++++++++++++------------- src/mame/drivers/diverboy.c | 70 ++++++- src/mame/drivers/dorachan.c | 62 ++++-- src/mame/drivers/dragrace.c | 129 +++++++------ src/mame/drivers/dreamwld.c | 233 ++++++++++++---------- src/mame/drivers/dribling.c | 112 +++++++---- src/mame/drivers/drmicro.c | 113 ++++++++--- src/mame/drivers/drtomy.c | 129 +++++++++---- src/mame/includes/deniam.h | 44 +++++ src/mame/includes/dragrace.h | 49 +++-- src/mame/includes/dribling.h | 21 +- src/mame/includes/drmicro.h | 33 ++++ src/mame/mame.mak | 2 +- src/mame/video/deniam.c | 267 ++++++++++++++------------ src/mame/video/diverboy.c | 53 ----- src/mame/video/dragrace.c | 32 ++-- src/mame/video/dribling.c | 13 +- src/mame/video/drmicro.c | 87 ++++----- 22 files changed, 1454 insertions(+), 961 deletions(-) create mode 100644 src/mame/includes/deniam.h create mode 100644 src/mame/includes/drmicro.h delete mode 100644 src/mame/video/diverboy.c diff --git a/.gitattributes b/.gitattributes index 5ff5ab380f0..fe9715d60be 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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/decocrpt.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/docastle.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/drgnmst.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/eolithsp.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/dietgo.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/djmain.c svneol=native#text/plain src/mame/video/dkong.c svneol=native#text/plain diff --git a/src/mame/drivers/ddayjlc.c b/src/mame/drivers/ddayjlc.c index 10fa4d43952..afd11687e8a 100644 --- a/src/mame/drivers/ddayjlc.c +++ b/src/mame/drivers/ddayjlc.c @@ -55,19 +55,29 @@ $842f = lives #include "cpu/z80/z80.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; -static INT32 main_nmi_enable = 0; +typedef struct _ddayjlc_state ddayjlc_state; +struct _ddayjlc_state +{ + /* memory pointers */ + UINT8 * bgram; + UINT8 * mainram; + UINT8 * videoram; + UINT8 * spriteram; -static INT32 e00x_l[4]; -static INT32 e00x_d[4][2]; + /* video-related */ + 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, 0x00, 0x02, 0x00, @@ -114,81 +124,98 @@ static const UINT8 protData[0x10] = 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 ) { - protAdr = (protAdr & (~(1<machine->driver_data; + state->prot_addr = (state->prot_addr & (~(1 << offset))) | ((data & 1) << offset); } 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 ) { - if(!offset) - tilemap_set_scrollx(bg_tilemap, 0, data + 8); + ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data; - bgram[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset & 0x3ff); + if (!offset) + 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 ) { - videoram[offset] = data; + ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data; + state->videoram[offset] = data; } 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) { - main_nmi_enable = data; + ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data; + state->main_nmi_enable = data; } 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 ) { - 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); - if(bgadr > 2) - bgadr = 0; - memory_set_bankptr(space->machine, 1, memory_region(space->machine, "user1") + bgadr * 0x4000 ); + ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data; + + state->bgadr = (state->bgadr & 0xfb) | ((data & 1) << 2); + if (state->bgadr > 2) + state->bgadr = 0; + + memory_set_bank(space->machine, 1, state->bgadr); } 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); } static WRITE8_HANDLER( i8257_CH0_w ) { - e00x_d[offset][e00x_l[offset]] = data; - e00x_l[offset] ^= 1; + ddayjlc_state *state = (ddayjlc_state *)space->machine->driver_data; + + state->e00x_d[offset][state->e00x_l[offset]] = data; + state->e00x_l[offset] ^= 1; } 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 dst = e00x_d[2][1] * 256 + e00x_d[2][0]; - INT32 size = (e00x_d[1][1] * 256 + e00x_d[1][0]) & 0x3ff; + INT32 src = state->e00x_d[0][1] * 256 + state->e00x_d[0][0]; + INT32 dst = state->e00x_d[2][1] * 256 + state->e00x_d[2][0]; + INT32 size = (state->e00x_d[1][1] * 256 + state->e00x_d[1][0]) & 0x3ff; INT32 i; size++; //?? @@ -198,19 +225,19 @@ static WRITE8_HANDLER( i8257_LMSR_w ) memory_write_byte(space, dst++, memory_read_byte(space, src++)); } - e00x_l[0] = 0; - e00x_l[1] = 0; - e00x_l[2] = 0; - e00x_l[3] = 0; + state->e00x_l[0] = 0; + state->e00x_l[1] = 0; + state->e00x_l[2] = 0; + state->e00x_l[3] = 0; } } static ADDRESS_MAP_START( main_cpu, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0x8fff) AM_RAM AM_BASE(&mainram) - AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE(&spriteram) - AM_RANGE(0x9400, 0x97ff) AM_RAM_WRITE(ddayjlc_videoram_w) AM_BASE(&videoram) - AM_RANGE(0x9800, 0x9fff) AM_RAM_WRITE(ddayjlc_bgram_w) AM_BASE(&bgram) /* 9800-981f - videoregs */ + AM_RANGE(0x8000, 0x8fff) AM_RAM AM_BASE_MEMBER(ddayjlc_state, mainram) + AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE_MEMBER(ddayjlc_state, spriteram) + 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_MEMBER(ddayjlc_state, bgram) /* 9800-981f - videoregs */ AM_RANGE(0xa000, 0xdfff) AM_ROMBANK(1) AM_WRITENOP AM_RANGE(0xe000, 0xe003) AM_WRITE(i8257_CH0_w) AM_RANGE(0xe008, 0xe008) AM_WRITENOP @@ -234,13 +261,11 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( sound_cpu, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM 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(0x4000, 0x4000) AM_DEVWRITE("ay1", ay8910_address_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(0x7000, 0x7000) AM_WRITE(sound_nmi_w) ADDRESS_MAP_END static INPUT_PORTS_START( ddayjlc ) @@ -334,45 +359,48 @@ GFXDECODE_END 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); } 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 ) { + ddayjlc_state *state = (ddayjlc_state *)screen->machine->driver_data; 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) { - INT32 flags = spriteram[i + 2]; - INT32 y = 256-spriteram[i + 0]-8; - INT32 code = spriteram[i + 1]; - INT32 x = spriteram[i + 3]-16; - INT32 xflip = flags&0x80; - INT32 yflip = (code&0x80); + INT32 flags = state->spriteram[i + 2]; + INT32 y = 256 - state->spriteram[i + 0] - 8; + INT32 code = state->spriteram[i + 1]; + INT32 x = state->spriteram[i + 3] - 16; + INT32 xflip = flags & 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); } { - UINT32 x,y,c; - for(y=0;y<32;y++) - for(x=0;x<32;x++) + UINT32 x, y, c; + for (y = 0; y < 32; y++) + for (x = 0; x < 32; x++) { - c=videoram[y*32+x]; - 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); + c = state->videoram[y * 32 + x]; + if (x > 1 && x < 30) + drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1], c + state->char_bank * 0x100, 1, 0, 0, x*8, y*8, 0); 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; @@ -390,17 +418,61 @@ static const ay8910_interface ay8910_config = 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); } 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); } + +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 ) + + /* driver data */ + MDRV_DRIVER_DATA(ddayjlc_state) + + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80,12000000/3) MDRV_CPU_PROGRAM_MAP(main_cpu) MDRV_CPU_VBLANK_INT("screen", ddayjlc_interrupt) @@ -411,6 +483,9 @@ static MACHINE_DRIVER_START( ddayjlc ) MDRV_QUANTUM_TIME(HZ(6000)) + MDRV_MACHINE_START(ddayjlc) + MDRV_MACHINE_RESET(ddayjlc) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) @@ -561,21 +636,21 @@ static DRIVER_INIT( ddayjlc ) dst = memory_region(machine, "gfx1"); length = memory_region_length(machine, "gfx1"); memcpy(src, dst, length); - newadr=0; - oldaddr=0; - for (j = 0; j < length/2; j+=32) + newadr = 0; + oldaddr = 0; + for (j = 0; j < length / 2; j += 32) { repack(0); repack(0x4000) - newadr+=32; - oldaddr+=16; + newadr += 32; + oldaddr += 16; } 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, ddayjlca, ddayjlc, ddayjlc, ddayjlc, ddayjlc, ROT90, "Jaleco", "D-Day (Jaleco set 2)", 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_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/ddealer.c b/src/mame/drivers/ddealer.c index 9f58ca8e72f..fb0af0b642f 100644 --- a/src/mame/drivers/ddealer.c +++ b/src/mame/drivers/ddealer.c @@ -113,21 +113,42 @@ Few words about protection: #include "cpu/m68000/m68000.h" #include "sound/2203intf.h" -static UINT16 *mcu_shared_ram,*work_ram; -static UINT16 *back_vram,*left_fg_vram_top, *right_fg_vram_top, *right_fg_vram_bottom, *left_fg_vram_bottom; -static UINT16 *ddealer_vregs; -static tilemap *back_tilemap; -static int respcount; -static int ddealer_flipscreen; +typedef struct _ddealer_state ddealer_state; +struct _ddealer_state +{ + /* memory pointers */ + UINT16 * mcu_shared_ram; + 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 ) { - 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 ) { - int code = back_vram[tile_index]; + ddealer_state *state = (ddealer_state *)machine->driver_data; + int code = state->back_vram[tile_index]; SET_TILE_INFO( 0, code & 0xfff, @@ -137,91 +158,88 @@ static TILE_GET_INFO( get_back_tile_info ) static VIDEO_START( ddealer ) { - ddealer_flipscreen = 0; - back_tilemap = tilemap_create(machine, get_back_tile_info,tilemap_scan_cols,8,8,64,32); + ddealer_state *state = (ddealer_state *)machine->driver_data; + 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) { const gfx_element *gfx = machine->gfx[1]; + INT16 sx, sy; + int x,y, count; + UINT16* src; + + sx = ((vreg_base[0x4 / 2] & 0xff)); + sx |= ((vreg_base[0x2 / 2] & 0xff) << 8); + + sx &= 0x7ff; + if (sx & 0x400) sx -= 0x800; + + sy = ((vreg_base[0x8 / 2] & 0xff)); + sy |= ((vreg_base[0x6 / 2] & 0xff) << 8); + + if (!flipy) { - INT16 sx, sy; - int x,y, count; - UINT16* src; + sx -= 64; // video shift - sx = ((vreg_base[0x4/2] & 0xff)); - sx |= ((vreg_base[0x2/2] & 0xff) << 8); - - sx &=0x7ff; - if (sx & 0x400) sx-=0x800; - - sy = ((vreg_base[0x8/2] & 0xff)); - sy |= ((vreg_base[0x6/2] & 0xff) << 8); - - - if (!flipy) + /* the tilemaps seems to be split into top / bottom pieces */ + count = 0; + src = top; + for (x = 0; x < 128; x++) { - sx -= 64; // video shift - - - /* the tilemaps seems to be split into top / bottom pieces */ - count = 0; - src = top; - for (x=0;x<128;x++) + for (y = 0; y < 16; y++) { - for (y=0;y<16;y++) - { - UINT16 tile = (src[count]&0x0fff); - UINT16 colr = (src[count]&0xf000)>>12; - count++; - drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,0,flipy,(x*16)-sx,(y*16)-sy,15); - } - } - count = 0; - src = bottom; - sy -= 256; - for (x=0;x<128;x++) - { - for (y=0;y<16;y++) - { - UINT16 tile = (src[count]&0x0fff); - UINT16 colr = (src[count]&0xf000)>>12; - count++; - drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,0,flipy,(x*16)-sx,(y*16)-sy,15); - } + UINT16 tile = (src[count] & 0x0fff); + UINT16 colr = (src[count] & 0xf000) >> 12; + count++; + drawgfx_transpen(bitmap, cliprect, gfx, tile, colr, 0, flipy, (x * 16) - sx, (y * 16) - sy, 15); } } - else + count = 0; + src = bottom; + sy -= 256; + for (x = 0; x < 128; x++) { - sx -= 0x6d0; - sy -= 16; - - /* the tilemaps seems to be split into top / bottom pieces */ - count = 0; - src = top; - for (x=128;x>0;x--) + for (y = 0; y < 16; y++) { - for (y=16;y>0;y--) - { - UINT16 tile = (src[count]&0x0fff); - UINT16 colr = (src[count]&0xf000)>>12; - count++; - drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,flipy,flipy,(x*16)+sx,(y*16)+sy,15); - } + UINT16 tile = (src[count] & 0x0fff); + UINT16 colr = (src[count] & 0xf000) >> 12; + count++; + drawgfx_transpen(bitmap, cliprect, gfx, tile, colr, 0, flipy, (x * 16) - sx, (y * 16) - sy, 15); } - count = 0; - src = bottom; - sy -= 256; - for (x=128;x>0;x--) + } + } + else + { + sx -= 0x6d0; + sy -= 16; + + /* the tilemaps seems to be split into top / bottom pieces */ + count = 0; + src = top; + for (x = 128; x > 0; x--) + { + for (y = 16; y > 0; y--) { - for (y=16;y>0;y--) - { - UINT16 tile = (src[count]&0x0fff); - UINT16 colr = (src[count]&0xf000)>>12; - count++; - drawgfx_transpen(bitmap,cliprect,gfx,tile,colr,flipy,flipy,(x*16)+sx,(y*16)+sy,15); - } + UINT16 tile = (src[count] & 0x0fff); + UINT16 colr = (src[count] & 0xf000) >> 12; + count++; + drawgfx_transpen(bitmap, cliprect, gfx, tile, colr, flipy, flipy, (x * 16) + sx, (y * 16) + sy, 15); + } + } + count = 0; + src = bottom; + sy -= 256; + for (x = 128; x > 0; x--) + { + for (y = 16; y > 0; y--) + { + UINT16 tile = (src[count] & 0x0fff); + UINT16 colr = (src[count] & 0xf000) >> 12; + count++; + 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 ) { - tilemap_set_scrollx( back_tilemap, 0, ddealer_flipscreen? -192: -64); - tilemap_set_flip(back_tilemap, ddealer_flipscreen? TILEMAP_FLIPY|TILEMAP_FLIPX:0); - tilemap_draw(bitmap,cliprect,back_tilemap,0,0); + ddealer_state *state = (ddealer_state *)screen->machine->driver_data; + tilemap_set_scrollx(state->back_tilemap, 0, state->flipscreen ? -192 : -64); + 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, 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 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, &ddealer_vregs[0xcc/2], right_fg_vram_top, right_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, &state->vregs[0xcc / 2], state->right_fg_vram_top, state->right_fg_vram_bottom, bitmap, cliprect, state->flipscreen); } 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 { - 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, &ddealer_vregs[0x1e0/2], right_fg_vram_top, right_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, &state->vregs[0x1e0 / 2], state->right_fg_vram_top, state->right_fg_vram_bottom, bitmap, cliprect, state->flipscreen); } 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 ) { + ddealer_state *state = (ddealer_state *)timer->machine->driver_data; + /*coin/credit simulation*/ /*$fe002 is used,might be for multiple coins for one credit settings.*/ - static UINT8 input_pressed; - static UINT16 coin_input; + state->coin_input = (~(input_port_read(timer->machine, "IN0"))); - coin_input = (~(input_port_read(timer->machine, "IN0"))); - - if(coin_input & 0x01)//coin 1 + if (state->coin_input & 0x01)//coin 1 { - if((input_pressed & 0x01) == 0) - mcu_shared_ram[0x000/2]++; - input_pressed = (input_pressed & 0xfe) | 1; + if((state->input_pressed & 0x01) == 0) + state->mcu_shared_ram[0x000 / 2]++; + state->input_pressed = (state->input_pressed & 0xfe) | 1; } 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) - mcu_shared_ram[0x000/2]++; - input_pressed = (input_pressed & 0xfd) | 2; + if ((state->input_pressed & 0x02) == 0) + state->mcu_shared_ram[0x000 / 2]++; + state->input_pressed = (state->input_pressed & 0xfd) | 2; } 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) - mcu_shared_ram[0x000/2]++; - input_pressed = (input_pressed & 0xfb) | 4; + if ((state->input_pressed & 0x04) == 0) + state->mcu_shared_ram[0x000 / 2]++; + state->input_pressed = (state->input_pressed & 0xfb) | 4; } 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. 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))) - mcu_shared_ram[0x000/2]--; - input_pressed = (input_pressed & 0xf7) | 8; + if ((state->input_pressed & 0x08) == 0 && (~(state->work_ram[0x100 / 2] & 1))) + state->mcu_shared_ram[0x000 / 2]--; + state->input_pressed = (state->input_pressed & 0xf7) | 8; } 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))) - mcu_shared_ram[0x000/2]--; - input_pressed = (input_pressed & 0xef) | 0x10; + if((state->input_pressed & 0x10) == 0 && (~(state->work_ram[0x100 / 2] & 2))) + state->mcu_shared_ram[0x000 / 2]--; + state->input_pressed = (state->input_pressed & 0xef) | 0x10; } else - input_pressed = (input_pressed & 0xef); + state->input_pressed = (state->input_pressed & 0xef); } /*random number generators,controls order of cards*/ - mcu_shared_ram[0x10/2] = mame_rand(timer->machine) & 0xffff; - mcu_shared_ram[0x12/2] = mame_rand(timer->machine) & 0xffff; - mcu_shared_ram[0x14/2] = mame_rand(timer->machine) & 0xffff; - mcu_shared_ram[0x16/2] = mame_rand(timer->machine) & 0xffff; + state->mcu_shared_ram[0x10 / 2] = mame_rand(timer->machine) & 0xffff; + state->mcu_shared_ram[0x12 / 2] = mame_rand(timer->machine) & 0xffff; + state->mcu_shared_ram[0x14 / 2] = mame_rand(timer->machine) & 0xffff; + state->mcu_shared_ram[0x16 / 2] = mame_rand(timer->machine) & 0xffff; } static WRITE16_HANDLER( back_vram_w ) { - COMBINE_DATA(&back_vram[offset]); - tilemap_mark_tile_dirty(back_tilemap,offset); + ddealer_state *state = (ddealer_state *)space->machine->driver_data; + COMBINE_DATA(&state->back_vram[offset]); + tilemap_mark_tile_dirty(state->back_tilemap, offset); } 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_) \ - if(mcu_shared_ram[(_offs_)/2] == _protvalue_) \ + if(state->mcu_shared_ram[(_offs_)/2] == _protvalue_) \ { \ - mcu_shared_ram[(_offs_)/2] = 0xffff; /*(MCU job done)*/ \ - mcu_shared_ram[(_offs_+2-0x10)/2] = 0x4ef9;/*JMP*/\ - 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_)/2] = 0xffff; /*(MCU job done)*/ \ + state->mcu_shared_ram[(_offs_+2-0x10)/2] = 0x4ef9;/*JMP*/\ + state->mcu_shared_ram[(_offs_+4-0x10)/2] = 0x0000;/*HI-DWORD*/\ + state->mcu_shared_ram[(_offs_+6-0x10)/2] = _pc_; /*LO-DWORD*/\ } \ #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);\ - mcu_shared_ram[_protinput_+1] = (_input_ & 0x0000ffff);\ + state->mcu_shared_ram[_protinput_] = ((_input_ & 0xffff0000)>>16);\ + state->mcu_shared_ram[_protinput_+1] = (_input_ & 0x0000ffff);\ } 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) { @@ -405,25 +426,26 @@ static WRITE16_HANDLER( ddealer_mcu_shared_w ) 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.*/ 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 - mcu_shared_ram[0x002/2] = 0x0000;//coin counter "decimal point" - mcu_shared_ram[0x004/2] = 0x4ef9; + state->mcu_shared_ram[0x000 / 2] = 0x0000;//coin counter + state->mcu_shared_ram[0x002 / 2] = 0x0000;//coin counter "decimal point" + state->mcu_shared_ram[0x004 / 2] = 0x4ef9; } break; case 0x002/2: case 0x004/2: - if(mcu_shared_ram[0x002/2] == 0x0000 && mcu_shared_ram[0x004/2] == 0x0214) - mcu_shared_ram[0x004/2] = 0x4ef9; + if (state->mcu_shared_ram[0x002 / 2] == 0x0000 && state->mcu_shared_ram[0x004 / 2] == 0x0214) + state->mcu_shared_ram[0x004 / 2] = 0x4ef9; break; case 0x008/2: - if(mcu_shared_ram[0x008/2] == 0x000f) - mcu_shared_ram[0x008/2] = 0x0604; + if (state->mcu_shared_ram[0x008 / 2] == 0x000f) + state->mcu_shared_ram[0x008 / 2] = 0x0604; break; case 0x00c/2: - if(mcu_shared_ram[0x00c/2] == 0x000f) - mcu_shared_ram[0x00c/2] = 0x0000; + if (state->mcu_shared_ram[0x00c / 2] == 0x000f) + 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(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(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 */ - AM_RANGE(0x090000, 0x090fff) AM_RAM AM_BASE(&left_fg_vram_top) - AM_RANGE(0x091000, 0x091fff) AM_RAM AM_BASE(&right_fg_vram_top) - AM_RANGE(0x092000, 0x092fff) AM_RAM AM_BASE(&left_fg_vram_bottom) - AM_RANGE(0x093000, 0x093fff) AM_RAM AM_BASE(&right_fg_vram_bottom) + AM_RANGE(0x090000, 0x090fff) AM_RAM AM_BASE_MEMBER(ddealer_state, left_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_MEMBER(ddealer_state, left_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(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(0x0f0000, 0x0fdfff) AM_RAM AM_BASE(&work_ram) - AM_RANGE(0x0fe000, 0x0fefff) AM_RAM_WRITE(ddealer_mcu_shared_w) AM_BASE(&mcu_shared_ram) + 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_MEMBER(ddealer_state, work_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 ADDRESS_MAP_END @@ -563,9 +585,24 @@ static GFXDECODE_START( ddealer ) GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0x100, 16 ) 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) { - 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 ) @@ -574,6 +611,8 @@ static INTERRUPT_GEN( ddealer_interrupt ) } static MACHINE_DRIVER_START( ddealer ) + MDRV_DRIVER_DATA(ddealer_state) + MDRV_CPU_ADD("maincpu" , M68000, 10000000) MDRV_CPU_PROGRAM_MAP(ddealer) MDRV_CPU_VBLANK_INT("screen", ddealer_interrupt) @@ -581,6 +620,9 @@ static MACHINE_DRIVER_START( ddealer ) // M50747 or NMK-110 8131 MCU + MDRV_MACHINE_START(ddealer) + MDRV_MACHINE_RESET(ddealer) + MDRV_GFXDECODE(ddealer) 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_PALETTE_LENGTH(0x400) - MDRV_MACHINE_RESET(ddealer) MDRV_VIDEO_START(ddealer) MDRV_VIDEO_UPDATE(ddealer) @@ -607,6 +648,7 @@ MACHINE_DRIVER_END static READ16_HANDLER( ddealer_mcu_r ) { + ddealer_state *state = (ddealer_state *)space->machine->driver_data; static const int resp[] = { 0x93, 0xc7, 0x00, 0x8000, @@ -618,9 +660,9 @@ static READ16_HANDLER( ddealer_mcu_r ) int res; - res = resp[respcount++]; - if (resp[respcount]<0) - respcount = 0; + res = resp[state->respcount++]; + if (resp[state->respcount] < 0) + state->respcount = 0; return res; } @@ -649,5 +691,4 @@ ROM_START( ddealer ) ROM_LOAD( "6.ic86", 0x100, 0x100, NO_DUMP ) 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 ) diff --git a/src/mame/drivers/deniam.c b/src/mame/drivers/deniam.c index 5ca12fd5be5..20846979770 100644 --- a/src/mame/drivers/deniam.c +++ b/src/mame/drivers/deniam.c @@ -47,55 +47,36 @@ Notes: #include "cpu/z80/z80.h" #include "sound/okim6295.h" #include "sound/3812intf.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 ); - - +#include "deniam.h" static WRITE16_HANDLER( sound_command_w ) { 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); } } 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 ) { if (ACCESSING_BITS_0_7) - 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); + okim6295_set_bank_base(device, (data & 0x01) ? 0x40000 : 0x00000); } static ADDRESS_MAP_START( deniam16b_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x000000, 0x0fffff) AM_ROM - AM_RANGE(0x400000, 0x40ffff) AM_RAM_WRITE(deniam_videoram_w) AM_BASE(&deniam_videoram) - AM_RANGE(0x410000, 0x410fff) AM_RAM_WRITE(deniam_textram_w) AM_BASE(&deniam_textram) - AM_RANGE(0x440000, 0x4407ff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) - AM_RANGE(0x840000, 0x840fff) AM_WRITE(deniam_palette_w) AM_BASE(&paletteram16) + 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_MEMBER(deniam_state, textram) + 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_MEMBER(deniam_state, paletteram) AM_RANGE(0xc40000, 0xc40001) AM_WRITE(sound_command_w) AM_RANGE(0xc40002, 0xc40003) AM_READWRITE(deniam_coinctrl_r, deniam_coinctrl_w) AM_RANGE(0xc44000, 0xc44001) AM_READ_PORT("SYSTEM") @@ -122,10 +103,10 @@ ADDRESS_MAP_END /* identical to 16b, but handles sound directly */ static ADDRESS_MAP_START( deniam16c_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x000000, 0x0fffff) AM_ROM - AM_RANGE(0x400000, 0x40ffff) AM_RAM_WRITE(deniam_videoram_w) AM_BASE(&deniam_videoram) - AM_RANGE(0x410000, 0x410fff) AM_RAM_WRITE(deniam_textram_w) AM_BASE(&deniam_textram) - AM_RANGE(0x440000, 0x4407ff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) AM_SIZE(&spriteram_size) - AM_RANGE(0x840000, 0x840fff) AM_WRITE(deniam_palette_w) AM_BASE(&paletteram16) + 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_MEMBER(deniam_state, textram) + 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_MEMBER(deniam_state, paletteram) 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(0xc44000, 0xc44001) AM_READ_PORT("SYSTEM") @@ -231,10 +212,12 @@ static GFXDECODE_START( deniam ) 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 */ - if (cputag_get_cpu(device->machine, "audiocpu") != NULL) + if (state->audio_cpu != NULL) 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 ) + /* driver data */ + MDRV_DRIVER_DATA(deniam_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000,XTAL_25MHz/2) /* 12.5Mhz verified */ MDRV_CPU_PROGRAM_MAP(deniam16b_map) @@ -256,6 +272,7 @@ static MACHINE_DRIVER_START( deniam16b ) MDRV_CPU_PROGRAM_MAP(sound_map) MDRV_CPU_IO_MAP(sound_io_map) + MDRV_MACHINE_START(deniam) MDRV_MACHINE_RESET(deniam) /* video hardware */ @@ -287,11 +304,15 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( deniam16c ) + /* driver data */ + MDRV_DRIVER_DATA(deniam_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000,XTAL_25MHz/2) /* 12.5Mhz verified */ MDRV_CPU_PROGRAM_MAP(deniam16c_map) MDRV_CPU_VBLANK_INT("screen", irq4_line_hold) + MDRV_MACHINE_START(deniam) MDRV_MACHINE_RESET(deniam) /* 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, croquis, logicpro, deniam16b, logicpr2, logicpro, ROT0, "Deniam", "Croquis (Germany)", 0 ) -GAME( 1996, karianx, 0, deniam16b, karianx, karianx, ROT0, "Deniam", "Karian Cross (Rev. 1.0)", 0 ) -GAME( 1997, logicpr2, 0, deniam16c, logicpr2, logicpro, ROT0, "Deniam", "Logic Pro 2 (Japan)", GAME_IMPERFECT_SOUND ) +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)", GAME_SUPPORTS_SAVE ) +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_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/discoboy.c b/src/mame/drivers/discoboy.c index 2efebc6a1fd..dd8cdf8f90d 100644 --- a/src/mame/drivers/discoboy.c +++ b/src/mame/drivers/discoboy.c @@ -41,50 +41,61 @@ Notes: #include "sound/msm5205.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; -static UINT8 discoboy_gfxbank; -static int adpcm_data; + +typedef struct _discoboy_state discoboy_state; +struct _discoboy_state +{ + /* 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 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 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 attr = discoboy_ram_part4[offs+1]; + int code = state->ram_4[offs]; + int attr = state->ram_4[offs + 1]; int color = attr & 0x0f; - sx = discoboy_ram_part4[offs+3] + ((attr & 0x10) << 4); - sy = ((discoboy_ram_part4[offs+2] + 8) & 0xff) - 8; + sx = state->ram_4[offs + 3] + ((attr & 0x10) << 4); + sy = ((state->ram_4[offs + 2] + 8) & 0xff) - 8; code += (attr & 0xe0) << 3; - if (code>=0x400) + if (code >= 0x400) { - if ((discoboy_gfxbank&0x30) == 0x00) + if ((state->gfxbank & 0x30) == 0x00) { code = 0x400 + (code & 0x3ff); } - else if ((discoboy_gfxbank&0x30) == 0x10) + else if ((state->gfxbank & 0x30) == 0x10) { code = 0x400 + (code & 0x3ff) + 0x400; } - else if ((discoboy_gfxbank&0x30) == 0x20) + else if ((state->gfxbank & 0x30) == 0x20) { code = 0x400 + (code & 0x3ff) + 0x800; } - else if ((discoboy_gfxbank&0x30) == 0x30) + else if ((state->gfxbank & 0x30) == 0x30) { 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 ) { - UINT16 x,y; + discoboy_state *state = (discoboy_state *)screen->machine->driver_data; + UINT16 x, y; int i; - int count; - count = 0; + int count = 0; - for (i=0;i<0x800;i+=2) + for (i = 0; i < 0x800; i += 2) { UINT16 pal; - int r,g,b; - pal = discoboy_ram_part1[i] | (discoboy_ram_part1[i+1] << 8); + int r, g, b; + pal = state->ram_1[i] | (state->ram_1[i + 1] << 8); b = ((pal >> 0) & 0xf) << 4; g = ((pal >> 4) & 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; 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; g = ((pal >> 4) & 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); - 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) - tileno = 0x2000 + (tileno&0x1fff) + 0x2000; + if ((state->gfxbank & 0x40) == 0x40) + tileno = 0x2000 + (tileno & 0x1fff) + 0x2000; 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); - count+=2; + drawgfx_opaque(bitmap, cliprect, screen->machine->gfx[1], tileno, state->ram_att[count / 2], 0, 0, x*8, y*8); + count += 2; } } - draw_sprites(screen->machine,bitmap,cliprect); + draw_sprites(screen->machine, bitmap, cliprect); return 0; } #ifdef UNUSED_FUNCTION -void discoboy_setrombank(UINT8 data) +void discoboy_setrombank( running_machine *machine, UINT8 data ) { UINT8 *ROM = memory_region(machine, "maincpu"); - data &=0x2f; - memory_set_bankptr(space->machine, 1, &ROM[0x6000+(data*0x1000)] ); + data &= 0x2f; + memory_set_bankptr(space->machine, 1, &ROM[0x6000 + (data * 0x1000)] ); } #endif static WRITE8_HANDLER( rambank_select_w ) { - discoboy_ram_bank = data; - if (data&=0x83) logerror("rambank_select_w !!!!!"); + discoboy_state *state = (discoboy_state *)space->machine->driver_data; + state->ram_bank = data; + if (data &= 0x83) logerror("rambank_select_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); - port_00 = data; + state->port_00 = data; } static WRITE8_HANDLER( discoboy_port_01_w ) { - UINT8 *ROM = memory_region(space->machine, "maincpu"); - int rombank; + discoboy_state *state = (discoboy_state *)space->machine->driver_data; // 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); // discoboy gfxbank - discoboy_gfxbank = data&0xf0; - rombank = data&0x07; + state->gfxbank = data & 0xf0; - 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) @@ -211,77 +219,66 @@ static WRITE8_HANDLER( discoboy_port_03_w ) // sfx? (to sound cpu) static WRITE8_HANDLER( discoboy_port_06_w ) { //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 ) { - if (discoboy_ram_bank&0x20) - { - discoboy_ram_part2[offset] = data; - } + discoboy_state *state = (discoboy_state *)space->machine->driver_data; + + if (state->ram_bank & 0x20) + state->ram_2[offset] = data; else - { - discoboy_ram_part1[offset] = data; - } + state->ram_1[offset] = data; } static READ8_HANDLER( rambank_r ) { - if (discoboy_ram_bank&0x20) - { - return discoboy_ram_part2[offset]; - } + discoboy_state *state = (discoboy_state *)space->machine->driver_data; + + if (state->ram_bank & 0x20) + return state->ram_2[offset]; else - { - return discoboy_ram_part1[offset]; - } + return state->ram_1[offset]; } static READ8_HANDLER( rambank2_r ) { - if (port_00 == 0x00) - { - return discoboy_ram_part3[offset]; - } - else if (port_00 == 0x01) - { - return discoboy_ram_part4[offset]; - } + discoboy_state *state = (discoboy_state *)space->machine->driver_data; + + if (state->port_00 == 0x00) + return state->ram_3[offset]; + else if (state->port_00 == 0x01) + return state->ram_4[offset]; else - { - printf( "unk rb2_r\n"); - } + printf("unk rb2_r\n"); return mame_rand(space->machine); } static WRITE8_HANDLER( rambank2_w ) { + discoboy_state *state = (discoboy_state *)space->machine->driver_data; - if (port_00 == 0x00) - { - discoboy_ram_part3[offset] = data; - } - else if (port_00 == 0x01) - { - discoboy_ram_part4[offset] = data; - } + if (state->port_00 == 0x00) + state->ram_3[offset] = data; + else if (state->port_00 == 0x01) + state->ram_4[offset] = data; else - { - printf( "unk rb2_w\n"); - } + printf("unk rb2_w\n"); } 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 ) { - 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 ) @@ -314,13 +311,14 @@ ADDRESS_MAP_END /* Sound */ //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); -// adpcm_data = (adpcm_data << 4) & 0xf0; + discoboy_state *state = (discoboy_state *)device->machine->driver_data; + 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 ) @@ -434,15 +432,32 @@ static const msm5205_interface discoboy_msm5205_interface = 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 ) { - discoboy_ram_bank = 0; - port_00 = 0; - discoboy_gfxbank = 0; - adpcm_data = 0x80; + discoboy_state *state = (discoboy_state *)machine->driver_data; + + state->ram_bank = 0; + state->port_00 = 0; + state->gfxbank = 0; + state->adpcm_data = 0x80; } static MACHINE_DRIVER_START( discoboy ) + + /* driver data */ + MDRV_DRIVER_DATA(discoboy_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz? */ 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_HACK(nmi_line_pulse,32) + MDRV_MACHINE_START( discoboy ) + MDRV_MACHINE_RESET( discoboy ) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) @@ -469,8 +487,6 @@ static MACHINE_DRIVER_START( discoboy ) MDRV_VIDEO_START(discoboy) MDRV_VIDEO_UPDATE(discoboy) - MDRV_MACHINE_RESET( discoboy ) - /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") @@ -481,37 +497,8 @@ static MACHINE_DRIVER_START( discoboy ) MDRV_SOUND_ADD("msm", MSM5205, 384000) // ???? unknown MDRV_SOUND_CONFIG(discoboy_msm5205_interface) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) - 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_REGION( 0x30000, "maincpu", 0 ) @@ -540,4 +527,33 @@ ROM_START( discoboy ) 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 ) diff --git a/src/mame/drivers/diverboy.c b/src/mame/drivers/diverboy.c index ffc68f6104d..458d4a1e77b 100644 --- a/src/mame/drivers/diverboy.c +++ b/src/mame/drivers/diverboy.c @@ -51,18 +51,70 @@ #include "cpu/m68000/m68000.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 ) { 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); } } @@ -72,7 +124,7 @@ static WRITE8_DEVICE_HANDLER( okibank_w ) /* bit 2 might be reset */ // 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 ) AM_RANGE(0x000000, 0x03ffff) AM_ROM 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(0x140000, 0x1407ff) AM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE(&paletteram16) AM_RANGE(0x180000, 0x180001) AM_READ_PORT("P1_P2") @@ -182,6 +234,8 @@ GFXDECODE_END static MACHINE_DRIVER_START( diverboy ) + MDRV_DRIVER_DATA(diverboy_state) + MDRV_CPU_ADD("maincpu", M68000, 12000000) /* guess */ MDRV_CPU_PROGRAM_MAP(diverboy_map) 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 ) diff --git a/src/mame/drivers/dorachan.c b/src/mame/drivers/dorachan.c index 8516da6f630..21189783ba4 100644 --- a/src/mame/drivers/dorachan.c +++ b/src/mame/drivers/dorachan.c @@ -16,10 +16,18 @@ Todo: #define NUM_PENS (8) -static UINT8 *dorachan_videoram; -static size_t dorachan_videoram_size; -static UINT8 dorachan_flip_screen; +typedef struct _dorachan_state dorachan_state; +struct _dorachan_state +{ + /* 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 ) { + dorachan_state *state = (dorachan_state *)field->port->machine->driver_data; 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 0x72a2: ret = 0xd5; break; case 0x72b5: ret = 0xcb; break; 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; } @@ -67,6 +76,7 @@ static void get_pens(pen_t *pens) static VIDEO_UPDATE( dorachan ) { + dorachan_state *state = (dorachan_state *)screen->machine->driver_data; pen_t pens[NUM_PENS]; offs_t offs; const UINT8 *color_map_base; @@ -75,7 +85,7 @@ static VIDEO_UPDATE( dorachan ) 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; UINT8 fore_color; @@ -86,9 +96,9 @@ static VIDEO_UPDATE( dorachan ) /* the need for +1 is extremely unusual, but definetely correct */ 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; else fore_color = (color_map_base[color_address] >> 0) & 0x07; @@ -109,15 +119,17 @@ static VIDEO_UPDATE( dorachan ) 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 ) { - /* 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) ^ dorachan_flip_screen; + dorachan_state *state = (dorachan_state *)field->port->machine->driver_data; + + /* 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(0x2c00, 0x2c00) AM_MIRROR(0x03ff) AM_READ_PORT("JOY") 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 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 ) + /* driver data */ + MDRV_DRIVER_DATA(dorachan_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80, 2000000) MDRV_CPU_PROGRAM_MAP(dorachan_map) MDRV_CPU_IO_MAP(dorachan_io_map) MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold,2) + MDRV_MACHINE_START(dorachan) + MDRV_MACHINE_RESET(dorachan) + /* video hardware */ 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 ) diff --git a/src/mame/drivers/dragrace.c b/src/mame/drivers/dragrace.c index cd34a1c3a84..1de63db660c 100644 --- a/src/mame/drivers/dragrace.c +++ b/src/mame/drivers/dragrace.c @@ -11,12 +11,9 @@ Atari Drag Race Driver #include "sound/discrete.h" -static unsigned dragrace_misc_flags = 0; - -static int dragrace_gear[2]; - static TIMER_CALLBACK( dragrace_frame_callback ) { + dragrace_state *state = (dragrace_state *)machine->driver_data; int i; static const char *const portnames[] = { "P1", "P2" }; @@ -24,11 +21,11 @@ static TIMER_CALLBACK( dragrace_frame_callback ) { switch (input_port_read(machine, portnames[i])) { - case 0x01: dragrace_gear[i] = 1; break; - case 0x02: dragrace_gear[i] = 2; break; - case 0x04: dragrace_gear[i] = 3; break; - case 0x08: dragrace_gear[i] = 4; break; - case 0x10: dragrace_gear[i] = 0; break; + case 0x01: state->gear[i] = 1; break; + case 0x02: state->gear[i] = 2; break; + case 0x04: state->gear[i] = 3; break; + case 0x08: state->gear[i] = 4; 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); -} - -static void dragrace_update_misc_flags(const address_space *space) -{ - const device_config *discrete = devtag_get_device(space->machine, "discrete"); - + dragrace_state *state = (dragrace_state *)machine->driver_data; /* 0x0900 = set 3SPEED1 0x00000001 * 0x0901 = set 4SPEED1 0x00000002 * 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 * 0x0938 = clear 0x0918 - 0x091f */ - set_led_status(0, dragrace_misc_flags & 0x00008000); - set_led_status(1, dragrace_misc_flags & 0x80000000); + set_led_status(0, state->misc_flags & 0x00008000); + set_led_status(1, state->misc_flags & 0x80000000); - discrete_sound_w(discrete, DRAGRACE_MOTOR1_DATA, ~dragrace_misc_flags & 0x0000001f); // Speed1 data* - discrete_sound_w(discrete, DRAGRACE_EXPLODE1_EN, (dragrace_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(discrete, DRAGRACE_KLEXPL1_EN, (dragrace_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_DATA, ~state->misc_flags & 0x0000001f); // Speed1 data* + discrete_sound_w(state->discrete, DRAGRACE_EXPLODE1_EN, (state->misc_flags & 0x00000020) ? 1: 0); // Explosion1 enable + discrete_sound_w(state->discrete, DRAGRACE_SCREECH1_EN, (state->misc_flags & 0x00000040) ? 1: 0); // Screech1 enable + discrete_sound_w(state->discrete, DRAGRACE_KLEXPL1_EN, (state->misc_flags & 0x00000200) ? 1: 0); // KLEXPL1 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(discrete, DRAGRACE_EXPLODE2_EN, (dragrace_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(discrete, DRAGRACE_KLEXPL2_EN, (dragrace_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_DATA, (~state->misc_flags & 0x001f0000) >> 0x10); // Speed2 data* + discrete_sound_w(state->discrete, DRAGRACE_EXPLODE2_EN, (state->misc_flags & 0x00200000) ? 1: 0); // Explosion2 enable + discrete_sound_w(state->discrete, DRAGRACE_SCREECH2_EN, (state->misc_flags & 0x00400000) ? 1: 0); // Screech2 enable + discrete_sound_w(state->discrete, DRAGRACE_KLEXPL2_EN, (state->misc_flags & 0x02000000) ? 1: 0); // KLEXPL2 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(discrete, DRAGRACE_LOTONE_EN, (dragrace_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_ATTRACT_EN, (state->misc_flags & 0x00001000) ? 1: 0); // Attract enable + discrete_sound_w(state->discrete, DRAGRACE_LOTONE_EN, (state->misc_flags & 0x00002000) ? 1: 0); // LoTone enable + discrete_sound_w(state->discrete, DRAGRACE_HITONE_EN, (state->misc_flags & 0x20000000) ? 1: 0); // HiTone enable } static WRITE8_HANDLER( dragrace_misc_w ) { + dragrace_state *state = (dragrace_state *)space->machine->driver_data; + /* Set/clear individual bit */ UINT32 mask = 1 << offset; if (data & 0x01) - dragrace_misc_flags |= mask; + state->misc_flags |= mask; else - dragrace_misc_flags &= (~mask); - logerror("Set %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0900+offset, mask, dragrace_misc_flags, data & 0x01); - dragrace_update_misc_flags(space); + state->misc_flags &= (~mask); + logerror("Set %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0900 + offset, mask, state->misc_flags, data & 0x01); + dragrace_update_misc_flags(space->machine); } static WRITE8_HANDLER( dragrace_misc_clear_w ) { + dragrace_state *state = (dragrace_state *)space->machine->driver_data; + /* Clear 8 bits */ UINT32 mask = 0xff << (((offset >> 3) & 0x03) * 8); - dragrace_misc_flags &= (~mask); - logerror("Clear %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0920+offset, mask, dragrace_misc_flags, data & 0x01); - dragrace_update_misc_flags(space); + state->misc_flags &= (~mask); + logerror("Clear %#6x, Mask=%#10x, Flag=%#10x, Data=%x\n", 0x0920 + offset, mask, state->misc_flags, data & 0x01); + dragrace_update_misc_flags(space->machine); } static READ8_HANDLER( dragrace_input_r ) { + dragrace_state *state = (dragrace_state *)space->machine->driver_data; int val = input_port_read(space->machine, "IN2"); 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]); - if (dragrace_gear[i] != 0) - { - in &= ~(1 << dragrace_gear[i]); - } + if (state->gear[i] != 0) + in &= ~(1 << state->gear[i]); if (in & maskA) - { 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(0x0900, 0x091f) AM_WRITE(dragrace_misc_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(0x0b00, 0x0bff) AM_WRITE(SMH_RAM) AM_BASE(&dragrace_position_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_MEMBER(dragrace_state, position_ram) AM_RANGE(0x0c00, 0x0c00) AM_READ(dragrace_steering_r) AM_RANGE(0x0d00, 0x0d00) AM_READ(dragrace_scanline_r) AM_RANGE(0x0e00, 0x0eff) AM_WRITE(watchdog_reset_w) @@ -191,7 +183,7 @@ ADDRESS_MAP_END 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( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 1 gear 1 */ 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( 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( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* player 2 gear 1 */ 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( 0x00, "5" ) - PORT_START("IN2") /* IN2 */ + PORT_START("IN2") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) /* IN0 connects here */ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) /* IN1 connects here */ 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( 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_START("DIAL2") /* IN4 */ + PORT_START("DIAL2") 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(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(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_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(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) @@ -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 ) + /* driver data */ + MDRV_DRIVER_DATA(dragrace_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M6800, 12096000 / 12) MDRV_CPU_PROGRAM_MAP(dragrace_map) MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold, 4) MDRV_WATCHDOG_VBLANK_INIT(8) + MDRV_MACHINE_START(dragrace) MDRV_MACHINE_RESET(dragrace) /* video hardware */ @@ -374,4 +391,4 @@ ROM_START( dragrace ) 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 ) diff --git a/src/mame/drivers/dreamwld.c b/src/mame/drivers/dreamwld.c index caea17ee777..f3abf6c7588 100644 --- a/src/mame/drivers/dreamwld.c +++ b/src/mame/drivers/dreamwld.c @@ -87,23 +87,35 @@ Stephh's notes (based on the game M68EC020 code and some tests) : #define MASTER_CLOCK 32000000 - -static UINT32*dreamwld_bg_videoram; -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 ) +typedef struct _dreamwld_state dreamwld_state; +struct _dreamwld_state { + /* 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]; - UINT32 *source = spriteram32; - UINT32 *finish = spriteram32 + 0x1000/4; + UINT32 *source = state->spriteram; + UINT32 *finish = state->spriteram + 0x1000 / 4; UINT16 *redirect = (UINT16 *)memory_region(machine, "gfx3"); - while( source> 0; - ypos = (source[0]&0x01ff0000) >> 16; - xsize = (source[0]&0x00000e00) >> 9; - ysize = (source[0]&0x0e000000) >> 25; + xpos = (source[0] & 0x000001ff) >> 0; + ypos = (source[0] & 0x01ff0000) >> 16; + xsize = (source[0] & 0x00000e00) >> 9; + ysize = (source[0] & 0x0e000000) >> 25; - - tileno = (source[1]&0x0000ffff) >>0; - colour = (source[1]&0x3f000000) >>24; - xflip = (source[1]&0x40000000); + tileno = (source[1] & 0x0000ffff) >>0; + colour = (source[1] & 0x3f000000) >>24; + xflip = (source[1] & 0x40000000); xinc = 16; if (xflip) { xinc = -16; - xpos+=16*xsize; + xpos += 16 * xsize; } - ysize++;xsize++; // size 0 = 1 tile + ysize++; xsize++; // size 0 = 1 tile xpos -=16; - for (yct=0;yctmachine->driver_data; + COMBINE_DATA(&state->bg_videoram[offset]); + 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 ) { - int tileno,colour; - tileno = (tile_index&1)?(dreamwld_bg_videoram[tile_index>>1]&0xffff):((dreamwld_bg_videoram[tile_index>>1]>>16)&0xffff); + dreamwld_state *state = (dreamwld_state *)machine->driver_data; + 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; - tileno &=0x1fff; - SET_TILE_INFO(1,tileno+dreamwld_tilebank[0]*0x2000,0x80+colour,0); + tileno &= 0x1fff; + SET_TILE_INFO(1, tileno + state->tilebank[0] * 0x2000, 0x80 + colour, 0); } static WRITE32_HANDLER( dreamwld_bg2_videoram_w ) { - COMBINE_DATA(&dreamwld_bg2_videoram[offset]); - tilemap_mark_tile_dirty(dreamwld_bg2_tilemap,offset*2); - tilemap_mark_tile_dirty(dreamwld_bg2_tilemap,offset*2+1); + dreamwld_state *state = (dreamwld_state *)space->machine->driver_data; + COMBINE_DATA(&state->bg2_videoram[offset]); + 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 ) { - UINT16 tileno,colour; - tileno = (tile_index&1)?(dreamwld_bg2_videoram[tile_index>>1]&0xffff):((dreamwld_bg2_videoram[tile_index>>1]>>16)&0xffff); + dreamwld_state *state = (dreamwld_state *)machine->driver_data; + 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; - tileno &=0x1fff; - SET_TILE_INFO(1,tileno+dreamwld_tilebank[1]*0x2000,0xc0+colour,0); + tileno &= 0x1fff; + SET_TILE_INFO(1, tileno + state->tilebank[1] * 0x2000, 0xc0 + colour, 0); } static VIDEO_START( dreamwld ) { - dreamwld_bg_tilemap = tilemap_create(machine, get_dreamwld_bg_tile_info,tilemap_scan_rows, 16, 16, 64,32); - 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); - dreamwld_tilebankold[0] = dreamwld_tilebankold[1] = -1; - dreamwld_tilebank[0] = dreamwld_tilebank[1] = 0; + dreamwld_state *state = (dreamwld_state *)machine->driver_data; + + state->bg_tilemap = tilemap_create(machine, get_dreamwld_bg_tile_info,tilemap_scan_rows, 16, 16, 64,32); + state->bg2_tilemap = tilemap_create(machine, get_dreamwld_bg2_tile_info,tilemap_scan_rows, 16, 16, 64,32); + tilemap_set_transparent_pen(state->bg2_tilemap,0); } static VIDEO_UPDATE( dreamwld ) { - tilemap_set_scrolly( dreamwld_bg_tilemap,0, dreamwld_bg_scroll[(0x400/4)]+32 ); - 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_state *state = (dreamwld_state *)screen->machine->driver_data; - dreamwld_tilebank[0] = (dreamwld_bg_scroll[(0x400/4)+4]>>6)&1; - dreamwld_tilebank[1] = (dreamwld_bg_scroll[(0x400/4)+5]>>6)&1; + tilemap_set_scrolly(state->bg_tilemap, 0, state->bg_scroll[(0x400 / 4)] + 32); + 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]; - tilemap_mark_all_tiles_dirty (dreamwld_bg_tilemap); + state->tilebankold[0] = state->tilebank[0]; + 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]; - tilemap_mark_all_tiles_dirty (dreamwld_bg2_tilemap); + state->tilebankold[1] = state->tilebank[1]; + tilemap_mark_all_tiles_dirty(state->bg2_tilemap); } - tilemap_draw(bitmap,cliprect,dreamwld_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,dreamwld_bg2_tilemap,0,0); + tilemap_draw(bitmap, cliprect, state->bg_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; } @@ -228,26 +244,28 @@ static VIDEO_UPDATE( dreamwld ) static READ32_HANDLER( dreamwld_protdata_r ) { - static int protindex = 0; - UINT8 *protdata = memory_region( space->machine, "user1" ); - size_t protsize = memory_region_length( space->machine, "user1" ); - UINT8 dat = protdata[(protindex++)%protsize]; - return dat<<24; + 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 dat = protdata[(state->protindex++) % protsize]; + return dat << 24; } static WRITE32_HANDLER( dreamwld_palette_w ) { + dreamwld_state *state = (dreamwld_state *)space->machine->driver_data; UINT16 dat; int color; - COMBINE_DATA(&paletteram32[offset]); + COMBINE_DATA(&state->paletteram[offset]); 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)); - 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)); } @@ -256,52 +274,44 @@ static void dreamwld_oki_setbank( running_machine *machine, UINT8 chip, UINT8 ba /* 0x30000-0x3ffff is banked. banks are at 0x30000,0x40000,0x50000 and 0x60000 in rom */ UINT8 *sound = memory_region(machine, chip ? "oki1" : "oki2"); - logerror("OKI%d: set bank %02x\n",chip,bank); - memcpy(sound+0x30000, sound+0xb0000+0x10000*bank, 0x10000); + logerror("OKI%d: set bank %02x\n", chip, bank); + memcpy(sound + 0x30000, sound + 0xb0000 + 0x10000 * bank, 0x10000); } static WRITE32_HANDLER( dreamwld_6295_0_bank_w ) { if (ACCESSING_BITS_0_7) - { - dreamwld_oki_setbank(space->machine,0,data&0x3); - } + dreamwld_oki_setbank(space->machine, 0, data & 0x3); else - { logerror("OKI0: unk bank write %x mem_mask %8x\n", data, mem_mask); - } } static WRITE32_HANDLER( dreamwld_6295_1_bank_w ) { if (ACCESSING_BITS_0_7) - { - dreamwld_oki_setbank(space->machine,1,data&0x3); - } + dreamwld_oki_setbank(space->machine, 1, data & 0x3); else - { logerror("OKI1: unk bank write %x mem_mask %8x\n", data, mem_mask); - } } static ADDRESS_MAP_START( dreamwld_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_WRITENOP - AM_RANGE(0x400000, 0x401fff) AM_RAM AM_BASE( &spriteram32 ) - AM_RANGE(0x600000, 0x601fff) AM_RAM_WRITE(dreamwld_palette_w) AM_BASE(&paletteram32) // real palette? - AM_RANGE(0x800000, 0x801fff) AM_RAM_WRITE(dreamwld_bg_videoram_w ) AM_BASE( &dreamwld_bg_videoram ) - AM_RANGE(0x802000, 0x803fff) AM_RAM_WRITE(dreamwld_bg2_videoram_w ) AM_BASE( &dreamwld_bg2_videoram ) - AM_RANGE(0x804000, 0x805fff) AM_RAM AM_BASE( &dreamwld_bg_scroll ) // scroll regs etc. + AM_RANGE(0x400000, 0x401fff) AM_RAM AM_BASE_MEMBER(dreamwld_state, spriteram) + 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_MEMBER(dreamwld_state, bg_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_MEMBER(dreamwld_state, bg_scroll) // scroll regs etc. AM_RANGE(0xc00000, 0xc00003) AM_READ_PORT("INPUTS") AM_RANGE(0xc00004, 0xc00007) AM_READ_PORT("c00004") - 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(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(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(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(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 ) - PORT_START("INPUTS") /* 32bit */ + PORT_START("INPUTS") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_COIN2 ) 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( 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( 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_DIPSETTING( 0x0002, "2" ) PORT_DIPSETTING( 0x0003, "3" ) @@ -383,12 +393,38 @@ static GFXDECODE_START( dreamwld ) GFXDECODE_ENTRY( "gfx2", 0, tiles16x16_layout, 0, 0x100 ) 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 ) + + /* driver data */ + MDRV_DRIVER_DATA(dreamwld_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68EC020, MASTER_CLOCK/2) 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_MACHINE_START(dreamwld) + MDRV_MACHINE_RESET(dreamwld) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(58) @@ -436,7 +472,6 @@ ROM_START( dreamwld ) ram. The interrupt vectors point at the code placed in RAM. */ ROM_LOAD( "protdata.bin", 0x000, 0x6c9 , CRC(f284b2fd) SHA1(9e8096c8aa8a288683f002311b38787b120748d1) ) /* extracted */ - ROM_REGION( 0x100000, "oki1", 0 ) /* OKI Samples - 1st chip*/ ROM_LOAD( "5.bin", 0x000000, 0x80000, CRC(9689570a) SHA1(4414233da8f46214ca7e9022df70953922a63aa4) ) ROM_RELOAD(0x80000,0x80000) // fot the banks @@ -460,4 +495,4 @@ ROM_START( dreamwld ) 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 ) diff --git a/src/mame/drivers/dribling.c b/src/mame/drivers/dribling.c index 4ddeab6f54c..f78ee4f5565 100644 --- a/src/mame/drivers/dribling.c +++ b/src/mame/drivers/dribling.c @@ -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 @@ -55,7 +40,8 @@ static UINT8 di; 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); } @@ -69,19 +55,23 @@ static INTERRUPT_GEN( dribling_irq_gen ) static READ8_DEVICE_HANDLER( dsr_r ) { + dribling_state *state = (dribling_state *)device->machine->driver_data; + /* 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 ) { + dribling_state *state = (dribling_state *)device->machine->driver_data; + /* low value in the given bit selects */ - if (!(input_mux & 0x01)) + if (!(state->input_mux & 0x01)) 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"); - else if (!(input_mux & 0x04)) + else if (!(state->input_mux & 0x04)) return input_port_read(device->machine, "MUX2"); return 0xff; } @@ -96,15 +86,17 @@ static READ8_DEVICE_HANDLER( input_mux0_r ) static WRITE8_DEVICE_HANDLER( misc_w ) { + dribling_state *state = (dribling_state *)device->machine->driver_data; + /* bit 7 = di */ - di = (data >> 7) & 1; - if (!di) + state->di = (data >> 7) & 1; + if (!state->di) cputag_set_input_line(device->machine, "maincpu", 0, CLEAR_LINE); /* bit 6 = parata */ /* bit 5 = ab. campo */ - dribling_abca = (data >> 5) & 1; + state->abca = (data >> 5) & 1; /* bit 4 = ab. a.b.f. */ /* bit 3 = n/c */ @@ -112,7 +104,7 @@ static WRITE8_DEVICE_HANDLER( misc_w ) /* bit 2 = (9) = PC2 */ /* bit 1 = (10) = PC1 */ /* 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); } @@ -121,7 +113,7 @@ static WRITE8_DEVICE_HANDLER( sound_w ) { /* bit 7 = stop palla */ /* bit 6 = contrasto */ - /* bit 5 = calgio a */ + /* bit 5 = calcio a */ /* bit 4 = fischio */ /* bit 3 = calcio b */ /* bit 2 = folla a */ @@ -140,12 +132,14 @@ static WRITE8_DEVICE_HANDLER( pb_w ) static WRITE8_DEVICE_HANDLER( shr_w ) { + dribling_state *state = (dribling_state *)device->machine->driver_data; + /* bit 3 = watchdog */ if (data & 0x08) watchdog_reset(device->machine); /* 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 ) { + dribling_state *state = (dribling_state *)space->machine->driver_data; + 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) - return ppi8255_r(devtag_get_device(space->machine, "ppi8255_1"), offset & 3); + return ppi8255_r(state->ppi_1, offset & 3); return 0xff; } static WRITE8_HANDLER( iowrite ) { + dribling_state *state = (dribling_state *)space->machine->driver_data; + 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) - ppi8255_w(devtag_get_device(space->machine, "ppi8255_1"), offset & 3, data); + ppi8255_w(state->ppi_1, offset & 3, data); else if (offset & 0x40) { - dr = ds; - ds = data; + state->dr = state->ds; + state->ds = data; } } @@ -217,9 +215,9 @@ static const ppi8255_interface ppi8255_intf[2] = static ADDRESS_MAP_START( dribling_map, ADDRESS_SPACE_PROGRAM, 8 ) 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(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 @@ -237,7 +235,7 @@ ADDRESS_MAP_END *************************************/ 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( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) 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( 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( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) 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( 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( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) 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( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("IN0") /* IN0 */ + PORT_START("IN0") PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) 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 ) + /* driver data */ + MDRV_DRIVER_DATA(dribling_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80, 5000000) 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_1", ppi8255_intf[1] ) + MDRV_MACHINE_START(dribling) + MDRV_MACHINE_RESET(dribling) + /* video hardware */ 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, driblingo,dribling, dribling, dribling, 0, ROT0, "Model Racing (Olympia license)", "Dribbling (Olympia)", 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_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/drmicro.c b/src/mame/drivers/drmicro.c index 626a24cec8d..468da2cedb2 100644 --- a/src/mame/drivers/drmicro.c +++ b/src/mame/drivers/drmicro.c @@ -12,52 +12,53 @@ Quite similar to Appoooh #include "cpu/z80/z80.h" #include "sound/msm5205.h" #include "sound/sn76496.h" +#include "drmicro.h" #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 ); - -/****************************************************************************/ - -static int drmicro_nmi_enable; +/************************************* + * + * Memory handlers + * + *************************************/ 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); } static WRITE8_HANDLER( nmi_enable_w ) -{ // bit2,3 unknown - drmicro_nmi_enable = data & 1; - drmicro_flip_w(space->machine, data & 2); +{ + drmicro_state *state = (drmicro_state *)space->machine->driver_data; + + 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) { + drmicro_state *state = (drmicro_state *)device->machine->driver_data; UINT8 *PCM = memory_region(device->machine, "adpcm"); - int data = PCM[pcm_adr / 2]; + int data = PCM[state->pcm_adr / 2]; if (data != 0x70) // ?? { - if (~pcm_adr & 1) + if (~state->pcm_adr & 1) data >>= 4; msm5205_data_w(device, data & 0x0f); msm5205_reset_w(device, 0); - pcm_adr = (pcm_adr + 1) & 0x7fff; + state->pcm_adr = (state->pcm_adr + 1) & 0x7fff; } else msm5205_reset_w(device, 1); @@ -65,11 +66,16 @@ static void pcm_w(const device_config *device) static WRITE8_HANDLER( pcm_set_w ) { - pcm_adr = ((data & 0x3f) << 9); - pcm_w(devtag_get_device(space->machine, "msm")); + drmicro_state *state = (drmicro_state *)space->machine->driver_data; + state->pcm_adr = ((data & 0x3f) << 9); + pcm_w(state->msm); } -/****************************************************************************/ +/************************************* + * + * Address maps + * + *************************************/ static ADDRESS_MAP_START( drmicro_map, ADDRESS_SPACE_PROGRAM, 8 ) 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? ADDRESS_MAP_END -/****************************************************************************/ +/************************************* + * + * Input ports + * + *************************************/ static INPUT_PORTS_START( drmicro ) PORT_START("P1") @@ -146,7 +156,11 @@ static INPUT_PORTS_START( drmicro ) PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // 4-8 INPUT_PORTS_END -/****************************************************************************/ +/************************************* + * + * Graphics definitions + * + *************************************/ static const gfx_layout spritelayout4 = { @@ -205,10 +219,39 @@ static const msm5205_interface msm5205_config = 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 ) + /* driver data */ + MDRV_DRIVER_DATA(drmicro_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80,MCLK/6) /* 3.072MHz? */ MDRV_CPU_PROGRAM_MAP(drmicro_map) @@ -217,6 +260,9 @@ static MACHINE_DRIVER_START( drmicro ) MDRV_QUANTUM_TIME(HZ(60)) + MDRV_MACHINE_START(drmicro) + MDRV_MACHINE_RESET(drmicro) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) @@ -249,7 +295,11 @@ static MACHINE_DRIVER_START( drmicro ) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) MACHINE_DRIVER_END -/****************************************************************************/ +/************************************* + * + * ROM definition(s) + * + *************************************/ ROM_START( drmicro ) 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_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 ) diff --git a/src/mame/drivers/drtomy.c b/src/mame/drivers/drtomy.c index 626fe1e5e60..b251b4d731f 100644 --- a/src/mame/drivers/drtomy.c +++ b/src/mame/drivers/drtomy.c @@ -11,22 +11,38 @@ similar hardware. #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" -static UINT16 *drtomy_spriteram; -static UINT16 *drtomy_videoram_bg, *drtomy_videoram_fg; -static tilemap *tilemap_bg, *tilemap_fg; +typedef struct _drtomy_state drtomy_state; +struct _drtomy_state +{ + /* 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 ) { - int code = drtomy_videoram_fg[tile_index] & 0xfff; - int color = (drtomy_videoram_fg[tile_index] & 0xf000) >> 12; + drtomy_state *state = (drtomy_state *)machine->driver_data; + int code = state->videoram_fg[tile_index] & 0xfff; + int color = (state->videoram_fg[tile_index] & 0xf000) >> 12; SET_TILE_INFO(2, code, color, 0); } static TILE_GET_INFO( get_tile_info_bg ) { - int code = drtomy_videoram_bg[tile_index] & 0xfff; - int color = (drtomy_videoram_bg[tile_index] & 0xf000) >> 12; + drtomy_state *state = (drtomy_state *)machine->driver_data; + int code = state->videoram_bg[tile_index] & 0xfff; + int color = (state->videoram_bg[tile_index] & 0xf000) >> 12; SET_TILE_INFO(1, code, color, 0); } @@ -48,38 +64,42 @@ static TILE_GET_INFO( get_tile_info_bg ) 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; const gfx_element *gfx = machine->gfx[0]; - static const int x_offset[2] = {0x0,0x2}; - static const int y_offset[2] = {0x0,0x1}; + static const int x_offset[2] = {0x0, 0x2}; + static const int y_offset[2] = {0x0, 0x1}; - for (i = 3; i < 0x1000/2; i+=4){ - int sx = drtomy_spriteram[i+2] & 0x01ff; - int sy = (240 - (drtomy_spriteram[i] & 0x00ff)) & 0x00ff; - int number = drtomy_spriteram[i+3]; - int color = (drtomy_spriteram[i+2] & 0x1e00) >> 9; - int attr = (drtomy_spriteram[i] & 0xfe00) >> 9; + for (i = 3; i < 0x1000 / 2; i += 4) + { + int sx = state->spriteram[i + 2] & 0x01ff; + int sy = (240 - (state->spriteram[i] & 0x00ff)) & 0x00ff; + int number = state->spriteram[i + 3]; + int color = (state->spriteram[i + 2] & 0x1e00) >> 9; + int attr = (state->spriteram[i] & 0xfe00) >> 9; int xflip = attr & 0x20; int yflip = attr & 0x40; int spr_size; - if (attr & 0x04){ + if (attr & 0x04) spr_size = 1; - } - else{ + else + { spr_size = 2; number &= (~3); } - for (y = 0; y < spr_size; y++){ - for (x = 0; x < spr_size; x++){ + for (y = 0; y < spr_size; y++) + { + for (x = 0; x < spr_size; x++) + { - ex = xflip ? (spr_size-1-x) : x; - ey = yflip ? (spr_size-1-y) : y; + ex = xflip ? (spr_size - 1 - x) : x; + ey = yflip ? (spr_size - 1 - y) : y; drawgfx_transpen(bitmap,cliprect,gfx,number + x_offset[ex] + y_offset[ey], color,xflip,yflip, @@ -91,40 +111,45 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta static VIDEO_START( drtomy ) { - tilemap_bg = tilemap_create(machine, get_tile_info_bg,tilemap_scan_rows,16,16,32,32); - tilemap_fg = tilemap_create(machine, get_tile_info_fg,tilemap_scan_rows,16,16,32,32); + drtomy_state *state = (drtomy_state *)machine->driver_data; - 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 ) { - tilemap_draw(bitmap,cliprect,tilemap_bg,0,0); - tilemap_draw(bitmap,cliprect,tilemap_fg,0,0); - draw_sprites(screen->machine,bitmap,cliprect); + drtomy_state *state = (drtomy_state *)screen->machine->driver_data; + + 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; } static WRITE16_HANDLER( drtomy_vram_fg_w ) { - COMBINE_DATA(&drtomy_videoram_fg[offset]); - tilemap_mark_tile_dirty(tilemap_fg,offset); + drtomy_state *state = (drtomy_state *)space->machine->driver_data; + COMBINE_DATA(&state->videoram_fg[offset]); + tilemap_mark_tile_dirty(state->tilemap_fg, offset); } static WRITE16_HANDLER( drtomy_vram_bg_w ) { - COMBINE_DATA(&drtomy_videoram_bg[offset]); - tilemap_mark_tile_dirty(tilemap_bg,offset); + drtomy_state *state = (drtomy_state *)space->machine->driver_data; + COMBINE_DATA(&state->videoram_bg[offset]); + tilemap_mark_tile_dirty(state->tilemap_bg, offset); } static WRITE16_DEVICE_HANDLER( drtomy_okibank_w ) { - static int oki_bank; - - if(oki_bank != (data & 3)) + drtomy_state *state = (drtomy_state *)device->machine->driver_data; + if (state->oki_bank != (data & 3)) { - oki_bank = data & 3; - okim6295_set_bank_base(device, oki_bank * 0x40000); + state->oki_bank = data & 3; + okim6295_set_bank_base(device, state->oki_bank * 0x40000); } /* 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 ) 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(0x101000, 0x101fff) AM_RAM_WRITE(drtomy_vram_bg_w) AM_BASE(&drtomy_videoram_bg) /* Video RAM BG */ + 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_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(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(0x700002, 0x700003) AM_READ_PORT("DSW2") AM_RANGE(0x700004, 0x700005) AM_READ_PORT("P1") @@ -247,13 +272,33 @@ static INPUT_PORTS_START( drtomy ) 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 ) + /* driver data */ + MDRV_DRIVER_DATA(drtomy_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", M68000,24000000/2) /* ? MHz */ MDRV_CPU_PROGRAM_MAP(drtomy_map) MDRV_CPU_VBLANK_INT("screen", irq6_line_hold) + MDRV_MACHINE_START(drtomy) + MDRV_MACHINE_RESET(drtomy) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) @@ -303,4 +348,4 @@ ROM_START( drtomy ) 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 ) diff --git a/src/mame/includes/deniam.h b/src/mame/includes/deniam.h new file mode 100644 index 00000000000..cb3c0f2ca25 --- /dev/null +++ b/src/mame/includes/deniam.h @@ -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 ); diff --git a/src/mame/includes/dragrace.h b/src/mame/includes/dragrace.h index ad270b7ac5f..ecb660509da 100644 --- a/src/mame/includes/dragrace.h +++ b/src/mame/includes/dragrace.h @@ -7,19 +7,38 @@ #include "sound/discrete.h" /* Discrete Sound Input Nodes */ -#define DRAGRACE_SCREECH1_EN NODE_01 -#define DRAGRACE_SCREECH2_EN NODE_02 -#define DRAGRACE_LOTONE_EN NODE_03 -#define DRAGRACE_HITONE_EN NODE_04 -#define DRAGRACE_EXPLODE1_EN NODE_05 -#define DRAGRACE_EXPLODE2_EN NODE_06 -#define DRAGRACE_MOTOR1_DATA NODE_07 -#define DRAGRACE_MOTOR2_DATA NODE_08 -#define DRAGRACE_MOTOR1_EN NODE_80 -#define DRAGRACE_MOTOR2_EN NODE_81 -#define DRAGRACE_KLEXPL1_EN NODE_82 -#define DRAGRACE_KLEXPL2_EN NODE_83 -#define DRAGRACE_ATTRACT_EN NODE_09 +#define DRAGRACE_SCREECH1_EN NODE_01 +#define DRAGRACE_SCREECH2_EN NODE_02 +#define DRAGRACE_LOTONE_EN NODE_03 +#define DRAGRACE_HITONE_EN NODE_04 +#define DRAGRACE_EXPLODE1_EN NODE_05 +#define DRAGRACE_EXPLODE2_EN NODE_06 +#define DRAGRACE_MOTOR1_DATA NODE_07 +#define DRAGRACE_MOTOR2_DATA NODE_08 +#define DRAGRACE_MOTOR1_EN NODE_80 +#define DRAGRACE_MOTOR2_EN NODE_81 +#define DRAGRACE_KLEXPL1_EN NODE_82 +#define DRAGRACE_KLEXPL2_EN NODE_83 +#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 -----------*/ @@ -30,7 +49,3 @@ DISCRETE_SOUND_EXTERN( dragrace ); VIDEO_START( dragrace ); VIDEO_UPDATE( dragrace ); - -extern UINT8* dragrace_playfield_ram; -extern UINT8* dragrace_position_ram; - diff --git a/src/mame/includes/dribling.h b/src/mame/includes/dribling.h index 633400aa79a..b629a31d2ed 100644 --- a/src/mame/includes/dribling.h +++ b/src/mame/includes/dribling.h @@ -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 -----------*/ diff --git a/src/mame/includes/drmicro.h b/src/mame/includes/drmicro.h new file mode 100644 index 00000000000..bca14d27eed --- /dev/null +++ b/src/mame/includes/drmicro.h @@ -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 ); diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 0144b9593ff..ad0ff6994bc 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -603,7 +603,7 @@ $(MAMEOBJ)/dynax.a: \ $(DRIVERS)/royalmah.o \ $(MAMEOBJ)/edevices.a: \ - $(DRIVERS)/diverboy.o $(VIDEO)/diverboy.o \ + $(DRIVERS)/diverboy.o \ $(DRIVERS)/fantland.o $(VIDEO)/fantland.o \ $(DRIVERS)/mwarr.o \ $(DRIVERS)/mugsmash.o $(VIDEO)/mugsmash.o \ diff --git a/src/mame/video/deniam.c b/src/mame/video/deniam.c index 3207a31a003..ba46e9e5175 100644 --- a/src/mame/video/deniam.c +++ b/src/mame/video/deniam.c @@ -1,44 +1,51 @@ #include "driver.h" +#include "deniam.h" -UINT16 *deniam_videoram,*deniam_textram; -static int display_enable; -static int bg_scrollx_offs,bg_scrolly_offs,fg_scrollx_offs,fg_scrolly_offs; -static int bg_scrollx_reg,bg_scrolly_reg,bg_page_reg; -static int fg_scrollx_reg,fg_scrolly_reg,fg_page_reg; -static int bg_page[4],fg_page[4]; +static void deniam_common_init( running_machine *machine ) +{ + deniam_state *state = (deniam_state *)machine->driver_data; + int i; -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 ) { - bg_scrollx_reg = 0x00a4/2; - 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; + deniam_state *state = (deniam_state *)machine->driver_data; - bg_scrollx_offs = 0x00d; - bg_scrolly_offs = 0x000; - fg_scrollx_offs = 0x009; - fg_scrolly_offs = 0x000; + deniam_common_init(machine); + + state->bg_scrollx_offs = 0x00d; + state->bg_scrolly_offs = 0x000; + state->fg_scrollx_offs = 0x009; + state->fg_scrolly_offs = 0x000; } + DRIVER_INIT( karianx ) { - bg_scrollx_reg = 0x00a4/2; - 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; + deniam_state *state = (deniam_state *)machine->driver_data; - bg_scrollx_offs = 0x10d; - bg_scrolly_offs = 0x080; - fg_scrollx_offs = 0x109; - fg_scrolly_offs = 0x080; + deniam_common_init(machine); + + state->bg_scrollx_offs = 0x10d; + 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 ) { + deniam_state *state = (deniam_state *)machine->driver_data; 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( 0, attr, @@ -68,8 +76,9 @@ static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_fg_tile_info ) { + deniam_state *state = (deniam_state *)machine->driver_data; 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( 0, attr, @@ -79,7 +88,8 @@ static TILE_GET_INFO( get_fg_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( 0, attr & 0xf1ff, @@ -97,12 +107,13 @@ static TILE_GET_INFO( get_tx_tile_info ) VIDEO_START( deniam ) { - bg_tilemap = tilemap_create(machine, get_bg_tile_info,scan_pages, 8,8,128,64); - fg_tilemap = tilemap_create(machine, get_fg_tile_info,scan_pages, 8,8,128,64); - tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows,8,8, 64,32); + deniam_state *state = (deniam_state *)machine->driver_data; + state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, scan_pages, 8, 8, 128, 64); + 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(tx_tilemap,0); + tilemap_set_transparent_pen(state->fg_tilemap, 0); + tilemap_set_transparent_pen(state->tx_tilemap, 0); } @@ -115,56 +126,58 @@ VIDEO_START( deniam ) WRITE16_HANDLER( deniam_videoram_w ) { - int page,i; - COMBINE_DATA(&deniam_videoram[offset]); + deniam_state *state = (deniam_state *)space->machine->driver_data; + int page, i; + COMBINE_DATA(&state->videoram[offset]); page = offset >> 11; - for (i = 0;i < 4;i++) + for (i = 0; i < 4; i++) { - if (bg_page[i] == page) - tilemap_mark_tile_dirty(bg_tilemap,i * 0x800 + (offset & 0x7ff)); - if (fg_page[i] == page) - tilemap_mark_tile_dirty(fg_tilemap,i * 0x800 + (offset & 0x7ff)); + if (state->bg_page[i] == page) + tilemap_mark_tile_dirty(state->bg_tilemap, i * 0x800 + (offset & 0x7ff)); + if (state->fg_page[i] == page) + tilemap_mark_tile_dirty(state->fg_tilemap, i * 0x800 + (offset & 0x7ff)); } } WRITE16_HANDLER( deniam_textram_w ) { - COMBINE_DATA(&deniam_textram[offset]); - tilemap_mark_tile_dirty(tx_tilemap,offset); + deniam_state *state = (deniam_state *)space->machine->driver_data; + COMBINE_DATA(&state->textram[offset]); + tilemap_mark_tile_dirty(state->tx_tilemap, offset); } 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); g = ((data >> 3) & 0x1e) | ((data >> 13) & 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 ) { - return coinctrl; + deniam_state *state = (deniam_state *)space->machine->driver_data; + return state->coinctrl; } 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 */ - coin_counter_w(0,coinctrl & 0x01); + coin_counter_w(0, state->coinctrl & 0x01); /* bit 6 is display enable (0 freezes screen) */ - display_enable = coinctrl & 0x20; + state->display_enable = state->coinctrl & 0x20; /* other bits unknown (unused?) */ } @@ -201,46 +214,47 @@ WRITE16_HANDLER( deniam_coinctrl_w ) * c | ---------------- | zoomy like in System 16? * 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; 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; - sx = (spriteram16[offs+1] & 0x01ff) + 16*8 - 1; + sx = (state->spriteram[offs + 1] & 0x01ff) + 16 * 8 - 1; if (sx >= 512) sx -= 512; - starty = spriteram16[offs+0] & 0xff; - endy = spriteram16[offs+0] >> 8; + starty = state->spriteram[offs + 0] & 0xff; + endy = state->spriteram[offs + 0] >> 8; - width = spriteram16[offs+2] & 0x007f; - flipx = spriteram16[offs+2] & 0x0100; + width = state->spriteram[offs + 2] & 0x007f; + flipx = state->spriteram[offs + 2] & 0x0100; if (flipx) sx++; - color = 0x40 + (spriteram16[offs+4] & 0x3f); + color = 0x40 + (state->spriteram[offs + 4] & 0x3f); primask = 8; - switch (spriteram16[offs+4] & 0xc0) + switch (state->spriteram[offs + 4] & 0xc0) { - case 0x00: primask |= 4|2|1; break; /* below everything */ - case 0x40: primask |= 4|2; break; /* below fg and tx */ - case 0x80: primask |= 4; break; /* below tx */ - case 0xc0: break; /* above everything */ + case 0x00: primask |= 4 | 2 | 1; break; /* below everything */ + case 0x40: primask |= 4 | 2; break; /* below fg and tx */ + case 0x80: primask |= 4; break; /* below tx */ + case 0xc0: break; /* above everything */ } - start = spriteram16[offs+3] + ((spriteram16[offs+4] & 0x1f00) << 8); - rom += 2*start; + start = state->spriteram[offs + 3] + ((state->spriteram[offs + 4] & 0x1f00) << 8); + rom += 2 * start; - for (y = starty+1;y <= endy;y++) + for (y = starty + 1; y <= endy; y++) { 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; 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 (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) { - if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]&0x0f); - *BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; + if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0) + *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] & 0x0f); + *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8; } } x++; @@ -275,12 +289,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta { 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) { - if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]>>4); - *BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; + if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0) + *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16+(rom[i] >> 4); + *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8; } } x++; @@ -299,12 +313,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta { 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) { - if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]>>4); - *BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; + if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0) + *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] >> 4); + *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8; } } x++; @@ -319,12 +333,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta { 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) { - if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx+x) = color*16+(rom[i]&0x0f); - *BITMAP_ADDR8(machine->priority_bitmap, y, sx+x) = 8; + if ((*BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) & primask) == 0) + *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] & 0x0f); + *BITMAP_ADDR8(machine->priority_bitmap, y, sx + x) = 8; } } 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; - if (bg_page[page] != value) + if (state->bg_page[page] != value) { - bg_page[page] = value; - for (tile_index = page * 0x800;tile_index < (page+1)*0x800;tile_index++) - tilemap_mark_tile_dirty(bg_tilemap,tile_index); + state->bg_page[page] = value; + for (tile_index = page * 0x800; tile_index < (page + 1) * 0x800; 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; - if (fg_page[page] != value) + if (state->fg_page[page] != value) { - fg_page[page] = value; - for (tile_index = page * 0x800;tile_index < (page+1)*0x800;tile_index++) - tilemap_mark_tile_dirty(fg_tilemap,tile_index); + state->fg_page[page] = value; + for (tile_index = page * 0x800; tile_index < (page + 1) * 0x800; tile_index++) + tilemap_mark_tile_dirty(state->fg_tilemap, tile_index); } } 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; + 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; - bg_scrolly = (deniam_textram[bg_scrolly_reg] & 0xff) - bg_scrolly_offs; - page = deniam_textram[bg_page_reg]; - set_bg_page(3,(page >>12) & 0x0f); - set_bg_page(2,(page >> 8) & 0x0f); - set_bg_page(1,(page >> 4) & 0x0f); - set_bg_page(0,(page >> 0) & 0x0f); + fg_scrollx = state->textram[state->fg_scrollx_reg] - state->fg_scrollx_offs; + fg_scrolly = (state->textram[state->fg_scrolly_reg] & 0xff) - state->fg_scrolly_offs; + page = state->textram[state->fg_page_reg]; + set_fg_page(screen->machine, 3, (page >>12) & 0x0f); + set_fg_page(screen->machine, 2, (page >> 8) & 0x0f); + set_fg_page(screen->machine, 1, (page >> 4) & 0x0f); + set_fg_page(screen->machine, 0, (page >> 0) & 0x0f); - fg_scrollx = deniam_textram[fg_scrollx_reg] - fg_scrollx_offs; - fg_scrolly = (deniam_textram[fg_scrolly_reg] & 0xff) - fg_scrolly_offs; - page = deniam_textram[fg_page_reg]; - set_fg_page(3,(page >>12) & 0x0f); - set_fg_page(2,(page >> 8) & 0x0f); - set_fg_page(1,(page >> 4) & 0x0f); - set_fg_page(0,(page >> 0) & 0x0f); + tilemap_set_scrollx(state->bg_tilemap, 0, bg_scrollx & 0x1ff); + tilemap_set_scrolly(state->bg_tilemap, 0, bg_scrolly & 0x0ff); + tilemap_set_scrollx(state->fg_tilemap, 0, fg_scrollx & 0x1ff); + tilemap_set_scrolly(state->fg_tilemap, 0, fg_scrolly & 0x0ff); - tilemap_set_scrollx(bg_tilemap,0,bg_scrollx & 0x1ff); - 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); - 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); - tilemap_draw(bitmap,cliprect,fg_tilemap,0,2); - tilemap_draw(bitmap,cliprect,tx_tilemap,0,4); - - draw_sprites(screen->machine,bitmap,cliprect); + draw_sprites(screen->machine, bitmap, cliprect); return 0; } diff --git a/src/mame/video/diverboy.c b/src/mame/video/diverboy.c deleted file mode 100644 index 1ac430e9ab8..00000000000 --- a/src/mame/video/diverboy.c +++ /dev/null @@ -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; -} diff --git a/src/mame/video/dragrace.c b/src/mame/video/dragrace.c index 6fc2731b8a1..962827236bc 100644 --- a/src/mame/video/dragrace.c +++ b/src/mame/video/dragrace.c @@ -7,25 +7,18 @@ Atari Drag Race video emulation #include "driver.h" #include "includes/dragrace.h" -UINT8* dragrace_playfield_ram; -UINT8* dragrace_position_ram; - -static tilemap* bg_tilemap; - 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 col = 0; num = code & 0x1f; if ((code & 0xc0) == 0x40) - { num |= 0x20; - } switch (code & 0xA0) { @@ -49,33 +42,34 @@ static TILE_GET_INFO( get_tile_info ) VIDEO_START( dragrace ) { - bg_tilemap = tilemap_create(machine, - get_tile_info, tilemap_scan_rows, 16, 16, 16, 16); + dragrace_state *state = (dragrace_state *)machine->driver_data; + state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 16, 16, 16, 16); } VIDEO_UPDATE( dragrace ) { + dragrace_state *state = (dragrace_state *)screen->machine->driver_data; int y; - tilemap_mark_all_tiles_dirty(bg_tilemap); + tilemap_mark_all_tiles_dirty(state->bg_tilemap); for (y = 0; y < 256; y += 4) { rectangle rect = *cliprect; - int xl = dragrace_position_ram[y + 0] & 15; - int xh = dragrace_position_ram[y + 1] & 15; - int yl = dragrace_position_ram[y + 2] & 15; - int yh = dragrace_position_ram[y + 3] & 15; + int xl = state->position_ram[y + 0] & 15; + int xh = state->position_ram[y + 1] & 15; + int yl = state->position_ram[y + 2] & 15; + int yh = state->position_ram[y + 3] & 15; - tilemap_set_scrollx(bg_tilemap, 0, 16 * xh + xl - 8); - tilemap_set_scrolly(bg_tilemap, 0, 16 * yh + yl); + tilemap_set_scrollx(state->bg_tilemap, 0, 16 * xh + xl - 8); + tilemap_set_scrolly(state->bg_tilemap, 0, 16 * yh + yl); if (rect.min_y < y + 0) rect.min_y = y + 0; 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; } diff --git a/src/mame/video/dribling.c b/src/mame/video/dribling.c index b7d50865b1f..a1123cd4714 100644 --- a/src/mame/video/dribling.c +++ b/src/mame/video/dribling.c @@ -30,7 +30,7 @@ PALETTE_INIT( dribling ) g *= 0x55; 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 ) { + dribling_state *state = (dribling_state *)space->machine->driver_data; + /* 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 ) { + dribling_state *state = (dribling_state *)screen->machine->driver_data; UINT8 *prombase = memory_region(screen->machine, "proms"); UINT8 *gfxbase = memory_region(screen->machine, "gfx1"); int x, y; @@ -71,11 +74,11 @@ VIDEO_UPDATE( dribling ) for (x = cliprect->min_x; x <= cliprect->max_x; x++) { int b7 = prombase[(x >> 3) | ((y >> 3) << 5)] & 1; - int b6 = dribling_abca; + int b6 = state->abca; int b5 = (x >> 3) & 1; int b4 = (gfxbase[(x >> 3) | (y << 5)] >> (x & 7)) & 1; - int b3 = (videoram[(x >> 3) | (y << 5)] >> (x & 7)) & 1; - int b2_0 = colorram[(x >> 3) | ((y >> 2) << 7)] & 7; + int b3 = (state->videoram[(x >> 3) | (y << 5)] >> (x & 7)) & 1; + int b2_0 = state->colorram[(x >> 3) | ((y >> 2) << 7)] & 7; /* assemble the various bits into a palette PROM index */ dst[x] = (b7 << 7) | (b6 << 6) | (b5 << 5) | (b4 << 4) | (b3 << 3) | b2_0; diff --git a/src/mame/video/drmicro.c b/src/mame/video/drmicro.c index 3294d4bc53a..5efe1ed2a26 100644 --- a/src/mame/video/drmicro.c +++ b/src/mame/video/drmicro.c @@ -8,29 +8,20 @@ Video hardware *******************************************************************************/ #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 ) { - drmicro_videoram[offset] = data; + drmicro_state *state = (drmicro_state *)space->machine->driver_data; + state->videoram[offset] = data; - if (offset<0x800) - tilemap_mark_tile_dirty(drmicro_bg2,(offset & 0x3ff)); + if (offset < 0x800) + tilemap_mark_tile_dirty(state->bg2, (offset & 0x3ff)); 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 ) { - int code,col,flags; + drmicro_state *state = (drmicro_state *)machine->driver_data; + int code, col, flags; - code = drmicro_videoram[tile_index + 0x0800]; - col = drmicro_videoram[tile_index + 0x0c00]; + code = state->videoram[tile_index + 0x0800]; + col = state->videoram[tile_index + 0x0c00]; code += (col & 0xc0) << 2; 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 ) { - int code,col,flags; + drmicro_state *state = (drmicro_state *)machine->driver_data; + int code, col, flags; - code = drmicro_videoram[tile_index + 0x0000]; - col = drmicro_videoram[tile_index + 0x0400]; + code = state->videoram[tile_index + 0x0000]; + col = state->videoram[tile_index + 0x0400]; code += (col & 0xc0) << 2; flags = ((col & 0x20) ? TILEMAP_FLIPY : 0) | ((col & 0x10) ? TILEMAP_FLIPX : 0); @@ -112,47 +105,50 @@ PALETTE_INIT( 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); - drmicro_bg2 = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 8,8,32,32); + state->videoram = auto_alloc_array(machine, UINT8, 0x1000); + 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 ) { - int offs,adr,g; - int chr,col,attr; - int x,y,fx,fy; + drmicro_state *state = (drmicro_state *)screen->machine->driver_data; + int offs, adr, g; + int chr, col, attr; + int x, y, fx, fy; - tilemap_draw(bitmap, cliprect, drmicro_bg1, 0, 0); - tilemap_draw(bitmap, cliprect, drmicro_bg2, 0, 0); + tilemap_draw(bitmap, cliprect, state->bg1, 0, 0); + tilemap_draw(bitmap, cliprect, state->bg2, 0, 0); /* 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]; - y = drmicro_videoram[offs + adr + 0]; - attr = drmicro_videoram[offs + adr + 2]; - chr = drmicro_videoram[offs + adr + 1]; + x = state->videoram[offs + adr + 3]; + y = state->videoram[offs + adr + 0]; + attr = state->videoram[offs + adr + 2]; + chr = state->videoram[offs + adr + 1]; - fx = (chr & 0x01) ^ flipscreen; - fy = ((chr & 0x02) >> 1) ^ flipscreen; + fx = (chr & 0x01) ^ state->flipscreen; + fy = ((chr & 0x02) >> 1) ^ state->flipscreen; - chr = (chr >> 2) | (attr & 0xc0); + chr = (chr >> 2) | (attr & 0xc0); col = (attr & 0x0f) + 0x00; - if (!flipscreen) - y = (240-y) & 0xff; + if (!state->flipscreen) + y = (240 - y) & 0xff; else - x = (240-x) & 0xff; + x = (240 - x) & 0xff; drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[3-g], chr, @@ -160,7 +156,7 @@ VIDEO_UPDATE( drmicro ) fx,fy, x,y,0); - if (x>240) + if (x > 240) { drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[3-g], chr, @@ -172,4 +168,3 @@ VIDEO_UPDATE( drmicro ) } return 0; } -