trunk/src/emu/cpu/sh2/sh2comn.c
| r21169 | r21170 | |
| 418 | 418 | LOG(("SH2.%s: DMA %d complete\n", sh2->device->tag(), dma)); |
| 419 | 419 | sh2->m[0x63+4*dma] |= 2; |
| 420 | 420 | sh2->dma_timer_active[dma] = 0; |
| 421 | sh2->dma_irq[dma] |= 1; |
| 421 | 422 | sh2_recalc_irq(sh2); |
| 422 | 423 | |
| 423 | 424 | } |
| r21169 | r21170 | |
| 860 | 861 | } |
| 861 | 862 | |
| 862 | 863 | // DMA irqs |
| 863 | | if((sh2->m[0x63] & 6) == 6) { |
| 864 | if((sh2->m[0x63] & 6) == 6 && sh2->dma_irq[0]) { |
| 864 | 865 | level = (sh2->m[0x38] >> 8) & 15; |
| 865 | 866 | if(level > irq) { |
| 866 | 867 | irq = level; |
| 867 | | vector = (sh2->m[0x68] >> 24) & 0x7f; |
| 868 | sh2->dma_irq[0] &= ~1; |
| 869 | vector = (sh2->m[0x68]) & 0x7f; |
| 868 | 870 | } |
| 869 | 871 | } |
| 870 | 872 | |
| 871 | | if((sh2->m[0x67] & 6) == 6) { |
| 873 | if((sh2->m[0x67] & 6) == 6 && sh2->dma_irq[1]) { |
| 872 | 874 | level = (sh2->m[0x38] >> 8) & 15; |
| 873 | 875 | if(level > irq) { |
| 874 | 876 | irq = level; |
| 875 | | vector = (sh2->m[0x6a] >> 24) & 0x7f; |
| 877 | sh2->dma_irq[1] &= ~1; |
| 878 | vector = (sh2->m[0x6a]) & 0x7f; |
| 876 | 879 | } |
| 877 | 880 | } |
| 878 | 881 | |
| r21169 | r21170 | |
| 894 | 897 | if (sh2->internal_irq_level == irqline) |
| 895 | 898 | { |
| 896 | 899 | vector = sh2->internal_irq_vector; |
| 900 | /* avoid spurious irqs with this (TODO: needs a better fix) */ |
| 901 | sh2->internal_irq_level = -1; |
| 897 | 902 | LOG(("SH-2 '%s' exception #%d (internal vector: $%x) after [%s]\n", sh2->device->tag(), irqline, vector, message)); |
| 898 | 903 | } |
| 899 | 904 | else |
| r21169 | r21170 | |
| 1024 | 1029 | device->save_item(NAME(sh2->internal_irq_level)); |
| 1025 | 1030 | device->save_item(NAME(sh2->internal_irq_vector)); |
| 1026 | 1031 | device->save_item(NAME(sh2->dma_timer_active)); |
| 1032 | device->save_item(NAME(sh2->dma_irq)); |
| 1027 | 1033 | } |