diff options
| author | James Barnett <noreply@jamesbarnett.xyz> | 2018-07-16 21:57:53 +0100 |
|---|---|---|
| committer | James Barnett <noreply@jamesbarnett.xyz> | 2018-07-16 21:57:53 +0100 |
| commit | a6e35c04ce8a37e78702997977c95e1d1bafb932 (patch) | |
| tree | 5e1618eaa805ffe1dc686d67406fe3a389a2a589 | |
| parent | ae3bb9819aad653d6a2ed972000e3c3696e39bf1 (diff) | |
| download | KGB-a6e35c04ce8a37e78702997977c95e1d1bafb932.tar.xz KGB-a6e35c04ce8a37e78702997977c95e1d1bafb932.zip | |
Add CALLs
| -rw-r--r-- | src/main/kotlin/cpu/Cpu.kt | 1 | ||||
| -rw-r--r-- | src/main/kotlin/cpu/opcodes/Calls.kt | 28 |
2 files changed, 29 insertions, 0 deletions
diff --git a/src/main/kotlin/cpu/Cpu.kt b/src/main/kotlin/cpu/Cpu.kt index ce5ba43..3336900 100644 --- a/src/main/kotlin/cpu/Cpu.kt +++ b/src/main/kotlin/cpu/Cpu.kt @@ -19,6 +19,7 @@ class Cpu { stdCommandGroup.putAll(misc) stdCommandGroup.putAll(rotates) stdCommandGroup.putAll(jumps) + stdCommandGroup.putAll(calls) standardOpcodes = stdCommandGroup.toMap() val extCommandGroup: MutableMap<Int, Operation> = mutableMapOf() diff --git a/src/main/kotlin/cpu/opcodes/Calls.kt b/src/main/kotlin/cpu/opcodes/Calls.kt new file mode 100644 index 0000000..697b56c --- /dev/null +++ b/src/main/kotlin/cpu/opcodes/Calls.kt @@ -0,0 +1,28 @@ +package cpu.opcodes + +import cpu.Operation +import cpu.Registers +import cpu.Registers.Flag +import ram.Ram +import BitManipulation as bm + +val calls = mapOf( + + 0xCD to Operation("CALL nn", 2, 12, {r, m, a -> call(bm.argsToWord(a), r, m)}), + + 0xC4 to Operation("CALL NZ,nn", 2, 12, {r, m, a -> if(r.getFlag(Flag.ZERO) == 0) call(bm.argsToWord(a), r, m)}), + 0xCC to Operation("CALL Z,nn", 2, 12, {r, m, a -> if(r.getFlag(Flag.ZERO) == 1) call(bm.argsToWord(a), r, m)}), + 0xD4 to Operation("CALL NC,nn", 2, 12, {r, m, a -> if(r.getFlag(Flag.CARRY) == 0) call(bm.argsToWord(a), r, m)}), + 0xDC to Operation("CALL C,nn", 2, 12, {r, m, a -> if(r.getFlag(Flag.CARRY) == 1) call(bm.argsToWord(a), r, m)}) + +) + +private fun call(word: Int, r: Registers, m: Ram) { + + val nextAddress = (r.PC + 3) and 0xFFFF + + m.writeByte(r.decrementAndGetSP(), bm.getMsb(nextAddress)) + m.writeByte(r.decrementAndGetSP(), bm.getLsb(nextAddress)) + + r.PC = word +}
\ No newline at end of file |