6526cia.c: The PC output will now go low for 1 cycle following a read/write of port B. (instead of being toggled immediately) [Curt Coder]

This commit is contained in:
Curt Coder 2012-03-20 15:49:47 +00:00
parent f3ab660bfb
commit 173999b05e
2 changed files with 48 additions and 10 deletions

View File

@ -10,9 +10,11 @@
#include "emu.h" #include "emu.h"
#include "6526cia.h" #include "6526cia.h"
/***************************************************************************
CONSTANTS
***************************************************************************/ //**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
/* CIA registers */ /* CIA registers */
#define CIA_PRA 0 #define CIA_PRA 0
@ -41,20 +43,34 @@
#define CIA_CRA_SPMODE 0x40 #define CIA_CRA_SPMODE 0x40
#define CIA_CRA_TODIN 0x80 #define CIA_CRA_TODIN 0x80
//************************************************************************** //**************************************************************************
// DEVICE CONFIGURATION // DEVICE CONFIGURATION
//************************************************************************** //**************************************************************************
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
// device type definition // device type definition
const device_type MOS6526R1 = &device_creator<mos6526r1_device>; const device_type MOS6526R1 = &device_creator<mos6526r1_device>;
const device_type MOS6526R2 = &device_creator<mos6526r2_device>; const device_type MOS6526R2 = &device_creator<mos6526r2_device>;
const device_type MOS8520 = &device_creator<mos8520_device>; const device_type MOS8520 = &device_creator<mos8520_device>;
//**************************************************************************
// INLINE HELPERS
//**************************************************************************
inline attotime mos6526_device::cycles_to_time(int c)
{
return attotime::from_hz(clock()) * c;
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//------------------------------------------------- //-------------------------------------------------
// mos6526_device - constructor // mos6526_device - constructor
//------------------------------------------------- //-------------------------------------------------
@ -174,6 +190,8 @@ void mos6526_device::device_start()
} }
/* setup timers */ /* setup timers */
m_pc_timer = timer_alloc(TIMER_PC);
for (int t = 0; t < (sizeof(m_timer) / sizeof(m_timer[0])); t++) for (int t = 0; t < (sizeof(m_timer) / sizeof(m_timer[0])); t++)
{ {
cia_timer *timer = &m_timer[t]; cia_timer *timer = &m_timer[t];
@ -225,6 +243,21 @@ void mos6526_device::device_start()
} }
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
void mos6526_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (id)
{
case TIMER_PC:
m_out_pc_func(1);
break;
}
}
/*------------------------------------------------- /*-------------------------------------------------
set_port_mask_value set_port_mask_value
-------------------------------------------------*/ -------------------------------------------------*/
@ -240,9 +273,9 @@ void mos6526_device::set_port_mask_value(int port, int data)
void mos6526_device::update_pc() void mos6526_device::update_pc()
{ {
/* this should really be one cycle long */
m_out_pc_func(0); m_out_pc_func(0);
m_out_pc_func(1);
m_pc_timer->adjust(cycles_to_time(1));
} }
/*------------------------------------------------- /*-------------------------------------------------

View File

@ -132,12 +132,15 @@ protected:
virtual void device_reset(); virtual void device_reset();
virtual void device_post_load() { } virtual void device_post_load() { }
virtual void device_clock_changed() { } virtual void device_clock_changed() { }
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
static TIMER_CALLBACK( timer_proc ); static TIMER_CALLBACK( timer_proc );
static TIMER_CALLBACK( clock_tod_callback ); static TIMER_CALLBACK( clock_tod_callback );
private: private:
static const device_timer_id TIMER_PC = 0;
inline attotime cycles_to_time(int c);
void update_pc(); void update_pc();
void update_interrupts(); void update_interrupts();
void timer_bump(int timer); void timer_bump(int timer);
@ -201,6 +204,8 @@ private:
UINT8 m_cnt; UINT8 m_cnt;
UINT8 m_shift; UINT8 m_shift;
UINT8 m_serial; UINT8 m_serial;
emu_timer *m_pc_timer;
}; };
class mos6526r1_device : public mos6526_device class mos6526r1_device : public mos6526_device