aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/Registers.kt
blob: e65a37293006f340185f6dde6a548098943a7244 (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
class Registers {

  // General purpose registers
  var B: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }
  var C: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }
  var D: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }
  var E: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }
  var H: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }
  var L: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }

  // Special registers
  var A: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }
  var F: Int = 0
    set(value) {
      validateUnsigned8Bit(value)
      field = value
    }
  var SP: Int = 0
    set(value) {
      validateUnsigned16Bit(value)
      field = value
    }
  var PC: Int = 0
    set(value) {
      validateUnsigned16Bit(value)
      field = value
    }

  // 16-Bit accessors
  var AF: Int
    get() {
      return bytesToWord(A, F)
    }
    set(value) {
      validateUnsigned16Bit(value)
      A = getMsb(value)
      F = getLsb(value)
    }

  var BC: Int
    get() {
      return bytesToWord(B, C)
    }
    set(value) {
      validateUnsigned16Bit(value)
      B = getMsb(value)
      C = getLsb(value)
    }

  var DE: Int
    get() {
      return bytesToWord(D, E)
    }
    set(value) {
      validateUnsigned16Bit(value)
      D = getMsb(value)
      E = getLsb(value)
    }

  var HL: Int
    get() {
      return bytesToWord(H, L)
    }
    set(value) {
      validateUnsigned16Bit(value)
      H = getMsb(value)
      L = getLsb(value)
    }

  private fun bytesToWord(msb: Int, lsb: Int): Int {
    return msb.shl(8) + lsb
  }

  private fun getMsb(value: Int): Int {
    return value.shr(8)
  }

  private fun getLsb(value: Int): Int {
    return value.and(0xFF)
  }

  private fun validateUnsigned8Bit(value: Int) {
    if(value < 0 || value > 255) {
      throw IllegalArgumentException("Value $value is not an unsigned 8-Bit value")
    }
  }

  private fun validateUnsigned16Bit(value: Int) {
    if(value < 0 || value > 65535) {
      throw IllegalArgumentException("Value $value is not an unsigned 16-Bit value")
    }
  }

}