Example #1
0
std::string PPUThread::dump() const
{
	std::string ret = "Registers:\n=========\n";

	for (uint i = 0; i<32; ++i) ret += fmt::format("GPR[%d] = 0x%llx\n", i, GPR[i]);
	for (uint i = 0; i<32; ++i) ret += fmt::format("FPR[%d] = %.6G\n", i, FPR[i]);
	for (uint i = 0; i<32; ++i) ret += fmt::format("VR[%d] = 0x%s [%s]\n", i, VR[i].to_hex().c_str(), VR[i].to_xyzw().c_str());
	ret += fmt::format("CR = 0x%08x\n", GetCR());
	ret += fmt::format("LR = 0x%llx\n", LR);
	ret += fmt::format("CTR = 0x%llx\n", CTR);
	ret += fmt::format("XER = [CA=%u | OV=%u | SO=%u | CNT=%u]\n", u32{ CA }, u32{ OV }, u32{ SO }, u32{ XCNT });
	//ret += fmt::format("FPSCR = 0x%x "
	//	"[RN=%d | NI=%d | XE=%d | ZE=%d | UE=%d | OE=%d | VE=%d | "
	//	"VXCVI=%d | VXSQRT=%d | VXSOFT=%d | FPRF=%d | "
	//	"FI=%d | FR=%d | VXVC=%d | VXIMZ=%d | "
	//	"VXZDZ=%d | VXIDI=%d | VXISI=%d | VXSNAN=%d | "
	//	"XX=%d | ZX=%d | UX=%d | OX=%d | VX=%d | FEX=%d | FX=%d]\n",
	//	FPSCR.FPSCR,
	//	u32{ FPSCR.RN },
	//	u32{ FPSCR.NI }, u32{ FPSCR.XE }, u32{ FPSCR.ZE }, u32{ FPSCR.UE }, u32{ FPSCR.OE }, u32{ FPSCR.VE },
	//	u32{ FPSCR.VXCVI }, u32{ FPSCR.VXSQRT }, u32{ FPSCR.VXSOFT }, u32{ FPSCR.FPRF },
	//	u32{ FPSCR.FI }, u32{ FPSCR.FR }, u32{ FPSCR.VXVC }, u32{ FPSCR.VXIMZ },
	//	u32{ FPSCR.VXZDZ }, u32{ FPSCR.VXIDI }, u32{ FPSCR.VXISI }, u32{ FPSCR.VXSNAN },
	//	u32{ FPSCR.XX }, u32{ FPSCR.ZX }, u32{ FPSCR.UX }, u32{ FPSCR.OX }, u32{ FPSCR.VX }, u32{ FPSCR.FEX }, u32{ FPSCR.FX });

	return ret;
}
Example #2
0
static u32 GetSpecialRegValue(int reg) {
	switch (reg) {
	case 0: return PowerPC::ppcState.pc;
	case 1: return PowerPC::ppcState.spr[SPR_LR];
	case 2: return PowerPC::ppcState.spr[SPR_CTR];
	case 3: return GetCR();
	case 4: return PowerPC::ppcState.fpscr;
	case 5: return PowerPC::ppcState.msr;
	case 6: return PowerPC::ppcState.spr[SPR_SRR0];
	case 7: return PowerPC::ppcState.spr[SPR_SRR1];
	case 8: return PowerPC::ppcState.Exceptions;
	case 9: return ProcessorInterface::GetMask();
	case 10: return ProcessorInterface::GetCause();
	default: return 0;	
	}
}
Example #3
0
u32 CRegTable::GetSpecialRegValue(int reg)
{
  switch (reg)
  {
  case 0:
    return PowerPC::ppcState.pc;
  case 1:
    return PowerPC::ppcState.spr[SPR_LR];
  case 2:
    return PowerPC::ppcState.spr[SPR_CTR];
  case 3:
    return GetCR();
  case 4:
    return PowerPC::ppcState.fpscr;
  case 5:
    return PowerPC::ppcState.msr;
  case 6:
    return PowerPC::ppcState.spr[SPR_SRR0];
  case 7:
    return PowerPC::ppcState.spr[SPR_SRR1];
  case 8:
    return PowerPC::ppcState.Exceptions;
  case 9:
    return ProcessorInterface::GetMask();
  case 10:
    return ProcessorInterface::GetCause();
  case 11:
    return PowerPC::ppcState.spr[SPR_DSISR];
  case 12:
    return PowerPC::ppcState.spr[SPR_DAR];
  case 13:
    return (PowerPC::ppcState.pagetable_hashmask << 6) | PowerPC::ppcState.pagetable_base;
  default:
    return 0;
  }
}
Example #4
0
void displist() {
	int x, y;
	double z;
	double x_min, x_max, y_min, y_max, z_min, z_max;

	double a_in, a_out, a;

	int xa_win, ya_win;

#define SCRDATA(a,x,y) a[(x)+(y)* xa_win]

	struct Shade c, cs, cs_in, cs_out, cs_o;

	double xv, yv, zv;

	xa_win = ya_win = act;

	std::unique_ptr<float[]> sr_buf(new float[xa_win * ya_win]);
	std::unique_ptr<float[]> sg_buf(new float[xa_win * ya_win]);
	std::unique_ptr<float[]> sb_buf(new float[xa_win * ya_win]);

	/* Note, once rotation is possible, the
	 following code is no longer alpha simple loop */
	InterDepth(&x_min, &x_max, &y_min, &y_max, &z_min, &z_max);

#if 0
	glNewList(VOL_DATA,GL_COMPILE);
	{
		glBegin(GL_LINE_LOOP);
		{
			glColor3f(1.0,1.0,1.0);
			glVertex2d(x_min,y_min);
			glVertex2d(x_min,y_max);
			glVertex2d(x_max,y_max);
			glVertex2d(x_max,y_min);

		}
		glEnd();
	}
	glEndList();
	return;
#endif
	x_min += xa;
	x_max += xa;
	y_min += ya;
	y_max += ya;

	if (x_min < 0 || x_max > xa_win || y_min < 0 || y_max > ya_win) {
		printf("ERROR!\n");
		printf("x:%f,%f\n", x_min, x_max);
		printf("y:%f,%f\n", y_min, y_max);
		exit(-10);
	}

	for (y = y_min; y < y_max; y++) {
		for (x = x_min; x < x_max; x++) {
			cs_in.red = 0;
			cs_in.green = 0;
			cs_in.blue = 0;
			cs_in.alpha = 0;
			a_in = 0;
#if 0
			printf("(%f,%f)(%d,%d)\n",(double)(x-xa) * x_size/xa_win,
					(double)(y-ya) * vol_data.size_y()/ya_win,x,y);
#endif

			for (z = z_min; z < z_max; z++) {

				xv = (double) (x - xa) * (vol_data.size_x() - 1) / x_win;
				yv = (double) (y - ya) * (vol_data.size_y() - 1) / y_win;
				zv = (double) (z) * (vol_data.size_z() - 1) / z_win;

				c = GetCR(xv, yv, zv);

				/*		  if (c.alpha > 0)
				 {
				 printf("(%d,%d,%d):(%1.1f,%1.1f,%1.1f,%1.1f)\n",
				 x,y,z,c.red,c.green,c.blue,c.alpha);

				 }*/

				cs.red = c.red * c.alpha;
				cs.green = c.green * c.alpha;
				cs.blue = c.blue * c.alpha;
				a = c.alpha;

				cs_o.red = cs.red * (1 - a_in);
				cs_o.green = cs.green * (1 - a_in);
				cs_o.blue = cs.blue * (1 - a_in);

				cs_out = AddSh(cs_in, cs_o);
				a_out = a_in + a * (1 - a_in);
				a_in = a_out;
				cs_in = cs_out;

				if (a_out == 1) {

					break;
				}

			}
			cs.red = 0;
			cs.green = 0;
			cs.blue = 0;
			a = 1;

			cs_o.red = cs.red * (1 - a_in);
			cs_o.green = cs.green * (1 - a_in);
			cs_o.blue = cs.blue * (1 - a_in);

			cs_out = AddSh(cs_in, cs_o);

			a_out = a_in + a * (1 - a_in);

			if (a_out > 0) {
				c.red = cs_out.red / a_out;
				c.green = cs_out.green / a_out;
				c.blue = cs_out.blue / a_out;
			} else {
				c.red = 0;
				c.green = 0;
				c.blue = 0;
			}
			/*     printf("(%d,%d):(%1.1f,%1.1f,%1.1f)\n",x,y,c.red,c.green,c.blue);*/

			SCRDATA(sr_buf,x,y)=c.red;
			SCRDATA(sg_buf,x,y)=c.green;
			SCRDATA(sb_buf,x,y)=c.blue;

		}

	}
	printf("Data complete \n");
	glNewList(VOL_DATA, GL_COMPILE);
	{
		int xx, yy;
		for (y = ((int) y_min) + 1; y < y_max; y++) {
			yy = y - ya;
			glBegin(GL_QUAD_STRIP);
			{
				for (x = x_min; x < x_max; x++) {
					xx = x - xa;

					glColor3f(SCRDATA(sr_buf,x,y-1),
					SCRDATA(sg_buf,x,y-1),
					SCRDATA(sb_buf,x,y-1));

					glVertex2d(xx, yy - 1);
#if 0
					printf("(%d,%d)(%d,%d)\n",xx,yy-1,x,y-1);
#endif

					glColor3f(SCRDATA(sr_buf,x,y),
					SCRDATA(sg_buf,x,y),
					SCRDATA(sb_buf,x,y));
					glVertex2d(xx, yy);

				}
			}
			glEnd();
		}
	}
	glEndList();

}
Example #5
0
void RegisterWidget::PopulateTable()
{
  for (int i = 0; i < 32; i++)
  {
    // General purpose registers (int)
    AddRegister(i, 0, RegisterType::gpr, "r" + std::to_string(i), [i] { return GPR(i); },
                [i](u64 value) { GPR(i) = value; });

    // Floating point registers (double)
    AddRegister(i, 2, RegisterType::fpr, "f" + std::to_string(i), [i] { return riPS0(i); },
                [i](u64 value) { riPS0(i) = value; });

    AddRegister(i, 4, RegisterType::fpr, "", [i] { return riPS1(i); },
                [i](u64 value) { riPS1(i) = value; });
  }

  for (int i = 0; i < 8; i++)
  {
    // IBAT registers
    AddRegister(i, 5, RegisterType::ibat, "IBAT" + std::to_string(i),
                [i] {
                  return (static_cast<u64>(PowerPC::ppcState.spr[SPR_IBAT0U + i * 2]) << 32) +
                         PowerPC::ppcState.spr[SPR_IBAT0L + i * 2];
                },
                nullptr);
    // DBAT registers
    AddRegister(i + 8, 5, RegisterType::dbat, "DBAT" + std::to_string(i),
                [i] {
                  return (static_cast<u64>(PowerPC::ppcState.spr[SPR_DBAT0U + i * 2]) << 32) +
                         PowerPC::ppcState.spr[SPR_DBAT0L + i * 2];
                },
                nullptr);
    // Graphics quantization registers
    AddRegister(i + 16, 7, RegisterType::gqr, "GQR" + std::to_string(i),
                [i] { return PowerPC::ppcState.spr[SPR_GQR0 + i]; }, nullptr);
  }

  for (int i = 0; i < 16; i++)
  {
    // SR registers
    AddRegister(i, 7, RegisterType::sr, "SR" + std::to_string(i),
                [i] { return PowerPC::ppcState.sr[i]; },
                [i](u64 value) { PowerPC::ppcState.sr[i] = value; });
  }

  // Special registers
  // TB
  AddRegister(16, 5, RegisterType::tb, "TB",
              [] {
                return static_cast<u64>(PowerPC::ppcState.spr[SPR_TU]) << 32 |
                       PowerPC::ppcState.spr[SPR_TL];
              },
              nullptr);

  // PC
  AddRegister(17, 5, RegisterType::pc, "PC", [] { return PowerPC::ppcState.pc; },
              [](u64 value) { PowerPC::ppcState.pc = value; });

  // LR
  AddRegister(18, 5, RegisterType::lr, "LR", [] { return PowerPC::ppcState.spr[SPR_LR]; },
              [](u64 value) { PowerPC::ppcState.spr[SPR_LR] = value; });

  // CTR
  AddRegister(19, 5, RegisterType::ctr, "CTR", [] { return PowerPC::ppcState.spr[SPR_CTR]; },
              [](u64 value) { PowerPC::ppcState.spr[SPR_CTR] = value; });

  // CR
  AddRegister(20, 5, RegisterType::cr, "CR", [] { return GetCR(); },
              [](u64 value) { SetCR(value); });

  // XER
  AddRegister(21, 5, RegisterType::xer, "XER", [] { return GetXER().Hex; },
              [](u64 value) { SetXER(UReg_XER(value)); });

  // FPSCR
  AddRegister(22, 5, RegisterType::fpscr, "FPSCR", [] { return PowerPC::ppcState.fpscr; },
              [](u64 value) { PowerPC::ppcState.fpscr = value; });

  // MSR
  AddRegister(23, 5, RegisterType::msr, "MSR", [] { return PowerPC::ppcState.msr; },
              [](u64 value) { PowerPC::ppcState.msr = value; });

  // SRR 0-1
  AddRegister(24, 5, RegisterType::srr, "SRR0", [] { return PowerPC::ppcState.spr[SPR_SRR0]; },
              [](u64 value) { PowerPC::ppcState.spr[SPR_SRR0] = value; });
  AddRegister(25, 5, RegisterType::srr, "SRR1", [] { return PowerPC::ppcState.spr[SPR_SRR1]; },
              [](u64 value) { PowerPC::ppcState.spr[SPR_SRR1] = value; });

  // Exceptions
  AddRegister(26, 5, RegisterType::exceptions, "Exceptions",
              [] { return PowerPC::ppcState.Exceptions; },
              [](u64 value) { PowerPC::ppcState.Exceptions = value; });

  // Int Mask
  AddRegister(27, 5, RegisterType::int_mask, "Int Mask",
              [] { return ProcessorInterface::GetMask(); }, nullptr);

  // Int Cause
  AddRegister(28, 5, RegisterType::int_cause, "Int Cause",
              [] { return ProcessorInterface::GetCause(); }, nullptr);

  // DSISR
  AddRegister(29, 5, RegisterType::dsisr, "DSISR", [] { return PowerPC::ppcState.spr[SPR_DSISR]; },
              [](u64 value) { PowerPC::ppcState.spr[SPR_DSISR] = value; });
  // DAR
  AddRegister(30, 5, RegisterType::dar, "DAR", [] { return PowerPC::ppcState.spr[SPR_DAR]; },
              [](u64 value) { PowerPC::ppcState.spr[SPR_DAR] = value; });

  // Hash Mask
  AddRegister(
      31, 5, RegisterType::pt_hashmask, "Hash Mask",
      [] { return (PowerPC::ppcState.pagetable_hashmask << 6) | PowerPC::ppcState.pagetable_base; },
      nullptr);

  emit RequestTableUpdate();
  m_table->resizeColumnsToContents();
}