2013-05-13 5 views
0

칩 8 에뮬레이터를 만들었지 만 드로잉 할 때 충돌을 감지하는 데 문제가 발생했습니다. Chip8은 개별 픽셀을 화면으로 XOR하고 픽셀이 꺼져 있으면 플래그를 설정하여 화면을 그립니다.chip8 에뮬레이터에서의 충돌 감지

_DXYN: function(X, Y, N) { 
    console.log("_DXYN"); 

    for (var i = 0; i < N; i++) { 
     for (var j = 0; j < 8; j++) { 
      var bitBefore = graphics[(i + cpu.registers.V[Y]) * 64 + j + cpu.registers.V[X]]; 
      var bitAfter = bitBefore^cpu.getBits(memory[cpu.registers.I + i])[j]; 
      graphics[(i + cpu.registers.V[Y]) * 64 + j + cpu.registers.V[X]] = bitAfter; 

      if ((bitBefore != bitAfter) && bitBefore == 1) 
       cpu.registers.V[0xF] = 0x1; 
      else 
       cpu.registers.V[0xF] = 0x0; 
     } 
    } 
} 

graphics는 INT의 1 차원 배열이며, 각 화면의 화소에 대응하여 다음과 같이 내 코드이다. 배열의 해당 정수가 1이면 픽셀이 켜지고 꺼지면 0입니다. cpu 객체는 레지스터뿐 아니라이 메서드를 포함하여 모든 메서드를 포함합니다. X은 그리기 할 스프라이트의 x 좌표를 포함하는 레지스터의 opcode 매개 변수이고 Y은 y 좌표가있는 레지스터의 opcode 매개 변수입니다. I 레지스터는 메모리에서 읽을 위치입니다.

getBits: function(opcode) { 
    var bits = []; 
    for (var i = 0; i < 8; i++) { 
     bits.push((opcode >> i) & 1) 
    } 
    return bits.reverse(); 
} 

전체 코드가 여기 GitHub의에서 찾을 수 있습니다 : 이행을위한 chip8cpu.js에서 https://github.com/ichub/Chip8 봐 다음과 같이 cpu.getBits 기능입니다.

+0

어떤 문제가 발생 했습니까? – HBP

+0

충돌이 작동하지 않았습니다. 내가 브레이크 아웃 ROM을 다운로드하고 그것을 연주하고, 충돌에 대한 반응이 없었다. 다른 모든 것은 잘했지만 아무 것도 충돌하지 않았습니다. –

답변

3

이 웹 사이트는 Chip-8 인터프리터를 작성하는 방법을 자세히 설명하는 http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter입니다. 일상에서

_DXYN: function(X, Y, N) { 
    console.log("_DXYN"); 

    cpu.registers.V[0xF] = 0x0; 
    for (var i = 0; i < N; i++) { // rows of the sprite 
     for (var j = 0; j < 8; j++) { 
      var bitBefore = graphics[(i + cpu.registers.V[Y]) * 64 + j + 
          cpu.registers.V[X]]; 
      var bitAfter = bitBefore^cpu.getBits(memory[cpu.registers.I + i])[j]; 
      graphics[(i + cpu.registers.V[Y]) * 64 + j + cpu.registers.V[X]] = bitAfter; 

      if ((bitBefore != bitAfter) && bitBefore == 1) 
       cpu.registers.V[0xF] = 0x1; 
     } 
    } 
} 

당신이 충돌이없는 경우 그 값은에만 의존하므로 VF 각 픽셀에서 해제됩니다 CHIP-8에 그와 위키 백과 aticle에서 나는 당신의 루틴은 다음과 같아야한다고 생각 마지막으로 그려진 픽셀. 그리기를 시작하기 전에 VF를 지우고 충돌이있을 때만 VF를 설정해야합니다.