O2Hawk: add PAL mode

This commit is contained in:
alyosha-tas 2020-03-20 16:39:14 -04:00
parent 72f87ce808
commit aa165f36d2
4 changed files with 105 additions and 56 deletions
Assets/gamedb
BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2

View File

@ -3,17 +3,17 @@
;;;
;;; Homebrew (but not derived from TOSEC)
SHA1:26A044C68FF08F574F6649B731B82CACA8C0E797 D Death Race O2
SHA1:E04D12B6290370B76F90E76D9DE75B6470B4F913 D redgreen O2
SHA1:38D4AAB263E10B1DAC3410C120536EE079826BCB D Fatso 2 O2
SHA1:3720DD6B5EE3DC62C5AF2EA9D915A2B83DE9463D D Chief Chef O2
SHA1:FEB358E28587DE70D1E89BF0F9A3209CE0B67C57 D Haunted House O2
SHA1:B1D65BEDB56FE7A9CF60AA054A9FD9BB7F65B77C D 3D Box O2
SHA1:0270047E2B1FC07581BF0FF9E55035925CF0EFF0 D Guiseppe apr14 O2
SHA1:0D6B44E2445DBB3BF70C4E05F222822845C29762 D Boob O2
SHA1:DE888B7AA2716C3134CFF812A4E07E86B2479537 D Shoot the B O2
SHA1:85A44A99B254D92A7433EE46E4CAA91483D7FEA2 D Go Sub 2 O2
SHA1:2B34EF0E1A8C0371F00A33D6950E0807F3CB886E D Happy Emu O2
SHA1:26A044C68FF08F574F6649B731B82CACA8C0E797 D Death Race O2 US
SHA1:E04D12B6290370B76F90E76D9DE75B6470B4F913 D redgreen O2 US
SHA1:38D4AAB263E10B1DAC3410C120536EE079826BCB D Fatso 2 O2 US
SHA1:3720DD6B5EE3DC62C5AF2EA9D915A2B83DE9463D D Chief Chef O2 US
SHA1:FEB358E28587DE70D1E89BF0F9A3209CE0B67C57 D Haunted House O2 US
SHA1:B1D65BEDB56FE7A9CF60AA054A9FD9BB7F65B77C D 3D Box O2 US
SHA1:0270047E2B1FC07581BF0FF9E55035925CF0EFF0 D Guiseppe apr14 O2 US
SHA1:0D6B44E2445DBB3BF70C4E05F222822845C29762 D Boob O2 US
SHA1:DE888B7AA2716C3134CFF812A4E07E86B2479537 D Shoot the B O2 US
SHA1:85A44A99B254D92A7433EE46E4CAA91483D7FEA2 D Go Sub 2 O2 US
SHA1:2B34EF0E1A8C0371F00A33D6950E0807F3CB886E D Happy Emu O2 US

View File

@ -55,20 +55,58 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
bool frame_chk = true;
while (frame_chk)
if (is_pal)
{
ppu.tick();
ppu.tick();
serialport.serial_transfer_tick();
ppu.Audio_tick();
cpu.ExecuteOne();
if (!in_vblank && in_vblank_old)
// PAL timing is: 17.7 / 5 ppu
// and 17.7 / 9 for cpu (divide by 3 externally then by 3 again internally)
int ticker = 0;
while (frame_chk)
{
frame_chk = false;
}
ticker++;
in_vblank_old = in_vblank;
if ((ticker % 5) == 0)
{
ppu.tick();
if ((ticker % 10) == 0)
{
ppu.Audio_tick();
}
}
if ((ticker % 9) == 0)
{
serialport.serial_transfer_tick();
cpu.ExecuteOne();
}
if (!in_vblank && in_vblank_old)
{
frame_chk = false;
}
in_vblank_old = in_vblank;
}
}
else
{
// NTSC is 2 to 1 ppu to cpu ticks
while (frame_chk)
{
ppu.tick();
ppu.tick();
serialport.serial_transfer_tick();
ppu.Audio_tick();
cpu.ExecuteOne();
if (!in_vblank && in_vblank_old)
{
frame_chk = false;
}
in_vblank_old = in_vblank;
}
}
}
@ -184,7 +222,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
public void SendVideoBuffer()
{
for (int j = 0; j < 240; j++)
for (int j = 0; j < pic_height; j++)
{
for (int i = 0; i < 320; i++)
{
@ -199,10 +237,12 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
}
}
public int pic_height;
public int VirtualWidth => 320;
public int VirtualHeight => 240;
public int VirtualHeight => pic_height;
public int BufferWidth => 320;
public int BufferHeight => 240;
public int BufferHeight => pic_height;
public int BackgroundColor => unchecked((int)0xFF000000);
public int VsyncNumerator => _frameHz;
public int VsyncDenominator => 1;

View File

@ -39,6 +39,8 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
public PPU ppu;
public SerialPort serialport;
public bool is_pal;
[CoreConstructor("O2")]
public O2Hawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ object settings, object syncSettings)
{
@ -99,23 +101,23 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
SetupMemoryDomains();
HardReset();
/*
for (int i = 0; i < 64; i++)
{
cpu.Regs[i] = (byte)i;
}
// set up differences between PAL and NTSC systems
is_pal = true;
pic_height = 288;
_frameHz = 50;
for (int j = 0; j < 0x80; j++)
if ((game.Region == "US") || (game.Region == "EU-US") || (game.Region == null))
{
RAM[j] = (byte)j;
is_pal = false;
pic_height = 240;
_frameHz = 60;
}
for (int k = 0; k < 0x100; k++)
{
ppu.WriteReg(k, (byte)k);
}
*/
ppu.set_region(is_pal);
_vidbuffer = new int[372 * pic_height];
frame_buffer = new int[320 * pic_height];
}
public DisplayType Region => DisplayType.NTSC;
@ -135,9 +137,6 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
serialport.Reset();
cpu.SetCallbacks(ReadMemory, PeekMemory, PeekMemory, WriteMemory);
_vidbuffer = new int[372 * 240];
frame_buffer = new int[320 * 240];
}
private void ExecFetch(ushort addr)

View File

@ -10,6 +10,11 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
{
public O2Hawk Core { get; set; }
// not stated, set on game load
public bool is_pal;
public int LINE_VBL;
public int LINE_MAX;
public const int HBL_CNT = 45;
public byte[] Sprites = new byte[16];
@ -203,7 +208,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
if (cycle >= HBL_CNT)
{
// draw a pixel
if (LY < 240)
if (LY < LINE_VBL)
{
if (cycle == HBL_CNT)
{
@ -700,7 +705,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
LY++;
if (LY == 240)
if (LY == LINE_VBL)
{
VBL = true;
Core.in_vblank = true;
@ -708,7 +713,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
Core.cpu.IRQPending = true;
Core.cpu.T1 = true;
}
if (LY == 262)
if (LY == LINE_MAX)
{
LY = 0;
VBL = false;
@ -716,7 +721,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
VDC_status &= 0xF7;
for (int i = 0; i < 8; i++) { VDC_col_ret[i] = 0; }
}
if (LY < 240)
if (LY < LINE_VBL)
{
HBL = true;
VDC_status &= 0xFE;
@ -726,17 +731,6 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
}
}
// might be needed, not sure yet
public void latch_delay()
{
}
public void process_sprite()
{
}
public void Reset()
{
Sprites = new byte[16];
@ -749,6 +743,22 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
AudioReset();
}
public void set_region(bool pal_flag)
{
is_pal = pal_flag;
if (is_pal)
{
LINE_MAX = 312;
LINE_VBL = 288;
}
else
{
LINE_MAX = 262;
LINE_VBL = 240;
}
}
public static readonly byte[] Internal_Graphics = { 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 00, // 0 0x00
0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, 00, // 1 0x01
0x3C, 0x66, 0x0C, 0x18, 0x30, 0x60, 0x7E, 00, // 2 0x02