コード例 #1
0
ファイル: CtrlMemView.cpp プロジェクト: segafan/nulldcsme
//Yeah this truly turned into a mess with the latest additions.. but it sure looks nice ;)
void CtrlMemView::onPaint(WPARAM wParam, LPARAM lParam)
{
	GetClientRect(wnd, &rect);
	PAINTSTRUCT ps;
	HDC hdc;
	hdc = BeginPaint(wnd, &ps);
	int width = rect.right;
	int numRows=(rect.bottom/rowHeight)/2+1;
	SetBkMode(hdc, TRANSPARENT);
	HPEN nullPen=CreatePen(0,0,0xFFFFFF);
	HPEN currentPen=CreatePen(0,0,0);
	HPEN selPen=CreatePen(0,0,0x808080);
	LOGBRUSH lbr;
	lbr.lbHatch=0; lbr.lbStyle=0; 
	lbr.lbColor=0xFFFFFF;
	HBRUSH nullBrush=CreateBrushIndirect(&lbr);
	lbr.lbColor=0xFFEfE8;
	HBRUSH currentBrush=CreateBrushIndirect(&lbr);
	lbr.lbColor=0x70FF70;
	HBRUSH pcBrush=CreateBrushIndirect(&lbr);
	HPEN oldPen=(HPEN)SelectObject(hdc,nullPen);
	HBRUSH oldBrush=(HBRUSH)SelectObject(hdc,nullBrush);
   	HFONT oldFont = (HFONT)SelectObject(hdc,(HGDIOBJ)font);

	int i;
	for (i=-numRows; i<=numRows; i++)
	{
		unsigned int address=curAddress + i*align;

		int rowY1 = rect.bottom/2 + rowHeight*i - rowHeight/2;
		int rowY2 = rect.bottom/2 + rowHeight*i + rowHeight/2;

		wchar temp[256];
		swprintf(temp,L"%08x",address);

		//SelectObject(hdc,currentBrush);
		Rectangle(hdc,0,rowY1,16,rowY2);

		if(selecting && address == (u32)selection)
			SelectObject(hdc,selPen);
		else
			SelectObject(hdc,i==0 ? currentPen : nullPen);

		Rectangle(hdc,16,rowY1,width,rowY2);
		SelectObject(hdc,nullBrush);
		SetTextColor(hdc,0x600000);
		TextOut(hdc,17,rowY1,temp,(int)wcslen(temp));
		SetTextColor(hdc,0x000000);
		
		switch(mode)
		{
		case MV_NORMAL:
			swprintf(temp, L"%08X  %08X  %08X  %08X",
				ReadMem32((address+0)), ReadMem32((address+4)), ReadMem32((address+8)), ReadMem32((address+12)));
			TextOut(hdc,90,rowY1,temp,(int)wcslen(temp));

			SetTextColor(hdc,0x0033BB22);
			((u32*)temp)[0] = ReadMem32(address);
			((u32*)temp)[1] = ReadMem32(address+4);
			((u32*)temp)[2] = ReadMem32(address+8);
			((u32*)temp)[3] = ReadMem32(address+12);
			((u32*)temp)[4] = 0x00000000;
			TextOut(hdc,420,rowY1,temp,(int)wcslen(temp));
		break;

		case MV_SYMBOLS:
			SetTextColor(hdc,0x0000FF);
			//int fn = address&3;//Debugger_GetSymbolNum(address);
			swprintf(temp,L"MV_SYMBOLS !!!");
	//		sprintf(temp, "%s (0x%x b)", Debugger_GetSymbolName(fn),Debugger_GetSymbolSize(fn));
			TextOut(hdc,200,rowY1,temp,(int)wcslen(temp));

			SetTextColor(hdc,0x0000000);
			UINT value = 0xBADC0D3;//ReadMem(address,4);//CMemory::ReadUnchecked_U32(address);
			swprintf(temp, L"%08x", value );
		//	sprintf(temp, "%08x [%s]", value, Debugger_GetSymbolName(Debugger_GetSymbolNum(value)));
			TextOut(hdc,70,rowY1,temp,(int)wcslen(temp));
		break;
		}
	}

	SelectObject(hdc,oldFont);
	SelectObject(hdc,oldPen);
	SelectObject(hdc,oldBrush);
	
	DeleteObject(nullPen);
	DeleteObject(currentPen);
	DeleteObject(selPen);

	DeleteObject(nullBrush);
	DeleteObject(pcBrush);
	DeleteObject(currentBrush);
	
	EndPaint(wnd, &ps);
}
コード例 #2
0
ファイル: shil.cpp プロジェクト: AyosNexz/reicast-emulator
//constprop
void constprop(RuntimeBlockInfo* blk)
{
	u32 rv[16];
	bool isi[16]={0};

	for (size_t i=0;i<blk->oplist.size();i++)
	{
		shil_opcode* op=&blk->oplist[i];

		if (op->rs2.is_r32i() && op->rs2._reg<16 && isi[op->rs2._reg])
		{
			/*
				not all opcodes can take rs2 as constant
			*/
			if (op->op!=shop_readm && op->op!=shop_writem 
				&& op->op!=shop_mul_u16 && op->op!=shop_mul_s16 && op->op!=shop_mul_i32 
				&& op->op!=shop_mul_u64 && op->op!=shop_mul_s64 
				&& op->op!=shop_adc && op->op!=shop_sbc)
			{
				op->rs2.type=FMT_IMM;
				op->rs2._imm=rv[op->rs2._reg];

				if (op->op==shop_shld || op->op==shop_shad)
				{
					//convert em to mov/shl/shr

					printf("sh*d -> s*l !\n");
					s32 v=op->rs2._imm;

					if (v>=0)
					{
						//x86e->Emit(sl32,reg.mapg(op->rd),v);
						op->op=shop_shl;
						op->rs2._imm=0x1f & v;
					}
					else if (0==(v&0x1f))
					{
						if (op->op!=shop_shad)
						{
							//r[n]=0;
							//x86e->Emit(op_mov32,reg.mapg(op->rd),0);
							op->op=shop_mov32;
							op->rs1.type=FMT_IMM;
							op->rs1._imm=0;
							op->rs2.type=FMT_NULL;
						}
						else
						{
							//r[n]>>=31;
							//x86e->Emit(op_sar32,reg.mapg(op->rd),31);
							op->op=shop_sar;
							op->rs2._imm=31;
						}
					}
					else
					{
						//x86e->Emit(sr32,reg.mapg(op->rd),-v);
						if (op->op!=shop_shad)	
							op->op=shop_shr;
						else
							op->op=shop_sar;

						op->rs2._imm=0x1f & (-v);
					}
				}
			}
		}

		if (op->rs1.is_r32i() && op->rs1._reg<16 && isi[op->rs1._reg])
		{
			if ((op->op==shop_readm /*|| op->op==shop_writem*/) && (op->flags&0x7F)==4)
			{
				op->rs1.type=FMT_IMM;
				op->rs1._imm=rv[op->rs1._reg];

				if (op->rs3.is_imm())
				{
					op->rs1._imm+=op->rs3._imm;
					op->rs3.type=FMT_NULL;
				}
				printf("%s promotion: %08X\n",shop_readm==op->op?"shop_readm":"shop_writem",op->rs1._imm);
			}
			else if (op->op==shop_jdyn)
			{
				if (blk->BlockType==BET_DynamicJump || blk->BlockType==BET_DynamicCall)
				{
					blk->BranchBlock=rv[op->rs1._reg];
					if (op->rs2.is_imm())	
						blk->BranchBlock+=op->rs2._imm;;

					blk->BlockType=blk->BlockType==BET_DynamicJump?BET_StaticJump:BET_StaticCall;
					blk->oplist.erase(blk->oplist.begin()+i);
					i--;
					printf("SBP: %08X -> %08X!\n",blk->addr,blk->BranchBlock);
					continue;
				}
				else
				{
					printf("SBP: failed :(\n");
				}
			}
			else if (op->op==shop_mov32)
			{
				//handled later on !
			}
			else if (op->op==shop_add || op->op==shop_sub)
			{
									
				if (op->rs2.is_imm())
				{
					op->rs1.type=1;
					op->rs1._imm= op->op==shop_add ? 
						(rv[op->rs1._reg]+op->rs2._imm):
						(rv[op->rs1._reg]-op->rs2._imm);
					op->rs2.type=0;
					printf("%s -> mov32!\n",op->op==shop_add?"shop_add":"shop_sub");
					op->op=shop_mov32;
				}
				
				else if (op->op==shop_add && !op->rs2.is_imm())
				{
					u32 immy=rv[op->rs1._reg];
					op->rs1=op->rs2;
					op->rs2.type=1;
					op->rs2._imm=immy;
					printf("%s -> imm prm (%08X)!\n",op->op==shop_add?"shop_add":"shop_sub",immy);
				}
			}
			else
			{
				op->op=op->op;
			}
		}

		if (op->rd.is_r32i() && op->rd._reg<16) isi[op->rd._reg]=false;
		if (op->rd2.is_r32i() && op->rd2._reg<16) isi[op->rd._reg]=false;

		if (op->op==shop_mov32 && op->rs1.is_imm() && op->rd.is_r32i() && op->rd._reg<16)
		{
			isi[op->rd._reg]=true;
			rv[op->rd._reg]=op->rs1._imm;
		}

		//NOT WORKING
		//WE NEED PROPER PAGELOCKS
		if (op->op==shop_readm && op->rs1.is_imm() && op->rd.is_r32i() && op->rd._reg<16 && op->flags==0x4 && op->rs3.is_null())
		{
			u32 baddr=blk->addr&0x0FFFFFFF;

			if (/*baddr==0xC158400 &&*/ blk->addr/PAGE_SIZE == op->rs1._imm/PAGE_SIZE)
			{
				isi[op->rd._reg]=true;
				rv[op->rd._reg]= ReadMem32(op->rs1._imm);
				printf("IMM MOVE: %08X -> %08X\n",op->rs1._imm,rv[op->rd._reg]);

				op->op=shop_mov32;
				op->rs1._imm=rv[op->rd._reg];
			}
		}
	}

	rw_related(blk);
}