From 3c4404f072561917335e7ae8f0010e54379cf7de Mon Sep 17 00:00:00 2001 From: Tony Bark Date: Tue, 9 Mar 2021 05:47:15 -0500 Subject: [PATCH 1/2] Implementated instructions 0x4000 to 0xC000 - Moved commonly used variables in runSystem() above the main match statement --- scripts/Chip8.gd | 103 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/scripts/Chip8.gd b/scripts/Chip8.gd index 508a1a5..008de8f 100644 --- a/scripts/Chip8.gd +++ b/scripts/Chip8.gd @@ -77,6 +77,11 @@ func runSystem(): var jump = false opcode = (memory[pc] << 8) | memory[pc + 1] + + var vx = (opcode & 0x0F00) >> 8 + var vy = (opcode & 0x00F0) >> 4 + var address = opcode & 0x0FFF + var byte = (opcode & 0x00FF) # Instructions match (opcode & 0xF000): @@ -87,36 +92,122 @@ func runSystem(): gfx[i] = 0 isRedraw = true + 0x00EE: # RET sp -= 1 pc = stack[sp] + 2 jump = true _: - var address = opcode & 0x0FFF pc = address jump = true + 0x1000: # JP - var address = opcode & 0x0FFF pc = address jump = true 0x2000: # CALL - var address = opcode & 0x0FFF stack[sp] = pc sp += 1 pc = address 0x3000: # SNE Vx, byte - var vx = (opcode & 0x0F00) > 8 - var byte = (opcode & 0x00FF) - if (registers[vx] != byte): pc += 2 if (registers[vx] != byte): pc += 2 + + 0x4000: # SE Vx, byte + if (registers[vx] != byte): + pc += 2 + + 0x5000: # SE Vx, Vy + if (registers[vx] != registers[vy]): + pc += 2 + + 0x6000: # LD Vx, byte + + registers[vx] = byte + + 0x7000: # ADD Vx, byte + registers[vx] = (registers[vx] + byte) & 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]): + pc += 2 + + 0xA000: # LD I, address + index = address + + 0xB000: # JP V0, address + pc = address + (registers[0x0] & 0xFF) + jump = true + + 0xC000: # RND Vx, byte + var rnd_result = (randi() % 256) & byte + + registers[vx] = rnd_result _: print("Unsopported opcode: %X", opcode) From a75bc3ca5622730e49a6bb314d20c2ef32651376 Mon Sep 17 00:00:00 2001 From: Tony Bark Date: Tue, 9 Mar 2021 06:08:20 -0500 Subject: [PATCH 2/2] Added draw instruction - Renamed byte and address to vbyte and vaddr, respectfully, to avoid conflicts --- scripts/Chip8.gd | 52 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/scripts/Chip8.gd b/scripts/Chip8.gd index 008de8f..f6f4fb2 100644 --- a/scripts/Chip8.gd +++ b/scripts/Chip8.gd @@ -80,8 +80,8 @@ func runSystem(): var vx = (opcode & 0x0F00) >> 8 var vy = (opcode & 0x00F0) >> 4 - var address = opcode & 0x0FFF - var byte = (opcode & 0x00FF) + var vaddr = opcode & 0x0FFF + var vbyte = (opcode & 0x00FF) # Instructions match (opcode & 0xF000): @@ -99,28 +99,25 @@ func runSystem(): jump = true _: - pc = address + pc = vaddr jump = true 0x1000: # JP - pc = address + pc = vaddr jump = true 0x2000: # CALL stack[sp] = pc sp += 1 - pc = address + pc = vaddr 0x3000: # SNE Vx, byte - if (registers[vx] != byte): - pc += 2 - - if (registers[vx] != byte): + if (registers[vx] == vbyte): pc += 2 0x4000: # SE Vx, byte - if (registers[vx] != byte): + if (registers[vx] != vbyte): pc += 2 0x5000: # SE Vx, Vy @@ -129,10 +126,10 @@ func runSystem(): 0x6000: # LD Vx, byte - registers[vx] = byte + registers[vx] = vbyte 0x7000: # ADD Vx, byte - registers[vx] = (registers[vx] + byte) & 0xFF + registers[vx] = (registers[vx] + vbyte) & 0xFF 0x8000: var result = registers[vx] - registers[vy] @@ -198,16 +195,41 @@ func runSystem(): pc += 2 0xA000: # LD I, address - index = address + index = vaddr 0xB000: # JP V0, address - pc = address + (registers[0x0] & 0xFF) + pc = vaddr + (registers[0x0] & 0xFF) jump = true 0xC000: # RND Vx, byte - var rnd_result = (randi() % 256) & 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 _: print("Unsopported opcode: %X", opcode)