diff --git a/scripts/Chip8.gd b/scripts/Chip8.gd index f6f4fb2..508a1a5 100644 --- a/scripts/Chip8.gd +++ b/scripts/Chip8.gd @@ -77,11 +77,6 @@ func runSystem(): var jump = false opcode = (memory[pc] << 8) | memory[pc + 1] - - var vx = (opcode & 0x0F00) >> 8 - var vy = (opcode & 0x00F0) >> 4 - var vaddr = opcode & 0x0FFF - var vbyte = (opcode & 0x00FF) # Instructions match (opcode & 0xF000): @@ -92,144 +87,36 @@ func runSystem(): gfx[i] = 0 isRedraw = true - 0x00EE: # RET sp -= 1 pc = stack[sp] + 2 jump = true _: - pc = vaddr + var address = opcode & 0x0FFF + pc = address jump = true - 0x1000: # JP - pc = vaddr + var address = opcode & 0x0FFF + pc = address jump = true 0x2000: # CALL + var address = opcode & 0x0FFF stack[sp] = pc sp += 1 - pc = vaddr + pc = address 0x3000: # SNE Vx, byte - if (registers[vx] == vbyte): - pc += 2 - - 0x4000: # SE Vx, byte - if (registers[vx] != vbyte): - pc += 2 - - 0x5000: # SE Vx, Vy - if (registers[vx] != registers[vy]): - pc += 2 - - 0x6000: # LD Vx, byte + var vx = (opcode & 0x0F00) > 8 + var byte = (opcode & 0x00FF) - registers[vx] = vbyte - - 0x7000: # ADD Vx, byte - registers[vx] = (registers[vx] + vbyte) & 0xFF - - 0x8000: - var result = registers[vx] - registers[vy] - - match (opcode & 0x000F): - 0x0000: # LD Vx, Vy - registers[vx] = registers[vy] - - 0x0001: # OR Vx, Vy - registers[vx] = (registers[vx] | registers[vy]) & 0xFF - - 0x0002: # AND Vx, Vy - registers[vx] = (registers[vx] | registers[vy]) & 0xFF - - 0x0003: # XOR Vx, Vy - registers[vx] = (registers[vx] ^ registers[vy]) & 0xFF - - 0x0004: # XOR Vx, Vy - - if (result > 255): - registers[0xF] = 1 - - registers[vx] = result & 0xFF - - 0x0005: # SUB Vx, Vy - if (registers[vx] > registers[vy]): - registers[0xF] = 1 - else: - registers[0xF] = 0 - - registers[vx] = result & 0xFF - - 0x0006: # SHR Vx {, Vy} - var shr_result = registers[vx] & 0x1 - - if (shr_result == 1): - registers[0xF] = 1 - else: - registers[0xF] = 0 - - registers[vx] = registers[vx] >> 1 - - 0x0007: # SUBN Vx, Vy - if (registers[vy] > registers[vx]): - registers[0xF] = 1 - else: - registers[0xF] = 0 - - registers[vx] = result & 0xFF - - 0x000E: # SHL Vx {, Vy} - if (result == 1): - registers[0xF] = 1 - else: - registers[0xF] = 0 - - registers[vx] = registers[vx] << 1 - - _: - print("Unsupported opcode at 0x8000: %X" ,opcode) - 0x9000: # SNE Vx, Vy - if (registers[vx] != registers[vy]): + if (registers[vx] != byte): pc += 2 - - 0xA000: # LD I, address - index = vaddr - - 0xB000: # JP V0, address - pc = vaddr + (registers[0x0] & 0xFF) - jump = true - - 0xC000: # RND Vx, byte - var rnd_result = (randi() % 256) & vbyte - - registers[vx] = rnd_result - - 0xD000: # DRW Vx, Vy, nibble - var nibble = (opcode & 0x000F) - var yPos = registers[vx] - var xPos = registers[vy] - - registers[0xF] = 0 - - for yLine in range(nibble): - var line = memory[index + yLine] - - for xLine in range(8): - var pixel = line & (0x80 >> xLine) - - if (pixel != 0): - var totalX = (xPos + xLine) % 64 - var totalY = (yPos + yLine) % 32 - var px_index = (totalY * 64) + totalX - - if (gfx[px_index] == 1): - registers[0xF] = 1 - - gfx[px_index] = gfx[px_index] ^ 1 - isRedraw = true + if (registers[vx] != byte): + pc += 2 _: print("Unsopported opcode: %X", opcode)