--- uae/src/od-dos/sound/gus.c 2018/04/24 16:40:30 1.1 +++ uae/src/od-dos/sound/gus.c 2018/04/24 17:15:04 1.1.1.2 @@ -175,7 +175,7 @@ void GUS_GF1Delay( void ) int i; for( i=0; i<6; i++ ) - inportb( uwGUSPort+GUS_DATAHI ); + inportb( uwGUSPort+GUS_DATAHI ); } @@ -237,13 +237,13 @@ void GUS_Reset( UBYTE ubGUSDMA1, UBYTE u for( i=0; i<32; i++ ) { - WriteGUSb( GUS_VOICE, (UBYTE)i ); - WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); - WriteGUSb( GUS_DATAHI, 3 ); // Stimme stoppen - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); - WriteGUSb( GUS_DATAHI, 3 ); // Lautstaerke 0 - WriteGUSb( GUS_COMMAND, GUS_CMD_RAMPRATEW ); - WriteGUSb( GUS_DATAHI, 0 ); // Ramp 0 + WriteGUSb( GUS_VOICE, (UBYTE)i ); + WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); + WriteGUSb( GUS_DATAHI, 3 ); // Stimme stoppen + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); + WriteGUSb( GUS_DATAHI, 3 ); // Lautstaerke 0 + WriteGUSb( GUS_COMMAND, GUS_CMD_RAMPRATEW ); + WriteGUSb( GUS_DATAHI, 0 ); // Ramp 0 } @@ -267,7 +267,7 @@ void GUS_Reset( UBYTE ubGUSDMA1, UBYTE u if( ubGUSDMA1 == 0 ) // IRQ's und DMA einstellen ? - return; // Nein, dann Ende + return; // Nein, dann Ende // Digital ASIC einstellen @@ -282,30 +282,30 @@ void GUS_Reset( UBYTE ubGUSDMA1, UBYTE u nDMA=0; for( j=0; j<2; j++ ) { - switch( ((j!=0)?(ubGUSDMA1):(ubGUSDMA2)) ) - { - case 1: - nDMA |= 1; - break; - case 3: - nDMA |= 2; - break; - case 5: - nDMA |= 3; - break; - case 6: - nDMA |= 4; - break; - case 7: - nDMA |= 5; - break; - } - if( j==0 ) - nDMA=nDMA<<3; + switch( ((j!=0)?(ubGUSDMA1):(ubGUSDMA2)) ) + { + case 1: + nDMA |= 1; + break; + case 3: + nDMA |= 2; + break; + case 5: + nDMA |= 3; + break; + case 6: + nDMA |= 4; + break; + case 7: + nDMA |= 5; + break; + } + if( j==0 ) + nDMA=nDMA<<3; } if( ubGUSDMA1 == ubGUSDMA2 ) // Gleichen DMA fuer beides ? - nDMA = (nDMA&0x3)|(1<<6); + nDMA = (nDMA&0x3)|(1<<6); // Interrupt der GUS setzen @@ -313,36 +313,36 @@ void GUS_Reset( UBYTE ubGUSDMA1, UBYTE u nInt=0; for( j=0; j<2; j++ ) { - switch( (j!=0)?(ubGUSGF1Int):(ubGUSMIDIInt) ) - { - case 2: - nInt |= 1; - break; - case 5: - nInt |= 2; - break; - case 3: - nInt |= 3; - break; - case 7: - nInt |= 4; - break; - case 11: - nInt |= 5; - break; - case 12: - nInt |= 6; - break; - case 15: - nInt |= 7; - break; - } - if( j==0 ) - nInt=nInt<<3; + switch( (j!=0)?(ubGUSGF1Int):(ubGUSMIDIInt) ) + { + case 2: + nInt |= 1; + break; + case 5: + nInt |= 2; + break; + case 3: + nInt |= 3; + break; + case 7: + nInt |= 4; + break; + case 11: + nInt |= 5; + break; + case 12: + nInt |= 6; + break; + case 15: + nInt |= 7; + break; + } + if( j==0 ) + nInt=nInt<<3; } if( ubGUSGF1Int == ubGUSMIDIInt ) - nInt = (nInt&0x3)|(1<<6); + nInt = (nInt&0x3)|(1<<6); @@ -394,13 +394,13 @@ int GUS_Init( int *dspbits, int *rate, i szGUSENVStr = getenv( "ULTRASND" ); if( szGUSENVStr == 0 ) - return 0; + return 0; if( (*dspbits != 8 ) && (*dspbits != 16 ) ) { - printf( "%d bits are not supported on the GUS !\n", dspbits ); - return 0; + printf( "%d bits are not supported on the GUS !\n", dspbits ); + return 0; } @@ -408,8 +408,8 @@ int GUS_Init( int *dspbits, int *rate, i if( (*rate < 1000) || (*rate > 44100 )) { - fprintf( stderr, "%dHz are not supported on the GUS !\n", *rate ); - return 0; + fprintf( stderr, "%dHz are not supported on the GUS !\n", *rate ); + return 0; } uwGUSUsedFreq = *rate; @@ -430,30 +430,30 @@ int GUS_Init( int *dspbits, int *rate, i uwGUSPort = (UWORD)strtol( szGUSENVStr, (char **)NULL, 16 ); pz = strchr( szGUSENVStr, ',' ); if( (pz == 0) || (uwGUSPort ==0) ) - return 0; + return 0; ubGUSDMA1 = (UBYTE)atol( pz+1 ); pz = strchr( pz+1, ',' ); if( pz == 0 ) - return 0; + return 0; ubGUSDMA2 = (UBYTE)atol( pz+1 ); pz = strchr( pz+1, ',' ); if( pz == 0 ) - return 0; + return 0; ubGUSGF1Int = (UBYTE)atol( pz+1 ); if( ubGUSGF1Int == 0 ) - return 0; + return 0; pz = strchr( pz+1, ',' ); if( pz == 0 ) - return 0; + return 0; ubGUSMIDIInt = (UBYTE)atol( pz+1 ); if( ubGUSMIDIInt == 0 ) - return 0; + return 0; // Speicher fuer DMA holen @@ -479,8 +479,8 @@ int GUS_Init( int *dspbits, int *rate, i pGUSBuffer = (UBYTE *)malloc( ulGUSSndBufSize+1000 ); if( pGUSBuffer == 0 ) { - fprintf( stderr, "Cannot allocate soundbuffer !\n" ); - return 0; + fprintf( stderr, "Cannot allocate soundbuffer !\n" ); + return 0; } nGUSBufferWriteIndex = nGUSBufferReadIndex = 0; @@ -501,25 +501,25 @@ int GUS_Init( int *dspbits, int *rate, i WriteGUSb( GUS_DRAM, 0x15 ); delay( 100 ); if( ReadGUSb( GUS_DRAM ) != 0x15 ) // Bytes unterschiedlich ? - return 0; + return 0; // GUS-RAM loeschen j=-1; for( i=0; i<(int)(ulDMABufMaxSize*2+1000); i++ ) { - if( j != MSW(i) ) // Muss das Highword veraendert werden ? - { - j = MSW(i); - - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); - WriteGUSw( GUS_DATALO, MSW( i ) ); - } + if( j != MSW(i) ) // Muss das Highword veraendert werden ? + { + j = MSW(i); + + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); + WriteGUSw( GUS_DATALO, MSW( i ) ); + } - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); - WriteGUSw( GUS_DATALO, LSW( i ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); + WriteGUSw( GUS_DATALO, LSW( i ) ); - WriteGUSb( GUS_DRAM, 0 ); + WriteGUSb( GUS_DRAM, 0 ); } @@ -530,11 +530,11 @@ int GUS_Init( int *dspbits, int *rate, i pm_wrapperGF1.pm_offset = (int) GUS_GF1InterruptHandler; if(_go32_dpmi_allocate_iret_wrapper( &pm_wrapperGF1 ) ) { - fprintf( stderr, "Cannot allocate protected mode wrapper for GUS interrupt!\n"); - if( dmabufadr != 0 ) - _go32_dpmi_free_dos_memory( &dma_mem ); + fprintf( stderr, "Cannot allocate protected mode wrapper for GUS interrupt!\n"); + if( dmabufadr != 0 ) + _go32_dpmi_free_dos_memory( &dma_mem ); - return 0; + return 0; } @@ -548,13 +548,13 @@ int GUS_Init( int *dspbits, int *rate, i if( ubGUSGF1Int > 7 ) { - outportb( 0xA1, inportb( 0xA1 ) & ~(1 << ( ubGUSGF1Int-8 ) ) ); - outportb( 0xA0, 0x20 ); + outportb( 0xA1, inportb( 0xA1 ) & ~(1 << ( ubGUSGF1Int-8 ) ) ); + outportb( 0xA0, 0x20 ); } else { - outportb( 0x21, inportb( 0x21 ) & ~(1 << ubGUSGF1Int)); - outportb( 0x20, 0x20 ); + outportb( 0x21, inportb( 0x21 ) & ~(1 << ubGUSGF1Int)); + outportb( 0x20, 0x20 ); } @@ -584,17 +584,17 @@ int GUS_Init( int *dspbits, int *rate, i if( ubGUSUsedBits == 0 ) // 8 oder 16 Bit ? { - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen - WriteGUSw( GUS_DATALO, ADDR_HI( ulDMABufMaxSize+32 ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); - WriteGUSw( GUS_DATALO, ADDR_LO( ulDMABufMaxSize+32 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen + WriteGUSw( GUS_DATALO, ADDR_HI( ulDMABufMaxSize+32 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); + WriteGUSw( GUS_DATALO, ADDR_LO( ulDMABufMaxSize+32 ) ); } else { - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende - WriteGUSw( GUS_DATALO, ADDR_HI( CONVTO16B( ulDMABufMaxSize+32 ) ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); - WriteGUSw( GUS_DATALO, ADDR_LO( CONVTO16B( ulDMABufMaxSize+32 ) ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende + WriteGUSw( GUS_DATALO, ADDR_HI( CONVTO16B( ulDMABufMaxSize+32 ) ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); + WriteGUSw( GUS_DATALO, ADDR_LO( CONVTO16B( ulDMABufMaxSize+32 ) ) ); } WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); @@ -651,11 +651,11 @@ void GUS_Cleanup( void ) if( bDMAInProgress == TRUE ) { - do - { - delay( 10 ); - } - while( bDMAInProgress == TRUE ); + do + { + delay( 10 ); + } + while( bDMAInProgress == TRUE ); } @@ -681,9 +681,9 @@ void GUS_Cleanup( void ) // Interrupts wieder sperren if( ubGUSGF1Int > 7 ) - outportb (0xA1, inportb(0xA1) | (1 << (ubGUSGF1Int-8))); + outportb (0xA1, inportb(0xA1) | (1 << (ubGUSGF1Int-8))); else - outportb (0x21, inportb(0x21) | (1 << ubGUSGF1Int)); + outportb (0x21, inportb(0x21) | (1 << ubGUSGF1Int)); _go32_dpmi_set_protected_mode_interrupt_vector( ubGUSGF1IRQVector, &old_pmintGF1 ); _go32_dpmi_free_iret_wrapper( &pm_wrapperGF1 ); @@ -692,10 +692,10 @@ void GUS_Cleanup( void ) // Speicher freigeben if( pGUSBuffer != 0 ) - free( pGUSBuffer ); + free( pGUSBuffer ); if( dmabufadr != 0 ) - _go32_dpmi_free_dos_memory( &dma_mem ); // Speicher fuer DMA freigeben + _go32_dpmi_free_dos_memory( &dma_mem ); // Speicher fuer DMA freigeben GUS_Reset( 0, 0, 0 ); @@ -721,15 +721,15 @@ void GUS_PlayBuffer( void *buf, unsigned while( ulBytesInBuffer>ulDMABufMaxSize*2 ); /* { - fprintf( stderr, "Waiting ....(%ld,%X)\n", ulBytesInBuffer, &ulBytesInBuffer ); - fflush( stderr ); - j++; - if( j>50 ) - { - fprintf( stderr, "Breche ab ...\n" ); - fflush( stderr ); - break; - } + fprintf( stderr, "Waiting ....(%ld,%X)\n", ulBytesInBuffer, &ulBytesInBuffer ); + fflush( stderr ); + j++; + if( j>50 ) + { + fprintf( stderr, "Breche ab ...\n" ); + fflush( stderr ); + break; + } } */ @@ -739,40 +739,40 @@ void GUS_PlayBuffer( void *buf, unsigned if( size+ulBytesInBuffer>ulGUSSndBufSize ) { - if( bWarnFlag == TRUE ) - { - fprintf( stderr, "Error: GUS-soundbuffer overflow !\n" ); - nWarnCnt++; - if( nWarnCnt>MAXWARNS ) - { - bWarnFlag = FALSE; - fprintf( stderr, "GUS: No further messages !\n" ); - } - } + if( bWarnFlag == TRUE ) + { + fprintf( stderr, "Error: GUS-soundbuffer overflow !\n" ); + nWarnCnt++; + if( nWarnCnt>MAXWARNS ) + { + bWarnFlag = FALSE; + fprintf( stderr, "GUS: No further messages !\n" ); + } + } } else { - // GUS-Buffer fuellen + // GUS-Buffer fuellen - // Koennen wir auf einmal kopieren ? + // Koennen wir auf einmal kopieren ? - i = ulGUSSndBufSize-nGUSBufferWriteIndex; - if( i < size ) - { - memcpy( pGUSBuffer+nGUSBufferWriteIndex, buf, i ); + i = ulGUSSndBufSize-nGUSBufferWriteIndex; + if( i < size ) + { + memcpy( pGUSBuffer+nGUSBufferWriteIndex, buf, i ); - memcpy( pGUSBuffer, ((UBYTE*)buf)+i, size-i ); + memcpy( pGUSBuffer, ((UBYTE*)buf)+i, size-i ); - } - else - { - memcpy( pGUSBuffer+nGUSBufferWriteIndex, buf, size ); - } + } + else + { + memcpy( pGUSBuffer+nGUSBufferWriteIndex, buf, size ); + } - nGUSBufferWriteIndex = (nGUSBufferWriteIndex+size)&(ulGUSSndBufSize-1); + nGUSBufferWriteIndex = (nGUSBufferWriteIndex+size)&(ulGUSSndBufSize-1); - ulBytesInBuffer += size; + ulBytesInBuffer += size; } @@ -802,8 +802,8 @@ void GUS_StartDMA( ULONG ulPosInGUSRAM, if( bDMAInProgress == TRUE ) { - fprintf( stderr, "Error in StartDMA, DMA already im progress !\n" ); - return; + fprintf( stderr, "Error in StartDMA, DMA already im progress !\n" ); + return; } bDMAInProgress=TRUE; @@ -815,69 +815,69 @@ void GUS_StartDMA( ULONG ulPosInGUSRAM, if( ulBytesInBuffer == 0 ) // Sind ueberhaupt Daten im Puffer ? { // Nein, dann DMA-Buffer loeschen - pDMABuf = dmabufadr; + pDMABuf = dmabufadr; - if( ubGUSUsedBits == 0 ) // 8 Bit ? - ulTemp = 0x80808080UL; - else - ulTemp = 0; - - for( i=ulDMABufMaxSize/4; i>0; i-- ) - { - _farnspokel( pDMABuf, ulTemp ); - pDMABuf+=4; - } + if( ubGUSUsedBits == 0 ) // 8 Bit ? + ulTemp = 0x80808080UL; + else + ulTemp = 0; + + for( i=ulDMABufMaxSize/4; i>0; i-- ) + { + _farnspokel( pDMABuf, ulTemp ); + pDMABuf+=4; + } } else { - if( ulBytesInBuffer >= ulDMABufMaxSize ) // Sind mehr Daten da, als - { // der Puffer gross ist ? + if( ulBytesInBuffer >= ulDMABufMaxSize ) // Sind mehr Daten da, als + { // der Puffer gross ist ? - pDMABuf = dmabufadr; // Ja, DMA-Puffer vollmachen + pDMABuf = dmabufadr; // Ja, DMA-Puffer vollmachen - j = nGUSBufferReadIndex; - for( i=ulDMABufMaxSize/4; i>0; i-- ) - { - _farnspokel( pDMABuf, *((ULONG*)(pGUSBuffer+j)) ); // 32 bit-copy - pDMABuf+=4; - j = (j+4)&(ulGUSSndBufSize-1); - } - - nGUSBufferReadIndex = (nGUSBufferReadIndex+ulDMABufMaxSize)&(ulGUSSndBufSize-1); - - ulBytesInBuffer -= ulDMABufMaxSize; - } - else - { - pDMABuf = dmabufadr; // Nein, nur den vorhanden Teil - // kopieren - - j = nGUSBufferReadIndex; - for( i=ulBytesInBuffer/4; i>0; i-- ) - { - _farnspokel( pDMABuf, *((ULONG*)(pGUSBuffer+j)) ); - pDMABuf+=4; - j = (j+4)&(ulGUSSndBufSize-1); - } - nGUSBufferReadIndex = (nGUSBufferReadIndex+ulBytesInBuffer)&(ulGUSSndBufSize-1); - - - if( ubGUSUsedBits == 0 ) // 8 Bit ? - ulTemp = 0x80808080UL; - else - ulTemp = 0; - - - for( i=(ulDMABufMaxSize-ulBytesInBuffer)/4; i>0; i-- ) - { - _farnspokel( pDMABuf, ulTemp ); - pDMABuf+=4; - } + j = nGUSBufferReadIndex; + for( i=ulDMABufMaxSize/4; i>0; i-- ) + { + _farnspokel( pDMABuf, *((ULONG*)(pGUSBuffer+j)) ); // 32 bit-copy + pDMABuf+=4; + j = (j+4)&(ulGUSSndBufSize-1); + } + + nGUSBufferReadIndex = (nGUSBufferReadIndex+ulDMABufMaxSize)&(ulGUSSndBufSize-1); + + ulBytesInBuffer -= ulDMABufMaxSize; + } + else + { + pDMABuf = dmabufadr; // Nein, nur den vorhanden Teil + // kopieren + + j = nGUSBufferReadIndex; + for( i=ulBytesInBuffer/4; i>0; i-- ) + { + _farnspokel( pDMABuf, *((ULONG*)(pGUSBuffer+j)) ); + pDMABuf+=4; + j = (j+4)&(ulGUSSndBufSize-1); + } + nGUSBufferReadIndex = (nGUSBufferReadIndex+ulBytesInBuffer)&(ulGUSSndBufSize-1); + + + if( ubGUSUsedBits == 0 ) // 8 Bit ? + ulTemp = 0x80808080UL; + else + ulTemp = 0; + + + for( i=(ulDMABufMaxSize-ulBytesInBuffer)/4; i>0; i-- ) + { + _farnspokel( pDMABuf, ulTemp ); + pDMABuf+=4; + } - ulBytesInBuffer = 0; - } + ulBytesInBuffer = 0; + } } @@ -885,37 +885,37 @@ void GUS_StartDMA( ULONG ulPosInGUSRAM, if( bLoop == TRUE ) // Byte/Word kopieren, um das Geklicke zu verhindern { - if( ubGUSUsedBits == 0 ) // 8 Bit ? - { + if( ubGUSUsedBits == 0 ) // 8 Bit ? + { - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); - WriteGUSw( GUS_DATALO, MSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); + WriteGUSw( GUS_DATALO, MSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); - WriteGUSw( GUS_DATALO, LSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); + WriteGUSw( GUS_DATALO, LSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); - WriteGUSb( GUS_DRAM, _farnspeekb( dmabufadr+ulDMABufMaxSize-1 )+0x80 ); + WriteGUSb( GUS_DRAM, _farnspeekb( dmabufadr+ulDMABufMaxSize-1 )+0x80 ); - } - else - { - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); - WriteGUSw( GUS_DATALO, MSW( ulPosInGUSRAM-ulDMABufMaxSize-2 ) ); + } + else + { + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); + WriteGUSw( GUS_DATALO, MSW( ulPosInGUSRAM-ulDMABufMaxSize-2 ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); - WriteGUSw( GUS_DATALO, LSW( ulPosInGUSRAM-ulDMABufMaxSize-2 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); + WriteGUSw( GUS_DATALO, LSW( ulPosInGUSRAM-ulDMABufMaxSize-2 ) ); - WriteGUSb( GUS_DRAM, _farnspeekb( dmabufadr+ulDMABufMaxSize-2 ) ); + WriteGUSb( GUS_DRAM, _farnspeekb( dmabufadr+ulDMABufMaxSize-2 ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); - WriteGUSw( GUS_DATALO, MSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRHI ); + WriteGUSw( GUS_DATALO, MSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); - WriteGUSw( GUS_DATALO, LSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMIOADRLO ); + WriteGUSw( GUS_DATALO, LSW( ulPosInGUSRAM-ulDMABufMaxSize-1 ) ); - WriteGUSb( GUS_DRAM, _farnspeekb( dmabufadr+ulDMABufMaxSize-1 ) ); + WriteGUSb( GUS_DRAM, _farnspeekb( dmabufadr+ulDMABufMaxSize-1 ) ); - } + } } @@ -926,37 +926,37 @@ void GUS_StartDMA( ULONG ulPosInGUSRAM, // GUS-Register initialisieren WriteGUSb( GUS_COMMAND, GUS_CMD_DMASTARTADR ); if( ubGUSDMA1>3 ) - WriteGUSw( GUS_DATALO, CONVTO16B(ulPosInGUSRAM>>4) ); // Adresse>>4 !!!! + WriteGUSw( GUS_DATALO, CONVTO16B(ulPosInGUSRAM>>4) ); // Adresse>>4 !!!! else - WriteGUSw( GUS_DATALO, (UWORD)(ulPosInGUSRAM>>4) ); // Adresse>>4 !!!! + WriteGUSw( GUS_DATALO, (UWORD)(ulPosInGUSRAM>>4) ); // Adresse>>4 !!!! if( ubGUSUsedBits == 0 ) { // 8 Bit - if( ubGUSDMA1>3 ) - { - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); - WriteGUSb( GUS_DATAHI, 0x85 | 0x20 ); // Mit signed->unsigned kopieren - - } - else - { - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); - WriteGUSb( GUS_DATAHI, 0x81 | 0x20 ); - } + if( ubGUSDMA1>3 ) + { + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); + WriteGUSb( GUS_DATAHI, 0x85 | 0x20 ); // Mit signed->unsigned kopieren + + } + else + { + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); + WriteGUSb( GUS_DATAHI, 0x81 | 0x20 ); + } } else { // 16 Bit - if( ubGUSDMA1>3 ) - { - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); - WriteGUSb( GUS_DATAHI, 0x05 | 0x20 ); // Ohne signed->unsigned kopieren - - } - else - { - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); - WriteGUSb( GUS_DATAHI, 0x01 | 0x20 ); - } + if( ubGUSDMA1>3 ) + { + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); + WriteGUSb( GUS_DATAHI, 0x05 | 0x20 ); // Ohne signed->unsigned kopieren + + } + else + { + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); + WriteGUSb( GUS_DATAHI, 0x01 | 0x20 ); + } } @@ -987,168 +987,168 @@ void GUS_WorkOnVoices( void ) { - WriteGUSb( GUS_COMMAND, GUS_CMD_IRQSOURCER ); // IRQ-Art holen - ubIntArt = ReadGUSb( GUS_DATAHI ); + WriteGUSb( GUS_COMMAND, GUS_CMD_IRQSOURCER ); // IRQ-Art holen + ubIntArt = ReadGUSb( GUS_DATAHI ); - nVoice = ubIntArt & 0x1f; - nVoiceBit = ((ULONG)1)<<((ULONG)nVoice); + nVoice = ubIntArt & 0x1f; + nVoiceBit = ((ULONG)1)<<((ULONG)nVoice); - // Alle Interrupts abgearbeitet ? - if( ( ubIntArt & 192) == 192 ) // Negative Logik !!!! - { - break; - } - - nIntCounts++; - - if( nIntCounts>3 ) - { - #ifdef DEBUG - fprintf( stderr, "!!!! Breche Int. ab, da mehr als 3 Anfragen !!!\n" ); - #endif - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); - WriteGUSb( GUS_DATAHI, 3 ); - GUS_GF1Delay(); - WriteGUSb( GUS_DATAHI, 3 ); - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); - WriteGUSb( GUS_DATAHI, 3 ); - GUS_GF1Delay(); - WriteGUSb( GUS_DATAHI, 3 ); - - return; - } - - if( bIgnoreGF1IRQ == TRUE ) - { - #ifdef DEBUG - fprintf( stderr, "\t\tIgnoriere IRQ !\n" ); - #endif - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); - WriteGUSb( GUS_DATAHI, 3 ); // Loop aus, IRQ aus - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); - WriteGUSb( GUS_DATAHI, 3 ); // Rollover an, IRQ an - } - - #ifdef DEBUG - fprintf( stderr, "\tBearbeite Stimme %d, IntArt: $%X\n", nVoice, ubIntArt ); - #endif - - if( ! (ubIntArt & 128 ) ) // WAVE-Table-IRQ ? - { - if( !(nWaveIgnore & nVoiceBit )) - { - nWaveIgnore |= nVoiceBit; - - #ifdef DEBUG - fprintf( stderr,"\t\tBearbeite WAVE-IRQ\n" ); - #endif - - WriteGUSb( GUS_VOICE, nVoice ); - WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLR ); - ubTemp1 = ReadGUSb( GUS_DATAHI ); - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLR ); - ubTemp2 = ReadGUSb( GUS_DATAHI ); - - - if( ubTemp2&4 ) // Ist das Rollover an ? - { // Ja - - // Das Ende neu setzen - - if( ubGUSUsedBits == 0 ) // 8 Bit ? - { - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen - WriteGUSw( GUS_DATALO, ADDR_HI( ulDMABufMaxSize*2+32 ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); - WriteGUSw( GUS_DATALO, ADDR_LO( ulDMABufMaxSize*2+32 ) ); - } - else - { - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen - WriteGUSw( GUS_DATALO, ADDR_HI( CONVTO16B( ulDMABufMaxSize*2+32 ) ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); - WriteGUSw( GUS_DATALO, ADDR_LO( CONVTO16B( ulDMABufMaxSize*2+32 ) ) ); - } - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); - WriteGUSb( GUS_DATAHI, 3 ); - GUS_GF1Delay(); - WriteGUSb( GUS_DATAHI, 3 ); // Rollover aus - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); - WriteGUSb( GUS_DATAHI, 32|8|ubGUSUsedBits ); - GUS_GF1Delay(); - WriteGUSb( GUS_DATAHI, 32|8|ubGUSUsedBits ); // Loop an - - GUS_StartDMA( 32, FALSE ); - - } - else - { - - // Das Ende neu setzen - - if( ubGUSUsedBits == 0 ) - { - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen - WriteGUSw( GUS_DATALO, ADDR_HI( ulDMABufMaxSize+32 ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); - WriteGUSw( GUS_DATALO, ADDR_LO( ulDMABufMaxSize+32 ) ); - } - else - { - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen - WriteGUSw( GUS_DATALO, ADDR_HI( CONVTO16B( ulDMABufMaxSize+32 ) ) ); - WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); - WriteGUSw( GUS_DATALO, ADDR_LO( CONVTO16B( ulDMABufMaxSize+32 ) ) ); - } - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); - WriteGUSb( GUS_DATAHI, 3|4 ); - GUS_GF1Delay(); - WriteGUSb( GUS_DATAHI, 3|4 ); // Rollover an - - WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); - WriteGUSb( GUS_DATAHI, 32|ubGUSUsedBits ); - GUS_GF1Delay(); - WriteGUSb( GUS_DATAHI, 32|ubGUSUsedBits ); // Loop aus - - GUS_StartDMA( ulDMABufMaxSize+32, TRUE ); - - } - - } - } - - if( ! (ubIntArt & 64 ) ) // Volume-IRQ - { - - if( !(nVolumeIgnore & nVoiceBit )) - { - nVolumeIgnore |= nVoiceBit; - #ifdef DEBUG - fprintf( stderr, "\t\tBearbeite Volume-IRQ\n" ); - #endif - - WriteGUSb( GUS_VOICE, nVoice ); - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLR ); - ubTemp2 = ReadGUSb( GUS_DATAHI ); - - WriteGUSb(GUS_COMMAND, GUS_CMD_VOICECTRLR ); - ubTemp1 = ReadGUSb( GUS_DATAHI ); + // Alle Interrupts abgearbeitet ? + if( ( ubIntArt & 192) == 192 ) // Negative Logik !!!! + { + break; + } + + nIntCounts++; + + if( nIntCounts>3 ) + { + #ifdef DEBUG + fprintf( stderr, "!!!! Breche Int. ab, da mehr als 3 Anfragen !!!\n" ); + #endif + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); + WriteGUSb( GUS_DATAHI, 3 ); + GUS_GF1Delay(); + WriteGUSb( GUS_DATAHI, 3 ); + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); + WriteGUSb( GUS_DATAHI, 3 ); + GUS_GF1Delay(); + WriteGUSb( GUS_DATAHI, 3 ); + + return; + } + + if( bIgnoreGF1IRQ == TRUE ) + { + #ifdef DEBUG + fprintf( stderr, "\t\tIgnoriere IRQ !\n" ); + #endif + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); + WriteGUSb( GUS_DATAHI, 3 ); // Loop aus, IRQ aus + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); + WriteGUSb( GUS_DATAHI, 3 ); // Rollover an, IRQ an + } + + #ifdef DEBUG + fprintf( stderr, "\tBearbeite Stimme %d, IntArt: $%X\n", nVoice, ubIntArt ); + #endif + + if( ! (ubIntArt & 128 ) ) // WAVE-Table-IRQ ? + { + if( !(nWaveIgnore & nVoiceBit )) + { + nWaveIgnore |= nVoiceBit; + + #ifdef DEBUG + fprintf( stderr,"\t\tBearbeite WAVE-IRQ\n" ); + #endif + + WriteGUSb( GUS_VOICE, nVoice ); + WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLR ); + ubTemp1 = ReadGUSb( GUS_DATAHI ); + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLR ); + ubTemp2 = ReadGUSb( GUS_DATAHI ); + + + if( ubTemp2&4 ) // Ist das Rollover an ? + { // Ja + + // Das Ende neu setzen + + if( ubGUSUsedBits == 0 ) // 8 Bit ? + { + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen + WriteGUSw( GUS_DATALO, ADDR_HI( ulDMABufMaxSize*2+32 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); + WriteGUSw( GUS_DATALO, ADDR_LO( ulDMABufMaxSize*2+32 ) ); + } + else + { + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen + WriteGUSw( GUS_DATALO, ADDR_HI( CONVTO16B( ulDMABufMaxSize*2+32 ) ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); + WriteGUSw( GUS_DATALO, ADDR_LO( CONVTO16B( ulDMABufMaxSize*2+32 ) ) ); + } + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); + WriteGUSb( GUS_DATAHI, 3 ); + GUS_GF1Delay(); + WriteGUSb( GUS_DATAHI, 3 ); // Rollover aus + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); + WriteGUSb( GUS_DATAHI, 32|8|ubGUSUsedBits ); + GUS_GF1Delay(); + WriteGUSb( GUS_DATAHI, 32|8|ubGUSUsedBits ); // Loop an + + GUS_StartDMA( 32, FALSE ); + + } + else + { + + // Das Ende neu setzen + + if( ubGUSUsedBits == 0 ) + { + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen + WriteGUSw( GUS_DATALO, ADDR_HI( ulDMABufMaxSize+32 ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); + WriteGUSw( GUS_DATALO, ADDR_LO( ulDMABufMaxSize+32 ) ); + } + else + { + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDHIW ); // Ende setzen + WriteGUSw( GUS_DATALO, ADDR_HI( CONVTO16B( ulDMABufMaxSize+32 ) ) ); + WriteGUSb( GUS_COMMAND, GUS_CMD_ENDLOW ); + WriteGUSw( GUS_DATALO, ADDR_LO( CONVTO16B( ulDMABufMaxSize+32 ) ) ); + } + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); + WriteGUSb( GUS_DATAHI, 3|4 ); + GUS_GF1Delay(); + WriteGUSb( GUS_DATAHI, 3|4 ); // Rollover an + + WriteGUSb( GUS_COMMAND, GUS_CMD_VOICECTRLW ); + WriteGUSb( GUS_DATAHI, 32|ubGUSUsedBits ); + GUS_GF1Delay(); + WriteGUSb( GUS_DATAHI, 32|ubGUSUsedBits ); // Loop aus + + GUS_StartDMA( ulDMABufMaxSize+32, TRUE ); + + } + + } + } + + if( ! (ubIntArt & 64 ) ) // Volume-IRQ + { + + if( !(nVolumeIgnore & nVoiceBit )) + { + nVolumeIgnore |= nVoiceBit; + #ifdef DEBUG + fprintf( stderr, "\t\tBearbeite Volume-IRQ\n" ); + #endif + + WriteGUSb( GUS_VOICE, nVoice ); + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLR ); + ubTemp2 = ReadGUSb( GUS_DATAHI ); + + WriteGUSb(GUS_COMMAND, GUS_CMD_VOICECTRLR ); + ubTemp1 = ReadGUSb( GUS_DATAHI ); - WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); - WriteGUSb( GUS_DATAHI, (ubTemp2 & (~32)) | 3 ); + WriteGUSb( GUS_COMMAND, GUS_CMD_VOLUMECTRLW ); + WriteGUSb( GUS_DATAHI, (ubTemp2 & (~32)) | 3 ); - } + } - } + } } } @@ -1173,7 +1173,7 @@ void GUS_GF1InterruptHandler( void ) if( uwGUSPort == 0 ) - return; + return; #ifdef DEBUG fprintf( stderr, "- Interrupt aufgetreten. Zeit: %lf\n", ((double)clock())/((double)CLOCKS_PER_SEC) ); @@ -1182,94 +1182,94 @@ void GUS_GF1InterruptHandler( void ) for(;;) { - ubIntArt = ReadGUSb( GUS_IRQSTATE ); + ubIntArt = ReadGUSb( GUS_IRQSTATE ); - #ifdef DEBUG - fprintf( stderr, " IRQ-Status (2x6): $%X\n", ubIntArt ); - #endif + #ifdef DEBUG + fprintf( stderr, " IRQ-Status (2x6): $%X\n", ubIntArt ); + #endif - if( ubIntArt == 0 ) // Fertig ? - break; + if( ubIntArt == 0 ) // Fertig ? + break; - if( ubIntArt & 128 ) // TC-IRQ ? - { + if( ubIntArt & 128 ) // TC-IRQ ? + { - WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); - if( ReadGUSb( GUS_DATAHI ) & 0x40 ) - { - #ifdef DEBUG - fprintf( stderr, " - Bearbeite DMA-Interrupt\n" ); - #endif + WriteGUSb( GUS_COMMAND, GUS_CMD_DRAMDMACTRL ); + if( ReadGUSb( GUS_DATAHI ) & 0x40 ) + { + #ifdef DEBUG + fprintf( stderr, " - Bearbeite DMA-Interrupt\n" ); + #endif - bDMAInProgress = FALSE; + bDMAInProgress = FALSE; - } + } - WriteGUSb( GUS_COMMAND, GUS_CMD_SAMPLECTRL ); - if( ReadGUSb( GUS_DATAHI ) & 0x40 ) - { - #ifdef DEBUG - fprintf( stderr, " - Bearbeite Sample-Interrupt\n" ); - #endif + WriteGUSb( GUS_COMMAND, GUS_CMD_SAMPLECTRL ); + if( ReadGUSb( GUS_DATAHI ) & 0x40 ) + { + #ifdef DEBUG + fprintf( stderr, " - Bearbeite Sample-Interrupt\n" ); + #endif - } + } - } + } - if( ubIntArt & 3 ) - { - #ifdef DEBUG - fprintf( stderr, " - Bearbeite MIDI-IRQ\n" ); - #endif + if( ubIntArt & 3 ) + { + #ifdef DEBUG + fprintf( stderr, " - Bearbeite MIDI-IRQ\n" ); + #endif - } + } - if( ubIntArt & 64 ) - { - #ifdef DEBUG - fprintf( stderr, " - Bearbeite VOLUME-IRQ\n" ); - #endif - GUS_WorkOnVoices(); + if( ubIntArt & 64 ) + { + #ifdef DEBUG + fprintf( stderr, " - Bearbeite VOLUME-IRQ\n" ); + #endif + GUS_WorkOnVoices(); - } + } - if( ubIntArt & 32 ) - { - #ifdef DEBUG - fprintf( stderr, " - Bearbeite WAVETABLE-IRQ\n" ); - #endif - GUS_WorkOnVoices(); + if( ubIntArt & 32 ) + { + #ifdef DEBUG + fprintf( stderr, " - Bearbeite WAVETABLE-IRQ\n" ); + #endif + GUS_WorkOnVoices(); - } + } - if( ubIntArt & 4 ) // Timer 1? - { - #ifdef DEBUG - fprintf( stderr, " - Bearbeite Timer 1-IRQ\n" ); - #endif + if( ubIntArt & 4 ) // Timer 1? + { + #ifdef DEBUG + fprintf( stderr, " - Bearbeite Timer 1-IRQ\n" ); + #endif - WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); - ubTemp = ReadGUSb( GUS_DATAHI ); + WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); + ubTemp = ReadGUSb( GUS_DATAHI ); - WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); - WriteGUSb( GUS_DATAHI, ubTemp & (~4) ); // Timer 1 aus - } + WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); + WriteGUSb( GUS_DATAHI, ubTemp & (~4) ); // Timer 1 aus + } - if( ubIntArt & 8 ) // Timer 2? - { - #ifdef DEBUG - fprintf( stderr, " - Bearbeite Timer 2-IRQ\n" ); - #endif + if( ubIntArt & 8 ) // Timer 2? + { + #ifdef DEBUG + fprintf( stderr, " - Bearbeite Timer 2-IRQ\n" ); + #endif - WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); - ubTemp = ReadGUSb( GUS_DATAHI ); + WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); + ubTemp = ReadGUSb( GUS_DATAHI ); - WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); - WriteGUSb( GUS_DATAHI, ubTemp & (~8) ); // Timer 2 aus - } + WriteGUSb( GUS_COMMAND, GUS_CMD_TIMERCTRL ); + WriteGUSb( GUS_DATAHI, ubTemp & (~8) ); // Timer 2 aus + } } #ifdef DEBUG @@ -1277,7 +1277,7 @@ void GUS_GF1InterruptHandler( void ) #endif if( ubGUSGF1Int > 7 ) - outportb( 0xA0, 0x20 ); + outportb( 0xA0, 0x20 ); outportb( 0x20, 0x20 );