|
|
|
@ -283,9 +283,8 @@ void Chip8::OP_Dxyn() { |
|
|
|
uint8_t Vy = (opcode & 0x00F0u) >> 4u; |
|
|
|
uint8_t Vy = (opcode & 0x00F0u) >> 4u; |
|
|
|
uint8_t height = opcode & 0x00Fu; |
|
|
|
uint8_t height = opcode & 0x00Fu; |
|
|
|
|
|
|
|
|
|
|
|
// wrap if going beyond the screen boundaries
|
|
|
|
uint8_t xPos = registers[Vx]; |
|
|
|
uint8_t xPos = registers[Vx] % CHIP8_WIDTH; |
|
|
|
uint8_t yPos = registers[Vy]; |
|
|
|
uint8_t yPos = registers[Vy] % CHIP8_HEIGHT; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
registers[0xF] = 0; |
|
|
|
registers[0xF] = 0; |
|
|
|
|
|
|
|
|
|
|
|
@ -295,7 +294,11 @@ void Chip8::OP_Dxyn() { |
|
|
|
for(size_t col = 0; col < 8; ++col) { |
|
|
|
for(size_t col = 0; col < 8; ++col) { |
|
|
|
uint8_t spritePixel = spriteByte & (0x80u >> col); |
|
|
|
uint8_t spritePixel = spriteByte & (0x80u >> col); |
|
|
|
|
|
|
|
|
|
|
|
size_t pixel_at = (yPos + row) * CHIP8_WIDTH + (xPos + col); |
|
|
|
// wrap if going beyond the screen boundaries
|
|
|
|
|
|
|
|
size_t draw_row = (yPos + row) % CHIP8_HEIGHT; |
|
|
|
|
|
|
|
size_t draw_col = (xPos + col) % CHIP8_WIDTH; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t pixel_at = draw_row * CHIP8_WIDTH + draw_col; |
|
|
|
|
|
|
|
|
|
|
|
uint32_t* screenPixel = &video[pixel_at]; |
|
|
|
uint32_t* screenPixel = &video[pixel_at]; |
|
|
|
|
|
|
|
|
|
|
|
|