Correct a bunch of MC6809/MC6850 style issues.

Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
This commit is contained in:
Adrian Conlon 2019-04-24 00:57:53 +01:00
parent 1d976e811d
commit 15551adb68
3 changed files with 52 additions and 49 deletions

View File

@ -442,7 +442,7 @@
case 0b11:
return this.S;
default:
throw new ArgumentOutOfRangeException("which", which, "Which does not specify a valid register");
throw new ArgumentOutOfRangeException(nameof(which), which, "Which does not specify a valid register");
}
}
@ -671,7 +671,7 @@
}
private bool Branch(Register16 destination, bool condition) => this.Branch(destination.Word, condition);
private void BranchShort(bool condition) => this.Branch(this.Address_relative_byte(), condition);
private void BranchLong(bool condition)
@ -711,11 +711,11 @@
case 0b1011:
return ref this.DP;
default:
throw new ArgumentOutOfRangeException("specifier", specifier, "Invalid specifier");
throw new ArgumentOutOfRangeException(nameof(specifier), specifier, "Invalid specifier");
}
}
Register16 ReferenceTransfer16(int specifier)
private Register16 ReferenceTransfer16(int specifier)
{
switch (specifier) {
case 0b0000:
@ -731,7 +731,7 @@
case 0b0101:
return this.PC;
default:
throw new ArgumentOutOfRangeException("specifier", specifier, "Invalid specifier");
throw new ArgumentOutOfRangeException(nameof(specifier), specifier, "Invalid specifier");
}
}
@ -1106,7 +1106,6 @@
{
switch (this.OpCode)
{
// CMP
// CMPD
@ -1175,7 +1174,6 @@
{
switch (this.OpCode)
{
// CMP
// CMPU
@ -1299,7 +1297,7 @@
if (type1 != type2)
{
throw new ArgumentOutOfRangeException("data", data, "Type specifications do not match");
throw new ArgumentOutOfRangeException(nameof(data), data, "Type specifications do not match");
}
if (type1 == 0)
@ -1536,7 +1534,7 @@
if (type1 != type2)
{
throw new ArgumentOutOfRangeException("data", data, "Type specifications do not match");
throw new ArgumentOutOfRangeException(nameof(data), data, "Type specifications do not match");
}
if (type1 == 0)

View File

@ -9,40 +9,42 @@ namespace EightBit
[Flags]
public enum StatusBits : byte
{
// Entire flag: set if the complete machine state was saved in the stack.
// If this bit is not set then only program counter and condition code
// registers were saved in the stack. This bit is used by interrupt
// handling routines only.
// The bit is cleared by fast interrupts, and set by all other interrupts.
EF = Bits.Bit7,
None = 0,
// Fast interrupt mask: set if the FIRQ interrupt is disabled.
FF = Bits.Bit6,
// Carry: set if there was a carry from the bit 7 during last add
// operation, or if there was a borrow from last subtract operation,
// or if bit 7 of the A register was set during last MUL operation.
CF = Bits.Bit0,
// Half carry: set if there was a carry from bit 3 to bit 4 of the result
// during the last add operation.
HF = Bits.Bit5,
// Interrupt mask: set if the IRQ interrupt is disabled.
IF = Bits.Bit4,
// Negative: set if the most significant bit of the result is set.
// This bit can be set not only by arithmetic and logical operations,
// but also by load / store operations.
NF = Bits.Bit3,
// Overflow: set if there was an overflow during last result calculation.
// Logical, load and store operations clear this bit.
VF = Bits.Bit1,
// Zero: set if the result is zero. Like the N bit, this bit can be
// set not only by arithmetic and logical operations, but also
// by load / store operations.
ZF = Bits.Bit2,
// Overflow: set if there was an overflow during last result calculation.
// Logical, load and store operations clear this bit.
VF = Bits.Bit1,
// Negative: set if the most significant bit of the result is set.
// This bit can be set not only by arithmetic and logical operations,
// but also by load / store operations.
NF = Bits.Bit3,
// Carry: set if there was a carry from the bit 7 during last add
// operation, or if there was a borrow from last subtract operation,
// or if bit 7 of the A register was set during last MUL operation.
CF = Bits.Bit0,
// Interrupt mask: set if the IRQ interrupt is disabled.
IF = Bits.Bit4,
// Half carry: set if there was a carry from bit 3 to bit 4 of the result
// during the last add operation.
HF = Bits.Bit5,
// Fast interrupt mask: set if the FIRQ interrupt is disabled.
FF = Bits.Bit6,
// Entire flag: set if the complete machine state was saved in the stack.
// If this bit is not set then only program counter and condition code
// registers were saved in the stack. This bit is used by interrupt
// handling routines only.
// The bit is cleared by fast interrupts, and set by all other interrupts.
EF = Bits.Bit7,
}
}

View File

@ -45,7 +45,6 @@ namespace EightBit
// * Leading bit = LSB = Bit 0
// ** Data bit will be zero in 7-bit plus parity modes
// *** Data bit is "don't care" in 7-bit plus parity modes
public sealed class MC6850 : ClockedChip
{
private PinLevel rxdataLine = PinLevel.Low;
@ -102,8 +101,10 @@ namespace EightBit
public event EventHandler<EventArgs> Received;
[Flags]
public enum ControlRegisters
{
None = 0,
CR0 = 0b1, // Counter divide
CR1 = 0b10, // "
CR2 = 0b100, // Word select
@ -158,8 +159,11 @@ namespace EightBit
// Information stored in this register indicates the status of the
// Transmit Data Register, the Receive Data Register and error logic,
// and the peripheral/modem status inputs of the ACIA
[Flags]
public enum StatusRegisters
{
None = 0,
// Receive Data Register Full (RDRF), Bit 0 - Receive Data
// Register Full indicates that received data has been
// transferred to the Receive Data Register. RDRF is cleared
@ -318,22 +322,21 @@ namespace EightBit
private bool TransmitReadyHigh => this.transmitControl == TransmitterControl.ReadyHighInterruptDisabled;
private bool TransmitReadyLow => !this.TransmitReadyHigh;
//// private bool TransmitReadyLow => !this.TransmitReadyHigh;
private byte Status
{
get
{
byte status = 0;
SetFlag(status, StatusRegisters.STATUS_RDRF, this.statusRDRF);
SetFlag(status, StatusRegisters.STATUS_TDRE, this.statusTDRE);
SetFlag(status, StatusRegisters.STATUS_DCD, this.DCD.Lowered());
SetFlag(status, StatusRegisters.STATUS_CTS, this.CTS.Raised());
ClearFlag(status, StatusRegisters.STATUS_FE);
SetFlag(status, StatusRegisters.STATUS_OVRN, this.statusOVRN);
ClearFlag(status, StatusRegisters.STATUS_PE);
SetFlag(status, StatusRegisters.STATUS_IRQ, this.IRQ.Lowered());
return status;
status = SetFlag(status, StatusRegisters.STATUS_RDRF, this.statusRDRF);
status = SetFlag(status, StatusRegisters.STATUS_TDRE, this.statusTDRE);
status = SetFlag(status, StatusRegisters.STATUS_DCD, this.DCD.Lowered());
status = SetFlag(status, StatusRegisters.STATUS_CTS, this.CTS.Raised());
status = ClearFlag(status, StatusRegisters.STATUS_FE);
status = SetFlag(status, StatusRegisters.STATUS_OVRN, this.statusOVRN);
status = ClearFlag(status, StatusRegisters.STATUS_PE);
return SetFlag(status, StatusRegisters.STATUS_IRQ, this.IRQ.Lowered());
}
}
@ -451,15 +454,15 @@ namespace EightBit
return returned;
}
private static byte SetFlag(byte f, StatusRegisters flag) => SetFlag(f, (byte)flag);
////private static byte SetFlag(byte f, StatusRegisters flag) => SetFlag(f, (byte)flag);
private static byte SetFlag(byte f, StatusRegisters flag, int condition) => SetFlag(f, (byte)flag, condition);
////private static byte SetFlag(byte f, StatusRegisters flag, int condition) => SetFlag(f, (byte)flag, condition);
private static byte SetFlag(byte f, StatusRegisters flag, bool condition) => SetFlag(f, (byte)flag, condition);
private static byte ClearFlag(byte f, StatusRegisters flag) => ClearFlag(f, (byte)flag);
private static byte ClearFlag(byte f, StatusRegisters flag, int condition) => ClearFlag(f, (byte)flag, condition);
////private static byte ClearFlag(byte f, StatusRegisters flag, int condition) => ClearFlag(f, (byte)flag, condition);
private void OnAccessing() => this.Accessing?.Invoke(this, EventArgs.Empty);