亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mmonemu.cpp

?? SM501基于ARMV4/ARMV4I平臺(tái)
?? CPP
字號(hào):
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1997-2000 Microsoft and/or its suppliers. All rights reserved.
Copyright (c) 2002 Silicon Motion, Inc.

Module Name:    mmonemu.cpp

Abstract:       Special MultiMon Emulation Feature

Notes:

--*/

#include "precomp.h"
#include "palette.h"

#ifdef MULTIMONEMU_ENABLE

#include "mmonemu.h"

#ifdef ENABLE_DIRECT3D
extern SMI*	ppdev;
extern _SMDMA   gblSMDMA;		//_SMDMA defined in smdma.h

#endif // ENABLE_DIRECT3D

SMIVGXEmu::SMIVGXEmu(SMISETTINGS *pss, SMI *pSMI) 
	: SMI()
{
	m_pSMI = pSMI;
	Init(pss);

#ifdef DD_ENABLE
	m_pVideoMemoryHeap = (SurfaceHeap *) 0xFFFFFFFF;
#else	// ! DD_ENABLE
	m_p2DVideoMemory = (Node2D *) 0xFFFFFFFF;
#endif	// DD_ENABLE

}

BYTE SMIVGXEmu::GetPanelID(void)
{
	return m_pSMI->GetPanelID();
}

void SMIVGXEmu::InitCard(void)
{
	// Setup hardware pointer
	m_pLAW = m_SMISettings.m_pLAW;
	m_nLAWPhysical = m_SMISettings.m_nLAWPhysical;
	m_pREG = m_SMISettings.m_pREG;
	m_nREGPhysical = m_SMISettings.m_nREGPhysical;

	m_pDPR = m_pREG + DE_SOURCE;
	m_pMMIO = m_pREG + DE_DATAPORT;

}

void SMIVGXEmu::AdjustDefaultMode() 
{
	SMI::AdjustDefaultMode();
	// Panning not supported
	m_SMISettings.m_dwCxScreen = m_SMISettings.m_dwCxPanel;
	m_SMISettings.m_dwCyScreen = m_SMISettings.m_dwCyPanel;
}

int SMIVGXEmu::GetRotateModeFromReg()
{
    return 0;
}

LONG SMIVGXEmu::DynRotate(int angle)
{
	return FALSE;
}

extern mode_table_t mode_table[];
void SMIVGXEmu::SetModeHardware(int modeId)
{

	mode_table_t *vesaMode, mode;
	reg_table_t register_table;
	long clock = 0;
	unsigned long value;

	if (rev() == 0xA0)
	{
		if (m_SMISettings.m_nTestClock == 0) 
			m_SMISettings.m_nTestClock = 133000000L;
	}

	clock = (long) m_SMISettings.m_nTestClock;

	// m_pMode->frequency = 75;
	vesaMode = findMode(mode_table,	m_SMISettings.m_dwCxPanel, m_SMISettings.m_dwCyPanel,
					m_pMode->frequency);
	if (vesaMode == NULL)
	{
		RETAILMSG (1, (_T("SMIVGX - Mode not found (modeId = %d, %dx%d@%d)\r\n"), 
			modeId, m_SMISettings.m_dwCxPanel, m_SMISettings.m_dwCyPanel,
					m_SMISettings.m_nFrequency));
		return;
	}

	// Set mode on panel and CRT.
	adjustMode(vesaMode, &mode, CRT, clock);
	//setModeRegisters(&register_table, &mode, PANEL, m_nScreenBpp, clock);
	//programMode(&register_table);
	setModeRegisters(&register_table, &mode, CRT, m_nScreenBpp, clock);
	programMode(&register_table);

	// Let CRT display panel data.
	value = peekRegisterDWord(CRT_DISPLAY_CTRL);
	value = FIELD_SET(value, CRT_DISPLAY_CTRL, SELECT, CRT);
	value = FIELD_SET(value, CRT_DISPLAY_CTRL, PLANE, ENABLE);
	value = FIELD_SET(value, CRT_DISPLAY_CTRL, TIMING, ENABLE);
	pokeRegisterDWord(CRT_DISPLAY_CTRL, value);

	// Reset panel frame buffer address to 0.
	pokeRegisterDWord(CRT_FB_ADDRESS,
					  FIELD_SET(0, CRT_FB_ADDRESS, STATUS, PENDING) |
					  FIELD_SET(0, CRT_FB_ADDRESS, EXT, LOCAL) |
					  FIELD_VALUE(0, CRT_FB_ADDRESS, ADDRESS, 0));

	// Setup Panning
	m_nPanningX = m_SMISettings.m_dwPanningX;
	m_nPanningY = m_SMISettings.m_dwPanningY;

}

void SMIVGXEmu::GetPhysicalVideoMemory(PULONG pPhysicalMemoryBase, PULONG pVideoMemorySize)
{
	m_pSMI->GetPhysicalVideoMemory(pPhysicalMemoryBase, pVideoMemorySize);
}

SCODE SMIVGXEmu::SetPalette(const PALETTEENTRY *src,unsigned short firstEntry,unsigned short numEntries )
{
	int i;

	DEBUGMSG(GPE_ZONE_ENTER, (TEXT("GPEVGA::SetPallette()\r\n")));

	if (firstEntry < 0 || firstEntry + numEntries > 256)
		return(E_INVALIDARG);

	for (i=firstEntry; i< numEntries; i++)
	{
		POKE_32(CRT_PALETTE_RAM+i*4, src[i].peRed<<16 | src[i].peGreen<<8 | src[i].peBlue);
	}

	return S_OK;
}

void SMIVGXEmu::WaitForNotBusy(void)
{
	//m_pSMI->WaitForNotBusy();
}

int SMIVGXEmu::IsBusy(void)
{
	//return m_pSMI->IsBusy();
	return FALSE; 
}

void SMIVGXEmu::WaitForVBlank()
{
	//m_pSMI->WaitForVBlank();

}

int SMIVGXEmu::InVBlank()
{
	// return m_pSMI->InVBlank();
	return TRUE; 
}

void SMIVGXEmu::SetupVideoMemory()
{
	m_nVideoMemorySize = 0;
	m_nVideoMemoryAvail = 0;

}

extern unsigned char mask_table[];
SCODE SMIVGXEmu::SetPointerShape(GPESurf *pMask, GPESurf *pColorSurf, int xHot, int yHot, int cx, int cy)
{
	PUCHAR pByte;
	PUCHAR pBuf;
	int i, row, col_byte, stride;
	UCHAR and_mask, xor_mask;

	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("SMIVGXEmu::SetPointerShape()\r\n")));

	SetCursorColors(0x00ffffff, 0x00000000);	// Set colors to black & white

	pByte = m_pLAW + m_nCursorMemory;
	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("pByte = %08X, m_nCursorMemory = %08X\r\n"),
			pByte, m_nCursorMemory));

	// Not sure if this hide cursor is necessary, please verify
	DisableCursor();

	if (!pMask)
	{
		DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("+SMIVGXEmu Turning off cursor\r\n")));

		for (i = 0; i < 64*64/8*2; i++)	// Turn off cursor by setting mask to clear
			pByte[i] = 0;
	}
	else
	{
		// A cursor shape has been entered, draw it.
		DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("+SMIVGXEmu Setting pointer shape\r\n")));

		// Setup freq addressed information into local variables.
		stride = pMask->Stride();
		pBuf = (PUCHAR) pMask->Buffer();

		// initialize entire 32 x 32 shape to be ANDs=0xFF and XORs = 0x00
		// (i.e. transparent)
		m_nXHot = xHot;
		m_nYHot = yHot;	// we rely on MovePointer being called after this
		
		// Clear Cursor Mem to transparent.
		// 1/2/2003. Clear additional 1KB to 0 to patch Hw RevA cursor bottom garbage 
		// when cursor at bottom of screen.
		memset((PUCHAR) m_pLAW+m_nCursorMemory, 0, CURSUR_IMAGE_SIZE);

		for (row = 0, i=0; row < cy; row++)
		{
			i = row * 64/8 * 2;
			for (col_byte = 0; col_byte < cx/8; col_byte++)
			{
				and_mask = mask_table[(~pBuf[row * stride+col_byte ] & 0xF0)>>4];
				xor_mask = mask_table[(pBuf[(cy + row) * stride + col_byte] & 0xF0)>>4]/2;
				pByte[i++] = and_mask | xor_mask;

				and_mask = mask_table[(~pBuf[row * stride+col_byte] & 0x0F)];
				xor_mask = mask_table[(pBuf[(cy + row) * stride + col_byte] & 0x0F)]/2;
				pByte[i++] = and_mask | xor_mask;
			}
		}
	}


	RotateCursorShape(m_iRotate);

	SetCursorAddress(m_nCursorMemory);
	
	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("+SMIVGXEmu Cursor shape set done\r\n")));

	return (S_OK);
}

SCODE SMIVGXEmu::MovePointer(int x, int y)
{
	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("SMIVGXEmu::MovePointer(%d, %d)\r\n"), x, y));

#ifndef ROTATION_ENABLE
	int newX = x - m_nXHot;	// Hot spot is currently 32,32
	int newY = y - m_nYHot;
	int nHideCursor = -1;
	
	//Fix hw cursor X,Y out of screen range. 11/01/02
	if (newX >= m_nScreenWidth)
		newX = m_nScreenWidth-1;

	if (newY >= m_nScreenHeight)
		newY = m_nScreenHeight-1;

#else // ! ROTATION_ENABLE
	int newX,newY;	// Hot spot is currently 32,32
	int nHideCursor = -33;

	switch (m_iRotate)
	{
		case DMDO_270:
			newX = m_nScreenHeight - y - m_nXHot - 1;	// Hot spot is currently 32,32
			newY = x - m_nYHot;
			break;
		case DMDO_180:
			newX = m_nScreenWidth - x - m_nXHot - 1;
			newY = m_nScreenHeight - y - m_nYHot - 1;
			break;
		case DMDO_90:
			newX = y - m_nXHot;
			newY = m_nScreenWidth - x - m_nYHot - 1;
			break;
		default:
			newX = x - m_nXHot;
			newY = y - m_nYHot;
			break;
	}
#endif // ROTATION_ENABLE

	if (x == nHideCursor)
		DisableCursor();

	ULONG dwVal = PEEK_32(CRT_HWC_LOCATION);

	if (newX >= 0)
	{
		dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, X, newX); 
		dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, LEFT, INSIDE);
	}
	else
	{
		dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, X, -newX); 
		dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, LEFT, OUTSIDE); 
	}

	if (newY >= 0)
	{
		dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, Y, newY); 
		dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, TOP, INSIDE); 
	}
	else
	{
		dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, Y, -newY); 
		dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, TOP, OUTSIDE); 
	}

	POKE_32(CRT_HWC_LOCATION, dwVal);

	if (x != nHideCursor)
		EnableCursor();

 	return (S_OK);
}

void SMIVGXEmu::SetCursorColors(ULONG foreground, ULONG background)
{
	ULONG color3=0x0000; //for invert color, assume it is Black at this time.

	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("SMI::SetCursorColors(0x%x, 0x%x)\r\n"),
			foreground, background));

	POKE_32(CRT_HWC_COLOR_01, background<<16 | color3 );
	
	POKE_32(CRT_HWC_COLOR_2, foreground	  ); 
}

void SMIVGXEmu::SetCursorAddress(ULONG dwAddress)
{
	ULONG dwAdd = PEEK_32(CRT_HWC_ADDRESS);
	dwAdd = FIELD_VALUE(dwAdd, CRT_HWC_ADDRESS, ADDRESS, dwAddress);
	dwAdd = FIELD_SET(dwAdd, CRT_HWC_ADDRESS, EXT, LOCAL);
	POKE_32(CRT_HWC_ADDRESS, dwAdd);
}

void SMIVGXEmu::DisableCursor(void)
{
	// Disable cursor
	ULONG dwAdd = PEEK_32(CRT_HWC_ADDRESS);
	dwAdd = FIELD_SET(dwAdd, CRT_HWC_ADDRESS, ENABLE, DISABLE);
	POKE_32(CRT_HWC_ADDRESS, dwAdd);
}

void SMIVGXEmu::EnableCursor(void)
{
	// Enable cursor
	ULONG dwAdd = PEEK_32(CRT_HWC_ADDRESS);
	dwAdd = FIELD_SET(dwAdd, CRT_HWC_ADDRESS, ENABLE, ENABLE);
	POKE_32(CRT_HWC_ADDRESS, dwAdd);
}

void SMIVGXEmu::SetupCursor(void)
{
    m_pSMI->m_nVideoMemoryAvail = m_pSMI->m_nVideoMemoryAvail - CURSUR_IMAGE_SIZE;

    m_nCursorMemory = m_pSMI->m_nVideoMemoryAvail;
	DisableCursor();
	
	SetCursorAddress(m_nCursorMemory);
}

SCODE SMIVGXEmu::AllocSurface(GPESurf **ppSurf, int width, int height, EGPEFormat format, int surfaceFlags)
{
	return m_pSMI->AllocSurface(ppSurf, width, height, format, surfaceFlags);
}

