From 6ad7e040ecb9cc0ae3cea398dfa86f5bd0226036 Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Wed, 2 Dec 2009 22:39:48 +0000 Subject: [PATCH] Added shared driver data struct to 40love.c, bking.c, buggychl.c and msisaac.c (they use the same mcu emulation) As a result, bking.c, buggychl.c and msisaac.c now support save states (40love.c already did, even if mcu values were not saved) --- src/mame/drivers/40love.c | 501 ++++++++++++++++++++--------------- src/mame/drivers/bking.c | 275 ++++++++++++------- src/mame/drivers/buggychl.c | 129 ++++++--- src/mame/drivers/msisaac.c | 222 ++++++++++------ src/mame/includes/buggychl.h | 173 ++++++++++-- src/mame/machine/buggychl.c | 123 ++++----- src/mame/video/40love.c | 251 +++++++++--------- src/mame/video/bking.c | 188 +++++++------ src/mame/video/buggychl.c | 162 +++++------ src/mame/video/msisaac.c | 147 +++++----- 10 files changed, 1309 insertions(+), 862 deletions(-) diff --git a/src/mame/drivers/40love.c b/src/mame/drivers/40love.c index b91a26bcca3..2382b33e1b2 100644 --- a/src/mame/drivers/40love.c +++ b/src/mame/drivers/40love.c @@ -225,49 +225,35 @@ Notes - Has jumper setting for 122HZ or 61HZ) #include "sound/msm5232.h" #include "includes/buggychl.h" -extern VIDEO_START( fortyl ); -extern VIDEO_UPDATE( fortyl ); -extern PALETTE_INIT( fortyl ); - -extern WRITE8_HANDLER( fortyl_bg_videoram_w ); -extern WRITE8_HANDLER( fortyl_bg_colorram_w ); -extern READ8_HANDLER ( fortyl_bg_videoram_r ); -extern READ8_HANDLER ( fortyl_bg_colorram_r ); -extern WRITE8_HANDLER( fortyl_pixram_sel_w ); -extern READ8_HANDLER( fortyl_pixram_r ); -extern WRITE8_HANDLER( fortyl_pixram_w ); - -extern UINT8 *fortyl_video_ctrl; -extern int fortyl_pix_color[4]; - -static UINT8 *undoukai_ram; - -static int sound_nmi_enable,pending_nmi; - static TIMER_CALLBACK( nmi_callback ) { - if (sound_nmi_enable) cputag_set_input_line(machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); - else pending_nmi = 1; + buggychl_state *state = (buggychl_state *)machine->driver_data; + if (state->sound_nmi_enable) + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); + else + state->pending_nmi = 1; } static WRITE8_HANDLER( sound_command_w ) { - soundlatch_w(space,0,data); - timer_call_after_resynch(space->machine, NULL, data,nmi_callback); + soundlatch_w(space, 0, data); + timer_call_after_resynch(space->machine, NULL, data, nmi_callback); } static WRITE8_HANDLER( nmi_disable_w ) { - sound_nmi_enable = 0; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 0; } static WRITE8_HANDLER( nmi_enable_w ) { - sound_nmi_enable = 1; - if (pending_nmi) + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 1; + if (state->pending_nmi) { - cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); - pending_nmi = 0; + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); + state->pending_nmi = 0; } } @@ -283,64 +269,64 @@ static WRITE8_HANDLER( fortyl_coin_counter_w ) static READ8_HANDLER( fortyl_mcu_r ) { - return buggychl_mcu_r(space,offset); + return buggychl_mcu_r(space, offset); } static READ8_HANDLER( fortyl_mcu_status_r ) { - return buggychl_mcu_status_r(space,offset); + return buggychl_mcu_status_r(space, offset); } static WRITE8_HANDLER( fortyl_mcu_w ) { - buggychl_mcu_w(space,offset,data); + buggychl_mcu_w(space, offset, data); } static WRITE8_HANDLER( bank_select_w ) { - if ((data!=0x02) && (data!=0xfd)) + if ((data != 0x02) && (data != 0xfd)) { // logerror("WRONG BANK SELECT = %x !!!!\n",data); // popmessage("WRONG BANK SELECT = %x !!!!\n",data); } - memory_set_bank(space->machine, 1, data&1 ); + memory_set_bank(space->machine, 1, data & 1); } - -static UINT8 pix1; -static UINT8 pix2[2]; - static WRITE8_HANDLER( pix1_w ) { -// if ( data > 7 ) -// logerror("pix1 = %2x\n",data); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; +// if (data > 7) +// logerror("pix1 = %2x\n", data); - pix1 = data; + state->pix1 = data; } static WRITE8_HANDLER( pix2_w ) { -// if ( (data!=0x00) && (data!=0xff) ) -// logerror("pix2 = %2x\n",data); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; +// if ((data!=0x00) && (data != 0xff)) +// logerror("pix2 = %2x\n", data); - pix2[0] = pix2[1]; - pix2[1] = data; + state->pix2[0] = state->pix2[1]; + state->pix2[1] = data; } #if 0 static READ8_HANDLER( pix1_r ) { - return pix1; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return state->pix1; } #endif static READ8_HANDLER( pix2_r ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; int res; - int d1 = pix1 & 7; + int d1 = state->pix1 & 7; - res = (((pix2[1] << (d1+8)) | (pix2[0] << d1)) & 0xff00) >> 8; + res = (((state->pix2[1] << (d1 + 8)) | (state->pix2[0] << d1)) & 0xff00) >> 8; return res; } @@ -350,11 +336,6 @@ static READ8_HANDLER( pix2_r ) fake MCU (undoukai and field day) ****************************************************************************/ -static int from_mcu; -static int mcu_cmd; - -static UINT8 mcu_in[2][16],mcu_out[2][16]; - static const UINT8 mcu_data0[0x80] = { 0x0a,0x08,0x0f,0x07,0x06,0x05,0x04,0x00, @@ -419,18 +400,18 @@ static const UINT8 mcu_data2[0x80] = static WRITE8_HANDLER( undoukai_mcu_w ) { - int ram_adr = undoukai_ram[0x1b5]*0x100 + undoukai_ram[0x1b4]; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + int ram_adr = state->mcu_ram[0x1b5] * 0x100 + state->mcu_ram[0x1b4]; - int d; - int i; + int d, i; -// logerror("mcu_w %02x\n",data); + // logerror("mcu_w %02x\n", data); - if (mcu_cmd != -1) + if (state->mcu_cmd != -1) { - mcu_in[(mcu_cmd & 0x10)>>4][mcu_cmd & 0x0f] = data; - mcu_cmd = -1; + state->mcu_in[(state->mcu_cmd & 0x10) >> 4][state->mcu_cmd & 0x0f] = data; + state->mcu_cmd = -1; } else { @@ -444,17 +425,16 @@ static WRITE8_HANDLER( undoukai_mcu_w ) case 0xc5: case 0xc6: case 0xc7: - mcu_cmd = (data & 0x0f) | 0x10; + state->mcu_cmd = (data & 0x0f) | 0x10; break; case 0xb0: case 0xb1: case 0xb2: case 0xb3: - mcu_cmd = data & 0x0f; + state->mcu_cmd = data & 0x0f; break; - case 0x30: case 0x31: case 0x32: @@ -465,96 +445,96 @@ static WRITE8_HANDLER( undoukai_mcu_w ) case 0x37: case 0x38: case 0x39: - from_mcu = mcu_out[0][data & 0x0f]; + state->from_mcu = state->mcu_out[0][data & 0x0f]; break; case 0x40: case 0x41: case 0x42: - from_mcu = mcu_out[1][data & 0x0f]; + state->from_mcu = state->mcu_out[1][data & 0x0f]; break; case 0x01: - mcu_out[0][0] = (mcu_in[0][0] ^ (mcu_in[0][0] >> 4)) & 0x0f; + state->mcu_out[0][0] = (state->mcu_in[0][0] ^ (state->mcu_in[0][0] >> 4)) & 0x0f; break; case 0x02: - if (mcu_in[0][3] != 0x00) + if (state->mcu_in[0][3] != 0x00) { - mcu_out[0][1] = 0x0c; - mcu_out[0][2] = 0x00; + state->mcu_out[0][1] = 0x0c; + state->mcu_out[0][2] = 0x00; } else { - mcu_out[0][2] = 0xa2; - switch (mcu_in[0][0] & 0x03) + state->mcu_out[0][2] = 0xa2; + switch (state->mcu_in[0][0] & 0x03) { - case 0: mcu_out[0][1] = 0x55; break; - case 1: mcu_out[0][1] = 0x3d; break; - case 2: mcu_out[0][1] = 0x45; break; - case 3: mcu_out[0][1] = 0x4d; break; + case 0: state->mcu_out[0][1] = 0x55; break; + case 1: state->mcu_out[0][1] = 0x3d; break; + case 2: state->mcu_out[0][1] = 0x45; break; + case 3: state->mcu_out[0][1] = 0x4d; break; } } break; case 0x03: - mcu_out[0][1] = (((mcu_in[0][0] * 8) & 0x38) -1) & 0xff ; + state->mcu_out[0][1] = (((state->mcu_in[0][0] * 8) & 0x38) -1) & 0xff ; - if (mcu_in[0][1] | mcu_in[0][2]) + if (state->mcu_in[0][1] | state->mcu_in[0][2]) d = 0x40; else d = 0x00; - for (i=0;i<8;i++) - mcu_out[0][i+2] = mcu_data0[((mcu_out[0][1] + i) & 0x3f) + d]; + for (i = 0; i < 8; i++) + state->mcu_out[0][i + 2] = mcu_data0[((state->mcu_out[0][1] + i) & 0x3f) + d]; break; case 0x04: - mcu_out[0][0] = ((mcu_in[0][0] & 0x0f) << 4) + (mcu_in[0][1] & 0x0f); - mcu_out[0][1] = ((mcu_in[0][2] & 0x0f) << 4) + (mcu_in[0][3] & 0x0f); + state->mcu_out[0][0] = ((state->mcu_in[0][0] & 0x0f) << 4) + (state->mcu_in[0][1] & 0x0f); + state->mcu_out[0][1] = ((state->mcu_in[0][2] & 0x0f) << 4) + (state->mcu_in[0][3] & 0x0f); break; case 0x05: -// mcu_out[0][0] = 255*cos(PI*mcu_in[0][0]/180); -// mcu_out[0][1] = 255*sin(PI*mcu_in[0][0]/180); +// state->mcu_out[0][0] = 255 * cos(PI * state->mcu_in[0][0] / 180); +// state->mcu_out[0][1] = 255 * sin(PI * state->mcu_in[0][0] / 180); - d = mcu_in[0][0] & 0x7f; - mcu_out[0][0] = mcu_data1[d]; - mcu_out[0][1] = mcu_data2[d]; + d = state->mcu_in[0][0] & 0x7f; + state->mcu_out[0][0] = mcu_data1[d]; + state->mcu_out[0][1] = mcu_data2[d]; break; case 0x06: - if (mcu_in[0][0] != 0x00) - mcu_out[0][0] = 0xfa; + if (state->mcu_in[0][0] != 0x00) + state->mcu_out[0][0] = 0xfa; else - switch (mcu_in[0][1]) + switch (state->mcu_in[0][1]) { - case 0x00: mcu_out[0][0] = 0x02; break; - case 0x01: mcu_out[0][0] = 0x01; break; - case 0x02: mcu_out[0][0] = 0x01; break; - case 0x03: mcu_out[0][0] = 0x04; break; - case 0x04: mcu_out[0][0] = 0x01; break; - case 0x05: mcu_out[0][0] = 0x14; break; - case 0x06: mcu_out[0][0] = 0x14; break; - case 0x07: mcu_out[0][0] = 0xb6; break; + case 0x00: state->mcu_out[0][0] = 0x02; break; + case 0x01: state->mcu_out[0][0] = 0x01; break; + case 0x02: state->mcu_out[0][0] = 0x01; break; + case 0x03: state->mcu_out[0][0] = 0x04; break; + case 0x04: state->mcu_out[0][0] = 0x01; break; + case 0x05: state->mcu_out[0][0] = 0x14; break; + case 0x06: state->mcu_out[0][0] = 0x14; break; + case 0x07: state->mcu_out[0][0] = 0xb6; break; default: - // popmessage("cmd06: %02x %02x",mcu_in[0][0],mcu_in[0][1]); - logerror("cmd06: %02x %02x\n",mcu_in[0][0],mcu_in[0][1]); + // popmessage("cmd06: %02x %02x", state->mcu_in[0][0], state->mcu_in[0][1]); + logerror("cmd06: %02x %02x\n", state->mcu_in[0][0], state->mcu_in[0][1]); } break; case 0x07: - switch (mcu_in[0][0] & 7) + switch (state->mcu_in[0][0] & 7) { - case 0: mcu_out[0][0] = 0x1d; break; - case 1: mcu_out[0][0] = 0x1b; break; - case 2: mcu_out[0][0] = 0x15; break; - case 3: mcu_out[0][0] = 0x13; break; - case 4: mcu_out[0][0] = 0x25; break; - case 5: mcu_out[0][0] = 0x23; break; - case 6: mcu_out[0][0] = 0xff; break; - case 7: mcu_out[0][0] = 0xff; break; + case 0: state->mcu_out[0][0] = 0x1d; break; + case 1: state->mcu_out[0][0] = 0x1b; break; + case 2: state->mcu_out[0][0] = 0x15; break; + case 3: state->mcu_out[0][0] = 0x13; break; + case 4: state->mcu_out[0][0] = 0x25; break; + case 5: state->mcu_out[0][0] = 0x23; break; + case 6: state->mcu_out[0][0] = 0xff; break; + case 7: state->mcu_out[0][0] = 0xff; break; } break; @@ -563,27 +543,28 @@ static WRITE8_HANDLER( undoukai_mcu_w ) if(ram_adr >= 0xa000 && ram_adr < 0xa800) { ram_adr = ram_adr - 0xa000; - mcu_out[1][0] = undoukai_ram[ram_adr]; - mcu_out[1][1] = undoukai_ram[ram_adr+1]; - mcu_out[1][2] = undoukai_ram[ram_adr+2] & 0x0f; + state->mcu_out[1][0] = state->mcu_ram[ram_adr]; + state->mcu_out[1][1] = state->mcu_ram[ram_adr + 1]; + state->mcu_out[1][2] = state->mcu_ram[ram_adr + 2] & 0x0f; } break; default: - from_mcu = 0x5d; + state->from_mcu = 0x5d; -// popmessage("unknown cmd%02x: %02x %02x %02x %02x",data,mcu_in[0][0],mcu_in[0][1],mcu_in[0][2],mcu_in[0][3]); -// logerror("unknown cmd%02x: %02x %02x %02x %02x\n",data,mcu_in[0][0],mcu_in[0][1],mcu_in[0][2],mcu_in[0][3]); +// popmessage("unknown cmd%02x: %02x %02x %02x %02x", data, state->mcu_in[0][0], state->mcu_in[0][1], state->mcu_in[0][2], state->mcu_in[0][3]); +// logerror("unknown cmd%02x: %02x %02x %02x %02x\n", data, state->mcu_in[0][0], state->mcu_in[0][1], state->mcu_in[0][2], state->mcu_in[0][3]); } } } static READ8_HANDLER( undoukai_mcu_r ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; -// logerror("mcu_r %02x\n",from_mcu); + // logerror("mcu_r %02x\n", state->from_mcu); - return from_mcu; + return state->from_mcu; } static READ8_HANDLER( undoukai_mcu_status_r ) @@ -597,20 +578,19 @@ static READ8_HANDLER( undoukai_mcu_status_r ) static DRIVER_INIT( undoukai ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; UINT8 *ROM = memory_region(machine, "maincpu"); memory_configure_bank(machine, 1, 0, 2, &ROM[0x10000], 0x2000); - from_mcu = 0xff; - mcu_cmd = -1; - - fortyl_pix_color[0] = 0x000; - fortyl_pix_color[1] = 0x1e3; - fortyl_pix_color[2] = 0x16c; - fortyl_pix_color[3] = 0x1ec; + state->pix_color[0] = 0x000; + state->pix_color[1] = 0x1e3; + state->pix_color[2] = 0x16c; + state->pix_color[3] = 0x1ec; } static DRIVER_INIT( 40love ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; UINT8 *ROM = memory_region(machine, "maincpu"); memory_configure_bank(machine, 1, 0, 2, &ROM[0x10000], 0x2000); @@ -620,38 +600,38 @@ static DRIVER_INIT( 40love ) UINT8 *ROM = memory_region(machine, "gfx2"); int adr = 0x10 * 0x022b; - ROM[adr+0x000a] = 0x00; - ROM[adr+0x000b] = 0x00; - ROM[adr+0x400a] = 0x00; - ROM[adr+0x400b] = 0x00; + ROM[adr + 0x000a] = 0x00; + ROM[adr + 0x000b] = 0x00; + ROM[adr + 0x400a] = 0x00; + ROM[adr + 0x400b] = 0x00; #endif - fortyl_pix_color[0] = 0x000; - fortyl_pix_color[1] = 0x1e3; - fortyl_pix_color[2] = 0x16c; - fortyl_pix_color[3] = 0x1ec; + state->pix_color[0] = 0x000; + state->pix_color[1] = 0x1e3; + state->pix_color[2] = 0x16c; + state->pix_color[3] = 0x1ec; } /***************************************************************************/ -static UINT8 snd_data; -static UINT8 snd_flag; - static READ8_HANDLER( from_snd_r ) { - snd_flag = 0; - return snd_data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->snd_flag = 0; + return state->snd_data; } static READ8_HANDLER( snd_flag_r ) { - return snd_flag | 0xfd; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return state->snd_flag | 0xfd; } static WRITE8_HANDLER( to_main_w ) { - snd_data = data; - snd_flag = 2; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->snd_data = data; + state->snd_flag = 2; } /***************************************************************************/ @@ -672,11 +652,11 @@ static ADDRESS_MAP_START( 40love_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x880b, 0x880b) AM_READ_PORT("P2") AM_RANGE(0x880c, 0x880c) AM_READ_PORT("DSW1") AM_WRITE(fortyl_pixram_sel_w) /* pixram bank select */ AM_RANGE(0x880d, 0x880d) AM_READ_PORT("DSW2") AM_WRITENOP /* unknown */ - AM_RANGE(0x9000, 0x97ff) AM_READWRITE(fortyl_bg_videoram_r, fortyl_bg_videoram_w) AM_BASE_GENERIC(videoram) /* #1 M5517P on video board */ - AM_RANGE(0x9800, 0x983f) AM_RAM AM_BASE(&fortyl_video_ctrl) /* video control area */ - AM_RANGE(0x9840, 0x987f) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprites part 1 */ - AM_RANGE(0x9880, 0x98bf) AM_READWRITE(fortyl_bg_colorram_r, fortyl_bg_colorram_w) AM_BASE_GENERIC(colorram) /* background attributes (2 bytes per line) */ - AM_RANGE(0x98c0, 0x98ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram2)/* sprites part 2 */ + AM_RANGE(0x9000, 0x97ff) AM_READWRITE(fortyl_bg_videoram_r, fortyl_bg_videoram_w) AM_BASE_MEMBER(buggychl_state, videoram) /* #1 M5517P on video board */ + AM_RANGE(0x9800, 0x983f) AM_RAM AM_BASE_MEMBER(buggychl_state, video_ctrl) /* video control area */ + AM_RANGE(0x9840, 0x987f) AM_RAM AM_BASE_SIZE_MEMBER(buggychl_state, spriteram, spriteram_size) /* sprites part 1 */ + AM_RANGE(0x9880, 0x98bf) AM_READWRITE(fortyl_bg_colorram_r, fortyl_bg_colorram_w) AM_BASE_MEMBER(buggychl_state, colorram) /* background attributes (2 bytes per line) */ + AM_RANGE(0x98c0, 0x98ff) AM_RAM AM_BASE_SIZE_MEMBER(buggychl_state, spriteram2, spriteram2_size)/* sprites part 2 */ AM_RANGE(0xa000, 0xbfff) AM_ROMBANK(1) AM_RANGE(0xc000, 0xffff) AM_READWRITE(fortyl_pixram_r, fortyl_pixram_w) /* banked pixel layer */ ADDRESS_MAP_END @@ -684,7 +664,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( undoukai_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x9fff) AM_ROMBANK(1) - AM_RANGE(0xa000, 0xa7ff) AM_RAM AM_BASE(&undoukai_ram) /* M5517P on main board */ + AM_RANGE(0xa000, 0xa7ff) AM_RAM AM_BASE_MEMBER(buggychl_state, mcu_ram) /* M5517P on main board */ AM_RANGE(0xa800, 0xa800) AM_READWRITE(undoukai_mcu_r, undoukai_mcu_w) AM_RANGE(0xa801, 0xa801) AM_READWRITE(undoukai_mcu_status_r, pix1_w) //pixel layer related AM_RANGE(0xa802, 0xa802) AM_WRITE(bank_select_w) @@ -698,34 +678,32 @@ static ADDRESS_MAP_START( undoukai_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xa80b, 0xa80b) AM_READ_PORT("P2") AM_RANGE(0xa80c, 0xa80c) AM_READ_PORT("DSW1") AM_WRITE(fortyl_pixram_sel_w) /* pixram bank select */ AM_RANGE(0xa80d, 0xa80d) AM_READ_PORT("DSW2") AM_WRITENOP /* unknown */ - AM_RANGE(0xb000, 0xb7ff) AM_READWRITE(fortyl_bg_videoram_r, fortyl_bg_videoram_w) AM_BASE_GENERIC(videoram) /* #1 M5517P on video board */ - AM_RANGE(0xb800, 0xb83f) AM_RAM AM_BASE(&fortyl_video_ctrl) /* video control area */ - AM_RANGE(0xb840, 0xb87f) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprites part 1 */ - AM_RANGE(0xb880, 0xb8bf) AM_READWRITE(fortyl_bg_colorram_r, fortyl_bg_colorram_w) AM_BASE_GENERIC(colorram) /* background attributes (2 bytes per line) */ - AM_RANGE(0xb8e0, 0xb8ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram2) /* sprites part 2 */ + AM_RANGE(0xb000, 0xb7ff) AM_READWRITE(fortyl_bg_videoram_r, fortyl_bg_videoram_w) AM_BASE_MEMBER(buggychl_state, videoram) /* #1 M5517P on video board */ + AM_RANGE(0xb800, 0xb83f) AM_RAM AM_BASE_MEMBER(buggychl_state, video_ctrl) /* video control area */ + AM_RANGE(0xb840, 0xb87f) AM_RAM AM_BASE_SIZE_MEMBER(buggychl_state, spriteram, spriteram_size) /* sprites part 1 */ + AM_RANGE(0xb880, 0xb8bf) AM_READWRITE(fortyl_bg_colorram_r, fortyl_bg_colorram_w) AM_BASE_MEMBER(buggychl_state, colorram) /* background attributes (2 bytes per line) */ + AM_RANGE(0xb8e0, 0xb8ff) AM_RAM AM_BASE_SIZE_MEMBER(buggychl_state, spriteram2, spriteram2_size) /* sprites part 2 */ AM_RANGE(0xc000, 0xffff) AM_READWRITE(fortyl_pixram_r, fortyl_pixram_w) ADDRESS_MAP_END - -static int vol_ctrl[16]; - static MACHINE_RESET( ta7630 ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; int i; double db = 0.0; double db_step = 1.50; /* 1.50 dB step (at least, maybe more) */ double db_step_inc = 0.125; - for (i=0; i<16; i++) + for (i = 0; i < 16; i++) { - double max = 100.0 / pow(10.0, db/20.0 ); - vol_ctrl[ 15-i ] = max; - /*logerror("vol_ctrl[%x] = %i (%f dB)\n",15-i,vol_ctrl[ 15-i ],db);*/ + double max = 100.0 / pow(10.0, db/20.0); + state->vol_ctrl[15 - i] = max; + /*logerror("vol_ctrl[%x] = %i (%f dB)\n", 15 - i, state->vol_ctrl[15 - i], db);*/ db += db_step; db_step += db_step_inc; } - /* for (i=0; i<8; i++) + /* for (i = 0; i < 8; i++) logerror("SOUND Chan#%i name=%s\n", i, mixer_get_name(i) ); */ /* channels 0-2 AY#0 @@ -733,48 +711,46 @@ static MACHINE_RESET( ta7630 ) */ } -static UINT8 snd_ctrl0=0; -static UINT8 snd_ctrl1=0; -static UINT8 snd_ctrl2=0; -static UINT8 snd_ctrl3=0; - static WRITE8_DEVICE_HANDLER( sound_control_0_w ) { - snd_ctrl0 = data & 0xff; -// popmessage("SND0 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3); + buggychl_state *state = (buggychl_state *)device->machine->driver_data; + state->snd_ctrl0 = data & 0xff; +// popmessage("SND0 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3); /* this definitely controls main melody voice on 2'-1 and 4'-1 outputs */ - sound_set_output_gain(device, 0, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ - sound_set_output_gain(device, 1, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ - sound_set_output_gain(device, 2, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ - sound_set_output_gain(device, 3, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 0, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 1, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 2, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 3, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ } static WRITE8_DEVICE_HANDLER( sound_control_1_w ) { - snd_ctrl1 = data & 0xff; -// popmessage("SND1 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3); - sound_set_output_gain(device, 4, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ - sound_set_output_gain(device, 5, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ - sound_set_output_gain(device, 6, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ - sound_set_output_gain(device, 7, vol_ctrl[ (snd_ctrl1>>4) & 15 ] / 100.0); /* group2 from msm5232 */ + buggychl_state *state = (buggychl_state *)device->machine->driver_data; + state->snd_ctrl1 = data & 0xff; +// popmessage("SND1 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3); + sound_set_output_gain(device, 4, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ + sound_set_output_gain(device, 5, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ + sound_set_output_gain(device, 6, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ + sound_set_output_gain(device, 7, state->vol_ctrl[(state->snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ } static WRITE8_DEVICE_HANDLER( sound_control_2_w ) { + buggychl_state *state = (buggychl_state *)device->machine->driver_data; int i; + state->snd_ctrl2 = data & 0xff; +// popmessage("SND2 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3); - snd_ctrl2 = data & 0xff; -// popmessage("SND2 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3); - - for (i=0; i<3; i++) - sound_set_output_gain(device, i, vol_ctrl[ (snd_ctrl2>>4) & 15 ] / 100.0); /* ym2149f all */ + for (i = 0; i < 3; i++) + sound_set_output_gain(device, i, state->vol_ctrl[(state->snd_ctrl2 >> 4) & 15] / 100.0); /* ym2149f all */ } static WRITE8_DEVICE_HANDLER( sound_control_3_w ) /* unknown */ { - snd_ctrl3 = data & 0xff; -// popmessage("SND3 0=%02x 1=%02x 2=%02x 3=%02x", snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3); + buggychl_state *state = (buggychl_state *)device->machine->driver_data; + state->snd_ctrl3 = data & 0xff; +// popmessage("SND3 0=%02x 1=%02x 2=%02x 3=%02x", state->snd_ctrl0, state->snd_ctrl1, state->snd_ctrl2, state->snd_ctrl3); } static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) @@ -793,12 +769,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( mcu_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x7ff) - AM_RANGE(0x0000, 0x0000) AM_READWRITE(buggychl_68705_portA_r, buggychl_68705_portA_w) - AM_RANGE(0x0001, 0x0001) AM_READWRITE(buggychl_68705_portB_r, buggychl_68705_portB_w) - AM_RANGE(0x0002, 0x0002) AM_READWRITE(buggychl_68705_portC_r, buggychl_68705_portC_w) - AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddrA_w) - AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddrB_w) - AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddrC_w) + AM_RANGE(0x0000, 0x0000) AM_READWRITE(buggychl_68705_port_a_r, buggychl_68705_port_a_w) + AM_RANGE(0x0001, 0x0001) AM_READWRITE(buggychl_68705_port_b_r, buggychl_68705_port_b_w) + AM_RANGE(0x0002, 0x0002) AM_READWRITE(buggychl_68705_port_c_r, buggychl_68705_port_c_w) + AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddr_a_w) + AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddr_b_w) + AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddr_c_w) AM_RANGE(0x0010, 0x007f) AM_RAM AM_RANGE(0x0080, 0x07ff) AM_ROM ADDRESS_MAP_END @@ -1019,27 +995,135 @@ static const msm5232_interface msm5232_config = /*******************************************************************************/ +static MACHINE_START( common ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + state->audiocpu = devtag_get_device(machine, "audiocpu"); + state->mcu = devtag_get_device(machine, "mcu"); + + /* video */ + state_save_register_global(machine, state->pix1); + state_save_register_global_array(machine, state->pix2); + /* sound */ + state_save_register_global(machine, state->sound_nmi_enable); + state_save_register_global(machine, state->pending_nmi); + state_save_register_global(machine, state->snd_data); + state_save_register_global(machine, state->snd_flag); + state_save_register_global_array(machine, state->vol_ctrl); + state_save_register_global(machine, state->snd_ctrl0); + state_save_register_global(machine, state->snd_ctrl1); + state_save_register_global(machine, state->snd_ctrl2); + state_save_register_global(machine, state->snd_ctrl3); +} + static MACHINE_START( 40love ) { - state_save_register_global(machine, pix1); - state_save_register_global_array(machine, pix2); - state_save_register_global(machine, from_mcu); - state_save_register_global(machine, mcu_cmd); - state_save_register_global_array(machine, mcu_in[0]); - state_save_register_global_array(machine, mcu_in[1]); - state_save_register_global_array(machine, mcu_out[0]); - state_save_register_global_array(machine, mcu_out[1]); - state_save_register_global(machine, snd_data); - state_save_register_global(machine, snd_flag); - state_save_register_global_array(machine, vol_ctrl); - state_save_register_global(machine, snd_ctrl0); - state_save_register_global(machine, snd_ctrl1); - state_save_register_global(machine, snd_ctrl2); - state_save_register_global(machine, snd_ctrl3); + buggychl_state *state = (buggychl_state *)machine->driver_data; + + MACHINE_START_CALL(common); + + /* mcu */ + state_save_register_global(machine, state->from_main); + state_save_register_global(machine, state->from_mcu); + state_save_register_global(machine, state->mcu_sent); + state_save_register_global(machine, state->main_sent); + state_save_register_global(machine, state->port_a_in); + state_save_register_global(machine, state->port_a_out); + state_save_register_global(machine, state->ddr_a); + state_save_register_global(machine, state->port_b_in); + state_save_register_global(machine, state->port_b_out); + state_save_register_global(machine, state->ddr_b); + state_save_register_global(machine, state->port_c_in); + state_save_register_global(machine, state->port_c_out); + state_save_register_global(machine, state->ddr_c); +} + +static MACHINE_START( undoukai ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + MACHINE_START_CALL(common); + + /* fake mcu */ + state_save_register_global(machine, state->from_mcu); + state_save_register_global(machine, state->mcu_cmd); + state_save_register_global_array(machine, state->mcu_in[0]); + state_save_register_global_array(machine, state->mcu_in[1]); + state_save_register_global_array(machine, state->mcu_out[0]); + state_save_register_global_array(machine, state->mcu_out[1]); +} + +static MACHINE_RESET( common ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + MACHINE_RESET_CALL(ta7630); + + /* video */ + state->pix1 = 0; + state->pix2[0] = 0; + state->pix2[1] = 0; + /* sound */ + state->sound_nmi_enable = 0; + state->pending_nmi = 0; + state->snd_data = 0; + state->snd_flag = 0; + state->snd_ctrl0 = 0; + state->snd_ctrl1 = 0; + state->snd_ctrl2 = 0; + state->snd_ctrl3 = 0; +} + +static MACHINE_RESET( 40love ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + cputag_set_input_line(machine, "mcu", 0, CLEAR_LINE); + + MACHINE_RESET_CALL(common); + + /* mcu */ + state->mcu_sent = 0; + state->main_sent = 0; + state->from_main = 0; + state->from_mcu = 0; + state->port_a_in = 0; + state->port_a_out = 0; + state->ddr_a = 0; + state->port_b_in = 0; + state->port_b_out = 0; + state->ddr_b = 0; + state->port_c_in = 0; + state->port_c_out = 0; + state->ddr_c = 0; +} + +static MACHINE_RESET( undoukai ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + int i; + + MACHINE_RESET_CALL(common); + + /* fake mcu */ + state->from_mcu = 0xff; + state->mcu_cmd = -1; + + for (i = 0; i < 16; i++) + { + state->mcu_in[0][i] = 0; + state->mcu_in[1][i] = 0; + state->mcu_out[0][i] = 0; + state->mcu_out[1][i] = 0; + } } static MACHINE_DRIVER_START( 40love ) + /* driver data */ + MDRV_DRIVER_DATA(buggychl_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu",Z80,8000000/2) /* OK */ MDRV_CPU_PROGRAM_MAP(40love_map) @@ -1053,7 +1137,8 @@ static MACHINE_DRIVER_START( 40love ) MDRV_CPU_PROGRAM_MAP(mcu_map) MDRV_QUANTUM_TIME(HZ(6000)) /* high interleave to ensure proper synchronization of CPUs */ - MDRV_MACHINE_RESET(ta7630) /* init machine */ + MDRV_MACHINE_START(40love) + MDRV_MACHINE_RESET(40love) /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) @@ -1069,8 +1154,6 @@ static MACHINE_DRIVER_START( 40love ) MDRV_VIDEO_START(fortyl) MDRV_VIDEO_UPDATE(fortyl) - MDRV_MACHINE_START(40love) - /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") @@ -1098,6 +1181,9 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( undoukai ) + /* driver data */ + MDRV_DRIVER_DATA(buggychl_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu",Z80,8000000/2) MDRV_CPU_PROGRAM_MAP(undoukai_map) @@ -1110,7 +1196,8 @@ static MACHINE_DRIVER_START( undoukai ) // MDRV_CPU_ADD("mcu",M68705,18432000/6) // MDRV_CPU_PROGRAM_MAP(mcu_map) - MDRV_MACHINE_RESET(ta7630) /* init machine */ + MDRV_MACHINE_START(undoukai) + MDRV_MACHINE_RESET(undoukai) /* init machine */ /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) @@ -1126,8 +1213,6 @@ static MACHINE_DRIVER_START( undoukai ) MDRV_VIDEO_START(fortyl) MDRV_VIDEO_UPDATE(fortyl) - MDRV_MACHINE_START(40love) - /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/drivers/bking.c b/src/mame/drivers/bking.c index 04965250a94..e46d74ef789 100644 --- a/src/mame/drivers/bking.c +++ b/src/mame/drivers/bking.c @@ -22,71 +22,50 @@ DIP Locations verified for: #include "sound/dac.h" #include "includes/buggychl.h" -extern PALETTE_INIT( bking ); - -extern VIDEO_START( bking ); -extern VIDEO_UPDATE( bking ); -extern VIDEO_EOF( bking ); - -extern WRITE8_HANDLER( bking_xld1_w ); -extern WRITE8_HANDLER( bking_yld1_w ); -extern WRITE8_HANDLER( bking_xld2_w ); -extern WRITE8_HANDLER( bking_yld2_w ); -extern WRITE8_HANDLER( bking_xld3_w ); -extern WRITE8_HANDLER( bking_yld3_w ); -extern WRITE8_HANDLER( bking_msk_w ); -extern WRITE8_HANDLER( bking_cont1_w ); -extern WRITE8_HANDLER( bking_cont2_w ); -extern WRITE8_HANDLER( bking_cont3_w ); -extern WRITE8_HANDLER( bking_hitclr_w ); -extern WRITE8_HANDLER( bking_playfield_w ); - -extern READ8_HANDLER( bking_input_port_5_r ); -extern READ8_HANDLER( bking_input_port_6_r ); -extern READ8_HANDLER( bking_pos_r ); - -UINT8 *bking_playfield_ram; - -static int bking3_addr_h, bking3_addr_l; -static int sndnmi_enable; - static READ8_HANDLER( bking_sndnmi_disable_r ) { - sndnmi_enable = 0; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 0; return 0; } static WRITE8_HANDLER( bking_sndnmi_enable_w ) { - sndnmi_enable = 1; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 1; } static WRITE8_HANDLER( bking_soundlatch_w ) { - int i,code; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + int i, code = 0; - code = 0; for (i = 0;i < 8;i++) - if (data & (1 << i)) code |= 0x80 >> i; + if (data & (1 << i)) + code |= 0x80 >> i; - soundlatch_w(space,offset,code); - if (sndnmi_enable) cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); + soundlatch_w(space, offset, code); + if (state->sound_nmi_enable) + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); } static WRITE8_HANDLER( bking3_addr_l_w ) { - bking3_addr_l = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->addr_l = data; } static WRITE8_HANDLER( bking3_addr_h_w ) { - bking3_addr_h = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->addr_h = data; } static READ8_HANDLER( bking3_extrarom_r ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; UINT8 *rom = memory_region(space->machine, "user2"); - return rom[bking3_addr_h * 256 + bking3_addr_l]; + return rom[state->addr_h * 256 + state->addr_l]; } static WRITE8_HANDLER( unk_w ) @@ -105,7 +84,7 @@ static READ8_HANDLER( bking3_ext_check_r ) static ADDRESS_MAP_START( bking_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x83ff) AM_RAM - AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(bking_playfield_w) AM_BASE(&bking_playfield_ram) + AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(bking_playfield_w) AM_BASE_MEMBER(buggychl_state, playfield_ram) ADDRESS_MAP_END static ADDRESS_MAP_START( bking_io_map, ADDRESS_SPACE_IO, 8 ) @@ -165,40 +144,40 @@ static ADDRESS_MAP_START( bking_audio_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_END #if 0 -static UINT8 portA_in,portA_out,ddrA; +static UINT8 port_a_in,port_a_out,ddr_a; -static READ8_HANDLER( bking3_68705_portA_r ) +static READ8_HANDLER( bking3_68705_port_a_r ) { - //printf("portA_r = %02X\n",(portA_out & ddrA) | (portA_in & ~ddrA)); - return (portA_out & ddrA) | (portA_in & ~ddrA); + //printf("port_a_r = %02X\n",(port_a_out & ddr_a) | (port_a_in & ~ddr_a)); + return (port_a_out & ddr_a) | (port_a_in & ~ddr_a); } -static WRITE8_HANDLER( bking3_68705_portA_w ) +static WRITE8_HANDLER( bking3_68705_port_a_w ) { - portA_out = data; -// printf("portA_out = %02X\n",data); + port_a_out = data; +// printf("port_a_out = %02X\n",data); } -static WRITE8_HANDLER( bking3_68705_ddrA_w ) +static WRITE8_HANDLER( bking3_68705_ddr_a_w ) { - ddrA = data; + ddr_a = data; } -static UINT8 portB_in,portB_out,ddrB; +static UINT8 port_b_in,port_b_out,ddr_b; -static READ8_HANDLER( bking3_68705_portB_r ) +static READ8_HANDLER( bking3_68705_port_b_r ) { - return (portB_out & ddrB) | (portB_in & ~ddrB); + return (port_b_out & ddr_b) | (port_b_in & ~ddr_b); } -static WRITE8_HANDLER( bking3_68705_portB_w ) +static WRITE8_HANDLER( bking3_68705_port_b_w ) { // if(data != 0xff) -// printf("portB_out = %02X\n",data); +// printf("port_b_out = %02X\n",data); if (~data & 0x02) { - portA_in = from_main; + port_a_in = from_main; if (main_sent) cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE); main_sent = 0; } @@ -206,44 +185,45 @@ static WRITE8_HANDLER( bking3_68705_portB_w ) if (~data & 0x04) { /* 68705 is writing data for the Z80 */ - from_mcu = portA_out; + from_mcu = port_a_out; mcu_sent = 1; } if(data != 0xff && data != 0xfb && data != 0xfd) - printf("portB_w = %X\n",data); + printf("port_b_w = %X\n",data); - portB_out = data; + port_b_out = data; } -static WRITE8_HANDLER( bking3_68705_ddrB_w ) +static WRITE8_HANDLER( bking3_68705_ddr_b_w ) { - ddrB = data; + ddr_b = data; } -static READ8_HANDLER( bking3_68705_portC_r ) +static READ8_HANDLER( bking3_68705_port_c_r ) { - int portC_in = 0; - if (main_sent) portC_in |= 0x01; - if (!mcu_sent) portC_in |= 0x02; -//logerror("%04x: 68705 port C read %02x\n",cpu_get_pc(space->cpu),portC_in); - return portC_in; + int port_c_in = 0; + if (main_sent) port_c_in |= 0x01; + if (!mcu_sent) port_c_in |= 0x02; +//logerror("%04x: 68705 port C read %02x\n",cpu_get_pc(space->cpu),port_c_in); + return port_c_in; } #endif + static ADDRESS_MAP_START( m68705_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x7ff) - AM_RANGE(0x0000, 0x0000) AM_READWRITE(buggychl_68705_portA_r, buggychl_68705_portA_w) - AM_RANGE(0x0001, 0x0001) AM_READWRITE(buggychl_68705_portB_r, buggychl_68705_portB_w) - AM_RANGE(0x0002, 0x0002) AM_READWRITE(buggychl_68705_portC_r, buggychl_68705_portC_w) - AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddrA_w) - AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddrB_w) - AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddrC_w) + AM_RANGE(0x0000, 0x0000) AM_READWRITE(buggychl_68705_port_a_r, buggychl_68705_port_a_w) + AM_RANGE(0x0001, 0x0001) AM_READWRITE(buggychl_68705_port_b_r, buggychl_68705_port_b_w) + AM_RANGE(0x0002, 0x0002) AM_READWRITE(buggychl_68705_port_c_r, buggychl_68705_port_c_w) + AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddr_a_w) + AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddr_b_w) + AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddr_c_w) AM_RANGE(0x0010, 0x007f) AM_RAM AM_RANGE(0x0080, 0x07ff) AM_ROM ADDRESS_MAP_END static INPUT_PORTS_START( bking ) - PORT_START("IN0") /* IN0 */ + PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -251,7 +231,7 @@ static INPUT_PORTS_START( bking ) /* continue inputs are labelled in schematics. */ /* They are not connected though to any button */ - PORT_START("IN1") /* IN1 */ + PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Continue 1 */ @@ -260,7 +240,7 @@ static INPUT_PORTS_START( bking ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_TILT ) PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) /* Not Connected */ - PORT_START("DSWA") /* IN2 - DIP Switch A */ + PORT_START("DSWA") PORT_DIPNAME( 0x01, 0x00, "Holes Awarded" ) PORT_DIPLOCATION("SWA:1") PORT_DIPSETTING( 0x00, "Par Play: 0 Holes/Birdie: 1 Hole/Eagle: 2 Holes/Double Eagle: 4 Holes" ) PORT_DIPSETTING( 0x01, "Par Play: 1 Hole/Birdie: 2 Holes/Eagle: 3 Holes/Double Eagle: 4 Holes" ) @@ -285,7 +265,7 @@ static INPUT_PORTS_START( bking ) PORT_DIPSETTING( 0x00, DEF_STR(Upright) ) PORT_DIPSETTING( 0x80, DEF_STR(Cocktail) ) - PORT_START("DSWB") /* IN3 - DIP Switch B */ + PORT_START("DSWB") PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWB:1,2,3,4") PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) ) @@ -321,7 +301,7 @@ static INPUT_PORTS_START( bking ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) ) - PORT_START("DSWC") /* IN4 - DIP Switch C */ + PORT_START("DSWC") PORT_DIPNAME( 0x01, 0x01, "Appearance of Crow" ) PORT_DIPLOCATION("SWC:1") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) @@ -344,16 +324,16 @@ static INPUT_PORTS_START( bking ) PORT_DIPSETTING( 0x00, "1 Way" ) PORT_DIPSETTING( 0x80, "2 Way" ) - PORT_START("TRACK0_X") /* IN5 */ + PORT_START("TRACK0_X") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) /* Sensitivity, clip, min, max */ - PORT_START("TRACK0_Y") /* IN6 */ + PORT_START("TRACK0_Y") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_REVERSE /* Sensitivity, clip, min, max */ - PORT_START("TRACK1_X") /* IN7 */ + PORT_START("TRACK1_X") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_COCKTAIL /* Sensitivity, clip, min, max */ - PORT_START("TRACK1_Y") /* IN8 */ + PORT_START("TRACK1_Y") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_REVERSE PORT_COCKTAIL /* Sensitivity, clip, min, max */ INPUT_PORTS_END @@ -412,10 +392,11 @@ static GFXDECODE_START( bking ) GFXDECODE_END -static WRITE8_DEVICE_HANDLER( portb_w ) +static WRITE8_DEVICE_HANDLER( port_b_w ) { /* don't know what this is... could be a filter */ - if (data != 0x00) logerror("portB = %02x\n",data); + if (data != 0x00) + logerror("port_b = %02x\n", data); } static const ay8910_interface ay8910_config = @@ -425,11 +406,123 @@ static const ay8910_interface ay8910_config = DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_HANDLER("dac", dac_signed_w), - DEVCB_HANDLER(portb_w) + DEVCB_HANDLER(port_b_w) }; +static MACHINE_START( bking ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + state->audiocpu = devtag_get_device(machine, "audiocpu"); + + /* video */ + state_save_register_global_array(machine, state->pc3259_output); + state_save_register_global(machine, state->pc3259_mask); + state_save_register_global(machine, state->xld1); + state_save_register_global(machine, state->xld2); + state_save_register_global(machine, state->xld3); + state_save_register_global(machine, state->yld1); + state_save_register_global(machine, state->yld2); + state_save_register_global(machine, state->yld3); + state_save_register_global(machine, state->ball1_pic); + state_save_register_global(machine, state->ball2_pic); + state_save_register_global(machine, state->crow_pic); + state_save_register_global(machine, state->crow_flip); + state_save_register_global(machine, state->palette_bank); + state_save_register_global(machine, state->controller); + state_save_register_global(machine, state->hit); + /* sound */ + state_save_register_global(machine, state->sound_nmi_enable); +} + +static MACHINE_START( bking3 ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + state->mcu = devtag_get_device(machine, "mcu"); + + MACHINE_START_CALL(bking); + + /* misc */ + state_save_register_global(machine, state->addr_h); + state_save_register_global(machine, state->addr_l); + + /* mcu */ + state_save_register_global(machine, state->from_main); + state_save_register_global(machine, state->from_mcu); + state_save_register_global(machine, state->mcu_sent); + state_save_register_global(machine, state->main_sent); + state_save_register_global(machine, state->port_a_in); + state_save_register_global(machine, state->port_a_out); + state_save_register_global(machine, state->ddr_a); + state_save_register_global(machine, state->port_b_in); + state_save_register_global(machine, state->port_b_out); + state_save_register_global(machine, state->ddr_b); + state_save_register_global(machine, state->port_c_in); + state_save_register_global(machine, state->port_c_out); + state_save_register_global(machine, state->ddr_c); +} + +static MACHINE_RESET( bking ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + /* video */ + state->pc3259_output[0] = 0; + state->pc3259_output[1] = 0; + state->pc3259_output[2] = 0; + state->pc3259_output[3] = 0; + state->pc3259_mask = 0; + state->xld1 = 0; + state->xld2 = 0; + state->xld3 = 0; + state->yld1 = 0; + state->yld2 = 0; + state->yld3 = 0; + state->ball1_pic = 0; + state->ball2_pic = 0; + state->crow_pic = 0; + state->crow_flip = 0; + state->palette_bank = 0; + state->controller = 0; + state->hit = 0; + /* sound */ + state->sound_nmi_enable = 1; +} + +static MACHINE_RESET( bking3 ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + cputag_set_input_line(machine, "mcu", 0, CLEAR_LINE); + + MACHINE_RESET_CALL(bking); + + /* misc */ + state->addr_h = 0; + state->addr_l = 0; + + /* mcu */ + state->mcu_sent = 0; + state->main_sent = 0; + state->from_main = 0; + state->from_mcu = 0; + state->port_a_in = 0; + state->port_a_out = 0; + state->ddr_a = 0; + state->port_b_in = 0; + state->port_b_out = 0; + state->ddr_b = 0; + state->port_c_in = 0; + state->port_c_out = 0; + state->ddr_c = 0; +} + static MACHINE_DRIVER_START( bking ) + /* driver data */ + MDRV_DRIVER_DATA(buggychl_state) + /* basic machine hardware */ MDRV_CPU_ADD("main_cpu", Z80, XTAL_12MHz/4) /* 3 MHz */ MDRV_CPU_PROGRAM_MAP(bking_map) @@ -444,6 +537,9 @@ static MACHINE_DRIVER_START( bking ) /* - periodic IRQ, with frequency 6000000/(4*16*16*10*16) = 36.621 Hz, */ MDRV_CPU_PERIODIC_INT(irq0_line_hold, (double)6000000/(4*16*16*10*16)) + MDRV_MACHINE_START(bking) + MDRV_MACHINE_RESET(bking) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) @@ -482,7 +578,8 @@ static MACHINE_DRIVER_START( bking3 ) MDRV_CPU_ADD("mcu", M68705, XTAL_3MHz) /* xtal is 3MHz, divided by 4 internally */ MDRV_CPU_PROGRAM_MAP(m68705_map) - MDRV_MACHINE_RESET(buggychl) + MDRV_MACHINE_START(bking3) + MDRV_MACHINE_RESET(bking3) MDRV_QUANTUM_TIME(HZ(6000)) MACHINE_DRIVER_END @@ -775,11 +872,7 @@ ROM_START( bking3 ) ROM_LOAD( "a24-21.25", 0x0000, 0x1000, CRC(3106fcac) SHA1(08454adfb58e5df84140d86ed52fa4ef684df9f1) ) /* extra rom on the same SUB PCB where is the mcu */ ROM_END -static DRIVER_INIT( bking ) -{ - sndnmi_enable = 1; -} -GAME( 1982, bking, 0, bking, bking, bking, ROT270, "Taito Corporation", "Birdie King", 0 ) -GAME( 1983, bking2, 0, bking, bking2, bking, ROT90, "Taito Corporation", "Birdie King 2", 0 ) -GAME( 1984, bking3, 0, bking3, bking2, bking, ROT90, "Taito Corporation", "Birdie King 3", 0 ) +GAME( 1982, bking, 0, bking, bking, 0, ROT270, "Taito Corporation", "Birdie King", GAME_SUPPORTS_SAVE ) +GAME( 1983, bking2, 0, bking, bking2, 0, ROT90, "Taito Corporation", "Birdie King 2", GAME_SUPPORTS_SAVE ) +GAME( 1984, bking3, 0, bking3, bking2, 0, ROT90, "Taito Corporation", "Birdie King 3", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/buggychl.c b/src/mame/drivers/buggychl.c index b9094320f56..6967c695d08 100644 --- a/src/mame/drivers/buggychl.c +++ b/src/mame/drivers/buggychl.c @@ -95,13 +95,14 @@ static WRITE8_HANDLER( bankswitch_w ) memory_set_bankptr(space->machine, 1,&memory_region(space->machine, "maincpu")[0x10000 + (data & 7) * 0x2000]); } - -static int sound_nmi_enable,pending_nmi; - static TIMER_CALLBACK( nmi_callback ) { - if (sound_nmi_enable) cputag_set_input_line(machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); - else pending_nmi = 1; + buggychl_state *state = (buggychl_state *)machine->driver_data; + + if (state->sound_nmi_enable) + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); + else + state->pending_nmi = 1; } static WRITE8_HANDLER( sound_command_w ) @@ -112,16 +113,18 @@ static WRITE8_HANDLER( sound_command_w ) static WRITE8_HANDLER( nmi_disable_w ) { - sound_nmi_enable = 0; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 0; } static WRITE8_HANDLER( nmi_enable_w ) { - sound_nmi_enable = 1; - if (pending_nmi) + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 1; + if (state->pending_nmi) { - cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); - pending_nmi = 0; + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); + state->pending_nmi = 0; } } @@ -138,15 +141,15 @@ static ADDRESS_MAP_START( buggychl_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x8000, 0x87ff) AM_RAM /* 6116 SRAM (36) */ AM_RANGE(0x8800, 0x8fff) AM_RAM /* 6116 SRAM (35) */ AM_RANGE(0x9000, 0x9fff) AM_WRITE(buggychl_sprite_lookup_w) - AM_RANGE(0xa000, 0xbfff) AM_ROMBANK(1) AM_WRITE(buggychl_chargen_w) AM_BASE(&buggychl_character_ram) - AM_RANGE(0xc800, 0xcfff) AM_RAM AM_BASE_GENERIC(videoram) AM_SIZE_GENERIC(videoram) + AM_RANGE(0xa000, 0xbfff) AM_ROMBANK(1) AM_WRITE(buggychl_chargen_w) AM_BASE_MEMBER(buggychl_state, charram) + AM_RANGE(0xc800, 0xcfff) AM_RAM AM_BASE_SIZE_MEMBER(buggychl_state, videoram, videoram_size) AM_RANGE(0xd100, 0xd100) AM_WRITE(buggychl_ctrl_w) AM_RANGE(0xd200, 0xd200) AM_WRITE(bankswitch_w) AM_RANGE(0xd300, 0xd300) AM_WRITE(watchdog_reset_w) AM_RANGE(0xd303, 0xd303) AM_WRITE(buggychl_sprite_lookup_bank_w) AM_RANGE(0xd400, 0xd400) AM_READWRITE(buggychl_mcu_r, buggychl_mcu_w) AM_RANGE(0xd401, 0xd401) AM_READ(buggychl_mcu_status_r) - AM_RANGE(0xd500, 0xd57f) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram) + AM_RANGE(0xd500, 0xd57f) AM_WRITEONLY AM_BASE_SIZE_MEMBER(buggychl_state, spriteram, spriteram_size) AM_RANGE(0xd600, 0xd600) AM_READ_PORT("DSW1") AM_RANGE(0xd601, 0xd601) AM_READ_PORT("DSW2") AM_RANGE(0xd602, 0xd602) AM_READ_PORT("DSW3") @@ -158,8 +161,8 @@ static ADDRESS_MAP_START( buggychl_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xd610, 0xd610) AM_WRITE(sound_command_w) AM_RANGE(0xd618, 0xd618) AM_WRITENOP /* accelerator clear */ AM_RANGE(0xd700, 0xd7ff) AM_WRITE(paletteram_xxxxRRRRGGGGBBBB_be_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xd840, 0xd85f) AM_WRITEONLY AM_BASE(&buggychl_scrollv) - AM_RANGE(0xdb00, 0xdbff) AM_WRITEONLY AM_BASE(&buggychl_scrollh) + AM_RANGE(0xd840, 0xd85f) AM_WRITEONLY AM_BASE_MEMBER(buggychl_state, scrollv) + AM_RANGE(0xdb00, 0xdbff) AM_WRITEONLY AM_BASE_MEMBER(buggychl_state, scrollh) AM_RANGE(0xdc04, 0xdc04) AM_WRITEONLY /* should be fg scroll */ AM_RANGE(0xdc06, 0xdc06) AM_WRITE(buggychl_bg_scrollx_w) ADDRESS_MAP_END @@ -182,12 +185,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( mcu_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x7ff) - AM_RANGE(0x0000, 0x0000) AM_READWRITE(buggychl_68705_portA_r, buggychl_68705_portA_w) - AM_RANGE(0x0001, 0x0001) AM_READWRITE(buggychl_68705_portB_r, buggychl_68705_portB_w) - AM_RANGE(0x0002, 0x0002) AM_READWRITE(buggychl_68705_portC_r, buggychl_68705_portC_w) - AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddrA_w) - AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddrB_w) - AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddrC_w) + AM_RANGE(0x0000, 0x0000) AM_READWRITE(buggychl_68705_port_a_r, buggychl_68705_port_a_w) + AM_RANGE(0x0001, 0x0001) AM_READWRITE(buggychl_68705_port_b_r, buggychl_68705_port_b_w) + AM_RANGE(0x0002, 0x0002) AM_READWRITE(buggychl_68705_port_c_r, buggychl_68705_port_c_w) + AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddr_a_w) + AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddr_b_w) + AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddr_c_w) AM_RANGE(0x0010, 0x007f) AM_RAM AM_RANGE(0x0080, 0x07ff) AM_ROM ADDRESS_MAP_END @@ -327,19 +330,19 @@ GFXDECODE_END -static WRITE8_DEVICE_HANDLER( portA_0_w ) +static WRITE8_DEVICE_HANDLER( port_a_0_w ) { /* VOL/BAL for the 7630 on this 8910 output */ } -static WRITE8_DEVICE_HANDLER( portB_0_w ) +static WRITE8_DEVICE_HANDLER( port_b_0_w ) { /* TRBL/BASS for the 7630 on this 8910 output */ } -static WRITE8_DEVICE_HANDLER( portA_1_w ) +static WRITE8_DEVICE_HANDLER( port_a_1_w ) { /* VOL/BAL for the 7630 on this 8910 output */ } -static WRITE8_DEVICE_HANDLER( portB_1_w ) +static WRITE8_DEVICE_HANDLER( port_b_1_w ) { /* TRBL/BASS for the 7630 on this 8910 output */ } @@ -351,8 +354,8 @@ static const ay8910_interface ay8910_interface_1 = AY8910_DEFAULT_LOADS, DEVCB_NULL, DEVCB_NULL, - DEVCB_HANDLER(portA_0_w), - DEVCB_HANDLER(portB_0_w) + DEVCB_HANDLER(port_a_0_w), + DEVCB_HANDLER(port_b_0_w) }; static const ay8910_interface ay8910_interface_2 = @@ -361,8 +364,8 @@ static const ay8910_interface ay8910_interface_2 = AY8910_DEFAULT_LOADS, DEVCB_NULL, DEVCB_NULL, - DEVCB_HANDLER(portA_1_w), - DEVCB_HANDLER(portB_1_w) + DEVCB_HANDLER(port_a_1_w), + DEVCB_HANDLER(port_b_1_w) }; static const msm5232_interface msm5232_config = @@ -371,8 +374,71 @@ static const msm5232_interface msm5232_config = }; +static MACHINE_START( buggychl ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + state->audiocpu = devtag_get_device(machine, "audiocpu"); + state->mcu = devtag_get_device(machine, "mcu"); + + state_save_register_global(machine, state->sound_nmi_enable); + state_save_register_global(machine, state->pending_nmi); + state_save_register_global_array(machine, state->sprite_lookup); + state_save_register_global(machine, state->sl_bank); + state_save_register_global(machine, state->bg_on); + state_save_register_global(machine, state->sky_on); + state_save_register_global(machine, state->sprite_color_base); + state_save_register_global(machine, state->bg_scrollx); + /* mcu */ + state_save_register_global(machine, state->from_main); + state_save_register_global(machine, state->from_mcu); + state_save_register_global(machine, state->mcu_sent); + state_save_register_global(machine, state->main_sent); + state_save_register_global(machine, state->port_a_in); + state_save_register_global(machine, state->port_a_out); + state_save_register_global(machine, state->ddr_a); + state_save_register_global(machine, state->port_b_in); + state_save_register_global(machine, state->port_b_out); + state_save_register_global(machine, state->ddr_b); + state_save_register_global(machine, state->port_c_in); + state_save_register_global(machine, state->port_c_out); + state_save_register_global(machine, state->ddr_c); +} + +static MACHINE_RESET( buggychl ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + cputag_set_input_line(machine, "mcu", 0, CLEAR_LINE); + + state->sound_nmi_enable = 0; + state->pending_nmi = 0; + state->sl_bank = 0; + state->bg_on = 0; + state->sky_on = 0; + state->sprite_color_base = 0; + state->bg_scrollx = 0; + /* mcu */ + state->mcu_sent = 0; + state->main_sent = 0; + state->from_main = 0; + state->from_mcu = 0; + state->port_a_in = 0; + state->port_a_out = 0; + state->ddr_a = 0; + state->port_b_in = 0; + state->port_b_out = 0; + state->ddr_b = 0; + state->port_c_in = 0; + state->port_c_out = 0; + state->ddr_c = 0; +} + static MACHINE_DRIVER_START( buggychl ) + /* driver data */ + MDRV_DRIVER_DATA(buggychl_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz??? */ MDRV_CPU_PROGRAM_MAP(buggychl_map) @@ -386,6 +452,9 @@ static MACHINE_DRIVER_START( buggychl ) MDRV_CPU_ADD("mcu", M68705,8000000/2) /* 4 MHz */ MDRV_CPU_PROGRAM_MAP(mcu_map) + MDRV_MACHINE_START(buggychl) + MDRV_MACHINE_RESET(buggychl) + /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_REFRESH_RATE(60) @@ -397,8 +466,6 @@ static MACHINE_DRIVER_START( buggychl ) MDRV_GFXDECODE(buggychl) MDRV_PALETTE_LENGTH(128+128) - MDRV_MACHINE_RESET(buggychl) - MDRV_PALETTE_INIT(buggychl) MDRV_VIDEO_START(buggychl) MDRV_VIDEO_UPDATE(buggychl) diff --git a/src/mame/drivers/msisaac.c b/src/mame/drivers/msisaac.c index a50dd7fce32..e200b7c4d17 100644 --- a/src/mame/drivers/msisaac.c +++ b/src/mame/drivers/msisaac.c @@ -20,56 +20,36 @@ TO DO: - TA7630 volume table is hand tuned to match the sample, but still slighty off. */ -//not used -//WRITE8_HANDLER( msisaac_textbank1_w ); - -//used -WRITE8_HANDLER( msisaac_fg_scrolly_w ); -WRITE8_HANDLER( msisaac_fg_scrollx_w ); -WRITE8_HANDLER( msisaac_bg_scrolly_w ); -WRITE8_HANDLER( msisaac_bg_scrollx_w ); -WRITE8_HANDLER( msisaac_bg2_scrolly_w ); -WRITE8_HANDLER( msisaac_bg2_scrollx_w ); - -WRITE8_HANDLER( msisaac_bg2_textbank_w ); - -WRITE8_HANDLER( msisaac_bg_videoram_w ); -WRITE8_HANDLER( msisaac_bg2_videoram_w ); -WRITE8_HANDLER( msisaac_fg_videoram_w ); - -extern VIDEO_UPDATE( msisaac ); -extern VIDEO_START( msisaac ); -extern UINT8 *msisaac_videoram; -extern UINT8 *msisaac_videoram2; - - - -static int sound_nmi_enable,pending_nmi; static TIMER_CALLBACK( nmi_callback ) { - if (sound_nmi_enable) cputag_set_input_line(machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); - else pending_nmi = 1; + buggychl_state *state = (buggychl_state *)machine->driver_data; + if (state->sound_nmi_enable) + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); + else + state->pending_nmi = 1; } static WRITE8_HANDLER( sound_command_w ) { - soundlatch_w(space,0,data); - timer_call_after_resynch(space->machine, NULL, data,nmi_callback); + soundlatch_w(space, 0, data); + timer_call_after_resynch(space->machine, NULL, data, nmi_callback); } static WRITE8_HANDLER( nmi_disable_w ) { - sound_nmi_enable = 0; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 0; } static WRITE8_HANDLER( nmi_enable_w ) { - sound_nmi_enable = 1; - if (pending_nmi) + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sound_nmi_enable = 1; + if (state->pending_nmi) { - cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); - pending_nmi = 0; + cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE); + state->pending_nmi = 0; } } @@ -84,10 +64,11 @@ static WRITE8_HANDLER( msisaac_coin_counter_w ) coin_counter_w(space->machine, offset,data); } #endif + static WRITE8_HANDLER( ms_unknown_w ) { - if (data!=0x08) - popmessage("CPU #0 write to 0xf0a3 data=%2x",data); + if (data != 0x08) + popmessage("CPU #0 write to 0xf0a3 data=%2x", data); } @@ -100,11 +81,6 @@ static WRITE8_HANDLER( ms_unknown_w ) /* Disabled because the mcu dump is currently unavailable. -AS */ //#define USE_MCU -#ifndef USE_MCU -static UINT8 mcu_val = 0; -static UINT8 direction = 0; -#endif - static READ8_HANDLER( msisaac_mcu_r ) { @@ -117,11 +93,12 @@ MCU simulation TODO: \-Fix some graphics imperfections(*not* confirmed if they are caused by unhandled commands or imperfect video emulation). */ + buggychl_state *state = (buggychl_state *)space->machine->driver_data; - switch(mcu_val) + switch (state->mcu_val) { /*Start-up check*/ - case 0x5f: return (mcu_val+0x6b); + case 0x5f: return (state->mcu_val + 0x6b); /*These interferes with RAM operations(setting them to non-zero you * * will have unexpected results,such as infinite lives or score not * * incremented properly).*/ @@ -143,7 +120,7 @@ MCU simulation TODO: //6-down //7-leftdwn - UINT8 val= (input_port_read(space->machine, "IN1")>>2) & 0x0f; + UINT8 val= (input_port_read(space->machine, "IN1") >> 2) & 0x0f; /* bit0 = left bit1 = right bit2 = down @@ -161,10 +138,10 @@ MCU simulation TODO: static const INT8 table[16] = { -1, 2, 6, -1, 0, 1, 7, 0, 4, 3, 5, 4, -1, 2, 6, -1 }; - if (table[val] >= 0 ) - direction = table[val]; + if (table[val] >= 0) + state->direction = table[val]; - return direction; + return state->direction; } /*This controls the arms when they return to the player. */ @@ -172,8 +149,8 @@ MCU simulation TODO: return 0x45; default: - logerror("CPU#0 read from MCU pc=%4x, mcu_val=%2x\n", cpu_get_pc(space->cpu), mcu_val ); - return mcu_val; + logerror("CPU#0 read from MCU pc=%4x, mcu_val=%2x\n", cpu_get_pc(space->cpu), state->mcu_val); + return state->mcu_val; } #endif } @@ -192,9 +169,10 @@ static WRITE8_HANDLER( msisaac_mcu_w ) #ifdef USE_MCU buggychl_mcu_w(offset,data); #else + buggychl_state *state = (buggychl_state *)space->machine->driver_data; //if(data != 0x0a && data != 0x42 && data != 0x02) - // popmessage("PC = %04x %02x",cpu_get_pc(space->cpu),data); - mcu_val = data; + // popmessage("PC = %04x %02x", cpu_get_pc(space->cpu), data); + state->mcu_val = data; #endif } @@ -218,7 +196,7 @@ static ADDRESS_MAP_START( msisaac_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xf0c4, 0xf0c4) AM_WRITE(msisaac_bg_scrollx_w) AM_RANGE(0xf0c5, 0xf0c5) AM_WRITE(msisaac_bg_scrolly_w) - AM_RANGE(0xf0e0, 0xf0e0) AM_READWRITE(msisaac_mcu_r,msisaac_mcu_w) + AM_RANGE(0xf0e0, 0xf0e0) AM_READWRITE(msisaac_mcu_r, msisaac_mcu_w) AM_RANGE(0xf0e1, 0xf0e1) AM_READ(msisaac_mcu_status_r) AM_RANGE(0xf080, 0xf080) AM_READ_PORT("DSW1") @@ -228,19 +206,18 @@ static ADDRESS_MAP_START( msisaac_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xf084, 0xf084) AM_READ_PORT("IN1") // AM_RANGE(0xf086, 0xf086) AM_READ_PORT("IN2") - AM_RANGE(0xf100, 0xf17f) AM_RAM AM_BASE_GENERIC(spriteram) //sprites - AM_RANGE(0xf400, 0xf7ff) AM_RAM_WRITE(msisaac_fg_videoram_w) AM_BASE_GENERIC(videoram) - AM_RANGE(0xf800, 0xfbff) AM_RAM_WRITE(msisaac_bg2_videoram_w) AM_BASE(&msisaac_videoram2) - AM_RANGE(0xfc00, 0xffff) AM_RAM_WRITE(msisaac_bg_videoram_w) AM_BASE(&msisaac_videoram) + AM_RANGE(0xf100, 0xf17f) AM_RAM AM_BASE_MEMBER(buggychl_state, spriteram) //sprites + AM_RANGE(0xf400, 0xf7ff) AM_RAM_WRITE(msisaac_fg_videoram_w) AM_BASE_MEMBER(buggychl_state, videoram) + AM_RANGE(0xf800, 0xfbff) AM_RAM_WRITE(msisaac_bg2_videoram_w) AM_BASE_MEMBER(buggychl_state, videoram3) + AM_RANGE(0xfc00, 0xffff) AM_RAM_WRITE(msisaac_bg_videoram_w) AM_BASE_MEMBER(buggychl_state, videoram2) // AM_RANGE(0xf801, 0xf801) AM_WRITE(msisaac_bgcolor_w) // AM_RANGE(0xfc00, 0xfc00) AM_WRITE(flip_screen_w) // AM_RANGE(0xfc03, 0xfc04) AM_WRITE(msisaac_coin_counter_w) ADDRESS_MAP_END -static int vol_ctrl[16]; - static MACHINE_RESET( ta7630 ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; int i; double db = 0.0; @@ -249,8 +226,8 @@ static MACHINE_RESET( ta7630 ) for (i=0; i<16; i++) { double max = 100.0 / pow(10.0, db/20.0 ); - vol_ctrl[ 15-i ] = max; - /*logerror("vol_ctrl[%x] = %i (%f dB)\n",15-i,vol_ctrl[ 15-i ],db);*/ + state->vol_ctrl[15 - i] = max; + /*logerror("vol_ctrl[%x] = %i (%f dB)\n",15 - i, state->vol_ctrl[15 - i], db);*/ db += db_step; db_step += db_step_inc; } @@ -264,27 +241,26 @@ static MACHINE_RESET( ta7630 ) */ } -static UINT8 snd_ctrl0=0; -static UINT8 snd_ctrl1=0; - static WRITE8_DEVICE_HANDLER( sound_control_0_w ) { - snd_ctrl0 = data & 0xff; - //popmessage("SND0 0=%2x 1=%2x", snd_ctrl0, snd_ctrl1); + buggychl_state *state = (buggychl_state *)device->machine->driver_data; + state->snd_ctrl0 = data & 0xff; + //popmessage("SND0 0=%2x 1=%2x", state->snd_ctrl0, state->snd_ctrl1); - sound_set_output_gain(device, 0, vol_ctrl[ snd_ctrl0 & 15 ] / 100.0); /* group1 from msm5232 */ - sound_set_output_gain(device, 1, vol_ctrl[ snd_ctrl0 & 15 ] / 100.0); /* group1 from msm5232 */ - sound_set_output_gain(device, 2, vol_ctrl[ snd_ctrl0 & 15 ] / 100.0); /* group1 from msm5232 */ - sound_set_output_gain(device, 3, vol_ctrl[ snd_ctrl0 & 15 ] / 100.0); /* group1 from msm5232 */ - sound_set_output_gain(device, 4, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group2 from msm5232 */ - sound_set_output_gain(device, 5, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group2 from msm5232 */ - sound_set_output_gain(device, 6, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group2 from msm5232 */ - sound_set_output_gain(device, 7, vol_ctrl[ (snd_ctrl0>>4) & 15 ] / 100.0); /* group2 from msm5232 */ + sound_set_output_gain(device, 0, state->vol_ctrl[state->snd_ctrl0 & 15] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 1, state->vol_ctrl[state->snd_ctrl0 & 15] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 2, state->vol_ctrl[state->snd_ctrl0 & 15] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 3, state->vol_ctrl[state->snd_ctrl0 & 15] / 100.0); /* group1 from msm5232 */ + sound_set_output_gain(device, 4, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group2 from msm5232 */ + sound_set_output_gain(device, 5, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group2 from msm5232 */ + sound_set_output_gain(device, 6, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group2 from msm5232 */ + sound_set_output_gain(device, 7, state->vol_ctrl[(state->snd_ctrl0 >> 4) & 15] / 100.0); /* group2 from msm5232 */ } static WRITE8_HANDLER( sound_control_1_w ) { - snd_ctrl1 = data & 0xff; - //popmessage("SND1 0=%2x 1=%2x", snd_ctrl0, snd_ctrl1); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->snd_ctrl1 = data & 0xff; + //popmessage("SND1 0=%2x 1=%2x", state->snd_ctrl0, state->snd_ctrl1); } static ADDRESS_MAP_START( msisaac_sound_map, ADDRESS_SPACE_PROGRAM, 8 ) @@ -306,12 +282,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( msisaac_mcu_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x7ff) - AM_RANGE(0x0000, 0x0000) AM_READ(buggychl_68705_portA_r,buggychl_68705_portA_w) - AM_RANGE(0x0001, 0x0001) AM_READ(buggychl_68705_portB_r,buggychl_68705_portB_w) - AM_RANGE(0x0002, 0x0002) AM_READ(buggychl_68705_portC_r,buggychl_68705_portC_w) - AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddrA_w) - AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddrB_w) - AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddrC_w) + AM_RANGE(0x0000, 0x0000) AM_READ(buggychl_68705_port_a_r,buggychl_68705_port_a_w) + AM_RANGE(0x0001, 0x0001) AM_READ(buggychl_68705_port_b_r,buggychl_68705_port_b_w) + AM_RANGE(0x0002, 0x0002) AM_READ(buggychl_68705_port_c_r,buggychl_68705_port_c_w) + AM_RANGE(0x0004, 0x0004) AM_WRITE(buggychl_68705_ddr_a_w) + AM_RANGE(0x0005, 0x0005) AM_WRITE(buggychl_68705_ddr_b_w) + AM_RANGE(0x0006, 0x0006) AM_WRITE(buggychl_68705_ddr_c_w) AM_RANGE(0x0010, 0x007f) AM_RAM AM_RANGE(0x0080, 0x07ff) AM_ROM ADDRESS_MAP_END @@ -475,8 +451,86 @@ static const msm5232_interface msm5232_config = /*******************************************************************************/ +static MACHINE_START( msisaac ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + state->audiocpu = devtag_get_device(machine, "audiocpu"); + + /* video */ + state_save_register_global(machine, state->bg2_textbank); + /* sound */ + state_save_register_global(machine, state->sound_nmi_enable); + state_save_register_global(machine, state->pending_nmi); + state_save_register_global_array(machine, state->vol_ctrl); + state_save_register_global(machine, state->snd_ctrl0); + state_save_register_global(machine, state->snd_ctrl1); + +#ifdef USE_MCU + state->mcu = devtag_get_device(machine, "mcu"); + + /* mcu */ + state_save_register_global(machine, state->from_main); + state_save_register_global(machine, state->from_mcu); + state_save_register_global(machine, state->mcu_sent); + state_save_register_global(machine, state->main_sent); + state_save_register_global(machine, state->port_a_in); + state_save_register_global(machine, state->port_a_out); + state_save_register_global(machine, state->ddr_a); + state_save_register_global(machine, state->port_b_in); + state_save_register_global(machine, state->port_b_out); + state_save_register_global(machine, state->ddr_b); + state_save_register_global(machine, state->port_c_in); + state_save_register_global(machine, state->port_c_out); + state_save_register_global(machine, state->ddr_c); +#else + state_save_register_global(machine, state->mcu_val); + state_save_register_global(machine, state->direction); +#endif +} + +static MACHINE_RESET( msisaac ) +{ + buggychl_state *state = (buggychl_state *)machine->driver_data; + + MACHINE_RESET_CALL(ta7630); + + /* video */ + state->bg2_textbank = 0; + /* sound */ + state->sound_nmi_enable = 0; + state->pending_nmi = 0; + state->snd_ctrl0 = 0; + state->snd_ctrl1 = 0; + +#ifdef USE_MCU + cputag_set_input_line(machine, "mcu", 0, CLEAR_LINE); + + /* mcu */ + state->mcu_sent = 0; + state->main_sent = 0; + state->from_main = 0; + state->from_mcu = 0; + state->port_a_in = 0; + state->port_a_out = 0; + state->ddr_a = 0; + state->port_b_in = 0; + state->port_b_out = 0; + state->ddr_b = 0; + state->port_c_in = 0; + state->port_c_out = 0; + state->ddr_c = 0; +#else + state->mcu_val = 0; + state->direction = 0; +#endif +} + static MACHINE_DRIVER_START( msisaac ) + /* driver data */ + MDRV_DRIVER_DATA(buggychl_state) + /* basic machine hardware */ MDRV_CPU_ADD("maincpu", Z80, 4000000) MDRV_CPU_PROGRAM_MAP(msisaac_map) @@ -491,7 +545,8 @@ static MACHINE_DRIVER_START( msisaac ) MDRV_CPU_PROGRAM_MAP(msisaac_mcu_map) #endif - MDRV_MACHINE_RESET(ta7630) + MDRV_MACHINE_START(msisaac) + MDRV_MACHINE_RESET(msisaac) /* video hardware */ MDRV_SCREEN_ADD("screen", RASTER) @@ -567,4 +622,5 @@ ROM_START( msisaac ) ROM_END -GAME( 1985, msisaac, 0, msisaac, msisaac, 0, ROT270, "Taito Corporation", "Metal Soldier Isaac II", GAME_UNEMULATED_PROTECTION | GAME_NO_COCKTAIL) + +GAME( 1985, msisaac, 0, msisaac, msisaac, 0, ROT270, "Taito Corporation", "Metal Soldier Isaac II", GAME_UNEMULATED_PROTECTION | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/buggychl.h b/src/mame/includes/buggychl.h index 1708f37729e..e70b241081a 100644 --- a/src/mame/includes/buggychl.h +++ b/src/mame/includes/buggychl.h @@ -1,15 +1,105 @@ +/* + buggychl mcu emulation is also used by + 40love.c, bking.c and msisaac.c +*/ + +typedef struct _buggychl_state buggychl_state; +struct _buggychl_state +{ + /* memory pointers */ + UINT8 * videoram; // buggychl, 40love, msisaac + UINT8 * videoram2; // msisaac + UINT8 * videoram3; // msisaac + UINT8 * colorram; // 40love + UINT8 * spriteram; // buggychl, 40love, msisaac + UINT8 * spriteram2; // 40love + UINT8 * scrollv; // buggychl + UINT8 * scrollh; // buggychl + UINT8 * charram; // buggychl + UINT8 * video_ctrl; // 40love +// UINT8 * paletteram; // currently this uses generic palette handling (buggychl & msisaac) + UINT8 * mcu_ram; // 40love (undokai) + UINT8 * playfield_ram; // bking + size_t videoram_size; + size_t spriteram_size; + size_t spriteram2_size; + + /* video-related */ + bitmap_t *tmp_bitmap1, *tmp_bitmap2; + tilemap *bg_tilemap; + tilemap *fg_tilemap, *bg2_tilemap; // msisaac + // buggychl + int sl_bank, bg_on, sky_on, sprite_color_base, bg_scrollx; + UINT8 sprite_lookup[0x2000]; + // 40love + UINT8 flipscreen, pix_redraw; + UINT8 xoffset; + UINT8 *pixram1; + UINT8 *pixram2; + bitmap_t *pixel_bitmap1; + bitmap_t *pixel_bitmap2; + tilemap *background; + int pixram_sel; + // bking + int pc3259_output[4]; + int pc3259_mask; + UINT8 xld1, xld2, xld3; + UINT8 yld1, yld2, yld3; + int ball1_pic, ball2_pic; + int crow_pic, crow_flip; + int palette_bank, controller, hit; + // msisaac + int bg2_textbank; + + + /* sound-related */ + int sound_nmi_enable, pending_nmi; + + /* mcu */ + UINT8 port_a_in, port_a_out, ddr_a; + UINT8 port_b_in, port_b_out, ddr_b; + UINT8 port_c_in, port_c_out, ddr_c; + UINT8 from_main, from_mcu; + int mcu_sent, main_sent; + + /* fake mcu (in 40love.c) - it also uses from_mcu */ + UINT8 mcu_in[2][16], mcu_out[2][16]; + int mcu_cmd; + + /* fake mcu (in msisaac.c) */ +#ifndef USE_MCU + UINT8 mcu_val; + UINT8 direction; +#endif + + + /* misc */ + // 40love + int pix_color[4]; + UINT8 pix1, pix2[2]; + UINT8 snd_data, snd_flag; + int vol_ctrl[16]; + UINT8 snd_ctrl0, snd_ctrl1, snd_ctrl2, snd_ctrl3; + // bking + int addr_h, addr_l; + + /* devices */ + const device_config *audiocpu; + const device_config *mcu; +}; + + /*----------- defined in machine/buggychl.c -----------*/ -MACHINE_RESET( buggychl ); -READ8_HANDLER( buggychl_68705_portA_r ); -WRITE8_HANDLER( buggychl_68705_portA_w ); -WRITE8_HANDLER( buggychl_68705_ddrA_w ); -READ8_HANDLER( buggychl_68705_portB_r ); -WRITE8_HANDLER( buggychl_68705_portB_w ); -WRITE8_HANDLER( buggychl_68705_ddrB_w ); -READ8_HANDLER( buggychl_68705_portC_r ); -WRITE8_HANDLER( buggychl_68705_portC_w ); -WRITE8_HANDLER( buggychl_68705_ddrC_w ); +READ8_HANDLER( buggychl_68705_port_a_r ); +WRITE8_HANDLER( buggychl_68705_port_a_w ); +WRITE8_HANDLER( buggychl_68705_ddr_a_w ); +READ8_HANDLER( buggychl_68705_port_b_r ); +WRITE8_HANDLER( buggychl_68705_port_b_w ); +WRITE8_HANDLER( buggychl_68705_ddr_b_w ); +READ8_HANDLER( buggychl_68705_port_c_r ); +WRITE8_HANDLER( buggychl_68705_port_c_w ); +WRITE8_HANDLER( buggychl_68705_ddr_c_w ); WRITE8_HANDLER( buggychl_mcu_w ); READ8_HANDLER( buggychl_mcu_r ); READ8_HANDLER( buggychl_mcu_status_r ); @@ -17,14 +107,67 @@ READ8_HANDLER( buggychl_mcu_status_r ); /*----------- defined in video/buggychl.c -----------*/ -extern UINT8 *buggychl_scrollv,*buggychl_scrollh; -extern UINT8 *buggychl_character_ram; - -PALETTE_INIT( buggychl ); -VIDEO_START( buggychl ); WRITE8_HANDLER( buggychl_chargen_w ); WRITE8_HANDLER( buggychl_sprite_lookup_bank_w ); WRITE8_HANDLER( buggychl_sprite_lookup_w ); WRITE8_HANDLER( buggychl_ctrl_w ); WRITE8_HANDLER( buggychl_bg_scrollx_w ); + +PALETTE_INIT( buggychl ); +VIDEO_START( buggychl ); VIDEO_UPDATE( buggychl ); + +/*----------- defined in video/40love.c -----------*/ + +WRITE8_HANDLER( fortyl_bg_videoram_w ); +WRITE8_HANDLER( fortyl_bg_colorram_w ); +READ8_HANDLER ( fortyl_bg_videoram_r ); +READ8_HANDLER ( fortyl_bg_colorram_r ); +WRITE8_HANDLER( fortyl_pixram_sel_w ); +READ8_HANDLER( fortyl_pixram_r ); +WRITE8_HANDLER( fortyl_pixram_w ); + +VIDEO_START( fortyl ); +VIDEO_UPDATE( fortyl ); +PALETTE_INIT( fortyl ); + +/*----------- defined in video/bking.c -----------*/ + +WRITE8_HANDLER( bking_xld1_w ); +WRITE8_HANDLER( bking_yld1_w ); +WRITE8_HANDLER( bking_xld2_w ); +WRITE8_HANDLER( bking_yld2_w ); +WRITE8_HANDLER( bking_xld3_w ); +WRITE8_HANDLER( bking_yld3_w ); +WRITE8_HANDLER( bking_msk_w ); +WRITE8_HANDLER( bking_cont1_w ); +WRITE8_HANDLER( bking_cont2_w ); +WRITE8_HANDLER( bking_cont3_w ); +WRITE8_HANDLER( bking_hitclr_w ); +WRITE8_HANDLER( bking_playfield_w ); + +READ8_HANDLER( bking_input_port_5_r ); +READ8_HANDLER( bking_input_port_6_r ); +READ8_HANDLER( bking_pos_r ); + +PALETTE_INIT( bking ); +VIDEO_START( bking ); +VIDEO_UPDATE( bking ); +VIDEO_EOF( bking ); + +/*----------- defined in video/msisaac.c -----------*/ + +WRITE8_HANDLER( msisaac_fg_scrolly_w ); +WRITE8_HANDLER( msisaac_fg_scrollx_w ); +WRITE8_HANDLER( msisaac_bg_scrolly_w ); +WRITE8_HANDLER( msisaac_bg_scrollx_w ); +WRITE8_HANDLER( msisaac_bg2_scrolly_w ); +WRITE8_HANDLER( msisaac_bg2_scrollx_w ); +WRITE8_HANDLER( msisaac_bg2_textbank_w ); + +WRITE8_HANDLER( msisaac_bg_videoram_w ); +WRITE8_HANDLER( msisaac_bg2_videoram_w ); +WRITE8_HANDLER( msisaac_fg_videoram_w ); + +VIDEO_UPDATE( msisaac ); +VIDEO_START( msisaac ); diff --git a/src/mame/machine/buggychl.c b/src/mame/machine/buggychl.c index c8ce34e0e67..fd84d223be5 100644 --- a/src/mame/machine/buggychl.c +++ b/src/mame/machine/buggychl.c @@ -3,17 +3,6 @@ #include "includes/buggychl.h" -static UINT8 from_main,from_mcu; -static int mcu_sent,main_sent; - -MACHINE_RESET( buggychl ) -{ - mcu_sent = 0; - main_sent = 0; - cputag_set_input_line(machine, "mcu", 0, CLEAR_LINE); -} - - /*************************************************************************** Buggy CHallenge 68705 protection interface @@ -22,23 +11,24 @@ MACHINE_RESET( buggychl ) ***************************************************************************/ -static UINT8 portA_in,portA_out,ddrA; - -READ8_HANDLER( buggychl_68705_portA_r ) +READ8_HANDLER( buggychl_68705_port_a_r ) { -//logerror("%04x: 68705 port A read %02x\n",cpu_get_pc(space->cpu),portA_in); - return (portA_out & ddrA) | (portA_in & ~ddrA); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + //logerror("%04x: 68705 port A read %02x\n", cpu_get_pc(space->cpu), state->port_a_in); + return (state->port_a_out & state->ddr_a) | (state->port_a_in & ~state->ddr_a); } -WRITE8_HANDLER( buggychl_68705_portA_w ) +WRITE8_HANDLER( buggychl_68705_port_a_w ) { -//logerror("%04x: 68705 port A write %02x\n",cpu_get_pc(space->cpu),data); - portA_out = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + //logerror("%04x: 68705 port A write %02x\n", cpu_get_pc(space->cpu), data); + state->port_a_out = data; } -WRITE8_HANDLER( buggychl_68705_ddrA_w ) +WRITE8_HANDLER( buggychl_68705_ddr_a_w ) { - ddrA = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->ddr_a = data; } @@ -61,37 +51,40 @@ WRITE8_HANDLER( buggychl_68705_ddrA_w ) * the main Z80 memory location to access] */ -static UINT8 portB_in,portB_out,ddrB; -READ8_HANDLER( buggychl_68705_portB_r ) +READ8_HANDLER( buggychl_68705_port_b_r ) { - return (portB_out & ddrB) | (portB_in & ~ddrB); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return (state->port_b_out & state->ddr_b) | (state->port_b_in & ~state->ddr_b); } -WRITE8_HANDLER( buggychl_68705_portB_w ) +WRITE8_HANDLER( buggychl_68705_port_b_w ) { -logerror("%04x: 68705 port B write %02x\n", cpu_get_pc(space->cpu), data); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + logerror("%04x: 68705 port B write %02x\n", cpu_get_pc(space->cpu), data); - if ((ddrB & 0x02) && (~data & 0x02) && (portB_out & 0x02)) + if ((state->ddr_b & 0x02) && (~data & 0x02) && (state->port_b_out & 0x02)) { - portA_in = from_main; - if (main_sent) cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE); - main_sent = 0; -logerror("read command %02x from main cpu\n", portA_in); + state->port_a_in = state->from_main; + if (state->main_sent) + cpu_set_input_line(state->mcu, 0, CLEAR_LINE); + state->main_sent = 0; + logerror("read command %02x from main cpu\n", state->port_a_in); } - if ((ddrB & 0x04) && (data & 0x04) && (~portB_out & 0x04)) + if ((state->ddr_b & 0x04) && (data & 0x04) && (~state->port_b_out & 0x04)) { -logerror("send command %02x to main cpu\n", portA_out); - from_mcu = portA_out; - mcu_sent = 1; + logerror("send command %02x to main cpu\n", state->port_a_out); + state->from_mcu = state->port_a_out; + state->mcu_sent = 1; } - portB_out = data; + state->port_b_out = data; } -WRITE8_HANDLER( buggychl_68705_ddrB_w ) +WRITE8_HANDLER( buggychl_68705_ddr_b_w ) { - ddrB = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->ddr_b = data; } @@ -104,53 +97,61 @@ WRITE8_HANDLER( buggychl_68705_ddrB_w ) * 1 R 0 when pending command 68705->Z80 */ -static UINT8 portC_in,portC_out,ddrC; - -READ8_HANDLER( buggychl_68705_portC_r ) +READ8_HANDLER( buggychl_68705_port_c_r ) { - portC_in = 0; - if (main_sent) portC_in |= 0x01; - if (!mcu_sent) portC_in |= 0x02; -logerror("%04x: 68705 port C read %02x\n", cpu_get_pc(space->cpu), portC_in); - return (portC_out & ddrC) | (portC_in & ~ddrC); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->port_c_in = 0; + if (state->main_sent) + state->port_c_in |= 0x01; + if (!state->mcu_sent) + state->port_c_in |= 0x02; + logerror("%04x: 68705 port C read %02x\n", cpu_get_pc(space->cpu), state->port_c_in); + return (state->port_c_out & state->ddr_c) | (state->port_c_in & ~state->ddr_c); } -WRITE8_HANDLER( buggychl_68705_portC_w ) +WRITE8_HANDLER( buggychl_68705_port_c_w ) { -logerror("%04x: 68705 port C write %02x\n", cpu_get_pc(space->cpu), data); - portC_out = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + logerror("%04x: 68705 port C write %02x\n", cpu_get_pc(space->cpu), data); + state->port_c_out = data; } -WRITE8_HANDLER( buggychl_68705_ddrC_w ) +WRITE8_HANDLER( buggychl_68705_ddr_c_w ) { - ddrC = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->ddr_c = data; } WRITE8_HANDLER( buggychl_mcu_w ) { -logerror("%04x: mcu_w %02x\n", cpu_get_pc(space->cpu), data); - from_main = data; - main_sent = 1; - cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + logerror("%04x: mcu_w %02x\n", cpu_get_pc(space->cpu), data); + state->from_main = data; + state->main_sent = 1; + cpu_set_input_line(state->mcu, 0, ASSERT_LINE); } READ8_HANDLER( buggychl_mcu_r ) { -logerror("%04x: mcu_r %02x\n", cpu_get_pc(space->cpu), from_mcu); - mcu_sent = 0; - return from_mcu; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + logerror("%04x: mcu_r %02x\n", cpu_get_pc(space->cpu), state->from_mcu); + state->mcu_sent = 0; + return state->from_mcu; } READ8_HANDLER( buggychl_mcu_status_r ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; int res = 0; /* bit 0 = when 1, mcu is ready to receive data from main cpu */ /* bit 1 = when 1, mcu has sent data to the main cpu */ -//logerror("%04x: mcu_status_r\n",cpu_get_pc(space->cpu)); - if (!main_sent) res |= 0x01; - if (mcu_sent) res |= 0x02; + //logerror("%04x: mcu_status_r\n",cpu_get_pc(space->cpu)); + if (!state->main_sent) + res |= 0x01; + if (state->mcu_sent) + res |= 0x02; return res; } diff --git a/src/mame/video/40love.c b/src/mame/video/40love.c index 2592e385a99..463c38c2a1f 100644 --- a/src/mame/video/40love.c +++ b/src/mame/video/40love.c @@ -3,27 +3,8 @@ */ #include "driver.h" +#include "includes/buggychl.h" -/* -* variables -*/ - -UINT8 *fortyl_video_ctrl; - -static UINT8 fortyl_flipscreen,fortyl_pix_redraw; -static const UINT8 fortyl_xoffset = 128; - -static UINT8 *fortyl_pixram1; -static UINT8 *fortyl_pixram2; - -static bitmap_t *pixel_bitmap1; -static bitmap_t *pixel_bitmap2; - -static tilemap *background; - -int fortyl_pix_color[4]; - -static int pixram_sel; /* * color prom decoding @@ -33,9 +14,9 @@ PALETTE_INIT( fortyl ) { int i; - for (i = 0;i < machine->config->total_colors;i++) + for (i = 0; i < machine->config->total_colors; i++) { - int bit0,bit1,bit2,bit3,r,g,b; + int bit0, bit1, bit2, bit3, r, g, b; /* red component */ bit0 = (color_prom[0] >> 0) & 0x01; @@ -58,7 +39,7 @@ PALETTE_INIT( fortyl ) bit3 = (color_prom[2*machine->config->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(machine,i,MAKE_RGB(r,g,b)); + palette_set_color(machine, i, MAKE_RGB(r,g,b)); color_prom++; } @@ -82,10 +63,11 @@ colorram format (2 bytes per one tilemap character line, 8 pixels height): static TILE_GET_INFO( get_bg_tile_info ) { - int tile_number = machine->generic.videoram.u8[tile_index]; - int tile_attrib = machine->generic.colorram.u8[(tile_index/64)*2]; - int tile_h_bank = (tile_attrib&0x40)<<3; /* 0x40->0x200 */ - int tile_l_bank = (tile_attrib&0x18)<<3; /* 0x10->0x80, 0x08->0x40 */ + buggychl_state *state = (buggychl_state *)machine->driver_data; + int tile_number = state->videoram[tile_index]; + int tile_attrib = state->colorram[(tile_index / 64) * 2]; + int tile_h_bank = (tile_attrib & 0x40) << 3; /* 0x40->0x200 */ + int tile_l_bank = (tile_attrib & 0x18) << 3; /* 0x10->0x80, 0x08->0x40 */ int code = tile_number; if ((tile_attrib & 0x20) && (code >= 0xc0)) @@ -106,8 +88,9 @@ static TILE_GET_INFO( get_bg_tile_info ) static STATE_POSTLOAD( redraw_pixels ) { - fortyl_pix_redraw = 1; - tilemap_mark_all_tiles_dirty(background); + buggychl_state *state = (buggychl_state *)machine->driver_data; + state->pix_redraw = 1; + tilemap_mark_all_tiles_dirty(state->bg_tilemap); } @@ -119,25 +102,28 @@ static STATE_POSTLOAD( redraw_pixels ) VIDEO_START( fortyl ) { - fortyl_pixram1 = auto_alloc_array_clear(machine, UINT8, 0x4000); - fortyl_pixram2 = auto_alloc_array_clear(machine, UINT8, 0x4000); + buggychl_state *state = (buggychl_state *)machine->driver_data; + state->pixram1 = auto_alloc_array_clear(machine, UINT8, 0x4000); + state->pixram2 = auto_alloc_array_clear(machine, UINT8, 0x4000); - pixel_bitmap1 = auto_bitmap_alloc(machine,256,256,video_screen_get_format(machine->primary_screen)); - pixel_bitmap2 = auto_bitmap_alloc(machine,256,256,video_screen_get_format(machine->primary_screen)); + state->tmp_bitmap1 = auto_bitmap_alloc(machine, 256, 256, video_screen_get_format(machine->primary_screen)); + state->tmp_bitmap2 = auto_bitmap_alloc(machine, 256, 256, video_screen_get_format(machine->primary_screen)); - background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8,8,64,32); + state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scroll_rows(background,32); - tilemap_set_transparent_pen(background,0); + state->xoffset = 128; // this never changes - state_save_register_global(machine, fortyl_flipscreen); - state_save_register_global_array(machine, fortyl_pix_color); - state_save_register_global_pointer(machine, fortyl_pixram1, 0x4000); - state_save_register_global_pointer(machine, fortyl_pixram2, 0x4000); - state_save_register_global_bitmap(machine, pixel_bitmap1); - state_save_register_global_bitmap(machine, pixel_bitmap2); - state_save_register_global(machine, pixram_sel); - state_save_register_postload(machine, redraw_pixels, NULL); + tilemap_set_scroll_rows(state->bg_tilemap, 32); + tilemap_set_transparent_pen(state->bg_tilemap, 0); + + state_save_register_global(machine, state->flipscreen); + state_save_register_global_array(machine, state->pix_color); + state_save_register_global_pointer(machine, state->pixram1, 0x4000); + state_save_register_global_pointer(machine, state->pixram2, 0x4000); + state_save_register_global_bitmap(machine, state->tmp_bitmap1); + state_save_register_global_bitmap(machine, state->tmp_bitmap2); + state_save_register_global(machine, state->pixram_sel); + state_save_register_postload(machine, redraw_pixels, NULL); } @@ -147,114 +133,124 @@ VIDEO_START( fortyl ) ***************************************************************************/ -static void fortyl_set_scroll_x(running_machine *machine, int offset) +static void fortyl_set_scroll_x( running_machine *machine, int offset ) { - int i = offset & ~1; - int x = ((machine->generic.colorram.u8[i] & 0x80) << 1) | machine->generic.colorram.u8[i+1]; /* 9 bits signed */ + buggychl_state *state = (buggychl_state *)machine->driver_data; + int i = offset & ~1; + int x = ((state->colorram[i] & 0x80) << 1) | state->colorram[i + 1]; /* 9 bits signed */ - if (fortyl_flipscreen) + if (state->flipscreen) x += 0x51; else x -= 0x50; x &= 0x1ff; - if (x&0x100) x -= 0x200; /* sign extend */ + if (x & 0x100) x -= 0x200; /* sign extend */ - tilemap_set_scrollx(background, offset/2, x); + tilemap_set_scrollx(state->bg_tilemap, offset / 2, x); } WRITE8_HANDLER( fortyl_pixram_sel_w ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; int offs; int f = data & 0x01; - pixram_sel = (data & 0x04) >> 2; + state->pixram_sel = (data & 0x04) >> 2; - if (fortyl_flipscreen != f) + if (state->flipscreen != f) { - fortyl_flipscreen = f; - flip_screen_set(space->machine, fortyl_flipscreen); - fortyl_pix_redraw = 1; + state->flipscreen = f; + flip_screen_set(space->machine, state->flipscreen); + state->pix_redraw = 1; - for (offs=0;offs<32;offs++) - fortyl_set_scroll_x(space->machine, offs*2); + for (offs = 0; offs < 32; offs++) + fortyl_set_scroll_x(space->machine, offs * 2); } } READ8_HANDLER( fortyl_pixram_r ) { - if (pixram_sel) - return fortyl_pixram2[offset]; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + if (state->pixram_sel) + return state->pixram2[offset]; else - return fortyl_pixram1[offset]; + return state->pixram1[offset]; } -static void fortyl_plot_pix(int offset) +static void fortyl_plot_pix( running_machine *machine, int offset ) { - int x,y,i,c,d1,d2; + buggychl_state *state = (buggychl_state *)machine->driver_data; + int x, y, i, c, d1, d2; - - x = (offset & 0x1f)*8; + x = (offset & 0x1f) * 8; y = (offset >> 5) & 0xff; - if (pixram_sel) + if (state->pixram_sel) { - d1 = fortyl_pixram2[offset]; - d2 = fortyl_pixram2[offset + 0x2000]; + d1 = state->pixram2[offset]; + d2 = state->pixram2[offset + 0x2000]; } else { - d1 = fortyl_pixram1[offset]; - d2 = fortyl_pixram1[offset + 0x2000]; + d1 = state->pixram1[offset]; + d2 = state->pixram1[offset + 0x2000]; } - for (i=0;i<8;i++) + for (i = 0; i < 8; i++) { - c = ((d2>>i)&1) + ((d1>>i)&1)*2; - if (pixram_sel) - *BITMAP_ADDR16(pixel_bitmap2, y, x+i) = fortyl_pix_color[c]; + c = ((d2 >> i) & 1) + ((d1 >> i) & 1) * 2; + if (state->pixram_sel) + *BITMAP_ADDR16(state->tmp_bitmap2, y, x + i) = state->pix_color[c]; else - *BITMAP_ADDR16(pixel_bitmap1, y, x+i) = fortyl_pix_color[c]; + *BITMAP_ADDR16(state->tmp_bitmap1, y, x + i) = state->pix_color[c]; } } WRITE8_HANDLER( fortyl_pixram_w ) { - if (pixram_sel) - fortyl_pixram2[offset] = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + if (state->pixram_sel) + state->pixram2[offset] = data; else - fortyl_pixram1[offset] = data; + state->pixram1[offset] = data; - fortyl_plot_pix(offset & 0x1fff); + fortyl_plot_pix(space->machine, offset & 0x1fff); } WRITE8_HANDLER( fortyl_bg_videoram_w ) { - space->machine->generic.videoram.u8[offset]=data; - tilemap_mark_tile_dirty(background,offset); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->videoram[offset] = data; + tilemap_mark_tile_dirty(state->bg_tilemap, offset); } + READ8_HANDLER( fortyl_bg_videoram_r ) { - return space->machine->generic.videoram.u8[offset]; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return state->videoram[offset]; } WRITE8_HANDLER( fortyl_bg_colorram_w ) { - if( space->machine->generic.colorram.u8[offset]!=data ) + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + if (state->colorram[offset] != data) { int i; - space->machine->generic.colorram.u8[offset] = data; - for (i=(offset/2)*64; i<(offset/2)*64+64; i++) - tilemap_mark_tile_dirty(background,i); + state->colorram[offset] = data; + for (i = (offset / 2) * 64; i < (offset / 2) * 64 + 64; i++) + tilemap_mark_tile_dirty(state->bg_tilemap, i); fortyl_set_scroll_x(space->machine, offset); } } + READ8_HANDLER( fortyl_bg_colorram_r ) { - return space->machine->generic.colorram.u8[offset]; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return state->colorram[offset]; } /*************************************************************************** @@ -278,95 +274,98 @@ spriteram format (4 bytes per sprite): offset 3 xxxxxxxx x position */ -static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { - UINT8 *spriteram = machine->generic.spriteram.u8; - UINT8 *spriteram_2 = machine->generic.spriteram2.u8; + buggychl_state *state = (buggychl_state *)machine->driver_data; + UINT8 *spriteram = state->spriteram; + UINT8 *spriteram_2 = state->spriteram2; int offs; /* spriteram #1 */ - for (offs = 0; offs < machine->generic.spriteram_size; offs += 4) + for (offs = 0; offs < state->spriteram_size; offs += 4) { - int code,color,sx,sy,flipx,flipy; + int code, color, sx, sy, flipx, flipy; - sx = spriteram[offs+3]; - sy = spriteram[offs+0] +1; + sx = spriteram[offs + 3]; + sy = spriteram[offs + 0] +1; - if (fortyl_flipscreen) + if (state->flipscreen) sx = 240 - sx; else sy = 242 - sy; - code = (spriteram[offs+1] & 0x3f) + ((spriteram[offs+2] & 0x18) << 3); - flipx = ((spriteram[offs+1] & 0x40) >> 6) ^ fortyl_flipscreen; - flipy = ((spriteram[offs+1] & 0x80) >> 7) ^ fortyl_flipscreen; - color = (spriteram[offs+2] & 0x07) + 0x08; + code = (spriteram[offs + 1] & 0x3f) + ((spriteram[offs + 2] & 0x18) << 3); + flipx = ((spriteram[offs + 1] & 0x40) >> 6) ^ state->flipscreen; + flipy = ((spriteram[offs + 1] & 0x80) >> 7) ^ state->flipscreen; + color = (spriteram[offs + 2] & 0x07) + 0x08; - if (spriteram[offs+2] & 0xe0) - color = mame_rand(machine)&0xf; + if (spriteram[offs + 2] & 0xe0) + color = mame_rand(machine) & 0xf; drawgfx_transpen(bitmap,cliprect,machine->gfx[1], code, color, flipx,flipy, - sx+fortyl_xoffset,sy,0); + sx+state->xoffset,sy,0); } /* spriteram #2 */ - for (offs = 0; offs < machine->generic.spriteram2_size; offs += 4) + for (offs = 0; offs < state->spriteram2_size; offs += 4) { - int code,color,sx,sy,flipx,flipy; + int code, color, sx, sy, flipx, flipy; - sx = spriteram_2[offs+3]; - sy = spriteram_2[offs+0] +1; + sx = spriteram_2[offs + 3]; + sy = spriteram_2[offs + 0] +1; - if (fortyl_flipscreen) + if (state->flipscreen) sx = 240 - sx; else sy = 242 - sy; - code = (spriteram_2[offs+1] & 0x3f) + ((spriteram_2[offs+2] & 0x18) << 3); - flipx = ((spriteram_2[offs+1] & 0x40) >> 6) ^ fortyl_flipscreen; - flipy = ((spriteram_2[offs+1] & 0x80) >> 7) ^ fortyl_flipscreen; - color = (spriteram_2[offs+2] & 0x07) + 0x08; + code = (spriteram_2[offs + 1] & 0x3f) + ((spriteram_2[offs + 2] & 0x18) << 3); + flipx = ((spriteram_2[offs + 1] & 0x40) >> 6) ^ state->flipscreen; + flipy = ((spriteram_2[offs + 1] & 0x80) >> 7) ^ state->flipscreen; + color = (spriteram_2[offs + 2] & 0x07) + 0x08; - if (spriteram_2[offs+2] & 0xe0) - color = mame_rand(machine)&0xf; + if (spriteram_2[offs + 2] & 0xe0) + color = mame_rand(machine) & 0xf; drawgfx_transpen(bitmap,cliprect,machine->gfx[1], code, color, flipx,flipy, - sx+fortyl_xoffset,sy,0); + sx+state->xoffset,sy,0); } } -static void draw_pixram( bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_pixram( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; int offs; - int f = fortyl_flipscreen ^ 1; + int f = state->flipscreen ^ 1; - if (fortyl_pix_redraw) + if (state->pix_redraw) { - fortyl_pix_redraw = 0; + state->pix_redraw = 0; - for (offs=0; offs<0x2000; offs++) - fortyl_plot_pix(offs); + for (offs = 0; offs < 0x2000; offs++) + fortyl_plot_pix(machine, offs); } - if (pixram_sel) - copybitmap(bitmap,pixel_bitmap1,f,f,fortyl_xoffset,0,cliprect); + if (state->pixram_sel) + copybitmap(bitmap, state->tmp_bitmap1, f, f, state->xoffset, 0, cliprect); else - copybitmap(bitmap,pixel_bitmap2,f,f,fortyl_xoffset,0,cliprect); + copybitmap(bitmap, state->tmp_bitmap2, f, f, state->xoffset, 0, cliprect); } VIDEO_UPDATE( fortyl ) { - draw_pixram(bitmap,cliprect); + buggychl_state *state = (buggychl_state *)screen->machine->driver_data; + draw_pixram(screen->machine, bitmap, cliprect); - tilemap_set_scrolldy(background,-fortyl_video_ctrl[1]+1,-fortyl_video_ctrl[1]-1 ); - tilemap_draw(bitmap,cliprect,background,0,0); + tilemap_set_scrolldy(state->bg_tilemap, - state->video_ctrl[1] + 1, - state->video_ctrl[1] - 1 ); + tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); - draw_sprites(screen->machine,bitmap,cliprect); + draw_sprites(screen->machine, bitmap, cliprect); return 0; } diff --git a/src/mame/video/bking.c b/src/mame/video/bking.c index bee76d04e12..2b72aa862f7 100644 --- a/src/mame/video/bking.c +++ b/src/mame/video/bking.c @@ -8,33 +8,7 @@ #include "driver.h" #include "video/resnet.h" - - -extern UINT8* bking_playfield_ram; - - -static int pc3259_output[4]; -static int pc3259_mask; - -static UINT8 xld1; -static UINT8 xld2; -static UINT8 xld3; -static UINT8 yld1; -static UINT8 yld2; -static UINT8 yld3; - -static int ball1_pic; -static int ball2_pic; -static int crow_pic; -static int crow_flip; -static int palette_bank; -static int controller; -static int hit; - -static bitmap_t *helper0; -static bitmap_t *helper1; - -static tilemap *bg_tilemap; +#include "includes/buggychl.h" /*************************************************************************** @@ -110,37 +84,45 @@ PALETTE_INIT( bking ) WRITE8_HANDLER( bking_xld1_w ) { - xld1 = -data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->xld1 = -data; } WRITE8_HANDLER( bking_yld1_w ) { - yld1 = -data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->yld1 = -data; } WRITE8_HANDLER( bking_xld2_w ) { - xld2 = -data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->xld2 = -data; } WRITE8_HANDLER( bking_yld2_w ) { - yld2 = -data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->yld2 = -data; } WRITE8_HANDLER( bking_xld3_w ) { - xld3 = -data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->xld3 = -data; } WRITE8_HANDLER( bking_yld3_w ) { - yld3 = -data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->yld3 = -data; } WRITE8_HANDLER( bking_cont1_w ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + /* D0 = COIN LOCK */ /* D1 = BALL 5 (Controller selection) */ /* D2 = VINV (flip screen) */ @@ -153,38 +135,42 @@ WRITE8_HANDLER( bking_cont1_w ) tilemap_set_flip_all(space->machine, flip_screen_get(space->machine) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - controller = data & 0x02; + state->controller = data & 0x02; - crow_pic = (data >> 4) & 0x0f; + state->crow_pic = (data >> 4) & 0x0f; } WRITE8_HANDLER( bking_cont2_w ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + /* D0-D2 = BALL10 - BALL12 (Selects player 1 ball picture) */ /* D3-D5 = BALL20 - BALL22 (Selects player 2 ball picture) */ /* D6 = HIT1 */ /* D7 = HIT2 */ - ball1_pic = (data >> 0) & 0x07; - ball2_pic = (data >> 3) & 0x07; + state->ball1_pic = (data >> 0) & 0x07; + state->ball2_pic = (data >> 3) & 0x07; - hit = data >> 6; + state->hit = data >> 6; } WRITE8_HANDLER( bking_cont3_w ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + /* D0 = CROW INV (inverts Crow picture and coordinates) */ /* D1-D2 = COLOR 0 - COLOR 1 (switches 4 color palettes, global across all graphics) */ /* D3 = SOUND STOP */ - crow_flip = ~data & 0x01; + state->crow_flip = ~data & 0x01; - if (palette_bank != ((data >> 1) & 0x03)) + if (state->palette_bank != ((data >> 1) & 0x03)) { - tilemap_mark_all_tiles_dirty(bg_tilemap); + tilemap_mark_all_tiles_dirty(state->bg_tilemap); } - palette_bank = (data >> 1) & 0x03; + state->palette_bank = (data >> 1) & 0x03; sound_global_enable(space->machine, ~data & 0x08); } @@ -192,97 +178,109 @@ WRITE8_HANDLER( bking_cont3_w ) WRITE8_HANDLER( bking_msk_w ) { - pc3259_mask++; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->pc3259_mask++; } WRITE8_HANDLER( bking_hitclr_w ) { - pc3259_mask = 0; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->pc3259_mask = 0; - pc3259_output[0] = 0; - pc3259_output[1] = 0; - pc3259_output[2] = 0; - pc3259_output[3] = 0; + state->pc3259_output[0] = 0; + state->pc3259_output[1] = 0; + state->pc3259_output[2] = 0; + state->pc3259_output[3] = 0; } WRITE8_HANDLER( bking_playfield_w ) { - bking_playfield_ram[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset / 2); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->playfield_ram[offset] = data; + tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2); } READ8_HANDLER( bking_input_port_5_r ) { - return input_port_read(space->machine, controller ? "TRACK1_X" : "TRACK0_X"); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return input_port_read(space->machine, state->controller ? "TRACK1_X" : "TRACK0_X"); } READ8_HANDLER( bking_input_port_6_r ) { - return input_port_read(space->machine, controller ? "TRACK1_Y" : "TRACK0_Y"); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return input_port_read(space->machine, state->controller ? "TRACK1_Y" : "TRACK0_Y"); } READ8_HANDLER( bking_pos_r ) { - return pc3259_output[offset / 8] << 4; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + return state->pc3259_output[offset / 8] << 4; } static TILE_GET_INFO( get_tile_info ) { - UINT8 code0 = bking_playfield_ram[2 * tile_index + 0]; - UINT8 code1 = bking_playfield_ram[2 * tile_index + 1]; + buggychl_state *state = (buggychl_state *)machine->driver_data; + UINT8 code0 = state->playfield_ram[2 * tile_index + 0]; + UINT8 code1 = state->playfield_ram[2 * tile_index + 1]; int flags = 0; if (code1 & 4) flags |= TILE_FLIPX; if (code1 & 8) flags |= TILE_FLIPY; - SET_TILE_INFO(0, code0 + 256 * code1, palette_bank, flags); + SET_TILE_INFO(0, code0 + 256 * code1, state->palette_bank, flags); } VIDEO_START( bking ) { - bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - helper0 = video_screen_auto_bitmap_alloc(machine->primary_screen); - helper1 = video_screen_auto_bitmap_alloc(machine->primary_screen); + buggychl_state *state = (buggychl_state *)machine->driver_data; + state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + state->tmp_bitmap1 = video_screen_auto_bitmap_alloc(machine->primary_screen); + state->tmp_bitmap2 = video_screen_auto_bitmap_alloc(machine->primary_screen); + + state_save_register_global_bitmap(machine, state->tmp_bitmap1); + state_save_register_global_bitmap(machine, state->tmp_bitmap2); } VIDEO_UPDATE( bking ) { - tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); + buggychl_state *state = (buggychl_state *)screen->machine->driver_data; + + tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); /* draw the balls */ - drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[2], - ball1_pic, - palette_bank, + state->ball1_pic, + state->palette_bank, 0, 0, - xld1, yld1, 0); + state->xld1, state->yld1, 0); drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[3], - ball2_pic, - palette_bank, + state->ball2_pic, + state->palette_bank, 0, 0, - xld2, yld2, 0); + state->xld2, state->yld2, 0); /* draw the crow */ - drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1], - crow_pic, - palette_bank, - crow_flip, crow_flip, - crow_flip ? xld3 - 16 : 256 - xld3, crow_flip ? yld3 - 16 : 256 - yld3, 0); + state->crow_pic, + state->palette_bank, + state->crow_flip, state->crow_flip, + state->crow_flip ? state->xld3 - 16 : 256 - state->xld3, state->crow_flip ? state->yld3 - 16 : 256 - state->yld3, 0); return 0; } VIDEO_EOF( bking ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; static const rectangle rect = { 0, 7, 0, 15 }; int xld = 0; @@ -290,27 +288,27 @@ VIDEO_EOF( bking ) UINT32 latch = 0; - if (pc3259_mask == 6) /* player 1 */ + if (state->pc3259_mask == 6) /* player 1 */ { - xld = xld1; - yld = yld1; + xld = state->xld1; + yld = state->yld1; - drawgfx_opaque(helper1, &rect, machine->gfx[2], - ball1_pic, + drawgfx_opaque(state->tmp_bitmap2, &rect, machine->gfx[2], + state->ball1_pic, 0, 0, 0, 0, 0); - latch = 0x0C00; + latch = 0x0c00; } - if (pc3259_mask == 3) /* player 2 */ + if (state->pc3259_mask == 3) /* player 2 */ { - xld = xld2; - yld = yld2; + xld = state->xld2; + yld = state->yld2; - drawgfx_opaque(helper1, &rect, machine->gfx[3], - ball2_pic, + drawgfx_opaque(state->tmp_bitmap2, &rect, machine->gfx[3], + state->ball2_pic, 0, 0, 0, 0, 0); @@ -318,25 +316,25 @@ VIDEO_EOF( bking ) latch = 0x0400; } - tilemap_set_scrollx(bg_tilemap, 0, flip_screen_get(machine) ? -xld : xld); - tilemap_set_scrolly(bg_tilemap, 0, flip_screen_get(machine) ? -yld : yld); + tilemap_set_scrollx(state->bg_tilemap, 0, flip_screen_get(machine) ? -xld : xld); + tilemap_set_scrolly(state->bg_tilemap, 0, flip_screen_get(machine) ? -yld : yld); - tilemap_draw(helper0, &rect, bg_tilemap, 0, 0); + tilemap_draw(state->tmp_bitmap1, &rect, state->bg_tilemap, 0, 0); - tilemap_set_scrollx(bg_tilemap, 0, 0); - tilemap_set_scrolly(bg_tilemap, 0, 0); + tilemap_set_scrollx(state->bg_tilemap, 0, 0); + tilemap_set_scrolly(state->bg_tilemap, 0, 0); if (latch != 0) { - const UINT8* MASK = memory_region(machine, "user1") + 8 * hit; + const UINT8* MASK = memory_region(machine, "user1") + 8 * state->hit; int x; int y; for (y = rect.min_y; y <= rect.max_y; y++) { - const UINT16* p0 = BITMAP_ADDR16(helper0, y, 0); - const UINT16* p1 = BITMAP_ADDR16(helper1, y, 0); + const UINT16* p0 = BITMAP_ADDR16(state->tmp_bitmap1, y, 0); + const UINT16* p1 = BITMAP_ADDR16(state->tmp_bitmap2, y, 0); for (x = rect.min_x; x <= rect.max_x; x++) { @@ -348,10 +346,10 @@ VIDEO_EOF( bking ) latch |= (flip_screen_get(machine) ? 31 - col : col) << 0; latch |= (flip_screen_get(machine) ? 31 - row : row) << 5; - pc3259_output[0] = (latch >> 0x0) & 0xf; - pc3259_output[1] = (latch >> 0x4) & 0xf; - pc3259_output[2] = (latch >> 0x8) & 0xf; - pc3259_output[3] = (latch >> 0xc) & 0xf; + state->pc3259_output[0] = (latch >> 0x0) & 0xf; + state->pc3259_output[1] = (latch >> 0x4) & 0xf; + state->pc3259_output[2] = (latch >> 0x8) & 0xf; + state->pc3259_output[3] = (latch >> 0xc) & 0xf; return; } diff --git a/src/mame/video/buggychl.c b/src/mame/video/buggychl.c index 2689a2f5137..5475f3767a2 100644 --- a/src/mame/video/buggychl.c +++ b/src/mame/video/buggychl.c @@ -3,59 +3,54 @@ #include "includes/buggychl.h" - -UINT8 *buggychl_scrollv,*buggychl_scrollh; -static UINT8 buggychl_sprite_lookup[0x2000]; -UINT8 *buggychl_character_ram; - -static bitmap_t *tmpbitmap1,*tmpbitmap2; -static int sl_bank,bg_on,sky_on,sprite_color_base,bg_scrollx; - - - PALETTE_INIT( buggychl ) { int i; /* arbitrary blue shading for the sky */ - for (i = 0;i < 128;i++) - palette_set_color(machine,i+128,MAKE_RGB(0,i,2*i)); + for (i = 0; i < 128; i++) + palette_set_color(machine, i + 128, MAKE_RGB(0, i, 2 * i)); } - - - VIDEO_START( buggychl ) { - tmpbitmap1 = video_screen_auto_bitmap_alloc(machine->primary_screen); - tmpbitmap2 = video_screen_auto_bitmap_alloc(machine->primary_screen); + buggychl_state *state = (buggychl_state *)machine->driver_data; + state->tmp_bitmap1 = video_screen_auto_bitmap_alloc(machine->primary_screen); + state->tmp_bitmap2 = video_screen_auto_bitmap_alloc(machine->primary_screen); - gfx_element_set_source(machine->gfx[0], buggychl_character_ram); + state_save_register_global_bitmap(machine, state->tmp_bitmap1); + state_save_register_global_bitmap(machine, state->tmp_bitmap2); + + gfx_element_set_source(machine->gfx[0], state->charram); } WRITE8_HANDLER( buggychl_chargen_w ) { - if (buggychl_character_ram[offset] != data) + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + if (state->charram[offset] != data) { - buggychl_character_ram[offset] = data; + state->charram[offset] = data; gfx_element_mark_dirty(space->machine->gfx[0], (offset / 8) & 0xff); } } WRITE8_HANDLER( buggychl_sprite_lookup_bank_w ) { - sl_bank = (data & 0x10) << 8; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sl_bank = (data & 0x10) << 8; } WRITE8_HANDLER( buggychl_sprite_lookup_w ) { - buggychl_sprite_lookup[offset + sl_bank] = data; + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->sprite_lookup[offset + state->sl_bank] = data; } WRITE8_HANDLER( buggychl_ctrl_w ) { + buggychl_state *state = (buggychl_state *)space->machine->driver_data; /* bit7 = lamp bit6 = lockout @@ -69,49 +64,51 @@ WRITE8_HANDLER( buggychl_ctrl_w ) flip_screen_y_set(space->machine, data & 0x01); flip_screen_x_set(space->machine, data & 0x02); - bg_on = data & 0x04; - sky_on = data & 0x08; + state->bg_on = data & 0x04; + state->sky_on = data & 0x08; - sprite_color_base = (data & 0x10) ? 1*16 : 3*16; + state->sprite_color_base = (data & 0x10) ? 1 * 16 : 3 * 16; coin_lockout_global_w(space->machine, (~data & 0x40) >> 6); - set_led_status(space->machine, 0,~data & 0x80); + set_led_status(space->machine, 0, ~data & 0x80); } WRITE8_HANDLER( buggychl_bg_scrollx_w ) { - bg_scrollx = -(data - 0x12); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->bg_scrollx = -(data - 0x12); } - - -static void draw_sky(bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sky( bitmap_t *bitmap, const rectangle *cliprect ) { - int x,y; + int x, y; - for (y = 0;y < 256;y++) - for (x = 0;x < 256;x++) - *BITMAP_ADDR16(bitmap, y, x) = 128 + x/2; + for (y = 0; y < 256; y++) + for (x = 0; x < 256; x++) + *BITMAP_ADDR16(bitmap, y, x) = 128 + x / 2; } -static void draw_bg(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_bg( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; int offs; int scroll[256]; - for (offs = 0;offs < 0x400;offs++) + for (offs = 0; offs < 0x400; offs++) { - int code = machine->generic.videoram.u8[0x400+offs]; + int code = state->videoram[0x400 + offs]; int sx = offs % 32; int sy = offs / 32; - if (flip_screen_x_get(machine)) sx = 31 - sx; - if (flip_screen_y_get(machine)) sy = 31 - sy; + if (flip_screen_x_get(machine)) + sx = 31 - sx; + if (flip_screen_y_get(machine)) + sy = 31 - sy; - drawgfx_opaque(tmpbitmap1,NULL,machine->gfx[0], + drawgfx_opaque(state->tmp_bitmap1, NULL, machine->gfx[0], code, 2, flip_screen_x_get(machine),flip_screen_y_get(machine), @@ -119,37 +116,39 @@ static void draw_bg(running_machine *machine, bitmap_t *bitmap, const rectangle } /* first copy to a temp bitmap doing column scroll */ - for (offs = 0;offs < 256;offs++) - scroll[offs] = -buggychl_scrollv[offs/8]; + for (offs = 0; offs < 256; offs++) + scroll[offs] = -state->scrollv[offs / 8]; - copyscrollbitmap(tmpbitmap2,tmpbitmap1,1,&bg_scrollx,256,scroll,NULL); + copyscrollbitmap(state->tmp_bitmap2, state->tmp_bitmap1, 1, &state->bg_scrollx, 256, scroll, NULL); /* then copy to the screen doing row scroll */ - for (offs = 0;offs < 256;offs++) - scroll[offs] = -buggychl_scrollh[offs]; + for (offs = 0; offs < 256; offs++) + scroll[offs] = -state->scrollh[offs]; - copyscrollbitmap_trans(bitmap,tmpbitmap2,256,scroll,0,0,cliprect,32); + copyscrollbitmap_trans(bitmap, state->tmp_bitmap2, 256, scroll, 0, 0, cliprect, 32); } -static void draw_fg(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_fg( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { + buggychl_state *state = (buggychl_state *)machine->driver_data; int offs; - - for (offs = 0;offs < 0x400;offs++) + for (offs = 0; offs < 0x400; offs++) { int sx = offs % 32; int sy = offs / 32; int flipx = flip_screen_x_get(machine); int flipy = flip_screen_y_get(machine); /* the following line is most likely wrong */ - int transpen = (bg_on && sx >= 22) ? -1 : 0; + int transpen = (state->bg_on && sx >= 22) ? -1 : 0; - int code = machine->generic.videoram.u8[offs]; + int code = state->videoram[offs]; - if (flipx) sx = 31 - sx; - if (flipy) sy = 31 - sy; + if (flipx) + sx = 31 - sx; + if (flipy) + sy = 31 - sy; drawgfx_transpen(bitmap,cliprect,machine->gfx[0], code, @@ -161,69 +160,68 @@ static void draw_fg(running_machine *machine, bitmap_t *bitmap, const rectangle } -static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { - UINT8 *spriteram = machine->generic.spriteram.u8; + buggychl_state *state = (buggychl_state *)machine->driver_data; + UINT8 *spriteram = state->spriteram; int offs; const UINT8 *gfx; profiler_mark_start(PROFILER_USER1); gfx = memory_region(machine, "gfx2"); - for (offs = 0;offs < machine->generic.spriteram_size;offs += 4) + for (offs = 0; offs < state->spriteram_size; offs += 4) { - int sx,sy,flipy,zoom,ch,x,px,y; + int sx, sy, flipy, zoom, ch, x, px, y; const UINT8 *lookup; - const UINT8 *zoomx_rom,*zoomy_rom; + const UINT8 *zoomx_rom, *zoomy_rom; - - sx = spriteram[offs+3] - ((spriteram[offs+2] & 0x80) << 1); - sy = 256-64 - spriteram[offs] + ((spriteram[offs+1] & 0x80) << 1); - flipy = spriteram[offs+1] & 0x40; - zoom = spriteram[offs+1] & 0x3f; + sx = spriteram[offs + 3] - ((spriteram[offs + 2] & 0x80) << 1); + sy = 256 - 64 - spriteram[offs] + ((spriteram[offs + 1] & 0x80) << 1); + flipy = spriteram[offs + 1] & 0x40; + zoom = spriteram[offs + 1] & 0x3f; zoomy_rom = gfx + (zoom << 6); zoomx_rom = gfx + 0x2000 + (zoom << 3); - lookup = buggychl_sprite_lookup + ((spriteram[offs+2] & 0x7f) << 6); + lookup = state->sprite_lookup + ((spriteram[offs + 2] & 0x7f) << 6); - for (y = 0;y < 64;y++) + for (y = 0; y < 64; y++) { int dy = flip_screen_y_get(machine) ? (255 - sy - y) : (sy + y); if ((dy & ~0xff) == 0) { - int charline,base_pos; + int charline, base_pos; charline = zoomy_rom[y] & 0x07; base_pos = zoomy_rom[y] & 0x38; - if (flipy) base_pos ^= 0x38; + if (flipy) + base_pos ^= 0x38; px = 0; - for (ch = 0;ch < 4;ch++) + for (ch = 0; ch < 4; ch++) { - int pos,code,realflipy; + int pos, code, realflipy; const UINT8 *pendata; - pos = base_pos + 2*ch; - code = 8 * (lookup[pos] | ((lookup[pos+1] & 0x07) << 8)); - realflipy = (lookup[pos+1] & 0x80) ? !flipy : flipy; + pos = base_pos + 2 * ch; + code = 8 * (lookup[pos] | ((lookup[pos + 1] & 0x07) << 8)); + realflipy = (lookup[pos + 1] & 0x80) ? !flipy : flipy; code += (realflipy ? (charline ^ 7) : charline); pendata = gfx_element_get_data(machine->gfx[1], code); - for (x = 0;x < 16;x++) + for (x = 0; x < 16; x++) { - int col; - - col = pendata[x]; + int col = pendata[x]; if (col) { int dx = flip_screen_x_get(machine) ? (255 - sx - px) : (sx + px); if ((dx & ~0xff) == 0) - *BITMAP_ADDR16(bitmap, dy, dx) = sprite_color_base + col; + *BITMAP_ADDR16(bitmap, dy, dx) = state->sprite_color_base + col; } /* the following line is almost certainly wrong */ - if (zoomx_rom[7-(2*ch+x/8)] & (1 << (x & 7))) + if (zoomx_rom[7 - (2 * ch + x / 8)] & (1 << (x & 7))) px++; } } @@ -237,12 +235,14 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta VIDEO_UPDATE( buggychl ) { - if (sky_on) + buggychl_state *state = (buggychl_state *)screen->machine->driver_data; + + if (state->sky_on) draw_sky(bitmap, cliprect); else - bitmap_fill(bitmap,cliprect,0); + bitmap_fill(bitmap, cliprect, 0); - if (bg_on) + if (state->bg_on) draw_bg(screen->machine, bitmap, cliprect); draw_sprites(screen->machine, bitmap, cliprect); diff --git a/src/mame/video/msisaac.c b/src/mame/video/msisaac.c index acf8ba08979..0b6212e731e 100644 --- a/src/mame/video/msisaac.c +++ b/src/mame/video/msisaac.c @@ -3,17 +3,7 @@ */ #include "driver.h" - -/* -* variables -*/ -UINT8 *msisaac_videoram; -UINT8 *msisaac_videoram2; - -//static int textbank1; -static int bg2_textbank; - -static tilemap *background, *background2, *foreground; +#include "includes/buggychl.h" /*************************************************************************** @@ -24,32 +14,35 @@ static tilemap *background, *background2, *foreground; static TILE_GET_INFO( get_fg_tile_info ) { - int tile_number = machine->generic.videoram.u8[tile_index]; - SET_TILE_INFO( 0, + buggychl_state *state = (buggychl_state *)machine->driver_data; + int tile_number = state->videoram[tile_index]; + SET_TILE_INFO( 0, tile_number, 0x10, 0); } -static TILE_GET_INFO( get_bg2_tile_info ) +static TILE_GET_INFO( get_bg_tile_info ) { - int tile_number = msisaac_videoram2[tile_index]; - - /* graphics 0 or 1 */ - int gfx_b = (bg2_textbank>>3) & 1; - - SET_TILE_INFO( gfx_b, - tile_number, - 0x20, + buggychl_state *state = (buggychl_state *)machine->driver_data; + int tile_number = state->videoram2[tile_index]; + SET_TILE_INFO( 1, + 0x100 + tile_number, + 0x30, 0); } -static TILE_GET_INFO( get_bg_tile_info ) +static TILE_GET_INFO( get_bg2_tile_info ) { - int tile_number = msisaac_videoram[tile_index]; - SET_TILE_INFO( 1, - 0x100+tile_number, - 0x30, + buggychl_state *state = (buggychl_state *)machine->driver_data; + int tile_number = state->videoram3[tile_index]; + + /* graphics 0 or 1 */ + int gfx_b = (state->bg2_textbank >> 3) & 1; + + SET_TILE_INFO( gfx_b, + tile_number, + 0x20, 0); } @@ -61,12 +54,13 @@ static TILE_GET_INFO( get_bg_tile_info ) VIDEO_START( msisaac ) { - background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8,8,32,32); - background2 = tilemap_create(machine, get_bg2_tile_info,tilemap_scan_rows,8,8,32,32); - foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows,8,8,32,32); + buggychl_state *state = (buggychl_state *)machine->driver_data; + state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + state->bg2_tilemap = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(background2,0); - tilemap_set_transparent_pen(foreground,0); + tilemap_set_transparent_pen(state->bg2_tilemap, 0); + tilemap_set_transparent_pen(state->fg_tilemap, 0); } @@ -78,77 +72,87 @@ VIDEO_START( msisaac ) WRITE8_HANDLER( msisaac_fg_scrolly_w ) { - tilemap_set_scrolly( foreground, 0, data ); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + tilemap_set_scrolly(state->fg_tilemap, 0, data); } WRITE8_HANDLER( msisaac_fg_scrollx_w ) { - tilemap_set_scrollx( foreground, 0, 9+data ); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + tilemap_set_scrollx(state->fg_tilemap, 0, 9 + data); } WRITE8_HANDLER( msisaac_bg2_scrolly_w ) { - tilemap_set_scrolly( background2, 0, data ); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + tilemap_set_scrolly(state->bg2_tilemap, 0, data); } WRITE8_HANDLER( msisaac_bg2_scrollx_w ) { - tilemap_set_scrollx( background2, 0, 9+2+data ); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + tilemap_set_scrollx(state->bg2_tilemap, 0, 9 + 2 + data); } WRITE8_HANDLER( msisaac_bg_scrolly_w ) { - tilemap_set_scrolly( background, 0, data ); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + tilemap_set_scrolly(state->bg_tilemap, 0, data); } WRITE8_HANDLER( msisaac_bg_scrollx_w ) { - tilemap_set_scrollx( background, 0, 9+4+data ); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + tilemap_set_scrollx(state->bg_tilemap, 0, 9 + 4 + data); } #ifdef UNUSED_FUNCTION WRITE8_HANDLER( msisaac_textbank1_w ) { - if( textbank1!=data ) + if (textbank1!=data) { textbank1 = data; - tilemap_mark_all_tiles_dirty( foreground ); + tilemap_mark_all_tiles_dirty(fg_tilemap); } } #endif WRITE8_HANDLER( msisaac_bg2_textbank_w ) { - if( bg2_textbank != data ) + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + if (state->bg2_textbank != data ) { - bg2_textbank = data; - tilemap_mark_all_tiles_dirty( background2 ); + state->bg2_textbank = data; + tilemap_mark_all_tiles_dirty(state->bg2_tilemap); //check if we are correct on this one - if ((data!=8) && (data!=0)) + if ((data != 8) && (data != 0)) { - logerror("bg2 control=%2x\n",data); + logerror("bg2 control=%2x\n", data); } } } WRITE8_HANDLER( msisaac_bg_videoram_w ) { - msisaac_videoram[offset]=data; - tilemap_mark_tile_dirty(background,offset); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->videoram2[offset] = data; + tilemap_mark_tile_dirty(state->bg_tilemap, offset); } WRITE8_HANDLER( msisaac_bg2_videoram_w ) { - msisaac_videoram2[offset]=data; - tilemap_mark_tile_dirty(background2,offset); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->videoram3[offset] = data; + tilemap_mark_tile_dirty(state->bg2_tilemap, offset); } WRITE8_HANDLER( msisaac_fg_videoram_w ) { - space->machine->generic.videoram.u8[offset]=data; - tilemap_mark_tile_dirty(foreground,offset); + buggychl_state *state = (buggychl_state *)space->machine->driver_data; + state->videoram[offset] = data; + tilemap_mark_tile_dirty(state->fg_tilemap, offset); } @@ -157,33 +161,34 @@ WRITE8_HANDLER( msisaac_fg_videoram_w ) Display refresh ***************************************************************************/ -static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) { - const UINT8 *source = machine->generic.spriteram.u8+32*4-4; - const UINT8 *finish = machine->generic.spriteram.u8; /* ? */ + buggychl_state *state = (buggychl_state *)machine->driver_data; + const UINT8 *source = state->spriteram + 32 * 4 - 4; + const UINT8 *finish = state->spriteram; /* ? */ - while( source>=finish ) + while (source >= finish) { - int sx = source[0]; - int sy = 240-source[1]-1; - int attributes = source[2]; - int sprite_number = source[3]; + int sx = source[0]; + int sy = 240 - source[1] - 1; + int attributes = source[2]; + int sprite_number = source[3]; - int color = (attributes>>4) & 0xf; - int flipx = (attributes&0x1); - int flipy = (attributes&0x2); + int color = (attributes >> 4) & 0xf; + int flipx = (attributes & 0x1); + int flipy = (attributes & 0x2); gfx_element *gfx = machine->gfx[2]; - if (attributes&4) + if (attributes & 4) { - //color = rand()&15; + //color = rand() & 15; gfx = machine->gfx[3]; } - if (attributes&8) /* double size sprite */ + if (attributes & 8) /* double size sprite */ { - switch(attributes&3) + switch (attributes & 3) { case 0: /* flipx==0 && flipy==0 */ drawgfx_transpen(bitmap,cliprect,gfx, @@ -241,10 +246,10 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta VIDEO_UPDATE( msisaac ) { - tilemap_draw(bitmap,cliprect,background, 0,0); - tilemap_draw(bitmap,cliprect,background2,0,0); - draw_sprites(screen->machine,bitmap,cliprect); - tilemap_draw(bitmap,cliprect,foreground, 0,0); + buggychl_state *state = (buggychl_state *)screen->machine->driver_data; + tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0); + tilemap_draw(bitmap, cliprect, state->bg2_tilemap, 0, 0); + draw_sprites(screen->machine, bitmap, cliprect); + tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0); return 0; } -