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

📄 debug.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Word = S9xGetWord (Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.PB, Word);	Size = 3;	break;    case 22:	//Absolute Indirect Long	    sprintf (Line, "%s%02X %02X    %s [$%02X%02X]",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Byte = S9xGetByte (Word + 2);	Word = S9xGetWord (Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word);	Size = 3;	break;    case 23:	//Absolute Indexed Indirect	    sprintf (Line, "%s%02X %02X    %s ($%02X%02X,x)",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Word += Registers.X.W;	Word = S9xGetWord (ICPU.ShiftedPB + Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, Registers.PB, Word);	Size = 3;	break;    case 24:	//Implied accumulator	    sprintf (Line, "%s         %s A", Line, S9xMnemonics[S9xOpcode]);	Size = 1;	break;    case 25:	// MVN/MVP SRC DST	    sprintf (Line, "%s         %s %02X %02X", Line, S9xMnemonics[S9xOpcode],		     Operant[0], Operant[1]);	Size = 3;	break;    }// XXX:    sprintf (Line, "%-44s A:%04X X:%04X Y:%04X D:%04X DB:%02X S:%04X P:%c%c%c%c%c%c%c%c%c HC:%03d VC:%03ld %02x",	     Line, Registers.A.W, Registers.X.W, Registers.Y.W,	     Registers.D.W, Registers.DB, Registers.S.W,	     CheckEmulation () ? 'E' : 'e',	     CheckNegative () ? 'N' : 'n',	     CheckOverflow () ? 'V' : 'v',	     CheckMemory () ? 'M' : 'm',	     CheckIndex () ? 'X' : 'x',	     CheckDecimal () ? 'D' : 'd',	     CheckIRQ () ? 'I' : 'i',	     CheckZero () ? 'Z' : 'z',	     CheckCarry () ? 'C' : 'c',	     Cycles,	     CPU.V_Counter,	     CPU.IRQActive);    CPU.Cycles = Cycles;    CPU.WaitAddress = WaitAddress;    return Size;#endif}uint8 S9xSA1OPrint (char *Line, uint8 Bank, uint16 Address){    uint8 S9xOpcode;    uint8 Operant[3];    uint16 Word;    uint8 Byte;    uint8 Size = 0;    char SByte;    short SWord;#if 0    sprintf (Line, "%04X%04X%04X%04X%02X%04X%c%c%c%c%c%c%c%c%c%03d%03d",	     SA1Registers.A.W, SA1Registers.X.W, SA1Registers.Y.W,	     SA1Registers.D.W, SA1Registers.DB, SA1Registers.S.W,	     SA1CheckEmulation () ? 'E' : 'e',	     SA1CheckNegative () ? 'N' : 'n',	     SA1CheckOverflow () ? 'V' : 'v',	     SA1CheckMemory () ? 'M' : 'm',	     SA1CheckIndex () ? 'X' : 'x',	     SA1CheckDecimal () ? 'D' : 'd',	     SA1CheckIRQ () ? 'I' : 'i',	     SA1CheckZero () ? 'Z' : 'z',	     SA1CheckCarry () ? 'C' : 'c',	     CPU.Cycles,	     CPU.V_Counter);    return (0);#else    S9xOpcode = S9xSA1GetByte ((Bank << 16) + Address);    sprintf (Line, "$%02X:%04X %02X ", Bank, Address, S9xOpcode);    Operant[0] = S9xSA1GetByte ((Bank << 16) + Address + 1);    Operant[1] = S9xSA1GetByte ((Bank << 16) + Address + 2);    Operant[2] = S9xSA1GetByte ((Bank << 16) + Address + 3);    switch (AddrModes[S9xOpcode])    {    case 0:	//Implied	    sprintf (Line, "%s         %s", Line, S9xMnemonics[S9xOpcode]);	Size = 1;	break;    case 1:	//Immediate[MemoryFlag]	    if (!SA1CheckFlag (MemoryFlag))	{	    //Accumulator 16 - Bit		sprintf (Line, "%s%02X %02X    %s #$%02X%02X",			 Line,			 Operant[0],			 Operant[1],			 S9xMnemonics[S9xOpcode],			 Operant[1],			 Operant[0]);	    Size = 3;	}	else	{	    //Accumulator 8 - Bit		sprintf (Line, "%s%02X       %s #$%02X",			 Line,			 Operant[0],			 S9xMnemonics[S9xOpcode],			 Operant[0]);	    Size = 2;	}	break;    case 2:	//Immediate[IndexFlag]	    if (!SA1CheckFlag (IndexFlag))	{	    //X / Y 16 - Bit		sprintf (Line, "%s%02X %02X    %s #$%02X%02X",			 Line,			 Operant[0],			 Operant[1],			 S9xMnemonics[S9xOpcode],			 Operant[1],			 Operant[0]);	    Size = 3;	}	else	{	    //X / Y 8 - Bit		sprintf (Line, "%s%02X       %s #$%02X",			 Line,			 Operant[0],			 S9xMnemonics[S9xOpcode],			 Operant[0]);	    Size = 2;	}	break;    case 3:	//Immediate[Always 8 - Bit]	    if (1)	{	    //Always 8 - Bit		sprintf (Line, "%s%02X       %s #$%02X",			 Line,			 Operant[0],			 S9xMnemonics[S9xOpcode],			 Operant[0]);	    Size = 2;	}	break;    case 4:	//Relative	    sprintf (Line, "%s%02X       %s $%02X",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	SByte = Operant[0];	Word = Address;	Word += SByte;	Word += 2;	sprintf (Line, "%-32s[$%04X]", Line, Word);	Size = 2;	break;    case 5:	//Relative Long	    sprintf (Line, "%s%02X %02X    %s $%02X%02X",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	SWord = (Operant[1] << 8) | Operant[0];	Word = Address;	Word += SWord;	Word += 3;	sprintf (Line, "%-32s[$%04X]", Line, Word);	Size = 3;	break;    case 6:	//Direct	    sprintf (Line, "%s%02X       %s $%02X",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	sprintf (Line, "%-32s[$00:%04X]", Line, Word);	Size = 2;	break;    case 7:	//Direct indexed (with x)	    sprintf (Line, "%s%02X       %s $%02X,x",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	Word += SA1Registers.X.W;	sprintf (Line, "%-32s[$00:%04X]", Line, Word);	Size = 2;	break;    case 8:	//Direct indexed (with y)	    sprintf (Line, "%s%02X       %s $%02X,y",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	Word += SA1Registers.Y.W;	sprintf (Line, "%-32s[$00:%04X]", Line, Word);	Size = 2;	break;    case 9:	//Direct Indirect	    sprintf (Line, "%s%02X       %s ($%02X)",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	Word = S9xSA1GetWord (Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word);	Size = 2;	break;    case 10:	//Direct Indexed Indirect	    sprintf (Line, "%s%02X       %s ($%02X,x)",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	Word += SA1Registers.X.W;	Word = S9xSA1GetWord (Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word);	Size = 2;	break;    case 11:	//Direct Indirect Indexed	    sprintf (Line, "%s%02X       %s ($%02X),y",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	Word = S9xSA1GetWord (Word);	Word += SA1Registers.Y.W;	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word);	Size = 2;	break;    case 12:	//Direct Indirect Long	    sprintf (Line, "%s%02X       %s [$%02X]",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	Byte = S9xSA1GetByte (Word + 2);	Word = S9xSA1GetWord (Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word);	Size = 2;	break;    case 13:	//Direct Indirect Indexed Long	    sprintf (Line, "%s%02X       %s [$%02X],y",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = Operant[0];	Word += SA1Registers.D.W;	Byte = S9xSA1GetByte (Word + 2);	Word = S9xSA1GetWord (Word);	Word += SA1Registers.Y.W;	sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word);	Size = 2;	break;    case 14:	//Absolute	    sprintf (Line, "%s%02X %02X    %s $%02X%02X",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word);	Size = 3;	break;    case 15:	//Absolute Indexed (With X)	    sprintf (Line, "%s%02X %02X    %s $%02X%02X,x",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Word += SA1Registers.X.W;	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word);	Size = 3;	break;    case 16:	//Absolute Indexed (With Y)	    sprintf (Line, "%s%02X %02X    %s $%02X%02X,y",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Word += SA1Registers.Y.W;	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word);	Size = 3;	break;    case 17:	//Absolute long	 sprintf (Line, "%s%02X %02X %02X %s $%02X%02X%02X",		   Line,		   Operant[0],		   Operant[1],		   Operant[2],		   S9xMnemonics[S9xOpcode],		   Operant[2],		   Operant[1],		   Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	sprintf (Line, "%-32s[$%02X:%04X]", Line, Operant[2], Word);	Size = 4;	break;    case 18:	//Absolute Indexed long	 sprintf (Line, "%s%02X %02X %02X %s $%02X%02X%02X,x",		   Line,		   Operant[0],		   Operant[1],		   Operant[2],		   S9xMnemonics[S9xOpcode],		   Operant[2],		   Operant[1],		   Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Word += SA1Registers.X.W;	sprintf (Line, "%-32s[$%02X:%04X]", Line, Operant[2], Word);	Size = 4;	break;    case 19:	//StackRelative	    sprintf (Line, "%s%02X       %s $%02X,s",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = SA1Registers.S.W;	Word += Operant[0];	sprintf (Line, "%-32s[$00:%04X]", Line, Word);	Size = 2;	break;    case 20:	//Stack Relative Indirect Indexed	    sprintf (Line, "%s%02X       %s ($%02X,s),y",		     Line,		     Operant[0],		     S9xMnemonics[S9xOpcode],		     Operant[0]);	Word = SA1Registers.S.W;	Word += Operant[0];	Word = S9xSA1GetWord (Word);	Word += SA1Registers.Y.W;	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.DB, Word);	Size = 2;	break;    case 21:	//Absolute Indirect	    sprintf (Line, "%s%02X %02X    %s ($%02X%02X)",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Word = S9xSA1GetWord (Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.PB, Word);	Size = 3;	break;    case 22:	//Absolute Indirect Long	    sprintf (Line, "%s%02X %02X    %s [$%02X%02X]",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Byte = S9xSA1GetByte (Word + 2);	Word = S9xSA1GetWord (Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, Byte, Word);	Size = 3;	break;    case 23:	//Absolute Indexed Indirect	    sprintf (Line, "%s%02X %02X    %s ($%02X%02X,x)",		     Line,		     Operant[0],		     Operant[1],		     S9xMnemonics[S9xOpcode],		     Operant[1],		     Operant[0]);	Word = (Operant[1] << 8) | Operant[0];	Word += SA1Registers.X.W;	Word = S9xSA1GetWord (SA1.ShiftedPB + Word);	sprintf (Line, "%-32s[$%02X:%04X]", Line, SA1Registers.PB, Word);	Size = 3;	break;    case 24:	//Implied accumulator	    sprintf (Line, "%s         %s A", Line, S9xMnemonics[S9xOpcode]);	Size = 1;	break;    case 25:	// MVN/MVP SRC DST	    sprintf (Line, "%s         %s %02X %02X", Line, S9xMnemonics[S9xOpcode],		     Operant[0], Operant[1]);	Size = 3;	break;    }    sprintf (Line, "%-44s A:%04X X:%04X Y:%04X D:%04X DB:%02X S:%04X P:%c%c%c%c%c%c%c%c%c HC:%03ld VC:%03ld",	     Line, SA1Registers.A.W, SA1Registers.X.W, SA1Registers.Y.W,	     SA1Registers.D.W, SA1Registers.DB, SA1Registers.S.W,	     SA1CheckEmulation () ? 'E' : 'e',	     SA1CheckNegative () ? 'N' : 'n',	     SA1CheckOverflow () ? 'V' : 'v',	     SA1CheckMemory () ? 'M' : 'm',	     SA1CheckIndex () ? 'X' : 'x',	     SA1CheckDecimal () ? 'D' : 'd',	     SA1CheckIRQ () ? 'I' : 'i',	     SA1CheckZero () ? 'Z' : 'z',	     SA1CheckCarry () ? 'C' : 'c',	     CPU.Cycles,	     CPU.V_Counter);    return Size;#endif}/**********************************************************************************************//* DPrint()                                                                                   *//* This function prints a line in the debug listbox and deletes upperlines if needed          *//**********************************************************************************************/void DPrint (char *Line){    printf ("%s\n", Line);}/**********************************************************************************************//* GetNumber()                                                                                *//* This function gets a number from a debug command                                           *//**********************************************************************************************/int GetNumber (char *Line, uint16 * Number){    int i;    if (sscanf (Line, " #%d", &i) == 1)    {	*Number = i;	return (1);    }    return (-1);}/**********************************************************************************************//* GetStartAddress()                                                                          *//* This function gets a starting address from a debug command                                 *//**********************************************************************************************/short GetStartAddress (char *Line, uint8 *Bank, uint32 *Address){    int a, b;    if (sscanf (Line + 1, " $%x:%x", &b, &a) != 2)	return (-1);    *Bank = b;    *Address = a;    return (1);}/**********************************************************************************************//* ProcessDebugCommand()                                                                      *//* This function processes a debug command                                                    *//**********************************************************************************************/void ProcessDebugCommand (char *Line){    uint8 Bank = Registers.PB;    uint32 Address = CPU.PC - CPU.PCBase;

⌨️ 快捷键说明

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