#ifdef	DD_ENABLE
SCODE SMIVGXEmu::AllocSurface(DDGPESurf **ppSurf, int width, int height, EGPEFormat format, EDDGPEPixelFormat pixelFormat, int surfaceFlags)
{
	return m_pSMI->AllocSurface(ppSurf, width, height, format, pixelFormat, surfaceFlags);
}
#endif	// DD_ENABLE

#ifdef DD_ENABLE
void SMIVGXEmu::SetVisibleSurface(GPESurf *pSurf, BOOL bWaitForVBlank)
#else
void SMIVGXEmu::SetVisibleSurface(GPESurf *pSurf)
#endif
{
#ifndef DD_ENABLE
	BOOL bWaitForVBlank = FALSE;
#endif

	WaitForNotBusy();

	POKE_32(CRT_FB_ADDRESS,
		FIELD_VALUE(0, CRT_FB_ADDRESS, STATUS, bWaitForVBlank) |
		FIELD_VALUE(0, CRT_FB_ADDRESS, EXT, m_SMISettings.m_bUMA) |
		FIELD_VALUE(0, CRT_FB_ADDRESS, ADDRESS, VgxSurfAddr(pSurf->OffsetInVideoMemory())) |
		0);

}


SCODE SMIVGXEmu::Line(GPELineParms *pLineParms, EGPEPhase phase)
{

	 return m_pSMI->Line(pLineParms, phase);
/*
	if (phase == gpeSingle || phase == gpePrepare)
	{
		pLineParms->pLine = EmulatedLine;
	}
	else if (phase == gpeComplete)
	{
		// Complete
	}

	return S_OK;
*/
}

SCODE SMIVGXEmu::BltPrepare(GPEBltParms *pBltParms)
{
	return m_pSMI->BltPrepare(pBltParms);
/*
	pBltParms->pBlt = EmulatedBlt; // catch all
	return S_OK;
*/
}

SCODE SMIVGXEmu::BltComplete(GPEBltParms *pBltParms)
{
	return m_pSMI->BltComplete(pBltParms);

	//return S_OK;

}

ULONG SMIVGXEmu::DrvEscape(SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, 
					 ULONG cjOut, PVOID pvOut)
{
	int	RetVal = 0;	// Default not supported

	return (ULONG) RetVal;
}
#endif	// MULTIMONEMU_ENABLE







