GBHawk: Begin to seperate GBC and GBC-in-GB-compatibility-mode ppus.
This commit is contained in:
parent
d5c9f32095
commit
32c2c4b78e
|
@ -939,6 +939,9 @@
|
||||||
<Compile Include="Consoles\Nintendo\GBHawk\PPU.cs" />
|
<Compile Include="Consoles\Nintendo\GBHawk\PPU.cs" />
|
||||||
<Compile Include="Consoles\Nintendo\GBHawk\GBC_PPU.cs">
|
<Compile Include="Consoles\Nintendo\GBHawk\GBC_PPU.cs">
|
||||||
<DependentUpon>PPU.cs</DependentUpon>
|
<DependentUpon>PPU.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Consoles\Nintendo\GBHawk\GBC_PPU_GB.cs">
|
||||||
|
<DependentUpon>PPU.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Consoles\Nintendo\GBHawk\GB_PPU.cs">
|
<Compile Include="Consoles\Nintendo\GBHawk\GB_PPU.cs">
|
||||||
<DependentUpon>PPU.cs</DependentUpon>
|
<DependentUpon>PPU.cs</DependentUpon>
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using BizHawk.Common.NumberExtensions;
|
using BizHawk.Common.NumberExtensions;
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
|
|
||||||
|
// GBC ppu, closer to the GB ppu in timing and quirks
|
||||||
namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
{
|
{
|
||||||
public class GBC_PPU : PPU
|
public class GBC_PPU : PPU
|
||||||
|
@ -1626,6 +1627,190 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
last_HBL = 0;
|
last_HBL = 0;
|
||||||
HBL_HDMA_go = false;
|
HBL_HDMA_go = false;
|
||||||
HBL_test = false;
|
HBL_test = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Reg_Copy(GBC_PPU ppu2)
|
||||||
|
{
|
||||||
|
BG_transfer_byte = ppu2.BG_transfer_byte;
|
||||||
|
OBJ_transfer_byte = ppu2.OBJ_transfer_byte;
|
||||||
|
HDMA_src_hi = ppu2.HDMA_src_hi;
|
||||||
|
HDMA_src_lo = ppu2.HDMA_src_lo;
|
||||||
|
HDMA_dest_hi = ppu2.HDMA_dest_hi;
|
||||||
|
HDMA_dest_lo = ppu2.HDMA_dest_lo;
|
||||||
|
HDMA_tick = ppu2.HDMA_tick;
|
||||||
|
HDMA_byte = ppu2.HDMA_byte;
|
||||||
|
|
||||||
|
VRAM_sel = ppu2.VRAM_sel;
|
||||||
|
BG_V_flip = ppu2.BG_V_flip;
|
||||||
|
HDMA_mode = ppu2.HDMA_mode;
|
||||||
|
cur_DMA_src = ppu2.cur_DMA_src;
|
||||||
|
cur_DMA_dest = ppu2.cur_DMA_dest;
|
||||||
|
HDMA_length = ppu2.HDMA_length;
|
||||||
|
HDMA_countdown = ppu2.HDMA_countdown;
|
||||||
|
HBL_HDMA_count = ppu2.HBL_HDMA_count;
|
||||||
|
last_HBL = ppu2.last_HBL;
|
||||||
|
HBL_HDMA_go = ppu2.HBL_HDMA_go;
|
||||||
|
HBL_test = ppu2.HBL_test;
|
||||||
|
|
||||||
|
for (int i = 0; i < BG_bytes.Length; i++)
|
||||||
|
{
|
||||||
|
BG_bytes[i] = ppu2.BG_bytes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < OBJ_bytes.Length; i++)
|
||||||
|
{
|
||||||
|
OBJ_bytes[i] = ppu2.OBJ_bytes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
BG_bytes_inc = ppu2.BG_bytes_inc;
|
||||||
|
OBJ_bytes_inc = ppu2.OBJ_bytes_inc;
|
||||||
|
BG_bytes_index = ppu2.BG_bytes_index;
|
||||||
|
OBJ_bytes_index = ppu2.OBJ_bytes_index;
|
||||||
|
|
||||||
|
LYC_t = ppu2.LYC_t;
|
||||||
|
LYC_cd = ppu2.LYC_cd;
|
||||||
|
|
||||||
|
for (int i = 0; i < BG_palette.Length; i++)
|
||||||
|
{
|
||||||
|
BG_palette[i] = ppu2.BG_palette[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < OBJ_palette.Length; i++)
|
||||||
|
{
|
||||||
|
OBJ_palette[i] = ppu2.OBJ_palette[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
HDMA_active = ppu2.HDMA_active;
|
||||||
|
|
||||||
|
LCDC = ppu2.LCDC;
|
||||||
|
STAT = ppu2.STAT;
|
||||||
|
scroll_y = ppu2.scroll_y;
|
||||||
|
scroll_x = ppu2.scroll_x;
|
||||||
|
LY = ppu2.LY;
|
||||||
|
LY_actual = ppu2.LY_actual;
|
||||||
|
LY_inc = ppu2.LY_inc;
|
||||||
|
LYC = ppu2.LYC;
|
||||||
|
DMA_addr = ppu2.DMA_addr;
|
||||||
|
BGP = ppu2.BGP;
|
||||||
|
obj_pal_0 = ppu2.obj_pal_0;
|
||||||
|
obj_pal_1 = ppu2.obj_pal_1;
|
||||||
|
window_y = ppu2.window_y;
|
||||||
|
window_x = ppu2.window_x;
|
||||||
|
DMA_start = ppu2.DMA_start;
|
||||||
|
DMA_clock = ppu2.DMA_clock;
|
||||||
|
DMA_inc = ppu2.DMA_inc;
|
||||||
|
DMA_byte = ppu2.DMA_byte;
|
||||||
|
|
||||||
|
cycle = ppu2.cycle;
|
||||||
|
LYC_INT = ppu2.LYC_INT;
|
||||||
|
HBL_INT = ppu2.HBL_INT;
|
||||||
|
VBL_INT = ppu2.VBL_INT;
|
||||||
|
OAM_INT = ppu2.OAM_INT;
|
||||||
|
stat_line = ppu2.stat_line;
|
||||||
|
stat_line_old = ppu2.stat_line_old;
|
||||||
|
LCD_was_off = ppu2.LCD_was_off;
|
||||||
|
OAM_scan_index = ppu2.OAM_scan_index;
|
||||||
|
SL_sprites_index = ppu2.SL_sprites_index;
|
||||||
|
|
||||||
|
for (int i = 0; i < SL_sprites.Length; i++)
|
||||||
|
{
|
||||||
|
SL_sprites[i] = ppu2.SL_sprites[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
write_sprite = ppu2.write_sprite;
|
||||||
|
no_scan = ppu2.no_scan;
|
||||||
|
|
||||||
|
DMA_OAM_access = ppu2.DMA_OAM_access;
|
||||||
|
OAM_access_read = ppu2.OAM_access_read;
|
||||||
|
OAM_access_write = ppu2.OAM_access_write;
|
||||||
|
VRAM_access_read = ppu2.VRAM_access_read;
|
||||||
|
VRAM_access_write = ppu2.VRAM_access_write;
|
||||||
|
|
||||||
|
read_case = ppu2.read_case;
|
||||||
|
internal_cycle = ppu2.internal_cycle;
|
||||||
|
y_tile = ppu2.y_tile;
|
||||||
|
y_scroll_offset = ppu2.y_scroll_offset;
|
||||||
|
x_tile = ppu2.x_tile;
|
||||||
|
x_scroll_offset = ppu2.x_scroll_offset;
|
||||||
|
tile_byte = ppu2.tile_byte;
|
||||||
|
sprite_fetch_cycles = ppu2.sprite_fetch_cycles;
|
||||||
|
fetch_sprite = ppu2.fetch_sprite;
|
||||||
|
going_to_fetch = ppu2.going_to_fetch;
|
||||||
|
first_fetch = ppu2.first_fetch;
|
||||||
|
sprite_fetch_counter = ppu2.sprite_fetch_counter;
|
||||||
|
|
||||||
|
for (int i = 0; i < sprite_attr_list.Length; i++)
|
||||||
|
{
|
||||||
|
sprite_attr_list[i] = ppu2.sprite_attr_list[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < sprite_pixel_list.Length; i++)
|
||||||
|
{
|
||||||
|
sprite_pixel_list[i] = ppu2.sprite_pixel_list[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < sprite_present_list.Length; i++)
|
||||||
|
{
|
||||||
|
sprite_present_list[i] = ppu2.sprite_present_list[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
temp_fetch = ppu2.temp_fetch;
|
||||||
|
tile_inc = ppu2.tile_inc;
|
||||||
|
pre_render = ppu2.pre_render;
|
||||||
|
pre_render_2 = ppu2.pre_render_2;
|
||||||
|
|
||||||
|
for (int i = 0; i < tile_data.Length; i++)
|
||||||
|
{
|
||||||
|
tile_data[i] = ppu2.tile_data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < tile_data_latch.Length; i++)
|
||||||
|
{
|
||||||
|
tile_data_latch[i] = ppu2.tile_data_latch[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
latch_counter = ppu2.latch_counter;
|
||||||
|
latch_new_data = ppu2.latch_new_data;
|
||||||
|
render_counter = ppu2.render_counter;
|
||||||
|
render_offset = ppu2.render_offset;
|
||||||
|
pixel_counter = ppu2.pixel_counter;
|
||||||
|
pixel = ppu2.pixel;
|
||||||
|
|
||||||
|
for (int i = 0; i < sprite_data.Length; i++)
|
||||||
|
{
|
||||||
|
sprite_data[i] = ppu2.sprite_data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
sl_use_index = ppu2.sl_use_index;
|
||||||
|
|
||||||
|
for (int i = 0; i < sprite_sel.Length; i++)
|
||||||
|
{
|
||||||
|
sprite_sel[i] = ppu2.sprite_sel[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
no_sprites = ppu2.no_sprites;
|
||||||
|
evaled_sprites = ppu2.evaled_sprites;
|
||||||
|
|
||||||
|
for (int i = 0; i < SL_sprites_ordered.Length; i++)
|
||||||
|
{
|
||||||
|
SL_sprites_ordered[i] = ppu2.SL_sprites_ordered[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
sprite_ordered_index = ppu2.sprite_ordered_index;
|
||||||
|
blank_frame = ppu2.blank_frame;
|
||||||
|
window_latch = ppu2.window_latch;
|
||||||
|
consecutive_sprite = ppu2.consecutive_sprite;
|
||||||
|
last_eval = ppu2.last_eval;
|
||||||
|
|
||||||
|
window_counter = ppu2.window_counter;
|
||||||
|
window_pre_render = ppu2.window_pre_render;
|
||||||
|
window_started = ppu2.window_started;
|
||||||
|
window_is_reset = ppu2.window_is_reset;
|
||||||
|
window_tile_inc = ppu2.window_tile_inc;
|
||||||
|
window_y_tile = ppu2.window_y_tile;
|
||||||
|
window_x_tile = ppu2.window_x_tile;
|
||||||
|
window_y_tile_inc = ppu2.window_y_tile_inc;
|
||||||
|
window_x_latch = ppu2.window_x_latch;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -346,11 +346,23 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
|
|
||||||
// GBC compatibility register (I think)
|
// GBC compatibility register (I think)
|
||||||
case 0xFF4C:
|
case 0xFF4C:
|
||||||
if ((value != 0xC0) && (value != 0x80))
|
if ((value != 0xC0) && (value != 0x80))// && (value != 0xFF) && (value != 0x04))
|
||||||
{
|
{
|
||||||
Console.Write("GBC Compatibility? ");
|
Console.Write("GBC Compatibility? ");
|
||||||
Console.WriteLine(value);
|
Console.WriteLine(value);
|
||||||
GBC_compat = false;
|
GBC_compat = false;
|
||||||
|
|
||||||
|
if (GB_bios_register == 0)
|
||||||
|
{
|
||||||
|
var ppu2 = new GBC_PPU();
|
||||||
|
|
||||||
|
ppu2.Reg_Copy(ppu as GBC_PPU);
|
||||||
|
|
||||||
|
ppu = new GBC_PPU_GB();
|
||||||
|
ppu.Core = this;
|
||||||
|
ppu.Reg_Copy(ppu2);
|
||||||
|
}
|
||||||
|
|
||||||
// cpu operation is a function of hardware only
|
// cpu operation is a function of hardware only
|
||||||
//cpu.is_GBC = GBC_compat;
|
//cpu.is_GBC = GBC_compat;
|
||||||
}
|
}
|
||||||
|
@ -374,8 +386,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
|
|
||||||
// Bios control register. Writing 1 permanently disables BIOS until a power cycle occurs
|
// Bios control register. Writing 1 permanently disables BIOS until a power cycle occurs
|
||||||
case 0xFF50:
|
case 0xFF50:
|
||||||
//Console.WriteLine(value);
|
// Console.WriteLine(value);
|
||||||
if (GB_bios_register != 1)
|
if (GB_bios_register == 0)
|
||||||
{
|
{
|
||||||
GB_bios_register = value;
|
GB_bios_register = value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,6 +152,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void Reg_Copy(GBC_PPU ppu2)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// order sprites according to x coordinate
|
// order sprites according to x coordinate
|
||||||
// note that for sprites of equal x coordinate, priority goes to first on the list
|
// note that for sprites of equal x coordinate, priority goes to first on the list
|
||||||
public virtual void reorder_and_assemble_sprites()
|
public virtual void reorder_and_assemble_sprites()
|
||||||
|
|
Loading…
Reference in New Issue