diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2018-07-06 20:48:46 +0100 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2018-07-06 20:48:46 +0100 |
| commit | d132a0689aede6d856b5057cdb3d8c11bc7986ba (patch) | |
| tree | 607999950b03b728b54cbd4ef1f839b6dafa6f7d /src/main/kotlin/cpu/opcodes/Arithmetic8Bit.kt | |
| parent | 9bbd85e37c3a9a16560d1364e0ea59cbeff32de3 (diff) | |
| download | KGB-d132a0689aede6d856b5057cdb3d8c11bc7986ba.tar.xz KGB-d132a0689aede6d856b5057cdb3d8c11bc7986ba.zip | |
Add all remaining 8-Bit arithmetic ops
Diffstat (limited to 'src/main/kotlin/cpu/opcodes/Arithmetic8Bit.kt')
| -rw-r--r-- | src/main/kotlin/cpu/opcodes/Arithmetic8Bit.kt | 119 |
1 files changed, 117 insertions, 2 deletions
diff --git a/src/main/kotlin/cpu/opcodes/Arithmetic8Bit.kt b/src/main/kotlin/cpu/opcodes/Arithmetic8Bit.kt index 212a3a3..99d896e 100644 --- a/src/main/kotlin/cpu/opcodes/Arithmetic8Bit.kt +++ b/src/main/kotlin/cpu/opcodes/Arithmetic8Bit.kt @@ -46,8 +46,66 @@ var arithmetic8Bit = mapOf( 0x9D to Operation("SBC A,L", 0, 4, {r, _, _ -> r.A = subtractWithCarry(r.A, r.L, r)}), 0x9E to Operation("SBC A,(HL)", 0, 8, {r, m, _ -> r.A = subtractWithCarry(r.A, m.readByte(r.HL), r)}), // opcode missing in CPU manual? http://pastraiser.com/cpu/gameboy/gameboy_opcodes.html lists as 0xDE - 0xDE to Operation("SBC A,n", 1, 8, {r, _, a -> r.A = subtractWithCarry(r.A, a[0], r)}) - + 0xDE to Operation("SBC A,n", 1, 8, {r, _, a -> r.A = subtractWithCarry(r.A, a[0], r)}), + + 0xA7 to Operation("AND A,A", 0, 4, {r, _, _ -> r.A = and(r.A, r.A, r)}), + 0xA0 to Operation("AND A,B", 0, 4, {r, _, _ -> r.A = and(r.A, r.B, r)}), + 0xA1 to Operation("AND A,C", 0, 4, {r, _, _ -> r.A = and(r.A, r.C, r)}), + 0xA2 to Operation("AND A,D", 0, 4, {r, _, _ -> r.A = and(r.A, r.D, r)}), + 0xA3 to Operation("AND A,E", 0, 4, {r, _, _ -> r.A = and(r.A, r.E, r)}), + 0xA4 to Operation("AND A,H", 0, 4, {r, _, _ -> r.A = and(r.A, r.H, r)}), + 0xA5 to Operation("AND A,L", 0, 4, {r, _, _ -> r.A = and(r.A, r.L, r)}), + 0xA6 to Operation("AND A,(HL)", 0, 8, {r, m, _ -> r.A = and(r.A, m.readByte(r.HL), r)}), + 0xE6 to Operation("AND A,n", 1, 8, {r, _, a -> r.A = and(r.A, a[0], r)}), + + 0xB7 to Operation("OR A,A", 0, 4, {r, _, _ -> r.A = or(r.A, r.A, r)}), + 0xB0 to Operation("OR A,B", 0, 4, {r, _, _ -> r.A = or(r.A, r.B, r)}), + 0xB1 to Operation("OR A,C", 0, 4, {r, _, _ -> r.A = or(r.A, r.C, r)}), + 0xB2 to Operation("OR A,D", 0, 4, {r, _, _ -> r.A = or(r.A, r.D, r)}), + 0xB3 to Operation("OR A,E", 0, 4, {r, _, _ -> r.A = or(r.A, r.E, r)}), + 0xB4 to Operation("OR A,H", 0, 4, {r, _, _ -> r.A = or(r.A, r.H, r)}), + 0xB5 to Operation("OR A,L", 0, 4, {r, _, _ -> r.A = or(r.A, r.L, r)}), + 0xB6 to Operation("OR A,(HL)", 0, 8, {r, m, _ -> r.A = or(r.A, m.readByte(r.HL), r)}), + 0xF6 to Operation("OR A,n", 1, 8, {r, _, a -> r.A = or(r.A, a[0], r)}), + + 0xAF to Operation("XOR A,A", 0, 4, {r, _, _ -> r.A = xor(r.A, r.A, r)}), + 0xA8 to Operation("XOR A,B", 0, 4, {r, _, _ -> r.A = xor(r.A, r.B, r)}), + 0xA9 to Operation("XOR A,C", 0, 4, {r, _, _ -> r.A = xor(r.A, r.C, r)}), + 0xAA to Operation("XOR A,D", 0, 4, {r, _, _ -> r.A = xor(r.A, r.D, r)}), + 0xAB to Operation("XOR A,E", 0, 4, {r, _, _ -> r.A = xor(r.A, r.E, r)}), + 0xAC to Operation("XOR A,H", 0, 4, {r, _, _ -> r.A = xor(r.A, r.H, r)}), + 0xAD to Operation("XOR A,L", 0, 4, {r, _, _ -> r.A = xor(r.A, r.L, r)}), + 0xAE to Operation("XOR A,(HL)", 0, 8, {r, m, _ -> r.A = xor(r.A, m.readByte(r.HL), r)}), + 0xEE to Operation("XOR A,n", 1, 8, {r, _, a -> r.A = xor(r.A, a[0], r)}), + + // Compare is just A - n but the result is discarded + 0xBF to Operation("CP A,A", 0, 4, {r, _, _ -> subtract(r.A, r.A, r)}), + 0xB8 to Operation("CP A,B", 0, 4, {r, _, _ -> subtract(r.A, r.B, r)}), + 0xB9 to Operation("CP A,C", 0, 4, {r, _, _ -> subtract(r.A, r.C, r)}), + 0xBA to Operation("CP A,D", 0, 4, {r, _, _ -> subtract(r.A, r.D, r)}), + 0xBB to Operation("CP A,E", 0, 4, {r, _, _ -> subtract(r.A, r.E, r)}), + 0xBC to Operation("CP A,H", 0, 4, {r, _, _ -> subtract(r.A, r.H, r)}), + 0xBD to Operation("CP A,L", 0, 4, {r, _, _ -> subtract(r.A, r.L, r)}), + 0xBE to Operation("CP A,(HL)", 0, 8, {r, m, _ -> subtract(r.A, m.readByte(r.HL), r)}), + 0xFE to Operation("CP A,n", 1, 8, {r, _, a -> subtract(r.A, a[0], r)}), + + 0x3C to Operation("INC A", 0, 4, {r, _, _ -> r.A = inc(r.A, r)}), + 0x04 to Operation("INC B", 0, 4, {r, _, _ -> r.B = inc(r.B, r)}), + 0x0C to Operation("INC C", 0, 4, {r, _, _ -> r.C = inc(r.C, r)}), + 0x14 to Operation("INC D", 0, 4, {r, _, _ -> r.D = inc(r.D, r)}), + 0x1C to Operation("INC E", 0, 4, {r, _, _ -> r.E = inc(r.E, r)}), + 0x24 to Operation("INC H", 0, 4, {r, _, _ -> r.H = inc(r.H, r)}), + 0x2C to Operation("INC L", 0, 4, {r, _, _ -> r.L = inc(r.L, r)}), + 0x34 to Operation("INC (HL)", 0, 12, {r, m, _ -> m.writeByte(r.HL, inc(m.readByte(r.HL), r))}), + + 0x3D to Operation("DEC A", 0, 4, {r, _, _ -> r.A = dec(r.A, r)}), + 0x05 to Operation("DEC B", 0, 4, {r, _, _ -> r.B = dec(r.B, r)}), + 0x0D to Operation("DEC C", 0, 4, {r, _, _ -> r.C = dec(r.C, r)}), + 0x15 to Operation("DEC D", 0, 4, {r, _, _ -> r.D = dec(r.D, r)}), + 0x1D to Operation("DEC E", 0, 4, {r, _, _ -> r.E = dec(r.E, r)}), + 0x25 to Operation("DEC H", 0, 4, {r, _, _ -> r.H = dec(r.H, r)}), + 0x2D to Operation("DEC L", 0, 4, {r, _, _ -> r.L = dec(r.L, r)}), + 0x35 to Operation("DEC (HL)", 0, 12, {r, m, _ -> m.writeByte(r.HL, dec(m.readByte(r.HL), r))}) ) fun add(n1: Int, n2: Int, r: Registers): Int { @@ -101,3 +159,60 @@ fun subtractWithCarry(n1: Int, n2: Int, r: Registers): Int { return (n1 - n2 - carry) % 0xFF } +fun and(n1: Int, n2: Int, r: Registers): Int { + + val result = n1 and n2 + + r.setFlagFromBool(Flag.ZERO, result == 0) + r.clearFlag(Flag.SUBTRACT) + r.setFlag(Flag.HALF_CARRY) + r.clearFlag(Flag.CARRY) + + return result +} + +fun or(n1: Int, n2: Int, r: Registers): Int { + + val result = n1 or n2 + + r.setFlagFromBool(Flag.ZERO, result == 0) + r.clearFlag(Flag.SUBTRACT) + r.clearFlag(Flag.HALF_CARRY) + r.clearFlag(Flag.CARRY) + + return result +} + +fun xor(n1: Int, n2: Int, r: Registers): Int { + + val result = n1 xor n2 + + r.setFlagFromBool(Flag.ZERO, result == 0) + r.clearFlag(Flag.SUBTRACT) + r.clearFlag(Flag.HALF_CARRY) + r.clearFlag(Flag.CARRY) + + return result +} + +fun inc(n: Int, r: Registers): Int { + + val result = (n + 1) and 0xFF + + r.setFlagFromBool(Flag.ZERO, result == 0) + r.clearFlag(Flag.SUBTRACT) + r.setFlagFromBool(Flag.HALF_CARRY, (0x0F and result) < (0x0F and n)) + + return result +} + +fun dec(n: Int, r: Registers): Int { + + val result = (n - 1) and 0xFF + + r.setFlagFromBool(Flag.ZERO, result == 0) + r.clearFlag(Flag.SUBTRACT) + r.setFlagFromBool(Flag.HALF_CARRY, (0x0F and n) == 0) + + return result +}
\ No newline at end of file |