Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

851 lines
18 KiB

//***************************************************************************
// Audio decoder process
//
//***************************************************************************
#include "common.h"
#include "regs.h"
#include "cadec.h"
#include "zrnpch6.h"
#include "cdack.h"
void ADecoder::init( const PDEVICE_INIT_INFO pDevInit )
{
ioBase = pDevInit->ioBase;
// shoud be remove when release
// ASSERT( sizeof(ZRN_AC3_DEC) == 3891 );
// ASSERT( sizeof(ZRN_AC3_SPD) == 410 );
// ASSERT( sizeof(ZRN_PCM) == 6965 );
}
void ADecoder::SetParam( ULONG aMode, ULONG aFreq, ULONG aType, BOOL aCgms, Dack *pDak )
{
AudioMode = aMode;
AudioFreq = aFreq;
AudioType = aType;
AudioCgms = ( 0<=aCgms && aCgms<=3 ) ? aCgms : 3;
pDack = pDak;
}
// ***************************************************************************
// T C 6 8 0 0 A F
// ***************************************************************************
void ADecoder::AUDIO_TC6800_INIT_PCM()
{
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0xa0 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x80 );
}
void ADecoder::AUDIO_TC6800_INIT_AC3()
{
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x20 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
}
void ADecoder::AUDIO_TC6800_INIT_MPEG()
{
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x20 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
}
void ADecoder::AUDIO_TC6800_DATA_OFF()
{
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x66 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x60 );
}
// ***************************************************************************
// Z R 3 8 5 2 1
// ***************************************************************************
void ADecoder::AUDIO_ZR385_OUT( UCHAR val )
{
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x08 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, val );
// necessary?
pDack->PCIF_CHECK_SERIAL();
}
void ADecoder::AUDIO_ZR385_DOWNLOAD( PUCHAR pData, ULONG size )
{
ULONG i;
for( i = 0; i < size; i++ )
AUDIO_ZR385_OUT( *pData++ );
}
void ADecoder::AUDIO_ZR38521_BOOT_AC3()
{
AUDIO_ZR385_DOWNLOAD( ZRN_AC3_DEC, sizeof(ZRN_AC3_DEC) );
if( AudioType == AUDIO_OUT_DIGITAL )
AUDIO_ZR385_DOWNLOAD( ZRN_AC3_SPD, sizeof(ZRN_AC3_SPD) );
}
void ADecoder::AUDIO_ZR38521_BOOT_MPEG()
{
// not support!
}
void ADecoder::AUDIO_ZR38521_BOOT_PCM()
{
AUDIO_ZR385_DOWNLOAD( ZRN_PCM, sizeof(ZRN_PCM) );
}
NTSTATUS ADecoder::AUDIO_ZR38521_CFG()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x82 );
AUDIO_ZR385_OUT( 0x50 );
AUDIO_ZR385_OUT( 0x40 );
AUDIO_ZR385_OUT( 0x09 );
AUDIO_ZR385_OUT( 0x09 );
if( AudioType == AUDIO_OUT_DIGITAL )
AUDIO_ZR385_OUT( 0x70 );
else
AUDIO_ZR385_OUT( 0x50 );
AUDIO_ZR385_OUT( 0x02 );
AUDIO_ZR385_OUT( 0x02 );
AUDIO_ZR385_OUT( 0x04 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_PCMX()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x88 );
AUDIO_ZR385_OUT( 0x81 );
AUDIO_ZR385_OUT( 0x82 );
AUDIO_ZR385_OUT( 0x7f );
AUDIO_ZR385_OUT( 0xff );
AUDIO_ZR385_OUT( 0x01 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_AC3()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x85 );
AUDIO_ZR385_OUT( 0x08 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x7f );
AUDIO_ZR385_OUT( 0x7f );
AUDIO_ZR385_OUT( 0x11 );
AUDIO_ZR385_OUT( 0x7f );
AUDIO_ZR385_OUT( 0xff );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_MPEG1()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x87 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x7f );
AUDIO_ZR385_OUT( 0xff );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_PLAY()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x8a );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_MUTE_OFF()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x89 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_MUTE_ON()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x8b );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_STOP()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x8c );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_STOPF()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x8d );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_STCR()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x94 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x03 );
AUDIO_ZR385_OUT( 0xf6 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x01 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_VDSCR_ON( ULONG stc )
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x93 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x03 );
AUDIO_ZR385_OUT( 0xf4 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x02 );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0xfb );
AUDIO_ZR385_OUT( 0xc8 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_VDSCR_OFF( ULONG stc )
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x93 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x03 );
AUDIO_ZR385_OUT( 0xf4 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x02 );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0xfb );
AUDIO_ZR385_OUT( 0xc8 );
AUDIO_ZR385_OUT( 0x80 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_AVSYNC_OFF( ULONG stc )
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x93 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x03 );
AUDIO_ZR385_OUT( 0xf4 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x02 );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0xfb );
AUDIO_ZR385_OUT( 0xc8 );
AUDIO_ZR385_OUT( 0xc0 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_AVSYNC_ON( ULONG stc )
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x93 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x03 );
AUDIO_ZR385_OUT( 0xf4 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x02 );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 25 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 17 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 9 ) & 0xff ) );
AUDIO_ZR385_OUT( (UCHAR)( ( stc >> 1 ) & 0xff ) );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0xfb );
AUDIO_ZR385_OUT( 0xc8 );
AUDIO_ZR385_OUT( 0x40 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_STAT( PULONG pDiff )
{
UCHAR val;
if( pDiff == NULL )
return STATUS_UNSUCCESSFUL;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 ) {
*pDiff = 0x0908;
return STATUS_UNSUCCESSFUL;
}
*pDiff = 0;
AUDIO_ZR385_OUT( 0x8e );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
// Check DIFTH
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
*pDiff |= (ULONG)val << 8;
AUDIO_ZR385_OUT( 0x00 );
// Check DIFTL
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
*pDiff |= val & 0xff;
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
NTSTATUS ADecoder::AUDIO_ZR38521_KCOEF()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 )
return STATUS_UNSUCCESSFUL;
AUDIO_ZR385_OUT( 0x93 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x03 );
AUDIO_ZR385_OUT( 0xf0 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x03 );
AUDIO_ZR385_OUT( 0x7f );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x59 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x7f );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x59 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
void ADecoder::AUDIO_ZR38521_REPEAT_02()
{
AUDIO_ZR385_OUT( 0x93 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x01 );
AUDIO_ZR385_OUT( 0xc3 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x01 );
AUDIO_ZR385_OUT( 0x13 );
AUDIO_ZR385_OUT( 0xfb );
AUDIO_ZR385_OUT( 0xd0 );
AUDIO_ZR385_OUT( 0x44 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
}
void ADecoder::AUDIO_ZR38521_REPEAT_16()
{
AUDIO_ZR385_OUT( 0x93 );
AUDIO_ZR385_OUT( 0x0d );
AUDIO_ZR385_OUT( 0x01 );
AUDIO_ZR385_OUT( 0xc3 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x01 );
AUDIO_ZR385_OUT( 0x13 );
AUDIO_ZR385_OUT( 0xfb );
AUDIO_ZR385_OUT( 0xd3 );
AUDIO_ZR385_OUT( 0xc4 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
}
NTSTATUS ADecoder::AUDIO_ZR38521_BFST( PULONG pErrCode )
{
UCHAR val;
if( pErrCode == NULL )
return STATUS_UNSUCCESSFUL;
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
if( val != 0x80 ) {
*pErrCode = 0x0908;
return STATUS_UNSUCCESSFUL;
}
*pErrCode = 0;
AUDIO_ZR385_OUT( 0x8e );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
// Check IST
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
val &= 0x07;
*pErrCode |= (ULONG)val << 8;
AUDIO_ZR385_OUT( 0x00 );
// Check BFST
pDack->PCIF_CHECK_SERIAL();
val = READ_PORT_UCHAR( ioBase + PCIF_SR );
val &= 0x07;
*pErrCode |= val;
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
AUDIO_ZR385_OUT( 0x00 );
return STATUS_SUCCESS;
}
// ***************************************************************************
// T C 9 4 2 5 F
// ***************************************************************************
void ADecoder::AUDIO_TC9425_INIT_DIGITAL()
{
UCHAR val;
val = 0;
if( AudioType != AUDIO_OUT_ANALOG )
if( AudioMode == AUDIO_TYPE_AC3 )
val |= 0x40;
if( (AudioCgms & 0x02) == 0x00 ) {
val |= 0x20; // Copying is permitted without restriction
DebugPrint( ( DebugLevelTrace, "TOSDVD: AUDIO Copy OK\r\n" ) );
}
else {
val &= 0xDF; // Basically no copying is permitted (depend on L-Bit below)
DebugPrint( ( DebugLevelTrace, "TOSDVD: AUDIO Copy NG\r\n" ) );
}
// COPY, EMPH
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, val );
if( (AudioCgms & 0x01) == 0x00 ) {
val = 0x98; // L-Bit==0; One generation of copies may be made
DebugPrint( ( DebugLevelTrace, "TOSDVD: AUDIO 1 Time Copy OK\r\n" ) );
}
else {
val = 0x99; // L-Bit==1; No copying is permitted
DebugPrint( ( DebugLevelTrace, "TOSDVD: AUDIO 1 Time Copy NG\r\n" ) );
}
// Category Code, LBIT
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, val );
// Channel Num
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
if( AudioFreq == AUDIO_FS_32 )
val = 0xc0;
else if( AudioFreq == AUDIO_FS_44 )
val = 0x00;
else if( AudioFreq == AUDIO_FS_48 )
val = 0x40;
else
val = 0x40;
// FS1, FS2, CKA1, CKA2
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, val );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
}
void ADecoder::AUDIO_TC9425_INIT_ANALOG()
{
UCHAR val;
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
// MONO, CHS, EM, EMP
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0xc0 );
//
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
if( AudioType == AUDIO_OUT_DIGITAL )
val = 0x79;
else
val = 0x69;
if( AudioFreq == AUDIO_FS_96 )
val |= 0x04;
else if( AudioFreq == AUDIO_FS_48 )
val |= 0x04;
// BIT, DOIN, DOSEL, IFSEL, RLS
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, val );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0xc0 );
AUDIO_TC9425_SET_VOLUME( AudioVolume );
}
void ADecoder::AUDIO_TC9425_SET_VOLUME( ULONG vol )
{
UCHAR ucvol;
AudioVolume = vol;
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x00 );
ucvol = (UCHAR)vol;
ucvol = INVERSE_BYTE( ucvol );
ucvol = (UCHAR)( ucvol >> 1 );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x38 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, ucvol );
pDack->PCIF_CHECK_SERIAL();
WRITE_PORT_UCHAR( ioBase + PCIF_SCNT, 0x72 );
WRITE_PORT_UCHAR( ioBase + PCIF_SW, 0x40 );
}
UCHAR ADecoder::INVERSE_BYTE( UCHAR uc )
{
ULONG i;
UCHAR retch = 0;
for( i = 0; i < 8; i++ )
retch |= ( uc & 0x01 ) << ( 7 - i );
return retch;
}