?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产乱码久久久久久免费| 日韩欧美一级二级三级久久久| 中文字幕一区二区三区乱码在线| 国产成人精品一区二| 五月婷婷色综合| 亚洲午夜国产一区99re久久| 中文字幕一区二区三区视频| 久久久亚洲欧洲日产国码αv| 最新国产精品久久精品| 中文字幕av资源一区| 精品国产亚洲在线| 亚洲精品一区二区三区影院| 亚洲国产一区二区三区| 一区二区激情小说| 亚洲小说欧美激情另类| 亚洲va欧美va人人爽午夜| 亚洲h在线观看| 麻豆精品久久久| 国产毛片精品一区| 成人av免费在线| 色天使色偷偷av一区二区| 91福利社在线观看| 欧美高清视频一二三区| 69堂成人精品免费视频| 日韩欧美www| 中国色在线观看另类| 亚洲乱码国产乱码精品精的特点| 欧美草草影院在线视频| 国产网红主播福利一区二区| 亚洲免费观看在线视频| 日本成人在线不卡视频| 极品少妇xxxx精品少妇| av中文字幕一区| 欧美电影在哪看比较好| xf在线a精品一区二区视频网站| 精品1区2区3区| 日韩免费性生活视频播放| 久久久国产精华| 亚洲精品中文字幕乱码三区| 青青国产91久久久久久| 成人深夜福利app| 欧美精品v国产精品v日韩精品 | 国产精品一区二区在线观看网站| 粉嫩蜜臀av国产精品网站| 日韩中文字幕区一区有砖一区| 国产婷婷一区二区| 国产福利一区二区三区视频| 99久久精品免费精品国产| 91精品国产综合久久蜜臀 | 欧美大度的电影原声| 中文字幕不卡在线观看| 一区二区三区中文字幕电影| 精品一区二区三区在线观看国产| 热久久国产精品| av在线播放成人| 精品卡一卡二卡三卡四在线| 一区二区三区蜜桃| 国产一区二区h| 欧美视频中文字幕| 国产三级精品三级| 视频一区二区中文字幕| 韩国精品久久久| 欧美日本乱大交xxxxx| 国产精品视频在线看| 男人的j进女人的j一区| 日本久久一区二区| 国产午夜精品福利| 蜜桃91丨九色丨蝌蚪91桃色| 一本一本久久a久久精品综合麻豆| 丁香婷婷综合网| 91精品国产综合久久精品| 国产精品福利av| 国产成人免费在线视频| 日韩欧美的一区二区| 亚洲国产一区二区三区青草影视 | 在线观看亚洲一区| 欧美zozozo| 日本aⅴ亚洲精品中文乱码| 94-欧美-setu| 国产精品乱人伦| 国产一区二区三区四| 91精品在线免费| 午夜日韩在线电影| 91成人在线观看喷潮| 日韩毛片在线免费观看| 国产成人自拍高清视频在线免费播放| 国产91色综合久久免费分享| 日韩欧美成人一区| 日本不卡一二三| 在线电影一区二区三区| 亚洲午夜久久久久久久久电影院 | 韩国成人在线视频| 日韩欧美中文字幕公布| 日产国产欧美视频一区精品| 欧美日韩视频一区二区| 亚洲欧美日韩人成在线播放| 成人午夜短视频| 国产三级欧美三级| 国产精品综合av一区二区国产馆| 97精品久久久午夜一区二区三区| 精品视频在线免费| 一区二区三区 在线观看视频| 秋霞电影网一区二区| 8v天堂国产在线一区二区| 日韩精品乱码av一区二区| 欧美二区三区的天堂| 日韩精彩视频在线观看| 91精品久久久久久久99蜜桃| 天天av天天翘天天综合网色鬼国产| 国精产品一区一区三区mba视频| 成人综合激情网| 中文字幕一区在线观看| 91丨porny丨首页| 国产精品的网站| 色系网站成人免费| 亚洲一区二区av在线| 欧美三级乱人伦电影| 日韩国产精品91| 日韩精品中文字幕一区| 国产精品亚洲人在线观看| 国产午夜精品一区二区| 91香蕉国产在线观看软件| 亚洲国产另类精品专区| 69堂成人精品免费视频| 精彩视频一区二区三区| 欧美激情在线一区二区三区| 99久久国产综合精品色伊| 一区二区三区日韩在线观看| 欧美一区二区精美| 成人亚洲一区二区一| 一区二区三区欧美日韩| 91麻豆精品国产91久久久资源速度| 亚洲图片激情小说| 欧美日韩一级视频| 蜜臀av性久久久久av蜜臀妖精| 在线观看视频一区二区 | 国产美女精品在线| 亚洲欧美一区二区在线观看| 色婷婷综合中文久久一本| 视频一区视频二区在线观看| 久久九九久久九九| 91高清在线观看| 久久国产精品免费| 国产精品久久777777| 欧美日韩国产精品成人| 国产不卡视频在线播放| 亚洲va天堂va国产va久| 国产人久久人人人人爽| 在线国产电影不卡| 国产精品538一区二区在线| 亚洲精品福利视频网站| 精品播放一区二区| 欧美色视频在线观看| 国产一区二区伦理片| 一区二区三区不卡在线观看| 国产亚洲一区二区在线观看| 欧美性感一区二区三区| 国产99一区视频免费| 婷婷久久综合九色综合绿巨人 | 欧美一区二区三区在线观看视频| 亚洲精品国产视频| 久久九九久精品国产免费直播| 理论片日本一区| 亚洲精品一卡二卡| 久久日韩精品一区二区五区| 在线观看视频欧美| 成人激情视频网站| 日韩黄色免费电影| 亚洲三级小视频| 久久午夜电影网| 欧美欧美午夜aⅴ在线观看| 成人h动漫精品一区二区| 蜜臀av一区二区在线观看| 一区二区三区 在线观看视频| 91黄视频在线观看| 国产精品亚洲人在线观看| 日韩va欧美va亚洲va久久| 亚洲乱码国产乱码精品精可以看| 色综合久久九月婷婷色综合| 国产iv一区二区三区| 蜜桃视频在线一区| 一区二区三区高清在线| 中文字幕日韩欧美一区二区三区| 99re成人精品视频| 国产成人av在线影院| 精品一区二区三区在线观看国产 | 亚洲美女偷拍久久| 中文字幕va一区二区三区| 精品免费国产一区二区三区四区| 狠狠色狠狠色综合系列| 天天综合色天天综合色h| 一区二区三区在线看| 亚洲三级久久久| 亚洲你懂的在线视频| 国产色综合一区| 久久精品免费在线观看| 久久久高清一区二区三区| 日韩欧美国产一区二区三区| 678五月天丁香亚洲综合网| 在线观看日产精品|