Mercurial > repos > blastem
comparison segacd.c @ 2128:b0dcf5c9f353
Fix some issues with PCM dma/CPU write conflicts
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 13 Mar 2022 11:36:06 -0700 |
parents | 1bf30397dd45 |
children | 4c9e447aa25b |
comparison
equal
deleted
inserted
replaced
2127:1bf30397dd45 | 2128:b0dcf5c9f353 |
---|---|
363 segacd_context *cd = m68k->system; | 363 segacd_context *cd = m68k->system; |
364 if (address & 1) { | 364 if (address & 1) { |
365 //need to run CD drive because there may be a PCM DMA underway | 365 //need to run CD drive because there may be a PCM DMA underway |
366 cdd_run(cd, m68k->current_cycle); | 366 cdd_run(cd, m68k->current_cycle); |
367 rf5c164_run(&cd->pcm, m68k->current_cycle); | 367 rf5c164_run(&cd->pcm, m68k->current_cycle); |
368 while ((cd->pcm.flags & 0x81) == 1) { | |
369 //not sounding, but pending write | |
370 //DMA write conflict presumably adds wait states | |
371 m68k->current_cycle += 4; | |
372 rf5c164_run(&cd->pcm, m68k->current_cycle); | |
373 } | |
368 rf5c164_write(&cd->pcm, address >> 1, value); | 374 rf5c164_write(&cd->pcm, address >> 1, value); |
369 } | 375 } |
370 return vcontext; | 376 return vcontext; |
371 } | 377 } |
372 | 378 |
887 cd->gate_array[GA_CDC_CTRL] |= BIT_DSR; | 893 cd->gate_array[GA_CDC_CTRL] |= BIT_DSR; |
888 break; | 894 break; |
889 case DST_PCM_RAM: | 895 case DST_PCM_RAM: |
890 dma_addr &= (1 << 13) - 1; | 896 dma_addr &= (1 << 13) - 1; |
891 rf5c164_run(&cd->pcm, cd->cdc.cycle); | 897 rf5c164_run(&cd->pcm, cd->cdc.cycle); |
898 while ((cd->pcm.flags & 0x81) == 1) { | |
899 //not sounding, but pending write | |
900 //DMA write conflict with CPU | |
901 rf5c164_run(&cd->pcm, cd->pcm.cycle + 4); | |
902 } | |
892 rf5c164_write(&cd->pcm, 0x1000 | (dma_addr >> 1), value); | 903 rf5c164_write(&cd->pcm, 0x1000 | (dma_addr >> 1), value); |
893 dma_addr += 2; | 904 dma_addr += 2; |
894 cd->cdc_dst_low = dma_addr & 7; | 905 cd->cdc_dst_low = dma_addr & 7; |
895 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3; | 906 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3; |
896 break; | 907 break; |