comparison segacd.c @ 2081:cfd53c94fffb

Initial stab at RF5C164 emulation
author Michael Pavone <pavone@retrodev.com>
date Thu, 03 Feb 2022 23:15:42 -0800
parents bafb757e1cd2
children 372625dd9590
comparison
equal deleted inserted replaced
2080:bafb757e1cd2 2081:cfd53c94fffb
260 return vcontext; 260 return vcontext;
261 } 261 }
262 262
263 static uint8_t pcm_read8(uint32_t address, void *vcontext) 263 static uint8_t pcm_read8(uint32_t address, void *vcontext)
264 { 264 {
265 return 0; 265 m68k_context *m68k = vcontext;
266 segacd_context *cd = m68k->system;
267 if (address & 1) {
268 rf5c164_run(&cd->pcm, m68k->current_cycle);
269 return rf5c164_read(&cd->pcm, address >> 1);
270 } else {
271 return 0xFF;
272 }
266 } 273 }
267 274
268 static uint16_t pcm_read16(uint32_t address, void *vcontext) 275 static uint16_t pcm_read16(uint32_t address, void *vcontext)
269 { 276 {
270 return 0xFF00 | pcm_read8(address+1, vcontext); 277 return 0xFF00 | pcm_read8(address+1, vcontext);
271 } 278 }
272 279
273 static void *pcm_write8(uint32_t address, void *vcontext, uint8_t value) 280 static void *pcm_write8(uint32_t address, void *vcontext, uint8_t value)
274 { 281 {
282 m68k_context *m68k = vcontext;
283 segacd_context *cd = m68k->system;
284 if (address & 1) {
285 rf5c164_run(&cd->pcm, m68k->current_cycle);
286 rf5c164_write(&cd->pcm, address >> 1, value);
287 }
275 return vcontext; 288 return vcontext;
276 } 289 }
277 290
278 static void *pcm_write16(uint32_t address, void *vcontext, uint16_t value) 291 static void *pcm_write16(uint32_t address, void *vcontext, uint16_t value)
279 { 292 {
758 cd->gate_array[GA_CDC_CTRL] |= BIT_DSR; 771 cd->gate_array[GA_CDC_CTRL] |= BIT_DSR;
759 printf("DSR set at %u, (transfer_end %u, dbcl %X, dbch %X)\n", cd->cdc.cycle, cd->cdc.transfer_end, cd->cdc.regs[2], cd->cdc.regs[3]); 772 printf("DSR set at %u, (transfer_end %u, dbcl %X, dbch %X)\n", cd->cdc.cycle, cd->cdc.transfer_end, cd->cdc.regs[2], cd->cdc.regs[3]);
760 break; 773 break;
761 case DST_PCM_RAM: 774 case DST_PCM_RAM:
762 dma_addr &= (1 << 13) - 1; 775 dma_addr &= (1 << 13) - 1;
763 //TODO: write to currently visible 8K bank of PCM RAM I guess? 776 rf5c164_write(&cd->pcm, 0x1000 | (dma_addr >> 1), value);
764 dma_addr += 2; 777 dma_addr += 2;
765 cd->cdc_dst_low = dma_addr & 7; 778 cd->cdc_dst_low = dma_addr & 7;
766 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3; 779 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3;
767 break; 780 break;
768 case DST_PROG_RAM: 781 case DST_PROG_RAM:
805 static void scd_peripherals_run(segacd_context *cd, uint32_t cycle) 818 static void scd_peripherals_run(segacd_context *cd, uint32_t cycle)
806 { 819 {
807 timers_run(cd, cycle); 820 timers_run(cd, cycle);
808 cdd_run(cd, cycle); 821 cdd_run(cd, cycle);
809 cd_graphics_run(cd, cycle); 822 cd_graphics_run(cd, cycle);
823 rf5c164_run(&cd->pcm, cycle);
810 } 824 }
811 825
812 static m68k_context *sync_components(m68k_context * context, uint32_t address) 826 static m68k_context *sync_components(m68k_context * context, uint32_t address)
813 { 827 {
814 segacd_context *cd = context->system; 828 segacd_context *cd = context->system;
888 cd->graphics_int_cycle -= deduction; 902 cd->graphics_int_cycle -= deduction;
889 } else { 903 } else {
890 cd->graphics_int_cycle = 0; 904 cd->graphics_int_cycle = 0;
891 } 905 }
892 } 906 }
907 cd->pcm.cycle -= deduction;
893 } 908 }
894 909
895 static uint16_t main_gate_read16(uint32_t address, void *vcontext) 910 static uint16_t main_gate_read16(uint32_t address, void *vcontext)
896 { 911 {
897 m68k_context *m68k = vcontext; 912 m68k_context *m68k = vcontext;
1173 media = media->chain; 1188 media = media->chain;
1174 } 1189 }
1175 cdd_mcu_init(&cd->cdd, media); 1190 cdd_mcu_init(&cd->cdd, media);
1176 cd_graphics_init(cd); 1191 cd_graphics_init(cd);
1177 cdd_fader_init(&cd->fader); 1192 cdd_fader_init(&cd->fader);
1178 1193 rf5c164_init(&cd->pcm, SCD_MCLKS, 4);
1179 return cd; 1194 return cd;
1180 } 1195 }
1181 1196
1182 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks) 1197 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks)
1183 { 1198 {