I'm developing a Chip8 emulator. Chip8 instructions are stored as two byte pairs, which I handle as a uint16. The data for the opcodes is interwoven into the opcode itself. For example the opcode to draw a sprite is 0xDxyn, where the opcode is actually just 0xD000, with the last three places being the x and y location to draw, and the n being how many bytes the sprite is.
This is mind, I've been trying to extract this data using simple bitshifting and masking, but I keep getting 0 instead of the expected values. For example:
//Opcode is = 0xD01F, of type uint16
x := int(c.Registers[((opcode >> 16) & 0x000F)])
y := int(c.Registers[((opcode >> 8) & 0x000F)])
size := int((opcode & 0x000F))
This should resolve to c.Registers[0] and c.Registers[1], instead both end up c.Registers[0]. Size comes out correctly 15. Why is this?