Previous 199869 Revisions Next

r26193 Saturday 16th November, 2013 at 11:54:22 UTC by Curt Coder
z80dma: Implemented Auto Restart. [Curt Coder]
[src/emu/machine]z80dma.c

trunk/src/emu/machine/z80dma.c
r26192r26193
123123#define EOB_F_CLEAR             (m_status |= 0x20)
124124
125125#define READY_ACTIVE_HIGH       ((WR5>>3) & 0x01)
126#define AUTO_RESTART         ((WR5>>5) & 0x01)
126127
127128#define INTERRUPT_ENABLE        (WR3 & 0x20)
128129#define INT_ON_MATCH            (INTERRUPT_CTRL & 0x01)
r26192r26193
292293      // set interrupt under service flag
293294      m_ius = 1;
294295
295      // disable DMA
296      m_dma_enabled = 0;
297
298296      return m_vector;
299297   }
300298
301   logerror("z80dma_irq_ack: failed to find an interrupt to ack!\n");
299   //logerror("z80dma_irq_ack: failed to find an interrupt to ack!\n");
302300
303301   return 0;
304302}
r26192r26193
322320      return;
323321   }
324322
325   logerror("z80dma_irq_reti: failed to find an interrupt to clear IEO on!\n");
323   //logerror("z80dma_irq_reti: failed to find an interrupt to clear IEO on!\n");
326324}
327325
328326
r26192r26193
550548      {
551549         trigger_interrupt(INT_END_OF_BLOCK);
552550      }
551
552      if (AUTO_RESTART)
553      {
554         if (LOG) logerror("Z80DMA '%s' Auto Restart\n", tag());
555
556         m_dma_enabled = 1;
557         m_addressA = PORTA_ADDRESS;
558         m_addressB = PORTB_ADDRESS;
559         m_count = BLOCKLEN;
560         m_status |= 0x30;
561      }
553562   }
554563}
555564
r26192r26193
626635
627636void z80dma_device::write(UINT8 data)
628637{
629   if (LOG) logerror("Z80DMA '%s' Write %02x\n", tag(), data);
630
631638   if (m_num_follow == 0)
632639   {
633640      m_reset_pointer = 0;
634641
635642      if ((data & 0x87) == 0) // WR2
636643      {
644         if (LOG) logerror("Z80DMA '%s' WR2 %02x\n", tag(), data);
637645         WR2 = data;
638646         if (data & 0x40)
639647            m_regs_follow[m_num_follow++] = GET_REGNUM(PORTB_TIMING);
640648      }
641649      else if ((data & 0x87) == 0x04) // WR1
642650      {
651         if (LOG) logerror("Z80DMA '%s' WR1 %02x\n", tag(), data);
643652         WR1 = data;
644653         if (data & 0x40)
645654            m_regs_follow[m_num_follow++] = GET_REGNUM(PORTA_TIMING);
646655      }
647656      else if ((data & 0x80) == 0) // WR0
648657      {
658         if (LOG) logerror("Z80DMA '%s' WR0 %02x\n", tag(), data);
649659         WR0 = data;
650660         if (data & 0x08)
651661            m_regs_follow[m_num_follow++] = GET_REGNUM(PORTA_ADDRESS_L);
r26192r26193
658668      }
659669      else if ((data & 0x83) == 0x80) // WR3
660670      {
671         if (LOG) logerror("Z80DMA '%s' WR3 %02x\n", tag(), data);
661672         WR3 = data;
662673         if (data & 0x08)
663674            m_regs_follow[m_num_follow++] = GET_REGNUM(MASK_BYTE);
r26192r26193
666677      }
667678      else if ((data & 0x83) == 0x81) // WR4
668679      {
680         if (LOG) logerror("Z80DMA '%s' WR4 %02x\n", tag(), data);
669681         WR4 = data;
670682         if (data & 0x04)
671683            m_regs_follow[m_num_follow++] = GET_REGNUM(PORTB_ADDRESS_L);
r26192r26193
676688      }
677689      else if ((data & 0xC7) == 0x82) // WR5
678690      {
691         if (LOG) logerror("Z80DMA '%s' WR5 %02x\n", tag(), data);
679692         WR5 = data;
680693      }
681694      else if ((data & 0x83) == 0x83) // WR6
682695      {
696         if (LOG) logerror("Z80DMA '%s' WR6 %02x\n", tag(), data);
683697         m_dma_enabled = 0;
684698
685699         WR6 = data;
r26192r26193
802816   }
803817   else
804818   {
819      if (LOG) logerror("Z80DMA '%s' Write %02x\n", tag(), data);
820
805821      int nreg = m_regs_follow[m_cur_follow];
806822      m_regs[nreg] = data;
807823      m_cur_follow++;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team