2013-06-27 28 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