⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdproc_debug.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    strcat(CurString, "Multiply ");
                    break;
                case SET_DIV:
                    strcat(CurString, "Divide ");
                    break;
                case SET_MOD:
                    strcat(CurString, "Modulo ");
                    break;
                case SET_RND:
                    strcat(CurString, "Random Number ");
                    break;
                case SET_AND:
                    strcat(CurString, "Bitwise And ");
                    break;
                case SET_OR:
                    strcat(CurString, "Bitwise OR ");
                    break;
                case SET_XOR:
                    strcat(CurString, "Bitwise XOR ");
                    break;
                case SET_BITSET:
                    strcat(CurString, "Bitwise Set ");
                    break;
                case SET_BITCLR:
                    strcat(CurString, "Bitwise Clear ");
                    break;
                case SET_SHL:
                    strcat(CurString, "Shift Left ");
                    break;
                case SET_SHR:
                    strcat(CurString, "Shift Right ");
                    break;
                default:
                    strcat(CurString, "Invalid Set Command Option ");
                    DbgPrint(("invalid set command option %d\n", SetOption));
                    break;
            }
        }
        else if (CmdSubGroup == SET_SYSTEM)
        {
            switch (SetOption)
            {
                case SET_STREAM:
                    strcat(CurString, "Stream ");

                    if (OpCount != 2)
                    {
                        DbgPrint(("invalid number of operands for Set Stream\n"));
                    }

                    /* operand one */
                    /* audio flag */
                    if (CurCmd[1] & 0x80000000)
                    {
                        strcat(CurString, "Audio_flag, ");
                    }
                    else
                    {
                        strcat(CurString, "no Audio_flag ");
                    }

                    /* PG Text st flag */
                    if (CurCmd[1] & 0x00008000)
                    {
                        strcat(CurString, "PG_textST, ");
                    }
                    else
                    {
                        strcat(CurString, "no PG_textST, ");
                    }

                    /* disp_s flag */
                    if (CurCmd[1] & 0x00004000)
                    {
                        strcat(CurString, "disp_s_flag, ");
                    }
                    else
                    {
                        strcat(CurString, "no disp_s_flag, ");
                    }

                    if (FlagOpOne == 1)
                    {
                        sprintf(tempstring, "Primary Audio Stm %d, ", (CurCmd[1] & 0x00FF0000) >> 16);
                        strcat(CurString, tempstring);

                        sprintf(tempstring, "PG TextST Stream Num %d, ", CurCmd[1] & 0x00000FFF);
                        strcat(CurString, tempstring);
                    }
                    else
                    {
                        sprintf(tempstring, "GPR Num Pri Aud Stm %d (Curval=%d), ", (CurCmd[1] & 0x0FFF0000) >> 16,
                            DebugNavCmdGetRegisterValue((CurCmd[1] & 0x0FFF0000) >> 16, 0) );
                        strcat(CurString, tempstring);

                        sprintf(tempstring, "GPR Num PGTextST Stm %d (Curval=%d), ", CurCmd[1] & 0x00000FFF,
                            DebugNavCmdGetRegisterValue(CurCmd[1] & 0x00000FFF, 0) );
                        strcat(CurString, tempstring);
                    }

                    /* operand two */
                    /* ig flag */
                    if (CurCmd[1] & 0x80000000)
                    {
                        strcat(CurString, "IG_flag, ");
                    }
                    else
                    {
                        strcat(CurString, "no IG_flag ");
                    }

                    /* angle flag */
                    if (CurCmd[1] & 0x00004000)
                    {
                        strcat(CurString, "angle_flag, ");
                    }
                    else
                    {
                        strcat(CurString, "no angle_flag ");
                    }

                    if (FlagOpTwo == 1)
                    {
                        sprintf(tempstring, "Angle Number %d ", CurCmd[1] & 0x000000FF);
                        strcat(CurString, tempstring);
                    }
                    else
                    {
                        sprintf(tempstring, "GPR Number %d ", CurCmd[1] & 0x00000FFF);
                        strcat(CurString, tempstring);
                    }

                    break;
                case SET_NVTIMER:
                    strcat(CurString, "NV Timer ");

                    if (OpCount != 2)
                    {
                        DbgPrint(("set NV Timer error, needs two operands\n"));
                    }

                    if (FlagOpOne == 1)
                    {
                        sprintf(tempstring, "MObj ID %d, ", CurCmd[1] & 0x0000FFFF);
                        strcat(CurString, tempstring);
                    }
                    else
                    {
                        sprintf(tempstring, "GPR Num %d, ", CurCmd[1] & 0x00000FFF);
                        strcat(CurString, tempstring);
                    }

                    if (FlagOpTwo == 1)
                    {
                        sprintf(tempstring, "Timer Value %d ", CurCmd[1] & 0x0000FFFF);
                        strcat(CurString, tempstring);
                    }
                    else
                    {
                        sprintf(tempstring, "GPR Num Timer Value %d ", CurCmd[1] & 0x00000FFF);
                        strcat(CurString, tempstring);
                    }

                    break;
                case SET_BTNPG:
                    strcat(CurString, "ButtonPage ");

                    /* btn flag */
                    if (CurCmd[1] & 0x80000000)
                    {
                        strcat(CurString, "Btn_flag, ");
                    }
                    else
                    {
                        strcat(CurString, "no Btn_flag, ");
                    }

                    if (FlagOpOne == 1)
                    {
                        sprintf(tempstring, "Selected Button ID: %d ", CurCmd[1] & 0x0000FFFF);
                        strcat(CurString, tempstring);
                    }
                    else
                    {
                        sprintf(tempstring, "GPR # Selected BTN ID %d, ", CurCmd[1] & 0x00000FFF);
                        strcat(CurString, tempstring);
                    }

                    /* the page flag */
                    if (CurCmd[2] & 0x80000000)
                    {
                        strcat(CurString, "Page_flag, ");
                    }
                    else
                    {
                        strcat(CurString, "no Page_flag, ");
                    }

                    /* the effect off flag */
                    if (CurCmd[2] & 0x40000000)
                    {
                        strcat(CurString, "Eff_off, ");
                    }
                    else
                    {
                        strcat(CurString, "no Eff_off, ");
                    }

                    if (FlagOpTwo == 1)
                    {
                        sprintf(tempstring, "PageID: %d ", CurCmd[2] & 0x00000FF);
                        strcat(CurString, tempstring);
                    }
                    else if (FlagOpTwo == 0)
                    {
                        sprintf(tempstring, "GPR for Page ID: %d (%d) ", CurCmd[2] & 0x00000FFF,
                            DebugNavCmdGetRegisterValue(CurCmd[2] & 0x00000FFF, 0));
                        strcat(CurString, tempstring);
                    }

                    break;
                case SET_ENBTN:
                    strcat(CurString, "Enable Button ");

                    if (FlagOpOne == 1)
                    {
                        sprintf(tempstring, "ButtonID %d ", CurCmd[1] & 0xFFFF);
                        strcat(CurString, tempstring);
                    }
                    else
                    {
                        sprintf(tempstring, "GPR #:%d GPR # BTN ID %d, ", ((CurCmd[1] & 0x00000F00) >> 8), CurCmd[1] & 0x000000FF);
                        strcat(CurString, tempstring);
                    }

                    break;
                case SET_DISBTN:
                    strcat(CurString, "Disable Button ");

                    if (FlagOpOne == 1)
                    {
                        sprintf(tempstring, "ButtonID %d ", CurCmd[1] & 0xFFFF);
                        strcat(CurString, tempstring);
                    }
                    else
                    {
                        sprintf(tempstring, "GPR # BTN ID %d (%d), ", CurCmd[1] & 0x00000FFF,
                            DebugNavCmdGetRegisterValue(CurCmd[1] & 0x00000FFF, 0));
                        strcat(CurString, tempstring);
                    }
                    break;
                case SET_SECSTM:
                    strcat(CurString, "Set Secondary Stream ");
                    break;
                case SET_POPOFF:
                    strcat(CurString, "Popup Menu Off ");
                    break;
                case SET_STLON:
                    strcat(CurString, "Still On ");
                    break;
                case SET_STLOFF:
                    strcat(CurString, "Still Off ");
                    break;
                case SET_RESV10:
                    strcat(CurString, "Reserved Cmd 10 ");
                    break;
                case SET_RESV11:
                    strcat(CurString, "Reserved Cmd 11 ");
                    break;
                default:
                    strcat(CurString, "Invalid Set System Group ");
                    DbgPrint(("Invalid set system group\n"));
                    break;
            }
        }
        else
        {
            DbgPrint(("invalid Set Subgroup "));
        }
    }
    else
    {
        DbgPrint(("invalid command group given "));
    }

    /* only print register values if we are doing COMPARE or SET with a SET_GRP */
    if ((CmdGroup == 2) && (CmdSubGroup == SET_GRP))
    {
        if (OpCount == 1)
        {
            if (FlagOpOne == 0)
            {
                RegFlag = (CurCmd[1] & 0x80000000) >> 31;
                RegNum = (CurCmd[1] & 0xFFF);

                if (RegFlag == 0)
                {
                    sprintf(tempstring, "Dest GPR Reg: %d (%d)", RegNum, DebugNavCmdGetRegisterValue(RegNum, 0));
                    strcat(CurString, tempstring);
                }
                else if (RegFlag == 1)
                {
                    sprintf(tempstring, "Dest PSR Reg: %d (%d) ", RegNum, DebugNavCmdGetRegisterValue(RegNum, 1));
                    strcat(CurString, tempstring);
                }
                else
                {
                    DbgPrint(("Invalid register flag value\n"));
                    strcat(CurString, "(Invalid register flag value) ");
                }
            }
            else
            {
                sprintf(tempstring, "Immediate Value 0x%x ", CurCmd[2]);
                strcat(CurString, tempstring);
            }
        }
        else if (OpCount == 2)
        {
            if (FlagOpOne == 0)
            {
                RegFlag = (CurCmd[1] & 0x80000000) >> 31;
                RegNum = (CurCmd[1] & 0xFFF);

                if (RegFlag == 0)
                {
                    sprintf(tempstring, "Dest GPR Reg: %d (%d) ", RegNum, DebugNavCmdGetRegisterValue(RegNum, 0));
                    strcat(CurString, tempstring);
                }
                else if (RegFlag == 1)
                {
                    sprintf(tempstring, "Dest PSR Reg: %d (%d)", RegNum, DebugNavCmdGetRegisterValue(RegNum, 1));
                    strcat(CurString, tempstring);
                }
                else
                {
                    DbgPrint(("Invalid register flag value\n"));
                    strcat(CurString, "(Invalid register flag value) ");
                }
            }
            else
            {
                sprintf(tempstring, "Immediate Value 0x%x ", CurCmd[1]);
                strcat(CurString, tempstring);
            }

            /* now source register */
            if (FlagOpTwo == 0)
            {
                RegFlag = (CurCmd[2] & 0x80000000) >> 31;
                RegNum = (CurCmd[2] & 0xFFF);

                if (RegFlag == 0)
                {
                    sprintf(tempstring, "Src GPR Reg: %d (%d)", RegNum, DebugNavCmdGetRegisterValue(RegNum, 0));
                    strcat(CurString, tempstring);
                }
                else if (RegFlag == 1)
                {
                    sprintf(tempstring, "Src PSR Reg: %d (%d)", RegNum, DebugNavCmdGetRegisterValue(RegNum, 1));
                    strcat(CurString, tempstring);
                }
                else
                {
                    DbgPrint(("Invalid register flag value\n"));
                    strcat(CurString, "(Invalid register flag value) ");
                }
            }
            else
            {
                sprintf(tempstring, "Immediate Value 0x%x", CurCmd[2]);
                strcat(CurString, tempstring);
            }
        }
    }

    /* end the line, using windows EOL, Linux can deal, Windows can't deal with \n */
    strcat(CurString, "\r\n");

    DbgPrint(("%s\n", CurString));

    return 0;
}


/**
 * NavCmdGetRegisterValue -- Get a register value from PSR or GPR.
 *
 * @param
 *      ulOperand -- Operand that contains register flag and register number
 *
 * @retval
 *      value from specified register
 */
static ULONG DebugNavCmdGetRegisterValue(ULONG Register, int PSR)
{
    uint32 uiValue;

    /*
     * Check the register flag to determine if register number is a PSR or GPR.
     */
    if (PSR)
    {
        /* Get PSR value from playback control engine */
        if (PlayCtrlGetPSR(Register, &uiValue) != PLAYCTRL_SUCCESS)
        {
            DbgPrint(("NavCmdGetRegisterValue: failed to get PSR value!\n"));
        }
    }
    else
    {
        /* Get GPR value from playback control engine */
        if (PlayCtrlGetGPR(Register, &uiValue) != PLAYCTRL_SUCCESS)
        {
            DbgPrint(("NavCmdGetRegisterValue: failed to get GPR value!\n"));
        }
    }

    return (uiValue);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -