8237dma: convert its remaining users and kill it (nw)

--
The apollo and bebox both boot but might need more thorough testing.
This commit is contained in:
cracyc 2013-05-30 03:20:36 +00:00
parent fc8c461aca
commit a8836f3b65
16 changed files with 85 additions and 999 deletions

2
.gitattributes vendored
View File

@ -1164,8 +1164,6 @@ src/emu/machine/7474.c svneol=native#text/plain
src/emu/machine/7474.h svneol=native#text/plain
src/emu/machine/8042kbdc.c svneol=native#text/plain
src/emu/machine/8042kbdc.h svneol=native#text/plain
src/emu/machine/8237dma.c svneol=native#text/plain
src/emu/machine/8237dma.h svneol=native#text/plain
src/emu/machine/8257dma.c svneol=native#text/plain
src/emu/machine/8257dma.h svneol=native#text/plain
src/emu/machine/aakart.c svneol=native#text/plain

View File

@ -160,7 +160,6 @@ EMUMACHINEOBJS = \
$(EMUMACHINE)/74181.o \
$(EMUMACHINE)/7474.o \
$(EMUMACHINE)/8042kbdc.o \
$(EMUMACHINE)/8237dma.o \
$(EMUMACHINE)/8257dma.o \
$(EMUMACHINE)/aakart.o \
$(EMUMACHINE)/adc0808.o \

View File

