Removed MC68901 polling for gpio bits. [smf]

This commit is contained in:
smf- 2013-12-29 00:14:05 +00:00
parent 4f61954a68
commit 93188e310b
8 changed files with 32 additions and 176 deletions

View File

@ -293,7 +293,7 @@ inline void mc68901_device::timer_input(int index, int value)
inline void mc68901_device::gpio_input(int bit, int state)
{
if (state != BIT(m_gpip, bit))
if (state != BIT(m_gpio_input, bit))
{
if (state == BIT(m_aer, bit))
{
@ -309,9 +309,9 @@ inline void mc68901_device::gpio_input(int bit, int state)
if (state)
m_gpip &= ~(1 << bit);
m_gpio_input |= (1 << bit);
else
m_gpip |= (1 << bit);
m_gpio_input &= ~(1 << bit);
}
}
@ -328,8 +328,7 @@ inline void mc68901_device::gpio_input(int bit, int state)
mc68901_device::mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, MC68901, "Motorola MC68901", tag, owner, clock, "mc68901", __FILE__),
device_serial_interface(mconfig, *this),
m_gpip(0),
m_tsr(TSR_BUFFER_EMPTY)
m_gpio_input(0)
{
}
@ -364,7 +363,6 @@ void mc68901_device::device_start()
m_start_bit_hack_for_external_clocks = true;
/* resolve callbacks */
m_in_gpio_func.resolve(m_in_gpio_cb, *this);
m_out_gpio_func.resolve(m_out_gpio_cb, *this);
m_out_so_func.resolve(m_out_so_cb, *this);
m_out_tao_func.resolve(m_out_tao_cb, *this);
@ -554,9 +552,7 @@ READ8_MEMBER( mc68901_device::read )
{
switch (offset)
{
case REGISTER_GPIP:
m_gpip = m_in_gpio_func(0);
return m_gpip;
case REGISTER_GPIP: return (m_gpio_input & ~m_ddr) | (m_gpip & m_ddr);
case REGISTER_AER: return m_aer;
case REGISTER_DDR: return m_ddr;

View File

@ -79,7 +79,6 @@ struct mc68901_interface
devcb_write_line m_out_irq_cb;
devcb_read8 m_in_gpio_cb;
devcb_write8 m_out_gpio_cb;
devcb_write_line m_out_tao_cb;
@ -237,7 +236,6 @@ private:
static const int GPIO_TIMER[];
static const int PRESCALER[];
devcb_resolved_read8 m_in_gpio_func;
devcb_resolved_write8 m_out_gpio_func;
devcb_resolved_write_line m_out_so_func;
devcb_resolved_write_line m_out_tao_func;
@ -272,6 +270,7 @@ private:
int m_udr_written;
UINT8 m_rcv;
int m_rcv_pending;
UINT8 m_gpio_input;
/* counter timer state */
UINT8 m_tmc[4]; /* timer main counters */

View File

@ -1896,52 +1896,6 @@ static ACIA6850_INTERFACE( acia_midi_intf )
// MC68901_INTERFACE( mfp_intf )
//-------------------------------------------------
READ8_MEMBER( st_state::mfp_gpio_r )
{
/*
bit description
0 Centronics BUSY
1 RS232 DCD
2 RS232 CTS
3 Blitter done
4 Keyboard/MIDI
5 FDC
6 RS232 RI
7 Monochrome monitor detect
*/
UINT8 data = 0;
// centronics busy
data |= m_centronics->busy_r();
// data carrier detect
data |= m_rs232->dcd_r() << 1;
// clear to send
data |= m_rs232->cts_r() << 2;
// blitter done
data |= m_blitter_done << 3;
// keyboard/MIDI interrupt
data |= (!(m_acia_ikbd_irq || m_acia_midi_irq)) << 4;
// floppy interrupt request
data |= !m_fdc->intrq_r() << 5;
// ring indicator
data |= m_rs232->ri_r() << 6;
// monochrome monitor detect
data |= m_monochrome << 7;
return data;
}
WRITE_LINE_MEMBER( st_state::mfp_tdo_w )
{
m_mfp->clock_w(state);
@ -1953,7 +1907,6 @@ static MC68901_INTERFACE( mfp_intf )
0, /* receive clock */
0, /* transmit clock */
DEVCB_CPU_INPUT_LINE(M68000_TAG, M68K_IRQ_6), /* interrupt */
DEVCB_DRIVER_MEMBER(st_state, mfp_gpio_r), /* GPIO read */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
@ -1967,59 +1920,12 @@ static MC68901_INTERFACE( mfp_intf )
// MC68901_INTERFACE( atariste_mfp_intf )
//-------------------------------------------------
READ8_MEMBER( ste_state::mfp_gpio_r )
{
/*
bit description
0 Centronics BUSY
1 RS232 DCD
2 RS232 CTS
3 Blitter done
4 Keyboard/MIDI
5 FDC
6 RS232 RI
7 Monochrome monitor detect / DMA sound active
*/
UINT8 data = 0;
// centronics busy
data |= m_centronics->busy_r();
// data carrier detect
data |= m_rs232->dcd_r() << 1;
// clear to send
data |= m_rs232->cts_r() << 2;
// blitter done
data |= m_blitter_done << 3;
// keyboard/MIDI interrupt
data |= (!(m_acia_ikbd_irq || m_acia_midi_irq)) << 4;
// floppy interrupt request
data |= !m_fdc->intrq_r() << 5;
// ring indicator
data |= m_rs232->ri_r() << 6;
// monochrome monitor detect, DMA sound active
data |= (m_monochrome ^ m_dmasnd_active) << 7;
return data;
}
static MC68901_INTERFACE( atariste_mfp_intf )
{
Y1, /* timer clock */
0, /* receive clock */
0, /* transmit clock */
DEVCB_CPU_INPUT_LINE(M68000_TAG, M68K_IRQ_6), /* interrupt */
DEVCB_DRIVER_MEMBER(ste_state, mfp_gpio_r), /* GPIO read */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
@ -2033,50 +1939,8 @@ static MC68901_INTERFACE( atariste_mfp_intf )
// MC68901_INTERFACE( stbook_mfp_intf )
//-------------------------------------------------
READ8_MEMBER( stbook_state::mfp_gpio_r )
{
/*
bit description
0 Centronics BUSY
1 RS232 DCD
2 RS232 CTS
3 Blitter done
4 Keyboard/MIDI
5 FDC
6 RS232 RI
7 POWER ALARMS
*/
UINT8 data = 0;
// centronics busy
data |= m_centronics->busy_r();
// data carrier detect
data |= m_rs232->dcd_r() << 1;
// clear to send
data |= m_rs232->cts_r() << 2;
// blitter done
data |= m_blitter_done << 3;
// keyboard/MIDI interrupt
data |= (!(m_acia_ikbd_irq || m_acia_midi_irq)) << 4;
// floppy data request
data |= !m_fdc->intrq_r() << 5;
// ring indicator
data |= m_rs232->ri_r() << 6;
// TODO power alarms
return data;
}
// TODO power alarms (i7_w)
static MC68901_INTERFACE( stbook_mfp_intf )
{
@ -2084,7 +1948,6 @@ static MC68901_INTERFACE( stbook_mfp_intf )
0, /* receive clock */
0, /* transmit clock */
DEVCB_CPU_INPUT_LINE(M68000_TAG, M68K_IRQ_6), /* interrupt */
DEVCB_DRIVER_MEMBER(stbook_state, mfp_gpio_r), /* GPIO read */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
@ -2265,6 +2128,11 @@ void st_state::machine_start()
m_fdc->setup_drq_cb(wd1772_t::line_cb(FUNC(st_state::fdc_drq_w), this));
m_fdc->setup_intrq_cb(wd1772_t::line_cb(FUNC(st_state::fdc_intrq_w), this));
/// TODO: get callbacks to trigger these.
m_mfp->i0_w(1);
m_mfp->i5_w(1);
m_mfp->i7_w(1);
}
@ -2310,6 +2178,11 @@ void ste_state::machine_start()
/* register for state saving */
state_save();
/// TODO: get callbacks to trigger these.
m_mfp->i0_w(1);
m_mfp->i5_w(1);
m_mfp->i7_w(1);
}
@ -2346,6 +2219,10 @@ void stbook_state::machine_start()
/* register for state saving */
ste_state::state_save();
/// TODO: get callbacks to trigger these.
m_mfp->i0_w(1);
m_mfp->i5_w(1);
}
FLOPPY_FORMATS_MEMBER( st_state::floppy_formats )

View File

@ -1212,27 +1212,14 @@ WRITE_LINE_MEMBER(x68k_state::x68k_fm_irq)
{
if(state == CLEAR_LINE)
{
m_mfp.gpio |= 0x08;
m_mfpdev->i3_w(1);
}
else
{
m_mfp.gpio &= ~0x08;
m_mfpdev->i3_w(0);
}
}
READ8_MEMBER( x68k_state::mfp_gpio_r )
{
UINT8 data = m_mfp.gpio;
data &= ~(m_crtc.hblank << 7);
data &= ~(m_crtc.vblank << 4);
data |= 0x23; // GPIP5 is unused, always 1
return data;
}
WRITE8_MEMBER(x68k_state::x68030_adpcm_w)
{
switch(offset)
@ -1428,7 +1415,6 @@ static MC68901_INTERFACE( mfp_interface )
0, /* receive clock */
0, /* transmit clock */
DEVCB_DRIVER_LINE_MEMBER(x68k_state,mfp_irq_callback), /* interrupt */
DEVCB_DRIVER_MEMBER(x68k_state, mfp_gpio_r), /* GPIO read */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_DRIVER_LINE_MEMBER(x68k_state, mfp_tbo_w), /* TBO */
@ -1755,7 +1741,15 @@ MACHINE_RESET_MEMBER(x68k_state,x68000)
// start HBlank timer
m_scanline_timer->adjust(machine().primary_screen->scan_period(), 1);
m_mfp.gpio = 0xfb;
/// TODO: get callbacks to trigger these
m_mfpdev->i0_w(1); // alarm
m_mfpdev->i1_w(1); // expon
m_mfpdev->i2_w(0); // pow sw
m_mfpdev->i3_w(1); // fmirq
m_mfpdev->i4_w(1); // v-disp
m_mfpdev->i5_w(1); // unused (always set)
m_mfpdev->i6_w(1); // cirq
m_mfpdev->i7_w(1); // h-sync
// reset output values
output_set_value("key_led_kana",1);

View File

@ -299,7 +299,6 @@ public:
int m_shifter_vblank_start;
/* blitter state */
int m_blitter_done;
UINT16 m_blitter_halftone[16];
INT16 m_blitter_src_inc_x;
INT16 m_blitter_src_inc_y;

View File

@ -66,7 +66,6 @@ public:
optional_shared_ptr<UINT32> m_tvram32;
DECLARE_WRITE_LINE_MEMBER( mfp_tbo_w );
DECLARE_READ8_MEMBER( mfp_gpio_r );
void fdc_irq(bool state);
void fdc_drq(bool state);
@ -109,10 +108,6 @@ public:
int clock; // ADPCM clock speed
} m_adpcm;
struct
{
unsigned char gpio;
} m_mfp; // MC68901 Multifunction Peripheral (4MHz)
struct
{
unsigned short reg[24]; // registers
int operation; // operation port (0xe80481)

View File

@ -720,8 +720,7 @@ void st_state::blitter_tick()
m_blitter_ctrl &= 0x7f;
m_blitter_done = 0;
m_mfp->i3_w(m_blitter_done);
m_mfp->i3_w(0);
}
@ -1047,8 +1046,7 @@ WRITE16_MEMBER( st_state::blitter_ctrl_w )
{
if ((data >> 8) & ATARIST_BLITTER_CTRL_BUSY)
{
m_blitter_done = 1;
m_mfp->i3_w(m_blitter_done);
m_mfp->i3_w(1);
int nops = BLITTER_NOPS[m_blitter_op][m_blitter_hop]; // each NOP takes 4 cycles
timer_set(attotime::from_hz((Y2/4)/(4*nops)), TIMER_BLITTER_TICK);

View File

@ -260,7 +260,6 @@ TIMER_CALLBACK_MEMBER(x68k_state::x68k_hsync)
TIMER_CALLBACK_MEMBER(x68k_state::x68k_crtc_raster_end)
{
m_mfp.gpio |= 0x40;
m_mfpdev->i6_w(1);
}
@ -272,7 +271,6 @@ TIMER_CALLBACK_MEMBER(x68k_state::x68k_crtc_raster_irq)
if(scan <= m_crtc.vtotal)
{
m_mfp.gpio &= ~0x40; // GPIP6
m_mfpdev->i6_w(0);
machine().primary_screen->update_partial(scan);
irq_time = machine().primary_screen->time_until_pos(scan,m_crtc.hbegin);