mirror of
https://github.com/holub/mame
synced 2025-07-04 01:18:59 +03:00
namcos2 and namcos21: moved most remaining functions into classes (nw).
This commit is contained in:
parent
bc00aadc06
commit
54c3e62516
@ -309,10 +309,9 @@ CPU68 PCB:
|
|||||||
#define ENABLE_LOGGING 0
|
#define ENABLE_LOGGING 0
|
||||||
|
|
||||||
|
|
||||||
static INT32
|
INT32 namcos21_state::read_pointrom_data(unsigned offset)
|
||||||
ReadPointROMData( running_machine &machine, unsigned offset )
|
|
||||||
{
|
{
|
||||||
const INT32 *pPointData = (INT32 *)machine.root_device().memregion( "user2" )->base();
|
const INT32 *pPointData = (INT32 *)memregion( "user2" )->base();
|
||||||
INT32 result = pPointData[offset];
|
INT32 result = pPointData[offset];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -378,25 +377,22 @@ READ16_MEMBER(namcos21_state::dspcuskey_r)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void namcos21_state::transmit_word_to_slave(UINT16 data)
|
||||||
TransmitWordToSlave( namcos21_state *state, UINT16 data )
|
|
||||||
{
|
{
|
||||||
unsigned offs = state->m_mpDspState->slaveInputStart+state->m_mpDspState->slaveBytesAvailable++;
|
unsigned offs = m_mpDspState->slaveInputStart+m_mpDspState->slaveBytesAvailable++;
|
||||||
state->m_mpDspState->slaveInputBuffer[offs%DSP_BUF_MAX] = data;
|
m_mpDspState->slaveInputBuffer[offs%DSP_BUF_MAX] = data;
|
||||||
if (ENABLE_LOGGING) logerror( "+%04x(#%04x)\n", data, state->m_mpDspState->slaveBytesAvailable );
|
if (ENABLE_LOGGING) logerror( "+%04x(#%04x)\n", data, m_mpDspState->slaveBytesAvailable );
|
||||||
state->m_mpDspState->slaveActive = 1;
|
m_mpDspState->slaveActive = 1;
|
||||||
if( state->m_mpDspState->slaveBytesAvailable >= DSP_BUF_MAX )
|
if( m_mpDspState->slaveBytesAvailable >= DSP_BUF_MAX )
|
||||||
{
|
{
|
||||||
logerror( "IDC overflow\n" );
|
logerror( "IDC overflow\n" );
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
} /* TransmitWordToSlave */
|
}
|
||||||
|
|
||||||
static void
|
void namcos21_state::transfer_dsp_data()
|
||||||
TransferDspData( running_machine &machine )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
UINT16 addr = m_mpDspState->masterSourceAddr;
|
||||||
UINT16 addr = state->m_mpDspState->masterSourceAddr;
|
|
||||||
int mode = addr&0x8000;
|
int mode = addr&0x8000;
|
||||||
addr&=0x7fff;
|
addr&=0x7fff;
|
||||||
if( addr )
|
if( addr )
|
||||||
@ -405,13 +401,13 @@ TransferDspData( running_machine &machine )
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
UINT16 old = addr;
|
UINT16 old = addr;
|
||||||
UINT16 code = state->m_dspram16[addr++];
|
UINT16 code = m_dspram16[addr++];
|
||||||
if( code == 0xffff )
|
if( code == 0xffff )
|
||||||
{
|
{
|
||||||
if( mode )
|
if( mode )
|
||||||
{
|
{
|
||||||
addr = state->m_dspram16[addr];
|
addr = m_dspram16[addr];
|
||||||
state->m_mpDspState->masterSourceAddr = addr;
|
m_mpDspState->masterSourceAddr = addr;
|
||||||
if (ENABLE_LOGGING) logerror( "LOOP:0x%04x\n", addr );
|
if (ENABLE_LOGGING) logerror( "LOOP:0x%04x\n", addr );
|
||||||
addr&=0x7fff;
|
addr&=0x7fff;
|
||||||
if( old==addr )
|
if( old==addr )
|
||||||
@ -421,59 +417,59 @@ TransferDspData( running_machine &machine )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
state->m_mpDspState->masterSourceAddr = 0;
|
m_mpDspState->masterSourceAddr = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( mode==0 )
|
else if( mode==0 )
|
||||||
{ /* direct data transfer */
|
{ /* direct data transfer */
|
||||||
if (ENABLE_LOGGING) logerror( "DATA TFR(0x%x)\n", code );
|
if (ENABLE_LOGGING) logerror( "DATA TFR(0x%x)\n", code );
|
||||||
TransmitWordToSlave( state, code );
|
transmit_word_to_slave(code);
|
||||||
for( i=0; i<code; i++ )
|
for( i=0; i<code; i++ )
|
||||||
{
|
{
|
||||||
UINT16 data = state->m_dspram16[addr++];
|
UINT16 data = m_dspram16[addr++];
|
||||||
TransmitWordToSlave( state, data );
|
transmit_word_to_slave(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( code==0x18 || code==0x1a )
|
else if( code==0x18 || code==0x1a )
|
||||||
{
|
{
|
||||||
if (ENABLE_LOGGING) logerror( "HEADER TFR(0x%x)\n", code );
|
if (ENABLE_LOGGING) logerror( "HEADER TFR(0x%x)\n", code );
|
||||||
TransmitWordToSlave( state, code+1 );
|
transmit_word_to_slave(code+1);
|
||||||
for( i=0; i<code; i++ )
|
for( i=0; i<code; i++ )
|
||||||
{
|
{
|
||||||
UINT16 data = state->m_dspram16[addr++];
|
UINT16 data = m_dspram16[addr++];
|
||||||
TransmitWordToSlave( state, data );
|
transmit_word_to_slave(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
INT32 masterAddr = ReadPointROMData(machine, code);
|
INT32 masterAddr = read_pointrom_data(code);
|
||||||
if (ENABLE_LOGGING) logerror( "OBJ TFR(0x%x)\n", code );
|
if (ENABLE_LOGGING) logerror( "OBJ TFR(0x%x)\n", code );
|
||||||
{
|
{
|
||||||
UINT16 len = state->m_dspram16[addr++];
|
UINT16 len = m_dspram16[addr++];
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
int subAddr = ReadPointROMData(machine, masterAddr++);
|
int subAddr = read_pointrom_data(masterAddr++);
|
||||||
if( subAddr==0xffffff )
|
if( subAddr==0xffffff )
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int primWords = (UINT16)ReadPointROMData(machine, subAddr++);
|
int primWords = (UINT16)read_pointrom_data(subAddr++);
|
||||||
if( primWords>2 )
|
if( primWords>2 )
|
||||||
{
|
{
|
||||||
TransmitWordToSlave( state, 0 ); /* pad1 */
|
transmit_word_to_slave(0); /* pad1 */
|
||||||
TransmitWordToSlave( state, len+1 );
|
transmit_word_to_slave(len+1);
|
||||||
for( i=0; i<len; i++ )
|
for( i=0; i<len; i++ )
|
||||||
{ /* transform */
|
{ /* transform */
|
||||||
TransmitWordToSlave( state, state->m_dspram16[addr+i] );
|
transmit_word_to_slave(m_dspram16[addr+i]);
|
||||||
}
|
}
|
||||||
TransmitWordToSlave( state, 0 ); /* pad2 */
|
transmit_word_to_slave(0); /* pad2 */
|
||||||
TransmitWordToSlave( state, primWords+1 );
|
transmit_word_to_slave(primWords+1);
|
||||||
for( i=0; i<primWords; i++ )
|
for( i=0; i<primWords; i++ )
|
||||||
{
|
{
|
||||||
TransmitWordToSlave( state, (UINT16)ReadPointROMData(machine, subAddr+i) );
|
transmit_word_to_slave((UINT16)read_pointrom_data(subAddr+i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -487,34 +483,34 @@ TransferDspData( running_machine &machine )
|
|||||||
}
|
}
|
||||||
} /* for(;;) */
|
} /* for(;;) */
|
||||||
}
|
}
|
||||||
} /* TransferDspData */
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void namcos21_kickstart(running_machine &machine, int internal)
|
||||||
namcos21_kickstart( running_machine &machine, int internal )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
namcos21_state *state = machine.driver_data<namcos21_state>();
|
||||||
|
|
||||||
/* patch dsp watchdog */
|
/* patch dsp watchdog */
|
||||||
switch( state->m_gametype )
|
switch( state->m_gametype )
|
||||||
{
|
{
|
||||||
case NAMCOS21_AIRCOMBAT:
|
case NAMCOS21_AIRCOMBAT:
|
||||||
state->m_master_dsp_code[0x008e] = 0x808f;
|
state->m_master_dsp_code[0x008e] = 0x808f;
|
||||||
break;
|
break;
|
||||||
case NAMCOS21_SOLVALOU:
|
case NAMCOS21_SOLVALOU:
|
||||||
state->m_master_dsp_code[0x008b] = 0x808c;
|
state->m_master_dsp_code[0x008b] = 0x808c;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( internal )
|
if( internal )
|
||||||
{
|
{
|
||||||
if( state->m_mbNeedsKickstart==0 ) return;
|
if( state->m_mbNeedsKickstart==0 ) return;
|
||||||
state->m_mbNeedsKickstart--;
|
state->m_mbNeedsKickstart--;
|
||||||
if( state->m_mbNeedsKickstart ) return;
|
if( state->m_mbNeedsKickstart ) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
namcos21_ClearPolyFrameBuffer(machine);
|
state->clear_poly_framebuffer();
|
||||||
state->m_mpDspState->masterSourceAddr = 0;
|
state->m_mpDspState->masterSourceAddr = 0;
|
||||||
state->m_mpDspState->slaveOutputSize = 0;
|
state->m_mpDspState->slaveOutputSize = 0;
|
||||||
state->m_mpDspState->masterFinished = 0;
|
state->m_mpDspState->masterFinished = 0;
|
||||||
@ -523,44 +519,40 @@ namcos21_kickstart( running_machine &machine, int internal )
|
|||||||
state->m_dspslave->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
|
state->m_dspslave->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT16
|
UINT16 namcos21_state::read_word_from_slave_input()
|
||||||
ReadWordFromSlaveInput( address_space &space )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = space.machine().driver_data<namcos21_state>();
|
|
||||||
UINT16 data = 0;
|
UINT16 data = 0;
|
||||||
if( state->m_mpDspState->slaveBytesAvailable>0 )
|
if( m_mpDspState->slaveBytesAvailable>0 )
|
||||||
{
|
{
|
||||||
data = state->m_mpDspState->slaveInputBuffer[state->m_mpDspState->slaveInputStart++];
|
data = m_mpDspState->slaveInputBuffer[m_mpDspState->slaveInputStart++];
|
||||||
state->m_mpDspState->slaveInputStart %= DSP_BUF_MAX;
|
m_mpDspState->slaveInputStart %= DSP_BUF_MAX;
|
||||||
state->m_mpDspState->slaveBytesAvailable--;
|
m_mpDspState->slaveBytesAvailable--;
|
||||||
if( state->m_mpDspState->slaveBytesAdvertised>0 )
|
if( m_mpDspState->slaveBytesAdvertised>0 )
|
||||||
{
|
{
|
||||||
state->m_mpDspState->slaveBytesAdvertised--;
|
m_mpDspState->slaveBytesAdvertised--;
|
||||||
}
|
}
|
||||||
if (ENABLE_LOGGING) logerror( "%s:-%04x(0x%04x)\n", space.machine().describe_context(), data, state->m_mpDspState->slaveBytesAvailable );
|
if (ENABLE_LOGGING) logerror( "%s:-%04x(0x%04x)\n", machine().describe_context(), data, m_mpDspState->slaveBytesAvailable );
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
} /* ReadWordFromSlaveInput */
|
}
|
||||||
|
|
||||||
static size_t
|
size_t namcos21_state::get_input_bytes_advertised_for_slave()
|
||||||
GetInputBytesAdvertisedForSlave( running_machine &machine )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
if( m_mpDspState->slaveBytesAdvertised < m_mpDspState->slaveBytesAvailable )
|
||||||
if( state->m_mpDspState->slaveBytesAdvertised < state->m_mpDspState->slaveBytesAvailable )
|
|
||||||
{
|
{
|
||||||
state->m_mpDspState->slaveBytesAdvertised++;
|
m_mpDspState->slaveBytesAdvertised++;
|
||||||
}
|
}
|
||||||
else if( state->m_mpDspState->slaveActive && state->m_mpDspState->masterFinished && state->m_mpDspState->masterSourceAddr )
|
else if( m_mpDspState->slaveActive && m_mpDspState->masterFinished && m_mpDspState->masterSourceAddr )
|
||||||
{
|
{
|
||||||
namcos21_kickstart(machine, 0);
|
namcos21_kickstart(machine(), 0);
|
||||||
}
|
}
|
||||||
return state->m_mpDspState->slaveBytesAdvertised;
|
return m_mpDspState->slaveBytesAdvertised;
|
||||||
} /* GetInputBytesAdvertisedForSlave */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dspram16_r)
|
READ16_MEMBER(namcos21_state::dspram16_r)
|
||||||
{
|
{
|
||||||
return m_dspram16[offset];
|
return m_dspram16[offset];
|
||||||
} /* dspram16_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dspram16_w)
|
WRITE16_MEMBER(namcos21_state::dspram16_w)
|
||||||
{
|
{
|
||||||
@ -572,7 +564,7 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
|
|||||||
offset == 1+(m_mpDspState->masterSourceAddr&0x7fff) )
|
offset == 1+(m_mpDspState->masterSourceAddr&0x7fff) )
|
||||||
{
|
{
|
||||||
if (ENABLE_LOGGING) logerror( "IDC-CONTINUE\n" );
|
if (ENABLE_LOGGING) logerror( "IDC-CONTINUE\n" );
|
||||||
TransferDspData(machine());
|
transfer_dsp_data();
|
||||||
}
|
}
|
||||||
else if (m_gametype == NAMCOS21_SOLVALOU &&
|
else if (m_gametype == NAMCOS21_SOLVALOU &&
|
||||||
offset == 0x103 &&
|
offset == 0x103 &&
|
||||||
@ -581,15 +573,13 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
|
|||||||
space.device().execute().yield();
|
space.device().execute().yield();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* dspram16_w */
|
}
|
||||||
|
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
|
|
||||||
static int
|
int namcos21_state::init_dsp()
|
||||||
InitDSP( running_machine &machine )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
UINT16 *pMem = (UINT16 *)memregion("dspmaster")->base();
|
||||||
UINT16 *pMem = (UINT16 *)state->memregion("dspmaster")->base();
|
|
||||||
/**
|
/**
|
||||||
* DSP BIOS tests "CPU ID" on startup
|
* DSP BIOS tests "CPU ID" on startup
|
||||||
* "JAPAN (C)1990 NAMCO LTD. by H.F "
|
* "JAPAN (C)1990 NAMCO LTD. by H.F "
|
||||||
@ -598,7 +588,7 @@ InitDSP( running_machine &machine )
|
|||||||
pMem[0x8000] = 0xFF80;
|
pMem[0x8000] = 0xFF80;
|
||||||
pMem[0x8001] = 0x0000;
|
pMem[0x8001] = 0x0000;
|
||||||
|
|
||||||
state->m_mpDspState = auto_alloc_clear(machine, dsp_state);
|
m_mpDspState = auto_alloc_clear(machine(), dsp_state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -609,16 +599,16 @@ InitDSP( running_machine &machine )
|
|||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_port0_r)
|
READ16_MEMBER(namcos21_state::dsp_port0_r)
|
||||||
{
|
{
|
||||||
INT32 data = ReadPointROMData(machine(), m_pointrom_idx++);
|
INT32 data = read_pointrom_data(m_pointrom_idx++);
|
||||||
m_mPointRomMSB = (UINT8)(data>>16);
|
m_mPointRomMSB = (UINT8)(data>>16);
|
||||||
m_mbPointRomDataAvailable = 1;
|
m_mbPointRomDataAvailable = 1;
|
||||||
return (UINT16)data;
|
return (UINT16)data;
|
||||||
} /* dsp_port0_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_port0_w)
|
WRITE16_MEMBER(namcos21_state::dsp_port0_w)
|
||||||
{ /* unused? */
|
{ /* unused? */
|
||||||
if (ENABLE_LOGGING) logerror( "PTRAM_LO(0x%04x)\n", data );
|
if (ENABLE_LOGGING) logerror( "PTRAM_LO(0x%04x)\n", data );
|
||||||
} /* dsp_port0_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_port1_r)
|
READ16_MEMBER(namcos21_state::dsp_port1_r)
|
||||||
{
|
{
|
||||||
@ -628,44 +618,44 @@ READ16_MEMBER(namcos21_state::dsp_port1_r)
|
|||||||
return m_mPointRomMSB;
|
return m_mPointRomMSB;
|
||||||
}
|
}
|
||||||
return 0x8000; /* IDC ack? */
|
return 0x8000; /* IDC ack? */
|
||||||
} /* dsp_port1_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_port1_w)
|
WRITE16_MEMBER(namcos21_state::dsp_port1_w)
|
||||||
{ /* unused? */
|
{ /* unused? */
|
||||||
if (ENABLE_LOGGING) logerror( "PTRAM_HI(0x%04x)\n", data );
|
if (ENABLE_LOGGING) logerror( "PTRAM_HI(0x%04x)\n", data );
|
||||||
} /* dsp_port1_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_port2_r)
|
READ16_MEMBER(namcos21_state::dsp_port2_r)
|
||||||
{ /* IDC TRANSMIT ENABLE? */
|
{ /* IDC TRANSMIT ENABLE? */
|
||||||
return 0;
|
return 0;
|
||||||
} /* dsp_port2_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_port2_w)
|
WRITE16_MEMBER(namcos21_state::dsp_port2_w)
|
||||||
{
|
{
|
||||||
if (ENABLE_LOGGING) logerror( "IDC ADDR INIT(0x%04x)\n", data );
|
if (ENABLE_LOGGING) logerror( "IDC ADDR INIT(0x%04x)\n", data );
|
||||||
m_mpDspState->masterSourceAddr = data;
|
m_mpDspState->masterSourceAddr = data;
|
||||||
TransferDspData(machine());
|
transfer_dsp_data();
|
||||||
} /* dsp_port2_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_port3_idc_rcv_enable_r)
|
READ16_MEMBER(namcos21_state::dsp_port3_idc_rcv_enable_r)
|
||||||
{ /* IDC RECEIVE ENABLE? */
|
{ /* IDC RECEIVE ENABLE? */
|
||||||
return 0;
|
return 0;
|
||||||
} /* dsp_port3_idc_rcv_enable_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_port3_w)
|
WRITE16_MEMBER(namcos21_state::dsp_port3_w)
|
||||||
{
|
{
|
||||||
m_pointrom_idx<<=16;
|
m_pointrom_idx<<=16;
|
||||||
m_pointrom_idx|=data;
|
m_pointrom_idx|=data;
|
||||||
} /* dsp_port3_w */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_port4_w)
|
WRITE16_MEMBER(namcos21_state::dsp_port4_w)
|
||||||
{ /* receives $0B<<4 prior to IDC setup */
|
{ /* receives $0B<<4 prior to IDC setup */
|
||||||
} /* dsp_port4_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_port8_r)
|
READ16_MEMBER(namcos21_state::dsp_port8_r)
|
||||||
{ /* SMU status */
|
{ /* SMU status */
|
||||||
return 1;
|
return 1;
|
||||||
} /* dsp_port8_r */
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_port8_w)
|
WRITE16_MEMBER(namcos21_state::dsp_port8_w)
|
||||||
@ -676,17 +666,17 @@ WRITE16_MEMBER(namcos21_state::dsp_port8_w)
|
|||||||
m_mpDspState->masterFinished = 1;
|
m_mpDspState->masterFinished = 1;
|
||||||
}
|
}
|
||||||
m_irq_enable = data;
|
m_irq_enable = data;
|
||||||
} /* dsp_port8_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_port9_r)
|
READ16_MEMBER(namcos21_state::dsp_port9_r)
|
||||||
{ /* render-device-busy; used for direct-draw */
|
{ /* render-device-busy; used for direct-draw */
|
||||||
return 0;
|
return 0;
|
||||||
} /* dsp_port9_r */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_porta_r)
|
READ16_MEMBER(namcos21_state::dsp_porta_r)
|
||||||
{ /* config */
|
{ /* config */
|
||||||
return 0;
|
return 0;
|
||||||
} /* dsp_porta_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_porta_w)
|
WRITE16_MEMBER(namcos21_state::dsp_porta_w)
|
||||||
{
|
{
|
||||||
@ -696,12 +686,12 @@ WRITE16_MEMBER(namcos21_state::dsp_porta_w)
|
|||||||
/* direct-draw begin: 0 */
|
/* direct-draw begin: 0 */
|
||||||
/* INT1 begin: 1 */
|
/* INT1 begin: 1 */
|
||||||
// if (ENABLE_LOGGING) logerror( "dsp_porta_w(0x%04x)\n", data );
|
// if (ENABLE_LOGGING) logerror( "dsp_porta_w(0x%04x)\n", data );
|
||||||
} /* dsp_porta_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_portb_r)
|
READ16_MEMBER(namcos21_state::dsp_portb_r)
|
||||||
{ /* config */
|
{ /* config */
|
||||||
return 1;
|
return 1;
|
||||||
} /* dsp_portb_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_portb_w)
|
WRITE16_MEMBER(namcos21_state::dsp_portb_w)
|
||||||
{
|
{
|
||||||
@ -722,7 +712,7 @@ WRITE16_MEMBER(namcos21_state::dsp_portb_w)
|
|||||||
}
|
}
|
||||||
if( color&0x8000 )
|
if( color&0x8000 )
|
||||||
{
|
{
|
||||||
namcos21_DrawQuad( machine(), sx, sy, zcode, color );
|
draw_quad(sx, sy, zcode, color);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -734,7 +724,7 @@ WRITE16_MEMBER(namcos21_state::dsp_portb_w)
|
|||||||
logerror( "unexpected masterDirectDrawSize=%d!\n",m_mpDspState->masterDirectDrawSize );
|
logerror( "unexpected masterDirectDrawSize=%d!\n",m_mpDspState->masterDirectDrawSize );
|
||||||
}
|
}
|
||||||
m_mpDspState->masterDirectDrawSize = 0;
|
m_mpDspState->masterDirectDrawSize = 0;
|
||||||
} /* dsp_portb_w */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_portc_w)
|
WRITE16_MEMBER(namcos21_state::dsp_portc_w)
|
||||||
{
|
{
|
||||||
@ -746,12 +736,12 @@ WRITE16_MEMBER(namcos21_state::dsp_portc_w)
|
|||||||
{
|
{
|
||||||
logerror( "portc overflow\n" );
|
logerror( "portc overflow\n" );
|
||||||
}
|
}
|
||||||
} /* dsp_portc_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::dsp_portf_r)
|
READ16_MEMBER(namcos21_state::dsp_portf_r)
|
||||||
{ /* informs BIOS that this is Master DSP */
|
{ /* informs BIOS that this is Master DSP */
|
||||||
return 0;
|
return 0;
|
||||||
} /* dsp_portf_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::dsp_xf_w)
|
WRITE16_MEMBER(namcos21_state::dsp_xf_w)
|
||||||
{
|
{
|
||||||
@ -787,22 +777,20 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
/************************************************************************************/
|
/************************************************************************************/
|
||||||
|
|
||||||
static void
|
void namcos21_state::render_slave_output(UINT16 data)
|
||||||
RenderSlaveOutput( running_machine &machine, UINT16 data )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
if( m_mpDspState->slaveOutputSize >= 4096 )
|
||||||
if( state->m_mpDspState->slaveOutputSize >= 4096 )
|
|
||||||
{
|
{
|
||||||
fatalerror( "FATAL ERROR: SLAVE OVERFLOW (0x%x)\n",state->m_mpDspState->slaveOutputBuffer[0] );
|
fatalerror( "FATAL ERROR: SLAVE OVERFLOW (0x%x)\n",m_mpDspState->slaveOutputBuffer[0] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* append word to slave output buffer */
|
/* append word to slave output buffer */
|
||||||
state->m_mpDspState->slaveOutputBuffer[state->m_mpDspState->slaveOutputSize++] = data;
|
m_mpDspState->slaveOutputBuffer[m_mpDspState->slaveOutputSize++] = data;
|
||||||
|
|
||||||
{
|
{
|
||||||
UINT16 *pSource = state->m_mpDspState->slaveOutputBuffer;
|
UINT16 *pSource = m_mpDspState->slaveOutputBuffer;
|
||||||
UINT16 count = *pSource++;
|
UINT16 count = *pSource++;
|
||||||
if( count && state->m_mpDspState->slaveOutputSize > count )
|
if( count && m_mpDspState->slaveOutputSize > count )
|
||||||
{
|
{
|
||||||
UINT16 color = *pSource++;
|
UINT16 color = *pSource++;
|
||||||
int sx[4], sy[4],zcode[4];
|
int sx[4], sy[4],zcode[4];
|
||||||
@ -816,30 +804,30 @@ RenderSlaveOutput( running_machine &machine, UINT16 data )
|
|||||||
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[3*j+1];
|
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[3*j+1];
|
||||||
zcode[j] = pSource[3*j+2];
|
zcode[j] = pSource[3*j+2];
|
||||||
}
|
}
|
||||||
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
|
draw_quad(sx, sy, zcode, color&0x7fff);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int quad_idx = color*6;
|
int quad_idx = color*6;
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
UINT8 code = state->m_pointram[quad_idx++];
|
UINT8 code = m_pointram[quad_idx++];
|
||||||
color = state->m_pointram[quad_idx++]|(code<<8);
|
color = m_pointram[quad_idx++]|(code<<8);
|
||||||
for( j=0; j<4; j++ )
|
for( j=0; j<4; j++ )
|
||||||
{
|
{
|
||||||
UINT8 vi = state->m_pointram[quad_idx++];
|
UINT8 vi = m_pointram[quad_idx++];
|
||||||
sx[j] = NAMCOS21_POLY_FRAME_WIDTH/2 + (INT16)pSource[vi*3+0];
|
sx[j] = NAMCOS21_POLY_FRAME_WIDTH/2 + (INT16)pSource[vi*3+0];
|
||||||
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
|
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
|
||||||
zcode[j] = pSource[vi*3+2];
|
zcode[j] = pSource[vi*3+2];
|
||||||
}
|
}
|
||||||
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
|
draw_quad(sx, sy, zcode, color&0x7fff);
|
||||||
if( code&0x80 )
|
if( code&0x80 )
|
||||||
{ /* end-of-quadlist marker */
|
{ /* end-of-quadlist marker */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state->m_mpDspState->slaveOutputSize = 0;
|
m_mpDspState->slaveOutputSize = 0;
|
||||||
}
|
}
|
||||||
else if( count==0 )
|
else if( count==0 )
|
||||||
{
|
{
|
||||||
@ -847,22 +835,22 @@ RenderSlaveOutput( running_machine &machine, UINT16 data )
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* RenderSlaveOutput */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::slave_port0_r)
|
READ16_MEMBER(namcos21_state::slave_port0_r)
|
||||||
{
|
{
|
||||||
return ReadWordFromSlaveInput(space);
|
return read_word_from_slave_input();
|
||||||
} /* slave_port0_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::slave_port0_w)
|
WRITE16_MEMBER(namcos21_state::slave_port0_w)
|
||||||
{
|
{
|
||||||
RenderSlaveOutput( machine(), data );
|
render_slave_output(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::slave_port2_r)
|
READ16_MEMBER(namcos21_state::slave_port2_r)
|
||||||
{
|
{
|
||||||
return GetInputBytesAdvertisedForSlave(machine());
|
return get_input_bytes_advertised_for_slave();
|
||||||
} /* slave_port2_r */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::slave_port3_r)
|
READ16_MEMBER(namcos21_state::slave_port3_r)
|
||||||
{ /* render-device queue size */
|
{ /* render-device queue size */
|
||||||
@ -874,12 +862,12 @@ READ16_MEMBER(namcos21_state::slave_port3_r)
|
|||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::slave_port3_w)
|
WRITE16_MEMBER(namcos21_state::slave_port3_w)
|
||||||
{ /* 0=busy, 1=ready? */
|
{ /* 0=busy, 1=ready? */
|
||||||
} /* slave_port3_w */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::slave_XF_output_w)
|
WRITE16_MEMBER(namcos21_state::slave_XF_output_w)
|
||||||
{
|
{
|
||||||
if (ENABLE_LOGGING) logerror( "0x%x:slaveXF(%d)\n", space.device().safe_pc(), data );
|
if (ENABLE_LOGGING) logerror( "0x%x:slaveXF(%d)\n", space.device().safe_pc(), data );
|
||||||
} /* slave_XF_output_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::slave_portf_r)
|
READ16_MEMBER(namcos21_state::slave_portf_r)
|
||||||
{ /* informs BIOS that this is Slave DSP */
|
{ /* informs BIOS that this is Slave DSP */
|
||||||
@ -957,12 +945,12 @@ WRITE16_MEMBER(namcos21_state::pointram_control_w)
|
|||||||
logerror( "\n" );
|
logerror( "\n" );
|
||||||
#endif
|
#endif
|
||||||
m_pointram_idx = 0; /* HACK */
|
m_pointram_idx = 0; /* HACK */
|
||||||
} /* pointram_control_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::pointram_data_r)
|
READ16_MEMBER(namcos21_state::pointram_data_r)
|
||||||
{
|
{
|
||||||
return m_pointram[m_pointram_idx];
|
return m_pointram[m_pointram_idx];
|
||||||
} /* pointram_data_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::pointram_data_w)
|
WRITE16_MEMBER(namcos21_state::pointram_data_w)
|
||||||
{
|
{
|
||||||
@ -973,7 +961,7 @@ WRITE16_MEMBER(namcos21_state::pointram_data_w)
|
|||||||
m_pointram[m_pointram_idx++] = data;
|
m_pointram[m_pointram_idx++] = data;
|
||||||
m_pointram_idx &= (PTRAM_SIZE-1);
|
m_pointram_idx &= (PTRAM_SIZE-1);
|
||||||
}
|
}
|
||||||
} /* pointram_data_w */
|
}
|
||||||
|
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::namcos21_depthcue_r)
|
READ16_MEMBER(namcos21_state::namcos21_depthcue_r)
|
||||||
@ -1123,19 +1111,17 @@ READ16_MEMBER(namcos21_state::winrun_cuskey_r)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} /* winrun_cuskey_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::winrun_cuskey_w)
|
WRITE16_MEMBER(namcos21_state::winrun_cuskey_w)
|
||||||
{
|
{
|
||||||
} /* winrun_cuskey_w */
|
}
|
||||||
|
|
||||||
static void
|
void namcos21_state::winrun_flush_poly()
|
||||||
winrun_flushpoly( running_machine &machine )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
if( m_winrun_poly_index>0 )
|
||||||
if( state->m_winrun_poly_index>0 )
|
|
||||||
{
|
{
|
||||||
const UINT16 *pSource = state->m_winrun_poly_buf;
|
const UINT16 *pSource = m_winrun_poly_buf;
|
||||||
UINT16 color;
|
UINT16 color;
|
||||||
int sx[4], sy[4], zcode[4];
|
int sx[4], sy[4], zcode[4];
|
||||||
int j;
|
int j;
|
||||||
@ -1148,36 +1134,36 @@ winrun_flushpoly( running_machine &machine )
|
|||||||
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)*pSource++;
|
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)*pSource++;
|
||||||
zcode[j] = *pSource++;
|
zcode[j] = *pSource++;
|
||||||
}
|
}
|
||||||
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
|
draw_quad(sx, sy, zcode, color&0x7fff);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int quad_idx = color*6;
|
int quad_idx = color*6;
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
UINT8 code = state->m_pointram[quad_idx++];
|
UINT8 code = m_pointram[quad_idx++];
|
||||||
color = state->m_pointram[quad_idx++];
|
color = m_pointram[quad_idx++];
|
||||||
for( j=0; j<4; j++ )
|
for( j=0; j<4; j++ )
|
||||||
{
|
{
|
||||||
UINT8 vi = state->m_pointram[quad_idx++];
|
UINT8 vi = m_pointram[quad_idx++];
|
||||||
sx[j] = NAMCOS21_POLY_FRAME_WIDTH/2 + (INT16)pSource[vi*3+0];
|
sx[j] = NAMCOS21_POLY_FRAME_WIDTH/2 + (INT16)pSource[vi*3+0];
|
||||||
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
|
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
|
||||||
zcode[j] = pSource[vi*3+2];
|
zcode[j] = pSource[vi*3+2];
|
||||||
}
|
}
|
||||||
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
|
draw_quad(sx, sy, zcode, color&0x7fff);
|
||||||
if( code&0x80 )
|
if( code&0x80 )
|
||||||
{ /* end-of-quadlist marker */
|
{ /* end-of-quadlist marker */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state->m_winrun_poly_index = 0;
|
m_winrun_poly_index = 0;
|
||||||
}
|
}
|
||||||
} /* winrun_flushpoly */
|
} /* winrun_flushpoly */
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::winrun_poly_reset_r)
|
READ16_MEMBER(namcos21_state::winrun_poly_reset_r)
|
||||||
{
|
{
|
||||||
winrun_flushpoly(machine());
|
winrun_flush_poly();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1191,7 +1177,7 @@ WRITE16_MEMBER(namcos21_state::winrun_dsp_render_w)
|
|||||||
{
|
{
|
||||||
logerror( "WINRUN_POLY_OVERFLOW\n" );
|
logerror( "WINRUN_POLY_OVERFLOW\n" );
|
||||||
}
|
}
|
||||||
} /* winrun_dsp_render_w */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::winrun_dsp_pointrom_addr_w)
|
WRITE16_MEMBER(namcos21_state::winrun_dsp_pointrom_addr_w)
|
||||||
{
|
{
|
||||||
@ -1209,15 +1195,15 @@ READ16_MEMBER(namcos21_state::winrun_dsp_pointrom_data_r)
|
|||||||
{
|
{
|
||||||
UINT16 *ptrom = (UINT16 *)memregion("user2")->base();
|
UINT16 *ptrom = (UINT16 *)memregion("user2")->base();
|
||||||
return ptrom[m_winrun_pointrom_addr++];
|
return ptrom[m_winrun_pointrom_addr++];
|
||||||
} /* winrun_dsp_pointrom_data_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(namcos21_state::winrun_dsp_complete_w)
|
WRITE16_MEMBER(namcos21_state::winrun_dsp_complete_w)
|
||||||
{
|
{
|
||||||
if( data )
|
if( data )
|
||||||
{
|
{
|
||||||
winrun_flushpoly(machine());
|
winrun_flush_poly();
|
||||||
m_dsp->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
|
m_dsp->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
|
||||||
namcos21_ClearPolyFrameBuffer(machine());
|
clear_poly_framebuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1271,7 +1257,7 @@ WRITE16_MEMBER(namcos21_state::winrun_dspbios_w)
|
|||||||
memcpy( mem, m_winrun_dspbios, 0x2000 );
|
memcpy( mem, m_winrun_dspbios, 0x2000 );
|
||||||
m_winrun_dsp_alive = 1;
|
m_winrun_dsp_alive = 1;
|
||||||
}
|
}
|
||||||
} /* winrun_dspbios_w */
|
}
|
||||||
|
|
||||||
//380000 : read : dsp status? 1 = busy
|
//380000 : read : dsp status? 1 = busy
|
||||||
//380000 : write(0x01) - done before dsp comram init
|
//380000 : write(0x01) - done before dsp comram init
|
||||||
@ -2254,19 +2240,18 @@ ROM_START( winrun91 )
|
|||||||
ROM_LOAD("r911-avo3.11e", 0x180000, 0x80000,CRC(76e22f92) SHA1(0e1b8d35a5b9c20cc3192d935f0c9da1e69679d2) )
|
ROM_LOAD("r911-avo3.11e", 0x180000, 0x80000,CRC(76e22f92) SHA1(0e1b8d35a5b9c20cc3192d935f0c9da1e69679d2) )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
static void namcos21_init( running_machine &machine, int game_type )
|
void namcos21_state::init(int game_type)
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
m_gametype = game_type;
|
||||||
state->m_gametype = game_type;
|
m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE);
|
||||||
state->m_pointram = auto_alloc_array(machine, UINT8, PTRAM_SIZE);
|
m_mpDataROM = (UINT16 *)memregion( "user1" )->base();
|
||||||
state->m_mpDataROM = (UINT16 *)state->memregion( "user1" )->base();
|
init_dsp();
|
||||||
InitDSP(machine);
|
m_mbNeedsKickstart = 20;
|
||||||
state->m_mbNeedsKickstart = 20;
|
|
||||||
if( game_type==NAMCOS21_CYBERSLED )
|
if( game_type==NAMCOS21_CYBERSLED )
|
||||||
{
|
{
|
||||||
state->m_mbNeedsKickstart = 200;
|
m_mbNeedsKickstart = 200;
|
||||||
}
|
}
|
||||||
} /* namcos21_init */
|
}
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(namcos21_state,winrun)
|
DRIVER_INIT_MEMBER(namcos21_state,winrun)
|
||||||
{
|
{
|
||||||
@ -2286,18 +2271,18 @@ DRIVER_INIT_MEMBER(namcos21_state,winrun)
|
|||||||
|
|
||||||
DRIVER_INIT_MEMBER(namcos21_state,aircomb)
|
DRIVER_INIT_MEMBER(namcos21_state,aircomb)
|
||||||
{
|
{
|
||||||
namcos21_init( machine(), NAMCOS21_AIRCOMBAT );
|
init(NAMCOS21_AIRCOMBAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(namcos21_state,starblad)
|
DRIVER_INIT_MEMBER(namcos21_state,starblad)
|
||||||
{
|
{
|
||||||
namcos21_init( machine(), NAMCOS21_STARBLADE );
|
init(NAMCOS21_STARBLADE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(namcos21_state,cybsled)
|
DRIVER_INIT_MEMBER(namcos21_state,cybsled)
|
||||||
{
|
{
|
||||||
namcos21_init( machine(), NAMCOS21_CYBERSLED );
|
init(NAMCOS21_CYBERSLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(namcos21_state,solvalou)
|
DRIVER_INIT_MEMBER(namcos21_state,solvalou)
|
||||||
@ -2308,7 +2293,7 @@ DRIVER_INIT_MEMBER(namcos21_state,solvalou)
|
|||||||
mem[0x20cf4/2+1] = 0x4e71;
|
mem[0x20cf4/2+1] = 0x4e71;
|
||||||
mem[0x20cf4/2+2] = 0x4e71;
|
mem[0x20cf4/2+2] = 0x4e71;
|
||||||
|
|
||||||
namcos21_init( machine(), NAMCOS21_SOLVALOU );
|
init(NAMCOS21_SOLVALOU );
|
||||||
}
|
}
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(namcos21_state,driveyes)
|
DRIVER_INIT_MEMBER(namcos21_state,driveyes)
|
||||||
|
@ -121,6 +121,15 @@ public:
|
|||||||
bool is_system21();
|
bool is_system21();
|
||||||
int m_gametype;
|
int m_gametype;
|
||||||
|
|
||||||
|
emu_timer *m_posirq_timer;
|
||||||
|
int m_mcu_analog_ctrl;
|
||||||
|
int m_mcu_analog_data;
|
||||||
|
int m_mcu_analog_complete;
|
||||||
|
UINT8 *m_eeprom;
|
||||||
|
UINT16 m_68k_master_C148[0x20];
|
||||||
|
UINT16 m_68k_slave_C148[0x20];
|
||||||
|
UINT16 m_68k_gpu_C148[0x20];
|
||||||
|
|
||||||
// C123 Tilemap Emulation
|
// C123 Tilemap Emulation
|
||||||
// TODO: merge with namcos1.c implementation and convert to device
|
// TODO: merge with namcos1.c implementation and convert to device
|
||||||
public:
|
public:
|
||||||
@ -210,6 +219,10 @@ public:
|
|||||||
INTERRUPT_GEN_MEMBER(namcos2_68k_gpu_vblank);
|
INTERRUPT_GEN_MEMBER(namcos2_68k_gpu_vblank);
|
||||||
TIMER_CALLBACK_MEMBER(namcos2_posirq_tick);
|
TIMER_CALLBACK_MEMBER(namcos2_posirq_tick);
|
||||||
void adjust_posirq_timer( int scanline );
|
void adjust_posirq_timer( int scanline );
|
||||||
|
void init_c148();
|
||||||
|
void reset_all_subcpus(int state);
|
||||||
|
UINT16 readwrite_c148( address_space &space, offs_t offset, UINT16 data, int bWrite );
|
||||||
|
int get_posirq_scanline();
|
||||||
|
|
||||||
DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w );
|
DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w );
|
||||||
DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r );
|
DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r );
|
||||||
@ -338,6 +351,8 @@ public:
|
|||||||
tilemap_t *m_tilemap_roz;
|
tilemap_t *m_tilemap_roz;
|
||||||
UINT16 m_gfx_ctrl;
|
UINT16 m_gfx_ctrl;
|
||||||
UINT16 m_serial_comms_ctrl[0x8];
|
UINT16 m_serial_comms_ctrl[0x8];
|
||||||
|
unsigned m_finallap_prot_count;
|
||||||
|
int m_sendval;
|
||||||
|
|
||||||
optional_device<namco_c45_road_device> m_c45_road;
|
optional_device<namco_c45_road_device> m_c45_road;
|
||||||
|
|
||||||
|
@ -25,6 +25,19 @@ struct dsp_state
|
|||||||
int slaveActive;
|
int slaveActive;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct vertex
|
||||||
|
{
|
||||||
|
double x,y;
|
||||||
|
double z;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct edge
|
||||||
|
{
|
||||||
|
double x;
|
||||||
|
double z;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class namcos21_state : public namcos2_shared_state
|
class namcos21_state : public namcos2_shared_state
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -157,8 +170,19 @@ public:
|
|||||||
DECLARE_MACHINE_START(namcos21);
|
DECLARE_MACHINE_START(namcos21);
|
||||||
DECLARE_VIDEO_START(namcos21);
|
DECLARE_VIDEO_START(namcos21);
|
||||||
UINT32 screen_update_namcos21(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update_namcos21(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
|
void allocate_poly_framebuffer();
|
||||||
|
void clear_poly_framebuffer();
|
||||||
|
void copy_visible_poly_framebuffer(bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi);
|
||||||
|
void renderscanline_flat(const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable);
|
||||||
|
void rendertri(const vertex *v0, const vertex *v1, const vertex *v2, unsigned color, int depthcueenable);
|
||||||
|
void draw_quad(int sx[4], int sy[4], int zcode[4], int color);
|
||||||
|
INT32 read_pointrom_data(unsigned offset);
|
||||||
|
void transmit_word_to_slave(UINT16 data);
|
||||||
|
void transfer_dsp_data();
|
||||||
|
UINT16 read_word_from_slave_input();
|
||||||
|
size_t get_input_bytes_advertised_for_slave();
|
||||||
|
int init_dsp();
|
||||||
|
void render_slave_output(UINT16 data);
|
||||||
|
void winrun_flush_poly();
|
||||||
|
void init(int game_type);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*----------- defined in video/namcos21.c -----------*/
|
|
||||||
extern void namcos21_ClearPolyFrameBuffer( running_machine &machine );
|
|
||||||
extern void namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4], int color );
|
|
||||||
|
@ -16,19 +16,8 @@ Namco System II
|
|||||||
#include "machine/nvram.h"
|
#include "machine/nvram.h"
|
||||||
|
|
||||||
|
|
||||||
static void InitC148(void);
|
|
||||||
|
|
||||||
static emu_timer *namcos2_posirq_timer;
|
|
||||||
|
|
||||||
void (*namcos2_kickstart)(running_machine &machine, int internal);
|
void (*namcos2_kickstart)(running_machine &machine, int internal);
|
||||||
|
|
||||||
static unsigned mFinalLapProtCount;
|
|
||||||
static int namcos2_mcu_analog_ctrl;
|
|
||||||
static int namcos2_mcu_analog_data;
|
|
||||||
static int namcos2_mcu_analog_complete;
|
|
||||||
static UINT8 *namcos2_eeprom;
|
|
||||||
static int sendval;
|
|
||||||
|
|
||||||
|
|
||||||
READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
|
READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
|
||||||
{
|
{
|
||||||
@ -47,24 +36,24 @@ READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
data = table1[mFinalLapProtCount&7];
|
data = table1[m_finallap_prot_count&7];
|
||||||
data = (data&0xff00)>>8;
|
data = (data&0xff00)>>8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
data = table1[mFinalLapProtCount&7];
|
data = table1[m_finallap_prot_count&7];
|
||||||
mFinalLapProtCount++;
|
m_finallap_prot_count++;
|
||||||
data = data&0x00ff;
|
data = data&0x00ff;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x3fffc/2:
|
case 0x3fffc/2:
|
||||||
data = table0[mFinalLapProtCount&7];
|
data = table0[m_finallap_prot_count&7];
|
||||||
data = data&0xff00;
|
data = data&0xff00;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x3fffe/2:
|
case 0x3fffe/2:
|
||||||
data = table0[mFinalLapProtCount&7];
|
data = table0[m_finallap_prot_count&7];
|
||||||
mFinalLapProtCount++;
|
m_finallap_prot_count++;
|
||||||
data = (data&0x00ff)<<8;
|
data = (data&0x00ff)<<8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -78,30 +67,27 @@ READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
|
|||||||
/* Perform basic machine initialisation */
|
/* Perform basic machine initialisation */
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
|
|
||||||
#define namcos2_eeprom_size 0x2000
|
#define m_eeprom_size 0x2000
|
||||||
|
|
||||||
static void
|
void namcos2_shared_state::reset_all_subcpus(int state)
|
||||||
ResetAllSubCPUs( running_machine &machine, int state )
|
|
||||||
{
|
{
|
||||||
namcos2_shared_state *s2state = machine.driver_data<namcos2_shared_state>();
|
m_slave->set_input_line(INPUT_LINE_RESET, state);
|
||||||
|
if (m_c68)
|
||||||
s2state->m_slave->set_input_line(INPUT_LINE_RESET, state);
|
|
||||||
if (s2state->m_c68)
|
|
||||||
{
|
{
|
||||||
s2state->m_c68->set_input_line(INPUT_LINE_RESET, state);
|
m_c68->set_input_line(INPUT_LINE_RESET, state);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s2state->m_mcu->set_input_line(INPUT_LINE_RESET, state);
|
m_mcu->set_input_line(INPUT_LINE_RESET, state);
|
||||||
}
|
}
|
||||||
switch( machine.driver_data<namcos2_shared_state>()->m_gametype )
|
switch( m_gametype )
|
||||||
{
|
{
|
||||||
case NAMCOS21_SOLVALOU:
|
case NAMCOS21_SOLVALOU:
|
||||||
case NAMCOS21_STARBLADE:
|
case NAMCOS21_STARBLADE:
|
||||||
case NAMCOS21_AIRCOMBAT:
|
case NAMCOS21_AIRCOMBAT:
|
||||||
case NAMCOS21_CYBERSLED:
|
case NAMCOS21_CYBERSLED:
|
||||||
s2state->m_dspmaster->set_input_line(INPUT_LINE_RESET, state);
|
m_dspmaster->set_input_line(INPUT_LINE_RESET, state);
|
||||||
s2state->m_dspslave->set_input_line(INPUT_LINE_RESET, state);
|
m_dspslave->set_input_line(INPUT_LINE_RESET, state);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// case NAMCOS21_WINRUN91:
|
// case NAMCOS21_WINRUN91:
|
||||||
@ -114,21 +100,19 @@ ResetAllSubCPUs( running_machine &machine, int state )
|
|||||||
MACHINE_START_MEMBER(namcos2_shared_state,namcos2)
|
MACHINE_START_MEMBER(namcos2_shared_state,namcos2)
|
||||||
{
|
{
|
||||||
namcos2_kickstart = NULL;
|
namcos2_kickstart = NULL;
|
||||||
namcos2_eeprom = auto_alloc_array(machine(), UINT8, namcos2_eeprom_size);
|
m_eeprom = auto_alloc_array(machine(), UINT8, m_eeprom_size);
|
||||||
machine().device<nvram_device>("nvram")->set_base(namcos2_eeprom, namcos2_eeprom_size);
|
machine().device<nvram_device>("nvram")->set_base(m_eeprom, m_eeprom_size);
|
||||||
namcos2_posirq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos2_shared_state::namcos2_posirq_tick),this));
|
m_posirq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos2_shared_state::namcos2_posirq_tick),this));
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_RESET_MEMBER(namcos2_shared_state,namcos2)
|
MACHINE_RESET_MEMBER(namcos2_shared_state, namcos2)
|
||||||
{
|
{
|
||||||
// address_space &space = m_maincpu->space(AS_PROGRAM);
|
// address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||||
address_space &audio_space = m_audiocpu->space(AS_PROGRAM);
|
address_space &audio_space = m_audiocpu->space(AS_PROGRAM);
|
||||||
|
|
||||||
mFinalLapProtCount = 0;
|
m_mcu_analog_ctrl = 0;
|
||||||
namcos2_mcu_analog_ctrl = 0;
|
m_mcu_analog_data = 0xaa;
|
||||||
namcos2_mcu_analog_data = 0xaa;
|
m_mcu_analog_complete = 0;
|
||||||
namcos2_mcu_analog_complete = 0;
|
|
||||||
sendval = 0;
|
|
||||||
|
|
||||||
/* Initialise the bank select in the sound CPU */
|
/* Initialise the bank select in the sound CPU */
|
||||||
namcos2_sound_bankselect_w(audio_space, 0, 0); /* Page in bank 0 */
|
namcos2_sound_bankselect_w(audio_space, 0, 0); /* Page in bank 0 */
|
||||||
@ -136,13 +120,13 @@ MACHINE_RESET_MEMBER(namcos2_shared_state,namcos2)
|
|||||||
m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE );
|
m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE );
|
||||||
|
|
||||||
/* Place CPU2 & CPU3 into the reset condition */
|
/* Place CPU2 & CPU3 into the reset condition */
|
||||||
ResetAllSubCPUs( machine(), ASSERT_LINE );
|
reset_all_subcpus(ASSERT_LINE);
|
||||||
|
|
||||||
/* Initialise interrupt handlers */
|
/* Initialise interrupt handlers */
|
||||||
InitC148();
|
init_c148();
|
||||||
|
|
||||||
/* reset POSIRQ timer */
|
/* reset POSIRQ timer */
|
||||||
namcos2_posirq_timer->adjust(attotime::never);
|
m_posirq_timer->adjust(attotime::never);
|
||||||
|
|
||||||
m_player_mux = 0;
|
m_player_mux = 0;
|
||||||
}
|
}
|
||||||
@ -153,12 +137,12 @@ MACHINE_RESET_MEMBER(namcos2_shared_state,namcos2)
|
|||||||
|
|
||||||
WRITE8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_w )
|
WRITE8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_w )
|
||||||
{
|
{
|
||||||
namcos2_eeprom[offset] = data;
|
m_eeprom[offset] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_r )
|
READ8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_r )
|
||||||
{
|
{
|
||||||
return namcos2_eeprom[offset];
|
return m_eeprom[offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -301,7 +285,7 @@ READ16_MEMBER( namcos2_state::namcos2_68k_key_r )
|
|||||||
case 1: return 0x110;
|
case 1: return 0x110;
|
||||||
case 4: return 0xBE;
|
case 4: return 0xBE;
|
||||||
case 6: return 0x1001;
|
case 6: return 0x1001;
|
||||||
case 7: return (sendval==1)?0xBE:1;
|
case 7: return (m_sendval==1)?0xBE:1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -316,14 +300,14 @@ READ16_MEMBER( namcos2_state::namcos2_68k_key_r )
|
|||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
case 4:
|
case 4:
|
||||||
if( sendval == 1 ){
|
if( m_sendval == 1 ){
|
||||||
sendval = 0;
|
m_sendval = 0;
|
||||||
return 0x13F;
|
return 0x13F;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
if( sendval == 1 ){
|
if( m_sendval == 1 ){
|
||||||
sendval = 0;
|
m_sendval = 0;
|
||||||
return 0x13F;
|
return 0x13F;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -408,19 +392,19 @@ WRITE16_MEMBER( namcos2_state::namcos2_68k_key_w )
|
|||||||
int gametype = m_gametype;
|
int gametype = m_gametype;
|
||||||
if( gametype == NAMCOS2_MARVEL_LAND && offset == 5 )
|
if( gametype == NAMCOS2_MARVEL_LAND && offset == 5 )
|
||||||
{
|
{
|
||||||
if (data == 0x615E) sendval = 1;
|
if (data == 0x615E) m_sendval = 1;
|
||||||
}
|
}
|
||||||
if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 4 )
|
if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 4 )
|
||||||
{
|
{
|
||||||
if (data == 0x13EC) sendval = 1;
|
if (data == 0x13EC) m_sendval = 1;
|
||||||
}
|
}
|
||||||
if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 7 )
|
if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 7 )
|
||||||
{
|
{
|
||||||
if (data == 0x13EC) sendval = 1;
|
if (data == 0x13EC) m_sendval = 1;
|
||||||
}
|
}
|
||||||
if( gametype == NAMCOS2_MARVEL_LAND && offset == 6 )
|
if( gametype == NAMCOS2_MARVEL_LAND && offset == 6 )
|
||||||
{
|
{
|
||||||
if (data == 0x1001) sendval = 0;
|
if (data == 0x1001) m_sendval = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,10 +416,6 @@ WRITE16_MEMBER( namcos2_state::namcos2_68k_key_w )
|
|||||||
#define FRAME_TIME (1.0/60.0)
|
#define FRAME_TIME (1.0/60.0)
|
||||||
#define LINE_LENGTH (FRAME_TIME/NO_OF_LINES)
|
#define LINE_LENGTH (FRAME_TIME/NO_OF_LINES)
|
||||||
|
|
||||||
static UINT16 namcos2_68k_master_C148[0x20];
|
|
||||||
static UINT16 namcos2_68k_slave_C148[0x20];
|
|
||||||
static UINT16 namcos2_68k_gpu_C148[0x20];
|
|
||||||
|
|
||||||
|
|
||||||
bool namcos2_shared_state::is_system21()
|
bool namcos2_shared_state::is_system21()
|
||||||
{
|
{
|
||||||
@ -453,20 +433,17 @@ bool namcos2_shared_state::is_system21()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InitC148(void)
|
void namcos2_shared_state::init_c148()
|
||||||
{
|
{
|
||||||
int loop;
|
for(int loop = 0; loop < 0x20; loop++)
|
||||||
|
|
||||||
for(loop = 0; loop < 0x20; loop++)
|
|
||||||
{
|
{
|
||||||
namcos2_68k_master_C148[loop] = 0;
|
m_68k_master_C148[loop] = 0;
|
||||||
namcos2_68k_slave_C148[loop] = 0;
|
m_68k_slave_C148[loop] = 0;
|
||||||
namcos2_68k_gpu_C148[loop] = 0;
|
m_68k_gpu_C148[loop] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT16
|
UINT16 namcos2_shared_state::readwrite_c148( address_space &space, offs_t offset, UINT16 data, int bWrite )
|
||||||
ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite )
|
|
||||||
{
|
{
|
||||||
offs_t addr = ((offset * 2) + 0x1c0000) & 0x1fe000;
|
offs_t addr = ((offset * 2) + 0x1c0000) & 0x1fe000;
|
||||||
device_t *altcpu = NULL;
|
device_t *altcpu = NULL;
|
||||||
@ -476,21 +453,21 @@ ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite )
|
|||||||
|
|
||||||
if (&space.device() == space.machine().device("maincpu"))
|
if (&space.device() == space.machine().device("maincpu"))
|
||||||
{
|
{
|
||||||
pC148Reg = namcos2_68k_master_C148;
|
pC148Reg = m_68k_master_C148;
|
||||||
altcpu = space.machine().device("slave");
|
altcpu = space.machine().device("slave");
|
||||||
pC148RegAlt = namcos2_68k_slave_C148;
|
pC148RegAlt = m_68k_slave_C148;
|
||||||
}
|
}
|
||||||
else if (&space.device() == space.machine().device("slave"))
|
else if (&space.device() == space.machine().device("slave"))
|
||||||
{
|
{
|
||||||
pC148Reg = namcos2_68k_slave_C148;
|
pC148Reg = m_68k_slave_C148;
|
||||||
altcpu = space.machine().device("maincpu");
|
altcpu = space.machine().device("maincpu");
|
||||||
pC148RegAlt = namcos2_68k_master_C148;
|
pC148RegAlt = m_68k_master_C148;
|
||||||
}
|
}
|
||||||
else if (&space.device() == space.machine().device("gpu"))
|
else if (&space.device() == space.machine().device("gpu"))
|
||||||
{
|
{
|
||||||
pC148Reg = namcos2_68k_gpu_C148;
|
pC148Reg = m_68k_gpu_C148;
|
||||||
altcpu = space.machine().device("maincpu");
|
altcpu = space.machine().device("maincpu");
|
||||||
pC148RegAlt = namcos2_68k_master_C148;
|
pC148RegAlt = m_68k_master_C148;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( bWrite )
|
if( bWrite )
|
||||||
@ -600,13 +577,13 @@ ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite )
|
|||||||
{
|
{
|
||||||
if (data & 0x01)
|
if (data & 0x01)
|
||||||
{ /* Resume execution */
|
{ /* Resume execution */
|
||||||
ResetAllSubCPUs(space.machine(), CLEAR_LINE);
|
reset_all_subcpus(CLEAR_LINE);
|
||||||
/* Give the new CPU an immediate slice of the action */
|
/* Give the new CPU an immediate slice of the action */
|
||||||
space.device().execute().yield();
|
space.device().execute().yield();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* Suspend execution */
|
{ /* Suspend execution */
|
||||||
ResetAllSubCPUs(space.machine(), ASSERT_LINE);
|
reset_all_subcpus(ASSERT_LINE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -623,85 +600,85 @@ ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite )
|
|||||||
|
|
||||||
WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_w )
|
WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_w )
|
||||||
{
|
{
|
||||||
(void)ReadWriteC148(space, offset, data, 1);
|
(void)readwrite_c148(space, offset, data, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_r )
|
READ16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_r )
|
||||||
{
|
{
|
||||||
return ReadWriteC148(space, offset, 0, 0);
|
return readwrite_c148(space, offset, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_w )
|
WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_w )
|
||||||
{
|
{
|
||||||
(void)ReadWriteC148(space, offset, data, 1);
|
(void)readwrite_c148(space, offset, data, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_r )
|
READ16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_r )
|
||||||
{
|
{
|
||||||
return ReadWriteC148(space, offset, 0, 0);
|
return readwrite_c148(space, offset, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_w )
|
WRITE16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_w )
|
||||||
{
|
{
|
||||||
(void)ReadWriteC148(space, offset, data, 1);
|
(void)readwrite_c148(space, offset, data, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_r )
|
READ16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_r )
|
||||||
{
|
{
|
||||||
return ReadWriteC148(space, offset, 0, 0);
|
return readwrite_c148(space, offset, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int GetPosIRQScanline( running_machine &machine )
|
int namcos2_shared_state::get_posirq_scanline()
|
||||||
{
|
{
|
||||||
namcos2_shared_state *state = machine.driver_data<namcos2_shared_state>();
|
namcos2_state *s2state = machine().driver_data<namcos2_state>();
|
||||||
if (state->is_system21()) return 0;
|
if (is_system21()) return 0;
|
||||||
return downcast<namcos2_state *>(state)->get_pos_irq_scanline();
|
return s2state->get_pos_irq_scanline();
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(namcos2_shared_state::namcos2_posirq_tick)
|
TIMER_CALLBACK_MEMBER(namcos2_shared_state::namcos2_posirq_tick)
|
||||||
{
|
{
|
||||||
if (is_system21()) {
|
if (is_system21()) {
|
||||||
if (namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
|
if (m_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
|
||||||
m_screen->update_partial(param);
|
m_screen->update_partial(param);
|
||||||
machine().device("gpu")->execute().set_input_line(namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
|
machine().device("gpu")->execute().set_input_line(m_68k_gpu_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (namcos2_68k_master_C148[NAMCOS2_C148_POSIRQ]|namcos2_68k_slave_C148[NAMCOS2_C148_POSIRQ]) {
|
if (m_68k_master_C148[NAMCOS2_C148_POSIRQ]|m_68k_slave_C148[NAMCOS2_C148_POSIRQ]) {
|
||||||
m_screen->update_partial(param);
|
m_screen->update_partial(param);
|
||||||
if (namcos2_68k_master_C148[NAMCOS2_C148_POSIRQ]) m_maincpu->set_input_line(namcos2_68k_master_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
|
if (m_68k_master_C148[NAMCOS2_C148_POSIRQ]) m_maincpu->set_input_line(m_68k_master_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
|
||||||
if (namcos2_68k_slave_C148[NAMCOS2_C148_POSIRQ]) m_slave->set_input_line(namcos2_68k_slave_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
|
if (m_68k_slave_C148[NAMCOS2_C148_POSIRQ]) m_slave->set_input_line(m_68k_slave_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void namcos2_shared_state::adjust_posirq_timer( int scanline )
|
void namcos2_shared_state::adjust_posirq_timer( int scanline )
|
||||||
{
|
{
|
||||||
namcos2_posirq_timer->adjust(m_screen->time_until_pos(scanline, 80), scanline);
|
m_posirq_timer->adjust(m_screen->time_until_pos(scanline, 80), scanline);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_master_vblank)
|
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_master_vblank)
|
||||||
{
|
{
|
||||||
if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine()));
|
if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
|
||||||
device.execute().set_input_line(namcos2_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
|
device.execute().set_input_line(m_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_slave_vblank)
|
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_slave_vblank)
|
||||||
{
|
{
|
||||||
if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine()));
|
if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
|
||||||
device.execute().set_input_line(namcos2_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
|
device.execute().set_input_line(m_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_gpu_vblank)
|
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_gpu_vblank)
|
||||||
{
|
{
|
||||||
/* only used by namcos21 */
|
/* only used by namcos21 */
|
||||||
int scanline = GetPosIRQScanline(machine());
|
int scanline = get_posirq_scanline();
|
||||||
scanline = 0x50+0x89; /* HACK for Winning Run */
|
scanline = 0x50+0x89; /* HACK for Winning Run */
|
||||||
|
|
||||||
//printf( "namcos2_68k_gpu_vblank(%d)\n",namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ] );
|
//printf( "namcos2_68k_gpu_vblank(%d)\n",m_68k_gpu_C148[NAMCOS2_C148_POSIRQ] );
|
||||||
adjust_posirq_timer(scanline);
|
adjust_posirq_timer(scanline);
|
||||||
device.execute().set_input_line(namcos2_68k_gpu_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
|
device.execute().set_input_line(m_68k_gpu_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
@ -724,7 +701,7 @@ WRITE8_MEMBER( namcos2_shared_state::namcos2_sound_bankselect_w )
|
|||||||
|
|
||||||
WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_ctrl_w )
|
WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_ctrl_w )
|
||||||
{
|
{
|
||||||
namcos2_mcu_analog_ctrl = data & 0xff;
|
m_mcu_analog_ctrl = data & 0xff;
|
||||||
|
|
||||||
/* Check if this is a start of conversion */
|
/* Check if this is a start of conversion */
|
||||||
/* Input ports 2 through 9 are the analog channels */
|
/* Input ports 2 through 9 are the analog channels */
|
||||||
@ -732,33 +709,33 @@ WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_ctrl_w )
|
|||||||
if(data & 0x40)
|
if(data & 0x40)
|
||||||
{
|
{
|
||||||
/* Set the conversion complete flag */
|
/* Set the conversion complete flag */
|
||||||
namcos2_mcu_analog_complete = 2;
|
m_mcu_analog_complete = 2;
|
||||||
/* We convert instantly, good eh! */
|
/* We convert instantly, good eh! */
|
||||||
switch((data>>2) & 0x07)
|
switch((data>>2) & 0x07)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
namcos2_mcu_analog_data=ioport("AN0")->read();
|
m_mcu_analog_data=ioport("AN0")->read();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
namcos2_mcu_analog_data=ioport("AN1")->read();
|
m_mcu_analog_data=ioport("AN1")->read();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
namcos2_mcu_analog_data=ioport("AN2")->read();
|
m_mcu_analog_data=ioport("AN2")->read();
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
namcos2_mcu_analog_data=ioport("AN3")->read();
|
m_mcu_analog_data=ioport("AN3")->read();
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
namcos2_mcu_analog_data=ioport("AN4")->read();
|
m_mcu_analog_data=ioport("AN4")->read();
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
namcos2_mcu_analog_data=ioport("AN5")->read();
|
m_mcu_analog_data=ioport("AN5")->read();
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
namcos2_mcu_analog_data=ioport("AN6")->read();
|
m_mcu_analog_data=ioport("AN6")->read();
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
namcos2_mcu_analog_data=ioport("AN7")->read();
|
m_mcu_analog_data=ioport("AN7")->read();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
output_set_value("anunk",data);
|
output_set_value("anunk",data);
|
||||||
@ -769,7 +746,7 @@ WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_ctrl_w )
|
|||||||
if( m_gametype == NAMCOS2_DIRT_FOX ||
|
if( m_gametype == NAMCOS2_DIRT_FOX ||
|
||||||
m_gametype == NAMCOS2_DIRT_FOX_JP )
|
m_gametype == NAMCOS2_DIRT_FOX_JP )
|
||||||
{
|
{
|
||||||
namcos2_mcu_analog_data ^= 0x80;
|
m_mcu_analog_data ^= 0x80;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* If the interrupt enable bit is set trigger an A/D IRQ */
|
/* If the interrupt enable bit is set trigger an A/D IRQ */
|
||||||
@ -785,11 +762,11 @@ READ8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_ctrl_r )
|
|||||||
int data=0;
|
int data=0;
|
||||||
|
|
||||||
/* ADEF flag is only cleared AFTER a read from control THEN a read from DATA */
|
/* ADEF flag is only cleared AFTER a read from control THEN a read from DATA */
|
||||||
if(namcos2_mcu_analog_complete==2) namcos2_mcu_analog_complete=1;
|
if(m_mcu_analog_complete==2) m_mcu_analog_complete=1;
|
||||||
if(namcos2_mcu_analog_complete) data|=0x80;
|
if(m_mcu_analog_complete) data|=0x80;
|
||||||
|
|
||||||
/* Mask on the lower 6 register bits, Irq EN/Channel/Clock */
|
/* Mask on the lower 6 register bits, Irq EN/Channel/Clock */
|
||||||
data|=namcos2_mcu_analog_ctrl&0x3f;
|
data|=m_mcu_analog_ctrl&0x3f;
|
||||||
/* Return the value */
|
/* Return the value */
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -800,8 +777,8 @@ WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_port_w )
|
|||||||
|
|
||||||
READ8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_port_r )
|
READ8_MEMBER( namcos2_shared_state::namcos2_mcu_analog_port_r )
|
||||||
{
|
{
|
||||||
if(namcos2_mcu_analog_complete==1) namcos2_mcu_analog_complete=0;
|
if(m_mcu_analog_complete==1) m_mcu_analog_complete=0;
|
||||||
return namcos2_mcu_analog_data;
|
return m_mcu_analog_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_port_d_w )
|
WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_port_d_w )
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
|
TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
|
||||||
|
//void namcos2_shared_state::tilemap_cb(UINT16 code, int *tile, int *mask)
|
||||||
{
|
{
|
||||||
*mask = code;
|
*mask = code;
|
||||||
|
|
||||||
@ -23,7 +24,7 @@ TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
|
|||||||
*tile = (code&0x07ff)|((code&0xc000)>>3)|((code&0x3800)<<2);
|
*tile = (code&0x07ff)|((code&0xc000)>>3)|((code&0x3800)<<2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} /* TilemapCB */
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* m_gfx_ctrl selects a bank of 128 sprites within spriteram
|
* m_gfx_ctrl selects a bank of 128 sprites within spriteram
|
||||||
@ -39,20 +40,20 @@ TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
|
|||||||
READ16_MEMBER( namcos2_state::gfx_ctrl_r )
|
READ16_MEMBER( namcos2_state::gfx_ctrl_r )
|
||||||
{
|
{
|
||||||
return m_gfx_ctrl;
|
return m_gfx_ctrl;
|
||||||
} /* namcos2_gfx_ctrl_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER( namcos2_state::gfx_ctrl_w )
|
WRITE16_MEMBER( namcos2_state::gfx_ctrl_w )
|
||||||
{
|
{
|
||||||
COMBINE_DATA(&m_gfx_ctrl);
|
COMBINE_DATA(&m_gfx_ctrl);
|
||||||
} /* namcos2_gfx_ctrl_w */
|
}
|
||||||
|
|
||||||
TILE_GET_INFO_MEMBER( namcos2_state::roz_tile_info )
|
TILE_GET_INFO_MEMBER( namcos2_state::roz_tile_info )
|
||||||
{
|
{
|
||||||
int tile = m_rozram[tile_index];
|
int tile = m_rozram[tile_index];
|
||||||
SET_TILE_INFO_MEMBER(3,tile,0/*color*/,0);
|
SET_TILE_INFO_MEMBER(3,tile,0/*color*/,0);
|
||||||
} /* roz_tile_info */
|
}
|
||||||
|
|
||||||
struct RozParam
|
struct roz_param
|
||||||
{
|
{
|
||||||
UINT32 size;
|
UINT32 size;
|
||||||
UINT32 startx,starty;
|
UINT32 startx,starty;
|
||||||
@ -62,7 +63,7 @@ struct RozParam
|
|||||||
};
|
};
|
||||||
|
|
||||||
INLINE void
|
INLINE void
|
||||||
DrawRozHelperBlock(const struct RozParam *rozInfo, int destx, int desty,
|
draw_roz_helper_block(const struct roz_param *rozInfo, int destx, int desty,
|
||||||
int srcx, int srcy, int width, int height,
|
int srcx, int srcy, int width, int height,
|
||||||
bitmap_ind16 &destbitmap, bitmap_ind8 &flagsbitmap,
|
bitmap_ind16 &destbitmap, bitmap_ind8 &flagsbitmap,
|
||||||
bitmap_ind16 &srcbitmap, UINT32 size_mask)
|
bitmap_ind16 &srcbitmap, UINT32 size_mask)
|
||||||
@ -109,15 +110,15 @@ DrawRozHelperBlock(const struct RozParam *rozInfo, int destx, int desty,
|
|||||||
dest += dest_rowinc;
|
dest += dest_rowinc;
|
||||||
desty++;
|
desty++;
|
||||||
}
|
}
|
||||||
} /* DrawRozHelperBlock */
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
DrawRozHelper(
|
draw_roz_helper(
|
||||||
screen_device &screen,
|
screen_device &screen,
|
||||||
bitmap_ind16 &bitmap,
|
bitmap_ind16 &bitmap,
|
||||||
tilemap_t *tmap,
|
tilemap_t *tmap,
|
||||||
const rectangle &clip,
|
const rectangle &clip,
|
||||||
const struct RozParam *rozInfo )
|
const struct roz_param *rozInfo )
|
||||||
{
|
{
|
||||||
tmap->set_palette_offset(rozInfo->color );
|
tmap->set_palette_offset(rozInfo->color );
|
||||||
|
|
||||||
@ -186,7 +187,7 @@ DrawRozHelper(
|
|||||||
// Do the block columns
|
// Do the block columns
|
||||||
for (j = 0; j < column_block_count; j++)
|
for (j = 0; j < column_block_count; j++)
|
||||||
{
|
{
|
||||||
DrawRozHelperBlock(rozInfo, dx, desty, sx, sy, ROZ_BLOCK_SIZE,
|
draw_roz_helper_block(rozInfo, dx, desty, sx, sy, ROZ_BLOCK_SIZE,
|
||||||
ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask);
|
ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask);
|
||||||
// Increment to the next block column
|
// Increment to the next block column
|
||||||
sx += row_block_size_incxx;
|
sx += row_block_size_incxx;
|
||||||
@ -196,7 +197,7 @@ DrawRozHelper(
|
|||||||
// Do the extra columns
|
// Do the extra columns
|
||||||
if (column_extra_count)
|
if (column_extra_count)
|
||||||
{
|
{
|
||||||
DrawRozHelperBlock(rozInfo, dx, desty, sx, sy, column_extra_count,
|
draw_roz_helper_block(rozInfo, dx, desty, sx, sy, column_extra_count,
|
||||||
ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask);
|
ROZ_BLOCK_SIZE, bitmap, flagsbitmap, srcbitmap, size_mask);
|
||||||
}
|
}
|
||||||
// Increment to the next row block
|
// Increment to the next row block
|
||||||
@ -210,7 +211,7 @@ DrawRozHelper(
|
|||||||
// Do the block columns
|
// Do the block columns
|
||||||
for (i = 0; i < column_block_count; i++)
|
for (i = 0; i < column_block_count; i++)
|
||||||
{
|
{
|
||||||
DrawRozHelperBlock(rozInfo, destx, desty, srcx, srcy, ROZ_BLOCK_SIZE,
|
draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, ROZ_BLOCK_SIZE,
|
||||||
row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask);
|
row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask);
|
||||||
srcx += row_block_size_incxx;
|
srcx += row_block_size_incxx;
|
||||||
srcy += row_block_size_incxy;
|
srcy += row_block_size_incxy;
|
||||||
@ -219,7 +220,7 @@ DrawRozHelper(
|
|||||||
// Do the extra columns
|
// Do the extra columns
|
||||||
if (column_extra_count)
|
if (column_extra_count)
|
||||||
{
|
{
|
||||||
DrawRozHelperBlock(rozInfo, destx, desty, srcx, srcy, column_extra_count,
|
draw_roz_helper_block(rozInfo, destx, desty, srcx, srcy, column_extra_count,
|
||||||
row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask);
|
row_extra_count, bitmap, flagsbitmap, srcbitmap, size_mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -233,12 +234,12 @@ DrawRozHelper(
|
|||||||
rozInfo->incyx, rozInfo->incyy,
|
rozInfo->incyx, rozInfo->incyy,
|
||||||
rozInfo->wrap,0,0); // wrap, flags, pri
|
rozInfo->wrap,0,0); // wrap, flags, pri
|
||||||
}
|
}
|
||||||
} /* DrawRozHelper */
|
}
|
||||||
|
|
||||||
void namcos2_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
void namcos2_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
const int xoffset = 38,yoffset = 0;
|
const int xoffset = 38,yoffset = 0;
|
||||||
struct RozParam rozParam;
|
struct roz_param rozParam;
|
||||||
|
|
||||||
rozParam.color = (m_gfx_ctrl & 0x0f00);
|
rozParam.color = (m_gfx_ctrl & 0x0f00);
|
||||||
rozParam.incxx = (INT16)m_roz_ctrl[0];
|
rozParam.incxx = (INT16)m_roz_ctrl[0];
|
||||||
@ -282,7 +283,7 @@ void namcos2_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const
|
|||||||
rozParam.incyx<<=8;
|
rozParam.incyx<<=8;
|
||||||
rozParam.incyy<<=8;
|
rozParam.incyy<<=8;
|
||||||
|
|
||||||
DrawRozHelper( screen, bitmap, m_tilemap_roz, cliprect, &rozParam );
|
draw_roz_helper( screen, bitmap, m_tilemap_roz, cliprect, &rozParam );
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER( namcos2_state::rozram_word_w )
|
WRITE16_MEMBER( namcos2_state::rozram_word_w )
|
||||||
@ -314,7 +315,7 @@ READ16_MEMBER( namcos2_state::paletteram_word_r )
|
|||||||
if (offset > 0x180b) return 0xff;
|
if (offset > 0x180b) return 0xff;
|
||||||
}
|
}
|
||||||
return m_paletteram[offset];
|
return m_paletteram[offset];
|
||||||
} /* namcos2_68k_video_palette_r */
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER( namcos2_state::paletteram_word_w )
|
WRITE16_MEMBER( namcos2_state::paletteram_word_w )
|
||||||
{
|
{
|
||||||
@ -361,7 +362,7 @@ WRITE16_MEMBER( namcos2_state::paletteram_word_w )
|
|||||||
{
|
{
|
||||||
COMBINE_DATA(&m_paletteram[offset]);
|
COMBINE_DATA(&m_paletteram[offset]);
|
||||||
}
|
}
|
||||||
} /* namcos2_68k_video_palette_w */
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
@ -382,7 +383,7 @@ namcos2_state::update_palette()
|
|||||||
offset++;
|
offset++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* update_palette */
|
}
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
@ -413,7 +414,7 @@ void namcos2_state::apply_clip( rectangle &clip, const rectangle &cliprect )
|
|||||||
clip.max_y = get_palette_register(3) - 0x21 - 1;
|
clip.max_y = get_palette_register(3) - 0x21 - 1;
|
||||||
/* intersect with master clip rectangle */
|
/* intersect with master clip rectangle */
|
||||||
clip &= cliprect;
|
clip &= cliprect;
|
||||||
} /* apply_clip */
|
}
|
||||||
|
|
||||||
UINT32 namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
UINT32 namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
@ -482,7 +483,7 @@ void namcos2_state::video_start_luckywld()
|
|||||||
{
|
{
|
||||||
c169_roz_init(1, "gfx5");
|
c169_roz_init(1, "gfx5");
|
||||||
}
|
}
|
||||||
} /* luckywld */
|
}
|
||||||
|
|
||||||
UINT32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
UINT32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
|
@ -45,61 +45,55 @@ WRITE16_MEMBER(namcos21_state::winrun_gpu_videoram_w)
|
|||||||
videoram[(offset+i)&0x7ffff] = color;
|
videoram[(offset+i)&0x7ffff] = color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* winrun_gpu_videoram_w */
|
}
|
||||||
|
|
||||||
READ16_MEMBER(namcos21_state::winrun_gpu_videoram_r)
|
READ16_MEMBER(namcos21_state::winrun_gpu_videoram_r)
|
||||||
{
|
{
|
||||||
UINT8 *videoram = m_videoram;
|
UINT8 *videoram = m_videoram;
|
||||||
return videoram[offset]<<8;
|
return videoram[offset]<<8;
|
||||||
} /* winrun_gpu_videoram_r */
|
}
|
||||||
|
|
||||||
static void
|
void namcos21_state::allocate_poly_framebuffer()
|
||||||
AllocatePolyFrameBuffer( running_machine &machine )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
m_mpPolyFrameBufferZ = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
||||||
state->m_mpPolyFrameBufferZ = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
m_mpPolyFrameBufferPens = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
||||||
state->m_mpPolyFrameBufferPens = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
|
||||||
|
|
||||||
state->m_mpPolyFrameBufferZ2 = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
m_mpPolyFrameBufferZ2 = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
||||||
state->m_mpPolyFrameBufferPens2 = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
m_mpPolyFrameBufferPens2 = auto_alloc_array(machine(), UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
|
||||||
|
|
||||||
namcos21_ClearPolyFrameBuffer(machine);
|
clear_poly_framebuffer();
|
||||||
namcos21_ClearPolyFrameBuffer(machine);
|
clear_poly_framebuffer();
|
||||||
} /* AllocatePolyFrameBuffer */
|
}
|
||||||
|
|
||||||
void
|
void namcos21_state::clear_poly_framebuffer()
|
||||||
namcos21_ClearPolyFrameBuffer( running_machine &machine )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
|
||||||
int i;
|
|
||||||
UINT16 *temp2;
|
UINT16 *temp2;
|
||||||
|
|
||||||
/* swap work and visible framebuffers */
|
/* swap work and visible framebuffers */
|
||||||
temp2 = state->m_mpPolyFrameBufferZ;
|
temp2 = m_mpPolyFrameBufferZ;
|
||||||
state->m_mpPolyFrameBufferZ = state->m_mpPolyFrameBufferZ2;
|
m_mpPolyFrameBufferZ = m_mpPolyFrameBufferZ2;
|
||||||
state->m_mpPolyFrameBufferZ2 = temp2;
|
m_mpPolyFrameBufferZ2 = temp2;
|
||||||
|
|
||||||
temp2 = state->m_mpPolyFrameBufferPens;
|
temp2 = m_mpPolyFrameBufferPens;
|
||||||
state->m_mpPolyFrameBufferPens = state->m_mpPolyFrameBufferPens2;
|
m_mpPolyFrameBufferPens = m_mpPolyFrameBufferPens2;
|
||||||
state->m_mpPolyFrameBufferPens2 = temp2;
|
m_mpPolyFrameBufferPens2 = temp2;
|
||||||
|
|
||||||
/* wipe work zbuffer */
|
/* wipe work zbuffer */
|
||||||
for( i=0; i<NAMCOS21_POLY_FRAME_WIDTH*NAMCOS21_POLY_FRAME_HEIGHT; i++ )
|
for( int i = 0; i < NAMCOS21_POLY_FRAME_WIDTH*NAMCOS21_POLY_FRAME_HEIGHT; i++ )
|
||||||
{
|
{
|
||||||
state->m_mpPolyFrameBufferZ[i] = 0x7fff;
|
m_mpPolyFrameBufferZ[i] = 0x7fff;
|
||||||
}
|
}
|
||||||
} /* namcos21_ClearPolyFrameBuffer */
|
}
|
||||||
|
|
||||||
static void
|
void namcos21_state::copy_visible_poly_framebuffer(bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi)
|
||||||
CopyVisiblePolyFrameBuffer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>(); /* blit the visible framebuffer */
|
/* blit the visible framebuffer */
|
||||||
int sy;
|
int sy;
|
||||||
for( sy=clip.min_y; sy<=clip.max_y; sy++ )
|
for( sy=clip.min_y; sy<=clip.max_y; sy++ )
|
||||||
{
|
{
|
||||||
UINT16 *dest = &bitmap.pix16(sy);
|
UINT16 *dest = &bitmap.pix16(sy);
|
||||||
const UINT16 *pPen = state->m_mpPolyFrameBufferPens2+NAMCOS21_POLY_FRAME_WIDTH*sy;
|
const UINT16 *pPen = m_mpPolyFrameBufferPens2+NAMCOS21_POLY_FRAME_WIDTH*sy;
|
||||||
const UINT16 *pZ = state->m_mpPolyFrameBufferZ2+NAMCOS21_POLY_FRAME_WIDTH*sy;
|
const UINT16 *pZ = m_mpPolyFrameBufferZ2+NAMCOS21_POLY_FRAME_WIDTH*sy;
|
||||||
int sx;
|
int sx;
|
||||||
for( sx=clip.min_x; sx<=clip.max_x; sx++ )
|
for( sx=clip.min_x; sx<=clip.max_x; sx++ )
|
||||||
{
|
{
|
||||||
@ -111,7 +105,7 @@ CopyVisiblePolyFrameBuffer( running_machine &machine, bitmap_ind16 &bitmap, cons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* CopyVisiblePolyFrameBuffer */
|
}
|
||||||
|
|
||||||
VIDEO_START_MEMBER(namcos21_state,namcos21)
|
VIDEO_START_MEMBER(namcos21_state,namcos21)
|
||||||
{
|
{
|
||||||
@ -119,7 +113,7 @@ VIDEO_START_MEMBER(namcos21_state,namcos21)
|
|||||||
{
|
{
|
||||||
m_videoram = auto_alloc_array(machine(), UINT8, 0x80000);
|
m_videoram = auto_alloc_array(machine(), UINT8, 0x80000);
|
||||||
}
|
}
|
||||||
AllocatePolyFrameBuffer(machine());
|
allocate_poly_framebuffer();
|
||||||
c355_obj_init(
|
c355_obj_init(
|
||||||
0, /* gfx bank */
|
0, /* gfx bank */
|
||||||
0xf, /* reverse palette mapping */
|
0xf, /* reverse palette mapping */
|
||||||
@ -158,7 +152,7 @@ UINT32 namcos21_state::screen_update_namcos21(screen_device &screen, bitmap_ind1
|
|||||||
c355_obj_draw(screen, bitmap, cliprect, 14 ); //driver's eyes
|
c355_obj_draw(screen, bitmap, cliprect, 14 ); //driver's eyes
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyVisiblePolyFrameBuffer( machine(), bitmap, cliprect, 0x7fc0, 0x7ffe );
|
copy_visible_poly_framebuffer(bitmap, cliprect, 0x7fc0, 0x7ffe);
|
||||||
|
|
||||||
if( m_gametype != NAMCOS21_WINRUN91 )
|
if( m_gametype != NAMCOS21_WINRUN91 )
|
||||||
{ /* draw low priority 2d sprites */
|
{ /* draw low priority 2d sprites */
|
||||||
@ -166,7 +160,7 @@ UINT32 namcos21_state::screen_update_namcos21(screen_device &screen, bitmap_ind1
|
|||||||
c355_obj_draw(screen, bitmap, cliprect, 1 );
|
c355_obj_draw(screen, bitmap, cliprect, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyVisiblePolyFrameBuffer( machine(), bitmap, cliprect, 0, 0x7fbf );
|
copy_visible_poly_framebuffer(bitmap, cliprect, 0, 0x7fbf);
|
||||||
|
|
||||||
|
|
||||||
if( m_gametype != NAMCOS21_WINRUN91 )
|
if( m_gametype != NAMCOS21_WINRUN91 )
|
||||||
@ -211,22 +205,9 @@ UINT32 namcos21_state::screen_update_namcos21(screen_device &screen, bitmap_ind1
|
|||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
struct vertex
|
|
||||||
{
|
|
||||||
double x,y;
|
|
||||||
double z;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct edge
|
|
||||||
{
|
|
||||||
double x;
|
|
||||||
double z;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SWAP(T,A,B) { const T *temp = A; A = B; B = temp; }
|
#define SWAP(T,A,B) { const T *temp = A; A = B; B = temp; }
|
||||||
|
|
||||||
static void
|
void namcos21_state::renderscanline_flat(const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable)
|
||||||
renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable )
|
|
||||||
{
|
{
|
||||||
if( e1->x > e2->x )
|
if( e1->x > e2->x )
|
||||||
{
|
{
|
||||||
@ -234,8 +215,8 @@ renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
UINT16 *pDest = state->m_mpPolyFrameBufferPens + sy*NAMCOS21_POLY_FRAME_WIDTH;
|
UINT16 *pDest = m_mpPolyFrameBufferPens + sy*NAMCOS21_POLY_FRAME_WIDTH;
|
||||||
UINT16 *pZBuf = state->m_mpPolyFrameBufferZ + sy*NAMCOS21_POLY_FRAME_WIDTH;
|
UINT16 *pZBuf = m_mpPolyFrameBufferZ + sy*NAMCOS21_POLY_FRAME_WIDTH;
|
||||||
int x0 = (int)e1->x;
|
int x0 = (int)e1->x;
|
||||||
int x1 = (int)e2->x;
|
int x1 = (int)e2->x;
|
||||||
int w = x1-x0;
|
int w = x1-x0;
|
||||||
@ -264,12 +245,12 @@ renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int
|
|||||||
if( depthcueenable && zz>0 )
|
if( depthcueenable && zz>0 )
|
||||||
{
|
{
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
if( state->m_gametype == NAMCOS21_WINRUN91 )
|
if( m_gametype == NAMCOS21_WINRUN91 )
|
||||||
{
|
{
|
||||||
depth = (zz>>10)*0x100;
|
depth = (zz>>10)*0x100;
|
||||||
pen += depth;
|
pen += depth;
|
||||||
}
|
}
|
||||||
else if( state->m_gametype == NAMCOS21_DRIVERS_EYES )
|
else if( m_gametype == NAMCOS21_DRIVERS_EYES )
|
||||||
{
|
{
|
||||||
depth = (zz>>10)*0x100;
|
depth = (zz>>10)*0x100;
|
||||||
pen -= depth;
|
pen -= depth;
|
||||||
@ -287,16 +268,9 @@ renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* renderscanline_flat */
|
}
|
||||||
|
|
||||||
static void
|
void namcos21_state::rendertri(const vertex *v0, const vertex *v1, const vertex *v2, unsigned color, int depthcueenable)
|
||||||
rendertri(
|
|
||||||
namcos21_state *state,
|
|
||||||
const vertex *v0,
|
|
||||||
const vertex *v1,
|
|
||||||
const vertex *v2,
|
|
||||||
unsigned color,
|
|
||||||
int depthcueenable )
|
|
||||||
{
|
{
|
||||||
int dy,ystart,yend,crop;
|
int dy,ystart,yend,crop;
|
||||||
|
|
||||||
@ -363,7 +337,7 @@ rendertri(
|
|||||||
|
|
||||||
for( y=ystart; y<yend; y++ )
|
for( y=ystart; y<yend; y++ )
|
||||||
{
|
{
|
||||||
renderscanline_flat( state, &e1, &e2, y, color, depthcueenable );
|
renderscanline_flat(&e1, &e2, y, color, depthcueenable);
|
||||||
|
|
||||||
e2.x += dx2dy;
|
e2.x += dx2dy;
|
||||||
e2.z += dz2dy;
|
e2.z += dz2dy;
|
||||||
@ -397,7 +371,7 @@ rendertri(
|
|||||||
}
|
}
|
||||||
for( y=ystart; y<yend; y++ )
|
for( y=ystart; y<yend; y++ )
|
||||||
{
|
{
|
||||||
renderscanline_flat( state, &e1, &e2, y, color, depthcueenable );
|
renderscanline_flat(&e1, &e2, y, color, depthcueenable);
|
||||||
|
|
||||||
e2.x += dx2dy;
|
e2.x += dx2dy;
|
||||||
e2.z += dz2dy;
|
e2.z += dz2dy;
|
||||||
@ -407,12 +381,10 @@ rendertri(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* rendertri */
|
}
|
||||||
|
|
||||||
void
|
void namcos21_state::draw_quad(int sx[4], int sy[4], int zcode[4], int color)
|
||||||
namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4], int color )
|
|
||||||
{
|
{
|
||||||
namcos21_state *state = machine.driver_data<namcos21_state>();
|
|
||||||
vertex a,b,c,d;
|
vertex a,b,c,d;
|
||||||
int depthcueenable = 1;
|
int depthcueenable = 1;
|
||||||
/*
|
/*
|
||||||
@ -421,11 +393,11 @@ namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4],
|
|||||||
0x4000..0x5fff polygon palette bank1 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
|
0x4000..0x5fff polygon palette bank1 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
|
||||||
0x6000..0x7fff polygon palette bank2 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
|
0x6000..0x7fff polygon palette bank2 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
|
||||||
*/
|
*/
|
||||||
if( state->m_gametype == NAMCOS21_WINRUN91 )
|
if( m_gametype == NAMCOS21_WINRUN91 )
|
||||||
{
|
{
|
||||||
color = 0x4000|(color&0xff);
|
color = 0x4000|(color&0xff);
|
||||||
}
|
}
|
||||||
else if ( state->m_gametype == NAMCOS21_DRIVERS_EYES )
|
else if ( m_gametype == NAMCOS21_DRIVERS_EYES )
|
||||||
{
|
{
|
||||||
color = 0x3f00|(color&0xff);
|
color = 0x3f00|(color&0xff);
|
||||||
}
|
}
|
||||||
@ -465,6 +437,6 @@ namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4],
|
|||||||
d.y = sy[3];
|
d.y = sy[3];
|
||||||
d.z = zcode[3];
|
d.z = zcode[3];
|
||||||
|
|
||||||
rendertri( state, &a, &b, &c, color, depthcueenable );
|
rendertri(&a, &b, &c, color, depthcueenable);
|
||||||
rendertri( state, &c, &d, &a, color, depthcueenable );
|
rendertri(&c, &d, &a, color, depthcueenable);
|
||||||
} /* namcos21_DrawQuad */
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user