/* * Copyright 2006-2007 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ /** Module Name: CD_Operations.c Abstract: Functions Implementing Command Operations and other common functions Revision History: NEG:27.09.2002 Initiated. --*/ #define __SW_4 #include "Decoder.h" #include "atombios.h" VOID PutDataRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID PutDataPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID PutDataWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID PutDataFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID PutDataPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID PutDataMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersDirect32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersDirect16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersDirect8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID SkipParameters16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID SkipParameters8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersIndirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT32 GetParametersDirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData); UINT16* GetDataMasterTablePointer(DEVICE_DATA STACK_BASED* pDeviceData); UINT8 GetTrueIndexInMasterTable(PARSER_TEMP_DATA STACK_BASED * pParserTempData, UINT8 IndexInMasterTable); WRITE_IO_FUNCTION WritePCIFunctions[8] = { WritePCIReg32, WritePCIReg16, WritePCIReg16, WritePCIReg16, WritePCIReg8,WritePCIReg8,WritePCIReg8,WritePCIReg8 }; WRITE_IO_FUNCTION WriteIOFunctions[8] = { WriteSysIOReg32, WriteSysIOReg16,WriteSysIOReg16,WriteSysIOReg16, WriteSysIOReg8,WriteSysIOReg8,WriteSysIOReg8,WriteSysIOReg8 }; READ_IO_FUNCTION ReadPCIFunctions[8] = { (READ_IO_FUNCTION)ReadPCIReg32, (READ_IO_FUNCTION)ReadPCIReg16, (READ_IO_FUNCTION)ReadPCIReg16, (READ_IO_FUNCTION)ReadPCIReg16, (READ_IO_FUNCTION)ReadPCIReg8, (READ_IO_FUNCTION)ReadPCIReg8, (READ_IO_FUNCTION)ReadPCIReg8, (READ_IO_FUNCTION)ReadPCIReg8 }; READ_IO_FUNCTION ReadIOFunctions[8] = { (READ_IO_FUNCTION)ReadSysIOReg32, (READ_IO_FUNCTION)ReadSysIOReg16, (READ_IO_FUNCTION)ReadSysIOReg16, (READ_IO_FUNCTION)ReadSysIOReg16, (READ_IO_FUNCTION)ReadSysIOReg8, (READ_IO_FUNCTION)ReadSysIOReg8, (READ_IO_FUNCTION)ReadSysIOReg8, (READ_IO_FUNCTION)ReadSysIOReg8 }; READ_IO_FUNCTION GetParametersDirectArray[8]={ GetParametersDirect32, GetParametersDirect16,GetParametersDirect16,GetParametersDirect16, GetParametersDirect8,GetParametersDirect8,GetParametersDirect8, GetParametersDirect8 }; COMMANDS_DECODER PutDataFunctions[6] = { PutDataRegister, PutDataPS, PutDataWS, PutDataFB, PutDataPLL, PutDataMC }; CD_GET_PARAMETERS GetDestination[6] = { GetParametersRegister, GetParametersPS, GetParametersWS, GetParametersFB, GetParametersPLL, GetParametersMC }; COMMANDS_DECODER SkipDestination[6] = { SkipParameters16, SkipParameters8, SkipParameters8, SkipParameters8, SkipParameters8, SkipParameters8 }; CD_GET_PARAMETERS GetSource[8] = { GetParametersRegister, GetParametersPS, GetParametersWS, GetParametersFB, GetParametersIndirect, GetParametersDirect, GetParametersPLL, GetParametersMC }; UINT32 AlignmentMask[8] = {0xFFFFFFFF,0xFFFF,0xFFFF,0xFFFF,0xFF,0xFF,0xFF,0xFF}; UINT8 SourceAlignmentShift[8] = {0,0,8,16,0,8,16,24}; UINT8 DestinationAlignmentShift[4] = {0,8,16,24}; #define INDIRECTIO_ID 1 #define INDIRECTIO_END_OF_ID 9 VOID IndirectIOCommand(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID IndirectIOCommand_MOVE(PARSER_TEMP_DATA STACK_BASED * pParserTempData, UINT32 temp); VOID IndirectIOCommand_MOVE_INDEX(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID IndirectIOCommand_MOVE_ATTR(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID IndirectIOCommand_MOVE_DATA(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID IndirectIOCommand_SET(PARSER_TEMP_DATA STACK_BASED * pParserTempData); VOID IndirectIOCommand_CLEAR(PARSER_TEMP_DATA STACK_BASED * pParserTempData); INDIRECT_IO_PARSER_COMMANDS IndirectIOParserCommands[10]={ {IndirectIOCommand,1}, {IndirectIOCommand,2}, {ReadIndReg32,3}, {WriteIndReg32,3}, {IndirectIOCommand_CLEAR,3}, {IndirectIOCommand_SET,3}, {IndirectIOCommand_MOVE_INDEX,4}, {IndirectIOCommand_MOVE_ATTR,4}, {IndirectIOCommand_MOVE_DATA,4}, {IndirectIOCommand,3} }; VOID IndirectIOCommand(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { } VOID IndirectIOCommand_MOVE_INDEX(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[3]); pParserTempData->IndirectData |=(((pParserTempData->Index >> pParserTempData->IndirectIOTablePointer[2]) & (0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1]))) << pParserTempData->IndirectIOTablePointer[3]); } VOID IndirectIOCommand_MOVE_ATTR(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[3]); pParserTempData->IndirectData |=(((pParserTempData->AttributesData >> pParserTempData->IndirectIOTablePointer[2]) & (0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1]))) << pParserTempData->IndirectIOTablePointer[3]); } VOID IndirectIOCommand_MOVE_DATA(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[3]); pParserTempData->IndirectData |=(((pParserTempData->DestData32 >> pParserTempData->IndirectIOTablePointer[2]) & (0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1]))) << pParserTempData->IndirectIOTablePointer[3]); } VOID IndirectIOCommand_SET(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->IndirectData |= ((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[2]); } VOID IndirectIOCommand_CLEAR(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[2]); } UINT32 IndirectInputOutput(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { // if ((pParserTempData->IndirectData & 0x7f)==INDIRECT_IO_MM) pParserTempData->IndirectData|=pParserTempData->CurrentPortID; // pParserTempData->IndirectIOTablePointer=pParserTempData->IndirectIOTable; while (*pParserTempData->IndirectIOTablePointer) { if ((pParserTempData->IndirectIOTablePointer[0] == INDIRECTIO_ID) && (pParserTempData->IndirectIOTablePointer[1] == pParserTempData->IndirectData)) { pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; while (*pParserTempData->IndirectIOTablePointer != INDIRECTIO_END_OF_ID) { IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].func(pParserTempData); pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; } pParserTempData->IndirectIOTablePointer-=*(UINT16*)(pParserTempData->IndirectIOTablePointer+1); pParserTempData->IndirectIOTablePointer++; return pParserTempData->IndirectData; } else pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; } return 0; } VOID PutDataRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.WordXX.PA_Destination; pParserTempData->Index+=pParserTempData->CurrentRegBlock; switch(pParserTempData->Multipurpose.CurrentPort){ case ATI_RegsPort: if (pParserTempData->CurrentPortID == INDIRECT_IO_MM) { if (pParserTempData->Index==0) pParserTempData->DestData32 <<= 2; WriteReg32( pParserTempData); } else { pParserTempData->IndirectData=pParserTempData->CurrentPortID+INDIRECT_IO_WRITE; IndirectInputOutput(pParserTempData); } break; case PCI_Port: WritePCIFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); break; case SystemIO_Port: WriteIOFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); break; } } VOID PutDataPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { *(pParserTempData->pDeviceData->pParameterSpace+pParserTempData->pCmd->Parameters.ByteXX.PA_Destination)= pParserTempData->DestData32; } VOID PutDataWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { if (pParserTempData->pCmd->Parameters.ByteXX.PA_Destination < WS_QUOTIENT_C) *(pParserTempData->pWorkingTableData->pWorkSpace+pParserTempData->pCmd->Parameters.ByteXX.PA_Destination) = pParserTempData->DestData32; else switch (pParserTempData->pCmd->Parameters.ByteXX.PA_Destination) { case WS_REMINDER_C: pParserTempData->MultiplicationOrDivision.Division.Reminder32=pParserTempData->DestData32; break; case WS_QUOTIENT_C: pParserTempData->MultiplicationOrDivision.Division.Quotient32=pParserTempData->DestData32; break; case WS_DATAPTR_C: #ifndef UEFI_BUILD pParserTempData->CurrentDataBlock=(UINT16)pParserTempData->DestData32; #else pParserTempData->CurrentDataBlock=(UINTN)pParserTempData->DestData32; #endif break; case WS_SHIFT_C: pParserTempData->Shift2MaskConverter=(UINT8)pParserTempData->DestData32; break; case WS_FB_WINDOW_C: pParserTempData->CurrentFB_Window=pParserTempData->DestData32; break; case WS_ATTRIBUTES_C: pParserTempData->AttributesData=(UINT16)pParserTempData->DestData32; break; } } VOID PutDataFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.ByteXX.PA_Destination; //Make an Index from address first, then add to the Index pParserTempData->Index+=(pParserTempData->CurrentFB_Window>>2); WriteFrameBuffer32(pParserTempData); } VOID PutDataPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.ByteXX.PA_Destination; WritePLL32( pParserTempData ); } VOID PutDataMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.ByteXX.PA_Destination; WriteMC32( pParserTempData ); } VOID SkipParameters8(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); } VOID SkipParameters16(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); } UINT32 GetParametersRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=*(UINT16*)pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); pParserTempData->Index+=pParserTempData->CurrentRegBlock; switch(pParserTempData->Multipurpose.CurrentPort) { case PCI_Port: return ReadPCIFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); case SystemIO_Port: return ReadIOFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); case ATI_RegsPort: default: if (pParserTempData->CurrentPortID == INDIRECT_IO_MM) return ReadReg32( pParserTempData ); else { pParserTempData->IndirectData=pParserTempData->CurrentPortID+INDIRECT_IO_READ; return IndirectInputOutput(pParserTempData); } } } UINT32 GetParametersPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); return *(pParserTempData->pDeviceData->pParameterSpace+pParserTempData->Index); } UINT32 GetParametersWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); if (pParserTempData->Index < WS_QUOTIENT_C) return *(pParserTempData->pWorkingTableData->pWorkSpace+pParserTempData->Index); else switch (pParserTempData->Index) { case WS_REMINDER_C: return pParserTempData->MultiplicationOrDivision.Division.Reminder32; case WS_QUOTIENT_C: return pParserTempData->MultiplicationOrDivision.Division.Quotient32; case WS_DATAPTR_C: return (UINT32)pParserTempData->CurrentDataBlock; case WS_OR_MASK_C: return ((UINT32)1) << pParserTempData->Shift2MaskConverter; case WS_AND_MASK_C: return ~(((UINT32)1) << pParserTempData->Shift2MaskConverter); case WS_FB_WINDOW_C: return pParserTempData->CurrentFB_Window; case WS_ATTRIBUTES_C: return pParserTempData->AttributesData; } return 0; } UINT32 GetParametersFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); pParserTempData->Index+=(pParserTempData->CurrentFB_Window>>2); return ReadFrameBuffer32(pParserTempData); } UINT32 GetParametersPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); return ReadPLL32( pParserTempData ); } UINT32 GetParametersMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); return ReadMC32( pParserTempData ); } UINT32 GetParametersIndirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Index=*(UINT16*)pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); return *(UINT32*)(RELATIVE_TO_BIOS_IMAGE(pParserTempData->Index)+pParserTempData->CurrentDataBlock); } UINT32 GetParametersDirect8(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->CD_Mask.SrcAlignment=alignmentByte0; pParserTempData->Index=*(UINT8*)pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); return pParserTempData->Index; } UINT32 GetParametersDirect16(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->CD_Mask.SrcAlignment=alignmentLowerWord; pParserTempData->Index=*(UINT16*)pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); return pParserTempData->Index; } UINT32 GetParametersDirect32(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->CD_Mask.SrcAlignment=alignmentDword; pParserTempData->Index=*(UINT32*)pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT32); return pParserTempData->Index; } UINT32 GetParametersDirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { return GetParametersDirectArray[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); } VOID CommonSourceDataTransformation(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->SourceData32 <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; } VOID CommonOperationDataTransformation(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->DestData32 >>= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; pParserTempData->DestData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; } VOID ProcessMove(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { if (pParserTempData->CD_Mask.SrcAlignment!=alignmentDword) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); } else { SkipDestination[pParserTempData->ParametersType.Destination](pParserTempData); } pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); if (pParserTempData->CD_Mask.SrcAlignment!=alignmentDword) { pParserTempData->DestData32 &= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]); CommonSourceDataTransformation(pParserTempData); pParserTempData->DestData32 |= pParserTempData->SourceData32; } else { pParserTempData->DestData32=pParserTempData->SourceData32; } PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessMask(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetParametersDirect(pParserTempData); pParserTempData->Index=GetParametersDirect(pParserTempData); pParserTempData->SourceData32 <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; pParserTempData->SourceData32 |= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]); pParserTempData->DestData32 &= pParserTempData->SourceData32; pParserTempData->Index &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->Index <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; pParserTempData->DestData32 |= pParserTempData->Index; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessAnd(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->SourceData32 <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; pParserTempData->SourceData32 |= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]); pParserTempData->DestData32 &= pParserTempData->SourceData32; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessOr(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonSourceDataTransformation(pParserTempData); pParserTempData->DestData32 |= pParserTempData->SourceData32; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessXor(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonSourceDataTransformation(pParserTempData); pParserTempData->DestData32 ^= pParserTempData->SourceData32; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessShl(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonSourceDataTransformation(pParserTempData); pParserTempData->DestData32 <<= pParserTempData->SourceData32; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessShr(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonSourceDataTransformation(pParserTempData); pParserTempData->DestData32 >>= pParserTempData->SourceData32; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessADD(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonSourceDataTransformation(pParserTempData); pParserTempData->DestData32 += pParserTempData->SourceData32; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessSUB(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonSourceDataTransformation(pParserTempData); pParserTempData->DestData32 -= pParserTempData->SourceData32; PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessMUL(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonOperationDataTransformation(pParserTempData); pParserTempData->MultiplicationOrDivision.Multiplication.Low32Bit=pParserTempData->DestData32 * pParserTempData->SourceData32; } VOID ProcessDIV(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonOperationDataTransformation(pParserTempData); pParserTempData->MultiplicationOrDivision.Division.Quotient32= pParserTempData->DestData32 / pParserTempData->SourceData32; pParserTempData->MultiplicationOrDivision.Division.Reminder32= pParserTempData->DestData32 % pParserTempData->SourceData32; } VOID ProcessCompare(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonOperationDataTransformation(pParserTempData); // Here we just set flags based on evaluation if (pParserTempData->DestData32==pParserTempData->SourceData32) pParserTempData->CompareFlags = Equal; else pParserTempData->CompareFlags = (UINT8)((pParserTempData->DestData32<pParserTempData->SourceData32) ? Below : Above); } VOID ProcessClear(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->DestData32 &= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]); PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessShift(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { UINT32 mask = AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetParametersDirect8(pParserTempData); // save original value of the destination pParserTempData->Index = pParserTempData->DestData32 & ~mask; pParserTempData->DestData32 &= mask; if (pParserTempData->pCmd->Header.Opcode < SHIFT_RIGHT_REG_OPCODE) pParserTempData->DestData32 <<= pParserTempData->SourceData32; else pParserTempData->DestData32 >>= pParserTempData->SourceData32; // Clear any bits shifted out of masked area... pParserTempData->DestData32 &= mask; // ... and restore the area outside of masked with original values pParserTempData->DestData32 |= pParserTempData->Index; // write data back PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); } VOID ProcessTest(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); CommonOperationDataTransformation(pParserTempData); pParserTempData->CompareFlags = (UINT8)((pParserTempData->DestData32 & pParserTempData->SourceData32) ? NotEqual : Equal); } VOID ProcessSetFB_Base(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->CurrentFB_Window=pParserTempData->SourceData32; } VOID ProcessSwitch(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; while ( *(UINT16*)pParserTempData->pWorkingTableData->IP != (((UINT16)NOP_OPCODE << 8)+NOP_OPCODE)) { if (*pParserTempData->pWorkingTableData->IP == 'c') { pParserTempData->pWorkingTableData->IP++; pParserTempData->DestData32=GetParametersDirect(pParserTempData); pParserTempData->Index=GetParametersDirect16(pParserTempData); if (pParserTempData->SourceData32 == pParserTempData->DestData32) { pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(pParserTempData->Index); return; } } } pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); } VOID cmdSetDataBlock(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { UINT8 value; UINT16* pMasterDataTable; value=((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; if (value == 0) pParserTempData->CurrentDataBlock=0; else { if (value == DB_CURRENT_COMMAND_TABLE) { pParserTempData->CurrentDataBlock= (UINT16)(pParserTempData->pWorkingTableData->pTableHead-pParserTempData->pDeviceData->pBIOS_Image); } else { pMasterDataTable = GetDataMasterTablePointer(pParserTempData->pDeviceData); pParserTempData->CurrentDataBlock= (TABLE_UNIT_TYPE)((PTABLE_UNIT_TYPE)pMasterDataTable)[value]; } } pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); } VOID cmdSet_ATI_Port(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Multipurpose.CurrentPort=ATI_RegsPort; pParserTempData->CurrentPortID = (UINT8)((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.WordXX.PA_Destination; pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); } VOID cmdSet_Reg_Block(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->CurrentRegBlock = ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.WordXX.PA_Destination; pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); } //Atavism!!! Review!!! VOID cmdSet_X_Port(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ pParserTempData->Multipurpose.CurrentPort=pParserTempData->ParametersType.Destination; pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_ONLY); } VOID cmdDelay_Millisec(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ pParserTempData->SourceData32 = ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; DelayMilliseconds(pParserTempData); pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); } VOID cmdDelay_Microsec(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ pParserTempData->SourceData32 = ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; DelayMicroseconds(pParserTempData); pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); } VOID ProcessPostChar(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->SourceData32 = ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; PostCharOutput(pParserTempData); pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); } VOID ProcessDebug(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->SourceData32 = ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; CallerDebugFunc(pParserTempData); pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); } VOID ProcessDS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->pWorkingTableData->IP+=((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.WordXX.PA_Destination+sizeof(COMMAND_TYPE_OPCODE_OFFSET16); } VOID cmdCall_Table(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ UINT16* MasterTableOffset; pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); MasterTableOffset = GetCommandMasterTablePointer(pParserTempData->pDeviceData); if(((PTABLE_UNIT_TYPE)MasterTableOffset)[((COMMAND_TYPE_OPCODE_VALUE_BYTE*)pParserTempData->pCmd)->Value]!=0 ) // if the offset is not ZERO { pParserTempData->CommandSpecific.IndexInMasterTable=GetTrueIndexInMasterTable(pParserTempData,((COMMAND_TYPE_OPCODE_VALUE_BYTE*)pParserTempData->pCmd)->Value); pParserTempData->Multipurpose.PS_SizeInDwordsUsedByCallingTable = (((ATOM_COMMON_ROM_COMMAND_TABLE_HEADER *)pParserTempData->pWorkingTableData->pTableHead)->TableAttribute.PS_SizeInBytes>>2); pParserTempData->pDeviceData->pParameterSpace+= pParserTempData->Multipurpose.PS_SizeInDwordsUsedByCallingTable; pParserTempData->Status=CD_CALL_TABLE; pParserTempData->pCmd=(GENERIC_ATTRIBUTE_COMMAND*)MasterTableOffset; } } VOID cmdNOP_(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { } static VOID NotImplemented(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->Status = CD_NOT_IMPLEMENTED; } VOID ProcessJump(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { if ((pParserTempData->ParametersType.Destination == NoCondition) || (pParserTempData->ParametersType.Destination == pParserTempData->CompareFlags )) { pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(((COMMAND_TYPE_OPCODE_OFFSET16*)pParserTempData->pWorkingTableData->IP)->CD_Offset16); } else { pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); } } VOID ProcessJumpE(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { if ((pParserTempData->CompareFlags == Equal) || (pParserTempData->CompareFlags == pParserTempData->ParametersType.Destination)) { pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(((COMMAND_TYPE_OPCODE_OFFSET16*)pParserTempData->pWorkingTableData->IP)->CD_Offset16); } else { pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); } } VOID ProcessJumpNE(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { if (pParserTempData->CompareFlags != Equal) { pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(((COMMAND_TYPE_OPCODE_OFFSET16*)pParserTempData->pWorkingTableData->IP)->CD_Offset16); } else { pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); } } COMMANDS_PROPERTIES CallTable[] = { { NULL, 0,0}, { ProcessMove, destRegister, sizeof(COMMAND_HEADER)}, { ProcessMove, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessMove, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessMove, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessMove, destPLL, sizeof(COMMAND_HEADER)}, { ProcessMove, destMC, sizeof(COMMAND_HEADER)}, { ProcessAnd, destRegister, sizeof(COMMAND_HEADER)}, { ProcessAnd, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessAnd, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessAnd, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessAnd, destPLL, sizeof(COMMAND_HEADER)}, { ProcessAnd, destMC, sizeof(COMMAND_HEADER)}, { ProcessOr, destRegister, sizeof(COMMAND_HEADER)}, { ProcessOr, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessOr, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessOr, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessOr, destPLL, sizeof(COMMAND_HEADER)}, { ProcessOr, destMC, sizeof(COMMAND_HEADER)}, { ProcessShift, destRegister, sizeof(COMMAND_HEADER)}, { ProcessShift, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessShift, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessShift, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessShift, destPLL, sizeof(COMMAND_HEADER)}, { ProcessShift, destMC, sizeof(COMMAND_HEADER)}, { ProcessShift, destRegister, sizeof(COMMAND_HEADER)}, { ProcessShift, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessShift, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessShift, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessShift, destPLL, sizeof(COMMAND_HEADER)}, { ProcessShift, destMC, sizeof(COMMAND_HEADER)}, { ProcessMUL, destRegister, sizeof(COMMAND_HEADER)}, { ProcessMUL, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessMUL, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessMUL, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessMUL, destPLL, sizeof(COMMAND_HEADER)}, { ProcessMUL, destMC, sizeof(COMMAND_HEADER)}, { ProcessDIV, destRegister, sizeof(COMMAND_HEADER)}, { ProcessDIV, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessDIV, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessDIV, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessDIV, destPLL, sizeof(COMMAND_HEADER)}, { ProcessDIV, destMC, sizeof(COMMAND_HEADER)}, { ProcessADD, destRegister, sizeof(COMMAND_HEADER)}, { ProcessADD, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessADD, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessADD, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessADD, destPLL, sizeof(COMMAND_HEADER)}, { ProcessADD, destMC, sizeof(COMMAND_HEADER)}, { ProcessSUB, destRegister, sizeof(COMMAND_HEADER)}, { ProcessSUB, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessSUB, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessSUB, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessSUB, destPLL, sizeof(COMMAND_HEADER)}, { ProcessSUB, destMC, sizeof(COMMAND_HEADER)}, { cmdSet_ATI_Port, ATI_RegsPort, 0}, { cmdSet_X_Port, PCI_Port, 0}, { cmdSet_X_Port, SystemIO_Port, 0}, { cmdSet_Reg_Block, 0, 0}, { ProcessSetFB_Base,0, sizeof(COMMAND_HEADER)}, { ProcessCompare, destRegister, sizeof(COMMAND_HEADER)}, { ProcessCompare, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessCompare, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessCompare, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessCompare, destPLL, sizeof(COMMAND_HEADER)}, { ProcessCompare, destMC, sizeof(COMMAND_HEADER)}, { ProcessSwitch, 0, sizeof(COMMAND_HEADER)}, { ProcessJump, NoCondition, 0}, { ProcessJump, Equal, 0}, { ProcessJump, Below, 0}, { ProcessJump, Above, 0}, { ProcessJumpE, Below, 0}, { ProcessJumpE, Above, 0}, { ProcessJumpNE, 0, 0}, { ProcessTest, destRegister, sizeof(COMMAND_HEADER)}, { ProcessTest, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessTest, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessTest, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessTest, destPLL, sizeof(COMMAND_HEADER)}, { ProcessTest, destMC, sizeof(COMMAND_HEADER)}, { cmdDelay_Millisec,0, 0}, { cmdDelay_Microsec,0, 0}, { cmdCall_Table, 0, 0}, /*cmdRepeat*/ { NotImplemented, 0, 0}, { ProcessClear, destRegister, sizeof(COMMAND_HEADER)}, { ProcessClear, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessClear, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessClear, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessClear, destPLL, sizeof(COMMAND_HEADER)}, { ProcessClear, destMC, sizeof(COMMAND_HEADER)}, { cmdNOP_, 0, sizeof(COMMAND_TYPE_OPCODE_ONLY)}, /*cmdEOT*/ { cmdNOP_, 0, sizeof(COMMAND_TYPE_OPCODE_ONLY)}, { ProcessMask, destRegister, sizeof(COMMAND_HEADER)}, { ProcessMask, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessMask, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessMask, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessMask, destPLL, sizeof(COMMAND_HEADER)}, { ProcessMask, destMC, sizeof(COMMAND_HEADER)}, /*cmdPost_Card*/ { ProcessPostChar, 0, 0}, /*cmdBeep*/ { NotImplemented, 0, 0}, /*cmdSave_Reg*/ { NotImplemented, 0, 0}, /*cmdRestore_Reg*/{ NotImplemented, 0, 0}, { cmdSetDataBlock, 0, 0}, { ProcessXor, destRegister, sizeof(COMMAND_HEADER)}, { ProcessXor, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessXor, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessXor, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessXor, destPLL, sizeof(COMMAND_HEADER)}, { ProcessXor, destMC, sizeof(COMMAND_HEADER)}, { ProcessShl, destRegister, sizeof(COMMAND_HEADER)}, { ProcessShl, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessShl, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessShl, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessShl, destPLL, sizeof(COMMAND_HEADER)}, { ProcessShl, destMC, sizeof(COMMAND_HEADER)}, { ProcessShr, destRegister, sizeof(COMMAND_HEADER)}, { ProcessShr, destParamSpace, sizeof(COMMAND_HEADER)}, { ProcessShr, destWorkSpace, sizeof(COMMAND_HEADER)}, { ProcessShr, destFrameBuffer, sizeof(COMMAND_HEADER)}, { ProcessShr, destPLL, sizeof(COMMAND_HEADER)}, { ProcessShr, destMC, sizeof(COMMAND_HEADER)}, /*cmdDebug*/ { ProcessDebug, 0, 0}, { ProcessDS, 0, 0}, }; // EOF