mirror of
https://github.com/holub/mame
synced 2025-05-29 00:53:09 +03:00
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)
This commit is contained in:
parent
71be191faf
commit
6ad7e040ec
@ -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")
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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)
|
||||
|
@ -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 )
|
||||
|
@ -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 );
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user