@ -1,695 +0,0 @@
/**********************************************************************
8237 DMA interface and emulation
The DMA works like this:
(summarized from http://www.infran.ru/TechInfo/BSD/handbook258.html#410)
1. The device asserts the DRQn line
2. The DMA clears the TC (terminal count) line
3. The DMA asserts the CPU's HRQ (halt request) line
4. Upon acknowledgement of the halt, the DMA will let the device
know that it needs to send information by asserting the DACKn
line
5. The DMA will read the byte from the device
6. The device clears the DRQn line
7. The DMA clears the CPU's HRQ line
8. (steps 3-7 are repeated for every byte in the chain)
**********************************************************************/
#include "emu.h"
#include "8237dma.h"
/***************************************************************************
MACROS
***************************************************************************/
#define DMA_MODE_CHANNEL(mode) ((mode) & 0x03)
#define DMA_MODE_OPERATION(mode) ((mode) & 0x0c)
#define DMA_MODE_AUTO_INIT(mode) ((mode) & 0x10)
#define DMA_MODE_DIRECTION(mode) ((mode) & 0x20)
#define DMA_MODE_TRANSFERMODE(mode) ((mode) & 0xc0)
#define DMA8237_VERIFY_TRANSFER 0x00
#define DMA8237_WRITE_TRANSFER 0x04
#define DMA8237_READ_TRANSFER 0x08
#define DMA8237_ILLEGAL_TRANSFER 0x0c
#define DMA8237_DEMAND_MODE 0x00
#define DMA8237_SINGLE_MODE 0x40
#define DMA8237_BLOCK_MODE 0x80
#define DMA8237_CASCADE_MODE 0xc0
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
// device type definition
const device_type I8237 = &device_creator<i8237_device>;
//-------------------------------------------------
// i8237_device - constructor
//-------------------------------------------------
i8237_device::i8237_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, I8237, "Intel 8237", tag, owner, clock)
{
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void i8237_device::device_config_complete()
{
// inherit a copy of the static data
const i8237_interface *intf = reinterpret_cast<const i8237_interface *>(static_config());
if (intf != NULL)
{
*static_cast<i8237_interface *>(this) = *intf;
}
// or initialize to defaults if none provided
else
{
memset(&m_out_hrq_cb, 0, sizeof(m_out_hrq_cb));
memset(&m_out_eop_cb, 0, sizeof(m_out_eop_cb));
memset(&m_in_memr_cb, 0, sizeof(m_in_memr_cb));
memset(&m_out_memw_cb, 0, sizeof(m_out_memw_cb));
memset(&m_in_ior_cb[0], 0, sizeof(m_in_ior_cb[0]));
memset(&m_in_ior_cb[1], 0, sizeof(m_in_ior_cb[1]));
memset(&m_in_ior_cb[2], 0, sizeof(m_in_ior_cb[2]));
memset(&m_in_ior_cb[3], 0, sizeof(m_in_ior_cb[3]));
memset(&m_out_iow_cb[0], 0, sizeof(m_out_iow_cb[0]));
memset(&m_out_iow_cb[1], 0, sizeof(m_out_iow_cb[1]));
memset(&m_out_iow_cb[2], 0, sizeof(m_out_iow_cb[2]));
memset(&m_out_iow_cb[3], 0, sizeof(m_out_iow_cb[3]));
memset(&m_out_dack_cb[0], 0, sizeof(m_out_dack_cb[0]));
memset(&m_out_dack_cb[1], 0, sizeof(m_out_dack_cb[1]));
memset(&m_out_dack_cb[2], 0, sizeof(m_out_dack_cb[2]));
memset(&m_out_dack_cb[3], 0, sizeof(m_out_dack_cb[3]));
}
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void i8237_device::device_start()
{
/* resolve callbacks */
m_out_hrq_func.resolve(m_out_hrq_cb, *this);
m_out_eop_func.resolve(m_out_eop_cb, *this);
m_in_memr_func.resolve(m_in_memr_cb, *this);
m_out_memw_func.resolve(m_out_memw_cb, *this);
for (int i = 0; i < 4; i++)
{
m_chan[i].m_in_ior_func.resolve(m_in_ior_cb[i], *this);
m_chan[i].m_out_iow_func.resolve(m_out_iow_cb[i], *this);
m_chan[i].m_out_dack_func.resolve(m_out_dack_cb[i], *this);
}
m_timer = machine().scheduler().timer_alloc(FUNC(i8237_timerproc_callback), (void *)this);
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void i8237_device::device_reset()
{
m_status = 0x0F;
m_eop = ASSERT_LINE;
m_state = DMA8237_SI;
m_last_service_channel = 3;
m_service_channel = 0;
m_command = 0;
m_drq = 0;
m_mask = 0x00;
m_hrq = 0;
m_hlda = 0;
for(int i = 0; i < 4; ++i)
{
m_chan[i].m_mode = 0;
m_chan[i].m_address = 0;
m_chan[i].m_count = 0;
}
m_timer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock()));
}
void i8237_device::i8237_do_read()
{
int channel = m_service_channel;
switch( DMA_MODE_OPERATION( m_chan[ channel ].m_mode ) )
{
case DMA8237_WRITE_TRANSFER:
m_temporary_data = m_chan[channel].m_in_ior_func(0);
break;
case DMA8237_READ_TRANSFER:
m_temporary_data = m_in_memr_func(m_chan[ channel ].m_address);
break;
case DMA8237_VERIFY_TRANSFER:
case DMA8237_ILLEGAL_TRANSFER:
break;
}
}
void i8237_device::i8237_do_write()
{
int channel = m_service_channel;
switch( DMA_MODE_OPERATION( m_chan[ channel ].m_mode ) )
{
case DMA8237_WRITE_TRANSFER:
m_out_memw_func(m_chan[ channel ].m_address, m_temporary_data);
break;
case DMA8237_READ_TRANSFER:
m_chan[channel].m_out_iow_func(0, m_temporary_data);
break;
case DMA8237_VERIFY_TRANSFER:
case DMA8237_ILLEGAL_TRANSFER:
break;
}
}
void i8237_device::i8237_advance()
{
int channel = m_service_channel;
int mode = m_chan[channel].m_mode;
switch ( DMA_MODE_OPERATION( mode ) )
{
case DMA8237_VERIFY_TRANSFER:
case DMA8237_WRITE_TRANSFER:
case DMA8237_READ_TRANSFER:
m_chan[channel].m_high_address_changed = 0;
if ( DMA_MODE_DIRECTION( mode ) )
{
m_chan[channel].m_address -= 1;
if ( ( m_chan[channel].m_address & 0xFF ) == 0xFF )
{
m_chan[channel].m_high_address_changed = 1;
}
}
else
{
m_chan[channel].m_address += 1;
if ( ( m_chan[channel].m_address & 0xFF ) == 0x00 )
{
m_chan[channel].m_high_address_changed = 1;
}
}
m_chan[channel].m_count--;
if ( m_chan[channel].m_count == 0xFFFF )
{
/* Set TC bit for this channel */
m_status |= ( 0x01 << channel );
if ( DMA_MODE_AUTO_INIT( mode ) )
{
m_chan[channel].m_address = m_chan[channel].m_base_address;
m_chan[channel].m_count = m_chan[channel].m_base_count;
m_chan[channel].m_high_address_changed = 1;
}
else
{
m_mask |= ( 0x01 << channel );
}
}
break;
case DMA8237_ILLEGAL_TRANSFER:
break;
}
}
void i8237_device::i8327_set_dack(int channel)
{
for (int i = 0; i < 4; i++)
{
int state = (i == channel) ^ !BIT(m_command, 7);
m_chan[i].m_out_dack_func(state);
}
}
TIMER_CALLBACK( i8237_device::i8237_timerproc_callback )
{
reinterpret_cast<i8237_device*>(ptr)->i8237_timerproc();
}
void i8237_device::i8237_timerproc()
{
/* Check if operation is disabled */
if ( m_command & 0x04 )
{
return;
}
switch ( m_state )
{
case DMA8237_SI:
{
/* Make sure EOP is high */
if ( m_eop == CLEAR_LINE )
{
m_eop = ASSERT_LINE;
m_out_eop_func(m_eop);
}
/* Check if a new DMA request has been received. */
/* Bit 6 of the command register determines whether the DREQ signals are active
high or active low. */
UINT16 pending_request = ( ( m_command & 0x40 ) ? ~m_drq : m_drq ) & ~m_mask;
if ( pending_request & 0x0f )
{
int prio_channel = 0;
/* Determine the channel that should be serviced */
int channel = ( m_command & 0x10 ) ? m_last_service_channel : 3;
for ( int i = 0; i < 4; i++ )
{
if ( pending_request & ( 1 << channel ) )
{
prio_channel = channel;
}
channel = ( channel - 1 ) & 0x03;
}
/* Store the channel we will be servicing and go to the next state */
m_service_channel = prio_channel;
m_last_service_channel = prio_channel;
m_hrq = 1;
m_out_hrq_func(m_hrq);
m_state = DMA8237_S0;
m_timer->enable( true );
}
else if (m_command == 3 && (m_drq & 1))
{
/* Memory-to-memory transfers */
m_hlda = 1;
m_state = DMA8237_S0;
}
else
{
m_timer->enable( false );
}
break;
}
case DMA8237_S0:
/* S0 is the first of the DMA service. We have requested a hold but are waiting
for confirmation. */
if ( m_hlda )
{
if ( DMA_MODE_TRANSFERMODE( m_chan[m_service_channel].m_mode ) == DMA8237_CASCADE_MODE )
{
/* Cascade Mode, set DACK */
i8327_set_dack(m_service_channel);
/* Wait until peripheral is done */
m_state = DMA8237_SC;
}
else
{
if ( m_command & 0x01 )
{
/* Memory-to-memory transfers */
m_state = DMA8237_S11;
}
else
{
/* Regular transfers */
m_state = DMA8237_S1;
}
}
}
break;
case DMA8237_SC: /* Cascade mode, waiting until peripheral is done */
if ( ! ( m_drq & ( 0x01 << m_service_channel ) ) )
{
m_hrq = 0;
m_hlda = 0;
m_out_hrq_func(m_hrq);
m_state = DMA8237_SI;
/* Clear DACK */
i8327_set_dack(-1);
}
/* Not sure if this is correct, documentation is not clear */
/* Check if EOP output needs to be asserted */
if ( m_status & ( 0x01 << m_service_channel ) )
{
m_eop = CLEAR_LINE;
m_out_eop_func(m_eop);
}
break;
case DMA8237_S1: /* Output A8-A15 */
m_state = DMA8237_S2;
break;
case DMA8237_S2: /* Output A7-A0 */
/* set DACK */
i8327_set_dack(m_service_channel);
/* Check for compressed timing */
if ( m_command & 0x08 )
{
m_state = DMA8237_S4;
}
else
{
m_state = DMA8237_S3;
}
break;
case DMA8237_S3: /* Initiate read */
i8237_do_read();
m_state = DMA8237_S4;
break;
case DMA8237_S4: /* Perform read/write */
/* Perform read when in compressed timing mode */
if ( m_command & 0x08 )
{
i8237_do_read();
}
/* Perform write */
i8237_do_write();
/* Advance */
i8237_advance();
{
int channel = m_service_channel;
switch( DMA_MODE_TRANSFERMODE( m_chan[channel].m_mode ) )
{
case DMA8237_DEMAND_MODE:
/* Check for terminal count or EOP signal or DREQ begin de-asserted */
if ( ( m_status & ( 0x01 << channel ) ) || m_eop == CLEAR_LINE || !( m_drq & ( 0x01 << channel ) ) )
{
m_hrq = 0;
m_hlda = 0;
m_out_hrq_func(m_hrq);
m_state = DMA8237_SI;
}
else
{
m_state = m_chan[channel].m_high_address_changed ? DMA8237_S1 : DMA8237_S2;
}
break;
case DMA8237_SINGLE_MODE:
m_hrq = 0;
m_hlda = 0;
m_out_hrq_func(m_hrq);
m_state = DMA8237_SI;
break;
case DMA8237_BLOCK_MODE:
/* Check for terminal count or EOP signal */
if ( ( m_status & ( 0x01 << channel ) ) || m_eop == CLEAR_LINE )
{
m_hrq = 0;
m_hlda = 0;
m_out_hrq_func(m_hrq);
m_state = DMA8237_SI;
}
else
{
m_state = m_chan[channel].m_high_address_changed ? DMA8237_S1 : DMA8237_S2;
}
break;
}
/* Check if EOP output needs to be asserted */
if ( m_status & ( 0x01 << channel ) )
{
m_eop = CLEAR_LINE;
m_out_eop_func(m_eop);
}
}
/* clear DACK */
if ( m_state == DMA8237_SI )
{
i8327_set_dack(-1);
}
break;
case DMA8237_S11: /* Output A8-A15 */
// logerror("###### dma8237_timerproc %s: from %04x count=%x to %04x count=%x\n", tag(),
// m_chan[0].m_address, m_chan[0].m_count,
// m_chan[1].m_address, m_chan[1].m_count);
// FIXME: this will copy bytes correct, but not 16 bit words
m_temporary_data = m_in_memr_func(m_chan[0].m_address);
m_out_memw_func(m_chan[1].m_address, m_temporary_data);
m_service_channel = 0;
/* Advance */
i8237_advance();
// advance destination channel as well
m_chan[1].m_count--;
m_chan[1].m_address++;
if (m_chan[0].m_count == 0xFFFF || m_chan[1].m_count == 0xFFFF) {
m_hrq = 0;
m_hlda = 0;
m_out_hrq_func(m_hrq);
m_state = DMA8237_SI;
m_status |= 3; // set TC for channel 0 and 1
m_drq &= ~3; // clear drq for channel 0 and 1
// logerror("!!! dma8237_timerproc DMA8237_S11 %s: m_drq=%x m_command=%x\n", tag(), m_drq, m_command);
}
break;
}
}
READ8_MEMBER(i8237_device::i8237_r)
{
UINT8 data = 0xFF;
offset &= 0x0F;
switch(offset) {
case 0:
case 2:
case 4:
case 6:
/* DMA address register */
data = m_chan[offset / 2].m_address >> (m_msb ? 8 : 0);
m_msb ^= 1;
break;
case 1:
case 3:
case 5:
case 7:
/* DMA count register */
data = m_chan[offset / 2].m_count >> (m_msb ? 8 : 0);
m_msb ^= 1;
break;
case 8:
/* DMA status register */
data = (UINT8) m_status;
/* TC bits are cleared on a status read */
m_status &= 0xF0;
break;
case 10:
/* DMA mask register */
data = m_mask;
break;
case 13:
/* DMA master clear */
data = m_temp;
break;
case 9: /* DMA write request register */
case 11: /* DMA mode register */
case 12: /* DMA clear byte pointer flip-flop */
case 14: /* DMA clear mask register */
case 15: /* DMA write mask register */
data = 0xFF;
break;
}
return data;
}
WRITE8_MEMBER(i8237_device::i8237_w)
{
offset &= 0x0F;
// logerror("i8237_w: offset = %02x, data = %02x\n", offset, data );
switch(offset) {
case 0:
case 2:
case 4:
case 6:
{
/* DMA address register */
int channel = offset / 2;
if (m_msb)
{
m_chan[channel].m_base_address = ( m_chan[channel].m_base_address & 0x00FF ) | ( data << 8 );
m_chan[channel].m_address = ( m_chan[channel].m_address & 0x00FF ) | ( data << 8 );
}
else
{
m_chan[channel].m_base_address = ( m_chan[channel].m_base_address & 0xFF00 ) | data;
m_chan[channel].m_address = ( m_chan[channel].m_address & 0xFF00 ) | data;
}
m_msb ^= 1;
break;
}
case 1:
case 3:
case 5:
case 7:
{
/* DMA count register */
int channel = offset / 2;
if (m_msb)
{
m_chan[channel].m_base_count = ( m_chan[channel].m_base_count & 0x00FF ) | ( data << 8 );
m_chan[channel].m_count = ( m_chan[channel].m_count & 0x00FF ) | ( data << 8 );
}
else
{
m_chan[channel].m_base_count = ( m_chan[channel].m_base_count & 0xFF00 ) | data;
m_chan[channel].m_count = ( m_chan[channel].m_count & 0xFF00 ) | data;
}
m_msb ^= 1;
break;
}
case 8:
/* DMA command register */
m_command = data;
m_timer->enable( ( m_command & 0x04 ) ? 0 : 1 );
break;
case 9:
{
/* DMA request register */
int channel = DMA_MODE_CHANNEL(data);
if ( data & 0x04 )
{
m_drq |= 0x01 << channel;
m_timer->enable( ( m_command & 0x04 ) ? 0 : 1 );
}
else
{
m_status &= ~ ( 0x10 << channel );
m_drq &= ~ ( 0x01 << channel );
}
break;
}
case 10:
{
/* DMA mask register */
int channel = DMA_MODE_CHANNEL(data);
if (data & 0x04)
{
m_mask |= 0x11 << channel;
}
else
{
m_mask &= ~(0x11 << channel);
}
break;
}
case 11:
{
/* DMA mode register */
int channel = DMA_MODE_CHANNEL(data);
m_chan[channel].m_mode = data;
/* Apparently mode writes also clear the TC bit(?) */
m_status &= ~ ( 1 << channel );
break;
}
case 12:
/* DMA clear byte pointer flip-flop */
m_temp = data;
m_msb = 0;
break;
case 13:
/* DMA master clear */
m_msb = 0;
m_mask = 0x0f;
m_state = DMA8237_SI;
m_status &= 0xF0;
m_temp = 0;
break;
case 14:
/* DMA clear mask register */
m_mask &= ~data;
m_mask = 0;
break;
case 15:
/* DMA write mask register */
m_mask = data & 0x0f;
break;
}
}
void i8237_device::i8237_drq_write(int channel, int state)
{
if (state)
{
m_drq |= ( 0x01 << channel );
}
else
{
m_drq &= ~( 0x01 << channel );
}
m_timer->enable( ( m_command & 0x04 ) ? 0 : 1 );
}

View File

@ -1,194 +0,0 @@
/***************************************************************************
Intel 8237 Programmable DMA Controller emulation
Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions.
****************************************************************************
_____ _____
_I/OR 1 |* \_/ | 40 A7
_I/OW 2 | | 39 A6
_MEMR 3 | | 38 A5
_MEMW 4 | | 37 A4
5 | | 36 _EOP
READY 6 | | 35 A3
HLDA 7 | | 34 A2
ADSTB 8 | | 33 A1
AEN 9 | | 32 A0
HRQ 10 | 8237 | 31 Vcc
_CS 11 | | 30 DB0
CLK 12 | | 29 DB1
RESET 13 | | 28 DB2
DACK2 14 | | 27 DB3
DACK3 15 | | 26 DB4
DREQ3 16 | | 25 DACK0
DREQ2 17 | | 24 DACK1
DREQ1 18 | | 23 DB5
DREQ0 19 | | 22 DB6
GND 20 |_____________| 21 DB7
***************************************************************************/
#pragma once
#ifndef __I8237__
#define __I8237__
#include "emu.h"
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_I8237_ADD(_tag, _clock, _config) \
MCFG_DEVICE_ADD(_tag, I8237, _clock) \
MCFG_DEVICE_CONFIG(_config)
#define I8237_INTERFACE(_name) \
const i8237_interface (_name) =
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
// ======================> i8237_interface
struct i8237_interface
{
devcb_write_line m_out_hrq_cb;
devcb_write_line m_out_eop_cb;
/* accessors to main memory */
devcb_read8 m_in_memr_cb;
devcb_write8 m_out_memw_cb;
/* channel accessors */
devcb_read8 m_in_ior_cb[4];
devcb_write8 m_out_iow_cb[4];
devcb_write_line m_out_dack_cb[4];
};
// ======================> i8237_device
class i8237_device : public device_t,
public i8237_interface
{
public:
// construction/destruction
i8237_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
/* register access */
DECLARE_READ8_MEMBER( i8237_r );
DECLARE_WRITE8_MEMBER( i8237_w );
/* hold acknowledge */
WRITE_LINE_MEMBER( i8237_hlda_w ) { m_hlda = state; }
/* ready */
WRITE_LINE_MEMBER( i8237_ready_w ) { }
/* data request */
WRITE_LINE_MEMBER( i8237_dreq0_w ) { i8237_drq_write(0, state); }
WRITE_LINE_MEMBER( i8237_dreq1_w ) { i8237_drq_write(1, state); }
WRITE_LINE_MEMBER( i8237_dreq2_w ) { i8237_drq_write(2, state); }
WRITE_LINE_MEMBER( i8237_dreq3_w ) { i8237_drq_write(3, state); }
void i8237_drq_write(int channel, int state);
/* end of process */
WRITE_LINE_MEMBER( i8237_eop_w ) { }
void i8237_timerproc();
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
virtual void device_post_load() { }
virtual void device_clock_changed() { }
static TIMER_CALLBACK( i8237_timerproc_callback );
static TIMER_CALLBACK( receive_event_callback );
private:
void i8237_do_read();
void i8237_do_write();
void i8237_advance();
void i8327_set_dack(int channel);
/* States that the i8237 device can be in */
enum dma8237_state
{
DMA8237_SI, /* Idle state */
DMA8237_S0, /* HRQ has been triggered, waiting to receive HLDA */
// DMA8237_SW, /* Wait state */
DMA8237_SC, /* Cascade mode, waiting for peripheral */
/* Normal transfer states */
DMA8237_S1, /* Output A8-A15; only used when A8-A15 really needs to be output */
DMA8237_S2, /* Output A0-A7 */
DMA8237_S3, /* Initiate read; skipped in compressed timing. On the S2->S3 transition DACK is set. */
DMA8237_S4, /* Perform read/write */
/* Memory to memory transfer states */
DMA8237_S11, /* Output A8-A15 */
// DMA8237_S12, /* Output A0-A7 */
// DMA8237_S13, /* Initiate read */
// DMA8237_S14, /* Perform read/write */
// DMA8237_S21, /* Output A8-A15 */
// DMA8237_S22, /* Output A0-A7 */
// DMA8237_S23, /* Initiate read */
// DMA8237_S24, /* Perform read/write */
};
devcb_resolved_write_line m_out_hrq_func;
devcb_resolved_write_line m_out_eop_func;
devcb_resolved_read8 m_in_memr_func;
devcb_resolved_write8 m_out_memw_func;
emu_timer *m_timer;
struct
{
devcb_resolved_read8 m_in_ior_func;
devcb_resolved_write8 m_out_iow_func;
devcb_resolved_write_line m_out_dack_func;
UINT16 m_base_address;
UINT16 m_base_count;
UINT16 m_address;
UINT16 m_count;
UINT8 m_mode;
int m_high_address_changed;
} m_chan[4];
UINT32 m_msb : 1;
UINT32 m_eop : 1;
UINT8 m_temp;
UINT8 m_temporary_data;
UINT8 m_command;
UINT8 m_drq;
UINT8 m_mask;
UINT8 m_hrq;
UINT8 m_hlda;
/* bits 0- 3 : Terminal count for channels 0-3
* bits 4- 7 : Transfer in progress for channels 0-3 */
UINT8 m_status;
dma8237_state m_state; /* State the device is currently in */
int m_service_channel; /* Channel we will be servicing */
int m_last_service_channel; /* Previous channel we serviced; used to determine channel priority. */
};
// device type definition
extern const device_type I8237;
#endif

View File

@ -24,6 +24,15 @@
DMA8237 Controller
******************/
READ8_MEMBER(pcat_base_state::at_dma8237_2_r)
{
return m_dma8237_2->read(space, offset / 2);
}
WRITE8_MEMBER(pcat_base_state::at_dma8237_2_w)
{
m_dma8237_2->write(space, offset / 2, data);
}
WRITE_LINE_MEMBER( pcat_base_state::pc_dma_hrq_changed )
{
@ -150,10 +159,7 @@ IRQ_CALLBACK_MEMBER(pcat_base_state::irq_callback)
WRITE_LINE_MEMBER( pcat_base_state::at_pit8254_out0_changed )
{
if (m_pic8259_1 )
{
m_pic8259_1->ir0_w(state);
}
m_pic8259_1->ir0_w(state);
}
@ -218,7 +224,7 @@ ADDRESS_MAP_START( pcat32_io_common, AS_IO, 32, pcat_base_state )
AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff)
AM_RANGE(0x0080, 0x009f) AM_READWRITE8(dma_page_select_r,dma_page_select_w, 0xffffffff)//TODO
AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_2", pic8259_device, read, write, 0xffffffff)
AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE8("dma8237_2", am9517a_device, read, write, 0xffffffff)
AM_RANGE(0x00c0, 0x00df) AM_READWRITE8(at_dma8237_2_r, at_dma8237_2_w, 0xffffffff)
ADDRESS_MAP_END
MACHINE_CONFIG_FRAGMENT(pcat_common)

View File

@ -26,6 +26,8 @@ public:
required_device<pit8254_device> m_pit8254;
required_device<mc146818_device> m_mc146818;
DECLARE_READ8_MEMBER(at_dma8237_2_r);
DECLARE_WRITE8_MEMBER(at_dma8237_2_w);
DECLARE_WRITE_LINE_MEMBER(pc_dma_hrq_changed);
DECLARE_READ8_MEMBER(pc_dma_read_byte);
DECLARE_WRITE8_MEMBER(pc_dma_write_byte);

View File

@ -1057,10 +1057,6 @@ static void apollo_reset_instr_callback(device_t *device)
// reset the CPU board devices
apollo->MACHINE_RESET_CALL_MEMBER(apollo);
apollo->dma8237_1->reset();
apollo->dma8237_2->reset();
apollo->pic8259_master->reset();
apollo->pic8259_slave->reset();
// reset the ISA bus devices
apollo->m_ctape->device_reset();

View File

@ -14,7 +14,7 @@
#include "emu.h"
#include "cpu/i86/i86.h"
#include "video/mc6845.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
@ -24,6 +24,7 @@ public:
b16_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_vram(*this, "vram"),
m_dma8237(*this, "8237dma"),
m_maincpu(*this, "maincpu") { }
UINT8 *m_char_rom;
@ -43,7 +44,7 @@ public:
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
mc6845_device *m_mc6845;
i8237_device *m_dma8237;
required_device<am9517a_device> m_dma8237;
virtual void machine_start();
virtual void machine_reset();
required_device<cpu_device> m_maincpu;
@ -241,7 +242,6 @@ GFXDECODE_END
void b16_state::machine_start()
{
m_dma8237 = machine().device<i8237_device>( "dma8237" );
m_mc6845 = machine().device<mc6845_device>("crtc");
}

View File

@ -19,7 +19,7 @@
#include "machine/pic8259.h"
#include "machine/mc146818.h"
#include "machine/pci.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
#include "machine/pckeybrd.h"
#include "machine/8042kbdc.h"
#include "machine/pit8253.h"
@ -36,8 +36,8 @@
#include "machine/ram.h"
#include "machine/8042kbdc.h"
READ8_MEMBER(bebox_state::at_dma8237_1_r) { return machine().device<i8237_device>("dma8237_2")->i8237_r(space, offset / 2); }
WRITE8_MEMBER(bebox_state::at_dma8237_1_w) { machine().device<i8237_device>("dma8237_2")->i8237_w(space, offset / 2, data); }
READ8_MEMBER(bebox_state::at_dma8237_1_r) { return m_dma8237_2->read(space, offset / 2); }
WRITE8_MEMBER(bebox_state::at_dma8237_1_w) { m_dma8237_2->write(space, offset / 2, data); }
static ADDRESS_MAP_START( bebox_mem, AS_PROGRAM, 64, bebox_state )
AM_RANGE(0x7FFFF0F0, 0x7FFFF0F7) AM_READWRITE(bebox_cpu0_imask_r, bebox_cpu0_imask_w )
@ -46,13 +46,13 @@ static ADDRESS_MAP_START( bebox_mem, AS_PROGRAM, 64, bebox_state )
AM_RANGE(0x7FFFF3F0, 0x7FFFF3F7) AM_READWRITE(bebox_crossproc_interrupts_r, bebox_crossproc_interrupts_w )
AM_RANGE(0x7FFFF4F0, 0x7FFFF4F7) AM_WRITE(bebox_processor_resets_w )
AM_RANGE(0x80000000, 0x8000001F) AM_DEVREADWRITE8("dma8237_1", i8237_device, i8237_r, i8237_w, U64(0xffffffffffffffff) )
AM_RANGE(0x80000020, 0x8000003F) AM_DEVREADWRITE8("pic8259_master", pic8259_device, read, write, U64(0xffffffffffffffff) )
AM_RANGE(0x80000000, 0x8000001F) AM_DEVREADWRITE8("dma8237_1", am9517a_device, read, write, U64(0xffffffffffffffff) )
AM_RANGE(0x80000020, 0x8000003F) AM_DEVREADWRITE8("pic8259_1", pic8259_device, read, write, U64(0xffffffffffffffff) )
AM_RANGE(0x80000040, 0x8000005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, U64(0xffffffffffffffff) )
AM_RANGE(0x80000060, 0x8000006F) AM_DEVREADWRITE8("kbdc", kbdc8042_device, data_r, data_w, U64(0xffffffffffffffff) )
AM_RANGE(0x80000070, 0x8000007F) AM_DEVREADWRITE8("rtc", mc146818_device, read, write , U64(0xffffffffffffffff) )
AM_RANGE(0x80000080, 0x8000009F) AM_READWRITE8(bebox_page_r, bebox_page_w, U64(0xffffffffffffffff) )
AM_RANGE(0x800000A0, 0x800000BF) AM_DEVREADWRITE8("pic8259_slave", pic8259_device, read, write, U64(0xffffffffffffffff) )
AM_RANGE(0x800000A0, 0x800000BF) AM_DEVREADWRITE8("pic8259_2", pic8259_device, read, write, U64(0xffffffffffffffff) )
AM_RANGE(0x800000C0, 0x800000DF) AM_READWRITE8(at_dma8237_1_r, at_dma8237_1_w, U64(0xffffffffffffffff))
AM_RANGE(0x800001F0, 0x800001F7) AM_READWRITE8(bebox_800001F0_r, bebox_800001F0_w, U64(0xffffffffffffffff) )
AM_RANGE(0x800002F8, 0x800002FF) AM_DEVREADWRITE8( "ns16550_1", ns16550_device, ins8250_r, ins8250_w, U64(0xffffffffffffffff) )
@ -154,9 +154,7 @@ const struct mpc105_interface mpc105_config =
WRITE_LINE_MEMBER(bebox_state::bebox_keyboard_interrupt)
{
bebox_set_irq_bit(machine(), 16, state);
if ( m_devices.pic8259_master ) {
m_devices.pic8259_master->ir1_w(state);
}
m_pic8259_1->ir1_w(state);
}
READ8_MEMBER(bebox_state::bebox_get_out2)
@ -197,9 +195,9 @@ static MACHINE_CONFIG_START( bebox, bebox_state )
MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, bebox_dma8237_2_config )
MCFG_PIC8259_ADD( "pic8259_master", WRITELINE(bebox_state,bebox_pic8259_master_set_int_line), VCC, READ8(bebox_state,get_slave_ack) )
MCFG_PIC8259_ADD( "pic8259_1", WRITELINE(bebox_state,bebox_pic8259_master_set_int_line), VCC, READ8(bebox_state,get_slave_ack) )
MCFG_PIC8259_ADD( "pic8259_slave", WRITELINE(bebox_state,bebox_pic8259_slave_set_int_line), GND, NULL )
MCFG_PIC8259_ADD( "pic8259_2", WRITELINE(bebox_state,bebox_pic8259_slave_set_int_line), GND, NULL )
MCFG_NS16550_ADD( "ns16550_0", bebox_uart_inteface_0, 0 ) /* TODO: Verify model */
MCFG_NS16550_ADD( "ns16550_1", bebox_uart_inteface_1, 0 ) /* TODO: Verify model */

