From 04f40f01997061954e6b6414959055a410cb6c41 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 20 Jan 2022 18:36:37 +0100 Subject: [PATCH] AdLib Gold changes: Properly implemented MIDI Out/In. Changed the ID from 0x50/0x70 to 0x51/0x71 to identify as AdLib Gold 1000. Added CD Audio volume and filter. --- src/sound/snd_adlibgold.c | 83 +++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/src/sound/snd_adlibgold.c b/src/sound/snd_adlibgold.c index 5d435f61e..bcdca3283 100644 --- a/src/sound/snd_adlibgold.c +++ b/src/sound/snd_adlibgold.c @@ -61,6 +61,7 @@ typedef struct adgold_t int fm_vol_l, fm_vol_r; int samp_vol_l, samp_vol_r; int vol_l, vol_r; + int aux_vol_l, aux_vol_r; int treble, bass; int16_t opl_buffer[SOUNDBUFLEN * 2]; @@ -151,6 +152,8 @@ void adgold_update_irq_status(adgold_t *adgold) temp &= ~2; if (!(adgold->adgold_mma_regs[0][0xd] & 0x04) && (adgold->adgold_mma_status & 0x08)) temp &= ~2; + if (!(adgold->adgold_mma_regs[0][0xd] & 0x10) && (adgold->adgold_mma_status & 0x80)) + temp &= ~2; if ((adgold->adgold_mma_status & 0x01) && !(adgold->adgold_mma_regs[0][0xc] & 2)) temp &= ~2; if ((adgold->adgold_mma_status & 0x02) && !(adgold->adgold_mma_regs[1][0xc] & 2)) @@ -260,6 +263,14 @@ void adgold_write(uint16_t addr, uint8_t val, void *p) adgold->adgold_38x_regs[0x0c] = val; adgold->samp_vol_r = (int)(int8_t)(val - 128); break; + case 0x0d: /*Aux volume left*/ + adgold->adgold_38x_regs[0x0d] = val; + adgold->aux_vol_l = (int)(int8_t)(val - 128); + break; + case 0x0e: /*Aux volume right*/ + adgold->adgold_38x_regs[0x0e] = val; + adgold->aux_vol_r = (int)(int8_t)(val - 128); + break; case 0x18: /*Surround*/ adgold->adgold_38x_regs[0x18] = val; @@ -394,22 +405,41 @@ void adgold_write(uint16_t addr, uint8_t val, void *p) case 0xd: adgold->adgold_midi_ctrl = val & 0x3f; - - if ((val & 0x0f) == 0x0f) { - adgold->uart_in = 0; - adgold->midi_w = 0; - adgold->midi_r = 0; - adgold->adgold_mma_status &= ~0x0c; - } else if (adgold->adgold_midi_ctrl & 0x05) { - adgold->uart_in = 1; + + if ((adgold->adgold_midi_ctrl & 0x0f) != 0x0f) { + if ((adgold->adgold_midi_ctrl & 0x0f) == 0x00) { + adgold->uart_out = 0; + adgold->uart_in = 0; + adgold->midi_w = 0; + adgold->midi_r = 0; + adgold->adgold_mma_status &= ~0x8c; + } else { + if (adgold->adgold_midi_ctrl & 0x01) + adgold->uart_in = 1; + if (adgold->adgold_midi_ctrl & 0x04) + adgold->uart_out = 1; + if (adgold->adgold_midi_ctrl & 0x02) { + adgold->uart_in = 0; + adgold->midi_w = 0; + adgold->midi_r = 0; + } + if (adgold->adgold_midi_ctrl & 0x08) + adgold->uart_out = 0; + adgold->adgold_mma_status &= ~0x80; + } } else - adgold->uart_in = 0; + adgold->adgold_mma_status &= ~0x8c; adgold_update_irq_status(adgold); break; case 0xe: - midi_raw_out_byte(val); + if (adgold->uart_out) { + midi_raw_out_byte(val); + + adgold->adgold_mma_status &= ~0x08; + adgold_update_irq_status(adgold); + } break; } adgold->adgold_mma_regs[0][adgold->adgold_mma_addr] = val; @@ -498,9 +528,9 @@ uint8_t adgold_read(uint16_t addr, void *p) { case 0x00: /*Control/ID*/ if (adgold->surround_enabled) - temp = 0x50; /*16-bit ISA, surround module, no telephone/CDROM*/ + temp = 0x51; /*16-bit ISA, surround module, no telephone/CDROM*/ else - temp = 0x70; /*16-bit ISA, no telephone/surround/CD-ROM*/ + temp = 0x71; /*16-bit ISA, no telephone/surround/CD-ROM*/ break; default: @@ -540,7 +570,7 @@ uint8_t adgold_read(uint16_t addr, void *p) adgold->adgold_mma_status &= ~0x04; adgold_update_irq_status(adgold); } - break; + break; default: temp = adgold->adgold_mma_regs[0][adgold->adgold_mma_addr]; @@ -625,14 +655,12 @@ void adgold_timer_poll(void *p) timer_advance_u64(&adgold->adgold_mma_timer_count, (uint64_t)((double)TIMER_USEC * 1.88964)); - if (adgold->adgold_midi_ctrl & 0x0f) { - if ((adgold->adgold_midi_ctrl & 0x0f) == 0x05) { - adgold->adgold_mma_status |= 0x08; - } else { - if ((adgold->adgold_midi_ctrl & 0x0f) == 0x02) - adgold->adgold_mma_status &= ~0x04; - else if ((adgold->adgold_midi_ctrl & 0x0f) == 0x08) - adgold->adgold_mma_status &= ~0x08; + if (adgold->adgold_midi_ctrl & 0x3f) { + if ((adgold->adgold_midi_ctrl & 0x3f) != 0x3f) { + if (adgold->uart_out) + adgold->adgold_mma_status |= 0x08; + if (adgold->adgold_midi_ctrl & 0x10) + adgold->adgold_mma_status |= 0x80; } adgold_update_irq_status(adgold); } @@ -851,6 +879,16 @@ static int adgold_input_sysex(void *p, uint8_t *buffer, uint32_t len, int abort) return 0; } +static void +adgold_filter_cd_audio(int channel, double *buffer, void *p) +{ + adgold_t *adgold = (adgold_t *)p; + double c; + double volume = channel ? adgold->aux_vol_r : adgold->aux_vol_l; + + c = ((*buffer) * volume) / 128.0; /*Workaround to the low volume*/ + *buffer = c; +} void *adgold_init(const device_t *info) { @@ -899,6 +937,8 @@ void *adgold_init(const device_t *info) adgold->fm_vol_r = (int)(int8_t)(adgold->adgold_eeprom[0x0a] - 128); adgold->samp_vol_l = (int)(int8_t)(adgold->adgold_eeprom[0x0b] - 128); adgold->samp_vol_r = (int)(int8_t)(adgold->adgold_eeprom[0x0c] - 128); + adgold->aux_vol_l = (int)(int8_t)(adgold->adgold_eeprom[0x0d] - 128); + adgold->aux_vol_r = (int)(int8_t)(adgold->adgold_eeprom[0x0e] - 128); adgold->adgold_mma_enable[0] = 0; adgold->adgold_mma_fifo_start[0] = adgold->adgold_mma_fifo_end[0] = 0; @@ -912,6 +952,7 @@ void *adgold_init(const device_t *info) timer_add(&adgold->adgold_mma_timer_count, adgold_timer_poll, adgold, 1); sound_add_handler(adgold_get_buffer, adgold); + sound_set_cd_audio_filter(adgold_filter_cd_audio, adgold); if (device_get_config_int("receive_input")) midi_in_handler(1, adgold_input_msg, adgold_input_sysex, adgold);