diff --git a/EightBit/Chip.cs b/EightBit/Chip.cs
index fce5d3e..5e13b11 100644
--- a/EightBit/Chip.cs
+++ b/EightBit/Chip.cs
@@ -4,22 +4,13 @@
{
protected Chip() { }
- public static void ClearFlag(ref byte f, byte flag) => f &= (byte)~flag;
- public static void SetFlag(ref byte f, byte flag) => f |= flag;
+ public static byte SetFlag(byte input, byte flag) => (byte)(input | flag);
+ public static byte SetFlag(byte input, byte flag, int condition) => SetFlag(input, flag, condition != 0);
+ public static byte SetFlag(byte input, byte flag, bool condition) => condition ? SetFlag(input, flag) : ClearFlag(input, flag);
- public static void SetFlag(ref byte f, byte flag, int condition) => SetFlag(ref f, flag, condition != 0);
-
- public static void SetFlag(ref byte f, byte flag, bool condition)
- {
- if (condition)
- SetFlag(ref f, flag);
- else
- ClearFlag(ref f, flag);
- }
-
- public static void ClearFlag(ref byte f, byte flag, int condition) => ClearFlag(ref f, flag, condition != 0);
-
- public static void ClearFlag(ref byte f, byte flag, bool condition) => SetFlag(ref f, flag, !condition);
+ public static byte ClearFlag(byte input, byte flag) => (byte)(input & (byte)~flag);
+ public static byte ClearFlag(byte input, byte flag, int condition) => ClearFlag(input, flag, condition != 0);
+ public static byte ClearFlag(byte input, byte flag, bool condition) => SetFlag(input, flag, !condition);
public static byte HighByte(int value) => (byte)(value >> 8);
public static byte HighByte(ushort value) => HighByte((int)value);
diff --git a/EightBit/EightBit.csproj b/EightBit/EightBit.csproj
index c96aecf..7682ff9 100644
--- a/EightBit/EightBit.csproj
+++ b/EightBit/EightBit.csproj
@@ -32,6 +32,7 @@
prompt
4
latest
+ AllRules.ruleset
true
diff --git a/M6502/M6502.cs b/M6502/M6502.cs
index e064181..d8ca2bd 100644
--- a/M6502/M6502.cs
+++ b/M6502/M6502.cs
@@ -54,10 +54,10 @@
public event EventHandler LoweredRDY;
public byte X { get => x; set => x = value; }
- public byte Y { get => y; set { y = value; } }
- public byte A { get => a; set { a = value; } }
- public byte S { get => s; set { s = value; } }
- public byte P { get => p; set { p = value; } }
+ public byte Y { get => y; set => y = value; }
+ public byte A { get => a; set => a = value; }
+ public byte S { get => s; set => s = value; }
+ public byte P { get => p; set => p = value; }
private int InterruptMasked => P & (byte)StatusBits.IF;
private int Decimal => P & (byte)StatusBits.DF;
@@ -196,7 +196,7 @@
case 0x15: A = OrR(A, AM_ZeroPageX()); break; // ORA (zero page, X)
case 0x16: BusReadModifyWrite(ASL(AM_ZeroPageX())); break; // ASL (zero page, X)
case 0x17: SLO(AM_ZeroPageX()); break; // *SLO (zero page, X)
- case 0x18: BusRead(); ClearFlag(ref p, StatusBits.CF); break; // CLC (implied)
+ case 0x18: BusRead(); P = ClearFlag(P, StatusBits.CF); break; // CLC (implied)
case 0x19: A = OrR(A, AM_AbsoluteY()); break; // ORA (absolute, Y)
case 0x1a: BusRead(); break; // *NOP (implied)
case 0x1b: SLO(AM_AbsoluteY()); break; // *SLO (absolute, Y)
@@ -230,7 +230,7 @@
case 0x35: A = AndR(A, AM_ZeroPageX()); break; // AND (zero page, X)
case 0x36: BusReadModifyWrite(ROL(AM_ZeroPageX())); break; // ROL (zero page, X)
case 0x37: RLA(AM_ZeroPageX()); break; // *RLA (zero page, X)
- case 0x38: BusRead(); SetFlag(ref p, StatusBits.CF); break; // SEC (implied)
+ case 0x38: BusRead(); P = SetFlag(P, StatusBits.CF); break; // SEC (implied)
case 0x39: A = AndR(A, AM_AbsoluteY()); break; // AND (absolute, Y)
case 0x3a: BusRead(); break; // *NOP (implied)
case 0x3b: RLA(AM_AbsoluteY()); break; // *RLA (absolute, Y)
@@ -264,7 +264,7 @@
case 0x55: A = EorR(A, AM_ZeroPageX()); break; // EOR (zero page, X)
case 0x56: BusReadModifyWrite(LSR(AM_ZeroPageX())); break; // LSR (zero page, X)
case 0x57: SRE(AM_ZeroPageX()); break; // *SRE (zero page, X)
- case 0x58: BusRead(); ClearFlag(ref p, StatusBits.IF); break; // CLI (implied)
+ case 0x58: BusRead(); P = ClearFlag(P, StatusBits.IF); break; // CLI (implied)
case 0x59: A = EorR(A, AM_AbsoluteY()); break; // EOR (absolute, Y)
case 0x5a: BusRead(); break; // *NOP (implied)
case 0x5b: SRE(AM_AbsoluteY()); break; // *SRE (absolute, Y)
@@ -298,7 +298,7 @@
case 0x75: A = ADC(A, AM_ZeroPageX()); break; // ADC (zero page, X)
case 0x76: BusReadModifyWrite(ROR(AM_ZeroPageX())); break; // ROR (zero page, X)
case 0x77: RRA(AM_ZeroPageX()); break; // *RRA (zero page, X)
- case 0x78: BusRead(); SetFlag(ref p, StatusBits.IF); break; // SEI (implied)
+ case 0x78: BusRead(); P = SetFlag(P, StatusBits.IF); break; // SEI (implied)
case 0x79: A = ADC(A, AM_AbsoluteY()); break; // ADC (absolute, Y)
case 0x7a: BusRead(); break; // *NOP (implied)
case 0x7b: RRA(AM_AbsoluteY()); break; // *RRA (absolute, Y)
@@ -366,7 +366,7 @@
case 0xb5: A = Through(AM_ZeroPageX()); break; // LDA (zero page, X)
case 0xb6: X = Through(AM_ZeroPageY()); break; // LDX (zero page, Y)
case 0xb7: A = X = Through(AM_ZeroPageY()); break; // *LAX (zero page, Y)
- case 0xb8: BusRead(); ClearFlag(ref p, StatusBits.VF); break; // CLV (implied)
+ case 0xb8: BusRead(); P = ClearFlag(P, StatusBits.VF); break; // CLV (implied)
case 0xb9: A = Through(AM_AbsoluteY()); break; // LDA (absolute, Y)
case 0xba: BusRead(); X = Through(S); break; // TSX (implied)
case 0xbb: break;
@@ -400,7 +400,7 @@
case 0xd5: CMP(A, AM_ZeroPageX()); break; // CMP (zero page, X)
case 0xd6: BusReadModifyWrite(DEC(AM_ZeroPageX())); break; // DEC (zero page, X)
case 0xd7: DCP(AM_ZeroPageX()); break; // *DCP (zero page, X)
- case 0xd8: BusRead(); ClearFlag(ref p, StatusBits.DF); break; // CLD (implied)
+ case 0xd8: BusRead(); P = ClearFlag(P, StatusBits.DF); break; // CLD (implied)
case 0xd9: CMP(A, AM_AbsoluteY()); break; // CMP (absolute, Y)
case 0xda: BusRead(); break; // *NOP (implied)
case 0xdb: DCP(AM_AbsoluteY()); break; // *DCP (absolute, Y)
@@ -433,7 +433,7 @@
case 0xf5: A = SBC(A, AM_ZeroPageX()); break; // SBC (zero page, X)
case 0xf6: BusReadModifyWrite(INC(AM_ZeroPageX())); break; // INC (zero page, X)
case 0xf7: ISB(AM_ZeroPageX()); break; // *ISB (zero page, X)
- case 0xf8: BusRead(); SetFlag(ref p, StatusBits.DF); break; // SED (implied)
+ case 0xf8: BusRead(); P = SetFlag(P, StatusBits.DF); break; // SED (implied)
case 0xf9: A = SBC(A, AM_AbsoluteY()); break; // SBC (absolute, Y)
case 0xfa: BusRead(); break; // *NOP (implied)
case 0xfb: ISB(AM_AbsoluteY()); break; // *ISB (absolute, Y)
@@ -521,7 +521,7 @@
PushWord(PC);
Push((byte)(P | (int)(software ? StatusBits.BF : 0)));
}
- SetFlag(ref p, StatusBits.IF); // Disable IRQ
+ P = SetFlag(P, StatusBits.IF); // Disable IRQ
var vector = reset ? RSTvector : (nmi ? NMIvector : IRQvector);
Jump(GetWordPaged(0xff, vector));
handlingRESET = handlingNMI = handlingINT = false;
@@ -644,15 +644,15 @@
// Flag adjustment
- public static void SetFlag(ref byte f, StatusBits flag) => SetFlag(ref f, (byte)flag);
- private static void SetFlag(ref byte f, StatusBits flag, int condition) => SetFlag(ref f, (byte)flag, condition);
- private static void SetFlag(ref byte f, StatusBits flag, bool condition) => SetFlag(ref f, (byte)flag, condition);
- public static void ClearFlag(ref byte f, StatusBits flag) => ClearFlag(ref f, (byte)flag);
- private static void ClearFlag(ref byte f, StatusBits flag, int condition) => ClearFlag(ref f, (byte)flag, condition);
- private static void ClearFlag(ref byte f, StatusBits flag, bool condition) => ClearFlag(ref f, (byte)flag, condition);
+ public static byte SetFlag(byte f, StatusBits flag) => SetFlag(f, (byte)flag);
+ private static byte SetFlag(byte f, StatusBits flag, int condition) => SetFlag(f, (byte)flag, condition);
+ private static byte SetFlag(byte f, StatusBits flag, bool condition) => SetFlag(f, (byte)flag, condition);
+ public static byte ClearFlag(byte f, StatusBits flag) => ClearFlag(f, (byte)flag);
+ private static byte ClearFlag(byte f, StatusBits flag, int condition) => ClearFlag(f, (byte)flag, condition);
+ private static byte ClearFlag(byte f, StatusBits flag, bool condition) => ClearFlag(f, (byte)flag, condition);
- private void AdjustZero(byte datum) => ClearFlag(ref p, StatusBits.ZF, datum);
- private void AdjustNegative(byte datum) => SetFlag(ref p, StatusBits.NF, datum & (byte)StatusBits.NF);
+ private void AdjustZero(byte datum) => P = ClearFlag(P, StatusBits.ZF, datum);
+ private void AdjustNegative(byte datum) => P = SetFlag(P, StatusBits.NF, datum & (byte)StatusBits.NF);
private void AdjustNZ(byte datum)
{
@@ -697,8 +697,8 @@
var difference = intermediate;
AdjustNZ(LowByte(difference));
- SetFlag(ref p, StatusBits.VF, (operand ^ data) & (operand ^ LowByte(difference)) & (int)StatusBits.NF);
- ClearFlag(ref p, StatusBits.CF, HighByte(difference));
+ P = SetFlag(P, StatusBits.VF, (operand ^ data) & (operand ^ LowByte(difference)) & (int)StatusBits.NF);
+ P = ClearFlag(P, StatusBits.CF, HighByte(difference));
return returned;
}
@@ -747,8 +747,8 @@
{
intermediate = (ushort)(operand + data + carry);
- SetFlag(ref p, StatusBits.VF, ~(operand ^ data) & (operand ^ LowByte(intermediate)) & (int)StatusBits.NF);
- SetFlag(ref p, StatusBits.CF, HighByte(intermediate) & (int)StatusBits.CF);
+ P = SetFlag(P, StatusBits.VF, ~(operand ^ data) & (operand ^ LowByte(intermediate)) & (int)StatusBits.NF);
+ P = SetFlag(P, StatusBits.CF, HighByte(intermediate) & (int)StatusBits.CF);
return LowByte(intermediate);
}
@@ -762,12 +762,12 @@
low += 6;
byte high = (byte)(HighNibble(operand) + HighNibble(data) + (low > 0xf ? 1 : 0));
- SetFlag(ref p, StatusBits.VF, ~(operand ^ data) & (operand ^ PromoteNibble(high)) & (int)StatusBits.NF);
+ P = SetFlag(P, StatusBits.VF, ~(operand ^ data) & (operand ^ PromoteNibble(high)) & (int)StatusBits.NF);
if (high > 9)
high += 6;
- SetFlag(ref p, StatusBits.CF, high > 0xf);
+ P = SetFlag(P, StatusBits.CF, high > 0xf);
return (byte)(PromoteNibble(high) | LowNibble(low));
}
@@ -776,13 +776,13 @@
private byte ASL(byte value)
{
- SetFlag(ref p, StatusBits.CF, value & (byte)Bits.Bit7);
+ P = SetFlag(P, StatusBits.CF, value & (byte)Bits.Bit7);
return Through(value << 1);
}
private void BIT(byte operand, byte data)
{
- SetFlag(ref p, StatusBits.VF, data & (byte)StatusBits.VF);
+ P = SetFlag(P, StatusBits.VF, data & (byte)StatusBits.VF);
AdjustZero((byte)(operand & data));
AdjustNegative(data);
}
@@ -791,7 +791,7 @@
{
intermediate = (ushort)(first - second);
AdjustNZ(LowByte(intermediate));
- ClearFlag(ref p, StatusBits.CF, HighByte(intermediate));
+ P = ClearFlag(P, StatusBits.CF, HighByte(intermediate));
}
private byte DEC(byte value) => Through(value - 1);
@@ -810,7 +810,7 @@
private byte LSR(byte value)
{
- SetFlag(ref p, StatusBits.CF, value & (byte)Bits.Bit0);
+ P = SetFlag(P, StatusBits.CF, value & (byte)Bits.Bit0);
return Through(value >> 1);
}
@@ -823,7 +823,7 @@
private byte ROL(byte operand)
{
var carryIn = Carry;
- SetFlag(ref p, StatusBits.CF, operand & (byte)Bits.Bit7);
+ P = SetFlag(P, StatusBits.CF, operand & (byte)Bits.Bit7);
var result = (operand << 1) | carryIn;
return Through(result);
}
@@ -831,7 +831,7 @@
private byte ROR(byte operand)
{
var carryIn = Carry;
- SetFlag(ref p, StatusBits.CF, operand & (byte)Bits.Bit0);
+ P = SetFlag(P, StatusBits.CF, operand & (byte)Bits.Bit0);
var result = (operand >> 1) | (carryIn << 7);
return Through(result);
}
@@ -855,15 +855,15 @@
private void ANC(byte value)
{
A = AndR(A, value);
- SetFlag(ref p, StatusBits.CF, A & (byte)Bits.Bit7);
+ P = SetFlag(P, StatusBits.CF, A & (byte)Bits.Bit7);
}
private void ARR(byte value)
{
A = AndR(A, value);
A = ROR(A);
- SetFlag(ref p, StatusBits.CF, A & (byte)Bits.Bit6);
- SetFlag(ref p, StatusBits.VF, ((A & (byte)Bits.Bit6) >> 6) ^ ((A & (byte)Bits.Bit5) >> 5));
+ P = SetFlag(P, StatusBits.CF, A & (byte)Bits.Bit6);
+ P = SetFlag(P, StatusBits.VF, ((A & (byte)Bits.Bit6) >> 6) ^ ((A & (byte)Bits.Bit5) >> 5));
}
private void ASR(byte value)
@@ -875,7 +875,7 @@
private void AXS(byte value)
{
X = Through(SUB((byte)(A & X), value));
- ClearFlag(ref p, StatusBits.CF, HighByte(intermediate));
+ P = ClearFlag(P, StatusBits.CF, HighByte(intermediate));
}
private void DCP(byte value)
diff --git a/M6502/M6502.csproj b/M6502/M6502.csproj
index f865a1c..a50129e 100644
--- a/M6502/M6502.csproj
+++ b/M6502/M6502.csproj
@@ -32,6 +32,7 @@
prompt
4
latest
+ AllRules.ruleset
diff --git a/Test_M6502/Program.cs b/Test_M6502/Program.cs
index b0ce5c6..d47195d 100644
--- a/Test_M6502/Program.cs
+++ b/Test_M6502/Program.cs
@@ -6,7 +6,7 @@
{
var configuration = new Configuration();
- configuration.DebugMode = true;
+ //configuration.DebugMode = true;
var harness = new TestHarness(configuration);
harness.Run();
diff --git a/Test_M6502/Test_M6502.csproj b/Test_M6502/Test_M6502.csproj
index 9fe2ea1..1f9c84f 100644
--- a/Test_M6502/Test_M6502.csproj
+++ b/Test_M6502/Test_M6502.csproj
@@ -23,6 +23,7 @@
prompt
4
latest
+ AllRules.ruleset
AnyCPU
@@ -32,6 +33,7 @@
TRACE
prompt
4
+ AllRules.ruleset
diff --git a/UnitTestEightBit/ChipUnitTest.cs b/UnitTestEightBit/ChipUnitTest.cs
index 909797a..f323142 100644
--- a/UnitTestEightBit/ChipUnitTest.cs
+++ b/UnitTestEightBit/ChipUnitTest.cs
@@ -36,7 +36,7 @@
public void TestClearFlag()
{
byte flags = 0xff;
- EightBit.Chip.ClearFlag(ref flags, 0x80);
+ flags = Chip.ClearFlag(flags, 0x80);
Assert.AreEqual(0x7f, flags);
}
@@ -44,7 +44,7 @@
public void TestClearFlagNonZero()
{
byte flags = 0xff;
- EightBit.Chip.ClearFlag(ref flags, 0x80, 1);
+ flags = Chip.ClearFlag(flags, 0x80, 1);
Assert.AreEqual(0x7f, flags);
}
@@ -52,7 +52,7 @@
public void TestClearFlagZero()
{
byte flags = 0xff;
- EightBit.Chip.ClearFlag(ref flags, 0x80, 0);
+ flags = Chip.ClearFlag(flags, 0x80, 0);
Assert.AreEqual(0xff, flags);
}
@@ -60,7 +60,7 @@
public void TestClearFlagFalse()
{
byte flags = 0xff;
- EightBit.Chip.ClearFlag(ref flags, 0x80, false);
+ flags = Chip.ClearFlag(flags, 0x80, false);
Assert.AreEqual(0xff, flags);
}
@@ -68,7 +68,7 @@
public void TestClearFlagTrue()
{
byte flags = 0xff;
- EightBit.Chip.ClearFlag(ref flags, 0x80, true);
+ flags = Chip.ClearFlag(flags, 0x80, true);
Assert.AreEqual(0x7f, flags);
}
@@ -80,7 +80,7 @@
public void TestSetFlag()
{
byte flags = 0x7f;
- EightBit.Chip.SetFlag(ref flags, 0x80);
+ flags = Chip.SetFlag(flags, 0x80);
Assert.AreEqual(0xff, flags);
}
@@ -88,7 +88,7 @@
public void TestSetFlagNonZero()
{
byte flags = 0x7f;
- EightBit.Chip.SetFlag(ref flags, 0x80, 1);
+ flags = Chip.SetFlag(flags, 0x80, 1);
Assert.AreEqual(0xff, flags);
}
@@ -96,7 +96,7 @@
public void TestSetFlagZero()
{
byte flags = 0x7f;
- EightBit.Chip.SetFlag(ref flags, 0x80, 0);
+ flags = Chip.SetFlag(flags, 0x80, 0);
Assert.AreEqual(0x7f, flags);
}
@@ -104,7 +104,7 @@
public void TestSetFlagFalse()
{
byte flags = 0x7f;
- EightBit.Chip.SetFlag(ref flags, 0x80, false);
+ flags = Chip.SetFlag(flags, 0x80, false);
Assert.AreEqual(0x7f, flags);
}
@@ -112,7 +112,7 @@
public void TestSetFlagTrue()
{
byte flags = 0x7f;
- EightBit.Chip.SetFlag(ref flags, 0x80, true);
+ flags = Chip.SetFlag(flags, 0x80, true);
Assert.AreEqual(0xff, flags);
}
diff --git a/UnitTestEightBit/UnitTestEightBit.csproj b/UnitTestEightBit/UnitTestEightBit.csproj
index ae451be..8eb5309 100644
--- a/UnitTestEightBit/UnitTestEightBit.csproj
+++ b/UnitTestEightBit/UnitTestEightBit.csproj
@@ -29,6 +29,7 @@
DEBUG;TRACE
prompt
4
+ AllRules.ruleset
pdbonly
@@ -37,6 +38,7 @@
TRACE
prompt
4
+ AllRules.ruleset