[NES] here, have a cup of speedup

This commit is contained in:
zeromus 2011-03-21 01:49:20 +00:00
parent af0cd449f5
commit 1c52444e04
8 changed files with 93 additions and 110 deletions

View File

@ -566,12 +566,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo
EmitSample(mix);
sequencer_tick();
//since the units run concurrently, the APU frame sequencer
//is ran last because
//it can change the ouput values of the pulse/triangle channels,
//we want the
//changes to affect it on the *next* cycle.
//since the units run concurrently, the APU frame sequencer is ran last because
//it can change the ouput values of the pulse/triangle channels
//we want the changes to affect it on the *next* cycle.
}
double accumulate;

View File

@ -32,7 +32,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
//user configuration
int[,] palette = new int[64,3];
int[] palette_compiled = new int[64];
int[] palette_compiled = new int[64*8];
IPortDevice[] ports;
public void HardReset()
@ -184,32 +184,21 @@ namespace BizHawk.Emulation.Consoles.Nintendo
void SetPalette(int[,] pal)
{
Array.Copy(pal,palette,64*3);
for(int i=0;i<64;i++)
for(int i=0;i<64*8;i++)
{
int r = palette[i, 0];
int g = palette[i, 1];
int b = palette[i, 2];
int d = i >> 6;
int c = i & 63;
if (d >= 7) continue;
int r = palette[c, 0];
int g = palette[c, 1];
int b = palette[c, 2];
Palettes.ApplyDeemphasis(ref r, ref g, ref b, d);
palette_compiled[i] = (int)unchecked((int)0xFF000000 | (r << 16) | (g << 8) | b);
}
}
/// <summary>
/// Converts an internal NES core pixel value (includes deemph bits) to an rgb int.
/// </summary>
int CompleteDecodeColor(int pixel)
{
int deemph = pixel >> 8;
int palentry = pixel & 0xFF;
int r = palette[palentry, 0];
int g = palette[palentry, 1];
int b = palette[palentry, 2];
Palettes.ApplyDeemphasis(ref r, ref g, ref b, deemph);
return (r << 16) | (g << 8) | b;
}
/// <summary>
/// looks up an internal NES pixel value to an rgb int.
/// looks up an internal NES pixel value to an rgb int (applying the core's current palette and assuming no deemph)
/// </summary>
public int LookupColor(int pixel)
{

View File

@ -34,6 +34,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
{
BootGodDB.Initialize();
SetPalette(Palettes.FCEUX_Standard);
videoProvider = new MyVideoProvider(this);
}
NESWatch GetWatch(NESWatch.EDomain domain, int address)
@ -124,25 +125,23 @@ namespace BizHawk.Emulation.Consoles.Nintendo
this.emu = emu;
}
int[] pixels = new int[256 * 240];
public int[] GetVideoBuffer()
{
//why is it faster to continually reallocate? i have no idea.
int[] pixels = new int[256 * 240];
int i = 0;
for (int y = 0; y < 240; y++)
for (int x = 0; x < 256; x++)
{
int pixel = emu.ppu.xbuf[i];
pixels[i] = unchecked(emu.CompleteDecodeColor(pixel) | (int)0xFF000000);
i++;
}
//TODO - we could recalculate this on the fly (and invalidate/recalculate it when the palette is changed)
for (int i = 0; i < 256*240; i++)
{
pixels[i] = emu.palette_compiled[emu.ppu.xbuf[i]];
}
return pixels;
}
public int BufferWidth { get { return 256; } }
public int BufferHeight { get { return 240; } }
public int BackgroundColor { get { return 0; } }
}
public IVideoProvider VideoProvider { get { return new MyVideoProvider(this); } }
public IVideoProvider VideoProvider { get { return videoProvider; } }
MyVideoProvider videoProvider;
public ISoundProvider SoundProvider { get { return apu; } }

View File

@ -31,7 +31,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
public Bit intense_blue; //Intensify blues (and darken other colors)
public Bit intense_red; //Intensify reds (and darken other colors)
public int intensity_lsl_8; //an optimization..
public int intensity_lsl_6; //an optimization..
public bool PPUON { get { return show_bg || show_obj; } }
@ -51,7 +51,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
intense_green = (value >> 5) & 1;
intense_blue = (value >> 6) & 1;
intense_red = (value >> 7) & 1;
intensity_lsl_8 = ((value >> 5) & 7)<<8;
intensity_lsl_6 = ((value >> 5) & 7)<<6;
}
}
}

View File

