comparison segacd.c @ 2080:bafb757e1cd2

Implement CD audio
author Michael Pavone <pavone@retrodev.com>
date Wed, 02 Feb 2022 01:10:07 -0800
parents c69e42444f96
children cfd53c94fffb
comparison
equal deleted inserted replaced
2079:5a2b759f6b2d 2080:bafb757e1cd2
75 75
76 //GA_CDC_CTRL 76 //GA_CDC_CTRL
77 #define BIT_EDT 0x8000 77 #define BIT_EDT 0x8000
78 #define BIT_DSR 0x4000 78 #define BIT_DSR 0x4000
79 79
80 //GA_CDD_CTRL
81 #define BIT_MUTE 0x0100
82
80 enum { 83 enum {
81 DST_MAIN_CPU = 2, 84 DST_MAIN_CPU = 2,
82 DST_SUB_CPU, 85 DST_SUB_CPU,
83 DST_PCM_RAM, 86 DST_PCM_RAM,
84 DST_PROG_RAM, 87 DST_PROG_RAM,
304 } 307 }
305 } 308 }
306 309
307 static void cdd_run(segacd_context *cd, uint32_t cycle) 310 static void cdd_run(segacd_context *cd, uint32_t cycle)
308 { 311 {
309 cdd_mcu_run(&cd->cdd, cycle, cd->gate_array + GA_CDD_CTRL, &cd->cdc); 312 cdd_mcu_run(&cd->cdd, cycle, cd->gate_array + GA_CDD_CTRL, &cd->cdc, &cd->fader);
310 lc8951_run(&cd->cdc, cycle); 313 lc8951_run(&cd->cdc, cycle);
311 } 314 }
312 315
313 static uint32_t next_timer_int(segacd_context *cd) 316 static uint32_t next_timer_int(segacd_context *cd)
314 { 317 {
592 break; 595 break;
593 case GA_INT_MASK: 596 case GA_INT_MASK:
594 cd->gate_array[reg] = value & (BIT_MASK_IEN6|BIT_MASK_IEN5|BIT_MASK_IEN4|BIT_MASK_IEN3|BIT_MASK_IEN2|BIT_MASK_IEN1); 597 cd->gate_array[reg] = value & (BIT_MASK_IEN6|BIT_MASK_IEN5|BIT_MASK_IEN4|BIT_MASK_IEN3|BIT_MASK_IEN2|BIT_MASK_IEN1);
595 calculate_target_cycle(m68k); 598 calculate_target_cycle(m68k);
596 break; 599 break;
600 case GA_CDD_FADER:
601 cdd_run(cd, m68k->current_cycle);
602 value &= 0x7FFF;
603 cdd_fader_attenuation_write(&cd->fader, value);
604 cd->gate_array[reg] &= 0x8000;
605 cd->gate_array[reg] |= value;
606 break;
597 case GA_CDD_CTRL: { 607 case GA_CDD_CTRL: {
598 cdd_run(cd, m68k->current_cycle); 608 cdd_run(cd, m68k->current_cycle);
599 uint16_t changed = cd->gate_array[reg] ^ value; 609 uint16_t changed = cd->gate_array[reg] ^ value;
600 if (changed & BIT_HOCK) { 610 if (changed & BIT_HOCK) {
601 cd->gate_array[reg] &= ~BIT_HOCK; 611 cd->gate_array[reg] &= ~BIT_HOCK;
602 cd->gate_array[reg] |= value & BIT_HOCK; 612 cd->gate_array[reg] |= value & BIT_HOCK;
603 if (value & BIT_HOCK) { 613 if (value & BIT_HOCK) {
604 cdd_hock_enabled(&cd->cdd); 614 cdd_hock_enabled(&cd->cdd);
605 } else { 615 } else {
606 cdd_hock_disabled(&cd->cdd); 616 cdd_hock_disabled(&cd->cdd);
617 cd->gate_array[reg] |= BIT_MUTE;
607 } 618 }
608 calculate_target_cycle(m68k); 619 calculate_target_cycle(m68k);
609 } 620 }
610 break; 621 break;
611 } 622 }
800 811
801 static m68k_context *sync_components(m68k_context * context, uint32_t address) 812 static m68k_context *sync_components(m68k_context * context, uint32_t address)
802 { 813 {
803 segacd_context *cd = context->system; 814 segacd_context *cd = context->system;
804 scd_peripherals_run(cd, context->current_cycle); 815 scd_peripherals_run(cd, context->current_cycle);
816 if (context->int_ack) {
817 printf("int ack %d\n", context->int_ack);
818 }
805 switch (context->int_ack) 819 switch (context->int_ack)
806 { 820 {
807 case 1: 821 case 1:
808 cd->graphics_int_cycle = CYCLE_NEVER; 822 cd->graphics_int_cycle = CYCLE_NEVER;
809 break; 823 break;
1151 cd->busack = 1; 1165 cd->busack = 1;
1152 cd->need_reset = 1; 1166 cd->need_reset = 1;
1153 cd->reset = 1; //active low, so reset is not active on start 1167 cd->reset = 1; //active low, so reset is not active on start
1154 cd->memptr_start_index = 0; 1168 cd->memptr_start_index = 0;
1155 cd->gate_array[1] = 1; 1169 cd->gate_array[1] = 1;
1156 cd->gate_array[0x1B] = 0x100; 1170 cd->gate_array[GA_CDD_CTRL] = BIT_MUTE; //Data/mute flag is set on start
1157 lc8951_init(&cd->cdc, handle_cdc_byte, cd); 1171 lc8951_init(&cd->cdc, handle_cdc_byte, cd);
1158 if (media->chain && media->type != MEDIA_CDROM) { 1172 if (media->chain && media->type != MEDIA_CDROM) {
1159 media = media->chain; 1173 media = media->chain;
1160 } 1174 }
1161 cdd_mcu_init(&cd->cdd, media); 1175 cdd_mcu_init(&cd->cdd, media);
1162 cd_graphics_init(cd); 1176 cd_graphics_init(cd);
1177 cdd_fader_init(&cd->fader);
1163 1178
1164 return cd; 1179 return cd;
1165 } 1180 }
1166 1181
1167 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks) 1182 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks)