From 233825bbb76a70d6887b639d14981ebc76faf535 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 29 Jun 2019 12:27:17 -0400 Subject: [PATCH] Vectrexx: More bug fixes --- .../CPUs/MC6809/Operations.cs | 51 +------------------ .../Consoles/GCE/Vectrex/HW_Registers.cs | 33 ++++++++---- .../Consoles/GCE/Vectrex/PPU.cs | 4 +- .../GCE/Vectrex/VectrexHawk.IEmulator.cs | 6 ++- .../GCE/Vectrex/VectrexHawk.IStatable.cs | 1 + 5 files changed, 33 insertions(+), 62 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs b/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs index 6ce7fb9836..5236b52a25 100644 --- a/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs +++ b/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs @@ -168,7 +168,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809 FlagH = Reg16_d.Bit(4); FlagV = (Regs[dest].Bit(7) != Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7)); - FlagN = false; + FlagN = ans > 127; Regs[dest] = ans; } @@ -453,55 +453,6 @@ namespace BizHawk.Emulation.Common.Components.MC6809 FlagH = false; } - // used for signed operations - public void ADDS_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) - { - int Reg16_d = Regs[dest_l]; - int Reg16_s = Regs[src_l]; - - Reg16_d += Reg16_s; - - ushort temp = 0; - - // since this is signed addition, calculate the high byte carry appropriately - if (Reg16_s.Bit(7)) - { - if (((Reg16_d & 0xFF) >= Regs[dest_l])) - { - temp = 0xFF; - } - else - { - temp = 0; - } - } - else - { - temp = (ushort)(Reg16_d.Bit(8) ? 1 : 0); - } - - ushort ans_l = (ushort)(Reg16_d & 0xFF); - - // JR operations do not effect flags - if (dest_l != PC) - { - FlagC = Reg16_d.Bit(8); - - // redo for half carry flag - Reg16_d = Regs[dest_l] & 0xF; - Reg16_d += Regs[src_l] & 0xF; - - FlagH = Reg16_d.Bit(4); - FlagN = false; - FlagZ = false; - } - - Regs[dest_l] = ans_l; - Regs[dest_h] += temp; - Regs[dest_h] &= 0xFF; - - } - // D register implied public void SUB16_Func(ushort src) { diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs index 57d5ced021..af63e78079 100644 --- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs +++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs @@ -34,6 +34,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex public bool PB7_undriven; + public byte pot_val; + // Port B controls public bool sw, sel0, sel1, bc1, bdir, compare, shift_start; @@ -55,7 +57,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex else { ret = (byte)((portB_ret & 0x7F) | (PB7 ? 0x80 : 0x0)); - } + } + + if (!dir_ctrl.Bit(5)) { ret |= (byte)(compare ? 0x0 : 0x20); } int_fl &= 0xE7; update_int_fl(); @@ -157,12 +161,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex if (dir_ctrl.Bit(6)) { /* cart bank switch */ } if (dir_ctrl.Bit(7)) { + //Console.WriteLine(PB7_undriven + " " + !wrt_val.Bit(7)); ppu.ramp_sig = !wrt_val.Bit(7); if (PB7_undriven && !wrt_val.Bit(7)) { - PB7_undriven = false; + PB7_undriven = false; ppu.skip = 14; - } + } } // writing to sound reg @@ -177,11 +182,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex if (sel0) { if (sel1) {/* sound line? */ } - else { ppu.vec_scale = portA_ret; } + else { ppu.vec_scale = portA_ret; if (portA_ret != 0) { Console.WriteLine("scale: " + portA_ret); } } } else { - if (sel1) { ppu.bright = portA_ret; } + if (sel1) { ppu.bright = portA_ret; ppu.bright_int = (uint)(0xFF000000 | (ppu.bright << 16) | (ppu.bright << 8) | ppu.bright); } else { ppu.y_vel = (byte)(portA_ret ^ 0x80); } } } @@ -208,11 +213,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex if (sel0) { if (sel1) {/* sound line? */ } - else { ppu.vec_scale = portA_ret; } + else { ppu.vec_scale = portA_ret; if (portA_ret != 0) { Console.WriteLine("scale: " + portA_ret); } } } else { - if (sel1) { ppu.bright = portA_ret; } + if (sel1) { ppu.bright = portA_ret; ppu.bright_int = (uint)(0xFF000000 | (ppu.bright << 16) | (ppu.bright << 8) | ppu.bright); } else { ppu.y_vel = (byte)(portA_ret ^ 0x80); } } } @@ -235,8 +240,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex t1_high = value; t1_counter = (t1_high << 8) | t1_low; + + if (aux_ctrl.Bit(7)) + { + PB7 = false; + ppu.ramp_sig = true; + } + t1_shot_go = true; - if (aux_ctrl.Bit(7)) { PB7 = false; ppu.ramp_sig = true; ppu.skip = 0; } + t1_ctrl = aux_ctrl; int_fl &= 0xBF; @@ -268,7 +280,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex int_fl &= 0xFB; shift_reg = value; shift_start = true; - if (ppu.skip == 1) { ppu.ramp_sig = true; ppu.skip = 0; } + shift_reg_wait = 2; shift_count = 0; @@ -366,7 +378,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex update_int_fl(); //if (int_en.Bit(6)) { cpu.IRQPending = true; } - if (t1_ctrl.Bit(7)) { PB7 = !PB7; ppu.ramp_sig = !ppu.ramp_sig; } + if (t1_ctrl.Bit(7)) { PB7 = !PB7; ppu.ramp_sig = !PB7; } } else { @@ -435,6 +447,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex else { ppu.blank_sig = !shift_reg.Bit(7 - shift_count); + shift_count++; shift_reg_wait = 1; } diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs index 7916a23163..e6185c58d6 100644 --- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs @@ -12,6 +12,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex public double x_pos, y_pos; public int skip; + public uint bright_int; public static uint br = 0xFFFFFFFF; @@ -37,7 +38,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex if (y_pos > 383) { y_pos = 383; } if (y_pos < 0) { y_pos = 0; } - if (!blank_sig) { Core._vidbuffer[(int)(Math.Round(x_pos) + 256 * Math.Round(y_pos))] = (int)br; } + if (!blank_sig) { Core._vidbuffer[(int)(Math.Round(x_pos) + 256 * Math.Round(y_pos))] = (int)(br & bright_int); } } else if (zero_sig) { @@ -72,6 +73,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex ser.Sync(nameof(y_pos), ref y_pos); ser.Sync(nameof(skip), ref skip); + ser.Sync(nameof(bright_int), ref bright_int); } } } diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs index d9abaa8d15..463da3fe91 100644 --- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs @@ -36,6 +36,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex audio.Register[14] = (byte)(_controllerDeck.ReadPort1(controller) & 0xF); audio.Register[14] |= (byte)(_controllerDeck.ReadPort2(controller) << 4); + // joystick position is based on pot reading + + + frame_end = false; do_frame(); @@ -51,7 +55,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex public void do_frame() { _vidbuffer = new int[VirtualWidth * VirtualHeight]; - + //PB7_undriven = true; //for (int i = 0; i < 1000; i++) while (!frame_end) { diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IStatable.cs index 6c606e61fa..a607e3b06a 100644 --- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IStatable.cs @@ -102,6 +102,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex ser.Sync(nameof(frame_end), ref frame_end); ser.Sync(nameof(PB7_undriven), ref PB7_undriven); + ser.Sync(nameof(pot_val), ref pot_val); // probably a better way to do this if (cart_RAM != null)