namcos2 and namcos21: moved most remaining functions into classes (nw).

This commit is contained in:
Ivan Vangelista 2014-09-30 14:57:36 +00:00
parent bc00aadc06
commit 54c3e62516
6 changed files with 337 additions and 363 deletions

View File

@ -309,10 +309,9 @@ CPU68 PCB:
#define ENABLE_LOGGING 0
static INT32
ReadPointROMData( running_machine &machine, unsigned offset )
INT32 namcos21_state::read_pointrom_data(unsigned offset)
{
const INT32 *pPointData = (INT32 *)machine.root_device().memregion( "user2" )->base();
const INT32 *pPointData = (INT32 *)memregion( "user2" )->base();
INT32 result = pPointData[offset];
return result;
}
@ -378,25 +377,22 @@ READ16_MEMBER(namcos21_state::dspcuskey_r)
return result;
}
static void
TransmitWordToSlave( namcos21_state *state, UINT16 data )
void namcos21_state::transmit_word_to_slave(UINT16 data)
{
unsigned offs = state->m_mpDspState->slaveInputStart+state->m_mpDspState->slaveBytesAvailable++;
state->m_mpDspState->slaveInputBuffer[offs%DSP_BUF_MAX] = data;
if (ENABLE_LOGGING) logerror( "+%04x(#%04x)\n", data, state->m_mpDspState->slaveBytesAvailable );
state->m_mpDspState->slaveActive = 1;
if( state->m_mpDspState->slaveBytesAvailable >= DSP_BUF_MAX )
unsigned offs = m_mpDspState->slaveInputStart+m_mpDspState->slaveBytesAvailable++;
m_mpDspState->slaveInputBuffer[offs%DSP_BUF_MAX] = data;
if (ENABLE_LOGGING) logerror( "+%04x(#%04x)\n", data, m_mpDspState->slaveBytesAvailable );
m_mpDspState->slaveActive = 1;
if( m_mpDspState->slaveBytesAvailable >= DSP_BUF_MAX )
{
logerror( "IDC overflow\n" );
exit(1);
}
} /* TransmitWordToSlave */
}
static void
TransferDspData( running_machine &machine )
void namcos21_state::transfer_dsp_data()
{
namcos21_state *state = machine.driver_data<namcos21_state>();
UINT16 addr = state->m_mpDspState->masterSourceAddr;
UINT16 addr = m_mpDspState->masterSourceAddr;
int mode = addr&0x8000;
addr&=0x7fff;
if( addr )
@ -405,13 +401,13 @@ TransferDspData( running_machine &machine )
{
int i;
UINT16 old = addr;
UINT16 code = state->m_dspram16[addr++];
UINT16 code = m_dspram16[addr++];
if( code == 0xffff )
{
if( mode )
{
addr = state->m_dspram16[addr];
state->m_mpDspState->masterSourceAddr = addr;
addr = m_dspram16[addr];
m_mpDspState->masterSourceAddr = addr;
if (ENABLE_LOGGING) logerror( "LOOP:0x%04x\n", addr );
addr&=0x7fff;
if( old==addr )
@ -421,59 +417,59 @@ TransferDspData( running_machine &machine )
}
else
{
state->m_mpDspState->masterSourceAddr = 0;
m_mpDspState->masterSourceAddr = 0;
return;
}
}
else if( mode==0 )
{ /* direct data transfer */
if (ENABLE_LOGGING) logerror( "DATA TFR(0x%x)\n", code );
TransmitWordToSlave( state, code );
transmit_word_to_slave(code);
for( i=0; i<code; i++ )
{
UINT16 data = state->m_dspram16[addr++];
TransmitWordToSlave( state, data );
UINT16 data = m_dspram16[addr++];
transmit_word_to_slave(data);
}
}
else if( code==0x18 || code==0x1a )
{
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++ )
{
UINT16 data = state->m_dspram16[addr++];
TransmitWordToSlave( state, data );
UINT16 data = m_dspram16[addr++];
transmit_word_to_slave(data);
}
}
else
{
INT32 masterAddr = ReadPointROMData(machine, code);
INT32 masterAddr = read_pointrom_data(code);
if (ENABLE_LOGGING) logerror( "OBJ TFR(0x%x)\n", code );
{
UINT16 len = state->m_dspram16[addr++];
UINT16 len = m_dspram16[addr++];
for(;;)
{
int subAddr = ReadPointROMData(machine, masterAddr++);
int subAddr = read_pointrom_data(masterAddr++);
if( subAddr==0xffffff )
{
break;
}
else
{
int primWords = (UINT16)ReadPointROMData(machine, subAddr++);
int primWords = (UINT16)read_pointrom_data(subAddr++);
if( primWords>2 )
{
TransmitWordToSlave( state, 0 ); /* pad1 */
TransmitWordToSlave( state, len+1 );
transmit_word_to_slave(0); /* pad1 */
transmit_word_to_slave(len+1);
for( i=0; i<len; i++ )
{ /* transform */
TransmitWordToSlave( state, state->m_dspram16[addr+i] );
transmit_word_to_slave(m_dspram16[addr+i]);
}
TransmitWordToSlave( state, 0 ); /* pad2 */
TransmitWordToSlave( state, primWords+1 );
transmit_word_to_slave(0); /* pad2 */
transmit_word_to_slave(primWords+1);
for( i=0; i<primWords; i++ )
{
TransmitWordToSlave( state, (UINT16)ReadPointROMData(machine, subAddr+i) );
transmit_word_to_slave((UINT16)read_pointrom_data(subAddr+i));
}
}
else
@ -487,34 +483,34 @@ TransferDspData( running_machine &machine )
}
} /* for(;;) */
}
} /* TransferDspData */
}
void
namcos21_kickstart( running_machine &machine, int internal )
void namcos21_kickstart(running_machine &machine, int internal)
{
namcos21_state *state = machine.driver_data<namcos21_state>();
/* patch dsp watchdog */
switch( state->m_gametype )
{
case NAMCOS21_AIRCOMBAT:
state->m_master_dsp_code[0x008e] = 0x808f;
break;
case NAMCOS21_SOLVALOU:
state->m_master_dsp_code[0x008b] = 0x808c;
break;
default:
break;
case NAMCOS21_AIRCOMBAT:
state->m_master_dsp_code[0x008e] = 0x808f;
break;
case NAMCOS21_SOLVALOU:
state->m_master_dsp_code[0x008b] = 0x808c;
break;
default:
break;
}
if( internal )
{
if( state->m_mbNeedsKickstart==0 ) return;
state->m_mbNeedsKickstart--;
state->m_mbNeedsKickstart--;
if( state->m_mbNeedsKickstart ) return;
}
namcos21_ClearPolyFrameBuffer(machine);
state->clear_poly_framebuffer();
state->m_mpDspState->masterSourceAddr = 0;
state->m_mpDspState->slaveOutputSize = 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);
}
static UINT16
ReadWordFromSlaveInput( address_space &space )
UINT16 namcos21_state::read_word_from_slave_input()
{
namcos21_state *state = space.machine().driver_data<namcos21_state>();
UINT16 data = 0;
if( state->m_mpDspState->slaveBytesAvailable>0 )
if( m_mpDspState->slaveBytesAvailable>0 )
{
data = state->m_mpDspState->slaveInputBuffer[state->m_mpDspState->slaveInputStart++];
state->m_mpDspState->slaveInputStart %= DSP_BUF_MAX;
state->m_mpDspState->slaveBytesAvailable--;
if( state->m_mpDspState->slaveBytesAdvertised>0 )
data = m_mpDspState->slaveInputBuffer[m_mpDspState->slaveInputStart++];
m_mpDspState->slaveInputStart %= DSP_BUF_MAX;
m_mpDspState->slaveBytesAvailable--;
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;
} /* ReadWordFromSlaveInput */
}
static size_t
GetInputBytesAdvertisedForSlave( running_machine &machine )
size_t namcos21_state::get_input_bytes_advertised_for_slave()
{
namcos21_state *state = machine.driver_data<namcos21_state>();
if( state->m_mpDspState->slaveBytesAdvertised < state->m_mpDspState->slaveBytesAvailable )
if( m_mpDspState->slaveBytesAdvertised < 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;
} /* GetInputBytesAdvertisedForSlave */
return m_mpDspState->slaveBytesAdvertised;
}
READ16_MEMBER(namcos21_state::dspram16_r)
{
return m_dspram16[offset];
} /* dspram16_r */
}
WRITE16_MEMBER(namcos21_state::dspram16_w)
{
@ -572,7 +564,7 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
offset == 1+(m_mpDspState->masterSourceAddr&0x7fff) )
{
if (ENABLE_LOGGING) logerror( "IDC-CONTINUE\n" );
TransferDspData(machine());
transfer_dsp_data();
}
else if (m_gametype == NAMCOS21_SOLVALOU &&
offset == 0x103 &&
@ -581,15 +573,13 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
space.device().execute().yield();
}
}
} /* dspram16_w */
}
/************************************************************************************/
static int
InitDSP( running_machine &machine )
int namcos21_state::init_dsp()
{
namcos21_state *state = machine.driver_data<namcos21_state>();
UINT16 *pMem = (UINT16 *)state->memregion("dspmaster")->base();
UINT16 *pMem = (UINT16 *)memregion("dspmaster")->base();
/**
* DSP BIOS tests "CPU ID" on startup
* "JAPAN (C)1990 NAMCO LTD. by H.F "
@ -598,7 +588,7 @@ InitDSP( running_machine &machine )
pMem[0x8000] = 0xFF80;
pMem[0x8001] = 0x0000;
state->m_mpDspState = auto_alloc_clear(machine, dsp_state);
m_mpDspState = auto_alloc_clear(machine(), dsp_state);
return 0;
}
@ -609,16 +599,16 @@ InitDSP( running_machine &machine )
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_mbPointRomDataAvailable = 1;
return (UINT16)data;
} /* dsp_port0_r */
}
WRITE16_MEMBER(namcos21_state::dsp_port0_w)
{ /* unused? */
if (ENABLE_LOGGING) logerror( "PTRAM_LO(0x%04x)\n", data );
} /* dsp_port0_w */
}
READ16_MEMBER(namcos21_state::dsp_port1_r)
{
@ -628,44 +618,44 @@ READ16_MEMBER(namcos21_state::dsp_port1_r)
return m_mPointRomMSB;
}
return 0x8000; /* IDC ack? */
} /* dsp_port1_r */
}
WRITE16_MEMBER(namcos21_state::dsp_port1_w)
{ /* unused? */
if (ENABLE_LOGGING) logerror( "PTRAM_HI(0x%04x)\n", data );
} /* dsp_port1_w */
}
READ16_MEMBER(namcos21_state::dsp_port2_r)
{ /* IDC TRANSMIT ENABLE? */
return 0;
} /* dsp_port2_r */
}
WRITE16_MEMBER(namcos21_state::dsp_port2_w)
{
if (ENABLE_LOGGING) logerror( "IDC ADDR INIT(0x%04x)\n", data );
m_mpDspState->masterSourceAddr = data;
TransferDspData(machine());
} /* dsp_port2_w */
transfer_dsp_data();
}
READ16_MEMBER(namcos21_state::dsp_port3_idc_rcv_enable_r)
{ /* IDC RECEIVE ENABLE? */
return 0;
} /* dsp_port3_idc_rcv_enable_r */
}
WRITE16_MEMBER(namcos21_state::dsp_port3_w)
{
m_pointrom_idx<<=16;
m_pointrom_idx|=data;
} /* dsp_port3_w */
}
WRITE16_MEMBER(namcos21_state::dsp_port4_w)
{ /* receives $0B<<4 prior to IDC setup */
} /* dsp_port4_w */
}
READ16_MEMBER(namcos21_state::dsp_port8_r)
{ /* SMU status */
return 1;
} /* dsp_port8_r */
}
WRITE16_MEMBER(namcos21_state::dsp_port8_w)
@ -676,17 +666,17 @@ WRITE16_MEMBER(namcos21_state::dsp_port8_w)
m_mpDspState->masterFinished = 1;
}
m_irq_enable = data;
} /* dsp_port8_w */
}
READ16_MEMBER(namcos21_state::dsp_port9_r)
{ /* render-device-busy; used for direct-draw */
return 0;
} /* dsp_port9_r */
}
READ16_MEMBER(namcos21_state::dsp_porta_r)
{ /* config */
return 0;
} /* dsp_porta_r */
}
WRITE16_MEMBER(namcos21_state::dsp_porta_w)
{
@ -696,12 +686,12 @@ WRITE16_MEMBER(namcos21_state::dsp_porta_w)
/* direct-draw begin: 0 */
/* INT1 begin: 1 */
// if (ENABLE_LOGGING) logerror( "dsp_porta_w(0x%04x)\n", data );
} /* dsp_porta_w */
}
READ16_MEMBER(namcos21_state::dsp_portb_r)
{ /* config */
return 1;
} /* dsp_portb_r */
}
WRITE16_MEMBER(namcos21_state::dsp_portb_w)
{
@ -722,7 +712,7 @@ WRITE16_MEMBER(namcos21_state::dsp_portb_w)
}
if( color&0x8000 )
{
namcos21_DrawQuad( machine(), sx, sy, zcode, color );
draw_quad(sx, sy, zcode, color);
}
else
{
@ -734,7 +724,7 @@ WRITE16_MEMBER(namcos21_state::dsp_portb_w)
logerror( "unexpected masterDirectDrawSize=%d!\n",m_mpDspState->masterDirectDrawSize );
}
m_mpDspState->masterDirectDrawSize = 0;
} /* dsp_portb_w */
}
WRITE16_MEMBER(namcos21_state::dsp_portc_w)
{
@ -746,12 +736,12 @@ WRITE16_MEMBER(namcos21_state::dsp_portc_w)
{
logerror( "portc overflow\n" );
}
} /* dsp_portc_w */
}
READ16_MEMBER(namcos21_state::dsp_portf_r)
{ /* informs BIOS that this is Master DSP */
return 0;
} /* dsp_portf_r */
}
WRITE16_MEMBER(namcos21_state::dsp_xf_w)
{
@ -787,22 +777,20 @@ ADDRESS_MAP_END
/************************************************************************************/
static void
RenderSlaveOutput( running_machine &machine, UINT16 data )
void namcos21_state::render_slave_output(UINT16 data)
{
namcos21_state *state = machine.driver_data<namcos21_state>();
if( state->m_mpDspState->slaveOutputSize >= 4096 )
if( 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 */
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++;
if( count && state->m_mpDspState->slaveOutputSize > count )
if( count && m_mpDspState->slaveOutputSize > count )
{
UINT16 color = *pSource++;
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];
zcode[j] = pSource[3*j+2];
}
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
draw_quad(sx, sy, zcode, color&0x7fff);
}
else
{
int quad_idx = color*6;
for(;;)
{
UINT8 code = state->m_pointram[quad_idx++];
color = state->m_pointram[quad_idx++]|(code<<8);
UINT8 code = m_pointram[quad_idx++];
color = m_pointram[quad_idx++]|(code<<8);
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];
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
zcode[j] = pSource[vi*3+2];
}
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
draw_quad(sx, sy, zcode, color&0x7fff);
if( code&0x80 )
{ /* end-of-quadlist marker */
break;
}
}
}
state->m_mpDspState->slaveOutputSize = 0;
m_mpDspState->slaveOutputSize = 0;
}
else if( count==0 )
{
@ -847,22 +835,22 @@ RenderSlaveOutput( running_machine &machine, UINT16 data )
exit(1);
}
}
} /* RenderSlaveOutput */
}
READ16_MEMBER(namcos21_state::slave_port0_r)
{
return ReadWordFromSlaveInput(space);
} /* slave_port0_r */
return read_word_from_slave_input();
}
WRITE16_MEMBER(namcos21_state::slave_port0_w)
{
RenderSlaveOutput( machine(), data );
render_slave_output(data);
}
READ16_MEMBER(namcos21_state::slave_port2_r)
{
return GetInputBytesAdvertisedForSlave(machine());
} /* slave_port2_r */
return get_input_bytes_advertised_for_slave();
}
READ16_MEMBER(namcos21_state::slave_port3_r)
{ /* render-device queue size */
@ -874,12 +862,12 @@ READ16_MEMBER(namcos21_state::slave_port3_r)
WRITE16_MEMBER(namcos21_state::slave_port3_w)
{ /* 0=busy, 1=ready? */
} /* slave_port3_w */
}
WRITE16_MEMBER(namcos21_state::slave_XF_output_w)
{
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)
{ /* informs BIOS that this is Slave DSP */
@ -957,12 +945,12 @@ WRITE16_MEMBER(namcos21_state::pointram_control_w)
logerror( "\n" );
#endif
m_pointram_idx = 0; /* HACK */
} /* pointram_control_w */
}
READ16_MEMBER(namcos21_state::pointram_data_r)
{
return m_pointram[m_pointram_idx];
} /* pointram_data_r */
}
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_idx &= (PTRAM_SIZE-1);
}
} /* pointram_data_w */
}
READ16_MEMBER(namcos21_state::namcos21_depthcue_r)
@ -1123,19 +1111,17 @@ READ16_MEMBER(namcos21_state::winrun_cuskey_r)
break;
}
return 0;
} /* winrun_cuskey_r */
}
WRITE16_MEMBER(namcos21_state::winrun_cuskey_w)
{
} /* winrun_cuskey_w */
}
static void
winrun_flushpoly( running_machine &machine )
void namcos21_state::winrun_flush_poly()
{
namcos21_state *state = machine.driver_data<namcos21_state>();
if( state->m_winrun_poly_index>0 )
if( m_winrun_poly_index>0 )
{
const UINT16 *pSource = state->m_winrun_poly_buf;
const UINT16 *pSource = m_winrun_poly_buf;
UINT16 color;
int sx[4], sy[4], zcode[4];
int j;
@ -1148,36 +1134,36 @@ winrun_flushpoly( running_machine &machine )
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)*pSource++;
zcode[j] = *pSource++;
}
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
draw_quad(sx, sy, zcode, color&0x7fff);
}
else
{
int quad_idx = color*6;
for(;;)
{
UINT8 code = state->m_pointram[quad_idx++];
color = state->m_pointram[quad_idx++];
UINT8 code = m_pointram[quad_idx++];
color = m_pointram[quad_idx++];
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];
sy[j] = NAMCOS21_POLY_FRAME_HEIGHT/2 + (INT16)pSource[vi*3+1];
zcode[j] = pSource[vi*3+2];
}
namcos21_DrawQuad( machine, sx, sy, zcode, color&0x7fff );
draw_quad(sx, sy, zcode, color&0x7fff);
if( code&0x80 )
{ /* end-of-quadlist marker */
break;
}
}
}
state->m_winrun_poly_index = 0;
m_winrun_poly_index = 0;
}
} /* winrun_flushpoly */
READ16_MEMBER(namcos21_state::winrun_poly_reset_r)
{
winrun_flushpoly(machine());
winrun_flush_poly();
return 0;
}
@ -1191,7 +1177,7 @@ WRITE16_MEMBER(namcos21_state::winrun_dsp_render_w)
{
logerror( "WINRUN_POLY_OVERFLOW\n" );
}
} /* winrun_dsp_render_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();
return ptrom[m_winrun_pointrom_addr++];
} /* winrun_dsp_pointrom_data_r */
}
WRITE16_MEMBER(namcos21_state::winrun_dsp_complete_w)
{
if( data )
{
winrun_flushpoly(machine());
winrun_flush_poly();
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 );
m_winrun_dsp_alive = 1;
}
} /* winrun_dspbios_w */
}
//380000 : read : dsp status? 1 = busy
//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_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>();
state->m_gametype = game_type;
state->m_pointram = auto_alloc_array(machine, UINT8, PTRAM_SIZE);
state->m_mpDataROM = (UINT16 *)state->memregion( "user1" )->base();
InitDSP(machine);
state->m_mbNeedsKickstart = 20;
m_gametype = game_type;
m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE);
m_mpDataROM = (UINT16 *)memregion( "user1" )->base();
init_dsp();
m_mbNeedsKickstart = 20;
if( game_type==NAMCOS21_CYBERSLED )
{
state->m_mbNeedsKickstart = 200;
m_mbNeedsKickstart = 200;
}
} /* namcos21_init */
}
DRIVER_INIT_MEMBER(namcos21_state,winrun)
{
@ -2286,18 +2271,18 @@ DRIVER_INIT_MEMBER(namcos21_state,winrun)
DRIVER_INIT_MEMBER(namcos21_state,aircomb)
{
namcos21_init( machine(), NAMCOS21_AIRCOMBAT );
init(NAMCOS21_AIRCOMBAT);
}
DRIVER_INIT_MEMBER(namcos21_state,starblad)
{
namcos21_init( machine(), NAMCOS21_STARBLADE );
init(NAMCOS21_STARBLADE);
}
DRIVER_INIT_MEMBER(namcos21_state,cybsled)
{
namcos21_init( machine(), NAMCOS21_CYBERSLED );
init(NAMCOS21_CYBERSLED);
}
DRIVER_INIT_MEMBER(namcos21_state,solvalou)
@ -2308,7 +2293,7 @@ DRIVER_INIT_MEMBER(namcos21_state,solvalou)
mem[0x20cf4/2+1] = 0x4e71;
mem[0x20cf4/2+2] = 0x4e71;
namcos21_init( machine(), NAMCOS21_SOLVALOU );
init(NAMCOS21_SOLVALOU );
}
DRIVER_INIT_MEMBER(namcos21_state,driveyes)

