mirror of
https://github.com/tonytins/retro8.git
synced 2025-03-21 15:21:20 +00:00
Implementated instructions 0x4000 to 0xC000
- Moved commonly used variables in runSystem() above the main match statement
This commit is contained in:
parent
c2f76c61a1
commit
3c4404f072
1 changed files with 97 additions and 6 deletions
103
scripts/Chip8.gd
103
scripts/Chip8.gd
|
@ -77,6 +77,11 @@ func runSystem():
|
||||||
var jump = false
|
var jump = false
|
||||||
|
|
||||||
opcode = (memory[pc] << 8) | memory[pc + 1]
|
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
|
# Instructions
|
||||||
match (opcode & 0xF000):
|
match (opcode & 0xF000):
|
||||||
|
@ -87,36 +92,122 @@ func runSystem():
|
||||||
gfx[i] = 0
|
gfx[i] = 0
|
||||||
|
|
||||||
isRedraw = true
|
isRedraw = true
|
||||||
|
|
||||||
0x00EE: # RET
|
0x00EE: # RET
|
||||||
sp -= 1
|
sp -= 1
|
||||||
pc = stack[sp] + 2
|
pc = stack[sp] + 2
|
||||||
jump = true
|
jump = true
|
||||||
|
|
||||||
_:
|
_:
|
||||||
var address = opcode & 0x0FFF
|
|
||||||
pc = address
|
pc = address
|
||||||
jump = true
|
jump = true
|
||||||
|
|
||||||
0x1000: # JP
|
0x1000: # JP
|
||||||
var address = opcode & 0x0FFF
|
|
||||||
pc = address
|
pc = address
|
||||||
jump = true
|
jump = true
|
||||||
|
|
||||||
0x2000: # CALL
|
0x2000: # CALL
|
||||||
var address = opcode & 0x0FFF
|
|
||||||
stack[sp] = pc
|
stack[sp] = pc
|
||||||
sp += 1
|
sp += 1
|
||||||
|
|
||||||
pc = address
|
pc = address
|
||||||
|
|
||||||
0x3000: # SNE Vx, byte
|
0x3000: # SNE Vx, byte
|
||||||
var vx = (opcode & 0x0F00) > 8
|
|
||||||
var byte = (opcode & 0x00FF)
|
|
||||||
|
|
||||||
if (registers[vx] != byte):
|
if (registers[vx] != byte):
|
||||||
pc += 2
|
pc += 2
|
||||||
|
|
||||||
if (registers[vx] != byte):
|
if (registers[vx] != byte):
|
||||||
pc += 2
|
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)
|
print("Unsopported opcode: %X", opcode)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue