2013-06-27 45 views
1

操作碼DXYN: 繪製子畫面在座標(VX,VY),其具有8個像素的寬度和N個像素的高度。每行8個像素從位置I開始按位編碼(每個字節的最高有效位顯示在左側)讀取;執行此指令後,我的值不會改變。如上所述,如果在繪製精靈時將任意屏幕像素從設置翻轉爲未設置,則將VF設置爲1;如果沒有,則將VF設置爲0。CHIP 8圖形在屏幕上如何渲染?

基本上我有稱爲圖形的陣列,其是具有32列構造出的64行每每個新陣列的雙陣列。

//Creating new double arrays for storing graphics data 
    graphics = new Array(GFX_WIDTH); 
     for(var i = 0; i < graphics .length; i++){ 
      graphics [i] = new Array(GFX_HEIGHT); 
      for(var j = 0; j < graphics [i].length; j++){ 
       graphics [i][j] = 0; 
      } 
     } 

並且在這些數組中,我正在像上面描述的那樣存儲圖形數據。我的問題是,當數組元素爲1時,是否需要畫一個正方形,並且當它爲0時清空該空間?根據CHIP8上的博客文章,字體集還有一個額外的數組,但它的用法是什麼?

的博客文章中,我上面

http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/

提到謝謝。

回答

2

首先,注意,像素bitpacked - 每個字節將包含精靈數據的8個像素。換句話說,字節0xAA是具有第一,第三,第五和第七像素集的單像素高精靈。

當繪製你的精靈,你通過每一位需要循環。如果該位被設置,則倒裝在顯示器中的相應位 - 0變爲1,1變爲0。這可以,例如,可以通過施加的XOR(^)操作到顯示器字節完成。

注意,但是,VF必須設置爲1,如果任何像素從1到0的過程中,和0去,如果沒有像素都沒有設置 - 所以你還需要做到這一點。如果你有一個if檢查是否翻轉一下,我發現它是最容易閱讀的,然後在這個if裏面注意翻轉和VF更新。

僅供參考,我自己的Delphi實現這個操作碼的看起來是這樣的:

procedure TChip8CPU.OpcodeD(inst: TInstruction); 
var 
    X, Y, cX, cY, data: byte; 
begin 
    Reg[$F] := 0; 
    for Y := 0 to inst.NibbleArg - 1 do begin 
    cY := (Reg[inst.Y] + Y) mod HEIGHT; 
    data := Memory[AddressI + Y]; 
    for X := 0 to 7 do begin 
     if (data and ($80 shr X)) <> 0 then begin 
     cX := (Reg[inst.X] + X) mod WIDTH; 
     if Display[cY, cX] = 1 then Reg[$F] := 1; 
     Display[cY, cX] := Display[cY, cX] xor 1; 
     end; 
    end; 
    end; 
end; 

注意,對於精靈哪去了屏幕邊界之外,它們環繞(這是由mod WIDTH/mod HEIGHT部分完成) 。這在Cowgod's Chip-8 Technical Reference中提到。

+0

歡呼聲中,我忘記了選擇這個答案。你的示例代碼幫助了我。 TA ..! – Jason