View File

@ -121,6 +121,15 @@ public:
bool is_system21();
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
// TODO: merge with namcos1.c implementation and convert to device
public:
@ -210,6 +219,10 @@ public:
INTERRUPT_GEN_MEMBER(namcos2_68k_gpu_vblank);
TIMER_CALLBACK_MEMBER(namcos2_posirq_tick);
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_READ8_MEMBER( namcos2_68k_eeprom_r );
@ -338,6 +351,8 @@ public:
tilemap_t *m_tilemap_roz;
UINT16 m_gfx_ctrl;
UINT16 m_serial_comms_ctrl[0x8];
unsigned m_finallap_prot_count;
int m_sendval;
optional_device<namco_c45_road_device> m_c45_road;

View File

@ -25,6 +25,19 @@ struct dsp_state
int slaveActive;
};
struct vertex
{
double x,y;
double z;
};
struct edge
{
double x;
double z;
};
class namcos21_state : public namcos2_shared_state
{
public:
@ -157,8 +170,19 @@ public:
DECLARE_MACHINE_START(namcos21);
DECLARE_VIDEO_START(namcos21);
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 );

View File

@ -16,19 +16,8 @@ Namco System II
#include "machine/nvram.h"
static void InitC148(void);
static emu_timer *namcos2_posirq_timer;
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 )
{
@ -47,24 +36,24 @@ READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
break;
case 2:
data = table1[mFinalLapProtCount&7];
data = table1[m_finallap_prot_count&7];
data = (data&0xff00)>>8;
break;
case 3:
data = table1[mFinalLapProtCount&7];
mFinalLapProtCount++;
data = table1[m_finallap_prot_count&7];
m_finallap_prot_count++;
data = data&0x00ff;
break;
case 0x3fffc/2:
data = table0[mFinalLapProtCount&7];
data = table0[m_finallap_prot_count&7];
data = data&0xff00;
break;
case 0x3fffe/2:
data = table0[mFinalLapProtCount&7];
mFinalLapProtCount++;
data = table0[m_finallap_prot_count&7];
m_finallap_prot_count++;
data = (data&0x00ff)<<8;
break;
@ -78,30 +67,27 @@ READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
/* Perform basic machine initialisation */
/*************************************************************/
#define namcos2_eeprom_size 0x2000
#define m_eeprom_size 0x2000
static void
ResetAllSubCPUs( running_machine &machine, int state )
void namcos2_shared_state::reset_all_subcpus(int state)
{
namcos2_shared_state *s2state = machine.driver_data<namcos2_shared_state>();
s2state->m_slave->set_input_line(INPUT_LINE_RESET, state);
if (s2state->m_c68)
m_slave->set_input_line(INPUT_LINE_RESET, state);
if (m_c68)
{
s2state->m_c68->set_input_line(INPUT_LINE_RESET, state);
m_c68->set_input_line(INPUT_LINE_RESET, state);
}
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_STARBLADE:
case NAMCOS21_AIRCOMBAT:
case NAMCOS21_CYBERSLED:
s2state->m_dspmaster->set_input_line(INPUT_LINE_RESET, state);
s2state->m_dspslave->set_input_line(INPUT_LINE_RESET, state);
m_dspmaster->set_input_line(INPUT_LINE_RESET, state);
m_dspslave->set_input_line(INPUT_LINE_RESET, state);
break;
// case NAMCOS21_WINRUN91:
@ -114,21 +100,19 @@ ResetAllSubCPUs( running_machine &machine, int state )
MACHINE_START_MEMBER(namcos2_shared_state,namcos2)
{
namcos2_kickstart = NULL;
namcos2_eeprom = auto_alloc_array(machine(), UINT8, namcos2_eeprom_size);
machine().device<nvram_device>("nvram")->set_base(namcos2_eeprom, namcos2_eeprom_size);
namcos2_posirq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos2_shared_state::namcos2_posirq_tick),this));
m_eeprom = auto_alloc_array(machine(), UINT8, m_eeprom_size);
machine().device<nvram_device>("nvram")->set_base(m_eeprom, m_eeprom_size);
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 &audio_space = m_audiocpu->space(AS_PROGRAM);
mFinalLapProtCount = 0;
namcos2_mcu_analog_ctrl = 0;
namcos2_mcu_analog_data = 0xaa;
namcos2_mcu_analog_complete = 0;
sendval = 0;
m_mcu_analog_ctrl = 0;
m_mcu_analog_data = 0xaa;
m_mcu_analog_complete = 0;
/* Initialise the bank select in the sound CPU */
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 );
/* Place CPU2 & CPU3 into the reset condition */
ResetAllSubCPUs( machine(), ASSERT_LINE );
reset_all_subcpus(ASSERT_LINE);
/* Initialise interrupt handlers */
InitC148();
init_c148();
/* reset POSIRQ timer */
namcos2_posirq_timer->adjust(attotime::never);
m_posirq_timer->adjust(attotime::never);
m_player_mux = 0;
}
@ -153,12 +137,12 @@ MACHINE_RESET_MEMBER(namcos2_shared_state,namcos2)
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 )
{
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 4: return 0xBE;
case 6: return 0x1001;
case 7: return (sendval==1)?0xBE:1;
case 7: return (m_sendval==1)?0xBE:1;
}
break;
@ -316,14 +300,14 @@ READ16_MEMBER( namcos2_state::namcos2_68k_key_r )
switch(offset)
{
case 4:
if( sendval == 1 ){
sendval = 0;
if( m_sendval == 1 ){
m_sendval = 0;
return 0x13F;
}
break;
case 7:
if( sendval == 1 ){
sendval = 0;
if( m_sendval == 1 ){
m_sendval = 0;
return 0x13F;
}
break;
@ -408,19 +392,19 @@ WRITE16_MEMBER( namcos2_state::namcos2_68k_key_w )
int gametype = m_gametype;
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 (data == 0x13EC) sendval = 1;
if (data == 0x13EC) m_sendval = 1;
}
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 (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 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()
{
@ -453,20 +433,17 @@ bool namcos2_shared_state::is_system21()
}
}
static void InitC148(void)
void namcos2_shared_state::init_c148()
{
int loop;
for(loop = 0; loop < 0x20; loop++)
for(int loop = 0; loop < 0x20; loop++)
{
namcos2_68k_master_C148[loop] = 0;
namcos2_68k_slave_C148[loop] = 0;
namcos2_68k_gpu_C148[loop] = 0;
m_68k_master_C148[loop] = 0;
m_68k_slave_C148[loop] = 0;
m_68k_gpu_C148[loop] = 0;
}
}
static UINT16
ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite )
UINT16 namcos2_shared_state::readwrite_c148( address_space &space, offs_t offset, UINT16 data, int bWrite )
{
offs_t addr = ((offset * 2) + 0x1c0000) & 0x1fe000;
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"))
{
pC148Reg = namcos2_68k_master_C148;
pC148Reg = m_68k_master_C148;
altcpu = space.machine().device("slave");
pC148RegAlt = namcos2_68k_slave_C148;
pC148RegAlt = m_68k_slave_C148;
}
else if (&space.device() == space.machine().device("slave"))
{
pC148Reg = namcos2_68k_slave_C148;
pC148Reg = m_68k_slave_C148;
altcpu = space.machine().device("maincpu");
pC148RegAlt = namcos2_68k_master_C148;
pC148RegAlt = m_68k_master_C148;
}
else if (&space.device() == space.machine().device("gpu"))
{
pC148Reg = namcos2_68k_gpu_C148;
pC148Reg = m_68k_gpu_C148;
altcpu = space.machine().device("maincpu");
pC148RegAlt = namcos2_68k_master_C148;
pC148RegAlt = m_68k_master_C148;
}
if( bWrite )
@ -600,13 +577,13 @@ ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite )
{
if (data & 0x01)
{ /* Resume execution */
ResetAllSubCPUs(space.machine(), CLEAR_LINE);
reset_all_subcpus(CLEAR_LINE);
/* Give the new CPU an immediate slice of the action */
space.device().execute().yield();
}
else
{ /* Suspend execution */
ResetAllSubCPUs(space.machine(), ASSERT_LINE);
reset_all_subcpus(ASSERT_LINE);
}
}
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 )
{
(void)ReadWriteC148(space, offset, data, 1);
(void)readwrite_c148(space, offset, data, 1);
}
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 )
{
(void)ReadWriteC148(space, offset, data, 1);
(void)readwrite_c148(space, offset, data, 1);
}
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 )
{
(void)ReadWriteC148(space, offset, data, 1);
(void)readwrite_c148(space, offset, data, 1);
}
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>();
if (state->is_system21()) return 0;
return downcast<namcos2_state *>(state)->get_pos_irq_scanline();
namcos2_state *s2state = machine().driver_data<namcos2_state>();
if (is_system21()) return 0;
return s2state->get_pos_irq_scanline();
}
TIMER_CALLBACK_MEMBER(namcos2_shared_state::namcos2_posirq_tick)
{
if (is_system21()) {
if (namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
if (m_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
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;
}
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);
if (namcos2_68k_master_C148[NAMCOS2_C148_POSIRQ]) m_maincpu->set_input_line(namcos2_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_master_C148[NAMCOS2_C148_POSIRQ]) m_maincpu->set_input_line(m_68k_master_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 )
{
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)
{
if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine()));
device.execute().set_input_line(namcos2_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
device.execute().set_input_line(m_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
}
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_slave_vblank)
{
if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine()));
device.execute().set_input_line(namcos2_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
device.execute().set_input_line(m_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
}
INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_gpu_vblank)
{
/* only used by namcos21 */
int scanline = GetPosIRQScanline(machine());
int scanline = get_posirq_scanline();
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);
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 )
{
namcos2_mcu_analog_ctrl = data & 0xff;
m_mcu_analog_ctrl = data & 0xff;
/* Check if this is a start of conversion */
/* 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)
{
/* Set the conversion complete flag */
namcos2_mcu_analog_complete = 2;
m_mcu_analog_complete = 2;
/* We convert instantly, good eh! */
switch((data>>2) & 0x07)
{
case 0:
namcos2_mcu_analog_data=ioport("AN0")->read();
m_mcu_analog_data=ioport("AN0")->read();
break;
case 1:
namcos2_mcu_analog_data=ioport("AN1")->read();
m_mcu_analog_data=ioport("AN1")->read();
break;
case 2:
namcos2_mcu_analog_data=ioport("AN2")->read();
m_mcu_analog_data=ioport("AN2")->read();
break;
case 3:
namcos2_mcu_analog_data=ioport("AN3")->read();
m_mcu_analog_data=ioport("AN3")->read();
break;
case 4:
namcos2_mcu_analog_data=ioport("AN4")->read();
m_mcu_analog_data=ioport("AN4")->read();
break;
case 5:
namcos2_mcu_analog_data=ioport("AN5")->read();
m_mcu_analog_data=ioport("AN5")->read();
break;
case 6:
namcos2_mcu_analog_data=ioport("AN6")->read();
m_mcu_analog_data=ioport("AN6")->read();
break;
case 7:
namcos2_mcu_analog_data=ioport("AN7")->read();
m_mcu_analog_data=ioport("AN7")->read();
break;
default:
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 ||
m_gametype == NAMCOS2_DIRT_FOX_JP )
{
namcos2_mcu_analog_data ^= 0x80;
m_mcu_analog_data ^= 0x80;
}
#endif
/* 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;
/* 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(namcos2_mcu_analog_complete) data|=0x80;
if(m_mcu_analog_complete==2) m_mcu_analog_complete=1;
if(m_mcu_analog_complete) data|=0x80;
/* 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 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 )
{
if(namcos2_mcu_analog_complete==1) namcos2_mcu_analog_complete=0;
return namcos2_mcu_analog_data;
if(m_mcu_analog_complete==1) m_mcu_analog_complete=0;
return m_mcu_analog_data;
}
WRITE8_MEMBER( namcos2_shared_state::namcos2_mcu_port_d_w )

View File

@ -7,6 +7,7 @@
static void
TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
//void namcos2_shared_state::tilemap_cb(UINT16 code, int *tile, int *mask)
{
*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);
break;
}
} /* TilemapCB */
}
/**
* 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 )
{
return m_gfx_ctrl;
} /* namcos2_gfx_ctrl_r */
}
WRITE16_MEMBER( namcos2_state::gfx_ctrl_w )
{
COMBINE_DATA(&m_gfx_ctrl);
} /* namcos2_gfx_ctrl_w */
}
TILE_GET_INFO_MEMBER( namcos2_state::roz_tile_info )
{
int tile = m_rozram[tile_index];
SET_TILE_INFO_MEMBER(3,tile,0/*color*/,0);
} /* roz_tile_info */
}
struct RozParam
struct roz_param
{
UINT32 size;
UINT32 startx,starty;
@ -62,7 +63,7 @@ struct RozParam
};
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,
bitmap_ind16 &destbitmap, bitmap_ind8 &flagsbitmap,
bitmap_ind16 &srcbitmap, UINT32 size_mask)
@ -109,15 +110,15 @@ DrawRozHelperBlock(const struct RozParam *rozInfo, int destx, int desty,
dest += dest_rowinc;
desty++;
}
} /* DrawRozHelperBlock */
}
static void
DrawRozHelper(
draw_roz_helper(
screen_device &screen,
bitmap_ind16 &bitmap,
tilemap_t *tmap,
const rectangle &clip,
const struct RozParam *rozInfo )
const struct roz_param *rozInfo )
{
tmap->set_palette_offset(rozInfo->color );
@ -186,7 +187,7 @@ DrawRozHelper(
// Do the block columns
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);
// Increment to the next block column
sx += row_block_size_incxx;
@ -196,7 +197,7 @@ DrawRozHelper(
// Do the extra columns
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);
}
// Increment to the next row block
@ -210,7 +211,7 @@ DrawRozHelper(
// Do the block columns
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);
srcx += row_block_size_incxx;
srcy += row_block_size_incxy;
@ -219,7 +220,7 @@ DrawRozHelper(
// Do the extra columns
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);
}
}
@ -233,12 +234,12 @@ DrawRozHelper(
rozInfo->incyx, rozInfo->incyy,
rozInfo->wrap,0,0); // wrap, flags, pri
}
} /* DrawRozHelper */
}
void namcos2_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const int xoffset = 38,yoffset = 0;
struct RozParam rozParam;
struct roz_param rozParam;
rozParam.color = (m_gfx_ctrl & 0x0f00);
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.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 )
@ -314,7 +315,7 @@ READ16_MEMBER( namcos2_state::paletteram_word_r )
if (offset > 0x180b) return 0xff;
}
return m_paletteram[offset];
} /* namcos2_68k_video_palette_r */
}
WRITE16_MEMBER( namcos2_state::paletteram_word_w )
{
@ -361,7 +362,7 @@ WRITE16_MEMBER( namcos2_state::paletteram_word_w )
{
COMBINE_DATA(&m_paletteram[offset]);
}
} /* namcos2_68k_video_palette_w */
}
inline void
@ -382,7 +383,7 @@ namcos2_state::update_palette()
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;
/* intersect with master clip rectangle */
clip &= cliprect;
} /* apply_clip */
}
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");
}
} /* luckywld */
}
UINT32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{

View File

@ -45,61 +45,55 @@ WRITE16_MEMBER(namcos21_state::winrun_gpu_videoram_w)
videoram[(offset+i)&0x7ffff] = color;
}
}
} /* winrun_gpu_videoram_w */
}
READ16_MEMBER(namcos21_state::winrun_gpu_videoram_r)
{
UINT8 *videoram = m_videoram;
return videoram[offset]<<8;
} /* winrun_gpu_videoram_r */
}
static void
AllocatePolyFrameBuffer( running_machine &machine )
void namcos21_state::allocate_poly_framebuffer()
{
namcos21_state *state = machine.driver_data<namcos21_state>();
state->m_mpPolyFrameBufferZ = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
state->m_mpPolyFrameBufferPens = auto_alloc_array(machine, UINT16, FRAMEBUFFER_SIZE_IN_BYTES/2 );
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_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_mpPolyFrameBufferZ2 = 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);
namcos21_ClearPolyFrameBuffer(machine);
} /* AllocatePolyFrameBuffer */
clear_poly_framebuffer();
clear_poly_framebuffer();
}
void
namcos21_ClearPolyFrameBuffer( running_machine &machine )
void namcos21_state::clear_poly_framebuffer()
{
namcos21_state *state = machine.driver_data<namcos21_state>();
int i;
UINT16 *temp2;
/* swap work and visible framebuffers */
temp2 = state->m_mpPolyFrameBufferZ;
state->m_mpPolyFrameBufferZ = state->m_mpPolyFrameBufferZ2;
state->m_mpPolyFrameBufferZ2 = temp2;
temp2 = m_mpPolyFrameBufferZ;
m_mpPolyFrameBufferZ = m_mpPolyFrameBufferZ2;
m_mpPolyFrameBufferZ2 = temp2;
temp2 = state->m_mpPolyFrameBufferPens;
state->m_mpPolyFrameBufferPens = state->m_mpPolyFrameBufferPens2;
state->m_mpPolyFrameBufferPens2 = temp2;
temp2 = m_mpPolyFrameBufferPens;
m_mpPolyFrameBufferPens = m_mpPolyFrameBufferPens2;
m_mpPolyFrameBufferPens2 = temp2;
/* 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
CopyVisiblePolyFrameBuffer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi )
void namcos21_state::copy_visible_poly_framebuffer(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;
for( sy=clip.min_y; sy<=clip.max_y; sy++ )
{
UINT16 *dest = &bitmap.pix16(sy);
const UINT16 *pPen = state->m_mpPolyFrameBufferPens2+NAMCOS21_POLY_FRAME_WIDTH*sy;
const UINT16 *pZ = state->m_mpPolyFrameBufferZ2+NAMCOS21_POLY_FRAME_WIDTH*sy;
const UINT16 *pPen = m_mpPolyFrameBufferPens2+NAMCOS21_POLY_FRAME_WIDTH*sy;
const UINT16 *pZ = m_mpPolyFrameBufferZ2+NAMCOS21_POLY_FRAME_WIDTH*sy;
int 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)
{
@ -119,7 +113,7 @@ VIDEO_START_MEMBER(namcos21_state,namcos21)
{
m_videoram = auto_alloc_array(machine(), UINT8, 0x80000);
}
AllocatePolyFrameBuffer(machine());
allocate_poly_framebuffer();
c355_obj_init(
0, /* gfx bank */
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
}
CopyVisiblePolyFrameBuffer( machine(), bitmap, cliprect, 0x7fc0, 0x7ffe );
copy_visible_poly_framebuffer(bitmap, cliprect, 0x7fc0, 0x7ffe);
if( m_gametype != NAMCOS21_WINRUN91 )
{ /* 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 );
}
CopyVisiblePolyFrameBuffer( machine(), bitmap, cliprect, 0, 0x7fbf );
copy_visible_poly_framebuffer(bitmap, cliprect, 0, 0x7fbf);
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; }
static void
renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable )
void namcos21_state::renderscanline_flat(const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable)
{
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 *pZBuf = state->m_mpPolyFrameBufferZ + sy*NAMCOS21_POLY_FRAME_WIDTH;
UINT16 *pDest = m_mpPolyFrameBufferPens + sy*NAMCOS21_POLY_FRAME_WIDTH;
UINT16 *pZBuf = m_mpPolyFrameBufferZ + sy*NAMCOS21_POLY_FRAME_WIDTH;
int x0 = (int)e1->x;
int x1 = (int)e2->x;
int w = x1-x0;
@ -264,12 +245,12 @@ renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int
if( depthcueenable && zz>0 )
{
int depth = 0;
if( state->m_gametype == NAMCOS21_WINRUN91 )
if( m_gametype == NAMCOS21_WINRUN91 )
{
depth = (zz>>10)*0x100;
pen += depth;
}
else if( state->m_gametype == NAMCOS21_DRIVERS_EYES )
else if( m_gametype == NAMCOS21_DRIVERS_EYES )
{
depth = (zz>>10)*0x100;
pen -= depth;
@ -287,16 +268,9 @@ renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int
}
}
}
} /* renderscanline_flat */
}
static void
rendertri(
namcos21_state *state,
const vertex *v0,
const vertex *v1,
const vertex *v2,
unsigned color,
int depthcueenable )
void namcos21_state::rendertri(const vertex *v0, const vertex *v1, const vertex *v2, unsigned color, int depthcueenable)
{
int dy,ystart,yend,crop;
@ -363,7 +337,7 @@ rendertri(
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.z += dz2dy;
@ -397,7 +371,7 @@ rendertri(
}
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.z += dz2dy;
@ -407,12 +381,10 @@ rendertri(
}
}
}
} /* rendertri */
}
void
namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4], int color )
void namcos21_state::draw_quad(int sx[4], int sy[4], int zcode[4], int color)
{
namcos21_state *state = machine.driver_data<namcos21_state>();
vertex a,b,c,d;
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)
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);
}
else if ( state->m_gametype == NAMCOS21_DRIVERS_EYES )
else if ( m_gametype == NAMCOS21_DRIVERS_EYES )
{
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.z = zcode[3];
rendertri( state, &a, &b, &c, color, depthcueenable );
rendertri( state, &c, &d, &a, color, depthcueenable );
} /* namcos21_DrawQuad */
rendertri(&a, &b, &c, color, depthcueenable);
rendertri(&c, &d, &a, color, depthcueenable);
}