[NES] here, have a cup of speedup
This commit is contained in:
parent
af0cd449f5
commit
1c52444e04
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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; } }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue