//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // MODULE : ZAC3.C // PURPOSE : Zoran AC3 specific code // AUTHOR : JBS Yadawa // CREATED : 7/20/96 // // // Copyright (C) 1996 SGS-THOMSON Microelectronics // // // REVISION HISTORY: // ----------------- // // DATE : COMMENTS // ---- : -------- // // 12-28-96 : AC3 structure added - JBS // 1-1-97 : use of status bit to figure out access to ABB - JBS // 1-15-97 : Added BypassMode and normal mode - JBS // 3-18-97 : Added Error handling for AC3 - JBS // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include "strmini.h" #include "stdefs.h" #include "board.h" #include "i20reg.h" #include "bt856.h" #include "memio.h" #include "zac3.h" #include "sti3520a.h" #include "hwcodec.h" #include "ksmedia.h" #define POSTOFFICEREG 0x200 #define SPIDO 0x07 #define SPIDI 0x06 #define SPICLK 0x05 #define SPIENA 0x04 #define PARAMSIZE 9 //extern PCODEC pCodec; static void NEARAPI Ac3SPIStart(void); static void NEARAPI Ac3SPIStop(void); static BYTE NEARAPI Ac3SPISendByte(BYTE data); static BYTE NEARAPI Ac3SPISendSeq(short Num, BYTE FAR *Data); void NEARAPI Ac3SPIReadBack(BYTE command, short numresult, BYTE *result); static void NEARAPI Ac3Command(BYTE command); #define MINABL 40 extern ULONG audiodecoutmode; extern PVIDEO pVideo; // static variables only used here static AC3 Ac3; PAC3 pAc3; /* * Only one of the followng two lines must be in at one time */ // The next line will give you AC3 decode downmixed to stereo out ... BYTE CfgParams[PARAMSIZE] = {AC3_CFG, 0xD0,0x08,0x89,0x09,0x14,0x02,0x02,0x06}; BYTE CfgParamsBypass[PARAMSIZE] = {AC3_CFG, 0xD0,0x08,0x89,0x09,0x34,0x02,0x02,0x06}; // The next line will give you SPDIF AC3 undecode pass through //BYTE CfgParams[PARAMSIZE] = {AC3_CFG, 0xD0,0x08,0x89,0x09,0x34,0x02,0x02,0x06}; BYTE AC3Params[PARAMSIZE] = {AC3_AC3, 0x10,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF}; #define ZCODE_SIZE 3789 static Zcode[ZCODE_SIZE] = { 0x90, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xB8, 0x0C, 0x00, 0x00, 0xB0, 0x3C, 0x36, 0xDE, 0x00, 0x42, 0x38, 0x0D, 0x00, 0x05, 0x32, 0x10, 0x0F, 0xF5, 0x34, 0x20, 0x0F, 0xFA, 0x30, 0x2D, 0x03, 0xEC, 0x00, 0x50, 0x00, 0x00, 0x3C, 0x1D, 0x00, 0x35, 0x34, 0x00, 0x0D, 0xC6, 0x2C, 0x30, 0x00, 0x07, 0x38, 0x00, 0x00, 0x02, 0x32, 0x1D, 0x03, 0xEC, 0x34, 0x0D, 0x03, 0xE1, 0x2C, 0x10, 0x00, 0x40, 0x30, 0x0D, 0x03, 0xE1, 0x2C, 0xB0, 0x00, 0x01, 0x3C, 0x6D, 0x00, 0x1A, 0x00, 0x00, 0xCC, 0x4B, 0x00, 0x00, 0xCC, 0x0B, 0x3A, 0xDE, 0x16, 0x12, 0x3A, 0xFD, 0x00, 0x17, 0x00, 0x03, 0xEB, 0xC1, 0x38, 0x00, 0x05, 0x40, 0x32, 0x1D, 0x03, 0xE1, 0x3A, 0xDD, 0x00, 0x1E, 0x38, 0x00, 0x00, 0x02, 0x32, 0x10, 0x0F, 0xFA, 0x2C, 0xB0, 0x00, 0x02, 0x3C, 0x1D, 0x00, 0x39, 0x38, 0x00, 0x06, 0x00, 0x32, 0x10, 0x0F, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x30, 0x0D, 0x03, 0xD8, 0x30, 0x0D, 0x03, 0xD5, 0x30, 0x0D, 0x03, 0xD6, 0x00, 0x03, 0xC8, 0x76, 0x32, 0x0D, 0x03, 0xF6, 0x32, 0x0D, 0x03, 0xF7, 0x34, 0x00, 0x0F, 0xC5, 0x2C, 0x00, 0x08, 0x00, 0x3C, 0x1D, 0x00, 0x32, 0x38, 0x00, 0x00, 0x00, 0x32, 0x10, 0x0F, 0x8D, 0x38, 0x0D, 0x02, 0x39, 0x32, 0x10, 0x0F, 0xF8, 0x00, 0x00, 0xB8, 0x0C, 0x00, 0x00, 0xB0, 0x3C, 0x38, 0x00, 0x03, 0x80, 0x32, 0x10, 0x0D, 0xCB, 0x3A, 0xDD, 0x01, 0x57, 0x38, 0x00, 0x00, 0x02, 0x32, 0x10, 0x0F, 0xFA, 0x3C, 0x6D, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x32, 0x10, 0x0D, 0xCA, 0x34, 0x00, 0x0D, 0xCA, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x6D, 0x00, 0x7E, 0x00, 0x00, 0xBC, 0x4B, 0x00, 0x00, 0xBC, 0x0B, 0x38, 0x00, 0x00, 0x01, 0x32, 0x10, 0x0D, 0xC4, 0x34, 0x2D, 0x03, 0xEC, 0x2C, 0xB0, 0x00, 0x00, 0x3C, 0x1D, 0x00, 0x47, 0x34, 0x7D, 0x03, 0xD8, 0x00, 0x00, 0xB3, 0x87, 0x3A, 0xDD, 0x00, 0x4B, 0x00, 0x00, 0xC3, 0x87, 0x30, 0x7D, 0x03, 0xD8, 0x3A, 0xDD, 0x01, 0xB1, 0x3A, 0xFD, 0x00, 0x4B, 0x00, 0x03, 0xEB, 0xC1, 0x3A, 0xDE, 0x18, 0x4E, 0x3A, 0xFD, 0x00, 0x4E, 0x00, 0x03, 0xEB, 0xC1, 0x3A, 0xDE, 0x18, 0xAC, 0x3A, 0xFD, 0x00, 0x51, 0x00, 0x03, 0xEB, 0xC1, 0x3A, 0xDD, 0x01, 0x86, 0x3A, 0xFD, 0x00, 0x54, 0x00, 0x03, 0xEB, 0xC1, 0x3A, 0xDD, 0x01, 0x6E, 0x3A, 0xFD, 0x00, 0x57, 0x00, 0x03, 0xEB, 0xC1, 0x3A, 0xDD, 0x01, 0x5A, 0x3A, 0xFD, 0x00, 0x5A, 0x00, 0x03, 0xEB, 0xC1, 0x34, 0x00, 0x0D, 0xC4, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x6D, 0x00, 0xB7, 0x34, 0x10, 0x0D, 0xCB, 0x34, 0x00, 0x0D, 0xC9, 0x34, 0x80, 0x0D, 0xC1, 0x35, 0x00, 0x0D, 0xFD, 0x32, 0x10, 0x0D, 0xDA, 0xB0, 0x50, 0x60, 0x00, 0x30, 0x80, 0x0D, 0xD6, 0x14, 0x90, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x18, 0x30, 0x20, 0x0D, 0xC9, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x0D, 0xC8, 0x39, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x06, 0x32, 0x10, 0x0D, 0xD5, 0x34, 0x00, 0x0F, 0x88, 0x32, 0x10, 0x0D, 0xD7, 0x34, 0x00, 0x0D, 0xFD, 0x32, 0x10, 0x0D, 0xD8, 0x34, 0x00, 0x0D, 0xF2, 0x32, 0x10, 0x0D, 0xD9, 0xB0, 0x03, 0xD0, 0x81, 0x38, 0x80, 0x0D, 0xD5, 0x36, 0xDE, 0x00, 0x41, 0x3A, 0xFD, 0x00, 0x77, 0x00, 0x03, 0xEB, 0xC1, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x1D, 0x00, 0xB7, 0x30, 0x00, 0x0D, 0xC7, 0x34, 0x20, 0x0D, 0xC4, 0x3A, 0xDD, 0x00, 0xB7, 0x00, 0x00, 0xB0, 0x82, 0x30, 0x20, 0x0D, 0xC4, 0x3A, 0xDE, 0x18, 0xAC, 0x3A, 0xFD, 0x00, 0x81, 0x00, 0x03, 0xEB, 0xC1, 0x3A, 0xDD, 0x01, 0x6E, 0x3A, 0xFD, 0x00, 0x84, 0x00, 0x03, 0xEB, 0xC1, 0x34, 0x00, 0x0D, 0xCA, 0x38, 0x10, 0x00, 0x02, 0x04, 0x40, 0x00, 0x00, 0x3C, 0x1D, 0x00, 0xA5, 0x34, 0x00, 0x0D, 0xCA, 0x38, 0x10, 0x00, 0x05, 0x04, 0x40, 0x00, 0x00, 0x3C, 0x1D, 0x00, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x30, 0x00, 0x01, 0x3C, 0x1D, 0x00, 0x99, 0x38, 0x23, 0x00, 0x00, 0x34, 0x3D, 0x03, 0xD8, 0x00, 0x00, 0xD4, 0x43, 0x3C, 0x6D, 0x00, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x30, 0x00, 0x04, 0x3C, 0x1D, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x38, 0x22, 0x55, 0x55, 0x38, 0x22, 0xAA, 0xAB, 0x00, 0x00, 0xD3, 0x83, 0x3C, 0x1D, 0x00, 0xB7, 0x34, 0x00, 0x0D, 0xCB, 0x44, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x34, 0x10, 0x0F, 0x8D, 0xA2, 0x00, 0x00, 0x00, 0x3C, 0x4D, 0x00, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x32, 0x10, 0x0F, 0x8D, 0x3A, 0xDD, 0x00, 0xB7, 0x00, 0x00, 0xC0, 0x3C, 0x34, 0x00, 0x0D, 0xC4, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x6D, 0x00, 0xB7, 0x34, 0x00, 0x0D, 0xC8, 0x32, 0x10, 0x0D, 0xD6, 0x34, 0x00, 0x0D, 0xC9, 0x32, 0x10, 0x0D, 0xDA, 0x34, 0x00, 0x0D, 0xC7, 0x38, 0x10, 0x00, 0x02, 0x38, 0x80, 0x0D, 0xD5, 0x36, 0xDE, 0x00, 0x41, 0x3A, 0xFD, 0x00, 0xB2, 0x00, 0x03, 0xEB, 0xC1, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x1D, 0x00, 0xB7, 0x34, 0x20, 0x0D, 0xC4, 0x00, 0x00, 0xB0, 0xC2, 0x30, 0x20, 0x0D, 0xC4, 0x38, 0x00, 0x00, 0x0F, 0x32, 0x10, 0x0D, 0xDB, 0x34, 0x00, 0x0D, 0xFD, 0x32, 0x10, 0x0D, 0xDE, 0x34, 0x00, 0x0D, 0xF2, 0x32, 0x10, 0x0D, 0xDF, 0x34, 0x00, 0x0D, 0xF3, 0x2C, 0x00, 0x00, 0x0F, 0x32, 0x10, 0x0D, 0xE8, 0x38, 0x00, 0x00, 0x00, 0x32, 0x10, 0x0D, 0xE9, 0x38, 0x00, 0x0D, 0xCF, 0x32, 0x10, 0x0D, 0xE0, 0x34, 0x00, 0x0D, 0xFE, 0x32, 0x10, 0x0D, 0xE1, 0x34, 0x00, 0x0D, 0xFF, 0x32, 0x10, 0x0D, 0xE2, 0x34, 0x00, 0x0D, 0xF1, 0x32, 0x10, 0x0D, 0xE3, 0x34, 0x00, 0x0F, 0x88, 0x32, 0x10, 0x0D, 0xDD, 0x34, 0x00, 0x0D, 0xC1, 0x32, 0x10, 0x0D, 0xDC, 0x34, 0x00, 0x0D, 0xF4, 0x32, 0x10, 0x0D, 0xE7, 0x34, 0x00, 0x0D, 0xCA, 0x32, 0x10, 0x0D, 0xE4, 0x34, 0x00, 0x0D, 0xCC, 0x32, 0x10, 0x0D, 0xE5, 0x34, 0x00, 0x0D, 0xCD, 0x32, 0x10, 0x0D, 0xE6, 0x34, 0x0D, 0x03, 0xE3, 0x38, 0x10, 0x00, 0x0C, 0x16, 0x43, 0xD1, 0x01, 0x18, 0x40, 0x00, 0x00, 0x34, 0x10, 0x0D, 0xCE, 0x16, 0x43, 0xD3, 0x02, 0x3C, 0x1D, 0x00, 0xF0, 0x16, 0x53, 0xD4, 0x03, 0x30, 0x20, 0x0D, 0xCE, 0x34, 0x0D, 0x03, 0xE2, 0x2C, 0x00, 0x00, 0x07, 0x2C, 0x30, 0x00, 0x02, 0x3C, 0x3D, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD0, 0x00, 0x00, 0x30, 0x20, 0x0D, 0xCE, 0x38, 0x00, 0x00, 0x02, 0x32, 0x10, 0x0D, 0xE3, 0x38, 0x07, 0xFF, 0xFF, 0x32, 0x10, 0x0D, 0xE7, 0x38, 0x0E, 0x2B, 0xA9, 0x32, 0x10, 0x0D, 0xE0, 0x38, 0x0E, 0x2B, 0xAF, 0x32, 0x10, 0x0D, 0xE1, 0x38, 0x0E, 0x2B, 0xB5, 0x32, 0x10, 0x0D, 0xE2, 0x34, 0x00, 0x0D, 0xE8, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x6D, 0x00, 0xF6, 0x34, 0x00, 0x0D, 0xC4, 0x38, 0x80, 0x0D, 0xDB, 0x06, 0x00, 0x00, 0x00, 0x34, 0x7D, 0x03, 0xD8, 0x00, 0x00, 0xD3, 0x87, 0x3C, 0x1D, 0x00, 0xFD, 0x34, 0x10, 0x0F, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x3C, 0x6D, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0x00, 0x03, 0x38, 0x0F, 0xFF, 0xFF, 0x36, 0xDE, 0x00, 0x41, 0x3A, 0xFD, 0x01, 0x02, 0x00, 0x03, 0xEB, 0xC1, 0x30, 0x00, 0x0D, 0xC5, 0x34, 0x00, 0x0D, 0xCE, 0x2C, 0x00, 0x00, 0x10, 0x3C, 0x1D, 0x01, 0x26, 0x38, 0x00, 0x00, 0x20, 0x32, 0x10, 0x0D, 0xE4, 0x38, 0x00, 0x00, 0x0B, 0x32, 0x10, 0x0D, 0xDB, 0x38, 0x0E, 0x2B, 0xA9, 0x32, 0x10, 0x0D, 0xDC, 0x38, 0x0E, 0x2B, 0xAF, 0x32, 0x10, 0x0D, 0xDD, 0x38, 0x0E, 0x2B, 0xB5, 0x32, 0x10, 0x0D, 0xDE, 0x38, 0x00, 0x00, 0x00, 0x32, 0x10, 0x0D, 0xDF, 0x38, 0x00, 0x0D, 0xCF, 0x32, 0x10, 0x0D, 0xE0, 0x34, 0x00, 0x0D, 0xFE, 0x32, 0x10, 0x0D, 0xE1, 0x34, 0x00, 0x0D, 0xFF, 0x32, 0x10, 0x0D, 0xE2, 0x34, 0x00, 0x0D, 0xF4, 0x32, 0x10, 0x0D, 0xE5, 0x34, 0x0D, 0x03, 0xE2, 0x2C, 0x00, 0xC0, 0x00, 0x2E, 0x3F, 0xFF, 0xFE, 0x34, 0x10, 0x0D, 0xF1, 0x2C, 0x41, 0xCF, 0xFF, 0x18, 0x08, 0x00, 0x00, 0x32, 0x50, 0x0D, 0xE3, 0xB0, 0x03, 0xD1, 0x41, 0x38, 0x80, 0x0D, 0xDB, 0x36, 0xDE, 0x00, 0x41, 0x3A, 0xFD, 0x01, 0x26, 0x00, 0x03, 0xEB, 0xC1, 0x38, 0x00, 0x00, 0x01, 0x3A, 0xDE, 0x17, 0xC7, 0x3A, 0xFD, 0x01, 0x2A, 0x00, 0x03, 0xEB, 0xC1, 0x36, 0xD0, 0x0F, 0x8C, 0x3A, 0xFD, 0x01, 0x2D, 0x00, 0x03, 0xEB, 0xC1, 0x3A, 0xDE, 0x18, 0xE5, 0x3A, 0xFD, 0x01, 0x30, 0x00, 0x03, 0xEB, 0xC1, 0x34, 0x00, 0x0D, 0xCA, 0x2C, 0x30, 0x00, 0x05, 0x3C, 0x5D, 0x01, 0x36, 0x12, 0x03, 0xD0, 0x01, 0x30, 0x00, 0x0D, 0xCA, 0x30, 0x10, 0x0D, 0xCA, 0x38, 0x00, 0x00, 0x08, 0x32, 0x1D, 0x03, 0xE0, 0x34, 0x0D, 0x03, 0xEC, 0x2C, 0x30, 0x00, 0x00, 0x3C, 0x1D, 0x01, 0x3E, 0x34, 0x00, 0x0D, 0xC6, 0x2C, 0x10, 0x05, 0x00, 0x2C, 0x10, 0x00, 0x40, 0x34, 0x20, 0x0D, 0xC5, 0x34, 0x10, 0x0D, 0xC4, 0x00, 0x4B, 0xD0, 0xC1, 0x3C, 0x1D, 0x01, 0x45, 0x0C, 0x50, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x2C, 0x10, 0x40, 0x00, 0x32, 0x1D, 0x03, 0xE1, 0x38, 0x0D, 0x03, 0xE0, 0x32, 0x10, 0x0F, 0xFB, 0x34, 0x00, 0x0F, 0xC5, 0x2C, 0x00, 0x10, 0x00, 0x3C, 0x1D, 0x01, 0x57, 0x34, 0x7D, 0x03, 0xD8, 0x00, 0x00, 0xD3, 0x47, 0x3C, 0x1D, 0x01, 0x51, 0x00, 0x00, 0xC8, 0x4C, 0x00, 0x00, 0xC0, 0xBC, 0x00, 0x00, 0xB0, 0xBC, 0x34, 0x00, 0x0D, 0xC4, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x1D, 0x01, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFC, 0x00, 0x00, 0xB0, 0xFC, 0x00, 0x03, 0xF0, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x5D, 0x03, 0xD8, 0x00, 0x00, 0xD4, 0xC5, 0x3C, 0x1D, 0x01, 0x6A, 0x34, 0x0D, 0x03, 0xD3, 0x36, 0x0D, 0x03, 0xD4, 0x2C, 0x00, 0xFF, 0xFF, 0x2E, 0x20, 0x00, 0x07, 0x00, 0x03, 0xC8, 0x83, 0x2E, 0x20, 0x00, 0x01, 0x00, 0x03, 0xC0, 0xE2, 0x2E, 0x2F, 0xFF, 0xFC, 0x2E, 0x3F, 0xFF, 0xFF, 0x2E, 0x2F, 0xFF, 0xFA, 0x3A, 0xDD, 0x01, 0x6A, 0x00, 0x03, 0xC8, 0x76, 0x32, 0x0D, 0x03, 0xF7, 0x00, 0x00, 0xC4, 0xC5, 0x00, 0x03, 0xF0, 0x2D, 0x00, 0x00, 0xC4, 0x45, 0x30, 0x5D, 0x03, 0xD8, 0x34, 0x0D, 0x03, 0xD8, 0x00, 0x00, 0xD3, 0xA1, 0x3C, 0x1D, 0x01, 0x74, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x48, 0x00, 0x00, 0x3A, 0x40, 0x00, 0xF0, 0x34, 0x0D, 0x03, 0xD5, 0x36, 0x0D, 0x03, 0xD6, 0xA2, 0x00, 0x00, 0x00, 0x32, 0x1D, 0x03, 0xD5, 0x3B, 0x80, 0x00, 0x00, 0x32, 0x0D, 0x03, 0xD6, 0x00, 0x03, 0xC8, 0x76, 0x32, 0x0D, 0x03, 0xF6, 0x36, 0x0D, 0x03, 0xF7, 0x00, 0x03, 0xCD, 0xA1, 0xA2, 0x03, 0xD0, 0x78, 0x00, 0x03, 0xC0, 0x01, 0x32, 0x4D, 0x03, 0xE8, 0x2E, 0x6F, 0xFF, 0xF0, 0x32, 0x4D, 0x03, 0xE7, 0x00, 0x03, 0xF0, 0x2D, 0x00, 0x03, 0xC8, 0x76, 0x32, 0x0D, 0x03, 0xF7, 0x34, 0x00, 0x0F, 0xC5, 0x00, 0x00, 0xD1, 0x61, 0x3C, 0x1D, 0x01, 0xAE, 0x34, 0x7D, 0x03, 0xD8, 0x00, 0x00, 0xD3, 0x87, 0x00, 0x00, 0xB3, 0x07, 0x3C, 0x1D, 0x01, 0x96, 0x34, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xD0, 0x21, 0x3C, 0x1D, 0x01, 0x96, 0x34, 0x00, 0x0D, 0xC4, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x6D, 0x01, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x07, 0x30, 0x7D, 0x03, 0xD8, 0x34, 0x0D, 0x03, 0xE3, 0x2C, 0x00, 0x07, 0x00, 0x2E, 0x30, 0x00, 0x04, 0x2C, 0x10, 0x00, 0x10, 0x32, 0x1D, 0x03, 0xED, 0x34, 0x00, 0x0D, 0xC1, 0x32, 0x1D, 0x03, 0xF3, 0x34, 0x30, 0x0D, 0xCB, 0x30, 0x3D, 0x03, 0xEE, 0x38, 0x20, 0x0B, 0xFC, 0xB6, 0x90, 0x00, 0x00, 0x30, 0x2D, 0x03, 0xEF, 0x2E, 0xCF, 0xFA, 0x06, 0x2E, 0xDA, 0xAA, 0xAB, 0x3B, 0x80, 0x00, 0x00, 0x2C, 0xCF, 0xFF, 0xFE, 0x00, 0x00, 0xD0, 0x0F, 0x3C, 0x1D, 0x01, 0xAC, 0x38, 0x0D, 0x03, 0x3B, 0x32, 0x10, 0x0F, 0xF9, 0x14, 0xD8, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x01, 0x30, 0x3D, 0x03, 0xF8, 0x00, 0x03, 0xF0, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x0F, 0x8D, 0x00, 0x43, 0xC3, 0xC0, 0x3C, 0x4D, 0x01, 0xBA, 0x34, 0x10, 0x0D, 0xC2, 0x04, 0x08, 0x00, 0x00, 0x3C, 0x6D, 0x01, 0xB1, 0x38, 0x00, 0x00, 0x07, 0x32, 0x10, 0x0D, 0xC6, 0x3A, 0xDD, 0x02, 0x18, 0x34, 0x00, 0x0D, 0xC0, 0x3A, 0xDD, 0x02, 0x2E, 0x3A, 0xFD, 0x01, 0xBE, 0x00, 0x03, 0xEB, 0xC1, 0x2E, 0x0F, 0xFF, 0xF6, 0x3C, 0x3D, 0x01, 0xC5, 0x38, 0x10, 0x00, 0x01, 0x38, 0x20, 0x03, 0x80, 0x3A, 0xDD, 0x02, 0x18, 0x30, 0x20, 0x0F, 0x8D, 0x00, 0x00, 0xC0, 0x3C, 0x20, 0x40, 0x00, 0x00, 0x30, 0x00, 0x0D, 0xE1, 0x34, 0x00, 0x0D, 0xC0, 0x32, 0x10, 0x0D, 0xDC, 0x34, 0x00, 0x0F, 0x88, 0x32, 0x10, 0x0D, 0xDD, 0x31, 0x60, 0x0D, 0xDE, 0x34, 0x00, 0x0D, 0xF2, 0x32, 0x10, 0x0D, 0xDF, 0x38, 0x00, 0x00, 0x00, 0x32, 0x10, 0x0D, 0xE0, 0x38, 0x80, 0x0D, 0xDB, 0xB0, 0x03, 0xD2, 0x01, 0x3A, 0xDE, 0x19, 0x92, 0x3A, 0xFD, 0x01, 0xD5, 0x00, 0x03, 0xEB, 0xC1, 0x00, 0x43, 0xC5, 0x91, 0x34, 0x90, 0x0F, 0x87, 0x3C, 0x6D, 0x02, 0x15, 0x38, 0x00, 0x00, 0x01, 0x32, 0x10, 0x0D, 0xC6, 0x30, 0x90, 0x0D, 0xC1, 0x38, 0x00, 0x00, 0x05, 0x32, 0x10, 0x0D, 0xDB, 0x30, 0x90, 0x0D, 0xDC, 0x34, 0x00, 0x0F, 0x88, 0x32, 0x10, 0x0D, 0xDD, 0x31, 0x60, 0x0D, 0xDE, 0x34, 0x00, 0x0D, 0xF2, 0x32, 0x10, 0x0D, 0xDF, 0x38, 0x80, 0x0D, 0xDB, 0xB0, 0x03, 0xD0, 0x41, 0x36, 0xDE, 0x00, 0x41, 0x3A, 0xFD, 0x01, 0xE8, 0x00, 0x03, 0xEB, 0xC1, 0x39, 0x80, 0x00, 0x02, 0x30, 0x00, 0x0D, 0xC6, 0x00, 0x43, 0x60, 0x02, 0x3C, 0x6D, 0x02, 0x12, 0x39, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x01, 0x30, 0x20, 0x0D, 0xCB, 0x30, 0x10, 0x0D, 0xC9, 0x39, 0x10, 0x00, 0x00, 0x39, 0x80, 0x00, 0x04, 0x00, 0x02, 0xA0, 0x07, 0x30, 0x7D, 0x03, 0xE2, 0x00, 0x00, 0x80, 0x00, 0x38, 0x9D, 0x03, 0xE3, 0x3E, 0x00, 0x00, 0x04, 0x00, 0x06, 0x51, 0xCF, 0x34, 0x00, 0x0D, 0xFD, 0x22, 0x13, 0xC5, 0x91, 0x34, 0x90, 0x0D, 0xC1, 0x00, 0x03, 0xC0, 0x99, 0x38, 0x15, 0x00, 0x00, 0x34, 0x20, 0x0D, 0xCB, 0x42, 0x98, 0x80, 0x08, 0x2E, 0xC0, 0x00, 0x04, 0x30, 0x90, 0x0D, 0xC0, 0x34, 0x00, 0x0D, 0xC1, 0x3A, 0xDD, 0x02, 0x2E, 0x3A, 0xFD, 0x02, 0x06, 0x00, 0x03, 0xEB, 0xC1, 0xB0, 0xC0, 0x00, 0x00, 0x3C, 0x4D, 0x02, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x0F, 0x8D, 0x00, 0x00, 0xC0, 0x3C, 0x3A, 0xDD, 0x02, 0x1C, 0x3A, 0xFD, 0x02, 0x0E, 0x00, 0x03, 0xEB, 0xC1, 0x39, 0x10, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x2D, 0x31, 0x10, 0x0D, 0xC4, 0x30, 0xF0, 0x0D, 0xC3, 0x3A, 0xDD, 0x02, 0x16, 0x34, 0x00, 0x0D, 0xC1, 0x32, 0x10, 0x0D, 0xC0, 0x30, 0x90, 0x0D, 0xC0, 0x38, 0x00, 0x03, 0x80, 0x32, 0x10, 0x0D, 0xCB, 0x39, 0x10, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x2D, 0x38, 0x00, 0x00, 0x01, 0x32, 0x10, 0x0D, 0xC4, 0x34, 0x3D, 0x03, 0xCB, 0x2E, 0xFF, 0xFF, 0xFC, 0x14, 0xDB, 0xC5, 0x91, 0x2E, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xC0, 0xD9, 0x34, 0x9D, 0x03, 0xD7, 0x34, 0x40, 0x0D, 0xC1, 0x00, 0x00, 0x80, 0x08, 0x00, 0x03, 0xC2, 0x43, 0x04, 0xE0, 0x00, 0x00, 0x3C, 0x6D, 0x02, 0x2B, 0x34, 0x5D, 0x03, 0xD8, 0x00, 0x00, 0xC4, 0xC5, 0x00, 0x00, 0xB4, 0xC5, 0x00, 0x00, 0xB2, 0xC5, 0x00, 0x03, 0xF0, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x30, 0x5D, 0x03, 0xD8, 0x00, 0x00, 0xCC, 0x4B, 0x00, 0x03, 0xC3, 0x81, 0x34, 0x20, 0x0F, 0x8D, 0xB0, 0x40, 0xBC, 0x4B, 0x3C, 0x2D, 0x02, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC5, 0x81, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x2D, 0xA0, 0x90, 0x00, 0x00, 0xB0, 0x48, 0x00, 0x00, 0x38, 0x3D, 0x03, 0x2A, 0x30, 0x3D, 0x03, 0xCE, 0x00, 0x03, 0xCC, 0x03, 0x00, 0x58, 0x00, 0x00, 0x3C, 0x1D, 0x03, 0x37, 0x38, 0x3D, 0x02, 0x46, 0x30, 0x30, 0x0F, 0xF8, 0x38, 0x3D, 0x02, 0x39, 0x30, 0x30, 0x0F, 0xF8, 0x00, 0x03, 0xF0, 0x2B, 0x00, 0x03, 0xF0, 0x2D, 0x3B, 0x80, 0x00, 0x01, 0x34, 0x30, 0x0F, 0xCC, 0x00, 0x03, 0xCC, 0x03, 0x2C, 0xCF, 0xFF, 0xF0, 0x2C, 0xF0, 0x1B, 0xD0, 0x3C, 0x6D, 0x03, 0x36, 0x38, 0x4D, 0x02, 0x39, 0x30, 0x40, 0x0F, 0xF8, 0x00, 0x03, 0xE3, 0x81, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x50, 0x00, 0x00, 0x3B, 0x70, 0x00, 0x00, 0x38, 0xED, 0x03, 0xBE, 0x2E, 0xF0, 0x00, 0x08, 0x00, 0x03, 0xE0, 0xF4, 0x30, 0xED, 0x03, 0xCF, 0x34, 0x3D, 0x03, 0xD2, 0x2C, 0xC0, 0xFF, 0xFC, 0x30, 0x3D, 0x03, 0xD2, 0x38, 0x30, 0x00, 0x04, 0x30, 0x3D, 0x03, 0xD0, 0x38, 0x3D, 0x02, 0x5E, 0x30, 0x3D, 0x03, 0xD1, 0x3A, 0xDD, 0x03, 0x29, 0x38, 0x3D, 0x03, 0x11, 0x30, 0x30, 0x0F, 0xF8, 0x00, 0x03, 0xE3, 0x81, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x50, 0x00, 0x00, 0x3B, 0x70, 0x00, 0x00, 0x34, 0xED, 0x03, 0xCF, 0x00, 0x03, 0xCC, 0x03, 0x2E, 0xFF, 0xFF, 0xF8, 0x2C, 0xC0, 0x0F, 0xF0, 0x00, 0x03, 0xFD, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x03, 0xE1, 0x32, 0x00, 0x03, 0xCC, 0x04, 0x2F, 0x30, 0x00, 0x08, 0x00, 0x03, 0xE1, 0x34, 0x30, 0xED, 0x03, 0xCF, 0x2E, 0xFF, 0xFF, 0xFC, 0x2C, 0xF0, 0x00, 0x10, 0x3C, 0x3D, 0x03, 0x29, 0x38, 0x4D, 0x02, 0x39, 0x30, 0x40, 0x0F, 0xF8, 0x2E, 0xCF, 0xFF, 0xFF, 0x3C, 0x5D, 0x02, 0x85, 0x00, 0x00, 0xD0, 0x03, 0x30, 0x3D, 0x03, 0xD0, 0x38, 0x4D, 0x03, 0x11, 0x30, 0x40, 0x0F, 0xF8, 0x3C, 0x1D, 0x03, 0x29, 0x38, 0x4D, 0x02, 0xB1, 0x30, 0x4D, 0x03, 0xD1, 0x3A, 0xDD, 0x03, 0x29, 0x38, 0x4D, 0x02, 0x7E, 0x30, 0x4D, 0x03, 0xCE, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x50, 0x00, 0x00, 0x3B, 0x70, 0x00, 0x00, 0x38, 0x3D, 0x03, 0x2A, 0x30, 0x3D, 0x03, 0xCE, 0x00, 0x03, 0xCC, 0x04, 0x2F, 0x30, 0x00, 0x08, 0x00, 0x03, 0xC1, 0x03, 0x2C, 0xCE, 0x80, 0x00, 0x2C, 0xF8, 0x00, 0x00, 0x38, 0xED, 0x03, 0xCA, 0x3C, 0x6D, 0x03, 0x29, 0x38, 0x3D, 0x02, 0x39, 0x30, 0x30, 0x0F, 0xF8, 0x00, 0x03, 0xE1, 0x34, 0x30, 0xED, 0x03, 0xCF, 0x38, 0x30, 0x00, 0x02, 0x30, 0x3D, 0x03, 0xD0, 0x38, 0x3D, 0x02, 0x95, 0x30, 0x3D, 0x03, 0xD1, 0x3A, 0xDD, 0x03, 0x29, 0x38, 0x3D, 0x03, 0x11, 0x30, 0x30, 0x0F, 0xF8, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x70, 0x00, 0x00, 0x3B, 0x50, 0x00, 0x00, 0x00, 0x03, 0xE3, 0x81, 0x34, 0xED, 0x03, 0xCF, 0x00, 0x03, 0xCC, 0x03, 0x2E, 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xFD, 0x04, 0x19, 0x18, 0x00, 0x00, 0x00, 0x03, 0xE0, 0xF4, 0x00, 0x03, 0xF0, 0x0E, 0x34, 0x4D, 0x03, 0xD2, 0x00, 0x00, 0xB0, 0x04, 0x30, 0x4D, 0x03, 0xD2, 0x00, 0x00, 0xD0, 0x84, 0x3C, 0x1D, 0x02, 0xAC, 0x00, 0x03, 0xCC, 0x03, 0x2E, 0xF0, 0x00, 0x08, 0x2E, 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xFD, 0x04, 0x3A, 0xDD, 0x02, 0xAD, 0x19, 0x18, 0x00, 0x00, 0x00, 0x03, 0xE0, 0xF2, 0x00, 0x03, 0xE0, 0xF4, 0x00, 0x03, 0xF0, 0x2C, 0x3A, 0xDD, 0x02, 0xC5, 0x30, 0xED, 0x03, 0xCF, 0x00, 0x03, 0xE3, 0x81, 0x00, 0x03, 0xE3, 0x81, 0x00, 0x03, 0xCC, 0x03, 0x2C, 0xCE, 0x80, 0x00, 0x2C, 0xF8, 0x00, 0x00, 0x3C, 0x6D, 0x03, 0x2A, 0x38, 0x3D, 0x02, 0x39, 0x30, 0x30, 0x0F, 0xF8, 0x38, 0xED, 0x03, 0xCA, 0x38, 0x3D, 0x02, 0xBE, 0x00, 0x03, 0xEC, 0x32, 0x3A, 0xDD, 0x03, 0x2A, 0x30, 0xED, 0x03, 0xCF, 0x30, 0x30, 0x0F, 0xF8, 0x00, 0x03, 0xC3, 0x84, 0x00, 0x03, 0xE3, 0x81, 0x34, 0xED, 0x03, 0xCF, 0x30, 0x4D, 0x03, 0xCF, 0x00, 0x03, 0xEC, 0x32, 0x00, 0x03, 0xF0, 0x0E, 0x00, 0x03, 0xE3, 0x81, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x70, 0x00, 0x00, 0x3B, 0x50, 0x00, 0x00, 0x34, 0x3D, 0x03, 0xC0, 0x2C, 0xCC, 0x00, 0x00, 0x2C, 0xF8, 0x00, 0x00, 0x00, 0x03, 0xC3, 0x83, 0x3C, 0x1D, 0x02, 0xD0, 0x34, 0x4D, 0x03, 0xC2, 0x2F, 0x30, 0x00, 0x04, 0x38, 0x30, 0x00, 0x00, 0x30, 0x3D, 0x03, 0xD7, 0x34, 0x3D, 0x03, 0xC3, 0x2E, 0xFF, 0xFF, 0xF4, 0x19, 0x18, 0x00, 0x00, 0x30, 0x3D, 0x03, 0xD4, 0x34, 0x3D, 0x03, 0xC2, 0x2E, 0xFF, 0xFF, 0xF0, 0x34, 0x4D, 0x03, 0xC1, 0x19, 0x18, 0x00, 0x00, 0x30, 0x3D, 0x03, 0xD3, 0x34, 0x3D, 0x03, 0xD2, 0x00, 0x00, 0xB0, 0x43, 0x30, 0x3D, 0x03, 0xD2, 0x34, 0x4D, 0x03, 0xBE, 0x2F, 0x30, 0x00, 0x04, 0x2D, 0x00, 0xFF, 0x00, 0x34, 0x3D, 0x03, 0xBF, 0x2E, 0xFF, 0xFF, 0xF4, 0x2C, 0xC0, 0x00, 0xFF, 0x19, 0x18, 0x00, 0x00, 0x2C, 0xF0, 0x07, 0xEC, 0x3C, 0x3D, 0x03, 0x29, 0x38, 0x4D, 0x02, 0x39, 0x30, 0x40, 0x0F, 0xF8, 0x34, 0x4D, 0x03, 0xC0, 0x2F, 0x3F, 0xFF, 0xFC, 0x2D, 0x00, 0x00, 0xFF, 0xB8, 0xD8, 0x00, 0x00, 0x2E, 0xCF, 0xFF, 0xF9, 0x34, 0x4D, 0x03, 0xD2, 0x2D, 0x00, 0x00, 0x01, 0xB8, 0xD8, 0x00, 0x00, 0x30, 0x3D, 0x03, 0xD0, 0x38, 0x3D, 0x02, 0x39, 0x30, 0x3D, 0x03, 0xD1, 0x34, 0x3D, 0x03, 0xD2, 0x00, 0x00, 0xD0, 0x83, 0x3C, 0x6D, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x03, 0x3C, 0x1D, 0x03, 0x29, 0x38, 0x3D, 0x03, 0x0A, 0x30, 0x30, 0x0F, 0xF8, 0x34, 0x3D, 0x03, 0xD2, 0x00, 0x00, 0xB0, 0x83, 0x30, 0x3D, 0x03, 0xD2, 0x3A, 0xDD, 0x03, 0x29, 0x38, 0x3D, 0x03, 0x11, 0x30, 0x30, 0x0F, 0xF8, 0x3C, 0x1D, 0x03, 0x29, 0x38, 0x3D, 0x03, 0x11, 0x30, 0x30, 0x0F, 0xF8, 0x34, 0x3D, 0x03, 0xD2, 0x00, 0x00, 0xC0, 0x83, 0x30, 0x3D, 0x03, 0xD2, 0x3A, 0xDD, 0x03, 0x29, 0x38, 0x3D, 0x03, 0x0A, 0x30, 0x30, 0x0F, 0xF8, 0x00, 0x03, 0xE3, 0x81, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x70, 0x00, 0x00, 0x3B, 0x50, 0x00, 0x00, 0x3A, 0xDD, 0x03, 0x1F, 0x34, 0xED, 0x03, 0xCF, 0x00, 0x03, 0xCC, 0x03, 0x00, 0x03, 0xE3, 0x81, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x70, 0x00, 0x00, 0x3B, 0x50, 0x00, 0x00, 0x34, 0xED, 0x03, 0xCF, 0x00, 0x03, 0xCC, 0x03, 0x2E, 0xF0, 0x00, 0x08, 0x00, 0x01, 0x1C, 0x33, 0x00, 0x03, 0xCC, 0x03, 0x2E, 0xFF, 0xFF, 0xF8, 0x2C, 0xC0, 0x0F, 0xF0, 0x00, 0x03, 0xFD, 0x04, 0x2D, 0x0F, 0xF0, 0x00, 0x19, 0x18, 0x00, 0x00, 0x34, 0x4D, 0x03, 0xD0, 0x2F, 0x0F, 0xFF, 0xFE, 0x00, 0x03, 0xE0, 0xF2, 0x3C, 0x3D, 0x03, 0x29, 0x30, 0x4D, 0x03, 0xD0, 0x30, 0xED, 0x03, 0xCF, 0x00, 0x03, 0xF0, 0x2C, 0x36, 0xDD, 0x03, 0xCE, 0x34, 0x4D, 0x03, 0xD1, 0x30, 0x40, 0x0F, 0xF8, 0x00, 0x03, 0xF0, 0x2C, 0x34, 0x3D, 0x03, 0xD2, 0x00, 0x00, 0xD0, 0x43, 0x3C, 0x1D, 0x03, 0x37, 0x34, 0x40, 0x0F, 0xCD, 0x00, 0x03, 0xF0, 0x0E, 0x34, 0xED, 0x03, 0xCF, 0x34, 0x30, 0x0F, 0x8D, 0x2E, 0xCF, 0xFF, 0xFF, 0x3C, 0x3D, 0x03, 0x36, 0x30, 0x30, 0x0F, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x3C, 0x34, 0x40, 0x0F, 0xCD, 0x00, 0x03, 0xF0, 0x2B, 0x00, 0x03, 0xF0, 0x2D, 0x3B, 0x80, 0x00, 0x01, 0x34, 0x30, 0x0F, 0xCC, 0x34, 0x3D, 0x03, 0xF8, 0x2E, 0xCF, 0xFF, 0xFF, 0x3C, 0x3D, 0x03, 0x7F, 0x30, 0x3D, 0x03, 0xF8, 0xB9, 0x20, 0x00, 0x00, 0x3A, 0xDD, 0x03, 0x7F, 0x38, 0x3D, 0x03, 0x43, 0x30, 0x30, 0x0F, 0xF9, 0x38, 0x4F, 0x87, 0x20, 0x3A, 0xDD, 0x03, 0x7F, 0x38, 0x3D, 0x03, 0x47, 0x30, 0x30, 0x0F, 0xF9, 0x38, 0x44, 0xE1, 0xF0, 0x3A, 0xDD, 0x03, 0x7F, 0x38, 0x3D, 0x03, 0x4B, 0x30, 0x30, 0x0F, 0xF9, 0x34, 0x4D, 0x03, 0xD8, 0x00, 0x00, 0xD3, 0x04, 0x34, 0x4D, 0x03, 0xED, 0x3C, 0x1D, 0x03, 0x7F, 0x38, 0x3D, 0x03, 0x5B, 0x30, 0x30, 0x0F, 0xF9, 0x38, 0x40, 0x10, 0x30, 0x3A, 0xDD, 0x03, 0x7F, 0x38, 0x3D, 0x03, 0x55, 0x30, 0x30, 0x0F, 0xF9, 0x38, 0x30, 0x0B, 0xFC, 0x30, 0x3D, 0x03, 0xF8, 0x38, 0x40, 0x02, 0x00, 0x3A, 0xDD, 0x03, 0x7F, 0x38, 0x3D, 0x03, 0x3B, 0x30, 0x30, 0x0F, 0xF9, 0x00, 0x03, 0xEB, 0x01, 0x34, 0x30, 0x0F, 0x88, 0x00, 0x5B, 0xD0, 0x35, 0x38, 0x3D, 0x03, 0x66, 0x3C, 0x1D, 0x03, 0x63, 0x34, 0x4D, 0x03, 0xEE, 0x30, 0x4D, 0x03, 0xF8, 0x38, 0x3D, 0x03, 0x6D, 0x3A, 0xDD, 0x03, 0x80, 0x30, 0x30, 0x0F, 0xF9, 0x2F, 0x30, 0x00, 0x08, 0xB6, 0xDB, 0xE3, 0x81, 0x34, 0xED, 0x03, 0xF3, 0x34, 0x3D, 0x03, 0xF8, 0x14, 0xDB, 0xFC, 0x84, 0x3A, 0xDD, 0x03, 0x79, 0x30, 0xED, 0x03, 0xF3, 0x00, 0x03, 0xF0, 0x0E, 0x00, 0x03, 0xE3, 0x81, 0x34, 0xED, 0x03, 0xF3, 0x00, 0x03, 0xEB, 0x01, 0xB6, 0xDB, 0xD0, 0x35, 0x00, 0x07, 0x4C, 0xF4, 0x30, 0xED, 0x03, 0xF3, 0x2E, 0xF0, 0x00, 0x08, 0x2C, 0xCF, 0xF0, 0x00, 0x2F, 0x3F, 0xFF, 0xF8, 0x18, 0xE3, 0xF0, 0x2C, 0x34, 0x3D, 0x03, 0xF8, 0x14, 0xDB, 0xF0, 0x0E, 0x3C, 0x3D, 0x03, 0x7F, 0x30, 0x3D, 0x03, 0xF8, 0x34, 0x3D, 0x03, 0xEF, 0x30, 0x3D, 0x03, 0xF8, 0x38, 0x3D, 0x03, 0x3B, 0x30, 0x30, 0x0F, 0xF9, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x50, 0x00, 0x00, 0x34, 0x30, 0x0F, 0xC8, 0x0C, 0xE0, 0x60, 0x38, 0x00, 0x03, 0xC1, 0x31, 0x00, 0x02, 0xEE, 0x3C, 0x0C, 0xE0, 0x1E, 0x38, 0x00, 0x03, 0xC1, 0x32, 0x00, 0x03, 0xF0, 0x2C, 0x34, 0x40, 0x0F, 0xCD, 0x00, 0x03, 0xF0, 0x2B, 0x00, 0x03, 0xF0, 0x2D, 0x3B, 0x80, 0x00, 0x01, 0x34, 0x30, 0x0F, 0xCC, 0x00, 0x03, 0xEB, 0x01, 0x3B, 0x50, 0x00, 0x00, 0x34, 0x40, 0x0F, 0xC8, 0x00, 0x03, 0xFF, 0x03, 0x00, 0x03, 0xED, 0x7A, 0x0B, 0x1B, 0xF0, 0x2C, 0x00, 0x03, 0xC0, 0xF1, 0x34, 0x40, 0x0F, 0xCD, 0x00, 0x03, 0xF0, 0x2B, 0x00, 0x03, 0xF0, 0x2D, 0x3B, 0x80, 0x00, 0x01, 0x34, 0x30, 0x0F, 0xCC, 0x00, 0x03, 0xF0, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x03, 0xB8, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x2F, 0x2F, 0x00, 0x21, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x2F, 0x21, 0x00, 0x00, 0x03, 0x04, 0x01, 0x09, 0x0A, 0x07, 0x0E, 0x0F, 0x10, 0x0D, 0x11, 0x00, 0x0D, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x91, 0xA2, 0xB3, 0xC5, 0x01, 0x45, 0x67, 0xC0, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; static void NEARAPI Ac3SPIStart(void) { BoardWriteGPIOReg(SPICLK, FALSE); Delay(2); BoardWriteGPIOReg(SPIENA, FALSE); Delay(2); } static void NEARAPI Ac3SPIStop(void) { Delay(2); BoardWriteGPIOReg(SPIENA, TRUE); } static BYTE NEARAPI Ac3SPISendByte(BYTE data) { BYTE Val; short i; Val = data; for(i=0; i<8; i++) { BoardWriteGPIOReg(SPICLK, TRUE); Delay(2); BoardWriteGPIOReg(SPIDO, (Val & 0x80 ? TRUE : FALSE)); Delay(2); BoardWriteGPIOReg(SPICLK, FALSE); Delay(2); if(BoardReadGPIOReg(SPIDI)) Val = (Val << 1) | 0x01; else Val = (Val << 1); } return Val; } void NEARAPI Ac3SPIReadBack(BYTE command, short numresult, BYTE *result) { short i; Ac3SPIStart(); Ac3SPISendByte(0x00); Ac3SPISendByte(0x00); Ac3SPISendByte(0x00); Ac3SPISendByte(command); Ac3SPISendByte(0x00); Ac3SPISendByte(0x00); for (i=0;i10) { DbgPrint("`*****ERROR : AC3 Boot Failed!!"); break; } } while (!Ac3Boot()); BoardWriteEPLD(AUXCTL, 0x08); Delay(100); Ac3SPIReadBack(0x81, 4, ver); version = ((DWORD)(BYTE)(ver[0]) | ((DWORD)(BYTE)(ver[1]) << 8) | ((DWORD)(BYTE)(ver[2]) << 16) | ((DWORD)(BYTE)(ver[3]) << 24)); DbgPrint("`AC3 Version = %lx\n", version); Ac3SPISendSeq(PARAMSIZE, CfgParams); Ac3SPISendSeq(PARAMSIZE, AC3Params); Ac3Command(AC3_STOP); Ac3Command(AC3_UNMUTE); HwCodecAc3BypassMode(audiodecoutmode & KSAUDDECOUTMODE_SPDIFF); pAc3->starving = FALSE; pAc3->errorCount=0; return TRUE; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3SetBypassMode // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Switch on Bypass Mode // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL Ac3SetBypassMode(void) { Ac3SPISendSeq(PARAMSIZE, CfgParamsBypass); Ac3SPISendSeq(PARAMSIZE, AC3Params); return TRUE; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3SetNormalMode // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Set the normal decoding mode of AC3 // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL Ac3SetNormalMode(void) { Ac3SPISendSeq(PARAMSIZE, CfgParams); Ac3SPISendSeq(PARAMSIZE, AC3Params); return TRUE; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3Reset // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Reset AC3 // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Ac3Reset(void) { pAc3->ac3Data = FALSE; pAc3->errorCount = 0; VideoSeek(); Ac3Command(AC3_STOP); VideoPlay(); pAc3->state = ac3PowerUp; } static void NEARAPI Ac3Command(BYTE command) { Ac3SPISendSeq(1, &command); } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3SendData // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Send data to ac3 chip // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL FARAPI Ac3SendData(BYTE FARPTR *Data, DWORD Size) { DWORD i, PoReg, j; DWORD TimeOut = 0; PoReg = 0x00B00000; pAc3->ac3Data = TRUE; for(i=0; i 0xFFFF) { TRAP break; } } j=0; while(BoardReadGPIOReg(1)) { j++; if(j > 0xFFFFF) { pAc3->state = ac3ErrorRecover; TRAP return FALSE; } // Timeout Condition } memOutDword(POSTOFFICEREG,PoReg|Data[i]); TimeOut = 0; while(memInDword(POSTOFFICEREG)&02000000L) { TimeOut++; if(TimeOut > 0xFFFF) { TRAP break; } } } Ac3CheckStatus(); return TRUE; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3Boot // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Boot AC3 chip // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL FARAPI Ac3Boot(void) { short i,num=0; BYTE Val, b; BOOL fail = FALSE; Ac3SPIStart(); b=Ac3SPISendByte(0); b=Ac3SPISendByte(0); b=Ac3SPISendByte(0); b=Ac3SPISendByte(0); num = 0; i = 0; while(istate = ac3PowerUp; return pAc3; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3GetPTS // PARAMS : None // RETURNS : PTS // // PURPOSE : Read AC3 PTS // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DWORD Ac3GetPTS(void) { DWORD pts; BYTE buf[16]; Ac3SPIReadBack(0x8e, 16, buf); pts = (DWORD)buf[15] | (DWORD) buf[14] << 8 | (DWORD) buf[13] << 16 | (DWORD) buf[12] << 24; pAc3->status = buf[0] >> 5; if(pAc3->status == 2) { pAc3->status = (buf[1] >> 3) & 7; if(pAc3->state == ac3Playing) { pAc3->errorCount++; DbgPrint("`Error in Ac3 decoding Errno : %ld\n",pAc3->status); // Ac3Command(AC3_STOPF); // Ac3Command(AC3_PLAY); // Ac3Command(AC3_UNMUTE); } } return pts; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3Play // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Play AC3 // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL Ac3Play(void) { VideoGetABL(); switch(pAc3->state) { case ac3Paused: BoardWriteAudio(AUD_PLY, 0x01); Ac3Command(AC3_UNMUTE); Ac3Command(AC3_PLAY); pAc3->state = ac3Playing; break; case ac3Startup: if(pVideo->abl > MINABL) { BoardWriteAudio(AUD_PLY, 0x01); Ac3Command(AC3_UNMUTE); Ac3Command(AC3_PLAY); pAc3->state = ac3Playing; } break; case ac3Playing: break; default: pAc3->state = ac3Startup; break; } return TRUE; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3CheckStatus // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Check device status // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Ac3CheckStatus(void) { VideoGetABL(); switch(pAc3->state) { case ac3Playing: if(pVideo->abl < 20) { pAc3->state = ac3Starving; BoardWriteAudio(AUD_PLY, 0x0); Ac3Command(AC3_MUTE); Ac3Command(AC3_STOP); } break; case ac3Starving: if(pVideo->abl > 30) { pAc3->state = ac3Playing; BoardWriteAudio(AUD_PLY, 0x01); Ac3Command(AC3_UNMUTE); Ac3Command(AC3_PLAY); } break; case ac3Startup: if(pVideo->abl > MINABL) { BoardWriteAudio(AUD_PLY, 0x01); Ac3Command(AC3_UNMUTE); Ac3Command(AC3_PLAY); pAc3->state = ac3Playing; } break; default: break; } } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3Pause // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Pause // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL Ac3Pause(void) { pAc3->state = ac3Paused; Ac3Command(AC3_MUTE); Ac3Command(AC3_STOP); BoardWriteAudio(AUD_PLY, 0x00); return TRUE; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3Stop // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Pause // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL Ac3Stop(void) { pAc3->state = ac3Paused; Ac3Command(AC3_STOPF); BoardWriteAudio(AUD_PLY, 0x00); return TRUE; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // // // FUNCTION : Ac3Close // PARAMS : None // RETURNS : TRUE on success FALSE otherwise // // PURPOSE : Close // // // //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL Ac3Close(void) { return TRUE; }