summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/machine/pitnrun.cpp
blob: 9b7d691108dd9e6630f52ae61c0f9cf920e36000 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
                       
                                                       








                                                                            
                
                            
                             

 











                                     
                                   
 

                      
                                                        

 
                                                     
 
                      

 
                                       
 
                                                                                                             
                       

 
                                                     
 
                     
                                              
                          

 
                                        
 
                                                                                                                   
                                                                                       

 
                                         

                                 

                                                            
                                                     

 
 
                                           
 
                          

 
                                            
 
                           





















                                                                              
                                           



                    
 
                                                     
 
                     

 
                                                       
 

                        

 
                                            
 
                                                                


                                                              
                                                                                                                     
                                                    
                                       



                                                       
                                                                                                                                    


                         
                                                             


                         
                                                            


                         
                                                               


                         
                                                                      












                                                                       
                                           
 
                                                  
 
// license:BSD-3-Clause
// copyright-holders:Tomasz Slanina, Pierpaolo Prazzoli
/***************************************************************************

    Pit&Run

    Based on TaitsoSJ driver
    68705 has access to Z80 memory space

***************************************************************************/

#include "emu.h"
#include "cpu/m6805/m6805.h"
#include "includes/pitnrun.h"


void pitnrun_state::machine_start()
{
	save_item(NAME(m_nmi));
	save_item(NAME(m_fromz80));
	save_item(NAME(m_toz80));
	save_item(NAME(m_zaccept));
	save_item(NAME(m_zready));
	save_item(NAME(m_portA_in));
	save_item(NAME(m_portA_out));
	save_item(NAME(m_address));
}

void pitnrun_state::machine_reset()
{
	m_zaccept = 1;
	m_zready = 0;
	if (m_mcu) m_mcu->set_input_line(0, CLEAR_LINE);
}

TIMER_CALLBACK_MEMBER(pitnrun_state::mcu_real_data_r)
{
	m_zaccept = 1;
}

READ8_MEMBER(pitnrun_state::mcu_data_r)
{
	machine().scheduler().synchronize(timer_expired_delegate(FUNC(pitnrun_state::mcu_real_data_r),this));
	return m_toz80;
}

TIMER_CALLBACK_MEMBER(pitnrun_state::mcu_real_data_w)
{
	m_zready = 1;
	m_mcu->set_input_line(0, ASSERT_LINE);
	m_fromz80 = param;
}

WRITE8_MEMBER(pitnrun_state::mcu_data_w)
{
	machine().scheduler().synchronize(timer_expired_delegate(FUNC(pitnrun_state::mcu_real_data_w),this), data);
	machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(5));
}

READ8_MEMBER(pitnrun_state::mcu_status_r)
{
	/* mcu synchronization */
	/* bit 0 = the 68705 has read data from the Z80 */
	/* bit 1 = the 68705 has written data for the Z80 */
	return ~((m_zready << 1) | (m_zaccept << 0));
}


READ8_MEMBER(pitnrun_state::m68705_portA_r)
{
	return m_portA_in;
}

WRITE8_MEMBER(pitnrun_state::m68705_portA_w)
{
	m_portA_out = data;
}



/*
 *  Port B connections:
 *
 *  all bits are logical 1 when read (+5V pullup)
 *
 *  0   W  !68INTRQ
 *  1   W  !68LRD (enables latch which holds command from the Z80)
 *  2   W  !68LWR (loads the latch which holds data for the Z80, and sets a
 *                 status bit so the Z80 knows there's data waiting)
 *  3   W  to Z80 !BUSRQ (aka !WAIT) pin
 *  4   W  !68WRITE (triggers write to main Z80 memory area )
 *  5   W  !68READ (triggers read from main Z80 memory area )
 *  6   W  !LAL (loads the latch which holds the low 8 bits of the address of
 *               the main Z80 memory location to access)
 *  7   W  !UAL (loads the latch which holds the high 8 bits of the address of
 *               the main Z80 memory location to access)
 */

READ8_MEMBER(pitnrun_state::m68705_portB_r)
{
	return 0xff;
}


TIMER_CALLBACK_MEMBER(pitnrun_state::mcu_data_real_r)
{
	m_zready = 0;
}

TIMER_CALLBACK_MEMBER(pitnrun_state::mcu_status_real_w)
{
	m_toz80 = param;
	m_zaccept = 0;
}

WRITE8_MEMBER(pitnrun_state::m68705_portB_w)
{
	address_space &cpu0space = m_maincpu->space(AS_PROGRAM);
	if (~data & 0x02)
	{
		/* 68705 is going to read data from the Z80 */
		machine().scheduler().synchronize(timer_expired_delegate(FUNC(pitnrun_state::mcu_data_real_r),this));
		m_mcu->set_input_line(0,CLEAR_LINE);
		m_portA_in = m_fromz80;
	}
	if (~data & 0x04)
	{
		/* 68705 is writing data for the Z80 */
		machine().scheduler().synchronize(timer_expired_delegate(FUNC(pitnrun_state::mcu_status_real_w),this), m_portA_out);
	}
	if (~data & 0x10)
	{
		cpu0space.write_byte(m_address, m_portA_out);
	}
	if (~data & 0x20)
	{
		m_portA_in = cpu0space.read_byte(m_address);
	}
	if (~data & 0x40)
	{
		m_address = (m_address & 0xff00) | m_portA_out;
	}
	if (~data & 0x80)
	{
		m_address = (m_address & 0x00ff) | (m_portA_out << 8);
	}
}

/*
 *  Port C connections:
 *
 *  0   R  ZREADY (1 when the Z80 has written a command in the latch)
 *  1   R  ZACCEPT (1 when the Z80 has read data from the latch)
 *  2   R  from Z80 !BUSAK pin
 *  3   R  68INTAK (goes 0 when the interrupt request done with 68INTRQ
 *                  passes through)
 */

READ8_MEMBER(pitnrun_state::m68705_portC_r)
{
	return (m_zready << 0) | (m_zaccept << 1);
}