diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
index 5ed3b20e4f..ef1d8c3a49 100644
--- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
+++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
@@ -605,13 +605,13 @@
-
+
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Audio.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Audio.cs
new file mode 100644
index 0000000000..6390adea4a
--- /dev/null
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Audio.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using BizHawk.Common;
+using BizHawk.Emulation.Common;
+
+namespace BizHawk.Emulation.Cores.Consoles.ChannelF
+{
+ ///
+ /// Audio related functions
+ ///
+ public partial class ChannelF : ISoundProvider
+ {
+ private double SampleRate = 44100;
+ private int SamplesPerFrame;
+ private double Period;
+ private double CyclesPerSample;
+
+
+ private int tone = 0;
+
+ private double[] tone_freqs = new double[] { 0, 1000, 500, 120 };
+ private double amplitude = 0;
+ private double decay = 0.998;
+ private double time = 0;
+ private double cycles = 0;
+ private int samplePos = 0;
+ private int lastCycle = 0;
+
+ private BlipBuffer _blip;
+
+ private short[] SampleBuffer;
+
+ private void SetupAudio()
+ {
+ Period = (double)1 / SampleRate;
+ SamplesPerFrame = (int)(SampleRate / refreshRate);
+ CyclesPerSample = (double)ClockPerFrame / (double)SamplesPerFrame;
+ SampleBuffer = new short[SamplesPerFrame];
+ _blip = new BlipBuffer(SamplesPerFrame);
+ _blip.SetRates(ClockPerFrame * refreshRate, SampleRate);
+ }
+
+ private void AudioChange()
+ {
+ if (tone == 0)
+ {
+ // silence
+ }
+ else
+ {
+ int SamplesPerWave = (int)(SampleRate / tone_freqs[tone]);
+ double RadPerSample = (Math.PI * 2) / (double) SamplesPerWave;
+ double SinVal = 0;
+
+ int NumSamples = (int)(((double)FrameClock - (double)lastCycle) / CyclesPerSample);
+
+ int startPos = lastCycle;
+
+ for (int i = 0; i < NumSamples; i++)
+ {
+ SinVal = Math.Sin(RadPerSample * (double) (i * SamplesPerWave));
+ _blip.AddDelta((uint)startPos, (int) (Math.Floor(SinVal * 127) + 128) * 1024);
+ startPos += (int)CyclesPerSample;
+ }
+ }
+ }
+
+ public bool CanProvideAsync => false;
+
+ public SyncSoundMode SyncMode => SyncSoundMode.Sync;
+
+ public void SetSyncMode(SyncSoundMode mode)
+ {
+ if (mode != SyncSoundMode.Sync)
+ throw new InvalidOperationException("Only Sync mode is supported.");
+ }
+
+ public void GetSamplesAsync(short[] samples)
+ {
+ throw new NotSupportedException("Async is not available");
+ }
+
+ public void DiscardSamples()
+ {
+ SampleBuffer = new short[SamplesPerFrame];
+ samplePos = 0;
+ lastCycle = 0;
+ }
+
+ public void GetSamplesSync(out short[] samples, out int nsamp)
+ {
+ AudioChange();
+
+ _blip.EndFrame((uint)ClockPerFrame);
+ nsamp = _blip.SamplesAvailable();
+ samples = new short[nsamp * 2];
+ _blip.ReadSamples(samples, nsamp, true);
+
+ for (int i = 0; i < nsamp * 2; i += 2)
+ {
+ samples[i + 1] = samples[i];
+ }
+ }
+ }
+}
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IDebuggable.cs
index 16a48c9684..ee961bcf67 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IDebuggable.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IDebuggable.cs
@@ -47,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
if (reg > 63)
throw new InvalidOperationException();
- CPU.Regs[reg] = (ushort) value;
+ CPU.Regs[reg] = (byte) value;
}
else
{
@@ -56,13 +56,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
default:
throw new InvalidOperationException();
case "A":
- CPU.Regs[CPU.A] = (ushort)value;
+ CPU.Regs[CPU.A] = (byte)value;
break;
case "W":
- CPU.Regs[CPU.W] = (ushort)value;
+ CPU.Regs[CPU.W] = (byte)value;
break;
case "ISAR":
- CPU.Regs[CPU.ISAR] = (ushort)(value & 0x3F);
+ CPU.Regs[CPU.ISAR] = (byte)(value & 0x3F);
break;
case "PC0":
CPU.RegPC0 = (ushort)value;
@@ -74,25 +74,25 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
CPU.RegDC0 = (ushort)value;
break;
case "DB":
- CPU.Regs[CPU.DB] = (ushort)value;
+ CPU.Regs[CPU.DB] = (byte)value;
break;
case "IO":
- CPU.Regs[CPU.IO] = (ushort)value;
+ CPU.Regs[CPU.IO] = (byte)value;
break;
case "J":
- CPU.Regs[CPU.J] = (ushort)value;
+ CPU.Regs[CPU.J] = (byte)value;
break;
case "H":
- CPU.Regs[CPU.Hl] = (ushort)(value & 0xFF);
- CPU.Regs[CPU.Hh] = (ushort)(value & 0xFF00);
+ CPU.Regs[CPU.Hl] = (byte)(value & 0xFF);
+ CPU.Regs[CPU.Hh] = (byte)(value & 0xFF00);
break;
case "K":
- CPU.Regs[CPU.Kl] = (ushort)(value & 0xFF);
- CPU.Regs[CPU.Kh] = (ushort)(value & 0xFF00);
+ CPU.Regs[CPU.Kl] = (byte)(value & 0xFF);
+ CPU.Regs[CPU.Kh] = (byte)(value & 0xFF00);
break;
case "Q":
- CPU.Regs[CPU.Ql] = (ushort)(value & 0xFF);
- CPU.Regs[CPU.Qh] = (ushort)(value & 0xFF00);
+ CPU.Regs[CPU.Ql] = (byte)(value & 0xFF);
+ CPU.Regs[CPU.Qh] = (byte)(value & 0xFF00);
break;
}
}
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs
index 4ce4fcaaa9..fa44fd2e45 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs
@@ -22,8 +22,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
private void CalcClock()
{
- var c = ((cpuFreq * 1000000) / refreshRate) * 4;
+ var c = ((cpuFreq * 1000000) / refreshRate);
ClockPerFrame = (int) c;
+
+ SetupAudio();
}
public bool FrameAdvance(IController controller, bool render, bool renderSound)
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs
index d67cdd1a94..5393e91dcf 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs
@@ -9,14 +9,14 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
{
public int _frameHz = 60;
- public int[] CroppedBuffer = new int[(128*64) * 2]; //new int[102 * 58];
+ public int[] CroppedBuffer = new int[102 * 58];
#region IVideoProvider
public int VirtualWidth => BufferWidth * 2;
- public int VirtualHeight => (int)((double)BufferHeight * 1.5) * 2;
- public int BufferWidth => 128;// 102;
- public int BufferHeight => 64; // 58;
+ public int VirtualHeight => (int)((double)BufferHeight * 1.3) * 2;
+ public int BufferWidth => 102; //128
+ public int BufferHeight => 58; //64
public int BackgroundColor => Colors.ARGB(0x00, 0x00, 0x00);
public int VsyncNumerator => _frameHz;
public int VsyncDenominator => 1;
@@ -24,41 +24,32 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public int[] GetVideoBuffer()
{
BuildFrame();
- /*
- for (int i = 0; i < frameBuffer.Length; i++)
+
+ var lBorderWidth = 4;
+ var rBorderWidth = 128 - 102 - lBorderWidth;
+ var tBorderHeight = 4;
+ var bBorderHeight = 64 - 58 - tBorderHeight;
+ var startP = 128 * tBorderHeight;
+ var endP = 128 * bBorderHeight;
+
+ int index = 0;
+
+ for (int i = startP; i < frameBuffer.Length - endP; i += 128)
{
- CroppedBuffer[i] = frameBuffer[i];
- CroppedBuffer[i + frameBuffer.Length] = frameBuffer[i];
- }
-
- return CroppedBuffer;
- */
- return frameBuffer;
-
- // crop to visible area
- var lR = 4;
- var rR = 128 - BufferWidth - lR;
- var tR = 4;
- var bR = 64 - BufferHeight - tR;
- var sW = 128 - lR - rR;
- var startP = 128 * tR;
- var endP = 128 * bR;
-
- int index2 = 0;
-
- // line by line
- for (int i = startP; i < CroppedBuffer.Length - endP; i += sW + lR + rR)
- {
- // each pixel in each line
- for (int p = lR; p < sW + lR + rR - rR; p++)
+ for (int p = lBorderWidth; p < 128 - rBorderWidth; p++)
{
- if (index2 == CroppedBuffer.Length)
+ if (index == CroppedBuffer.Length)
break;
- CroppedBuffer[index2++] = frameBuffer[i + p];
+
+ CroppedBuffer[index++] = FPalette[frameBuffer[i + p]];
}
}
return CroppedBuffer;
+
+ //return frameBuffer;
+
+
}
#endregion
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs
index 7e19c5f260..78a54ecc79 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs
@@ -47,6 +47,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
ser.Register(this);
ser.Register(_tracer);
ser.Register(CPU);
+ ser.Register(this);
SetupMemoryDomains();
}
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.ALU.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.ALU.cs
deleted file mode 100644
index 70858f7576..0000000000
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.ALU.cs
+++ /dev/null
@@ -1,235 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using BizHawk.Common.NumberExtensions;
-
-namespace BizHawk.Emulation.Cores.Consoles.ChannelF
-{
- ///
- /// ALU Operations
- /// The arithmetic and logic unit provides all data manipulating logic for the F3850.
- /// It contains logic that operates on a single 8-bit source data work or combines two 8-bit words of source data
- /// to generate a single 8-bit result. Additional information is reported in status flags, where appropriate.
- ///
- /// Operations Performed:
- /// * Addition
- /// * Compare
- /// * AND
- /// * OR
- /// * XOR
- ///
- public sealed partial class F3850
- {
- ///
- /// Clears all status flags (excluding the ICB flag)
- ///
- public void ALU_ClearFlags_()
- {
- FlagC = false;
- FlagO = false;
- FlagS = false;
- FlagZ = false;
- }
-
- ///
- /// Sets the SIGN and ZERO flags based on the supplied byte
- ///
- ///
- public void ALU_SetFlags_SZ_(ushort src)
- {
- FlagZ = (byte)Regs[src] == 0;
- FlagS = (~((byte)Regs[src]) & 0x80) != 0;
- }
- /*
- ///
- /// Performs addition and sets the CARRY and OVERFLOW flags accordingly
- ///
- ///
- ///
- ///
- public void ALU_ADD8_Func_(ushort dest, ushort src, bool carry = false)
- {
- byte d = (byte)Regs[dest];
- byte s = (byte)Regs[src];
- byte c = carry ? (byte)1 : (byte)0;
- ushort result = (ushort)(d + s + c);
-
- FlagC = (result & 0x100) != 0;
- FlagO = ((d ^ result) & (s ^ result) & 0x80) != 0;
-
- Regs[dest] = (ushort)(result & 0xFF);
- }
- */
-
- ///
- /// Performs addition and sets the CARRY and OVERFLOW flags accordingly WITHOUT saving to destination
- ///
- ///
- ///
- ///
- public void ALU_ADD8_FLAGSONLY_Func(ushort dest, ushort src)
- {
- byte d = (byte)Regs[dest];
- byte s = (byte)Regs[src];
- ushort result = (ushort)(d + s);
-
- FlagC = (result & 0x100) != 0;
- FlagO = ((d ^ result) & (s ^ result) & 0x80) != 0;
- }
-
- ///
- /// Performs decimal addition based on the two supplied bytes
- /// (looks like this is only used in the AMD operation)
- ///
- ///
- ///
-
-
- public void ALU_SUB8_Func(ushort dest, ushort src)
- {
- byte d = (byte)Regs[dest];
- byte s = (byte)Regs[src];
- ushort result = (ushort)(d - s);
-
- FlagC = (result & 0x100) != 0;
- FlagO = ((d ^ result) & (s ^ result) & 0x80) != 0;
-
- int Reg16_d = Regs[dest];
- Reg16_d -= Regs[src];
-
- FlagC = Reg16_d.Bit(8);
- FlagZ = (Reg16_d & 0xFF) == 0;
-
- ushort ans = (ushort)(Reg16_d & 0xFF);
-
- FlagO = (Regs[dest].Bit(7) != Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7));
- FlagS = ans > 127;
-
- Regs[dest] = ans;
- }
-
- /*
- public void ALU_SUB8_Func(ushort dest, ushort src)
- {
- int Reg16_d = Regs[dest];
- Reg16_d -= Regs[src];
-
- FlagC = Reg16_d.Bit(8);
- FlagZ = (Reg16_d & 0xFF) == 0;
-
- ushort ans = (ushort)(Reg16_d & 0xFF);
-
- FlagO = (Regs[dest].Bit(7) != Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7));
- FlagS = ans > 127;
-
- Regs[dest] = ans;
- }
- */
-
-
-
- ///
- /// AND
- ///
- ///
- ///
-
-
-
-
-
- /*
- public void ALU_XOR8C_Func(ushort dest, ushort src)
- {
- // TODO
- Regs[dest] = (ushort)(Regs[dest] ^ Regs[src]);
- FlagZ = Regs[dest] == 0;
- FlagC = false;
- FlagO = false;
- FlagS = Regs[dest] > 127;
- }
- */
-
- public void ADDS_FuncX(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
- // note that flags are unaffected by this operation
- 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);
-
- Regs[dest_l] = ans_l;
- Regs[dest_h] += temp;
- Regs[dest_h] &= 0xFF;
- }
-
-
- /*
- public void LR8_Func(ushort dest, ushort src)
- {
- if (dest == DB)
- {
- // byte storage
- Regs[dest] = (ushort)(Regs[src] & 0xFF);
- }
- else if (dest == W)
- {
- // mask for status register
- Regs[dest] = (ushort)(Regs[src] & 0x1F);
- }
- else if (dest == ISAR)
- {
- // mask for ISAR register
- Regs[dest] = (ushort)(Regs[src] & 0x3F);
- }
- else
- {
- Regs[dest] = Regs[src];
- }
- }
- */
-
- /*
- public void ALU_INC8_Func(ushort src)
- {
- int Reg16_d = Regs[src];
- Reg16_d += 1;
-
- FlagC = Reg16_d.Bit(8);
- FlagZ = (Reg16_d & 0xFF) == 0;
-
- ushort ans = (ushort)(Reg16_d & 0xFF);
-
- Regs[src] = ans;
-
- FlagS = Regs[src].Bit(7);
- FlagO = Regs[src] == 0x80;
- }
- */
-
-
- }
-}
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Disassembler.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Disassembler.cs
index 223eba1a51..f3e4510f89 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Disassembler.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Disassembler.cs
@@ -169,14 +169,14 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
"LIS D", // 0x7D
"LIS E", // 0x7E
"LIS F", // 0x7F
- "BT 0", // 0x80
- "BT 1", // 0x81
- "BT 2", // 0x82
- "BT 3", // 0x83
- "BT 4", // 0x84
- "BT 5", // 0x85
- "BT 6", // 0x86
- "BT 7", // 0x87
+ "BT NOBRANCH", // 0x80
+ "BP d", // 0x81
+ "BC d", // 0x82
+ "BP or C d", // 0x83
+ "BZ d", // 0x84
+ "BP d", // 0x85
+ "BZ or C d", // 0x86
+ "BP or C d", // 0x87
"AM", // 0x88
"AMD", // 0x89
"NM", // 0x8A
@@ -185,22 +185,22 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
"CM", // 0x8D
"ADC", // 0x8E
"BR7 n", // 0x8F
- "BF 0x0 n", // 0x90
- "BF 0x1 n", // 0x91
- "BF 0x2 n", // 0x92
- "BF 0x3 n", // 0x93
- "BF 0x4 n", // 0x94
- "BF 0x5 n", // 0x95
- "BF 0x6 n", // 0x96
- "BF 0x7 n", // 0x97
- "BF 0x8 n", // 0x98
- "BF 0x9 n", // 0x99
- "BF 0xA n", // 0x9A
- "BF 0xB n", // 0x9B
- "BF 0xC n", // 0x9C
- "BF 0xD n", // 0x9D
- "BF 0xE n", // 0x9E
- "BF 0xF n", // 0x9F
+ "BF UNCON d", // 0x90
+ "BN d", // 0x91
+ "BNC d", // 0x92
+ "BNC & deg d", // 0x93
+ "BNZ d", // 0x94
+ "BN d", // 0x95
+ "BNC & dZ d", // 0x96
+ "BNC & deg d", // 0x97
+ "BNO d", // 0x98
+ "BN & dO d", // 0x99
+ "BNO & dC d", // 0x9A
+ "BNO & dC & deg d", // 0x9B
+ "BNO & dZ d", // 0x9C
+ "BN & dO d", // 0x9D
+ "BNO & dC & dZ d", // 0x9E
+ "BNO & dC & deg d", // 0x9F
"INS 0", // 0xA0
"INS 1", // 0xA1
"ILLEGAL", // 0xA2
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Execute.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Execute.cs
index 8a2f952e67..7c5ae0e707 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Execute.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Execute.cs
@@ -15,8 +15,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public long TotalExecutedCycles;
public int instr_pntr = 0;
- public ushort[] cur_instr = new ushort[MaxInstructionLength]; // fixed size - do not change at runtime
- public ushort[] cur_romc = new ushort[MaxInstructionLength]; // fixed size - do not change at runtime
+ public byte[] cur_instr = new byte[MaxInstructionLength]; // fixed size - do not change at runtime
+ public byte[] cur_romc = new byte[MaxInstructionLength]; // fixed size - do not change at runtime
public byte opcode;
public void FetchInstruction()
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Operations.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Operations.cs
index 7698d0060a..648f3120d3 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Operations.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Operations.cs
@@ -12,22 +12,22 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
public sealed partial class F3850
{
- public void Read_Func(ushort dest, ushort src_l, ushort src_h)
+ public void Read_Func(byte dest, byte src_l, byte src_h)
{
Regs[dest] = ReadMemory((ushort)(Regs[src_l] | (Regs[src_h]) << 8));
}
- public void Write_Func(ushort dest_l, ushort dest_h, ushort src)
+ public void Write_Func(byte dest_l, byte dest_h, byte src)
{
- WriteMemory((ushort)(Regs[dest_l] | (Regs[dest_h] << 8)), (byte)Regs[src]);
+ WriteMemory((ushort)(Regs[dest_l] | (Regs[dest_h] << 8)), Regs[src]);
}
- public void IN_Func(ushort dest, ushort src)
+ public void IN_Func(byte dest, byte src)
{
Regs[dest] = ReadHardware(Regs[src]);
}
- public void LR_A_IO_Func(ushort dest, ushort src)
+ public void LR_A_IO_Func(byte dest, byte src)
{
// helper method that simulates transferring DB to accumulator (as part of an IN operation)
// this sets flags accordingly
@@ -55,22 +55,22 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
FlagZ = false;
}
- public void LR_Func(ushort dest, ushort src)
+ public void LR_Func(byte dest, byte src)
{
if (dest == DB)
{
// byte storage
- Regs[dest] = (ushort)(Regs[src] & 0xFF);
+ Regs[dest] = (byte)(Regs[src] & 0xFF);
}
else if (dest == W)
{
// mask for status register
- Regs[dest] = (ushort)(Regs[src] & 0x1F);
+ Regs[dest] = (byte)(Regs[src] & 0x1F);
}
else if (dest == ISAR)
{
// mask for ISAR register
- Regs[dest] = (ushort)(Regs[src] & 0x3F);
+ Regs[dest] = (byte)(Regs[src] & 0x3F);
}
else
{
@@ -83,13 +83,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
///
///
- public void SR_Func(ushort src, ushort shift)
+ public void SR_Func(byte src, byte shift)
{
// overflow and carry unconditionally reset
FlagO = false;
FlagC = false;
- Regs[src] = (ushort)((Regs[src] >> shift) & 0xFF);
+ Regs[src] = (byte)((Regs[src] >> shift) & 0xFF);
FlagZ = Regs[src] == 0;
@@ -104,13 +104,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
///
///
- public void SL_Func(ushort src, ushort shift)
+ public void SL_Func(byte src, byte shift)
{
// overflow and carry unconditionally reset
FlagO = false;
FlagC = false;
- Regs[src] = (ushort)((Regs[src] << shift) & 0xFF);
+ Regs[src] = (byte)((Regs[src] << shift) & 0xFF);
FlagZ = Regs[src] == 0;
@@ -120,7 +120,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// ICB flag not affected
}
- public void ADD_Func(ushort dest, ushort src)
+ public void ADD_Func_(byte dest, byte src)
{
// addition of 2 signed bytes
ushort dest16 = Regs[dest];
@@ -140,16 +140,32 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
var b7c = dest16 >> 8;
FlagO = (b6c ^ b7c) != 0;
- Regs[dest] = ans;
+ Regs[dest] = (byte)ans;
}
- public void SUB_Func(ushort dest, ushort src)
+ public void ADD_Func(byte dest, byte src)
{
- Regs[ALU0] = (ushort)((Regs[src] ^ 0xff) + 1);
+ // addition of 2 signed bytes
+ var sD = Regs[dest] & 0x80;
+ var sS = Regs[src] & 0x80;
+ var res = Regs[dest] + Regs[src];
+ var sR = res & 0x80;
+
+ FlagS = !((res & 0x80) > 0);
+ FlagZ = (res & 0xff) == 0;
+ FlagO = (sD == sS && sD != sR);
+ FlagC = (res & 0x100) > 0;
+
+ Regs[dest] = (byte) (res & 0xff);
+ }
+
+ public void SUB_Func(byte dest, byte src)
+ {
+ Regs[ALU0] = (byte)((Regs[src] ^ 0xff) + 1);
ADD_Func(dest, ALU0);
}
- public void ADDD_Func(ushort dest, ushort src)
+ public void ADDD_Func(byte dest, byte src)
{
var d = Regs[dest];
var s = Regs[src];
@@ -173,7 +189,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
bcdRes = (bcdRes + 0xA0);
}
- Regs[dest] = (ushort)(bcdRes & 0xFF);
+ Regs[dest] = (byte)(bcdRes & 0xFF);
}
public void CI_Func()
@@ -182,10 +198,11 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// we need to achieve DB - A + 1
// flags set - results not stored
var comp = ((Regs[A] ^ 0xFF) + 1);
- Regs[ALU0] = (ushort)comp;
- ADD_Func(DB, ALU0);
+ Regs[ALU0] = (byte)comp;
+ Regs[ALU1] = Regs[DB];
+ ADD_Func(ALU1, ALU0);
}
-
+ /*
public void ADDD_Func_(ushort dest, ushort src)
{
// from MAME f8.cpp (BSD-3)
@@ -229,14 +246,15 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
Regs[dest] = tmp;
}
+ */
- public void AND_Func(ushort dest, ushort src)
+ public void AND_Func(byte dest, byte src)
{
// overflow and carry unconditionally reset
FlagO = false;
FlagC = false;
- Regs[dest] = (ushort)(Regs[dest] & Regs[src]);
+ Regs[dest] = (byte)(Regs[dest] & Regs[src]);
FlagZ = Regs[src] == 0;
@@ -246,13 +264,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// ICB flag not affected
}
- public void OR_Func(ushort dest, ushort src)
+ public void OR_Func(byte dest, byte src)
{
// overflow and carry unconditionally reset
FlagO = false;
FlagC = false;
- Regs[dest] = (ushort)(Regs[dest] | Regs[src]);
+ Regs[dest] = (byte)(Regs[dest] | Regs[src]);
FlagZ = Regs[src] == 0;
@@ -262,13 +280,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// ICB flag not affected
}
- public void XOR_Func(ushort dest, ushort src)
+ public void XOR_Func(byte dest, byte src)
{
// overflow and carry unconditionally reset
FlagO = false;
FlagC = false;
- Regs[dest] = (ushort)(Regs[dest] ^ Regs[src]);
+ Regs[dest] = (byte)(Regs[dest] ^ Regs[src]);
FlagZ = Regs[src] == 0;
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Registers.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Registers.cs
index b426d9d4e4..c084cc402f 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Registers.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Registers.cs
@@ -17,83 +17,83 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
/// Registers (counters and scratchpad)
///
- public ushort[] Regs = new ushort[100];
+ public byte[] Regs = new byte[100];
// scratchpad registers live in Regs 0-64
- public ushort J = 9;
- public ushort Hh = 10;
- public ushort Hl = 11;
- public ushort Kh = 12;
- public ushort Kl = 13;
- public ushort Qh = 14;
- public ushort Ql = 15;
+ public byte J = 9;
+ public byte Hh = 10;
+ public byte Hl = 11;
+ public byte Kh = 12;
+ public byte Kl = 13;
+ public byte Qh = 14;
+ public byte Ql = 15;
// Internal CPU counters kept after the scratchpad for ease of implementation
///
/// Accumulator
///
- public ushort A = 65;
+ public byte A = 65;
///
/// Status Register
///
- public ushort W = 66;
+ public byte W = 66;
///
/// Indirect Scratchpad Address Register
/// (6bit)
///
- public ushort ISAR = 67;
+ public byte ISAR = 67;
///
/// Primary Program Counter (high byte)
///
- public ushort PC0h = 68;
+ public byte PC0h = 68;
///
/// Primary Program Counter (low byte)
///
- public ushort PC0l = 69;
+ public byte PC0l = 69;
///
/// Backup Program Counter (high byte)
///
- public ushort PC1h = 70;
+ public byte PC1h = 70;
///
/// Backup Program Counter (low byte)
///
- public ushort PC1l = 71;
+ public byte PC1l = 71;
///
/// Data counter (high byte)
///
- public ushort DC0h = 72;
+ public byte DC0h = 72;
///
/// Data Counter (low byte)
///
- public ushort DC0l = 73;
+ public byte DC0l = 73;
///
/// Temporary Arithmetic Storage
///
- public ushort ALU0 = 74;
+ public byte ALU0 = 74;
///
/// Temporary Arithmetic Storage
///
- public ushort ALU1 = 75;
+ public byte ALU1 = 75;
///
/// Data Bus
///
- public ushort DB = 76;
+ public byte DB = 76;
///
/// IO Bus/Latch
///
- public ushort IO = 77;
+ public byte IO = 77;
///
/// 0x00 value for arithmetic ops
///
- public ushort ZERO = 78;
+ public byte ZERO = 78;
///
/// 0x01 value for arithmetic ops
///
- public ushort ONE = 79;
+ public byte ONE = 79;
///
/// 0xFF value for arithmetic ops
///
- public ushort BYTE = 80;
+ public byte BYTE = 80;
///
@@ -102,7 +102,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public bool FlagS
{
get { return (Regs[W] & 0x01) != 0; }
- set { Regs[W] = (ushort)((Regs[W] & ~0x01) | (value ? 0x01 : 0x00)); }
+ set { Regs[W] = (byte)((Regs[W] & ~0x01) | (value ? 0x01 : 0x00)); }
}
///
@@ -111,7 +111,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public bool FlagC
{
get { return (Regs[W] & 0x02) != 0; }
- set { Regs[W] = (ushort)((Regs[W] & ~0x02) | (value ? 0x02 : 0x00)); }
+ set { Regs[W] = (byte)((Regs[W] & ~0x02) | (value ? 0x02 : 0x00)); }
}
///
@@ -120,7 +120,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public bool FlagZ
{
get { return (Regs[W] & 0x04) != 0; }
- set { Regs[W] = (ushort)((Regs[W] & ~0x04) | (value ? 0x04 : 0x00)); }
+ set { Regs[W] = (byte)((Regs[W] & ~0x04) | (value ? 0x04 : 0x00)); }
}
///
@@ -129,7 +129,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public bool FlagO
{
get { return (Regs[W] & 0x08) != 0; }
- set { Regs[W] = (ushort)((Regs[W] & ~0x08) | (value ? 0x08 : 0x00)); }
+ set { Regs[W] = (byte)((Regs[W] & ~0x08) | (value ? 0x08 : 0x00)); }
}
///
@@ -138,7 +138,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public bool FlagICB
{
get { return (Regs[W] & 0x10) != 0; }
- set { Regs[W] = (ushort)((Regs[W] & ~0x10) | (value ? 0x10 : 0x00)); }
+ set { Regs[W] = (byte)((Regs[W] & ~0x10) | (value ? 0x10 : 0x00)); }
}
///
@@ -149,8 +149,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
get { return (ushort)(Regs[PC0l] | (Regs[PC0h] << 8)); }
set
{
- Regs[PC0l] = (ushort)(value & 0xFF);
- Regs[PC0h] = (ushort)((value >> 8) & 0xFF);
+ Regs[PC0l] = (byte)(value & 0xFF);
+ Regs[PC0h] = (byte)((value >> 8) & 0xFF);
}
}
@@ -162,8 +162,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
get { return (ushort)(Regs[PC1l] | (Regs[PC1h] << 8)); }
set
{
- Regs[PC1l] = (ushort)(value & 0xFF);
- Regs[PC1h] = (ushort)((value >> 8) & 0xFF);
+ Regs[PC1l] = (byte)(value & 0xFF);
+ Regs[PC1h] = (byte)((value >> 8) & 0xFF);
}
}
@@ -175,8 +175,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
get { return (ushort)(Regs[DC0l] | (Regs[DC0h] << 8)); }
set
{
- Regs[DC0l] = (ushort)(value & 0xFF);
- Regs[DC0h] = (ushort)((value >> 8) & 0xFF);
+ Regs[DC0l] = (byte)(value & 0xFF);
+ Regs[DC0h] = (byte)((value >> 8) & 0xFF);
}
}
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Tables.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Tables.cs
index ef80c0e7a7..8273969482 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Tables.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.Tables.cs
@@ -306,7 +306,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void SHIFT_R(ushort index)
+ private void SHIFT_R(byte index)
{
PopulateCURINSTR(
// S
@@ -316,7 +316,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void SHIFT_L(ushort index)
+ private void SHIFT_L(byte index)
{
PopulateCURINSTR(
// S
@@ -748,10 +748,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void DS(ushort rIndex)
+ private void DS(byte rIndex)
{
// only scratch registers 0-16
- rIndex = (ushort)(rIndex & 0x0F);
+ rIndex = (byte)(rIndex & 0x0F);
PopulateCURINSTR(
// L
@@ -799,10 +799,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void LR_A_R(ushort rIndex)
+ private void LR_A_R(byte rIndex)
{
// only scratch registers 0-16
- rIndex = (ushort)(rIndex & 0x0F);
+ rIndex = (byte)(rIndex & 0x0F);
PopulateCURINSTR(
// S
@@ -842,10 +842,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void LR_R_A(ushort rIndex)
+ private void LR_R_A(byte rIndex)
{
// only scratch registers 0-16
- rIndex = (ushort)(rIndex & 0x0F);
+ rIndex = (byte)(rIndex & 0x0F);
PopulateCURINSTR(
// S
@@ -885,7 +885,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void LISU(ushort octal)
+ private void LISU(byte octal)
{
PopulateCURINSTR(
// S
@@ -895,7 +895,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void LISL(ushort octal)
+ private void LISL(byte octal)
{
PopulateCURINSTR(
// S
@@ -905,7 +905,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void LIS(ushort index)
+ private void LIS(byte index)
{
PopulateCURINSTR(
// S
@@ -915,7 +915,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void BT(ushort index)
+ private void BT(byte index)
{
PopulateCURINSTR(
// S
@@ -1050,7 +1050,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
OP_BR7); // no END as there is branching logic within OP_BR7
}
- private void BF(ushort index)
+ private void BF(byte index)
{
PopulateCURINSTR(
// S
@@ -1060,7 +1060,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
OP_BF, index); // no END as there is branching logic within OP_BF
}
- private void INS_0(ushort index)
+ private void INS_0(byte index)
{
PopulateCURINSTR(
// S
@@ -1075,7 +1075,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void INS_1(ushort index)
+ private void INS_1(byte index)
{
Regs[IO] = index; // latch port index early
@@ -1101,7 +1101,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void OUTS_0(ushort index)
+ private void OUTS_0(byte index)
{
PopulateCURINSTR(
// S
@@ -1116,7 +1116,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void OUTS_1(ushort index)
+ private void OUTS_1(byte index)
{
Regs[IO] = index; // latch port index early
@@ -1142,10 +1142,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void AS(ushort rIndex)
+ private void AS(byte rIndex)
{
// only scratch registers 0-15
- rIndex = (ushort) (rIndex & 0x0F);
+ rIndex = (byte) (rIndex & 0x0F);
PopulateCURINSTR(
// S
@@ -1188,10 +1188,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void ASD(ushort rIndex)
+ private void ASD(byte rIndex)
{
// only scratch registers 0-15
- rIndex = (ushort)(rIndex & 0x0F);
+ rIndex = (byte)(rIndex & 0x0F);
PopulateCURINSTR(
// S
@@ -1251,10 +1251,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void XS(ushort rIndex)
+ private void XS(byte rIndex)
{
// only scratch registers 0-15
- rIndex = (ushort)(rIndex & 0x0F);
+ rIndex = (byte)(rIndex & 0x0F);
PopulateCURINSTR(
// S
@@ -1295,10 +1295,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
END);
}
- private void NS(ushort rIndex)
+ private void NS(byte rIndex)
{
// only scratch registers 0-15
- rIndex = (ushort)(rIndex & 0x0F);
+ rIndex = (byte)(rIndex & 0x0F);
PopulateCURINSTR(
// S
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.cs
index 3e0b240769..1532d09ba0 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/F8/F3850.cs
@@ -40,77 +40,77 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public sealed partial class F3850
{
// operations that can take place in an instruction
- public const ushort ROMC_01 = 1;
- public const ushort ROMC_02 = 2;
- public const ushort ROMC_03_S = 3;
- public const ushort ROMC_04 = 4;
- public const ushort ROMC_05 = 5;
- public const ushort ROMC_06 = 6;
- public const ushort ROMC_07 = 7;
- public const ushort ROMC_08 = 8;
- public const ushort ROMC_09 = 9;
- public const ushort ROMC_0A = 10;
- public const ushort ROMC_0B = 11;
- public const ushort ROMC_0C = 12;
- public const ushort ROMC_0D = 13;
- public const ushort ROMC_0E = 14;
- public const ushort ROMC_0F = 15;
- public const ushort ROMC_10 = 16;
- public const ushort ROMC_11 = 17;
- public const ushort ROMC_12 = 18;
- public const ushort ROMC_13 = 19;
- public const ushort ROMC_14 = 20;
- public const ushort ROMC_15 = 21;
- public const ushort ROMC_16 = 22;
- public const ushort ROMC_17 = 23;
- public const ushort ROMC_18 = 24;
- public const ushort ROMC_19 = 25;
- public const ushort ROMC_1A = 26;
- public const ushort ROMC_1B = 27;
- public const ushort ROMC_1C_S = 28;
- public const ushort ROMC_1D = 29;
- public const ushort ROMC_1E = 30;
- public const ushort ROMC_1F = 31;
- public const ushort ROMC_00_S = 32;
- public const ushort ROMC_00_L = 33;
- public const ushort ROMC_03_L = 34;
- public const ushort ROMC_1C_L = 35;
+ public const byte ROMC_01 = 1;
+ public const byte ROMC_02 = 2;
+ public const byte ROMC_03_S = 3;
+ public const byte ROMC_04 = 4;
+ public const byte ROMC_05 = 5;
+ public const byte ROMC_06 = 6;
+ public const byte ROMC_07 = 7;
+ public const byte ROMC_08 = 8;
+ public const byte ROMC_09 = 9;
+ public const byte ROMC_0A = 10;
+ public const byte ROMC_0B = 11;
+ public const byte ROMC_0C = 12;
+ public const byte ROMC_0D = 13;
+ public const byte ROMC_0E = 14;
+ public const byte ROMC_0F = 15;
+ public const byte ROMC_10 = 16;
+ public const byte ROMC_11 = 17;
+ public const byte ROMC_12 = 18;
+ public const byte ROMC_13 = 19;
+ public const byte ROMC_14 = 20;
+ public const byte ROMC_15 = 21;
+ public const byte ROMC_16 = 22;
+ public const byte ROMC_17 = 23;
+ public const byte ROMC_18 = 24;
+ public const byte ROMC_19 = 25;
+ public const byte ROMC_1A = 26;
+ public const byte ROMC_1B = 27;
+ public const byte ROMC_1C_S = 28;
+ public const byte ROMC_1D = 29;
+ public const byte ROMC_1E = 30;
+ public const byte ROMC_1F = 31;
+ public const byte ROMC_00_S = 32;
+ public const byte ROMC_00_L = 33;
+ public const byte ROMC_03_L = 34;
+ public const byte ROMC_1C_L = 35;
- public const ushort IDLE = 0;
- public const ushort END = 51;
+ public const byte IDLE = 0;
+ public const byte END = 51;
- public const ushort OP_LR8 = 100;
- public const ushort OP_SHFT_R = 101;
- public const ushort OP_SHFT_L = 102;
- public const ushort OP_LNK = 103;
- public const ushort OP_DI = 104;
- public const ushort OP_EI = 105;
- public const ushort OP_INC8 = 106;
- public const ushort OP_AND8 = 107;
- public const ushort OP_OR8 = 108;
- public const ushort OP_XOR8 = 109;
- //public const ushort OP_COM = 110;
- public const ushort OP_SUB8 = 110;
- public const ushort OP_ADD8 = 111;
- public const ushort OP_CI = 112;
- public const ushort OP_IS_INC = 113;
- public const ushort OP_IS_DEC = 114;
- public const ushort OP_LISU = 115;
- public const ushort OP_LISL = 116;
- public const ushort OP_BT = 117;
- public const ushort OP_ADD8D = 118;
- public const ushort OP_BR7 = 119;
- public const ushort OP_BF = 120;
- public const ushort OP_IN = 121;
- public const ushort OP_OUT = 122;
- //public const ushort OP_AS_IS = 123;
- //public const ushort OP_XS_IS = 124;
- //public const ushort OP_NS_IS = 125;
- public const ushort OP_LR_A_DB_IO = 126;
- public const ushort OP_DS = 127;
- //public const ushort OP_CLEAR_FLAGS = 126;
- //public const ushort OP_SET_FLAGS_SZ = 127;
- public const ushort OP_LIS = 128;
+ public const byte OP_LR8 = 100;
+ public const byte OP_SHFT_R = 101;
+ public const byte OP_SHFT_L = 102;
+ public const byte OP_LNK = 103;
+ public const byte OP_DI = 104;
+ public const byte OP_EI = 105;
+ public const byte OP_INC8 = 106;
+ public const byte OP_AND8 = 107;
+ public const byte OP_OR8 = 108;
+ public const byte OP_XOR8 = 109;
+ //public const byte OP_COM = 110;
+ public const byte OP_SUB8 = 110;
+ public const byte OP_ADD8 = 111;
+ public const byte OP_CI = 112;
+ public const byte OP_IS_INC = 113;
+ public const byte OP_IS_DEC = 114;
+ public const byte OP_LISU = 115;
+ public const byte OP_LISL = 116;
+ public const byte OP_BT = 117;
+ public const byte OP_ADD8D = 118;
+ public const byte OP_BR7 = 119;
+ public const byte OP_BF = 120;
+ public const byte OP_IN = 121;
+ public const byte OP_OUT = 122;
+ //public const byte OP_AS_IS = 123;
+ //public const byte OP_XS_IS = 124;
+ //public const byte OP_NS_IS = 125;
+ public const byte OP_LR_A_DB_IO = 126;
+ public const byte OP_DS = 127;
+ //public const byte OP_CLEAR_FLAGS = 126;
+ //public const byte OP_SET_FLAGS_SZ = 127;
+ public const byte OP_LIS = 128;
public F3850()
@@ -208,7 +208,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// loads supplied index value into register
case OP_LIS:
- Regs[ALU1] = (ushort)(cur_instr[instr_pntr++] & 0x0F);
+ Regs[ALU1] = (byte)(cur_instr[instr_pntr++] & 0x0F);
LR_Func(A, ALU1);
break;
@@ -239,7 +239,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// A <- (A) + (C)
case OP_LNK:
- Regs[ALU0] = (ushort)(FlagC ? 1 : 0);
+ Regs[ALU0] = (byte)(FlagC ? 1 : 0);
ADD_Func(A, ALU0);
break;
@@ -280,22 +280,22 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// ISAR is incremented
case OP_IS_INC:
- Regs[ISAR] = (ushort)((Regs[ISAR]& 0x38) | ((Regs[ISAR] + 1) & 0x07));
+ Regs[ISAR] = (byte)((Regs[ISAR]& 0x38) | ((Regs[ISAR] + 1) & 0x07));
break;
// ISAR is decremented
case OP_IS_DEC:
- Regs[ISAR] = (ushort)((Regs[ISAR] & 0x38) | ((Regs[ISAR] - 1) & 0x07));
+ Regs[ISAR] = (byte)((Regs[ISAR] & 0x38) | ((Regs[ISAR] - 1) & 0x07));
break;
// set the upper octal ISAR bits (b3,b4,b5)
case OP_LISU:
- Regs[ISAR] = (ushort)((((Regs[ISAR] & 0x07) | (cur_instr[instr_pntr++] & 0x07) << 3)) & 0x3F);
+ Regs[ISAR] = (byte)((((Regs[ISAR] & 0x07) | (cur_instr[instr_pntr++] & 0x07) << 3)) & 0x3F);
break;
// set the lower octal ISAR bits (b0,b1,b2)
case OP_LISL:
- Regs[ISAR] = (ushort) (((Regs[ISAR] & 0x38) | (cur_instr[instr_pntr++] & 0x07)) & 0x3F);
+ Regs[ISAR] = (byte) (((Regs[ISAR] & 0x38) | (cur_instr[instr_pntr++] & 0x07)) & 0x3F);
break;
// decrement scratchpad byte
@@ -333,8 +333,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
break;
case 5:
- // branch if positive (same as t==1)
- if (FlagS) branchBT = true;
+ // branch if positive and zero
+ if (FlagS || FlagZ) branchBT = true;
break;
case 6:
@@ -342,8 +342,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
if (FlagZ || FlagC) branchBT = true;
break;
case 7:
- // branch if positive or on carry (same as t==3)
- if (FlagS || FlagC) branchBT = true;
+ // branch if positive or on carry or zero
+ if (FlagS || FlagC || FlagZ) branchBT = true;
break;
}
@@ -355,13 +355,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// Branch on ISARL
case OP_BR7:
instr_pntr = 1; // lose a cycle
- if (!Regs[ISAR].Bit(0) || !Regs[ISAR].Bit(1) || !Regs[ISAR].Bit(2))
+ if (Regs[ISAR].Bit(0) && Regs[ISAR].Bit(1) && Regs[ISAR].Bit(2))
{
- DO_BRANCH();
+ DONT_BRANCH();
}
else
{
- DONT_BRANCH();
+ DO_BRANCH();
}
break;
@@ -396,8 +396,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
break;
case 5:
- // same as t==1
- if (!FlagS) branchBF = true;
+ // branch if not zero and negative
+ if (!FlagS && !FlagZ) branchBF = true;
break;
case 6:
@@ -406,8 +406,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
break;
case 7:
- // same as t==3
- if (!FlagS && !FlagC) branchBF = true;
+ // branch if not zero, carry and sign
+ if (!FlagS && !FlagC && !FlagZ) branchBF = true;
break;
case 8:
@@ -436,8 +436,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
break;
case 0xD:
- // same as t==9
- if (!FlagS && !FlagO) branchBF = true;
+ // branch if no overflow, not zero and neg
+ if (!FlagS && !FlagO && !FlagZ) branchBF = true;
break;
case 0xE:
@@ -446,8 +446,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
break;
case 0xF:
- // same as t=0xB
- if (!FlagO && !FlagC && !FlagS) branchBF = true;
+ // all neg
+ if (!FlagO && !FlagC && !FlagS && FlagZ) branchBF = true;
break;
}
@@ -461,13 +461,11 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
instr_pntr++; // dest == A
Regs[ALU0] = cur_instr[instr_pntr++]; // src
IN_Func(A, ALU0);
- //Regs[cur_instr[instr_pntr++]] = ReadHardware(cur_instr[instr_pntr++]);
break;
// I/O Port 0 or 1 <- (A)
case OP_OUT:
- WriteHardware(cur_instr[instr_pntr++], (byte)cur_instr[instr_pntr++]);
- //OUT_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
+ WriteHardware(cur_instr[instr_pntr++], (byte)Regs[cur_instr[instr_pntr++]]);
break;
// instruction fetch
@@ -779,10 +777,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
/// Optimization method to set cur_instr
///
- private void PopulateCURINSTR(ushort d0 = 0, ushort d1 = 0, ushort d2 = 0, ushort d3 = 0, ushort d4 = 0, ushort d5 = 0, ushort d6 = 0, ushort d7 = 0, ushort d8 = 0,
- ushort d9 = 0, ushort d10 = 0, ushort d11 = 0, ushort d12 = 0, ushort d13 = 0, ushort d14 = 0, ushort d15 = 0, ushort d16 = 0, ushort d17 = 0, ushort d18 = 0,
- ushort d19 = 0, ushort d20 = 0, ushort d21 = 0, ushort d22 = 0, ushort d23 = 0, ushort d24 = 0, ushort d25 = 0, ushort d26 = 0, ushort d27 = 0, ushort d28 = 0,
- ushort d29 = 0, ushort d30 = 0, ushort d31 = 0, ushort d32 = 0, ushort d33 = 0, ushort d34 = 0, ushort d35 = 0, ushort d36 = 0, ushort d37 = 0)
+ private void PopulateCURINSTR(byte d0 = 0, byte d1 = 0, byte d2 = 0, byte d3 = 0, byte d4 = 0, byte d5 = 0, byte d6 = 0, byte d7 = 0, byte d8 = 0,
+ byte d9 = 0, byte d10 = 0, byte d11 = 0, byte d12 = 0, byte d13 = 0, byte d14 = 0, byte d15 = 0, byte d16 = 0, byte d17 = 0, byte d18 = 0,
+ byte d19 = 0, byte d20 = 0, byte d21 = 0, byte d22 = 0, byte d23 = 0, byte d24 = 0, byte d25 = 0, byte d26 = 0, byte d27 = 0, byte d28 = 0,
+ byte d29 = 0, byte d30 = 0, byte d31 = 0, byte d32 = 0, byte d33 = 0, byte d34 = 0, byte d35 = 0, byte d36 = 0, byte d37 = 0)
{
cur_instr[0] = d0; cur_instr[1] = d1; cur_instr[2] = d2;
cur_instr[3] = d3; cur_instr[4] = d4; cur_instr[5] = d5;
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Memory.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Memory.cs
index 6cf6ced0ca..41fbd55593 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Memory.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Memory.cs
@@ -34,7 +34,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
else if (addr < 0x2000)
{
// Cart
- return 0;
+ //return 0;
return Rom[addr - 0x800];
}
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs
index 079f952168..acf9373e9e 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs
@@ -35,9 +35,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
public byte ReadPort(ushort addr)
{
- byte port = (byte) (addr & 0x07);
-
- switch (port)
+ switch (addr)
{
// Console buttons
// b0: TIME
@@ -45,7 +43,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// b2: HOLD
// b3: START
case 0:
- return (byte)((DataConsole ^ 0xFF) & 0x0F);
+ return (byte)((DataConsole ^ 0xff) | PortLatch[PORT0]);
// Right controller
// b0: RIGHT
@@ -57,11 +55,16 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// b6: PULL
// b7: PUSH
case 1:
- if (ControllersEnabled)
+ byte ed1;
+ if ((PortLatch[PORT0] & 0x40) == 0)
{
- return (byte)((DataRight ^ 0xFF) & 0xFF);
+ ed1 = DataRight;
}
- return 0;
+ else
+ {
+ ed1 = (byte) (0xC0 | DataRight);
+ }
+ return (byte) ((ed1 ^ 0xff) | PortLatch[PORT1]);
// Left controller
// b0: RIGHT
@@ -73,14 +76,23 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// b6: PULL
// b7: PUSH
case 4:
- if (ControllersEnabled)
+ byte ed4;
+ if ((PortLatch[PORT0] & 0x40) == 0)
{
- return (byte)((DataLeft ^ 0xFF) & 0xFF);
+ ed4 = DataLeft;
}
+ else
+ {
+ ed4 = 0xff;
+ }
+ return (byte)((ed4 ^ 0xff) | PortLatch[PORT4]);
+
+ case 5:
+ return (byte) (0 | PortLatch[PORT5]);
+
+ default:
return 0;
}
-
- return 0xFF;
}
///
@@ -90,97 +102,70 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
public void WritePort(ushort addr, byte value)
{
- byte port = (byte)(addr & 0x07);
-
- switch (port)
+ switch (addr)
{
case 0:
-
- ControllersEnabled = (value & 0x40) == 0;
-
- var val = value & 0x60;
- if (val == 0x40)// && _arm == 0x60)
- {
- VRAM[(128 * _y) + _x] = (byte)_colour;
- }
-
- /*
-
- // RAM WRT - A pulse here executes a write to video RAM
- bool ramWrt = value.Bit(5);
-
- // Enable data from controllers (1 equals enable)
- // also needs pulse to write to video RAM
- bool controllerDataEnable = value.Bit(6);
-
- if (ramWrt || controllerDataEnable)
- {
- // triggered write to VRAM
- var yxIndex = (_y * 128) + _x;
- var byteIndex = yxIndex / 4;
- var byteRem = yxIndex % 4;
-
- switch (byteRem)
- {
- case 0:
- VRAM[byteIndex] |= (byte) _colour;
- break;
- case 1:
- VRAM[byteIndex] |= (byte) (_colour << 2);
- break;
- case 2:
- VRAM[byteIndex] |= (byte)(_colour << 4);
- break;
- case 3:
- VRAM[byteIndex] |= (byte)(_colour << 6);
- break;
- }
-
- }
- */
-
- _arm = value;
-
PortLatch[PORT0] = value;
-
+ if ((value & 0x20) != 0)
+ {
+ var offset = _x + (_y * 128);
+ VRAM[offset] = (byte)(_colour);
+ }
break;
case 1:
+ PortLatch[PORT1] = value;
+
// Write Data0 - indicates that valid data is present for both VRAM ODD0 and EVEN0
bool data0 = value.Bit(6);
// Write Data1 - indicates that valid data is present for both VRAM ODD1 and EVEN1
bool data1 = value.Bit(7);
- _colour = ((value ^ 0xff) >> 6) & 0x03;
-
- PortLatch[PORT1] = value;
-
+ //_colour = ((value) >> 6) & 3;
+ _colour = ((value ^ 0xff) >> 6) & 0x3;
break;
case 4:
+ PortLatch[PORT4] = value;
+ _x = (value ^ 0xff) & 0x7f;
+ //_x = (value | 0x80) ^ 0xFF;
+ /*
// video horizontal position
// 0 - video select
// 1-6 - horiz A-F
- _x = (value ^ 0xff) & 0x7f;
+
- PortLatch[PORT4] = value;
+ */
break;
case 5:
+ PortLatch[PORT5] = value;
+ //_y = (value & 31); // ^ 0xff;
+ //_y = (value | 0xC0) ^ 0xff;
+
+ //_y = (value ^ 0xff) & 0x1f;
+
// video vertical position and sound
// 0-5 - Vertical A-F
// 6 - Tone AN, 7 - Tone BN
_y = (value ^ 0xff) & 0x3f;
- PortLatch[PORT5] = value;
-
+ // audio
+ var aVal = ((value >> 6) & 0x03); // (value & 0xc0) >> 6;
+ if (aVal != tone)
+ {
+ tone = aVal;
+ time = 0;
+ amplitude = 1;
+ AudioChange();
+ }
break;
}
}
diff --git a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Video.cs b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Video.cs
index 864e228c2a..9c26fec92f 100644
--- a/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Video.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Video.cs
@@ -1,4 +1,5 @@
using System;
+using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -20,6 +21,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public static readonly int[] FPalette =
{
+ /*
+ 0x101010, 0xFDFDFD, 0x5331FF, 0x5DCC02, 0xF33F4B, 0xE0E0E0, 0xA6FF91, 0xD0CEFF
+ */
+
Colors.ARGB(0x10, 0x10, 0x10), // Black
Colors.ARGB(0xFD, 0xFD, 0xFD), // White
Colors.ARGB(0xFF, 0x31, 0x53), // Red
@@ -28,6 +33,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
Colors.ARGB(0xE0, 0xE0, 0xE0), // Gray
Colors.ARGB(0x91, 0xFF, 0xA6), // BGreen
Colors.ARGB(0xCE, 0xD0, 0xFF), // BBlue
+
};
public static readonly int[] CMap =
@@ -52,67 +58,21 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
for (int row = 0; row < 64; row++)
{
// columns 125 and 126 hold the palette index modifier for the entire row
- var rIndex = 64 * row;
- var c125 = (VRAM[rIndex + 125] & 0x02) >> 1;
+ var rIndex = 128 * row;
+ var c125 = (VRAM[rIndex + 125] & 0x03);
var c126 = (VRAM[rIndex + 126] & 0x03);
- var pModifier = ((c125 | c126) << 2) & 0x0C;
+ var pModifier = (((c126 & 0x02) | c125 >> 1) << 2);
+
+ pModifier = ((VRAM[(row << 7) + 125] & 2) >> 1) | (VRAM[(row << 7) + 126] & 3);
+ pModifier = (pModifier << 2) & 0xc;
// columns
for (int col = 0; col < 128; col++, counter++)
{
- int colour = (VRAM[rIndex + col]) & 0x03;
- var finalColorIndex = pModifier | colour;
- var paletteLookup = CMap[finalColorIndex & 0x0f] & 0x07;
- frameBuffer[counter] = FPalette[paletteLookup];
- }
- }
- }
-
- private void BuildFrame1()
- {
- int cnt = 0;
- // rows
- for (int row = 0; row < 64; row++)
- {
- var yIndex = row * 128;
- var yByte = yIndex / 4;
-
- // last byte for this row contains palette modifier
- var pModifier = (byte)(VRAM[yByte + 31] & 0x0C);
-
- // columns
- for (int col = 0; col < 128; col++)
- {
- var fbIndex = (row * 64) + col;
-
- var xByte = col / 4;
- var xRem = col % 4;
- var xyByte = yByte + xByte;
-
- // each byte contains 4 pixel colour values, b0b1, b2b3, b4b5, b6b7
- int colour = 0;
-
- switch (xRem)
- {
- case 0:
- colour = VRAM[xyByte] & 0x03;
- break;
- case 1:
- colour = VRAM[xyByte] & 0x0C;
- break;
- case 2:
- colour = VRAM[xyByte] & 0x30;
- break;
- case 3:
- colour = VRAM[xyByte] & 0xC0;
- break;
- }
-
- var finalColorIndex = pModifier | colour;
- var paletteLookup = CMap[finalColorIndex & 0x0f] & 0x07;
- frameBuffer[fbIndex] = FPalette[paletteLookup];
-
- cnt++;
+ int cl = (VRAM[(row << 7) + col]) & 0x3;
+ frameBuffer[(row << 7) + col] = CMap[pModifier | cl] & 0x7;
+ //var nCol = pModifier + (VRAM[col | (row << 7)] & 0x03);
+ //frameBuffer[counter] = FPalette[CMap[nCol]];
}
}
}