Previous 199869 Revisions Next

r33095 Friday 31st October, 2014 at 21:32:53 UTC by Carl
pic8259: priority and sfnm [Carl}
[src/emu/machine]pic8259.c

trunk/src/emu/machine/pic8259.c
r241606r241607
1414#include "emu.h"
1515#include "machine/pic8259.h"
1616
17#define IRQ_COUNT   8
18
1917#define LOG_ICW     0
2018#define LOG_OCW     0
2119#define LOG_GENERAL  0
r241606r241607
2422
2523void pic8259_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
2624{
27   int irq;
28   UINT8 mask;
29
3025   /* check the various IRQs */
31   for (irq = 0; irq < IRQ_COUNT; irq++)
26   for (int n = 0, irq = m_prio; n < 8; n++, irq = (irq + 1) & 7)
3227   {
33      mask = 1 << irq;
28      UINT8 mask = 1 << irq;
3429
35      /* is this IRQ in service? */
36      if (m_isr & mask)
30      /* is this IRQ in service and not cascading and sfnm? */
31      if ((m_isr & mask) && !(m_master && m_cascade && m_nested && (m_slave & mask)))
3732      {
3833         if (LOG_GENERAL)
3934         {
40            logerror("pic8259_timerproc(): PIC IRQ #%d still in service\n", irq);
35            logerror("pic8259_timerproc() %s: PIC IRQ #%d still in service\n", tag(), irq);
4136         }
4237         break;
4338      }
r241606r241607
4742      {
4843         if (LOG_GENERAL)
4944         {
50            logerror("pic8259_timerproc(): PIC triggering IRQ #%d\n", irq);
45            logerror("pic8259_timerproc() %s: PIC triggering IRQ #%d\n", tag(), irq);
5146         }
5247         if (!BIT(m_ocw3, 2))
5348         {
r241606r241607
5550         }
5651         return;
5752      }
53      // if sfnm and in-service don't continue
54      if((m_isr & mask) && m_master && m_cascade && m_nested && (m_slave & mask))
55         break;
5856   }
5957   if (!BIT(m_ocw3, 2))
6058   {
r241606r241607
7169   {
7270      /* setting IRQ line */
7371      if (LOG_GENERAL)
74         logerror("pic8259_set_irq_line(): PIC set IRQ line #%d\n", irq);
72         logerror("pic8259_set_irq_line() %s: PIC set IRQ line #%d\n", tag(), irq);
7573
7674      if(m_level_trig_mode || (!m_level_trig_mode && !(m_irq_lines & mask)))
7775      {
r241606r241607
8482      /* clearing IRQ line */
8583      if (LOG_GENERAL)
8684      {
87         logerror("pic8259_device::set_irq_line(): PIC cleared IRQ line #%d\n", irq);
85         logerror("pic8259_device::set_irq_line() %s: PIC cleared IRQ line #%d\n", tag(), irq);
8886      }
8987
9088      m_irq_lines &= ~mask;
r241606r241607
9694
9795UINT32 pic8259_device::acknowledge()
9896{
99   UINT8 mask;
100   int irq;
101
102   for (irq = 0; irq < IRQ_COUNT; irq++)
97   for (int n = 0, irq = m_prio; n < 8; n++, irq = (irq + 1) & 7)
10398   {
104      mask = 1 << irq;
99      UINT8 mask = 1 << irq;
105100
106101      /* is this IRQ pending and enabled? */
107102      if ((m_irr & mask) && !(m_imr & mask))
108103      {
109104         if (LOG_GENERAL)
110105         {
111            logerror("pic8259_acknowledge(): PIC acknowledge IRQ #%d\n", irq);
106            logerror("pic8259_acknowledge() %s: PIC acknowledge IRQ #%d\n", tag(), irq);
112107         }
113108         if (!m_level_trig_mode)
114109         {
r241606r241607
170165
171166            if ( m_irr & ~m_imr )
172167            {
173               int irq;
174               for ( irq = 0; irq < IRQ_COUNT; irq++ )
168               /* check the various IRQs */
169               for (int n = 0, irq = m_prio; n < 8; n++, irq = (irq + 1) & 7)
175170               {
176171                  if ( ( 1 << irq ) & m_irr & ~m_imr )
177172                  {
r241606r241607
216211            /* write ICW1 - this pretty much resets the chip */
217212            if (LOG_ICW)
218213            {
219               logerror("pic8259_device::write(): ICW1; data=0x%02X\n", data);
214               logerror("pic8259_device::write() %s: ICW1; data=0x%02X\n", tag(), data);
220215            }
221216
222217            m_imr                = 0x00;
r241606r241607
237232               /* write OCW3 */
238233               if (LOG_OCW)
239234               {
240                  logerror("pic8259_device::write(): OCW3; data=0x%02X\n", data);
235                  logerror("pic8259_device::write() %s: OCW3; data=0x%02X\n", tag(), data);
241236               }
242237
243238               m_ocw3 = data;
r241606r241607
250245               /* write OCW2 */
251246               if (LOG_OCW)
252247               {
253                  logerror("pic8259_device::write(): OCW2; data=0x%02X\n", data);
248                  logerror("pic8259_device::write() %s: OCW2; data=0x%02X\n", tag(), data);
254249               }
255250
256251               switch (data & 0xe0)
r241606r241607
291286                     }
292287                     break;
293288                  case 0xc0:
294                     m_prio = n & 7;
289                     m_prio = (n + 1) & 7;
295290                     break;
296291                  case 0xe0:
297292                     if( m_isr & mask )
298293                     {
299294                        m_isr &= ~mask;
300                        m_prio = (m_prio + 1) & 7;
295                        m_prio = (n + 1) & 7;
301296                     }
302297                     break;
303298               }
r241606r241607
315310               /* write ICW2 */
316311               if (LOG_ICW)
317312               {
318                  logerror("pic8259_device::write(): ICW2; data=0x%02X\n", data);
313                  logerror("pic8259_device::write() %s: ICW2; data=0x%02X\n", tag(), data);
319314               }
320315
321316               m_base = data & 0xf8;
r241606r241607
334329               /* write ICW3 */
335330               if (LOG_ICW)
336331               {
337                  logerror("pic8259_device::write(): ICW3; data=0x%02X\n", data);
332                  logerror("pic8259_device::write() %s: ICW3; data=0x%02X\n", tag(), data);
338333               }
339334
340335               m_slave = data;
r241606r241607
345340               /* write ICW4 */
346341               if (LOG_ICW)
347342               {
348                  logerror("pic8259_device::write(): ICW4; data=0x%02X\n", data);
343                  logerror("pic8259_device::write() %s: ICW4; data=0x%02X\n", tag(), data);
349344               }
350345
351346               m_nested = (data & 0x10) ? 1 : 0;


Previous 199869 Revisions Next


© 1997-2024 The MAME Team