vectrex; more bug fixes

This commit is contained in:
alyosha-tas 2019-06-23 17:46:30 -04:00
parent 2edf5c08f8
commit 94db48b24f
6 changed files with 49 additions and 26 deletions

View File

@ -182,8 +182,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
"ADD A,ix16", // ab
"CMP X,ix16", // ac
"JSR ix16", // ad
"LD X,ex16", // ae
"ST X,ex16", // af
"LD X,ix16", // ae
"ST X,ix16", // af
"SUB A,ex16", // b0
"CMP A,ex16", // b1
"SBC A,ex16", // b2

View File

@ -32,11 +32,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public bool PB7, PB6;
public bool PB7_prev, PB6_prev;
public bool PB7_last_write;
// Port B controls
public bool sw, sel0, sel1, bc1, bdir, compare, shift_start;
public byte int_en, int_fl, aux_ctrl, prt_ctrl, shift_reg, shift_reg_wait, shift_count;
public bool frame_end;
public byte Read_Registers(int addr)
{
byte ret = 0;
@ -44,7 +48,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
switch (addr)
{
case 0x0:
ret = portB_ret;
if (!aux_ctrl.Bit(7))
{
ret = portB_ret;
}
else
{
ret = (byte)((portB_ret & 0x7F) | (PB7 ? 0x80 : 0x0));
}
int_fl &= 0xE7;
update_int_fl();
@ -132,6 +143,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
if (aux_ctrl.Bit(7))
{
PB7_last_write = wrt_val.Bit(7);
wrt_val = (byte)((wrt_val & 0x7F) | (PB7 ? 0x80 : 0x0));
}
@ -167,7 +179,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
}
}
ppu.x_vel = (byte)(portA_ret ^ 0x80);;
//ppu.x_vel = ~portA_ret;
ppu.x_vel = (byte)(portA_ret ^ 0x80);
//ppu.x_vel = portA_ret; if (ppu.x_vel >= 128) { ppu.x_vel -= 128; ppu.x_vel = -ppu.x_vel; }
int_fl &= 0xE7;
update_int_fl();
@ -180,7 +194,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
// writing to sound reg
if (bdir)
{
if (bc1) { audio.port_sel = (byte)(portA_ret & 0xf); }
if (bc1) { audio.port_sel = (byte)(portA_ret & 0xF); }
else { audio.WriteReg(0, portA_ret); }
}
@ -198,7 +212,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
}
}
//ppu.x_vel = ~portA_ret;
ppu.x_vel = (byte)(portA_ret ^ 0x80);
//ppu.x_vel = portA_ret; if (ppu.x_vel >= 128) { ppu.x_vel -= 128; ppu.x_vel = -ppu.x_vel; }
int_fl &= 0xFC;
update_int_fl();
@ -256,7 +272,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
break;
case 0xB:
aux_ctrl = value;
if (!aux_ctrl.Bit(7)) { ppu.ramp_sig = value.Bit(7); }
t1_ctrl = aux_ctrl;
//if (aux_ctrl.Bit(7)) { ppu.ramp_sig = !PB7; }
//else { ppu.ramp_sig = !PB7_last_write; }
break;
case 0xC:
prt_ctrl = value;
@ -325,8 +343,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
}
}
public void timer_1_tick()
public void internal_state_tick()
{
// Timer 1
t1_counter--;
if (t1_counter < 0)
@ -356,10 +375,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
}
}
}
}
public void timer_2_tick()
{
// Timer 2
t2_counter--;
if (t2_counter < 0)
@ -385,11 +402,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
t2_shot_go = false;
}
}
frame_end = true;
}
}
public void shift_reg_tick()
{
// Shift register
if (shift_start)
{
if (shift_reg_wait > 0)
@ -405,15 +421,20 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
// reset blank signal back to contorl of peripheral controller
shift_start = false;
if ((prt_ctrl & 0xE0) == 0xC0) { ppu.blank_sig = true; }
else { ppu.blank_sig = false; }
//if ((prt_ctrl & 0xE0) == 0xC0) { ppu.blank_sig = true; }
//else { ppu.blank_sig = false; }
}
else
{
ppu.blank_sig = !shift_reg.Bit(7 - shift_count);
shift_count++;
shift_reg_wait = 1;
}
}
else
{
Console.WriteLine("method 2");
}
// other clocking modes are not used. Maybe some demos use them?
}

View File

@ -92,7 +92,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
if (addr < 0x8000)
{
return 0xFF;
return mapper.ReadMemory(addr);
}
else if (addr < 0xC800)
{

View File

@ -15,6 +15,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public void tick()
{
//Console.WriteLine(ramp_sig + " " + zero_sig + " " + blank_sig + " " + Core.cpu.TotalExecutedCycles + " " + (x_vel - 128.0) + " " + x_pos
//+ " " + (y_vel - 128.0) + " " + y_pos + " " + Core.t1_counter + " " + vec_scale);
if (ramp_sig && !zero_sig)
{
x_pos = x_pos + (x_vel - 128.0) / 256.0 * (vec_scale + 2);
@ -25,7 +28,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.Floor(x_pos) + 256 * Math.Floor(y_pos))] = (int)br; }
if (!blank_sig) { Core._vidbuffer[(int)(Math.Round(x_pos) + 256 * Math.Round(y_pos))] = (int)br; }
}
else if (zero_sig)
{

View File

@ -36,6 +36,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
audio.Register[14] = (byte)(_controllerDeck.ReadPort1(controller) & 0xF);
audio.Register[14] |= (byte)(_controllerDeck.ReadPort2(controller) << 4);
frame_end = false;
do_frame();
if (_islag)
@ -50,11 +52,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
_vidbuffer = new int[VirtualWidth * VirtualHeight];
for (int i = 0; i < 25000; i++)
//for (int i = 0; i < 1000; i++)
while (!frame_end)
{
timer_1_tick();
timer_2_tick();
shift_reg_tick();
internal_state_tick();
audio.tick();
ppu.tick();
cpu.ExecuteOne();
@ -83,7 +84,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
#region Video provider
public int _frameHz = 60;
public int _frameHz = 50;
public int[] _vidbuffer;
@ -100,10 +101,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public int VsyncNumerator => _frameHz;
public int VsyncDenominator => 1;
public static readonly uint[] color_palette_Gr = { 0xFFA4C505, 0xFF88A905, 0xFF1D551D, 0xFF052505 };
public uint[] color_palette = new uint[4];
#endregion
}
}

View File

@ -100,6 +100,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
ser.Sync(nameof(shift_reg_wait), ref shift_reg_wait);
ser.Sync(nameof(shift_count), ref shift_count);
ser.Sync(nameof(frame_end), ref frame_end);
// probably a better way to do this
if (cart_RAM != null)
{