--- hatari/src/falcon/crossbar.c 2019/04/09 08:52:09 1.1.1.4 +++ hatari/src/falcon/crossbar.c 2019/04/09 08:54:35 1.1.1.6 @@ -1,8 +1,8 @@ /* Hatari - Crossbar.c - This file is distributed under the GNU Public License, version 2 or at - your option any later version. Read the file gpl.txt for details. + This file is distributed under the GNU General Public License, version 2 + or at your option any later version. Read the file gpl.txt for details. Falcon Crossbar (Matrice) emulation. input device: @@ -46,7 +46,7 @@ $FF8937 (byte) : Codec Input Source $FF8938 (byte) : Codec ADC Input $FF8939 (byte) : Gain Settings Per Channel - $FF893A (byte) : Attenuation Settings Per Channel + $FF893A (word) : Attenuation Settings Per Channel $FF893C (word) : Codec Status $FF8940 (word) : GPIO Data Direction $FF8942 (word) : GPIO Data @@ -1080,17 +1080,17 @@ void Crossbar_InputAmp_WriteByte(void) /** * Write byte to channel reduction register (attenuation for DAC device) (0xff893a). - * Bits LLLLRRRR + * Bits XXXXLLLL RRRRXXXX * Reduction is in -1.5 dB steps */ -void Crossbar_OutputReduct_WriteByte(void) +void Crossbar_OutputReduct_WriteWord(void) { - Uint8 reduction = IoMem_ReadByte(0xff893a); + Uint16 reduction = IoMem_ReadWord(0xff893a); - LOG_TRACE(TRACE_CROSSBAR, "Crossbar : $ff893a (CODEC channel attenuation) write: 0x%02x\n", IoMem_ReadByte(0xff893a)); + LOG_TRACE(TRACE_CROSSBAR, "Crossbar : $ff893a (CODEC channel attenuation) write: 0x%04x\n", reduction); - crossbar.attenuationSettingLeft = Crossbar_DAC_volume_table[reduction >> 4]; - crossbar.attenuationSettingRight = Crossbar_DAC_volume_table[reduction & 0xf]; + crossbar.attenuationSettingLeft = Crossbar_DAC_volume_table[(reduction >> 8) & 0x0f]; + crossbar.attenuationSettingRight = Crossbar_DAC_volume_table[(reduction >> 4) & 0x0f]; } /** @@ -1519,7 +1519,7 @@ static void Crossbar_Process_DMAPlay_Tra { /* Send a MFP15_Int (I7) at end of replay buffer if enabled */ if (dmaPlay.mfp15_int) { - MFP_InputOnChannel(MFP_TIMER_GPIP7_BIT, MFP_IERA, &MFP_IPRA); + MFP_InputOnChannel ( MFP_INT_GPIP7 , 0 ); LOG_TRACE(TRACE_CROSSBAR, "Crossbar : MFP15 (IT7) interrupt from DMA play\n"); } @@ -1615,7 +1615,7 @@ void Crossbar_SendDataToDmaRecord(Sint16 { /* Send a MFP15_Int (I7) at end of record buffer if enabled */ if (dmaRecord.mfp15_int) { - MFP_InputOnChannel(MFP_TIMER_GPIP7_BIT, MFP_IERA, &MFP_IPRA); + MFP_InputOnChannel ( MFP_INT_GPIP7 , 0 ); LOG_TRACE(TRACE_CROSSBAR, "Crossbar : MFP15 (IT7) interrupt from DMA record\n"); } @@ -1780,8 +1780,8 @@ static void Crossbar_SendDataToDAC(Sint1 */ void Crossbar_GenerateSamples(int nMixBufIdx, int nSamplesToGenerate) { - int i, nBufIdx; - unsigned n; + int i, j, nBufIdx; + int n; Sint16 adc_leftData, adc_rightData, dac_LeftData, dac_RightData; if (crossbar.isDacMuted) { @@ -1844,8 +1844,6 @@ void Crossbar_GenerateSamples(int nMixBu /* Crossbar->DAC sound only */ dac_LeftData = dac.buffer_left[dac.readPosition]; dac_RightData = dac.buffer_right[dac.readPosition]; - dac.buffer_left[dac.readPosition] = 0; - dac.buffer_right[dac.readPosition] = 0; break; case 3: /* Mixing Direct ADC sound with Crossbar->DMA sound */ @@ -1853,8 +1851,6 @@ void Crossbar_GenerateSamples(int nMixBu dac.buffer_left[dac.readPosition]; dac_RightData = ((adc_rightData * crossbar.gainSettingRight) >> 14) + dac.buffer_right[dac.readPosition]; - dac.buffer_left[dac.readPosition] = 0; - dac.buffer_right[dac.readPosition] = 0; break; } @@ -1864,6 +1860,15 @@ void Crossbar_GenerateSamples(int nMixBu /* Upgrade dac's buffer read pointer */ dac.readPosition_float += crossbar.frequence_ratio; n = dac.readPosition_float >> 32; /* number of samples to skip */ + + if (n) { + // It becomes safe to zero old data if tail has moved + for (j=0; j> 13) & 0x3) { + case 0 : + /* DAC connexion with DMA Playback */ + if ((IoMem_ReadWord(0xff8930) & 0x1) == 1) + strcpy(matrixDAC, "OOXO"); + else + strcpy(matrixDAC, "OOHO"); + break; + case 1 : + /* DAC connexion with DSP Transmit */ + if ((IoMem_ReadWord(0xff8930) & 0x10) == 0x10) + strcpy(matrixDAC, "OXOO"); + else + strcpy(matrixDAC, "OHOO"); + break; + case 2 : + /* DAC connexion with External Input */ + if ((IoMem_ReadWord(0xff8930) & 0x100) == 0x100) + strcpy(matrixDAC, "XOOO"); + else + strcpy(matrixDAC, "HOOO"); + break; + case 3 : + /* DAC connexion with ADC */ + strcpy(matrixDAC, "OOOX"); + break; + } + + /* DMA connexion */ + switch (IoMem_ReadWord(0xff8932) & 0x7) { + case 0 : strcpy(matrixDMA, "OOHO"); break; + case 1 : strcpy(matrixDMA, "OOXO"); break; + case 2 : strcpy(matrixDMA, "OHOO"); break; + case 3 : strcpy(matrixDMA, "OXOO"); break; + case 4 : strcpy(matrixDMA, "HOOO"); break; + case 5 : strcpy(matrixDMA, "XOOO"); break; + case 6 : strcpy(matrixDMA, "OOOH"); break; + case 7 : strcpy(matrixDMA, "OOOX"); break; + } + + /* DSP connexion */ + switch ((IoMem_ReadWord(0xff8932) >> 4) & 0x7) { + case 0 : strcpy(matrixDSP, "OOHO"); break; + case 1 : strcpy(matrixDSP, "OOXO"); break; + case 2 : strcpy(matrixDSP, "OHOO"); break; + case 3 : strcpy(matrixDSP, "OXOO"); break; + case 4 : strcpy(matrixDSP, "HOOO"); break; + case 5 : strcpy(matrixDSP, "XOOO"); break; + case 6 : strcpy(matrixDSP, "OOOH"); break; + case 7 : strcpy(matrixDSP, "OOOX"); break; + } + + /* External input connexion */ + switch ((IoMem_ReadWord(0xff8932) >> 8) & 0x7) { + case 0 : strcpy(matrixEXT, "OOHO"); break; + case 1 : strcpy(matrixEXT, "OOXO"); break; + case 2 : strcpy(matrixEXT, "OHOO"); break; + case 3 : strcpy(matrixEXT, "OXOO"); break; + case 4 : strcpy(matrixEXT, "HOOO"); break; + case 5 : strcpy(matrixEXT, "XOOO"); break; + case 6 : strcpy(matrixEXT, "OOOH"); break; + case 7 : strcpy(matrixEXT, "OOOX"); break; + } + + if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { + strcpy(frqDSP, "(STe Freq)"); + strcpy(frqDMA, "(STe Freq)"); + strcpy(frqEXT, "(STe Freq)"); + strcpy(frqDAC, "(STe Freq)"); + } + else { + /* DSP Clock */ + switch ((IoMem_ReadWord(0xff8930) >> 5) & 0x3) { + case 0: strcpy(frqDSP, " (25 Mhz) "); break; + case 1: strcpy(frqDSP, "(External)"); break; + case 2: strcpy(frqDSP, " (32 Mhz) "); break; + default: strcpy(frqDSP, "undefined "); break; + } + + /* DMA Clock */ + switch ((IoMem_ReadWord(0xff8930) >> 1) & 0x3) { + case 0: strcpy(frqDMA, " (25 Mhz) "); break; + case 1: strcpy(frqDMA, "(External)"); break; + case 2: strcpy(frqDMA, " (32 Mhz) "); break; + default: strcpy(frqDMA, "undefined "); break; + } + + /* External Clock */ + switch ((IoMem_ReadWord(0xff8930) >> 9) & 0x3) { + case 0: strcpy(frqEXT, " (25 Mhz) "); break; + case 1: strcpy(frqEXT, "(External)"); break; + case 2: strcpy(frqEXT, " (32 Mhz) "); break; + default: strcpy(frqEXT, "undefined "); break; + } + + /* DAC Clock */ + strcpy(frqDAC, " (25 Mhz) "); + } + + /* data size */ + switch ((IoMem_ReadByte(0xff8921) >> 6) & 0x3) { + case 0: strcpy (dataSize, "8 bits stereo"); break; + case 1: strcpy (dataSize, "16 bits stereo"); break; + case 2: strcpy (dataSize, "8 bits mono"); break; + default: strcpy (dataSize, "undefined"); break; + } + + /* STE, 25Mhz and 32 Mhz sound frequencies */ + if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { + sprintf(frqSTE, "Ste Freq : %d Khz", Ste_SampleRates[IoMem_ReadByte(0xff8921) & 0x3]); + strcpy (frq25Mhz, "25 Mhz Freq : - Khz"); + strcpy (frq32Mhz, "32 Mzh Freq : - Khz"); + } + else { + strcpy (frqSTE, "Ste Freq : - Khz"); + sprintf(frq25Mhz, "25 Mhz Freq : %d Khz", Falcon_SampleRates_25Mhz[(IoMem_ReadByte(0xff8935) & 0xf) - 1]); + sprintf(frq32Mhz, "32 Mzh Freq : %d Khz", Falcon_SampleRates_32Mhz[(IoMem_ReadByte(0xff8935) & 0xf) - 1]); + } + + /* Display the crossbar Matrix */ + fprintf(stderr, " INPUT\n"); + fprintf(stderr, "External Imp ---%c------%c------%c------%c\n", matrixDAC[0], matrixDMA[0], matrixDSP[0], matrixEXT[0]); + fprintf(stderr, "%s | | | | O = no connexion\n", frqEXT); + fprintf(stderr, " | | | | X = connexion\n"); + fprintf(stderr, "Dsp Transmit ---%c------%c------%c------%c H = Handshake connexion\n", matrixDAC[1], matrixDMA[1], matrixDSP[1], matrixEXT[1]); + fprintf(stderr, "%s | | | |\n", frqDSP); + fprintf(stderr, " | | | | %s\n", dataSize); + fprintf(stderr, "DMA PlayBack ---%c------%c------%c------%c\n", matrixDAC[2], matrixDMA[2], matrixDSP[2], matrixEXT[2]); + fprintf(stderr, "%s | | | | Sound Freq :\n", frqDMA); + fprintf(stderr, " | | | | %s\n", frqSTE); + fprintf(stderr, "ADC ---%c------%c------%c------%c %s\n", matrixDAC[3], matrixDMA[3], matrixDSP[3], matrixEXT[3], frq25Mhz); + fprintf(stderr, "%s | | | | %s\n", frqDAC, frq32Mhz); + fprintf(stderr, " | | | |\n"); + fprintf(stderr, " DAC DMA DSP External OUTPUT\n"); + fprintf(stderr, " Record Record Out\n"); + fprintf(stderr, "\n"); +} +