Mercurial > repos > blastem
comparison segacd.c @ 2144:10e4439d8f13
Fix speed of CDC to PCM RAM DMA
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 26 Mar 2022 00:54:47 -0700 |
parents | b6338e18787e |
children | 2da377ea932f |
comparison
equal
deleted
inserted
replaced
2143:67f20f9188b0 | 2144:10e4439d8f13 |
---|---|
739 cd->gate_array[reg] |= value & MASK_PRIORITY; | 739 cd->gate_array[reg] |= value & MASK_PRIORITY; |
740 cd->gate_array[reg] |= cd->main_has_word2m ? BIT_RET : BIT_DMNA; | 740 cd->gate_array[reg] |= cd->main_has_word2m ? BIT_RET : BIT_DMNA; |
741 } | 741 } |
742 break; | 742 break; |
743 } | 743 } |
744 case GA_CDC_CTRL: | 744 case GA_CDC_CTRL: { |
745 cdd_run(cd, m68k->current_cycle); | 745 cdd_run(cd, m68k->current_cycle); |
746 lc8951_ar_write(&cd->cdc, value); | 746 lc8951_ar_write(&cd->cdc, value); |
747 //cd->gate_array[reg] &= 0xC000; | 747 //cd->gate_array[reg] &= 0xC000; |
748 uint16_t old_dest = cd->gate_array[GA_CDC_CTRL] >> 8 & 0x7; | |
748 //apparently this clears EDT, should it also clear DSR? | 749 //apparently this clears EDT, should it also clear DSR? |
749 cd->gate_array[reg] = value & 0x0700; | 750 cd->gate_array[reg] = value & 0x0700; |
751 uint16_t dest = cd->gate_array[GA_CDC_CTRL] >> 8 & 0x7; | |
752 if (dest != old_dest) { | |
753 if (dest == DST_PCM_RAM) { | |
754 lc8951_set_dma_multiple(&cd->cdc, 21); | |
755 } else { | |
756 lc8951_set_dma_multiple(&cd->cdc, 6); | |
757 } | |
758 if ((old_dest < DST_MAIN_CPU || old_dest == 6) && dest >= DST_MAIN_CPU && dest != 6) { | |
759 lc8951_resume_transfer(&cd->cdc, m68k->current_cycle); | |
760 } | |
761 calculate_target_cycle(m68k); | |
762 } | |
750 cd->gate_array[GA_CDC_DMA_ADDR] = 0; | 763 cd->gate_array[GA_CDC_DMA_ADDR] = 0; |
751 cd->cdc_dst_low = 0; | 764 cd->cdc_dst_low = 0; |
752 break; | 765 break; |
766 } | |
753 case GA_CDC_REG_DATA: | 767 case GA_CDC_REG_DATA: |
754 cdd_run(cd, m68k->current_cycle); | 768 cdd_run(cd, m68k->current_cycle); |
755 printf("CDC write %X: %X @ %u\n", cd->cdc.ar, value, m68k->current_cycle); | 769 printf("CDC write %X: %X @ %u\n", cd->cdc.ar, value, m68k->current_cycle); |
756 lc8951_reg_write(&cd->cdc, value); | 770 lc8951_reg_write(&cd->cdc, value); |
757 calculate_target_cycle(m68k); | 771 calculate_target_cycle(m68k); |
1010 dma_addr++; | 1024 dma_addr++; |
1011 cd->cdc_dst_low = dma_addr & 7; | 1025 cd->cdc_dst_low = dma_addr & 7; |
1012 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3; | 1026 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3; |
1013 break; | 1027 break; |
1014 default: | 1028 default: |
1029 return 0; | |
1015 printf("Invalid CDC transfer destination %d\n", dest); | 1030 printf("Invalid CDC transfer destination %d\n", dest); |
1016 } | 1031 } |
1017 return 1; | 1032 return 1; |
1018 } | 1033 } |
1019 | 1034 |