View File

@ -11,7 +11,7 @@
#include "cpu/z80/z80.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/upd765.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
#include "video/upd7220.h"
#include "dmv.lh"
@ -31,7 +31,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<upd7220_device> m_hgdc;
required_device<i8237_device> m_dmac;
required_device<am9517a_device> m_dmac;
required_device<upd765a_device> m_fdc;
required_device<floppy_image_device> m_floppy0;
required_device<floppy_image_device> m_floppy1;
@ -86,7 +86,7 @@ void dmv_state::fdc_irq(bool state)
void dmv_state::fdc_drq(bool state)
{
m_dmac->i8237_drq_write(3, state);
m_dmac->dreq3_w(state);
}
READ8_MEMBER(dmv_state::fdc_dma_r)
@ -198,7 +198,7 @@ static ADDRESS_MAP_START( dmv_io , AS_IO, 8, dmv_state)
AM_RANGE(0x00, 0x00) AM_WRITE(leds_w)
AM_RANGE(0x13, 0x13) AM_READ(sys_status_r)
AM_RANGE(0x14, 0x14) AM_WRITE(fdd_motor_w)
AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE("dma8237", i8237_device, i8237_r, i8237_w)
AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write)
AM_RANGE(0x40, 0x41) AM_READWRITE(kb_ctrl_mcu_r, kb_ctrl_mcu_w)
AM_RANGE(0x50, 0x51) AM_DEVICE("upd765", upd765a_device, map)
AM_RANGE(0xa0, 0xa1) AM_DEVREADWRITE("upd7220", upd7220_device, read, write)
@ -282,7 +282,7 @@ WRITE_LINE_MEMBER( dmv_state::dma_hrq_changed )
m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
// Assert HLDA
m_dmac->i8237_hlda_w(state);
m_dmac->hack_w(state);
}
READ8_MEMBER(dmv_state::memory_read_byte)

