2012-10-13 23 views
3

我想在C#中編寫一個chip8模擬器。有必要在軟件中模擬真實芯片上的硬件操作。當減去二進制數字時確定「借用」

有一個操作碼需要檢測在減去兩個二進制數字期間是否發生借位。

Byte1 - Byte2 

有沒有人有任何想法,我怎麼可以用C#來判斷是否發生了借位?

回答

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); 
} 

有可能是一個非常聰明的布爾邏輯那會給你答案,但我現在不能拿出來。

+0

謝謝你的迴應!這是我發佈這個時想要做的,我今天要試一下! – Bubo

+0

這很棒,謝謝! – Bubo

1

如果類型轉換不是符號傳播,則需要使用更寬的類型進行數學運算。然後檢查結果是否將第8位設置爲1.如果設置了,則借用已經存在。然後將結果保存爲字節。

3

Wikipedia中搜索到你沒有提到的神祕操作碼並尋找一些實現。我可以得出結論,操作碼8XY5和8XY7(其中X和Y是寄存器標識符)將執行減法。

對於8XY5,寄存器X將被設置爲寄存器X的值減去寄存器Y的值。如果寄存器Y的值大於或等於該值,寄存器F將被設置爲1的寄存器X(否則爲0)。

對於8XY7,寄存器X將被設置爲寄存器Y的值減去寄存器X的值。如果寄存器X的值大於或等於該值,寄存器F將被設置爲1的寄存器Y(否則爲0)。

這是8XY5 「僞」 -code:

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 「僞」 -code:

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]); 
} 

查詢this實施僅供參考。

+0

這很好,但我看到的唯一問題是它沒有做一點一點的比較。 – Bubo

+0

@MrAlt六件事:1)在基數256 5 - 3不是借用2)在十進制5 - 3不是借用,3)在二進制5 - 3(101 - 11)是借用,4)與jheddings '代碼5 - 3是借用,5)與我的代碼5 - 3不是借用,6)我的代碼是在現有的模擬器上。你可以自由地做出自己的結論。獨立於你如何實現它,確保你徹底地測試它。 – Theraot

+0

@Theraot 10件事情:0)你應該從0開始計數:p 1)'base 256'是什麼? – vexe