Previous 199869 Revisions Next

r21170 Monday 18th February, 2013 at 21:18:30 UTC by Angelo Salese
Fixed SH-2 DMAC irqs, fixes at least hard-locking on Baroque [Angelo Salese]
[src/emu/cpu/sh2]sh2comn.c sh2comn.h sh2drc.c

trunk/src/emu/cpu/sh2/sh2drc.c
r21169r21170
805805   sh2->frc_base = 0;
806806   sh2->frt_input = sh2->internal_irq_level = sh2->internal_irq_vector = 0;
807807   sh2->dma_timer_active[0] = sh2->dma_timer_active[1] = 0;
808   sh2->dma_irq[0] = sh2->dma_irq[1] = 0;
808809
809810   sh2->ftcsr_read_callback = f;
810811   sh2->irq_callback = save_irqcallback;
trunk/src/emu/cpu/sh2/sh2comn.c
r21169r21170
418418      LOG(("SH2.%s: DMA %d complete\n", sh2->device->tag(), dma));
419419      sh2->m[0x63+4*dma] |= 2;
420420      sh2->dma_timer_active[dma] = 0;
421      sh2->dma_irq[dma] |= 1;
421422      sh2_recalc_irq(sh2);
422423
423424   }
r21169r21170
860861   }
861862
862863   // DMA irqs
863   if((sh2->m[0x63] & 6) == 6) {
864   if((sh2->m[0x63] & 6) == 6 && sh2->dma_irq[0]) {
864865      level = (sh2->m[0x38] >> 8) & 15;
865866      if(level > irq) {
866867         irq = level;
867         vector = (sh2->m[0x68] >> 24) & 0x7f;
868         sh2->dma_irq[0] &= ~1;
869         vector = (sh2->m[0x68]) & 0x7f;
868870      }
869871   }
870872
871   if((sh2->m[0x67] & 6) == 6) {
873   if((sh2->m[0x67] & 6) == 6 && sh2->dma_irq[1]) {
872874      level = (sh2->m[0x38] >> 8) & 15;
873875      if(level > irq) {
874876         irq = level;
875         vector = (sh2->m[0x6a] >> 24) & 0x7f;
877         sh2->dma_irq[1] &= ~1;
878         vector = (sh2->m[0x6a]) & 0x7f;
876879      }
877880   }
878881
r21169r21170
894897      if (sh2->internal_irq_level == irqline)
895898      {
896899         vector = sh2->internal_irq_vector;
900         /* avoid spurious irqs with this (TODO: needs a better fix) */
901         sh2->internal_irq_level = -1;
897902         LOG(("SH-2 '%s' exception #%d (internal vector: $%x) after [%s]\n", sh2->device->tag(), irqline, vector, message));
898903      }
899904      else
r21169r21170
10241029   device->save_item(NAME(sh2->internal_irq_level));
10251030   device->save_item(NAME(sh2->internal_irq_vector));
10261031   device->save_item(NAME(sh2->dma_timer_active));
1032   device->save_item(NAME(sh2->dma_irq));
10271033}
trunk/src/emu/cpu/sh2/sh2comn.h
r21169r21170
137137   emu_timer *timer;
138138   emu_timer *dma_current_active_timer[2];
139139   int     dma_timer_active[2];
140   UINT8  dma_irq[2];
140141
141142   int active_dma_incs[2];
142143   int active_dma_incd[2];

Previous 199869 Revisions Next


© 1997-2024 The MAME Team