View File

@ -12,7 +12,7 @@
#include "cpu/i86/i86.h"
#include "video/mc6845.h"
#include "machine/pic8259.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
class paso1600_state : public driver_device
@ -29,7 +29,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<pic8259_device> m_pic;
required_device<i8237_device> m_dma;
required_device<am9517a_device> m_dma;
required_device<mc6845_device> m_crtc;
DECLARE_READ8_MEMBER(paso1600_pcg_r);
DECLARE_WRITE8_MEMBER(paso1600_pcg_w);
@ -236,7 +236,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START(paso1600_io, AS_IO, 16, paso1600_state)
ADDRESS_MAP_UNMAP_LOW
AM_RANGE(0x0000,0x000f) AM_DEVREADWRITE8("8237dma", i8237_device, i8237_r, i8237_w, 0xffff)
AM_RANGE(0x0000,0x000f) AM_DEVREADWRITE8("8237dma", am9517a_device, read, write, 0xffff)
AM_RANGE(0x0010,0x0011) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0xffff) // i8259
AM_RANGE(0x001a,0x001b) AM_READ(test_hi_r) // causes RAM error otherwise?
AM_RANGE(0x0030,0x0033) AM_READWRITE8(key_r,key_w,0xffff) //UART keyboard?

View File

@ -24,7 +24,7 @@
#include "machine/3c505.h"
#include "machine/68681.h"
#include "machine/pc_fdc.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
#include "machine/pic8259.h"
#ifndef VERBOSE
@ -116,16 +116,21 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, MAINCPU),
m_ctape(*this, APOLLO_CTAPE_TAG),
m_messram_ptr(*this, "messram")
m_messram_ptr(*this, "messram"),
m_dma8237_1(*this, "dma8237_1"),
m_dma8237_2(*this, "dma8237_2"),
m_pic8259_master(*this, "pic8259_master"),
m_pic8259_slave(*this, "pic8259_slave")
{ }
required_device<cpu_device> m_maincpu;
required_device<sc499_device> m_ctape;
required_shared_ptr<UINT32> m_messram_ptr;
i8237_device *dma8237_1;
i8237_device *dma8237_2;
pic8259_device *pic8259_master;
pic8259_device *pic8259_slave;
required_device<am9517a_device> m_dma8237_1;
required_device<am9517a_device> m_dma8237_2;
required_device<pic8259_device> m_pic8259_master;
required_device<pic8259_device> m_pic8259_slave;
DECLARE_WRITE16_MEMBER(apollo_csr_status_register_w);
DECLARE_READ16_MEMBER(apollo_csr_status_register_r);
@ -182,7 +187,6 @@ public:
DECLARE_DRIVER_INIT(dn5500);
DECLARE_DRIVER_INIT(apollo);
required_shared_ptr<UINT32> m_messram_ptr;
virtual void machine_start();
virtual void machine_reset();
DECLARE_MACHINE_RESET(apollo);

