Atari7800Hawk: More mappers
This commit is contained in:
parent
140f603607
commit
f5a5e9bd17
|
@ -76,7 +76,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
ser.Sync("cpu_resume_pending", ref cpu_resume_pending);
|
ser.Sync("cpu_resume_pending", ref cpu_resume_pending);
|
||||||
|
|
||||||
ser.Sync("slow_access", ref slow_access);
|
ser.Sync("slow_access", ref slow_access);
|
||||||
|
ser.Sync("small flag", ref small_flag);
|
||||||
|
ser.Sync("pal kara", ref PAL_Kara);
|
||||||
|
|
||||||
ser.EndSection();
|
ser.EndSection();
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
public string s_mapper;
|
public string s_mapper;
|
||||||
public MapperBase mapper;
|
public MapperBase mapper;
|
||||||
|
public bool small_flag = false;
|
||||||
|
public bool PAL_Kara = false;
|
||||||
|
|
||||||
private readonly ITraceable _tracer;
|
private readonly ITraceable _tracer;
|
||||||
|
|
||||||
|
@ -123,7 +125,14 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
if (cart_2.Bit(1))
|
if (cart_2.Bit(1))
|
||||||
{
|
{
|
||||||
s_mapper = "1";
|
if (cart_2.Bit(3))
|
||||||
|
{
|
||||||
|
s_mapper = "2";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s_mapper = "1";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -136,6 +145,18 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
throw new Exception("ROM not in gamedb and has no header");
|
throw new Exception("ROM not in gamedb and has no header");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// some games that use the Super Game mapper only have 4 banks, so let's set a flag to limit bank size
|
||||||
|
if (rom.Length < 0x14000)
|
||||||
|
{
|
||||||
|
small_flag = true;
|
||||||
|
|
||||||
|
// additionally, PAL Karateka has bank 6 (actually 2) at 0x4000
|
||||||
|
if (rom.HashMD5()=="5E0A1E832BBCEA6FACB832FDE23A440A")
|
||||||
|
{
|
||||||
|
PAL_Kara = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reset_Mapper(s_mapper);
|
Reset_Mapper(s_mapper);
|
||||||
|
|
||||||
_rom = rom;
|
_rom = rom;
|
||||||
|
@ -208,14 +229,18 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
private void Reset_Mapper(string m)
|
private void Reset_Mapper(string m)
|
||||||
{
|
{
|
||||||
if (m=="0")
|
if (m == "0")
|
||||||
{
|
{
|
||||||
mapper = new MapperDefault();
|
mapper = new MapperDefault();
|
||||||
}
|
}
|
||||||
if (m=="1")
|
if (m == "1")
|
||||||
{
|
{
|
||||||
mapper = new MapperSG();
|
mapper = new MapperSG();
|
||||||
}
|
}
|
||||||
|
if (m == "2")
|
||||||
|
{
|
||||||
|
mapper = new MapperSGE();
|
||||||
|
}
|
||||||
|
|
||||||
mapper.Core = this;
|
mapper.Core = this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,9 +90,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
public int[] header_counter_max = new int [2];
|
public int[] header_counter_max = new int [2];
|
||||||
public int header_pointer; // since headers could be 4 or 5 bytes, we need a seperate pointer
|
public int header_pointer; // since headers could be 4 or 5 bytes, we need a seperate pointer
|
||||||
|
|
||||||
// write mode is actually persistent but exists outside of the regs
|
|
||||||
public bool global_write_mode;
|
|
||||||
|
|
||||||
// each frame contains 263 scanlines
|
// each frame contains 263 scanlines
|
||||||
// each scanline consists of 113.5 CPU cycles (fast access) which equates to 454 Maria cycles
|
// each scanline consists of 113.5 CPU cycles (fast access) which equates to 454 Maria cycles
|
||||||
// In total there are 29850.5 CPU cycles (fast access) in a frame
|
// In total there are 29850.5 CPU cycles (fast access) in a frame
|
||||||
|
@ -327,7 +324,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
{
|
{
|
||||||
// we are in 5 Byte header mode (i.e. using the character map)
|
// we are in 5 Byte header mode (i.e. using the character map)
|
||||||
GFX_Objects[GFX_index, header_counter].write_mode = temp.Bit(7);
|
GFX_Objects[GFX_index, header_counter].write_mode = temp.Bit(7);
|
||||||
global_write_mode = temp.Bit(7);
|
|
||||||
GFX_Objects[GFX_index, header_counter].ind_mode = temp.Bit(5);
|
GFX_Objects[GFX_index, header_counter].ind_mode = temp.Bit(5);
|
||||||
header_pointer++;
|
header_pointer++;
|
||||||
temp = (byte)(ReadMemory((ushort)(current_DLL_addr + header_pointer)));
|
temp = (byte)(ReadMemory((ushort)(current_DLL_addr + header_pointer)));
|
||||||
|
@ -375,7 +372,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
DMA_phase_next = DMA_GRAPHICS;
|
DMA_phase_next = DMA_GRAPHICS;
|
||||||
|
|
||||||
GFX_Objects[GFX_index, header_counter].write_mode = global_write_mode;
|
GFX_Objects[GFX_index, header_counter].write_mode = false;
|
||||||
|
|
||||||
GFX_Objects[GFX_index, header_counter].ind_mode = false;
|
GFX_Objects[GFX_index, header_counter].ind_mode = false;
|
||||||
|
|
||||||
|
@ -587,8 +584,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
color = Core.Maria_regs[color];
|
color = Core.Maria_regs[color];
|
||||||
|
|
||||||
// the top 4 bits from this are the color, the bottom 4 are the luminosity
|
|
||||||
// this is already conveniently arranged in the palette
|
|
||||||
scanline_buffer[index] = _palette[color];
|
scanline_buffer[index] = _palette[color];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -598,7 +593,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
else if (disp_mode == 2) // note: 1 is not used
|
else if (disp_mode == 2) // note: 1 is not used
|
||||||
{
|
{
|
||||||
local_width = GFX_Objects[local_GFX_index, i].width;
|
local_width = GFX_Objects[local_GFX_index, i].width;
|
||||||
|
|
||||||
for (int j = 0; j < local_width; j++)
|
for (int j = 0; j < local_width; j++)
|
||||||
{
|
{
|
||||||
for (int k = 7; k >= 0; k--)
|
for (int k = 7; k >= 0; k--)
|
||||||
|
@ -639,8 +634,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
color = Core.Maria_regs[color];
|
color = Core.Maria_regs[color];
|
||||||
|
|
||||||
// the top 4 bits from this are the color, the bottom 4 are the luminosity
|
|
||||||
// this is already conveniently arranged in the palette
|
|
||||||
scanline_buffer[index] = _palette[color];
|
scanline_buffer[index] = _palette[color];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -696,8 +689,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
|
|
||||||
color = Core.Maria_regs[color];
|
color = Core.Maria_regs[color];
|
||||||
|
|
||||||
// the top 4 bits from this are the color, the bottom 4 are the luminosity
|
|
||||||
// this is already conveniently arranged in the palette
|
|
||||||
scanline_buffer[index] = _palette[color];
|
scanline_buffer[index] = _palette[color];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -710,7 +701,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
if (disp_mode == 0)
|
if (disp_mode == 0)
|
||||||
{
|
{
|
||||||
local_width = GFX_Objects[local_GFX_index, i].width;
|
local_width = GFX_Objects[local_GFX_index, i].width;
|
||||||
|
|
||||||
for (int j = 0; j < local_width; j++)
|
for (int j = 0; j < local_width; j++)
|
||||||
{
|
{
|
||||||
for (int k = 7; k >= 0; k--)
|
for (int k = 7; k >= 0; k--)
|
||||||
|
@ -749,8 +740,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
{
|
{
|
||||||
color = Core.Maria_regs[local_palette * 4 + color];
|
color = Core.Maria_regs[local_palette * 4 + color];
|
||||||
|
|
||||||
// the top 4 bits from this are the color, the bottom 4 are the luminosity
|
|
||||||
// this is already conveniently arranged in the palette
|
|
||||||
scanline_buffer[index] = _palette[color];
|
scanline_buffer[index] = _palette[color];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -763,7 +752,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
// here the palette is determined by palette bit 2 only
|
// here the palette is determined by palette bit 2 only
|
||||||
// hence only palette 0 or 4 is available
|
// hence only palette 0 or 4 is available
|
||||||
local_palette = GFX_Objects[local_GFX_index, i].palette & 0x4;
|
local_palette = GFX_Objects[local_GFX_index, i].palette & 0x4;
|
||||||
|
|
||||||
int temp_c0 = GFX_Objects[local_GFX_index, i].palette & 0x1;
|
int temp_c0 = GFX_Objects[local_GFX_index, i].palette & 0x1;
|
||||||
int temp_c1 = GFX_Objects[local_GFX_index, i].palette & 0x2;
|
int temp_c1 = GFX_Objects[local_GFX_index, i].palette & 0x2;
|
||||||
|
|
||||||
|
@ -780,8 +769,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
{
|
{
|
||||||
color = Core.Maria_regs[local_palette + color];
|
color = Core.Maria_regs[local_palette + color];
|
||||||
|
|
||||||
// the top 4 bits from this are the color, the bottom 4 are the luminosity
|
|
||||||
// this is already conveniently arranged in the palette
|
|
||||||
scanline_buffer[index] = _palette[color];
|
scanline_buffer[index] = _palette[color];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -802,8 +789,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
{
|
{
|
||||||
color = Core.Maria_regs[local_palette * 4 + 2]; // automatically use index 2 here
|
color = Core.Maria_regs[local_palette * 4 + 2]; // automatically use index 2 here
|
||||||
|
|
||||||
// the top 4 bits from this are the color, the bottom 4 are the luminosity
|
|
||||||
// this is already conveniently arranged in the palette
|
|
||||||
scanline_buffer[index] = _palette[color];
|
scanline_buffer[index] = _palette[color];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -839,7 +824,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
|
||||||
{
|
{
|
||||||
ser.BeginSection("Maria");
|
ser.BeginSection("Maria");
|
||||||
|
|
||||||
ser.Sync("global write mode", ref global_write_mode);
|
|
||||||
ser.Sync("GFX_index", ref GFX_index);
|
ser.Sync("GFX_index", ref GFX_index);
|
||||||
|
|
||||||
ser.EndSection();
|
ser.EndSection();
|
||||||
|
|
Loading…
Reference in New Issue