C#でchip8エミュレーターを作成しようとしています。実際のチップ上のハードウェアで行われる操作をソフトウェアでシミュレートする必要があります。
2つの2進数の減算中にボローが発生したかどうかを検出する必要があるオペコードがあります。
Byte1 - Byte2
借用が発生したかどうかをC#を使用して判断する方法について誰かがアイデアを持っていますか?
C#でchip8エミュレーターを作成しようとしています。実際のチップ上のハードウェアで行われる操作をソフトウェアでシミュレートする必要があります。
2つの2進数の減算中にボローが発生したかどうかを検出する必要があるオペコードがあります。
Byte1 - Byte2
借用が発生したかどうかをC#を使用して判断する方法について誰かがアイデアを持っていますか?
ウィキペディアであなたが言及しなかった謎のオペコードを検索し、いくつかの実装を探した後。オペコード8XY5と8XY7(XとYはレジスタ識別子)が減算を行うと結論付けることができます。
8XY5の場合、レジスタXはレジスタXの値からレジスタYの値を引いた値に設定されます。また、レジスタYの値がレジスタXの値以上の場合、レジスタFは1に設定されます。 (それ以外の場合は0)。
8XY7の場合、レジスタXはレジスタYの値からレジスタXの値を引いた値に設定されます。また、レジスタXの値がレジスタYの値以上の場合、レジスタFは1に設定されます。 (それ以外の場合は0)。
これは、8XY5の「擬似」コードです。
x = opcode[1]
y = opcode[2]
if (register[x] >= register[y])
register[0xF] = 1
else
register[0xF] = 0
result = register[x] - register[y]
if result < 0
result += 256
register[x] = result
これは、8XY7の「擬似」コードです。
x = opcode[1]
y = opcode[2]
if (register[y] >= register[x])
register[0xF] = 1
else
register[0xF] = 0
result = register[y] - register[x]
if result < 0
result += 256
register[x] = result
そして、これがC#の実装です。
const byte B_0 = 0x0;
const byte B_1 = 0x1;
const byte B_F = 0xF;
static void Main()
{
byte[] registers = new byte[16];
registers[0x1] = 255;
registers[0x2] = 127;
Opcode8XY5(registers, 1, 2);
Console.WriteLine(registers[0x1]);
Console.WriteLine(registers[0x2]);
Console.WriteLine(registers[0xF]);
Opcode8XY7(registers, 1, 2);
Console.WriteLine(registers[0x1]);
Console.WriteLine(registers[0x2]);
Console.WriteLine(registers[0xF]);
Console.ReadLine();
}
static void Opcode8XY5(byte[] registers, byte x, byte y)
{
registers[B_F] = registers[x] >= registers[y] ? B_1 : B_0;
registers[x] = (byte)(registers[x] - registers[y]);
}
static void Opcode8XY7(byte[] registers, byte x, byte y)
{
registers[B_F] = registers[y] >= registers[x] ? B_1 : B_0;
registers[x] = (byte)(registers[y] - registers[x]);
}
この実装を参照してください。
バイトの各ビットを比較する必要があります...2番目のバイトビットが設定されているが最初のビットが設定されていない場合、借用条件があります。
static void Main(string[] args) {
byte b1 = byte.Parse(args[0]);
byte b2 = byte.Parse(args[1]);
bool borrow = false;
for (int mask = 0x01; mask <= 0x80; mask <<= 1) {
if ((b2 & mask) > (b1 & mask)) {
borrow = true;
}
}
Console.WriteLine(Convert.ToString(b1, 2).PadLeft(8, '0'));
Console.WriteLine(Convert.ToString(b2, 2).PadLeft(8, '0'));
Console.WriteLine("borrowed: {0}", borrow);
}
あなたに答えを与える非常に巧妙なブール論理があるかもしれませんが、私は今それを思い付くことができません。
型キャストが符号伝播していなければ、より広い型で計算を行う必要があります。次に、結果の8番目のビットが1に設定されているかどうかを確認します。設定されている場合は、借用が行われました。次に、結果をバイトとして保存します。