View File

@ -11,21 +11,12 @@
#include "emu.h"
#include "machine/ins8250.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
#include "machine/53c810.h"
#include "machine/upd765.h"
#include "machine/ram.h"
#include "machine/pic8259.h"
struct bebox_devices_t
{
pic8259_device *pic8259_master;
pic8259_device *pic8259_slave;
i8237_device *dma8237_1;
i8237_device *dma8237_2;
};
class bebox_state : public driver_device
{
public:
@ -39,16 +30,23 @@ public:
m_ppc1(*this, "ppc1"),
m_ppc2(*this, "ppc2"),
m_lsi53c810(*this, "scsi:lsi53c810"),
m_dma8237_1(*this, "dma8237_1"),
m_dma8237_2(*this, "dma8237_2"),
m_pic8259_1(*this, "pic8259_1"),
m_pic8259_2(*this, "pic8259_2"),
m_ram(*this, RAM_TAG){ }
required_device<cpu_device> m_ppc1;
required_device<cpu_device> m_ppc2;
required_device<lsi53c810_device> m_lsi53c810;
required_device<am9517a_device> m_dma8237_1;
required_device<am9517a_device> m_dma8237_2;
required_device<pic8259_device> m_pic8259_1;
required_device<pic8259_device> m_pic8259_2;
required_device<ram_device> m_ram;
UINT32 m_cpu_imask[2];
UINT32 m_interrupts;
UINT32 m_crossproc_interrupts;
bebox_devices_t m_devices;
int m_dma_channel;
UINT16 m_dma_offset[2][4];
UINT8 m_at_pages[0x10];
@ -113,8 +111,8 @@ protected:
/*----------- defined in machine/bebox.c -----------*/
extern const struct pit8253_config bebox_pit8254_config;
extern const i8237_interface bebox_dma8237_1_config;
extern const i8237_interface bebox_dma8237_2_config;
extern const am9517a_interface bebox_dma8237_1_config;
extern const am9517a_interface bebox_dma8237_2_config;
extern const ins8250_interface bebox_uart_inteface_0;
extern const ins8250_interface bebox_uart_inteface_1;
extern const ins8250_interface bebox_uart_inteface_2;

View File

@ -32,7 +32,7 @@
#include "machine/6840ptm.h"
#include "machine/68681.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
#include "machine/mc146818.h"
#include "machine/pic8259.h"
@ -332,22 +332,22 @@ static const UINT8 channel2page_register[8] = { 7, 3, 1, 2, 0, 11, 9, 10};
static UINT8 dn3000_dma_channel1 = 1; // 1 = memory/ctape, 2 = floppy dma channel
static UINT8 dn3000_dma_channel2 = 5; // 5 = memory dma channel
INLINE i8237_device *get_device_dma8237_1(device_t *device) {
return device->machine().driver_data<apollo_state>()->dma8237_1;
INLINE am9517a_device *get_device_dma8237_1(device_t *device) {
return device->machine().driver_data<apollo_state>()->m_dma8237_1;
}
INLINE i8237_device *get_device_dma8237_2(device_t *device) {
return device->machine().driver_data<apollo_state>()->dma8237_2;
INLINE am9517a_device *get_device_dma8237_2(device_t *device) {
return device->machine().driver_data<apollo_state>()->m_dma8237_2;
}
static void apollo_dma_fdc_drq(device_t *device, int state) {
DLOG2(("apollo_dma_fdc_drq: state=%x", state));
get_device_dma8237_1(device)->i8237_dreq2_w(state);
get_device_dma8237_1(device)->dreq2_w(state);
}
static void apollo_dma_ctape_drq(device_t *device, int state) {
DLOG1(("apollo_dma_ctape_drq: state=%x", state));
get_device_dma8237_1(device)->i8237_dreq1_w(state);
get_device_dma8237_1(device)->dreq1_w(state);
}
/*-------------------------------------------------
@ -356,11 +356,11 @@ static void apollo_dma_ctape_drq(device_t *device, int state) {
WRITE8_MEMBER(apollo_state::apollo_dma_1_w){
SLOG1(("apollo_dma_1_w: writing DMA Controller 1 at offset %02x = %02x", offset, data));
get_device_dma8237_1(&space.device())->i8237_w(space, offset, data);
get_device_dma8237_1(&space.device())->write(space, offset, data);
}
READ8_MEMBER(apollo_state::apollo_dma_1_r){
UINT8 data = get_device_dma8237_1(&space.device())->i8237_r(space, offset);
UINT8 data = get_device_dma8237_1(&space.device())->read(space, offset);
SLOG1(("apollo_dma_1_r: reading DMA Controller 1 at offset %02x = %02x", offset, data));
return data;
}
@ -371,11 +371,11 @@ READ8_MEMBER(apollo_state::apollo_dma_1_r){
WRITE8_MEMBER(apollo_state::apollo_dma_2_w){
SLOG1(("apollo_dma_2_w: writing DMA Controller 2 at offset %02x = %02x", offset/2, data));
get_device_dma8237_2(&space.device())->i8237_w(space, offset / 2, data);
get_device_dma8237_2(&space.device())->write(space, offset / 2, data);
}
READ8_MEMBER(apollo_state::apollo_dma_2_r){
UINT8 data = get_device_dma8237_2(&space.device())->i8237_r(space, offset / 2);
UINT8 data = get_device_dma8237_2(&space.device())->read(space, offset / 2);
SLOG1(("apollo_dma_2_r: reading DMA Controller 2 at offset %02x = %02x", offset/2, data));
return data;
}
@ -553,10 +553,10 @@ WRITE_LINE_MEMBER(apollo_state::apollo_dma8237_out_eop ) {
WRITE_LINE_MEMBER(apollo_state::apollo_dma_1_hrq_changed ) {
// DLOG2(("dma 1 hrq changed state %02x", state));
get_device_dma8237_2(machine().device(APOLLO_DMA1_TAG))->i8237_dreq0_w(state);
m_dma8237_2->dreq0_w(state);
/* Assert HLDA */
dynamic_cast<i8237_device*>(machine().device(APOLLO_DMA1_TAG))->i8237_hlda_w(state);
//m_dma8237_1->hack_w(state);
// cascade mode?
// i8237_hlda_w(get_device_dma8237_2(device), state);
@ -564,10 +564,10 @@ WRITE_LINE_MEMBER(apollo_state::apollo_dma_1_hrq_changed ) {
WRITE_LINE_MEMBER(apollo_state::apollo_dma_2_hrq_changed ) {
// DLOG2(("dma 2 hrq changed state %02x", state));
machine().device(MAINCPU)->execute().set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
/* Assert HLDA */
dynamic_cast<i8237_device*>(machine().device(APOLLO_DMA2_TAG))->i8237_hlda_w(state);
m_dma8237_2->hack_w(state);
}
static I8237_INTERFACE( apollo_dma8237_1_config )
@ -600,11 +600,11 @@ static I8237_INTERFACE( apollo_dma8237_2_config )
#define VERBOSE 0
INLINE pic8259_device *get_pic8259_master(device_t *device) {
return device->machine().driver_data<apollo_state>()->pic8259_master;
return device->machine().driver_data<apollo_state>()->m_pic8259_master;
}
INLINE pic8259_device *get_pic8259_slave(device_t *device) {
return device->machine().driver_data<apollo_state>()->pic8259_slave;
return device->machine().driver_data<apollo_state>()->m_pic8259_slave;
}
/*-------------------------------------------------
@ -692,7 +692,7 @@ IRQ_CALLBACK_MEMBER(apollo_state::apollo_pic_acknowledge)
WRITE_LINE_MEMBER( apollo_state::apollo_pic8259_master_set_int_line ) {
static int interrupt_line = -1;
if (state != interrupt_line) {
device_t *device = pic8259_master;
device_t *device = m_pic8259_master;
DLOG1(("apollo_pic8259_master_set_int_line: %x", state));
}
interrupt_line = state;
@ -705,13 +705,13 @@ WRITE_LINE_MEMBER( apollo_state::apollo_pic8259_master_set_int_line ) {
apollo_set_cache_status_register(0x10, state ? 0x10 : 0x00);
}
machine().device(MAINCPU)->execute().set_input_line_and_vector(M68K_IRQ_6,state ? ASSERT_LINE : CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR);
m_maincpu->set_input_line_and_vector(M68K_IRQ_6,state ? ASSERT_LINE : CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR);
}
WRITE_LINE_MEMBER( apollo_state::apollo_pic8259_slave_set_int_line ) {
static int interrupt_line = -1;
if (state != interrupt_line) {
device_t *device = pic8259_slave;
device_t *device = m_pic8259_slave;
DLOG1(("apollo_pic8259_slave_set_int_line: %x", state));
interrupt_line = state;
apollo_pic_set_irq_line(device, 3, state);
@ -1414,11 +1414,6 @@ MACHINE_RESET_MEMBER(apollo_state,apollo)
{
//MLOG1(("machine_reset_apollo"));
dma8237_1 = machine().device<i8237_device>(APOLLO_DMA1_TAG);
dma8237_2 = machine().device<i8237_device>(APOLLO_DMA2_TAG);
pic8259_master = machine().device<pic8259_device>(APOLLO_PIC1_TAG);
pic8259_slave = machine().device<pic8259_device>(APOLLO_PIC2_TAG);
// set configuration
apollo_csr_set_servicemode(apollo_config(APOLLO_CONF_SERVICE_MODE));

View File

@ -49,8 +49,7 @@ void at_state::at_speaker_set_input(UINT8 data)
WRITE_LINE_MEMBER( at_state::at_pit8254_out0_changed )
{
if (m_pic8259_master)
m_pic8259_master->ir0_w(state);
m_pic8259_master->ir0_w(state);
}

View File

@ -100,7 +100,7 @@
#include "machine/mc146818.h"
#include "machine/pic8259.h"
#include "machine/pit8253.h"
#include "machine/8237dma.h"
#include "machine/am9517a.h"
#include "machine/idectrl.h"
#include "machine/pci.h"
#include "machine/intelfsh.h"
@ -453,17 +453,13 @@ const ins8250_interface bebox_uart_inteface_3 =
void bebox_state::fdc_interrupt(bool state)
{
bebox_set_irq_bit(machine(), 13, state);
if ( m_devices.pic8259_master ) {
m_devices.pic8259_master->ir6_w(state);
}
m_pic8259_1->ir6_w(state);
}
void bebox_state::fdc_dma_drq(bool state)
{
if ( m_devices.dma8237_1 ) {
m_devices.dma8237_1->i8237_dreq2_w(state);
}
m_dma8237_1->dreq2_w(state);
}
/*************************************
@ -475,7 +471,7 @@ void bebox_state::fdc_dma_drq(bool state)
READ64_MEMBER(bebox_state::bebox_interrupt_ack_r )
{
UINT32 result;
result = m_devices.pic8259_master->acknowledge();
result = m_pic8259_1->acknowledge();
bebox_set_irq_bit(space.machine(), 5, 0); /* HACK */
return ((UINT64) result) << 56;
}
@ -494,16 +490,12 @@ WRITE_LINE_MEMBER(bebox_state::bebox_pic8259_master_set_int_line)
WRITE_LINE_MEMBER(bebox_state::bebox_pic8259_slave_set_int_line)
{
if (m_devices.pic8259_master)
m_devices.pic8259_master->ir2_w(state);
m_pic8259_1->ir2_w(state);
}
READ8_MEMBER(bebox_state::get_slave_ack)
{
if (offset==2) { // IRQ = 2
return m_devices.pic8259_slave->acknowledge();
}
return 0x00;
return m_pic8259_2->acknowledge();
}
@ -543,9 +535,7 @@ WRITE64_MEMBER(bebox_state::bebox_800003F0_w )
WRITE_LINE_MEMBER(bebox_state::bebox_ide_interrupt)
{
bebox_set_irq_bit(machine(), 7, state);
if ( m_devices.pic8259_master ) {
m_devices.pic8259_master->ir6_w(state);
}
m_pic8259_1->ir6_w(state);
}
@ -692,7 +682,7 @@ WRITE_LINE_MEMBER(bebox_state::bebox_dma_hrq_changed)
m_ppc1->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
/* Assert HLDA */
machine().device<i8237_device>("dma8237_1")->i8237_hlda_w( state );
m_dma8237_1->hack_w( state );
}
@ -772,8 +762,7 @@ I8237_INTERFACE( bebox_dma8237_2_config )
WRITE_LINE_MEMBER(bebox_state::bebox_timer0_w)
{
if (m_devices.pic8259_master)
m_devices.pic8259_master->ir0_w(state);
m_pic8259_1->ir0_w(state);
}
@ -959,10 +948,6 @@ void bebox_state::device_timer(emu_timer &timer, device_timer_id id, int param,
switch (id)
{
case TIMER_GET_DEVICES:
m_devices.pic8259_master = machine().device<pic8259_device>("pic8259_master");
m_devices.pic8259_slave = machine().device<pic8259_device>("pic8259_slave");
m_devices.dma8237_1 = machine().device<i8237_device>("dma8237_1");
m_devices.dma8237_2 = machine().device<i8237_device>("dma8237_2");
break;
default:
assert_always(FALSE, "Unknown id in bebox_state::device_timer");
@ -978,11 +963,6 @@ void bebox_state::device_timer(emu_timer &timer, device_timer_id id, int param,
void bebox_state::machine_reset()
{
m_devices.pic8259_master = NULL;
m_devices.pic8259_slave = NULL;
m_devices.dma8237_1 = NULL;
m_devices.dma8237_2 = NULL;
timer_set(attotime::zero, TIMER_GET_DEVICES);
m_ppc1->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);