snesgfx-support mode7ExtBg tiles & BG
This commit is contained in:
parent
b50839f8e3
commit
4efea7605d
|
@ -132,7 +132,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
BG2_TDADDR = 21,
|
||||
//$210C
|
||||
BG3_TDADDR = 22,
|
||||
BG4_TDADDR = 23
|
||||
BG4_TDADDR = 23,
|
||||
//$2133 SETINI
|
||||
SETINI_MODE7_EXTBG = 30,
|
||||
SETINI_HIRES = 31,
|
||||
SETINI_OVERSCAN = 32,
|
||||
SETINI_OBJ_INTERLACE = 33,
|
||||
SETINI_SCREEN_INTERLACE = 34
|
||||
}
|
||||
|
||||
public enum SNES_MEMORY : uint
|
||||
|
|
|
@ -136,6 +136,52 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
public BGInfos BG = new BGInfos();
|
||||
|
||||
public ModeInfo Mode = new ModeInfo();
|
||||
|
||||
public bool SETINI_Mode7ExtBG { private set; get; }
|
||||
public bool SETINI_HiRes { private set; get; }
|
||||
public bool SETINI_Overscan { private set; get; }
|
||||
public bool SETINI_ObjInterlace { private set; get; }
|
||||
public bool SETINI_ScreenInterlace { private set; get; }
|
||||
|
||||
public static ScreenInfo GetScreenInfo()
|
||||
{
|
||||
var si = new ScreenInfo();
|
||||
|
||||
si.SETINI_Mode7ExtBG = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.SETINI_MODE7_EXTBG) == 1;
|
||||
si.SETINI_HiRes = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.SETINI_HIRES) == 1;
|
||||
si.SETINI_Overscan = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.SETINI_OVERSCAN) == 1;
|
||||
si.SETINI_ObjInterlace = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.SETINI_OBJ_INTERLACE) == 1;
|
||||
si.SETINI_ScreenInterlace = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.SETINI_SCREEN_INTERLACE) == 1;
|
||||
|
||||
si.Mode.MODE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG_MODE);
|
||||
si.BG.BG1.Bpp = ModeBpps[si.Mode.MODE, 0];
|
||||
si.BG.BG2.Bpp = ModeBpps[si.Mode.MODE, 1];
|
||||
si.BG.BG3.Bpp = ModeBpps[si.Mode.MODE, 2];
|
||||
si.BG.BG4.Bpp = ModeBpps[si.Mode.MODE, 3];
|
||||
|
||||
if (si.Mode.MODE == 7 && si.SETINI_Mode7ExtBG)
|
||||
si.BG.BG2.Bpp = 7;
|
||||
|
||||
si.BG.BG1.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_TILESIZE);
|
||||
si.BG.BG2.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_TILESIZE);
|
||||
si.BG.BG3.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_TILESIZE);
|
||||
si.BG.BG4.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_TILESIZE);
|
||||
|
||||
si.BG.BG1.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_SCSIZE);
|
||||
si.BG.BG2.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_SCSIZE);
|
||||
si.BG.BG3.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_SCSIZE);
|
||||
si.BG.BG4.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_SCSIZE);
|
||||
si.BG.BG1.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_SCADDR);
|
||||
si.BG.BG2.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_SCADDR);
|
||||
si.BG.BG3.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_SCADDR);
|
||||
si.BG.BG4.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_SCADDR);
|
||||
si.BG.BG1.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_TDADDR);
|
||||
si.BG.BG2.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_TDADDR);
|
||||
si.BG.BG3.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_TDADDR);
|
||||
si.BG.BG4.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_TDADDR);
|
||||
|
||||
return si;
|
||||
}
|
||||
}
|
||||
|
||||
static int[,] ModeBpps = new[,] {
|
||||
|
@ -153,33 +199,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
|
||||
public ScreenInfo ScanScreenInfo()
|
||||
{
|
||||
var si = new ScreenInfo();
|
||||
|
||||
si.Mode.MODE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG_MODE);
|
||||
si.BG.BG1.Bpp = ModeBpps[si.Mode.MODE, 0];
|
||||
si.BG.BG2.Bpp = ModeBpps[si.Mode.MODE, 1];
|
||||
si.BG.BG3.Bpp = ModeBpps[si.Mode.MODE, 2];
|
||||
si.BG.BG4.Bpp = ModeBpps[si.Mode.MODE, 3];
|
||||
|
||||
si.BG.BG1.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_TILESIZE);
|
||||
si.BG.BG2.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_TILESIZE);
|
||||
si.BG.BG3.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_TILESIZE);
|
||||
si.BG.BG4.TILESIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_TILESIZE);
|
||||
|
||||
si.BG.BG1.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_SCSIZE);
|
||||
si.BG.BG2.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_SCSIZE);
|
||||
si.BG.BG3.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_SCSIZE);
|
||||
si.BG.BG4.SCSIZE = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_SCSIZE);
|
||||
si.BG.BG1.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_SCADDR);
|
||||
si.BG.BG2.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_SCADDR);
|
||||
si.BG.BG3.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_SCADDR);
|
||||
si.BG.BG4.SCADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_SCADDR);
|
||||
si.BG.BG1.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG1_TDADDR);
|
||||
si.BG.BG2.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG2_TDADDR);
|
||||
si.BG.BG3.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG3_TDADDR);
|
||||
si.BG.BG4.TDADDR = LibsnesDll.snes_peek_logical_register(LibsnesDll.SNES_REG.BG4_TDADDR);
|
||||
|
||||
return si;
|
||||
return ScreenInfo.GetScreenInfo();
|
||||
}
|
||||
|
||||
//the same basic color table that libsnes uses to convert from snes 555 to rgba32
|
||||
|
@ -236,19 +256,15 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
/// <summary>
|
||||
/// decodes a mode7 BG. youll still need to paletteize and colorize it.
|
||||
/// </summary>
|
||||
public void DecodeMode7BG(int* screen, int stride)
|
||||
public void DecodeMode7BG(int* screen, int stride, bool extBg)
|
||||
{
|
||||
int[] tileCache = _tileCache[7];
|
||||
int[] tileCache = _tileCache[extBg?17:7];
|
||||
for (int ty = 0, tidx = 0; ty < 128; ty++)
|
||||
{
|
||||
for (int tx = 0; tx < 128; tx++, tidx++)
|
||||
{
|
||||
int tileEntry = vram[tidx * 2];
|
||||
int src = tileEntry * 64;
|
||||
if (tileEntry != 0)
|
||||
{
|
||||
int zzz = 9;
|
||||
}
|
||||
for (int py = 0, pix=src; py < 8; py++)
|
||||
{
|
||||
for (int px = 0; px < 8; px++, pix++)
|
||||
|
@ -366,7 +382,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
}
|
||||
}
|
||||
|
||||
int[][] _tileCache = new int[9][];
|
||||
int[][] _tileCache = new int[18][];
|
||||
|
||||
/// <summary>
|
||||
/// Caches all tiles at the 2bpp, 4bpp, and 8bpp decoded states.
|
||||
|
@ -387,6 +403,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
CacheTiles_Merge(2);
|
||||
CacheTiles_Merge(4);
|
||||
CacheTilesMode7();
|
||||
CacheTilesMode7ExtBg();
|
||||
}
|
||||
|
||||
public void CacheTilesMode7()
|
||||
|
@ -402,6 +419,19 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void CacheTilesMode7ExtBg()
|
||||
{
|
||||
int numtiles = 256;
|
||||
int[] tiles = new int[8 * 8 * numtiles];
|
||||
_tileCache[17] = tiles;
|
||||
int[] mode7tiles = _tileCache[7];
|
||||
int numPixels = numtiles*8*8;
|
||||
for (int i = 0; i < numPixels; i++)
|
||||
tiles[i] = mode7tiles[i] & 0x7F;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// merges one type of tiles with another to create the higher-order bitdepth.
|
||||
/// TODO - templateize this when we change it to c++
|
||||
|
@ -446,11 +476,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
|||
/// <summary>
|
||||
/// renders the mode7 tiles to a screen with the predefined size.
|
||||
/// </summary>
|
||||
public void RenderMode7TilesToScreen(int* screen, int stride)
|
||||
public void RenderMode7TilesToScreen(int* screen, int stride, bool ext)
|
||||
{
|
||||
int numTiles = 256;
|
||||
int tilesWide = 16;
|
||||
int[] tilebuf = _tileCache[7];
|
||||
int[] tilebuf = _tileCache[ext?17:7];
|
||||
for (int i = 0; i < numTiles; i++)
|
||||
{
|
||||
int ty = i / tilesWide;
|
||||
|
|
|
@ -90,16 +90,19 @@
|
|||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.txtBG1SizeBits = new System.Windows.Forms.TextBox();
|
||||
this.groupBox4 = new System.Windows.Forms.GroupBox();
|
||||
this.label17 = new System.Windows.Forms.Label();
|
||||
this.check2x = new System.Windows.Forms.CheckBox();
|
||||
this.radioButton15 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton14 = new System.Windows.Forms.RadioButton();
|
||||
this.label14 = new System.Windows.Forms.Label();
|
||||
this.comboDisplayType = new System.Windows.Forms.ComboBox();
|
||||
this.radioButton1 = new System.Windows.Forms.RadioButton();
|
||||
this.grpQuadrants = new System.Windows.Forms.GroupBox();
|
||||
this.rbQuad3 = new System.Windows.Forms.RadioButton();
|
||||
this.rbQuad2 = new System.Windows.Forms.RadioButton();
|
||||
this.rbQuadAll = new System.Windows.Forms.RadioButton();
|
||||
this.rbQuad1 = new System.Windows.Forms.RadioButton();
|
||||
this.rbQuad0 = new System.Windows.Forms.RadioButton();
|
||||
this.comboDisplayType = new System.Windows.Forms.ComboBox();
|
||||
this.radioButton1 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton2 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton13 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton3 = new System.Windows.Forms.RadioButton();
|
||||
|
@ -122,10 +125,19 @@
|
|||
this.lblDetailsPaletteAddress = new System.Windows.Forms.Label();
|
||||
this.tabPage2 = new System.Windows.Forms.TabPage();
|
||||
this.panel2 = new System.Windows.Forms.Panel();
|
||||
this.label14 = new System.Windows.Forms.Label();
|
||||
this.label17 = new System.Windows.Forms.Label();
|
||||
this.check2x = new System.Windows.Forms.CheckBox();
|
||||
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.label20 = new System.Windows.Forms.Label();
|
||||
this.checkScreenExtbg = new System.Windows.Forms.CheckBox();
|
||||
this.label21 = new System.Windows.Forms.Label();
|
||||
this.label18391 = new System.Windows.Forms.Label();
|
||||
this.checkScreenHires = new System.Windows.Forms.CheckBox();
|
||||
this.label198129381279841 = new System.Windows.Forms.Label();
|
||||
this.checkScreenOverscan = new System.Windows.Forms.CheckBox();
|
||||
this.label123812831 = new System.Windows.Forms.Label();
|
||||
this.checkScreenObjInterlace = new System.Windows.Forms.CheckBox();
|
||||
this.label2193813 = new System.Windows.Forms.Label();
|
||||
this.checkScreenInterlace = new System.Windows.Forms.CheckBox();
|
||||
this.radioButton6 = new System.Windows.Forms.RadioButton();
|
||||
this.paletteViewer = new BizHawk.MultiClient.SNESGraphicsViewer();
|
||||
this.viewer = new BizHawk.MultiClient.SNESGraphicsViewer();
|
||||
this.menuStrip1.SuspendLayout();
|
||||
|
@ -312,6 +324,17 @@
|
|||
//
|
||||
// groupBox2
|
||||
//
|
||||
this.groupBox2.Controls.Add(this.label2193813);
|
||||
this.groupBox2.Controls.Add(this.checkScreenInterlace);
|
||||
this.groupBox2.Controls.Add(this.label123812831);
|
||||
this.groupBox2.Controls.Add(this.checkScreenObjInterlace);
|
||||
this.groupBox2.Controls.Add(this.label198129381279841);
|
||||
this.groupBox2.Controls.Add(this.checkScreenOverscan);
|
||||
this.groupBox2.Controls.Add(this.label18391);
|
||||
this.groupBox2.Controls.Add(this.checkScreenHires);
|
||||
this.groupBox2.Controls.Add(this.label21);
|
||||
this.groupBox2.Controls.Add(this.checkScreenExtbg);
|
||||
this.groupBox2.Controls.Add(this.label20);
|
||||
this.groupBox2.Controls.Add(this.label16);
|
||||
this.groupBox2.Controls.Add(this.txtScreenBG4TSize);
|
||||
this.groupBox2.Controls.Add(this.txtScreenBG3TSize);
|
||||
|
@ -330,7 +353,7 @@
|
|||
this.groupBox2.Controls.Add(this.label5);
|
||||
this.groupBox2.Location = new System.Drawing.Point(0, 0);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
this.groupBox2.Size = new System.Drawing.Size(229, 122);
|
||||
this.groupBox2.Size = new System.Drawing.Size(229, 160);
|
||||
this.groupBox2.TabIndex = 16;
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "Screen";
|
||||
|
@ -516,7 +539,7 @@
|
|||
this.groupBox1.Controls.Add(this.txtBG1SizeInTiles);
|
||||
this.groupBox1.Controls.Add(this.label2);
|
||||
this.groupBox1.Controls.Add(this.txtBG1SizeBits);
|
||||
this.groupBox1.Location = new System.Drawing.Point(0, 125);
|
||||
this.groupBox1.Location = new System.Drawing.Point(0, 166);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(229, 245);
|
||||
this.groupBox1.TabIndex = 3;
|
||||
|
@ -704,7 +727,7 @@
|
|||
// txtBG1TDAddrBits
|
||||
//
|
||||
this.txtBG1TDAddrBits.BackColor = System.Drawing.Color.LightGreen;
|
||||
this.txtBG1TDAddrBits.Location = new System.Drawing.Point(6, 180);
|
||||
this.txtBG1TDAddrBits.Location = new System.Drawing.Point(5, 180);
|
||||
this.txtBG1TDAddrBits.Multiline = true;
|
||||
this.txtBG1TDAddrBits.Name = "txtBG1TDAddrBits";
|
||||
this.txtBG1TDAddrBits.ReadOnly = true;
|
||||
|
@ -743,7 +766,7 @@
|
|||
// txtBG1SCAddrBits
|
||||
//
|
||||
this.txtBG1SCAddrBits.BackColor = System.Drawing.Color.LightGreen;
|
||||
this.txtBG1SCAddrBits.Location = new System.Drawing.Point(6, 157);
|
||||
this.txtBG1SCAddrBits.Location = new System.Drawing.Point(5, 157);
|
||||
this.txtBG1SCAddrBits.Multiline = true;
|
||||
this.txtBG1SCAddrBits.Name = "txtBG1SCAddrBits";
|
||||
this.txtBG1SCAddrBits.ReadOnly = true;
|
||||
|
@ -773,7 +796,7 @@
|
|||
// txtBG1SizeBits
|
||||
//
|
||||
this.txtBG1SizeBits.BackColor = System.Drawing.Color.LightGreen;
|
||||
this.txtBG1SizeBits.Location = new System.Drawing.Point(6, 110);
|
||||
this.txtBG1SizeBits.Location = new System.Drawing.Point(5, 110);
|
||||
this.txtBG1SizeBits.Multiline = true;
|
||||
this.txtBG1SizeBits.Name = "txtBG1SizeBits";
|
||||
this.txtBG1SizeBits.ReadOnly = true;
|
||||
|
@ -783,6 +806,7 @@
|
|||
//
|
||||
// groupBox4
|
||||
//
|
||||
this.groupBox4.Controls.Add(this.radioButton6);
|
||||
this.groupBox4.Controls.Add(this.label17);
|
||||
this.groupBox4.Controls.Add(this.check2x);
|
||||
this.groupBox4.Controls.Add(this.radioButton15);
|
||||
|
@ -803,6 +827,29 @@
|
|||
this.groupBox4.TabIndex = 35;
|
||||
this.groupBox4.TabStop = false;
|
||||
//
|
||||
// label17
|
||||
//
|
||||
this.label17.AutoSize = true;
|
||||
this.label17.Location = new System.Drawing.Point(84, 173);
|
||||
this.label17.Name = "label17";
|
||||
this.label17.Size = new System.Drawing.Size(61, 13);
|
||||
this.label17.TabIndex = 48;
|
||||
this.label17.Text = "deprecated";
|
||||
//
|
||||
// check2x
|
||||
//
|
||||
this.check2x.Appearance = System.Windows.Forms.Appearance.Button;
|
||||
this.check2x.Location = new System.Drawing.Point(119, 8);
|
||||
this.check2x.Name = "check2x";
|
||||
this.check2x.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
|
||||
this.check2x.Size = new System.Drawing.Size(39, 21);
|
||||
this.check2x.TabIndex = 45;
|
||||
this.check2x.Text = "1024";
|
||||
this.toolTip1.SetToolTip(this.check2x, "Sets graphics viewport size to 1024 (unchecked is 512).\r\nContent will be scaled t" +
|
||||
"o fill specified size");
|
||||
this.check2x.UseVisualStyleBackColor = true;
|
||||
this.check2x.CheckedChanged += new System.EventHandler(this.check2x_CheckedChanged);
|
||||
//
|
||||
// radioButton15
|
||||
//
|
||||
this.radioButton15.AutoSize = true;
|
||||
|
@ -827,6 +874,51 @@
|
|||
this.radioButton14.Text = "OBJ";
|
||||
this.radioButton14.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label14
|
||||
//
|
||||
this.label14.AutoSize = true;
|
||||
this.label14.Location = new System.Drawing.Point(41, 127);
|
||||
this.label14.Name = "label14";
|
||||
this.label14.Size = new System.Drawing.Size(46, 13);
|
||||
this.label14.TabIndex = 47;
|
||||
this.label14.Text = "disabled";
|
||||
//
|
||||
// comboDisplayType
|
||||
//
|
||||
this.comboDisplayType.DropDownHeight = 200;
|
||||
this.comboDisplayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.comboDisplayType.FormattingEnabled = true;
|
||||
this.comboDisplayType.IntegralHeight = false;
|
||||
this.comboDisplayType.ItemHeight = 13;
|
||||
this.comboDisplayType.Items.AddRange(new object[] {
|
||||
"BG1",
|
||||
"BG2",
|
||||
"BG3",
|
||||
"BG4",
|
||||
"OBJ",
|
||||
"2bpp tiles",
|
||||
"4bpp tiles",
|
||||
"8bpp tiles",
|
||||
"Mode7 tiles",
|
||||
"Mode7Ext tiles"});
|
||||
this.comboDisplayType.Location = new System.Drawing.Point(6, 8);
|
||||
this.comboDisplayType.Name = "comboDisplayType";
|
||||
this.comboDisplayType.Size = new System.Drawing.Size(107, 21);
|
||||
this.comboDisplayType.TabIndex = 18;
|
||||
this.comboDisplayType.SelectedIndexChanged += new System.EventHandler(this.comboDisplayType_SelectedIndexChanged);
|
||||
//
|
||||
// radioButton1
|
||||
//
|
||||
this.radioButton1.AutoSize = true;
|
||||
this.radioButton1.Enabled = false;
|
||||
this.radioButton1.Location = new System.Drawing.Point(6, 35);
|
||||
this.radioButton1.Name = "radioButton1";
|
||||
this.radioButton1.Size = new System.Drawing.Size(46, 17);
|
||||
this.radioButton1.TabIndex = 19;
|
||||
this.radioButton1.TabStop = true;
|
||||
this.radioButton1.Text = "BG1";
|
||||
this.radioButton1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// grpQuadrants
|
||||
//
|
||||
this.grpQuadrants.Controls.Add(this.rbQuad3);
|
||||
|
@ -893,41 +985,6 @@
|
|||
this.rbQuad0.UseVisualStyleBackColor = true;
|
||||
this.rbQuad0.CheckedChanged += new System.EventHandler(this.rbQuad_CheckedChanged);
|
||||
//
|
||||
// comboDisplayType
|
||||
//
|
||||
this.comboDisplayType.DropDownHeight = 200;
|
||||
this.comboDisplayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.comboDisplayType.FormattingEnabled = true;
|
||||
this.comboDisplayType.IntegralHeight = false;
|
||||
this.comboDisplayType.ItemHeight = 13;
|
||||
this.comboDisplayType.Items.AddRange(new object[] {
|
||||
"BG1",
|
||||
"BG2",
|
||||
"BG3",
|
||||
"BG4",
|
||||
"OBJ",
|
||||
"2bpp tiles",
|
||||
"4bpp tiles",
|
||||
"8bpp tiles",
|
||||
"Mode7 tiles"});
|
||||
this.comboDisplayType.Location = new System.Drawing.Point(6, 8);
|
||||
this.comboDisplayType.Name = "comboDisplayType";
|
||||
this.comboDisplayType.Size = new System.Drawing.Size(107, 21);
|
||||
this.comboDisplayType.TabIndex = 18;
|
||||
this.comboDisplayType.SelectedIndexChanged += new System.EventHandler(this.comboDisplayType_SelectedIndexChanged);
|
||||
//
|
||||
// radioButton1
|
||||
//
|
||||
this.radioButton1.AutoSize = true;
|
||||
this.radioButton1.Enabled = false;
|
||||
this.radioButton1.Location = new System.Drawing.Point(6, 35);
|
||||
this.radioButton1.Name = "radioButton1";
|
||||
this.radioButton1.Size = new System.Drawing.Size(46, 17);
|
||||
this.radioButton1.TabIndex = 19;
|
||||
this.radioButton1.TabStop = true;
|
||||
this.radioButton1.Text = "BG1";
|
||||
this.radioButton1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// radioButton2
|
||||
//
|
||||
this.radioButton2.AutoSize = true;
|
||||
|
@ -1171,44 +1228,128 @@
|
|||
this.panel2.Size = new System.Drawing.Size(516, 667);
|
||||
this.panel2.TabIndex = 1;
|
||||
//
|
||||
// label14
|
||||
//
|
||||
this.label14.AutoSize = true;
|
||||
this.label14.Location = new System.Drawing.Point(85, 111);
|
||||
this.label14.Name = "label14";
|
||||
this.label14.Size = new System.Drawing.Size(46, 13);
|
||||
this.label14.TabIndex = 47;
|
||||
this.label14.Text = "disabled";
|
||||
//
|
||||
// label17
|
||||
//
|
||||
this.label17.AutoSize = true;
|
||||
this.label17.Location = new System.Drawing.Point(84, 173);
|
||||
this.label17.Name = "label17";
|
||||
this.label17.Size = new System.Drawing.Size(61, 13);
|
||||
this.label17.TabIndex = 48;
|
||||
this.label17.Text = "deprecated";
|
||||
//
|
||||
// check2x
|
||||
//
|
||||
this.check2x.Appearance = System.Windows.Forms.Appearance.Button;
|
||||
this.check2x.Location = new System.Drawing.Point(119, 8);
|
||||
this.check2x.Name = "check2x";
|
||||
this.check2x.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
|
||||
this.check2x.Size = new System.Drawing.Size(39, 21);
|
||||
this.check2x.TabIndex = 45;
|
||||
this.check2x.Text = "1024";
|
||||
this.toolTip1.SetToolTip(this.check2x, "Sets graphics viewport size to 1024 (unchecked is 512).\r\nContent will be scaled t" +
|
||||
"o fill specified size");
|
||||
this.check2x.UseVisualStyleBackColor = true;
|
||||
this.check2x.CheckedChanged += new System.EventHandler(this.check2x_CheckedChanged);
|
||||
//
|
||||
// toolTip1
|
||||
//
|
||||
this.toolTip1.AutoPopDelay = 5000;
|
||||
this.toolTip1.InitialDelay = 250;
|
||||
this.toolTip1.ReshowDelay = 100;
|
||||
//
|
||||
// label20
|
||||
//
|
||||
this.label20.AutoSize = true;
|
||||
this.label20.Location = new System.Drawing.Point(1, 50);
|
||||
this.label20.Name = "label20";
|
||||
this.label20.Size = new System.Drawing.Size(42, 13);
|
||||
this.label20.TabIndex = 21;
|
||||
this.label20.Text = "SETINI";
|
||||
//
|
||||
// checkScreenExtbg
|
||||
//
|
||||
this.checkScreenExtbg.AutoSize = true;
|
||||
this.checkScreenExtbg.Enabled = false;
|
||||
this.checkScreenExtbg.Location = new System.Drawing.Point(10, 66);
|
||||
this.checkScreenExtbg.Name = "checkScreenExtbg";
|
||||
this.checkScreenExtbg.Size = new System.Drawing.Size(15, 14);
|
||||
this.checkScreenExtbg.TabIndex = 22;
|
||||
this.checkScreenExtbg.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label21
|
||||
//
|
||||
this.label21.AutoSize = true;
|
||||
this.label21.Location = new System.Drawing.Point(24, 66);
|
||||
this.label21.Name = "label21";
|
||||
this.label21.Size = new System.Drawing.Size(43, 13);
|
||||
this.label21.TabIndex = 23;
|
||||
this.label21.Text = "EXTBG";
|
||||
//
|
||||
// label18391
|
||||
//
|
||||
this.label18391.AutoSize = true;
|
||||
this.label18391.Location = new System.Drawing.Point(24, 80);
|
||||
this.label18391.Name = "label18391";
|
||||
this.label18391.Size = new System.Drawing.Size(40, 13);
|
||||
this.label18391.TabIndex = 25;
|
||||
this.label18391.Text = "HIRES";
|
||||
//
|
||||
// checkScreenHires
|
||||
//
|
||||
this.checkScreenHires.AutoSize = true;
|
||||
this.checkScreenHires.Enabled = false;
|
||||
this.checkScreenHires.Location = new System.Drawing.Point(10, 80);
|
||||
this.checkScreenHires.Name = "checkScreenHires";
|
||||
this.checkScreenHires.Size = new System.Drawing.Size(15, 14);
|
||||
this.checkScreenHires.TabIndex = 24;
|
||||
this.checkScreenHires.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label198129381279841
|
||||
//
|
||||
this.label198129381279841.AutoSize = true;
|
||||
this.label198129381279841.Location = new System.Drawing.Point(24, 94);
|
||||
this.label198129381279841.Name = "label198129381279841";
|
||||
this.label198129381279841.Size = new System.Drawing.Size(47, 13);
|
||||
this.label198129381279841.TabIndex = 27;
|
||||
this.label198129381279841.Text = "O.SCAN";
|
||||
//
|
||||
// checkScreenOverscan
|
||||
//
|
||||
this.checkScreenOverscan.AutoSize = true;
|
||||
this.checkScreenOverscan.Enabled = false;
|
||||
this.checkScreenOverscan.Location = new System.Drawing.Point(10, 94);
|
||||
this.checkScreenOverscan.Name = "checkScreenOverscan";
|
||||
this.checkScreenOverscan.Size = new System.Drawing.Size(15, 14);
|
||||
this.checkScreenOverscan.TabIndex = 26;
|
||||
this.checkScreenOverscan.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label123812831
|
||||
//
|
||||
this.label123812831.AutoSize = true;
|
||||
this.label123812831.Location = new System.Drawing.Point(24, 107);
|
||||
this.label123812831.Name = "label123812831";
|
||||
this.label123812831.Size = new System.Drawing.Size(49, 13);
|
||||
this.label123812831.TabIndex = 29;
|
||||
this.label123812831.Text = "O.INTLC";
|
||||
//
|
||||
// checkScreenObjInterlace
|
||||
//
|
||||
this.checkScreenObjInterlace.AutoSize = true;
|
||||
this.checkScreenObjInterlace.Enabled = false;
|
||||
this.checkScreenObjInterlace.Location = new System.Drawing.Point(10, 107);
|
||||
this.checkScreenObjInterlace.Name = "checkScreenObjInterlace";
|
||||
this.checkScreenObjInterlace.Size = new System.Drawing.Size(15, 14);
|
||||
this.checkScreenObjInterlace.TabIndex = 28;
|
||||
this.checkScreenObjInterlace.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label2193813
|
||||
//
|
||||
this.label2193813.AutoSize = true;
|
||||
this.label2193813.Location = new System.Drawing.Point(24, 120);
|
||||
this.label2193813.Name = "label2193813";
|
||||
this.label2193813.Size = new System.Drawing.Size(48, 13);
|
||||
this.label2193813.TabIndex = 31;
|
||||
this.label2193813.Text = "S.INTLC";
|
||||
//
|
||||
// checkScreenInterlace
|
||||
//
|
||||
this.checkScreenInterlace.AutoSize = true;
|
||||
this.checkScreenInterlace.Enabled = false;
|
||||
this.checkScreenInterlace.Location = new System.Drawing.Point(10, 120);
|
||||
this.checkScreenInterlace.Name = "checkScreenInterlace";
|
||||
this.checkScreenInterlace.Size = new System.Drawing.Size(15, 14);
|
||||
this.checkScreenInterlace.TabIndex = 30;
|
||||
this.checkScreenInterlace.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// radioButton6
|
||||
//
|
||||
this.radioButton6.AutoSize = true;
|
||||
this.radioButton6.Enabled = false;
|
||||
this.radioButton6.Location = new System.Drawing.Point(56, 99);
|
||||
this.radioButton6.Name = "radioButton6";
|
||||
this.radioButton6.Size = new System.Drawing.Size(73, 17);
|
||||
this.radioButton6.TabIndex = 49;
|
||||
this.radioButton6.TabStop = true;
|
||||
this.radioButton6.Text = "Mode7Ext";
|
||||
this.radioButton6.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// paletteViewer
|
||||
//
|
||||
this.paletteViewer.BackColor = System.Drawing.Color.Transparent;
|
||||
|
@ -1368,5 +1509,17 @@
|
|||
private System.Windows.Forms.Label label14;
|
||||
private System.Windows.Forms.ToolTip toolTip1;
|
||||
private System.Windows.Forms.CheckBox check2x;
|
||||
private System.Windows.Forms.Label label21;
|
||||
private System.Windows.Forms.CheckBox checkScreenExtbg;
|
||||
private System.Windows.Forms.Label label20;
|
||||
private System.Windows.Forms.Label label18391;
|
||||
private System.Windows.Forms.CheckBox checkScreenHires;
|
||||
private System.Windows.Forms.Label label198129381279841;
|
||||
private System.Windows.Forms.CheckBox checkScreenOverscan;
|
||||
private System.Windows.Forms.Label label123812831;
|
||||
private System.Windows.Forms.CheckBox checkScreenObjInterlace;
|
||||
private System.Windows.Forms.Label label2193813;
|
||||
private System.Windows.Forms.CheckBox checkScreenInterlace;
|
||||
private System.Windows.Forms.RadioButton radioButton6;
|
||||
}
|
||||
}
|
|
@ -86,6 +86,7 @@ namespace BizHawk.MultiClient
|
|||
private void sliderScanline_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (suppression) return;
|
||||
checkScanlineControl.Checked = true;
|
||||
SyncCore();
|
||||
suppression = true;
|
||||
nudScanline.Value = 224 - sliderScanline.Value;
|
||||
|
@ -123,6 +124,13 @@ namespace BizHawk.MultiClient
|
|||
var gd = new SNESGraphicsDecoder();
|
||||
var si = gd.ScanScreenInfo();
|
||||
|
||||
checkScreenExtbg.Checked = si.SETINI_Mode7ExtBG;
|
||||
checkScreenHires.Checked = si.SETINI_HiRes;
|
||||
checkScreenOverscan.Checked = si.SETINI_Overscan;
|
||||
checkScreenObjInterlace.Checked = si.SETINI_ObjInterlace;
|
||||
checkScreenInterlace.Checked = si.SETINI_ScreenInterlace;
|
||||
|
||||
|
||||
txtModeBits.Text = si.Mode.MODE.ToString();
|
||||
txtScreenBG1Bpp.Text = FormatBpp(si.BG.BG1.Bpp);
|
||||
txtScreenBG2Bpp.Text = FormatBpp(si.BG.BG2.Bpp);
|
||||
|
@ -194,7 +202,13 @@ namespace BizHawk.MultiClient
|
|||
{
|
||||
//256 tiles
|
||||
allocate(128, 128);
|
||||
gd.RenderMode7TilesToScreen(pixelptr, stride / 4);
|
||||
gd.RenderMode7TilesToScreen(pixelptr, stride / 4, false);
|
||||
}
|
||||
if (selection == "Mode7Ext tiles")
|
||||
{
|
||||
//256 tiles
|
||||
allocate(128, 128);
|
||||
gd.RenderMode7TilesToScreen(pixelptr, stride / 4, true);
|
||||
}
|
||||
if (selection == "BG1" || selection == "BG2" || selection == "BG3" || selection == "BG4")
|
||||
{
|
||||
|
@ -202,18 +216,26 @@ namespace BizHawk.MultiClient
|
|||
var si = gd.ScanScreenInfo();
|
||||
var bg = si.BG[bgnum];
|
||||
|
||||
bool handled = false;
|
||||
if (bg.Enabled)
|
||||
{
|
||||
if (bgnum == 1 && si.Mode.MODE == 7)
|
||||
if (si.Mode.MODE == 7)
|
||||
{
|
||||
allocate(1024, 1024);
|
||||
gd.DecodeMode7BG(pixelptr, stride / 4);
|
||||
int numPixels = 128 * 128 * 8 * 8;
|
||||
gd.Paletteize(pixelptr, 0, 0, numPixels);
|
||||
gd.Colorize(pixelptr, 0, numPixels);
|
||||
bool mode7 = bgnum == 1;
|
||||
bool mode7extbg = (bgnum == 2 && si.SETINI_Mode7ExtBG);
|
||||
if(mode7 || mode7extbg)
|
||||
{
|
||||
handled = true;
|
||||
allocate(1024, 1024);
|
||||
gd.DecodeMode7BG(pixelptr, stride / 4, mode7extbg);
|
||||
int numPixels = 128 * 128 * 8 * 8;
|
||||
gd.Paletteize(pixelptr, 0, 0, numPixels);
|
||||
gd.Colorize(pixelptr, 0, numPixels);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
handled = true;
|
||||
var dims = bg.ScreenSizeInPixels;
|
||||
dims.Height = dims.Width = Math.Max(dims.Width, dims.Height);
|
||||
allocate(dims.Width, dims.Height);
|
||||
|
@ -419,5 +441,7 @@ namespace BizHawk.MultiClient
|
|||
{
|
||||
SyncViewerSize();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -310,6 +310,12 @@ int snes_peek_logical_register(int reg)
|
|||
//$210C
|
||||
case SNES_REG_BG3_TDADDR: return SNES::ppu.regs.bg_tdaddr[SNES::PPU::BG3]>>13;
|
||||
case SNES_REG_BG4_TDADDR: return SNES::ppu.regs.bg_tdaddr[SNES::PPU::BG4]>>13;
|
||||
|
||||
case SNES_REG_SETINI_MODE7_EXTBG: return SNES::ppu.regs.mode7_extbg?1:0;
|
||||
case SNES_REG_SETINI_HIRES: return SNES::ppu.regs.pseudo_hires?1:0;
|
||||
case SNES_REG_SETINI_OVERSCAN: return SNES::ppu.regs.overscan?1:0;
|
||||
case SNES_REG_SETINI_OBJ_INTERLACE: return SNES::ppu.regs.oam_interlace?1:0;
|
||||
case SNES_REG_SETINI_SCREEN_INTERLACE: return SNES::ppu.regs.interlace?1:0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -161,6 +161,12 @@ void snes_set_scanlineStart(snes_scanlineStart_t);
|
|||
//$210C
|
||||
#define SNES_REG_BG3_TDADDR 22
|
||||
#define SNES_REG_BG4_TDADDR 23
|
||||
//$2133 SETINI
|
||||
#define SNES_REG_SETINI_MODE7_EXTBG 30
|
||||
#define SNES_REG_SETINI_HIRES 31
|
||||
#define SNES_REG_SETINI_OVERSCAN 32
|
||||
#define SNES_REG_SETINI_OBJ_INTERLACE 33
|
||||
#define SNES_REG_SETINI_SCREEN_INTERLACE 34
|
||||
|
||||
int snes_peek_logical_register(int reg);
|
||||
|
||||
|
|
Loading…
Reference in New Issue