aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/cpu/opcodes/Returns.kt
blob: c379a97ff7871d8db0d8efb1c554f17a48abdc6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package cpu.opcodes

import cpu.Operation
import cpu.Registers
import ram.Ram
import BitManipulation as bm

val returns = mapOf(

  0xC9 to Operation("RET", 0, 8) { r, m, _ -> ret(r, m)},

  0xC0 to Operation("RET NZ,nn", 0, 8) { r, m, _ -> if(r.getFlag(Registers.Flag.ZERO) == 0) ret(r, m)},
  0xC8 to Operation("RET Z,nn", 0, 8) { r, m, _ -> if(r.getFlag(Registers.Flag.ZERO) == 1) ret(r, m)},
  0xD0 to Operation("RET NC,nn", 0, 8) { r, m, _ -> if(r.getFlag(Registers.Flag.CARRY) == 0) ret(r, m)},
  0xD8 to Operation("RET C,nn", 0, 8) { r, m, _ -> if(r.getFlag(Registers.Flag.CARRY) == 1) ret(r, m)},

  // TODO - enable interrupts once added
  0xC9 to Operation("RET", 0, 8) { r, m, _ -> ret(r, m)}

)

private fun ret(r: Registers, m: Ram) {

  val lsb = m.readByte(r.getAndIncrementSP())
  val msb = m.readByte(r.getAndIncrementSP())

  r.PC = bm.bytesToWord(msb, lsb)
}