2013-06-27 6 views
1

Opcode DXYN : 너비가 8 픽셀이고 높이가 N 픽셀 인 좌표 (VX, VY)에 스프라이트를 그립니다. 8 픽셀의 각 행은 메모리 위치 I에서 시작하여 비트 코딩 된 (각 바이트의 최상위 비트가 왼쪽에 표시됨) 것으로 읽습니다. I 값은이 명령을 실행 한 후에 변경되지 않습니다. 위에서 설명한 것처럼 스프라이트가 그려 질 때 화면 픽셀이 설정에서 해제로 설정되면 VF가 1로 설정되고 그렇지 않으면 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

먼저 픽셀이 비트 포장되며 각 바이트에는 8 픽셀의 스프라이트 데이터가 포함됩니다. 즉, 바이트 0xAA는 첫 번째, 세 번째, 다섯 번째 및 세 번째 픽셀 세트가있는 단일 픽셀 높이 스프라이트입니다.

스프라이트를 그릴 때 각 비트를 반복해야합니다. 비트가 설정되면 플립 디스플레이의 해당 비트 0이 1이되고 1이 0이됩니다. 예를 들어 디스플레이 바이트에 XOR (^) 연산을 적용하여 수행 할 수 있습니다.

그러나 프로세스에서 픽셀이 1에서 0으로 이동하면 VF를 1로 설정하고 픽셀이 설정되지 않은 경우 0으로 설정해야하므로 참고해야합니다. 만약 당신이 그 비트를 뒤집을 것인지 아닌지를 확인한 다음 그 안에 플립 핑 (flipping)과 VF- 업데이트 (vF-updating)를 돌보는 것이 있다면 그것을 읽는 것이 가장 쉽다. 화면 경계 외부 이동 스프라이트, 그들이 (이것은 mod WIDTH/mod HEIGHT 부품에 의해 이루어집니다) 랩 어라운드 것을

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; 

주 : 참고로

이 옵 코드 내 자신의 델파이 구현은 다음과 같습니다 . 이것은 Cowgod's Chip-8 Technical Reference에 언급되어 있습니다.

+0

환호, 나는이 대답을 선택하는 것을 잊었습니다. 귀하의 예제 코드가 도움이되었습니다. 조 ..! – Jason