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

📄 tvmode.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
字号:
/* * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. * * (c) Copyright 1996 - 2001 Gary Henderson (gary@daniver.demon.co.uk) and *                           Jerremy Koot (jkoot@snes9x.com) * * Super FX C emulator code  * (c) Copyright 1997 - 1999 Ivar (Ivar@snes9x.com) and *                           Gary Henderson. * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. * * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. * C4 C code (c) Copyright 2001 Gary Henderson (gary@daniver.demon.co.uk). * * DOS port code contains the works of other authors. See headers in * individual files. * * Snes9x homepage: www.snes9x.com * * Permission to use, copy, modify and distribute Snes9x in both binary and * source form, for non-commercial purposes, is hereby granted without fee, * providing that this license information and copyright notice appear with * all copies and any derived work. * * This software is provided 'as-is', without any express or implied * warranty. In no event shall the authors be held liable for any damages * arising from the use of this software. * * Snes9x is freeware for PERSONAL USE only. Commercial users should * seek permission of the copyright holders first. Commercial use includes * charging money for Snes9x or software derived from Snes9x. * * The copyright holders request that bug fixes and improvements to the code * should be forwarded to them so everyone can benefit from the modifications * in future versions. * * Super NES and Super Nintendo Entertainment System are trademarks of * Nintendo Co., Limited and its subsidiary companies. */#include <sys/farptr.h>#include "snes9x.h"#include "port.h"#include "gfx.h"#include <allegro.h>extern uint32 screen_width;extern uint32 screen_height;void TVMode (uint8 *srcPtr, uint32 srcPitch,	     uint8 *deltaPtr,	     BITMAP *dstBitmap, int width, int height){    uint8 *finish;    uint32 dstPitch = dstBitmap->w * 2;    uint32 line;    uint32 x_offset;    uint32 fraction;    uint32 error = 0;    uint32 colorMask = ~(RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 16));    uint32 lowPixelMask = RGB_LOW_BITS_MASK;    if (height * 2 <= screen_height)    {	line = (screen_height - height * 2) >> 1;	fraction = 0x10000;    }    else    {	line = 0;	fraction = ((screen_height - height) * 0x10000) / height;    }    _farsetsel (dstBitmap->seg);        if (width == 512)    {	// Offset into scanline in bytes, since each pixel takes two bytes,	// no divide by two.	x_offset = screen_width - width;	do	{	    uint32 *bP = (uint32 *) srcPtr;	    uint32 *xP = (uint32 *) deltaPtr;	    uint32 dP = bmp_write_line (dstBitmap, line) + x_offset;	    uint32 currentPixel;	    uint32 currentDelta;	    finish = (uint8 *) bP + ((width + 2) << 1);	    if ((error += fraction) >= 0x10000)	    {		error -= 0x10000;		do		{		    currentPixel = *bP++;		    if (currentPixel != *xP++)		    {			uint32 product, darkened;			*(xP - 1) = currentPixel;			_farnspokel (dP, currentPixel);			darkened = (product = ((currentPixel & colorMask) >> 1));			darkened += (product = ((product & colorMask) >> 1));			darkened += (product & colorMask) >> 1;			_farnspokel (dP + dstPitch, darkened);		    }		    dP += 4;		} while ((uint8 *) bP < finish);		line += 2;	    }	    else	    {		do		{		    currentPixel = *bP++;		    if (currentPixel != *xP++)		    {			*(xP - 1) = currentPixel;			_farnspokel (dP, currentPixel);		    }		    dP += 4;		} while ((uint8 *) bP < finish);		line++;	    }	    deltaPtr += srcPitch;	    srcPtr += srcPitch;	} while (--height);    }    else    {	x_offset = (screen_width - width * 2);	do	{	    uint32 *bP = (uint32 *) srcPtr;	    uint32 *xP = (uint32 *) deltaPtr;	    uint32 dP = bmp_write_line (dstBitmap, line) + x_offset;	    uint32 currentPixel;	    uint32 nextPixel;	    uint32 currentDelta;	    uint32 nextDelta;	    finish = (uint8 *) bP + ((width + 2) << 1);	    nextPixel = *bP++;	    nextDelta = *xP++;	    if ((error += fraction) >= 0x10000)	    {		error -= 0x10000;		do		{		    currentPixel = nextPixel;		    currentDelta = nextDelta;		    nextPixel = *bP++;		    nextDelta = *xP++;		    if ((nextPixel != nextDelta) || (currentPixel != currentDelta))		    {			uint32 colorA, colorB, product, darkened;			*(xP - 2) = currentPixel;			colorA = currentPixel & 0xffff;			colorB = (currentPixel & 0xffff0000) >> 16;			product = colorA |				  ((((colorA & colorMask) >> 1) +				    ((colorB & colorMask) >> 1) +				    (colorA & colorB & lowPixelMask)) << 16);			_farnspokel (dP, product);			darkened = (product = ((product & colorMask) >> 1));			darkened += (product = ((product & colorMask) >> 1));			darkened += (product & colorMask) >> 1;			_farnspokel (dP + dstPitch, darkened);			colorA = nextPixel & 0xffff;			product = colorB |				  ((((colorA & colorMask) >> 1) +				    ((colorB & colorMask) >> 1) +				    (colorA & colorB & lowPixelMask)) << 16);			_farnspokel (dP + 4, product);			darkened = (product = ((product & colorMask) >> 1));			darkened += (product = ((product & colorMask) >> 1));			darkened += (product & colorMask) >> 1;			_farnspokel (dP + dstPitch + 4, darkened);		    }		    dP += 8;		} while ((uint8 *) bP < finish);		line += 2;	    }	    else	    {		do		{		    currentPixel = nextPixel;		    currentDelta = nextDelta;		    nextPixel = *bP++;		    nextDelta = *xP++;		    if ((nextPixel != nextDelta) || (currentPixel != currentDelta))		    {			uint32 colorA, colorB, product;			*(xP - 2) = currentPixel;			colorA = currentPixel & 0xffff;			colorB = (currentPixel & 0xffff0000) >> 16;			product = colorA |				  ((((colorA & colorMask) >> 1) +				    ((colorB & colorMask) >> 1) +				    (colorA & colorB & lowPixelMask)) << 16);			_farnspokel (dP, product);			colorA = nextPixel & 0xffff;			product = colorB |				  ((((colorA & colorMask) >> 1) +				    ((colorB & colorMask) >> 1) +				    (colorA & colorB & lowPixelMask)) << 16);			_farnspokel (dP + 4, product);		    }		    dP += 8;		} while ((uint8 *) bP < finish);		line++;	    }	    deltaPtr += srcPitch;	    srcPtr += srcPitch;	} while (--height);    }}

⌨️ 快捷键说明

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