@ -70,7 +70,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
short PaletteAdjustPixel(int pixel)
{
//tack on the deemph bits. THESE MAY BE ORDERED WRONG. PLEASE CHECK IN THE PALETTE CODE
return (short)(pixel| reg_2001.intensity_lsl_8);
return (short)(pixel | reg_2001.intensity_lsl_6);
}
const int kLineTime = 341;

View File

@ -16,7 +16,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
static float[] gtmul = { 0.915f, 1.086f, 0.98f, 1.026f, 0.908f, 0.987f, 0.75f };
static float[] btmul = { 0.743f, 0.882f, 0.653f, 1.277f, 0.979f, 0.101f, 0.75f };
public static void ApplyDeemphasis(ref int r, ref int g, ref int b, int deemph_bits)
public static void ApplyDeemphasis(ref int r, ref int g, ref int b, int deemph_bits)
{
//DEEMPH BITS MAY BE ORDERED WRONG. PLEASE CHECK
if (deemph_bits == 0) return;
@ -28,72 +28,74 @@ namespace BizHawk.Emulation.Consoles.Nintendo
if (g > 0xFF) g = 0xFF;
if (b > 0xFF) b = 0xFF;
}
const int SHIFT = 2;
public static int[,] FCEUX_Standard = new int[,]
{
{ 0x1D<<2, 0x1D<<2, 0x1D<<2 }, /* Value 0 */
{ 0x09<<2, 0x06<<2, 0x23<<2 }, /* Value 1 */
{ 0x00<<2, 0x00<<2, 0x2A<<2 }, /* Value 2 */
{ 0x11<<2, 0x00<<2, 0x27<<2 }, /* Value 3 */
{ 0x23<<2, 0x00<<2, 0x1D<<2 }, /* Value 4 */
{ 0x2A<<2, 0x00<<2, 0x04<<2 }, /* Value 5 */
{ 0x29<<2, 0x00<<2, 0x00<<2 }, /* Value 6 */
{ 0x1F<<2, 0x02<<2, 0x00<<2 }, /* Value 7 */
{ 0x10<<2, 0x0B<<2, 0x00<<2 }, /* Value 8 */
{ 0x00<<2, 0x11<<2, 0x00<<2 }, /* Value 9 */
{ 0x00<<2, 0x14<<2, 0x00<<2 }, /* Value 10 */
{ 0x00<<2, 0x0F<<2, 0x05<<2 }, /* Value 11 */
{ 0x06<<2, 0x0F<<2, 0x17<<2 }, /* Value 12 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 13 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 14 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 15 */
{ 0x2F<<2, 0x2F<<2, 0x2F<<2 }, /* Value 16 */
{ 0x00<<2, 0x1C<<2, 0x3B<<2 }, /* Value 17 */
{ 0x08<<2, 0x0E<<2, 0x3B<<2 }, /* Value 18 */
{ 0x20<<2, 0x00<<2, 0x3C<<2 }, /* Value 19 */
{ 0x2F<<2, 0x00<<2, 0x2F<<2 }, /* Value 20 */
{ 0x39<<2, 0x00<<2, 0x16<<2 }, /* Value 21 */
{ 0x36<<2, 0x0A<<2, 0x00<<2 }, /* Value 22 */
{ 0x32<<2, 0x13<<2, 0x03<<2 }, /* Value 23 */
{ 0x22<<2, 0x1C<<2, 0x00<<2 }, /* Value 24 */
{ 0x00<<2, 0x25<<2, 0x00<<2 }, /* Value 25 */
{ 0x00<<2, 0x2A<<2, 0x00<<2 }, /* Value 26 */
{ 0x00<<2, 0x24<<2, 0x0E<<2 }, /* Value 27 */
{ 0x00<<2, 0x20<<2, 0x22<<2 }, /* Value 28 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 29 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 30 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 31 */
{ 0x3F<<2, 0x3F<<2, 0x3F<<2 }, /* Value 32 */
{ 0x0F<<2, 0x2F<<2, 0x3F<<2 }, /* Value 33 */
{ 0x17<<2, 0x25<<2, 0x3F<<2 }, /* Value 34 */
{ 0x10<<2, 0x22<<2, 0x3F<<2 }, /* Value 35 */
{ 0x3D<<2, 0x1E<<2, 0x3F<<2 }, /* Value 36 */
{ 0x3F<<2, 0x1D<<2, 0x2D<<2 }, /* Value 37 */
{ 0x3F<<2, 0x1D<<2, 0x18<<2 }, /* Value 38 */
{ 0x3F<<2, 0x26<<2, 0x0E<<2 }, /* Value 39 */
{ 0x3C<<2, 0x2F<<2, 0x0F<<2 }, /* Value 40 */
{ 0x20<<2, 0x34<<2, 0x04<<2 }, /* Value 41 */
{ 0x13<<2, 0x37<<2, 0x12<<2 }, /* Value 42 */
{ 0x16<<2, 0x3E<<2, 0x26<<2 }, /* Value 43 */
{ 0x00<<2, 0x3A<<2, 0x36<<2 }, /* Value 44 */
{ 0x1E<<2, 0x1E<<2, 0x1E<<2 }, /* Value 45 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 46 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 47 */
{ 0x3F<<2, 0x3F<<2, 0x3F<<2 }, /* Value 48 */
{ 0x2A<<2, 0x39<<2, 0x3F<<2 }, /* Value 49 */
{ 0x31<<2, 0x35<<2, 0x3F<<2 }, /* Value 50 */
{ 0x35<<2, 0x32<<2, 0x3F<<2 }, /* Value 51 */
{ 0x3F<<2, 0x31<<2, 0x3F<<2 }, /* Value 52 */
{ 0x3F<<2, 0x31<<2, 0x36<<2 }, /* Value 53 */
{ 0x3F<<2, 0x2F<<2, 0x2C<<2 }, /* Value 54 */
{ 0x3F<<2, 0x36<<2, 0x2A<<2 }, /* Value 55 */
{ 0x3F<<2, 0x39<<2, 0x28<<2 }, /* Value 56 */
{ 0x38<<2, 0x3F<<2, 0x28<<2 }, /* Value 57 */
{ 0x2A<<2, 0x3C<<2, 0x2F<<2 }, /* Value 58 */
{ 0x2C<<2, 0x3F<<2, 0x33<<2 }, /* Value 59 */
{ 0x27<<2, 0x3F<<2, 0x3C<<2 }, /* Value 60 */
{ 0x31<<2, 0x31<<2, 0x31<<2 }, /* Value 61 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 62 */
{ 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 63 */
{ 0x1D<<SHIFT, 0x1D<<SHIFT, 0x1D<<SHIFT }, /* Value 0 */
{ 0x09<<SHIFT, 0x06<<SHIFT, 0x23<<SHIFT }, /* Value 1 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x2A<<SHIFT }, /* Value 2 */
{ 0x11<<SHIFT, 0x00<<SHIFT, 0x27<<SHIFT }, /* Value 3 */
{ 0x23<<SHIFT, 0x00<<SHIFT, 0x1D<<SHIFT }, /* Value 4 */
{ 0x2A<<SHIFT, 0x00<<SHIFT, 0x04<<SHIFT }, /* Value 5 */
{ 0x29<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 6 */
{ 0x1F<<SHIFT, 0x02<<SHIFT, 0x00<<SHIFT }, /* Value 7 */
{ 0x10<<SHIFT, 0x0B<<SHIFT, 0x00<<SHIFT }, /* Value 8 */
{ 0x00<<SHIFT, 0x11<<SHIFT, 0x00<<SHIFT }, /* Value 9 */
{ 0x00<<SHIFT, 0x14<<SHIFT, 0x00<<SHIFT }, /* Value 10 */
{ 0x00<<SHIFT, 0x0F<<SHIFT, 0x05<<SHIFT }, /* Value 11 */
{ 0x06<<SHIFT, 0x0F<<SHIFT, 0x17<<SHIFT }, /* Value 12 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 13 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 14 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 15 */
{ 0x2F<<SHIFT, 0x2F<<SHIFT, 0x2F<<SHIFT }, /* Value 16 */
{ 0x00<<SHIFT, 0x1C<<SHIFT, 0x3B<<SHIFT }, /* Value 17 */
{ 0x08<<SHIFT, 0x0E<<SHIFT, 0x3B<<SHIFT }, /* Value 18 */
{ 0x20<<SHIFT, 0x00<<SHIFT, 0x3C<<SHIFT }, /* Value 19 */
{ 0x2F<<SHIFT, 0x00<<SHIFT, 0x2F<<SHIFT }, /* Value 20 */
{ 0x39<<SHIFT, 0x00<<SHIFT, 0x16<<SHIFT }, /* Value 21 */
{ 0x36<<SHIFT, 0x0A<<SHIFT, 0x00<<SHIFT }, /* Value 22 */
{ 0x32<<SHIFT, 0x13<<SHIFT, 0x03<<SHIFT }, /* Value 23 */
{ 0x22<<SHIFT, 0x1C<<SHIFT, 0x00<<SHIFT }, /* Value 24 */
{ 0x00<<SHIFT, 0x25<<SHIFT, 0x00<<SHIFT }, /* Value 25 */
{ 0x00<<SHIFT, 0x2A<<SHIFT, 0x00<<SHIFT }, /* Value 26 */
{ 0x00<<SHIFT, 0x24<<SHIFT, 0x0E<<SHIFT }, /* Value 27 */
{ 0x00<<SHIFT, 0x20<<SHIFT, 0x22<<SHIFT }, /* Value 28 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 29 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 30 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 31 */
{ 0x3F<<SHIFT, 0x3F<<SHIFT, 0x3F<<SHIFT }, /* Value 32 */
{ 0x0F<<SHIFT, 0x2F<<SHIFT, 0x3F<<SHIFT }, /* Value 33 */
{ 0x17<<SHIFT, 0x25<<SHIFT, 0x3F<<SHIFT }, /* Value 34 */
{ 0x10<<SHIFT, 0x22<<SHIFT, 0x3F<<SHIFT }, /* Value 35 */
{ 0x3D<<SHIFT, 0x1E<<SHIFT, 0x3F<<SHIFT }, /* Value 36 */
{ 0x3F<<SHIFT, 0x1D<<SHIFT, 0x2D<<SHIFT }, /* Value 37 */
{ 0x3F<<SHIFT, 0x1D<<SHIFT, 0x18<<SHIFT }, /* Value 38 */
{ 0x3F<<SHIFT, 0x26<<SHIFT, 0x0E<<SHIFT }, /* Value 39 */
{ 0x3C<<SHIFT, 0x2F<<SHIFT, 0x0F<<SHIFT }, /* Value 40 */
{ 0x20<<SHIFT, 0x34<<SHIFT, 0x04<<SHIFT }, /* Value 41 */
{ 0x13<<SHIFT, 0x37<<SHIFT, 0x12<<SHIFT }, /* Value 42 */
{ 0x16<<SHIFT, 0x3E<<SHIFT, 0x26<<SHIFT }, /* Value 43 */
{ 0x00<<SHIFT, 0x3A<<SHIFT, 0x36<<SHIFT }, /* Value 44 */
{ 0x1E<<SHIFT, 0x1E<<SHIFT, 0x1E<<SHIFT }, /* Value 45 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 46 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 47 */
{ 0x3F<<SHIFT, 0x3F<<SHIFT, 0x3F<<SHIFT }, /* Value 48 */
{ 0x2A<<SHIFT, 0x39<<SHIFT, 0x3F<<SHIFT }, /* Value 49 */
{ 0x31<<SHIFT, 0x35<<SHIFT, 0x3F<<SHIFT }, /* Value 50 */
{ 0x35<<SHIFT, 0x32<<SHIFT, 0x3F<<SHIFT }, /* Value 51 */
{ 0x3F<<SHIFT, 0x31<<SHIFT, 0x3F<<SHIFT }, /* Value 52 */
{ 0x3F<<SHIFT, 0x31<<SHIFT, 0x36<<SHIFT }, /* Value 53 */
{ 0x3F<<SHIFT, 0x2F<<SHIFT, 0x2C<<SHIFT }, /* Value 54 */
{ 0x3F<<SHIFT, 0x36<<SHIFT, 0x2A<<SHIFT }, /* Value 55 */
{ 0x3F<<SHIFT, 0x39<<SHIFT, 0x28<<SHIFT }, /* Value 56 */
{ 0x38<<SHIFT, 0x3F<<SHIFT, 0x28<<SHIFT }, /* Value 57 */
{ 0x2A<<SHIFT, 0x3C<<SHIFT, 0x2F<<SHIFT }, /* Value 58 */
{ 0x2C<<SHIFT, 0x3F<<SHIFT, 0x33<<SHIFT }, /* Value 59 */
{ 0x27<<SHIFT, 0x3F<<SHIFT, 0x3C<<SHIFT }, /* Value 60 */
{ 0x31<<SHIFT, 0x31<<SHIFT, 0x31<<SHIFT }, /* Value 61 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 62 */
{ 0x00<<SHIFT, 0x00<<SHIFT, 0x00<<SHIFT }, /* Value 63 */
};
} //class palettes

View File

@ -103,10 +103,6 @@ namespace BizHawk.MultiClient
cvalue = Nes.LookupColor(Nes.ppu.PALRAM[value + (pal * 4)]);
unchecked
{
cvalue = cvalue | (int)0xFF000000;
}
Color color = Color.FromArgb(cvalue);
int adr = (x + (j * 8)) + (y + (i * 8)) * (bmpdata.Stride / 4);

View File

@ -31,7 +31,7 @@ namespace BizHawk.MultiClient
{
unchecked
{
value = val | (int)0xFF000000;
value = val;
}
color = Color.FromArgb(value); //TODO: value should be unprocessed! then do all calculations on this line
}