rubyboy 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rubyboy/cpu.rb CHANGED
@@ -21,14 +21,14 @@ module Rubyboy
21
21
  opcode = read_byte(@pc)
22
22
  # print_log(opcode)
23
23
 
24
- @halted &= @interrupt.interrupts.zero?
24
+ @halted &= @interrupt.interrupts == 0
25
25
 
26
26
  return 16 if @halted
27
27
 
28
- if @ime && @interrupt.interrupts.positive?
28
+ if @ime && @interrupt.interrupts > 0
29
29
  pcs = [0x0040, 0x0048, 0x0050, 0x0058, 0x0060]
30
30
  5.times do |i|
31
- next if @interrupt.interrupts[i].zero?
31
+ next if @interrupt.interrupts[i] == 0
32
32
 
33
33
  @interrupt.reset_flag(i)
34
34
  @ime = false
@@ -51,509 +51,509 @@ module Rubyboy
51
51
 
52
52
  case opcode
53
53
  when 0x00 then 4 # NOP
54
- when 0x01 then ld16(Operand.new(type: :register16, value: :bc), Operand.new(type: :immediate16))
55
- when 0x02 then ld8(Operand.new(type: :indirect, value: :bc), Operand.new(type: :register8, value: :a))
56
- when 0x03 then inc16(Operand.new(type: :register16, value: :bc))
57
- when 0x04 then inc8(Operand.new(type: :register8, value: :b))
58
- when 0x05 then dec8(Operand.new(type: :register8, value: :b))
59
- when 0x06 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :immediate8))
54
+ when 0x01 then ld16({ type: :register16, value: :bc }, { type: :immediate16 })
55
+ when 0x02 then ld8({ type: :indirect, value: :bc }, { type: :register8, value: :a })
56
+ when 0x03 then inc16({ type: :register16, value: :bc })
57
+ when 0x04 then inc8({ type: :register8, value: :b })
58
+ when 0x05 then dec8({ type: :register8, value: :b })
59
+ when 0x06 then ld8({ type: :register8, value: :b }, { type: :immediate8 })
60
60
  when 0x07 then rlca
61
- when 0x08 then ld16(Operand.new(type: :direct16), Operand.new(type: :sp))
62
- when 0x09 then add16(Operand.new(type: :register16, value: :hl), Operand.new(type: :register16, value: :bc))
63
- when 0x0a then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :indirect, value: :bc))
64
- when 0x0b then dec16(Operand.new(type: :register16, value: :bc))
65
- when 0x0c then inc8(Operand.new(type: :register8, value: :c))
66
- when 0x0d then dec8(Operand.new(type: :register8, value: :c))
67
- when 0x0e then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :immediate8))
61
+ when 0x08 then ld16({ type: :direct16 }, { type: :sp })
62
+ when 0x09 then add16({ type: :register16, value: :hl }, { type: :register16, value: :bc })
63
+ when 0x0a then ld8({ type: :register8, value: :a }, { type: :indirect, value: :bc })
64
+ when 0x0b then dec16({ type: :register16, value: :bc })
65
+ when 0x0c then inc8({ type: :register8, value: :c })
66
+ when 0x0d then dec8({ type: :register8, value: :c })
67
+ when 0x0e then ld8({ type: :register8, value: :c }, { type: :immediate8 })
68
68
  when 0x0f then rrca
69
69
  when 0x10 then 4 # STOP
70
- when 0x11 then ld16(Operand.new(type: :register16, value: :de), Operand.new(type: :immediate16))
71
- when 0x12 then ld8(Operand.new(type: :indirect, value: :de), Operand.new(type: :register8, value: :a))
72
- when 0x13 then inc16(Operand.new(type: :register16, value: :de))
73
- when 0x14 then inc8(Operand.new(type: :register8, value: :d))
74
- when 0x15 then dec8(Operand.new(type: :register8, value: :d))
75
- when 0x16 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :immediate8))
70
+ when 0x11 then ld16({ type: :register16, value: :de }, { type: :immediate16 })
71
+ when 0x12 then ld8({ type: :indirect, value: :de }, { type: :register8, value: :a })
72
+ when 0x13 then inc16({ type: :register16, value: :de })
73
+ when 0x14 then inc8({ type: :register8, value: :d })
74
+ when 0x15 then dec8({ type: :register8, value: :d })
75
+ when 0x16 then ld8({ type: :register8, value: :d }, { type: :immediate8 })
76
76
  when 0x17 then rla
77
77
  when 0x18 then jr
78
- when 0x19 then add16(Operand.new(type: :register16, value: :hl), Operand.new(type: :register16, value: :de))
79
- when 0x1a then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :indirect, value: :de))
80
- when 0x1b then dec16(Operand.new(type: :register16, value: :de))
81
- when 0x1c then inc8(Operand.new(type: :register8, value: :e))
82
- when 0x1d then dec8(Operand.new(type: :register8, value: :e))
83
- when 0x1e then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :immediate8))
78
+ when 0x19 then add16({ type: :register16, value: :hl }, { type: :register16, value: :de })
79
+ when 0x1a then ld8({ type: :register8, value: :a }, { type: :indirect, value: :de })
80
+ when 0x1b then dec16({ type: :register16, value: :de })
81
+ when 0x1c then inc8({ type: :register8, value: :e })
82
+ when 0x1d then dec8({ type: :register8, value: :e })
83
+ when 0x1e then ld8({ type: :register8, value: :e }, { type: :immediate8 })
84
84
  when 0x1f then rra
85
85
  when 0x20 then jr(condition: !flags[:z])
86
- when 0x21 then ld16(Operand.new(type: :register16, value: :hl), Operand.new(type: :immediate16))
87
- when 0x22 then ld8(Operand.new(type: :hl_inc), Operand.new(type: :register8, value: :a))
88
- when 0x23 then inc16(Operand.new(type: :register16, value: :hl))
89
- when 0x24 then inc8(Operand.new(type: :register8, value: :h))
90
- when 0x25 then dec8(Operand.new(type: :register8, value: :h))
91
- when 0x26 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :immediate8))
86
+ when 0x21 then ld16({ type: :register16, value: :hl }, { type: :immediate16 })
87
+ when 0x22 then ld8({ type: :hl_inc }, { type: :register8, value: :a })
88
+ when 0x23 then inc16({ type: :register16, value: :hl })
89
+ when 0x24 then inc8({ type: :register8, value: :h })
90
+ when 0x25 then dec8({ type: :register8, value: :h })
91
+ when 0x26 then ld8({ type: :register8, value: :h }, { type: :immediate8 })
92
92
  when 0x27 then daa
93
93
  when 0x28 then jr(condition: flags[:z])
94
- when 0x29 then add16(Operand.new(type: :register16, value: :hl), Operand.new(type: :register16, value: :hl))
95
- when 0x2a then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :hl_inc))
96
- when 0x2b then dec16(Operand.new(type: :register16, value: :hl))
97
- when 0x2c then inc8(Operand.new(type: :register8, value: :l))
98
- when 0x2d then dec8(Operand.new(type: :register8, value: :l))
99
- when 0x2e then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :immediate8))
94
+ when 0x29 then add16({ type: :register16, value: :hl }, { type: :register16, value: :hl })
95
+ when 0x2a then ld8({ type: :register8, value: :a }, { type: :hl_inc })
96
+ when 0x2b then dec16({ type: :register16, value: :hl })
97
+ when 0x2c then inc8({ type: :register8, value: :l })
98
+ when 0x2d then dec8({ type: :register8, value: :l })
99
+ when 0x2e then ld8({ type: :register8, value: :l }, { type: :immediate8 })
100
100
  when 0x2f then cpl
101
101
  when 0x30 then jr(condition: !flags[:c])
102
- when 0x31 then ld16(Operand.new(type: :sp), Operand.new(type: :immediate16))
103
- when 0x32 then ld8(Operand.new(type: :hl_dec), Operand.new(type: :register8, value: :a))
104
- when 0x33 then inc16(Operand.new(type: :sp))
105
- when 0x34 then inc8(Operand.new(type: :indirect, value: :hl))
106
- when 0x35 then dec8(Operand.new(type: :indirect, value: :hl))
107
- when 0x36 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :immediate8))
102
+ when 0x31 then ld16({ type: :sp }, { type: :immediate16 })
103
+ when 0x32 then ld8({ type: :hl_dec }, { type: :register8, value: :a })
104
+ when 0x33 then inc16({ type: :sp })
105
+ when 0x34 then inc8({ type: :indirect, value: :hl })
106
+ when 0x35 then dec8({ type: :indirect, value: :hl })
107
+ when 0x36 then ld8({ type: :indirect, value: :hl }, { type: :immediate8 })
108
108
  when 0x37 then scf
109
109
  when 0x38 then jr(condition: flags[:c])
110
- when 0x39 then add16(Operand.new(type: :register16, value: :hl), Operand.new(type: :sp))
111
- when 0x3a then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :hl_dec))
112
- when 0x3b then dec16(Operand.new(type: :sp))
113
- when 0x3c then inc8(Operand.new(type: :register8, value: :a))
114
- when 0x3d then dec8(Operand.new(type: :register8, value: :a))
115
- when 0x3e then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :immediate8))
110
+ when 0x39 then add16({ type: :register16, value: :hl }, { type: :sp })
111
+ when 0x3a then ld8({ type: :register8, value: :a }, { type: :hl_dec })
112
+ when 0x3b then dec16({ type: :sp })
113
+ when 0x3c then inc8({ type: :register8, value: :a })
114
+ when 0x3d then dec8({ type: :register8, value: :a })
115
+ when 0x3e then ld8({ type: :register8, value: :a }, { type: :immediate8 })
116
116
  when 0x3f then ccf
117
- when 0x40 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :register8, value: :b))
118
- when 0x41 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :register8, value: :c))
119
- when 0x42 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :register8, value: :d))
120
- when 0x43 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :register8, value: :e))
121
- when 0x44 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :register8, value: :h))
122
- when 0x45 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :register8, value: :l))
123
- when 0x46 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :indirect, value: :hl))
124
- when 0x47 then ld8(Operand.new(type: :register8, value: :b), Operand.new(type: :register8, value: :a))
125
- when 0x48 then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :register8, value: :b))
126
- when 0x49 then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :register8, value: :c))
127
- when 0x4a then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :register8, value: :d))
128
- when 0x4b then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :register8, value: :e))
129
- when 0x4c then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :register8, value: :h))
130
- when 0x4d then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :register8, value: :l))
131
- when 0x4e then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :indirect, value: :hl))
132
- when 0x4f then ld8(Operand.new(type: :register8, value: :c), Operand.new(type: :register8, value: :a))
133
- when 0x50 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :register8, value: :b))
134
- when 0x51 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :register8, value: :c))
135
- when 0x52 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :register8, value: :d))
136
- when 0x53 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :register8, value: :e))
137
- when 0x54 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :register8, value: :h))
138
- when 0x55 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :register8, value: :l))
139
- when 0x56 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :indirect, value: :hl))
140
- when 0x57 then ld8(Operand.new(type: :register8, value: :d), Operand.new(type: :register8, value: :a))
141
- when 0x58 then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :register8, value: :b))
142
- when 0x59 then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :register8, value: :c))
143
- when 0x5a then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :register8, value: :d))
144
- when 0x5b then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :register8, value: :e))
145
- when 0x5c then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :register8, value: :h))
146
- when 0x5d then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :register8, value: :l))
147
- when 0x5e then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :indirect, value: :hl))
148
- when 0x5f then ld8(Operand.new(type: :register8, value: :e), Operand.new(type: :register8, value: :a))
149
- when 0x60 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :register8, value: :b))
150
- when 0x61 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :register8, value: :c))
151
- when 0x62 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :register8, value: :d))
152
- when 0x63 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :register8, value: :e))
153
- when 0x64 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :register8, value: :h))
154
- when 0x65 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :register8, value: :l))
155
- when 0x66 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :indirect, value: :hl))
156
- when 0x67 then ld8(Operand.new(type: :register8, value: :h), Operand.new(type: :register8, value: :a))
157
- when 0x68 then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :register8, value: :b))
158
- when 0x69 then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :register8, value: :c))
159
- when 0x6a then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :register8, value: :d))
160
- when 0x6b then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :register8, value: :e))
161
- when 0x6c then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :register8, value: :h))
162
- when 0x6d then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :register8, value: :l))
163
- when 0x6e then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :indirect, value: :hl))
164
- when 0x6f then ld8(Operand.new(type: :register8, value: :l), Operand.new(type: :register8, value: :a))
165
- when 0x70 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :register8, value: :b))
166
- when 0x71 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :register8, value: :c))
167
- when 0x72 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :register8, value: :d))
168
- when 0x73 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :register8, value: :e))
169
- when 0x74 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :register8, value: :h))
170
- when 0x75 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :register8, value: :l))
117
+ when 0x40 then ld8({ type: :register8, value: :b }, { type: :register8, value: :b })
118
+ when 0x41 then ld8({ type: :register8, value: :b }, { type: :register8, value: :c })
119
+ when 0x42 then ld8({ type: :register8, value: :b }, { type: :register8, value: :d })
120
+ when 0x43 then ld8({ type: :register8, value: :b }, { type: :register8, value: :e })
121
+ when 0x44 then ld8({ type: :register8, value: :b }, { type: :register8, value: :h })
122
+ when 0x45 then ld8({ type: :register8, value: :b }, { type: :register8, value: :l })
123
+ when 0x46 then ld8({ type: :register8, value: :b }, { type: :indirect, value: :hl })
124
+ when 0x47 then ld8({ type: :register8, value: :b }, { type: :register8, value: :a })
125
+ when 0x48 then ld8({ type: :register8, value: :c }, { type: :register8, value: :b })
126
+ when 0x49 then ld8({ type: :register8, value: :c }, { type: :register8, value: :c })
127
+ when 0x4a then ld8({ type: :register8, value: :c }, { type: :register8, value: :d })
128
+ when 0x4b then ld8({ type: :register8, value: :c }, { type: :register8, value: :e })
129
+ when 0x4c then ld8({ type: :register8, value: :c }, { type: :register8, value: :h })
130
+ when 0x4d then ld8({ type: :register8, value: :c }, { type: :register8, value: :l })
131
+ when 0x4e then ld8({ type: :register8, value: :c }, { type: :indirect, value: :hl })
132
+ when 0x4f then ld8({ type: :register8, value: :c }, { type: :register8, value: :a })
133
+ when 0x50 then ld8({ type: :register8, value: :d }, { type: :register8, value: :b })
134
+ when 0x51 then ld8({ type: :register8, value: :d }, { type: :register8, value: :c })
135
+ when 0x52 then ld8({ type: :register8, value: :d }, { type: :register8, value: :d })
136
+ when 0x53 then ld8({ type: :register8, value: :d }, { type: :register8, value: :e })
137
+ when 0x54 then ld8({ type: :register8, value: :d }, { type: :register8, value: :h })
138
+ when 0x55 then ld8({ type: :register8, value: :d }, { type: :register8, value: :l })
139
+ when 0x56 then ld8({ type: :register8, value: :d }, { type: :indirect, value: :hl })
140
+ when 0x57 then ld8({ type: :register8, value: :d }, { type: :register8, value: :a })
141
+ when 0x58 then ld8({ type: :register8, value: :e }, { type: :register8, value: :b })
142
+ when 0x59 then ld8({ type: :register8, value: :e }, { type: :register8, value: :c })
143
+ when 0x5a then ld8({ type: :register8, value: :e }, { type: :register8, value: :d })
144
+ when 0x5b then ld8({ type: :register8, value: :e }, { type: :register8, value: :e })
145
+ when 0x5c then ld8({ type: :register8, value: :e }, { type: :register8, value: :h })
146
+ when 0x5d then ld8({ type: :register8, value: :e }, { type: :register8, value: :l })
147
+ when 0x5e then ld8({ type: :register8, value: :e }, { type: :indirect, value: :hl })
148
+ when 0x5f then ld8({ type: :register8, value: :e }, { type: :register8, value: :a })
149
+ when 0x60 then ld8({ type: :register8, value: :h }, { type: :register8, value: :b })
150
+ when 0x61 then ld8({ type: :register8, value: :h }, { type: :register8, value: :c })
151
+ when 0x62 then ld8({ type: :register8, value: :h }, { type: :register8, value: :d })
152
+ when 0x63 then ld8({ type: :register8, value: :h }, { type: :register8, value: :e })
153
+ when 0x64 then ld8({ type: :register8, value: :h }, { type: :register8, value: :h })
154
+ when 0x65 then ld8({ type: :register8, value: :h }, { type: :register8, value: :l })
155
+ when 0x66 then ld8({ type: :register8, value: :h }, { type: :indirect, value: :hl })
156
+ when 0x67 then ld8({ type: :register8, value: :h }, { type: :register8, value: :a })
157
+ when 0x68 then ld8({ type: :register8, value: :l }, { type: :register8, value: :b })
158
+ when 0x69 then ld8({ type: :register8, value: :l }, { type: :register8, value: :c })
159
+ when 0x6a then ld8({ type: :register8, value: :l }, { type: :register8, value: :d })
160
+ when 0x6b then ld8({ type: :register8, value: :l }, { type: :register8, value: :e })
161
+ when 0x6c then ld8({ type: :register8, value: :l }, { type: :register8, value: :h })
162
+ when 0x6d then ld8({ type: :register8, value: :l }, { type: :register8, value: :l })
163
+ when 0x6e then ld8({ type: :register8, value: :l }, { type: :indirect, value: :hl })
164
+ when 0x6f then ld8({ type: :register8, value: :l }, { type: :register8, value: :a })
165
+ when 0x70 then ld8({ type: :indirect, value: :hl }, { type: :register8, value: :b })
166
+ when 0x71 then ld8({ type: :indirect, value: :hl }, { type: :register8, value: :c })
167
+ when 0x72 then ld8({ type: :indirect, value: :hl }, { type: :register8, value: :d })
168
+ when 0x73 then ld8({ type: :indirect, value: :hl }, { type: :register8, value: :e })
169
+ when 0x74 then ld8({ type: :indirect, value: :hl }, { type: :register8, value: :h })
170
+ when 0x75 then ld8({ type: :indirect, value: :hl }, { type: :register8, value: :l })
171
171
  when 0x76 then halt
172
- when 0x77 then ld8(Operand.new(type: :indirect, value: :hl), Operand.new(type: :register8, value: :a))
173
- when 0x78 then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :register8, value: :b))
174
- when 0x79 then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :register8, value: :c))
175
- when 0x7a then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :register8, value: :d))
176
- when 0x7b then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :register8, value: :e))
177
- when 0x7c then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :register8, value: :h))
178
- when 0x7d then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :register8, value: :l))
179
- when 0x7e then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :indirect, value: :hl))
180
- when 0x7f then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :register8, value: :a))
181
- when 0x80 then add8(Operand.new(type: :register8, value: :b))
182
- when 0x81 then add8(Operand.new(type: :register8, value: :c))
183
- when 0x82 then add8(Operand.new(type: :register8, value: :d))
184
- when 0x83 then add8(Operand.new(type: :register8, value: :e))
185
- when 0x84 then add8(Operand.new(type: :register8, value: :h))
186
- when 0x85 then add8(Operand.new(type: :register8, value: :l))
187
- when 0x86 then add8(Operand.new(type: :indirect, value: :hl))
188
- when 0x87 then add8(Operand.new(type: :register8, value: :a))
189
- when 0x88 then adc8(Operand.new(type: :register8, value: :b))
190
- when 0x89 then adc8(Operand.new(type: :register8, value: :c))
191
- when 0x8a then adc8(Operand.new(type: :register8, value: :d))
192
- when 0x8b then adc8(Operand.new(type: :register8, value: :e))
193
- when 0x8c then adc8(Operand.new(type: :register8, value: :h))
194
- when 0x8d then adc8(Operand.new(type: :register8, value: :l))
195
- when 0x8e then adc8(Operand.new(type: :indirect, value: :hl))
196
- when 0x8f then adc8(Operand.new(type: :register8, value: :a))
197
- when 0x90 then sub8(Operand.new(type: :register8, value: :b))
198
- when 0x91 then sub8(Operand.new(type: :register8, value: :c))
199
- when 0x92 then sub8(Operand.new(type: :register8, value: :d))
200
- when 0x93 then sub8(Operand.new(type: :register8, value: :e))
201
- when 0x94 then sub8(Operand.new(type: :register8, value: :h))
202
- when 0x95 then sub8(Operand.new(type: :register8, value: :l))
203
- when 0x96 then sub8(Operand.new(type: :indirect, value: :hl))
204
- when 0x97 then sub8(Operand.new(type: :register8, value: :a))
205
- when 0x98 then sbc8(Operand.new(type: :register8, value: :b))
206
- when 0x99 then sbc8(Operand.new(type: :register8, value: :c))
207
- when 0x9a then sbc8(Operand.new(type: :register8, value: :d))
208
- when 0x9b then sbc8(Operand.new(type: :register8, value: :e))
209
- when 0x9c then sbc8(Operand.new(type: :register8, value: :h))
210
- when 0x9d then sbc8(Operand.new(type: :register8, value: :l))
211
- when 0x9e then sbc8(Operand.new(type: :indirect, value: :hl))
212
- when 0x9f then sbc8(Operand.new(type: :register8, value: :a))
213
- when 0xa0 then and8(Operand.new(type: :register8, value: :b))
214
- when 0xa1 then and8(Operand.new(type: :register8, value: :c))
215
- when 0xa2 then and8(Operand.new(type: :register8, value: :d))
216
- when 0xa3 then and8(Operand.new(type: :register8, value: :e))
217
- when 0xa4 then and8(Operand.new(type: :register8, value: :h))
218
- when 0xa5 then and8(Operand.new(type: :register8, value: :l))
219
- when 0xa6 then and8(Operand.new(type: :indirect, value: :hl))
220
- when 0xa7 then and8(Operand.new(type: :register8, value: :a))
221
- when 0xa8 then xor8(Operand.new(type: :register8, value: :b))
222
- when 0xa9 then xor8(Operand.new(type: :register8, value: :c))
223
- when 0xaa then xor8(Operand.new(type: :register8, value: :d))
224
- when 0xab then xor8(Operand.new(type: :register8, value: :e))
225
- when 0xac then xor8(Operand.new(type: :register8, value: :h))
226
- when 0xad then xor8(Operand.new(type: :register8, value: :l))
227
- when 0xae then xor8(Operand.new(type: :indirect, value: :hl))
228
- when 0xaf then xor8(Operand.new(type: :register8, value: :a))
229
- when 0xb0 then or8(Operand.new(type: :register8, value: :b))
230
- when 0xb1 then or8(Operand.new(type: :register8, value: :c))
231
- when 0xb2 then or8(Operand.new(type: :register8, value: :d))
232
- when 0xb3 then or8(Operand.new(type: :register8, value: :e))
233
- when 0xb4 then or8(Operand.new(type: :register8, value: :h))
234
- when 0xb5 then or8(Operand.new(type: :register8, value: :l))
235
- when 0xb6 then or8(Operand.new(type: :indirect, value: :hl))
236
- when 0xb7 then or8(Operand.new(type: :register8, value: :a))
237
- when 0xb8 then cp8(Operand.new(type: :register8, value: :b))
238
- when 0xb9 then cp8(Operand.new(type: :register8, value: :c))
239
- when 0xba then cp8(Operand.new(type: :register8, value: :d))
240
- when 0xbb then cp8(Operand.new(type: :register8, value: :e))
241
- when 0xbc then cp8(Operand.new(type: :register8, value: :h))
242
- when 0xbd then cp8(Operand.new(type: :register8, value: :l))
243
- when 0xbe then cp8(Operand.new(type: :indirect, value: :hl))
244
- when 0xbf then cp8(Operand.new(type: :register8, value: :a))
172
+ when 0x77 then ld8({ type: :indirect, value: :hl }, { type: :register8, value: :a })
173
+ when 0x78 then ld8({ type: :register8, value: :a }, { type: :register8, value: :b })
174
+ when 0x79 then ld8({ type: :register8, value: :a }, { type: :register8, value: :c })
175
+ when 0x7a then ld8({ type: :register8, value: :a }, { type: :register8, value: :d })
176
+ when 0x7b then ld8({ type: :register8, value: :a }, { type: :register8, value: :e })
177
+ when 0x7c then ld8({ type: :register8, value: :a }, { type: :register8, value: :h })
178
+ when 0x7d then ld8({ type: :register8, value: :a }, { type: :register8, value: :l })
179
+ when 0x7e then ld8({ type: :register8, value: :a }, { type: :indirect, value: :hl })
180
+ when 0x7f then ld8({ type: :register8, value: :a }, { type: :register8, value: :a })
181
+ when 0x80 then add8({ type: :register8, value: :b })
182
+ when 0x81 then add8({ type: :register8, value: :c })
183
+ when 0x82 then add8({ type: :register8, value: :d })
184
+ when 0x83 then add8({ type: :register8, value: :e })
185
+ when 0x84 then add8({ type: :register8, value: :h })
186
+ when 0x85 then add8({ type: :register8, value: :l })
187
+ when 0x86 then add8({ type: :indirect, value: :hl })
188
+ when 0x87 then add8({ type: :register8, value: :a })
189
+ when 0x88 then adc8({ type: :register8, value: :b })
190
+ when 0x89 then adc8({ type: :register8, value: :c })
191
+ when 0x8a then adc8({ type: :register8, value: :d })
192
+ when 0x8b then adc8({ type: :register8, value: :e })
193
+ when 0x8c then adc8({ type: :register8, value: :h })
194
+ when 0x8d then adc8({ type: :register8, value: :l })
195
+ when 0x8e then adc8({ type: :indirect, value: :hl })
196
+ when 0x8f then adc8({ type: :register8, value: :a })
197
+ when 0x90 then sub8({ type: :register8, value: :b })
198
+ when 0x91 then sub8({ type: :register8, value: :c })
199
+ when 0x92 then sub8({ type: :register8, value: :d })
200
+ when 0x93 then sub8({ type: :register8, value: :e })
201
+ when 0x94 then sub8({ type: :register8, value: :h })
202
+ when 0x95 then sub8({ type: :register8, value: :l })
203
+ when 0x96 then sub8({ type: :indirect, value: :hl })
204
+ when 0x97 then sub8({ type: :register8, value: :a })
205
+ when 0x98 then sbc8({ type: :register8, value: :b })
206
+ when 0x99 then sbc8({ type: :register8, value: :c })
207
+ when 0x9a then sbc8({ type: :register8, value: :d })
208
+ when 0x9b then sbc8({ type: :register8, value: :e })
209
+ when 0x9c then sbc8({ type: :register8, value: :h })
210
+ when 0x9d then sbc8({ type: :register8, value: :l })
211
+ when 0x9e then sbc8({ type: :indirect, value: :hl })
212
+ when 0x9f then sbc8({ type: :register8, value: :a })
213
+ when 0xa0 then and8({ type: :register8, value: :b })
214
+ when 0xa1 then and8({ type: :register8, value: :c })
215
+ when 0xa2 then and8({ type: :register8, value: :d })
216
+ when 0xa3 then and8({ type: :register8, value: :e })
217
+ when 0xa4 then and8({ type: :register8, value: :h })
218
+ when 0xa5 then and8({ type: :register8, value: :l })
219
+ when 0xa6 then and8({ type: :indirect, value: :hl })
220
+ when 0xa7 then and8({ type: :register8, value: :a })
221
+ when 0xa8 then xor8({ type: :register8, value: :b })
222
+ when 0xa9 then xor8({ type: :register8, value: :c })
223
+ when 0xaa then xor8({ type: :register8, value: :d })
224
+ when 0xab then xor8({ type: :register8, value: :e })
225
+ when 0xac then xor8({ type: :register8, value: :h })
226
+ when 0xad then xor8({ type: :register8, value: :l })
227
+ when 0xae then xor8({ type: :indirect, value: :hl })
228
+ when 0xaf then xor8({ type: :register8, value: :a })
229
+ when 0xb0 then or8({ type: :register8, value: :b })
230
+ when 0xb1 then or8({ type: :register8, value: :c })
231
+ when 0xb2 then or8({ type: :register8, value: :d })
232
+ when 0xb3 then or8({ type: :register8, value: :e })
233
+ when 0xb4 then or8({ type: :register8, value: :h })
234
+ when 0xb5 then or8({ type: :register8, value: :l })
235
+ when 0xb6 then or8({ type: :indirect, value: :hl })
236
+ when 0xb7 then or8({ type: :register8, value: :a })
237
+ when 0xb8 then cp8({ type: :register8, value: :b })
238
+ when 0xb9 then cp8({ type: :register8, value: :c })
239
+ when 0xba then cp8({ type: :register8, value: :d })
240
+ when 0xbb then cp8({ type: :register8, value: :e })
241
+ when 0xbc then cp8({ type: :register8, value: :h })
242
+ when 0xbd then cp8({ type: :register8, value: :l })
243
+ when 0xbe then cp8({ type: :indirect, value: :hl })
244
+ when 0xbf then cp8({ type: :register8, value: :a })
245
245
  when 0xc0 then ret_if(!flags[:z])
246
246
  when 0xc1 then pop16(:bc)
247
- when 0xc2 then jp(Operand.new(type: :immediate16), condition: !flags[:z])
248
- when 0xc3 then jp(Operand.new(type: :immediate16))
249
- when 0xc4 then call16(Operand.new(type: :immediate16), condition: !flags[:z])
247
+ when 0xc2 then jp({ type: :immediate16 }, condition: !flags[:z])
248
+ when 0xc3 then jp({ type: :immediate16 })
249
+ when 0xc4 then call16({ type: :immediate16 }, condition: !flags[:z])
250
250
  when 0xc5 then push16(:bc)
251
- when 0xc6 then add8(Operand.new(type: :immediate8))
251
+ when 0xc6 then add8({ type: :immediate8 })
252
252
  when 0xc7 then rst(0x00)
253
253
  when 0xc8 then ret_if(flags[:z])
254
254
  when 0xc9 then ret
255
- when 0xca then jp(Operand.new(type: :immediate16), condition: flags[:z])
256
- when 0xcc then call16(Operand.new(type: :immediate16), condition: flags[:z])
257
- when 0xcd then call16(Operand.new(type: :immediate16))
258
- when 0xce then adc8(Operand.new(type: :immediate8))
255
+ when 0xca then jp({ type: :immediate16 }, condition: flags[:z])
256
+ when 0xcc then call16({ type: :immediate16 }, condition: flags[:z])
257
+ when 0xcd then call16({ type: :immediate16 })
258
+ when 0xce then adc8({ type: :immediate8 })
259
259
  when 0xcf then rst(0x08)
260
260
  when 0xd0 then ret_if(!flags[:c])
261
261
  when 0xd1 then pop16(:de)
262
- when 0xd2 then jp(Operand.new(type: :immediate16), condition: !flags[:c])
263
- when 0xd4 then call16(Operand.new(type: :immediate16), condition: !flags[:c])
262
+ when 0xd2 then jp({ type: :immediate16 }, condition: !flags[:c])
263
+ when 0xd4 then call16({ type: :immediate16 }, condition: !flags[:c])
264
264
  when 0xd5 then push16(:de)
265
- when 0xd6 then sub8(Operand.new(type: :immediate8))
265
+ when 0xd6 then sub8({ type: :immediate8 })
266
266
  when 0xd7 then rst(0x10)
267
267
  when 0xd8 then ret_if(flags[:c])
268
268
  when 0xd9 then reti
269
- when 0xda then jp(Operand.new(type: :immediate16), condition: flags[:c])
270
- when 0xdc then call16(Operand.new(type: :immediate16), condition: flags[:c])
271
- when 0xde then sbc8(Operand.new(type: :immediate8))
269
+ when 0xda then jp({ type: :immediate16 }, condition: flags[:c])
270
+ when 0xdc then call16({ type: :immediate16 }, condition: flags[:c])
271
+ when 0xde then sbc8({ type: :immediate8 })
272
272
  when 0xdf then rst(0x18)
273
- when 0xe0 then ld8(Operand.new(type: :ff00), Operand.new(type: :register8, value: :a))
273
+ when 0xe0 then ld8({ type: :ff00 }, { type: :register8, value: :a })
274
274
  when 0xe1 then pop16(:hl)
275
- when 0xe2 then ld8(Operand.new(type: :ff00_c), Operand.new(type: :register8, value: :a))
275
+ when 0xe2 then ld8({ type: :ff00_c }, { type: :register8, value: :a })
276
276
  when 0xe5 then push16(:hl)
277
- when 0xe6 then and8(Operand.new(type: :immediate8))
277
+ when 0xe6 then and8({ type: :immediate8 })
278
278
  when 0xe7 then rst(0x20)
279
279
  when 0xe8 then add_sp_r8
280
- when 0xe9 then jp(Operand.new(type: :register16, value: :hl))
281
- when 0xea then ld8(Operand.new(type: :direct8), Operand.new(type: :register8, value: :a))
282
- when 0xee then xor8(Operand.new(type: :immediate8))
280
+ when 0xe9 then jp({ type: :register16, value: :hl })
281
+ when 0xea then ld8({ type: :direct8 }, { type: :register8, value: :a })
282
+ when 0xee then xor8({ type: :immediate8 })
283
283
  when 0xef then rst(0x28)
284
- when 0xf0 then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :ff00))
284
+ when 0xf0 then ld8({ type: :register8, value: :a }, { type: :ff00 })
285
285
  when 0xf1 then pop16(:af)
286
- when 0xf2 then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :ff00_c))
286
+ when 0xf2 then ld8({ type: :register8, value: :a }, { type: :ff00_c })
287
287
  when 0xf3 then di
288
288
  when 0xf5 then push16(:af)
289
- when 0xf6 then or8(Operand.new(type: :immediate8))
289
+ when 0xf6 then or8({ type: :immediate8 })
290
290
  when 0xf7 then rst(0x30)
291
291
  when 0xf8 then ld_hl_sp_r8
292
- when 0xf9 then ld16(Operand.new(type: :sp), Operand.new(type: :register16, value: :hl))
293
- when 0xfa then ld8(Operand.new(type: :register8, value: :a), Operand.new(type: :direct8))
292
+ when 0xf9 then ld16({ type: :sp }, { type: :register16, value: :hl })
293
+ when 0xfa then ld8({ type: :register8, value: :a }, { type: :direct8 })
294
294
  when 0xfb then ei
295
- when 0xfe then cp8(Operand.new(type: :immediate8))
295
+ when 0xfe then cp8({ type: :immediate8 })
296
296
  when 0xff then rst(0x38)
297
297
  when 0xcb # CB prefix
298
298
  opcode = read_byte_and_advance_pc
299
299
 
300
300
  case opcode
301
- when 0x00 then rlc8(Operand.new(type: :register8, value: :b))
302
- when 0x01 then rlc8(Operand.new(type: :register8, value: :c))
303
- when 0x02 then rlc8(Operand.new(type: :register8, value: :d))
304
- when 0x03 then rlc8(Operand.new(type: :register8, value: :e))
305
- when 0x04 then rlc8(Operand.new(type: :register8, value: :h))
306
- when 0x05 then rlc8(Operand.new(type: :register8, value: :l))
307
- when 0x06 then rlc8(Operand.new(type: :indirect, value: :hl))
308
- when 0x07 then rlc8(Operand.new(type: :register8, value: :a))
309
- when 0x08 then rrc8(Operand.new(type: :register8, value: :b))
310
- when 0x09 then rrc8(Operand.new(type: :register8, value: :c))
311
- when 0x0a then rrc8(Operand.new(type: :register8, value: :d))
312
- when 0x0b then rrc8(Operand.new(type: :register8, value: :e))
313
- when 0x0c then rrc8(Operand.new(type: :register8, value: :h))
314
- when 0x0d then rrc8(Operand.new(type: :register8, value: :l))
315
- when 0x0e then rrc8(Operand.new(type: :indirect, value: :hl))
316
- when 0x0f then rrc8(Operand.new(type: :register8, value: :a))
317
- when 0x10 then rl8(Operand.new(type: :register8, value: :b))
318
- when 0x11 then rl8(Operand.new(type: :register8, value: :c))
319
- when 0x12 then rl8(Operand.new(type: :register8, value: :d))
320
- when 0x13 then rl8(Operand.new(type: :register8, value: :e))
321
- when 0x14 then rl8(Operand.new(type: :register8, value: :h))
322
- when 0x15 then rl8(Operand.new(type: :register8, value: :l))
323
- when 0x16 then rl8(Operand.new(type: :indirect, value: :hl))
324
- when 0x17 then rl8(Operand.new(type: :register8, value: :a))
325
- when 0x18 then rr8(Operand.new(type: :register8, value: :b))
326
- when 0x19 then rr8(Operand.new(type: :register8, value: :c))
327
- when 0x1a then rr8(Operand.new(type: :register8, value: :d))
328
- when 0x1b then rr8(Operand.new(type: :register8, value: :e))
329
- when 0x1c then rr8(Operand.new(type: :register8, value: :h))
330
- when 0x1d then rr8(Operand.new(type: :register8, value: :l))
331
- when 0x1e then rr8(Operand.new(type: :indirect, value: :hl))
332
- when 0x1f then rr8(Operand.new(type: :register8, value: :a))
333
- when 0x20 then sla8(Operand.new(type: :register8, value: :b))
334
- when 0x21 then sla8(Operand.new(type: :register8, value: :c))
335
- when 0x22 then sla8(Operand.new(type: :register8, value: :d))
336
- when 0x23 then sla8(Operand.new(type: :register8, value: :e))
337
- when 0x24 then sla8(Operand.new(type: :register8, value: :h))
338
- when 0x25 then sla8(Operand.new(type: :register8, value: :l))
339
- when 0x26 then sla8(Operand.new(type: :indirect, value: :hl))
340
- when 0x27 then sla8(Operand.new(type: :register8, value: :a))
341
- when 0x28 then sra8(Operand.new(type: :register8, value: :b))
342
- when 0x29 then sra8(Operand.new(type: :register8, value: :c))
343
- when 0x2a then sra8(Operand.new(type: :register8, value: :d))
344
- when 0x2b then sra8(Operand.new(type: :register8, value: :e))
345
- when 0x2c then sra8(Operand.new(type: :register8, value: :h))
346
- when 0x2d then sra8(Operand.new(type: :register8, value: :l))
347
- when 0x2e then sra8(Operand.new(type: :indirect, value: :hl))
348
- when 0x2f then sra8(Operand.new(type: :register8, value: :a))
349
- when 0x30 then swap8(Operand.new(type: :register8, value: :b))
350
- when 0x31 then swap8(Operand.new(type: :register8, value: :c))
351
- when 0x32 then swap8(Operand.new(type: :register8, value: :d))
352
- when 0x33 then swap8(Operand.new(type: :register8, value: :e))
353
- when 0x34 then swap8(Operand.new(type: :register8, value: :h))
354
- when 0x35 then swap8(Operand.new(type: :register8, value: :l))
355
- when 0x36 then swap8(Operand.new(type: :indirect, value: :hl))
356
- when 0x37 then swap8(Operand.new(type: :register8, value: :a))
357
- when 0x38 then srl8(Operand.new(type: :register8, value: :b))
358
- when 0x39 then srl8(Operand.new(type: :register8, value: :c))
359
- when 0x3a then srl8(Operand.new(type: :register8, value: :d))
360
- when 0x3b then srl8(Operand.new(type: :register8, value: :e))
361
- when 0x3c then srl8(Operand.new(type: :register8, value: :h))
362
- when 0x3d then srl8(Operand.new(type: :register8, value: :l))
363
- when 0x3e then srl8(Operand.new(type: :indirect, value: :hl))
364
- when 0x3f then srl8(Operand.new(type: :register8, value: :a))
365
- when 0x40 then bit8(0, Operand.new(type: :register8, value: :b))
366
- when 0x41 then bit8(0, Operand.new(type: :register8, value: :c))
367
- when 0x42 then bit8(0, Operand.new(type: :register8, value: :d))
368
- when 0x43 then bit8(0, Operand.new(type: :register8, value: :e))
369
- when 0x44 then bit8(0, Operand.new(type: :register8, value: :h))
370
- when 0x45 then bit8(0, Operand.new(type: :register8, value: :l))
371
- when 0x46 then bit8(0, Operand.new(type: :indirect, value: :hl))
372
- when 0x47 then bit8(0, Operand.new(type: :register8, value: :a))
373
- when 0x48 then bit8(1, Operand.new(type: :register8, value: :b))
374
- when 0x49 then bit8(1, Operand.new(type: :register8, value: :c))
375
- when 0x4a then bit8(1, Operand.new(type: :register8, value: :d))
376
- when 0x4b then bit8(1, Operand.new(type: :register8, value: :e))
377
- when 0x4c then bit8(1, Operand.new(type: :register8, value: :h))
378
- when 0x4d then bit8(1, Operand.new(type: :register8, value: :l))
379
- when 0x4e then bit8(1, Operand.new(type: :indirect, value: :hl))
380
- when 0x4f then bit8(1, Operand.new(type: :register8, value: :a))
381
- when 0x50 then bit8(2, Operand.new(type: :register8, value: :b))
382
- when 0x51 then bit8(2, Operand.new(type: :register8, value: :c))
383
- when 0x52 then bit8(2, Operand.new(type: :register8, value: :d))
384
- when 0x53 then bit8(2, Operand.new(type: :register8, value: :e))
385
- when 0x54 then bit8(2, Operand.new(type: :register8, value: :h))
386
- when 0x55 then bit8(2, Operand.new(type: :register8, value: :l))
387
- when 0x56 then bit8(2, Operand.new(type: :indirect, value: :hl))
388
- when 0x57 then bit8(2, Operand.new(type: :register8, value: :a))
389
- when 0x58 then bit8(3, Operand.new(type: :register8, value: :b))
390
- when 0x59 then bit8(3, Operand.new(type: :register8, value: :c))
391
- when 0x5a then bit8(3, Operand.new(type: :register8, value: :d))
392
- when 0x5b then bit8(3, Operand.new(type: :register8, value: :e))
393
- when 0x5c then bit8(3, Operand.new(type: :register8, value: :h))
394
- when 0x5d then bit8(3, Operand.new(type: :register8, value: :l))
395
- when 0x5e then bit8(3, Operand.new(type: :indirect, value: :hl))
396
- when 0x5f then bit8(3, Operand.new(type: :register8, value: :a))
397
- when 0x60 then bit8(4, Operand.new(type: :register8, value: :b))
398
- when 0x61 then bit8(4, Operand.new(type: :register8, value: :c))
399
- when 0x62 then bit8(4, Operand.new(type: :register8, value: :d))
400
- when 0x63 then bit8(4, Operand.new(type: :register8, value: :e))
401
- when 0x64 then bit8(4, Operand.new(type: :register8, value: :h))
402
- when 0x65 then bit8(4, Operand.new(type: :register8, value: :l))
403
- when 0x66 then bit8(4, Operand.new(type: :indirect, value: :hl))
404
- when 0x67 then bit8(4, Operand.new(type: :register8, value: :a))
405
- when 0x68 then bit8(5, Operand.new(type: :register8, value: :b))
406
- when 0x69 then bit8(5, Operand.new(type: :register8, value: :c))
407
- when 0x6a then bit8(5, Operand.new(type: :register8, value: :d))
408
- when 0x6b then bit8(5, Operand.new(type: :register8, value: :e))
409
- when 0x6c then bit8(5, Operand.new(type: :register8, value: :h))
410
- when 0x6d then bit8(5, Operand.new(type: :register8, value: :l))
411
- when 0x6e then bit8(5, Operand.new(type: :indirect, value: :hl))
412
- when 0x6f then bit8(5, Operand.new(type: :register8, value: :a))
413
- when 0x70 then bit8(6, Operand.new(type: :register8, value: :b))
414
- when 0x71 then bit8(6, Operand.new(type: :register8, value: :c))
415
- when 0x72 then bit8(6, Operand.new(type: :register8, value: :d))
416
- when 0x73 then bit8(6, Operand.new(type: :register8, value: :e))
417
- when 0x74 then bit8(6, Operand.new(type: :register8, value: :h))
418
- when 0x75 then bit8(6, Operand.new(type: :register8, value: :l))
419
- when 0x76 then bit8(6, Operand.new(type: :indirect, value: :hl))
420
- when 0x77 then bit8(6, Operand.new(type: :register8, value: :a))
421
- when 0x78 then bit8(7, Operand.new(type: :register8, value: :b))
422
- when 0x79 then bit8(7, Operand.new(type: :register8, value: :c))
423
- when 0x7a then bit8(7, Operand.new(type: :register8, value: :d))
424
- when 0x7b then bit8(7, Operand.new(type: :register8, value: :e))
425
- when 0x7c then bit8(7, Operand.new(type: :register8, value: :h))
426
- when 0x7d then bit8(7, Operand.new(type: :register8, value: :l))
427
- when 0x7e then bit8(7, Operand.new(type: :indirect, value: :hl))
428
- when 0x7f then bit8(7, Operand.new(type: :register8, value: :a))
429
- when 0x80 then res8(0, Operand.new(type: :register8, value: :b))
430
- when 0x81 then res8(0, Operand.new(type: :register8, value: :c))
431
- when 0x82 then res8(0, Operand.new(type: :register8, value: :d))
432
- when 0x83 then res8(0, Operand.new(type: :register8, value: :e))
433
- when 0x84 then res8(0, Operand.new(type: :register8, value: :h))
434
- when 0x85 then res8(0, Operand.new(type: :register8, value: :l))
435
- when 0x86 then res8(0, Operand.new(type: :indirect, value: :hl))
436
- when 0x87 then res8(0, Operand.new(type: :register8, value: :a))
437
- when 0x88 then res8(1, Operand.new(type: :register8, value: :b))
438
- when 0x89 then res8(1, Operand.new(type: :register8, value: :c))
439
- when 0x8a then res8(1, Operand.new(type: :register8, value: :d))
440
- when 0x8b then res8(1, Operand.new(type: :register8, value: :e))
441
- when 0x8c then res8(1, Operand.new(type: :register8, value: :h))
442
- when 0x8d then res8(1, Operand.new(type: :register8, value: :l))
443
- when 0x8e then res8(1, Operand.new(type: :indirect, value: :hl))
444
- when 0x8f then res8(1, Operand.new(type: :register8, value: :a))
445
- when 0x90 then res8(2, Operand.new(type: :register8, value: :b))
446
- when 0x91 then res8(2, Operand.new(type: :register8, value: :c))
447
- when 0x92 then res8(2, Operand.new(type: :register8, value: :d))
448
- when 0x93 then res8(2, Operand.new(type: :register8, value: :e))
449
- when 0x94 then res8(2, Operand.new(type: :register8, value: :h))
450
- when 0x95 then res8(2, Operand.new(type: :register8, value: :l))
451
- when 0x96 then res8(2, Operand.new(type: :indirect, value: :hl))
452
- when 0x97 then res8(2, Operand.new(type: :register8, value: :a))
453
- when 0x98 then res8(3, Operand.new(type: :register8, value: :b))
454
- when 0x99 then res8(3, Operand.new(type: :register8, value: :c))
455
- when 0x9a then res8(3, Operand.new(type: :register8, value: :d))
456
- when 0x9b then res8(3, Operand.new(type: :register8, value: :e))
457
- when 0x9c then res8(3, Operand.new(type: :register8, value: :h))
458
- when 0x9d then res8(3, Operand.new(type: :register8, value: :l))
459
- when 0x9e then res8(3, Operand.new(type: :indirect, value: :hl))
460
- when 0x9f then res8(3, Operand.new(type: :register8, value: :a))
461
- when 0xa0 then res8(4, Operand.new(type: :register8, value: :b))
462
- when 0xa1 then res8(4, Operand.new(type: :register8, value: :c))
463
- when 0xa2 then res8(4, Operand.new(type: :register8, value: :d))
464
- when 0xa3 then res8(4, Operand.new(type: :register8, value: :e))
465
- when 0xa4 then res8(4, Operand.new(type: :register8, value: :h))
466
- when 0xa5 then res8(4, Operand.new(type: :register8, value: :l))
467
- when 0xa6 then res8(4, Operand.new(type: :indirect, value: :hl))
468
- when 0xa7 then res8(4, Operand.new(type: :register8, value: :a))
469
- when 0xa8 then res8(5, Operand.new(type: :register8, value: :b))
470
- when 0xa9 then res8(5, Operand.new(type: :register8, value: :c))
471
- when 0xaa then res8(5, Operand.new(type: :register8, value: :d))
472
- when 0xab then res8(5, Operand.new(type: :register8, value: :e))
473
- when 0xac then res8(5, Operand.new(type: :register8, value: :h))
474
- when 0xad then res8(5, Operand.new(type: :register8, value: :l))
475
- when 0xae then res8(5, Operand.new(type: :indirect, value: :hl))
476
- when 0xaf then res8(5, Operand.new(type: :register8, value: :a))
477
- when 0xb0 then res8(6, Operand.new(type: :register8, value: :b))
478
- when 0xb1 then res8(6, Operand.new(type: :register8, value: :c))
479
- when 0xb2 then res8(6, Operand.new(type: :register8, value: :d))
480
- when 0xb3 then res8(6, Operand.new(type: :register8, value: :e))
481
- when 0xb4 then res8(6, Operand.new(type: :register8, value: :h))
482
- when 0xb5 then res8(6, Operand.new(type: :register8, value: :l))
483
- when 0xb6 then res8(6, Operand.new(type: :indirect, value: :hl))
484
- when 0xb7 then res8(6, Operand.new(type: :register8, value: :a))
485
- when 0xb8 then res8(7, Operand.new(type: :register8, value: :b))
486
- when 0xb9 then res8(7, Operand.new(type: :register8, value: :c))
487
- when 0xba then res8(7, Operand.new(type: :register8, value: :d))
488
- when 0xbb then res8(7, Operand.new(type: :register8, value: :e))
489
- when 0xbc then res8(7, Operand.new(type: :register8, value: :h))
490
- when 0xbd then res8(7, Operand.new(type: :register8, value: :l))
491
- when 0xbe then res8(7, Operand.new(type: :indirect, value: :hl))
492
- when 0xbf then res8(7, Operand.new(type: :register8, value: :a))
493
- when 0xc0 then set8(0, Operand.new(type: :register8, value: :b))
494
- when 0xc1 then set8(0, Operand.new(type: :register8, value: :c))
495
- when 0xc2 then set8(0, Operand.new(type: :register8, value: :d))
496
- when 0xc3 then set8(0, Operand.new(type: :register8, value: :e))
497
- when 0xc4 then set8(0, Operand.new(type: :register8, value: :h))
498
- when 0xc5 then set8(0, Operand.new(type: :register8, value: :l))
499
- when 0xc6 then set8(0, Operand.new(type: :indirect, value: :hl))
500
- when 0xc7 then set8(0, Operand.new(type: :register8, value: :a))
501
- when 0xc8 then set8(1, Operand.new(type: :register8, value: :b))
502
- when 0xc9 then set8(1, Operand.new(type: :register8, value: :c))
503
- when 0xca then set8(1, Operand.new(type: :register8, value: :d))
504
- when 0xcb then set8(1, Operand.new(type: :register8, value: :e))
505
- when 0xcc then set8(1, Operand.new(type: :register8, value: :h))
506
- when 0xcd then set8(1, Operand.new(type: :register8, value: :l))
507
- when 0xce then set8(1, Operand.new(type: :indirect, value: :hl))
508
- when 0xcf then set8(1, Operand.new(type: :register8, value: :a))
509
- when 0xd0 then set8(2, Operand.new(type: :register8, value: :b))
510
- when 0xd1 then set8(2, Operand.new(type: :register8, value: :c))
511
- when 0xd2 then set8(2, Operand.new(type: :register8, value: :d))
512
- when 0xd3 then set8(2, Operand.new(type: :register8, value: :e))
513
- when 0xd4 then set8(2, Operand.new(type: :register8, value: :h))
514
- when 0xd5 then set8(2, Operand.new(type: :register8, value: :l))
515
- when 0xd6 then set8(2, Operand.new(type: :indirect, value: :hl))
516
- when 0xd7 then set8(2, Operand.new(type: :register8, value: :a))
517
- when 0xd8 then set8(3, Operand.new(type: :register8, value: :b))
518
- when 0xd9 then set8(3, Operand.new(type: :register8, value: :c))
519
- when 0xda then set8(3, Operand.new(type: :register8, value: :d))
520
- when 0xdb then set8(3, Operand.new(type: :register8, value: :e))
521
- when 0xdc then set8(3, Operand.new(type: :register8, value: :h))
522
- when 0xdd then set8(3, Operand.new(type: :register8, value: :l))
523
- when 0xde then set8(3, Operand.new(type: :indirect, value: :hl))
524
- when 0xdf then set8(3, Operand.new(type: :register8, value: :a))
525
- when 0xe0 then set8(4, Operand.new(type: :register8, value: :b))
526
- when 0xe1 then set8(4, Operand.new(type: :register8, value: :c))
527
- when 0xe2 then set8(4, Operand.new(type: :register8, value: :d))
528
- when 0xe3 then set8(4, Operand.new(type: :register8, value: :e))
529
- when 0xe4 then set8(4, Operand.new(type: :register8, value: :h))
530
- when 0xe5 then set8(4, Operand.new(type: :register8, value: :l))
531
- when 0xe6 then set8(4, Operand.new(type: :indirect, value: :hl))
532
- when 0xe7 then set8(4, Operand.new(type: :register8, value: :a))
533
- when 0xe8 then set8(5, Operand.new(type: :register8, value: :b))
534
- when 0xe9 then set8(5, Operand.new(type: :register8, value: :c))
535
- when 0xea then set8(5, Operand.new(type: :register8, value: :d))
536
- when 0xeb then set8(5, Operand.new(type: :register8, value: :e))
537
- when 0xec then set8(5, Operand.new(type: :register8, value: :h))
538
- when 0xed then set8(5, Operand.new(type: :register8, value: :l))
539
- when 0xee then set8(5, Operand.new(type: :indirect, value: :hl))
540
- when 0xef then set8(5, Operand.new(type: :register8, value: :a))
541
- when 0xf0 then set8(6, Operand.new(type: :register8, value: :b))
542
- when 0xf1 then set8(6, Operand.new(type: :register8, value: :c))
543
- when 0xf2 then set8(6, Operand.new(type: :register8, value: :d))
544
- when 0xf3 then set8(6, Operand.new(type: :register8, value: :e))
545
- when 0xf4 then set8(6, Operand.new(type: :register8, value: :h))
546
- when 0xf5 then set8(6, Operand.new(type: :register8, value: :l))
547
- when 0xf6 then set8(6, Operand.new(type: :indirect, value: :hl))
548
- when 0xf7 then set8(6, Operand.new(type: :register8, value: :a))
549
- when 0xf8 then set8(7, Operand.new(type: :register8, value: :b))
550
- when 0xf9 then set8(7, Operand.new(type: :register8, value: :c))
551
- when 0xfa then set8(7, Operand.new(type: :register8, value: :d))
552
- when 0xfb then set8(7, Operand.new(type: :register8, value: :e))
553
- when 0xfc then set8(7, Operand.new(type: :register8, value: :h))
554
- when 0xfd then set8(7, Operand.new(type: :register8, value: :l))
555
- when 0xfe then set8(7, Operand.new(type: :indirect, value: :hl))
556
- when 0xff then set8(7, Operand.new(type: :register8, value: :a))
301
+ when 0x00 then rlc8({ type: :register8, value: :b })
302
+ when 0x01 then rlc8({ type: :register8, value: :c })
303
+ when 0x02 then rlc8({ type: :register8, value: :d })
304
+ when 0x03 then rlc8({ type: :register8, value: :e })
305
+ when 0x04 then rlc8({ type: :register8, value: :h })
306
+ when 0x05 then rlc8({ type: :register8, value: :l })
307
+ when 0x06 then rlc8({ type: :indirect, value: :hl })
308
+ when 0x07 then rlc8({ type: :register8, value: :a })
309
+ when 0x08 then rrc8({ type: :register8, value: :b })
310
+ when 0x09 then rrc8({ type: :register8, value: :c })
311
+ when 0x0a then rrc8({ type: :register8, value: :d })
312
+ when 0x0b then rrc8({ type: :register8, value: :e })
313
+ when 0x0c then rrc8({ type: :register8, value: :h })
314
+ when 0x0d then rrc8({ type: :register8, value: :l })
315
+ when 0x0e then rrc8({ type: :indirect, value: :hl })
316
+ when 0x0f then rrc8({ type: :register8, value: :a })
317
+ when 0x10 then rl8({ type: :register8, value: :b })
318
+ when 0x11 then rl8({ type: :register8, value: :c })
319
+ when 0x12 then rl8({ type: :register8, value: :d })
320
+ when 0x13 then rl8({ type: :register8, value: :e })
321
+ when 0x14 then rl8({ type: :register8, value: :h })
322
+ when 0x15 then rl8({ type: :register8, value: :l })
323
+ when 0x16 then rl8({ type: :indirect, value: :hl })
324
+ when 0x17 then rl8({ type: :register8, value: :a })
325
+ when 0x18 then rr8({ type: :register8, value: :b })
326
+ when 0x19 then rr8({ type: :register8, value: :c })
327
+ when 0x1a then rr8({ type: :register8, value: :d })
328
+ when 0x1b then rr8({ type: :register8, value: :e })
329
+ when 0x1c then rr8({ type: :register8, value: :h })
330
+ when 0x1d then rr8({ type: :register8, value: :l })
331
+ when 0x1e then rr8({ type: :indirect, value: :hl })
332
+ when 0x1f then rr8({ type: :register8, value: :a })
333
+ when 0x20 then sla8({ type: :register8, value: :b })
334
+ when 0x21 then sla8({ type: :register8, value: :c })
335
+ when 0x22 then sla8({ type: :register8, value: :d })
336
+ when 0x23 then sla8({ type: :register8, value: :e })
337
+ when 0x24 then sla8({ type: :register8, value: :h })
338
+ when 0x25 then sla8({ type: :register8, value: :l })
339
+ when 0x26 then sla8({ type: :indirect, value: :hl })
340
+ when 0x27 then sla8({ type: :register8, value: :a })
341
+ when 0x28 then sra8({ type: :register8, value: :b })
342
+ when 0x29 then sra8({ type: :register8, value: :c })
343
+ when 0x2a then sra8({ type: :register8, value: :d })
344
+ when 0x2b then sra8({ type: :register8, value: :e })
345
+ when 0x2c then sra8({ type: :register8, value: :h })
346
+ when 0x2d then sra8({ type: :register8, value: :l })
347
+ when 0x2e then sra8({ type: :indirect, value: :hl })
348
+ when 0x2f then sra8({ type: :register8, value: :a })
349
+ when 0x30 then swap8({ type: :register8, value: :b })
350
+ when 0x31 then swap8({ type: :register8, value: :c })
351
+ when 0x32 then swap8({ type: :register8, value: :d })
352
+ when 0x33 then swap8({ type: :register8, value: :e })
353
+ when 0x34 then swap8({ type: :register8, value: :h })
354
+ when 0x35 then swap8({ type: :register8, value: :l })
355
+ when 0x36 then swap8({ type: :indirect, value: :hl })
356
+ when 0x37 then swap8({ type: :register8, value: :a })
357
+ when 0x38 then srl8({ type: :register8, value: :b })
358
+ when 0x39 then srl8({ type: :register8, value: :c })
359
+ when 0x3a then srl8({ type: :register8, value: :d })
360
+ when 0x3b then srl8({ type: :register8, value: :e })
361
+ when 0x3c then srl8({ type: :register8, value: :h })
362
+ when 0x3d then srl8({ type: :register8, value: :l })
363
+ when 0x3e then srl8({ type: :indirect, value: :hl })
364
+ when 0x3f then srl8({ type: :register8, value: :a })
365
+ when 0x40 then bit8(0, { type: :register8, value: :b })
366
+ when 0x41 then bit8(0, { type: :register8, value: :c })
367
+ when 0x42 then bit8(0, { type: :register8, value: :d })
368
+ when 0x43 then bit8(0, { type: :register8, value: :e })
369
+ when 0x44 then bit8(0, { type: :register8, value: :h })
370
+ when 0x45 then bit8(0, { type: :register8, value: :l })
371
+ when 0x46 then bit8(0, { type: :indirect, value: :hl })
372
+ when 0x47 then bit8(0, { type: :register8, value: :a })
373
+ when 0x48 then bit8(1, { type: :register8, value: :b })
374
+ when 0x49 then bit8(1, { type: :register8, value: :c })
375
+ when 0x4a then bit8(1, { type: :register8, value: :d })
376
+ when 0x4b then bit8(1, { type: :register8, value: :e })
377
+ when 0x4c then bit8(1, { type: :register8, value: :h })
378
+ when 0x4d then bit8(1, { type: :register8, value: :l })
379
+ when 0x4e then bit8(1, { type: :indirect, value: :hl })
380
+ when 0x4f then bit8(1, { type: :register8, value: :a })
381
+ when 0x50 then bit8(2, { type: :register8, value: :b })
382
+ when 0x51 then bit8(2, { type: :register8, value: :c })
383
+ when 0x52 then bit8(2, { type: :register8, value: :d })
384
+ when 0x53 then bit8(2, { type: :register8, value: :e })
385
+ when 0x54 then bit8(2, { type: :register8, value: :h })
386
+ when 0x55 then bit8(2, { type: :register8, value: :l })
387
+ when 0x56 then bit8(2, { type: :indirect, value: :hl })
388
+ when 0x57 then bit8(2, { type: :register8, value: :a })
389
+ when 0x58 then bit8(3, { type: :register8, value: :b })
390
+ when 0x59 then bit8(3, { type: :register8, value: :c })
391
+ when 0x5a then bit8(3, { type: :register8, value: :d })
392
+ when 0x5b then bit8(3, { type: :register8, value: :e })
393
+ when 0x5c then bit8(3, { type: :register8, value: :h })
394
+ when 0x5d then bit8(3, { type: :register8, value: :l })
395
+ when 0x5e then bit8(3, { type: :indirect, value: :hl })
396
+ when 0x5f then bit8(3, { type: :register8, value: :a })
397
+ when 0x60 then bit8(4, { type: :register8, value: :b })
398
+ when 0x61 then bit8(4, { type: :register8, value: :c })
399
+ when 0x62 then bit8(4, { type: :register8, value: :d })
400
+ when 0x63 then bit8(4, { type: :register8, value: :e })
401
+ when 0x64 then bit8(4, { type: :register8, value: :h })
402
+ when 0x65 then bit8(4, { type: :register8, value: :l })
403
+ when 0x66 then bit8(4, { type: :indirect, value: :hl })
404
+ when 0x67 then bit8(4, { type: :register8, value: :a })
405
+ when 0x68 then bit8(5, { type: :register8, value: :b })
406
+ when 0x69 then bit8(5, { type: :register8, value: :c })
407
+ when 0x6a then bit8(5, { type: :register8, value: :d })
408
+ when 0x6b then bit8(5, { type: :register8, value: :e })
409
+ when 0x6c then bit8(5, { type: :register8, value: :h })
410
+ when 0x6d then bit8(5, { type: :register8, value: :l })
411
+ when 0x6e then bit8(5, { type: :indirect, value: :hl })
412
+ when 0x6f then bit8(5, { type: :register8, value: :a })
413
+ when 0x70 then bit8(6, { type: :register8, value: :b })
414
+ when 0x71 then bit8(6, { type: :register8, value: :c })
415
+ when 0x72 then bit8(6, { type: :register8, value: :d })
416
+ when 0x73 then bit8(6, { type: :register8, value: :e })
417
+ when 0x74 then bit8(6, { type: :register8, value: :h })
418
+ when 0x75 then bit8(6, { type: :register8, value: :l })
419
+ when 0x76 then bit8(6, { type: :indirect, value: :hl })
420
+ when 0x77 then bit8(6, { type: :register8, value: :a })
421
+ when 0x78 then bit8(7, { type: :register8, value: :b })
422
+ when 0x79 then bit8(7, { type: :register8, value: :c })
423
+ when 0x7a then bit8(7, { type: :register8, value: :d })
424
+ when 0x7b then bit8(7, { type: :register8, value: :e })
425
+ when 0x7c then bit8(7, { type: :register8, value: :h })
426
+ when 0x7d then bit8(7, { type: :register8, value: :l })
427
+ when 0x7e then bit8(7, { type: :indirect, value: :hl })
428
+ when 0x7f then bit8(7, { type: :register8, value: :a })
429
+ when 0x80 then res8(0, { type: :register8, value: :b })
430
+ when 0x81 then res8(0, { type: :register8, value: :c })
431
+ when 0x82 then res8(0, { type: :register8, value: :d })
432
+ when 0x83 then res8(0, { type: :register8, value: :e })
433
+ when 0x84 then res8(0, { type: :register8, value: :h })
434
+ when 0x85 then res8(0, { type: :register8, value: :l })
435
+ when 0x86 then res8(0, { type: :indirect, value: :hl })
436
+ when 0x87 then res8(0, { type: :register8, value: :a })
437
+ when 0x88 then res8(1, { type: :register8, value: :b })
438
+ when 0x89 then res8(1, { type: :register8, value: :c })
439
+ when 0x8a then res8(1, { type: :register8, value: :d })
440
+ when 0x8b then res8(1, { type: :register8, value: :e })
441
+ when 0x8c then res8(1, { type: :register8, value: :h })
442
+ when 0x8d then res8(1, { type: :register8, value: :l })
443
+ when 0x8e then res8(1, { type: :indirect, value: :hl })
444
+ when 0x8f then res8(1, { type: :register8, value: :a })
445
+ when 0x90 then res8(2, { type: :register8, value: :b })
446
+ when 0x91 then res8(2, { type: :register8, value: :c })
447
+ when 0x92 then res8(2, { type: :register8, value: :d })
448
+ when 0x93 then res8(2, { type: :register8, value: :e })
449
+ when 0x94 then res8(2, { type: :register8, value: :h })
450
+ when 0x95 then res8(2, { type: :register8, value: :l })
451
+ when 0x96 then res8(2, { type: :indirect, value: :hl })
452
+ when 0x97 then res8(2, { type: :register8, value: :a })
453
+ when 0x98 then res8(3, { type: :register8, value: :b })
454
+ when 0x99 then res8(3, { type: :register8, value: :c })
455
+ when 0x9a then res8(3, { type: :register8, value: :d })
456
+ when 0x9b then res8(3, { type: :register8, value: :e })
457
+ when 0x9c then res8(3, { type: :register8, value: :h })
458
+ when 0x9d then res8(3, { type: :register8, value: :l })
459
+ when 0x9e then res8(3, { type: :indirect, value: :hl })
460
+ when 0x9f then res8(3, { type: :register8, value: :a })
461
+ when 0xa0 then res8(4, { type: :register8, value: :b })
462
+ when 0xa1 then res8(4, { type: :register8, value: :c })
463
+ when 0xa2 then res8(4, { type: :register8, value: :d })
464
+ when 0xa3 then res8(4, { type: :register8, value: :e })
465
+ when 0xa4 then res8(4, { type: :register8, value: :h })
466
+ when 0xa5 then res8(4, { type: :register8, value: :l })
467
+ when 0xa6 then res8(4, { type: :indirect, value: :hl })
468
+ when 0xa7 then res8(4, { type: :register8, value: :a })
469
+ when 0xa8 then res8(5, { type: :register8, value: :b })
470
+ when 0xa9 then res8(5, { type: :register8, value: :c })
471
+ when 0xaa then res8(5, { type: :register8, value: :d })
472
+ when 0xab then res8(5, { type: :register8, value: :e })
473
+ when 0xac then res8(5, { type: :register8, value: :h })
474
+ when 0xad then res8(5, { type: :register8, value: :l })
475
+ when 0xae then res8(5, { type: :indirect, value: :hl })
476
+ when 0xaf then res8(5, { type: :register8, value: :a })
477
+ when 0xb0 then res8(6, { type: :register8, value: :b })
478
+ when 0xb1 then res8(6, { type: :register8, value: :c })
479
+ when 0xb2 then res8(6, { type: :register8, value: :d })
480
+ when 0xb3 then res8(6, { type: :register8, value: :e })
481
+ when 0xb4 then res8(6, { type: :register8, value: :h })
482
+ when 0xb5 then res8(6, { type: :register8, value: :l })
483
+ when 0xb6 then res8(6, { type: :indirect, value: :hl })
484
+ when 0xb7 then res8(6, { type: :register8, value: :a })
485
+ when 0xb8 then res8(7, { type: :register8, value: :b })
486
+ when 0xb9 then res8(7, { type: :register8, value: :c })
487
+ when 0xba then res8(7, { type: :register8, value: :d })
488
+ when 0xbb then res8(7, { type: :register8, value: :e })
489
+ when 0xbc then res8(7, { type: :register8, value: :h })
490
+ when 0xbd then res8(7, { type: :register8, value: :l })
491
+ when 0xbe then res8(7, { type: :indirect, value: :hl })
492
+ when 0xbf then res8(7, { type: :register8, value: :a })
493
+ when 0xc0 then set8(0, { type: :register8, value: :b })
494
+ when 0xc1 then set8(0, { type: :register8, value: :c })
495
+ when 0xc2 then set8(0, { type: :register8, value: :d })
496
+ when 0xc3 then set8(0, { type: :register8, value: :e })
497
+ when 0xc4 then set8(0, { type: :register8, value: :h })
498
+ when 0xc5 then set8(0, { type: :register8, value: :l })
499
+ when 0xc6 then set8(0, { type: :indirect, value: :hl })
500
+ when 0xc7 then set8(0, { type: :register8, value: :a })
501
+ when 0xc8 then set8(1, { type: :register8, value: :b })
502
+ when 0xc9 then set8(1, { type: :register8, value: :c })
503
+ when 0xca then set8(1, { type: :register8, value: :d })
504
+ when 0xcb then set8(1, { type: :register8, value: :e })
505
+ when 0xcc then set8(1, { type: :register8, value: :h })
506
+ when 0xcd then set8(1, { type: :register8, value: :l })
507
+ when 0xce then set8(1, { type: :indirect, value: :hl })
508
+ when 0xcf then set8(1, { type: :register8, value: :a })
509
+ when 0xd0 then set8(2, { type: :register8, value: :b })
510
+ when 0xd1 then set8(2, { type: :register8, value: :c })
511
+ when 0xd2 then set8(2, { type: :register8, value: :d })
512
+ when 0xd3 then set8(2, { type: :register8, value: :e })
513
+ when 0xd4 then set8(2, { type: :register8, value: :h })
514
+ when 0xd5 then set8(2, { type: :register8, value: :l })
515
+ when 0xd6 then set8(2, { type: :indirect, value: :hl })
516
+ when 0xd7 then set8(2, { type: :register8, value: :a })
517
+ when 0xd8 then set8(3, { type: :register8, value: :b })
518
+ when 0xd9 then set8(3, { type: :register8, value: :c })
519
+ when 0xda then set8(3, { type: :register8, value: :d })
520
+ when 0xdb then set8(3, { type: :register8, value: :e })
521
+ when 0xdc then set8(3, { type: :register8, value: :h })
522
+ when 0xdd then set8(3, { type: :register8, value: :l })
523
+ when 0xde then set8(3, { type: :indirect, value: :hl })
524
+ when 0xdf then set8(3, { type: :register8, value: :a })
525
+ when 0xe0 then set8(4, { type: :register8, value: :b })
526
+ when 0xe1 then set8(4, { type: :register8, value: :c })
527
+ when 0xe2 then set8(4, { type: :register8, value: :d })
528
+ when 0xe3 then set8(4, { type: :register8, value: :e })
529
+ when 0xe4 then set8(4, { type: :register8, value: :h })
530
+ when 0xe5 then set8(4, { type: :register8, value: :l })
531
+ when 0xe6 then set8(4, { type: :indirect, value: :hl })
532
+ when 0xe7 then set8(4, { type: :register8, value: :a })
533
+ when 0xe8 then set8(5, { type: :register8, value: :b })
534
+ when 0xe9 then set8(5, { type: :register8, value: :c })
535
+ when 0xea then set8(5, { type: :register8, value: :d })
536
+ when 0xeb then set8(5, { type: :register8, value: :e })
537
+ when 0xec then set8(5, { type: :register8, value: :h })
538
+ when 0xed then set8(5, { type: :register8, value: :l })
539
+ when 0xee then set8(5, { type: :indirect, value: :hl })
540
+ when 0xef then set8(5, { type: :register8, value: :a })
541
+ when 0xf0 then set8(6, { type: :register8, value: :b })
542
+ when 0xf1 then set8(6, { type: :register8, value: :c })
543
+ when 0xf2 then set8(6, { type: :register8, value: :d })
544
+ when 0xf3 then set8(6, { type: :register8, value: :e })
545
+ when 0xf4 then set8(6, { type: :register8, value: :h })
546
+ when 0xf5 then set8(6, { type: :register8, value: :l })
547
+ when 0xf6 then set8(6, { type: :indirect, value: :hl })
548
+ when 0xf7 then set8(6, { type: :register8, value: :a })
549
+ when 0xf8 then set8(7, { type: :register8, value: :b })
550
+ when 0xf9 then set8(7, { type: :register8, value: :c })
551
+ when 0xfa then set8(7, { type: :register8, value: :d })
552
+ when 0xfb then set8(7, { type: :register8, value: :e })
553
+ when 0xfc then set8(7, { type: :register8, value: :h })
554
+ when 0xfd then set8(7, { type: :register8, value: :l })
555
+ when 0xfe then set8(7, { type: :indirect, value: :hl })
556
+ when 0xff then set8(7, { type: :register8, value: :a })
557
557
  else
558
558
  raise "unknown opcode: 0xcb 0x#{'%02x' % opcode}"
559
559
  end
@@ -706,7 +706,7 @@ module Rubyboy
706
706
 
707
707
  @registers.write8(:a, a_value)
708
708
  update_flags(
709
- z: @registers.read8(:a).zero?,
709
+ z: @registers.read8(:a) == 0,
710
710
  h: false
711
711
  )
712
712
 
@@ -747,12 +747,12 @@ module Rubyboy
747
747
  value = (get_value(x) + 1) & 0xff
748
748
  set_value(x, value)
749
749
  update_flags(
750
- z: value.zero?,
750
+ z: value == 0,
751
751
  n: false,
752
- h: (value & 0x0f).zero?
752
+ h: (value & 0x0f) == 0
753
753
  )
754
754
 
755
- x.type == :register8 ? 4 : 12
755
+ x[:type] == :register8 ? 4 : 12
756
756
  end
757
757
 
758
758
  def inc16(x)
@@ -765,12 +765,12 @@ module Rubyboy
765
765
  value = (get_value(x) - 1) & 0xff
766
766
  set_value(x, value)
767
767
  update_flags(
768
- z: value.zero?,
768
+ z: value == 0,
769
769
  n: true,
770
770
  h: (value & 0x0f) == 0x0f
771
771
  )
772
772
 
773
- x.type == :register8 ? 4 : 12
773
+ x[:type] == :register8 ? 4 : 12
774
774
  end
775
775
 
776
776
  def dec16(x)
@@ -789,13 +789,13 @@ module Rubyboy
789
789
  a_value += x_value
790
790
  @registers.write8(:a, a_value)
791
791
  update_flags(
792
- z: @registers.read8(:a).zero?,
792
+ z: @registers.read8(:a) == 0,
793
793
  n: false,
794
794
  h: hflag,
795
795
  c: cflag
796
796
  )
797
797
 
798
- x.type == :register8 ? 4 : 8
798
+ x[:type] == :register8 ? 4 : 8
799
799
  end
800
800
 
801
801
  def add16(x, y)
@@ -842,13 +842,13 @@ module Rubyboy
842
842
  a_value -= x_value
843
843
  @registers.write8(:a, a_value)
844
844
  update_flags(
845
- z: a_value.zero?,
845
+ z: a_value == 0,
846
846
  n: true,
847
847
  h: hflag,
848
848
  c: cflag
849
849
  )
850
850
 
851
- x.type == :register8 ? 4 : 8
851
+ x[:type] == :register8 ? 4 : 8
852
852
  end
853
853
 
854
854
  def adc8(x)
@@ -861,13 +861,13 @@ module Rubyboy
861
861
  a_value += x_value + c_value
862
862
  @registers.write8(:a, a_value)
863
863
  update_flags(
864
- z: @registers.read8(:a).zero?,
864
+ z: @registers.read8(:a) == 0,
865
865
  n: false,
866
866
  h: hflag,
867
867
  c: cflag
868
868
  )
869
869
 
870
- x.type == :register8 ? 4 : 8
870
+ x[:type] == :register8 ? 4 : 8
871
871
  end
872
872
 
873
873
  def sbc8(x)
@@ -880,52 +880,52 @@ module Rubyboy
880
880
  a_value -= x_value + c_value
881
881
  @registers.write8(:a, a_value)
882
882
  update_flags(
883
- z: @registers.read8(:a).zero?,
883
+ z: @registers.read8(:a) == 0,
884
884
  n: true,
885
885
  h: hflag,
886
886
  c: cflag
887
887
  )
888
888
 
889
- x.type == :register8 ? 4 : 8
889
+ x[:type] == :register8 ? 4 : 8
890
890
  end
891
891
 
892
892
  def and8(x)
893
893
  a_value = @registers.read8(:a) & get_value(x)
894
894
  @registers.write8(:a, a_value)
895
895
  update_flags(
896
- z: a_value.zero?,
896
+ z: a_value == 0,
897
897
  n: false,
898
898
  h: true,
899
899
  c: false
900
900
  )
901
901
 
902
- x.type == :register8 ? 4 : 8
902
+ x[:type] == :register8 ? 4 : 8
903
903
  end
904
904
 
905
905
  def or8(x)
906
906
  a_value = @registers.read8(:a) | get_value(x)
907
907
  @registers.write8(:a, a_value)
908
908
  update_flags(
909
- z: a_value.zero?,
909
+ z: a_value == 0,
910
910
  n: false,
911
911
  h: false,
912
912
  c: false
913
913
  )
914
914
 
915
- x.type == :register8 ? 4 : 8
915
+ x[:type] == :register8 ? 4 : 8
916
916
  end
917
917
 
918
918
  def xor8(x)
919
919
  a_value = @registers.read8(:a) ^ get_value(x)
920
920
  @registers.write8(:a, a_value)
921
921
  update_flags(
922
- z: a_value.zero?,
922
+ z: a_value == 0,
923
923
  n: false,
924
924
  h: false,
925
925
  c: false
926
926
  )
927
927
 
928
- x.type == :register8 ? 4 : 8
928
+ x[:type] == :register8 ? 4 : 8
929
929
  end
930
930
 
931
931
  def push16(register16)
@@ -953,10 +953,10 @@ module Rubyboy
953
953
  value = get_value(y)
954
954
  set_value(x, value)
955
955
 
956
- return 4 if x.type == :register8 && y.type == :register8
957
- return 12 if x.type == :indirect && y.type == :immediate8
958
- return 12 if x.type == :ff00 || y.type == :ff00
959
- return 16 if x.type == :direct8 || y.type == :direct8
956
+ return 4 if x[:type] == :register8 && y[:type] == :register8
957
+ return 12 if x[:type] == :indirect && y[:type] == :immediate8
958
+ return 12 if x[:type] == :ff00 || y[:type] == :ff00
959
+ return 16 if x[:type] == :direct8 || y[:type] == :direct8
960
960
 
961
961
  8
962
962
  end
@@ -965,8 +965,8 @@ module Rubyboy
965
965
  value = get_value(y)
966
966
  set_value(x, value)
967
967
 
968
- return 8 if y.type == :register16
969
- return 20 if y.type == :sp
968
+ return 8 if y[:type] == :register16
969
+ return 20 if y[:type] == :sp
970
970
 
971
971
  12
972
972
  end
@@ -1013,7 +1013,7 @@ module Rubyboy
1013
1013
  c: cflag
1014
1014
  )
1015
1015
 
1016
- x.type == :register8 ? 4 : 8
1016
+ x[:type] == :register8 ? 4 : 8
1017
1017
  end
1018
1018
 
1019
1019
  def rst(addr)
@@ -1035,7 +1035,7 @@ module Rubyboy
1035
1035
  addr = get_value(x)
1036
1036
  @pc = addr if condition
1037
1037
 
1038
- return 4 if x.type == :register16
1038
+ return 4 if x[:type] == :register16
1039
1039
 
1040
1040
  condition ? 16 : 12
1041
1041
  end
@@ -1074,13 +1074,13 @@ module Rubyboy
1074
1074
  value = (value << 1) | (value >> 7)
1075
1075
  set_value(x, value)
1076
1076
  update_flags(
1077
- z: value.zero?,
1077
+ z: value == 0,
1078
1078
  n: false,
1079
1079
  h: false,
1080
1080
  c: value[0] == 1
1081
1081
  )
1082
1082
 
1083
- x.type == :register8 ? 8 : 16
1083
+ x[:type] == :register8 ? 8 : 16
1084
1084
  end
1085
1085
 
1086
1086
  def rrc8(x)
@@ -1088,13 +1088,13 @@ module Rubyboy
1088
1088
  value = (value >> 1) | (value << 7)
1089
1089
  set_value(x, value)
1090
1090
  update_flags(
1091
- z: value.zero?,
1091
+ z: value == 0,
1092
1092
  n: false,
1093
1093
  h: false,
1094
1094
  c: value[7] == 1
1095
1095
  )
1096
1096
 
1097
- x.type == :register8 ? 8 : 16
1097
+ x[:type] == :register8 ? 8 : 16
1098
1098
  end
1099
1099
 
1100
1100
  def rl8(x)
@@ -1103,13 +1103,13 @@ module Rubyboy
1103
1103
  value = ((value << 1) | bool_to_integer(flags[:c])) & 0xff
1104
1104
  set_value(x, value)
1105
1105
  update_flags(
1106
- z: value.zero?,
1106
+ z: value == 0,
1107
1107
  n: false,
1108
1108
  h: false,
1109
1109
  c: cflag
1110
1110
  )
1111
1111
 
1112
- x.type == :register8 ? 8 : 16
1112
+ x[:type] == :register8 ? 8 : 16
1113
1113
  end
1114
1114
 
1115
1115
  def rr8(x)
@@ -1118,13 +1118,13 @@ module Rubyboy
1118
1118
  value = (value >> 1) | (bool_to_integer(flags[:c]) << 7)
1119
1119
  set_value(x, value)
1120
1120
  update_flags(
1121
- z: value.zero?,
1121
+ z: value == 0,
1122
1122
  n: false,
1123
1123
  h: false,
1124
1124
  c: cflag
1125
1125
  )
1126
1126
 
1127
- x.type == :register8 ? 8 : 16
1127
+ x[:type] == :register8 ? 8 : 16
1128
1128
  end
1129
1129
 
1130
1130
  def sla8(x)
@@ -1134,13 +1134,13 @@ module Rubyboy
1134
1134
  value &= 0xff
1135
1135
  set_value(x, value)
1136
1136
  update_flags(
1137
- z: value.zero?,
1137
+ z: value == 0,
1138
1138
  n: false,
1139
1139
  h: false,
1140
1140
  c: cflag
1141
1141
  )
1142
1142
 
1143
- x.type == :register8 ? 8 : 16
1143
+ x[:type] == :register8 ? 8 : 16
1144
1144
  end
1145
1145
 
1146
1146
  def sra8(x)
@@ -1149,13 +1149,13 @@ module Rubyboy
1149
1149
  value = (value >> 1) | (value[7] << 7)
1150
1150
  set_value(x, value)
1151
1151
  update_flags(
1152
- z: value.zero?,
1152
+ z: value == 0,
1153
1153
  n: false,
1154
1154
  h: false,
1155
1155
  c: cflag
1156
1156
  )
1157
1157
 
1158
- x.type == :register8 ? 8 : 16
1158
+ x[:type] == :register8 ? 8 : 16
1159
1159
  end
1160
1160
 
1161
1161
  def swap8(x)
@@ -1163,13 +1163,13 @@ module Rubyboy
1163
1163
  value = ((value & 0x0f) << 4) | ((value & 0xf0) >> 4)
1164
1164
  set_value(x, value)
1165
1165
  update_flags(
1166
- z: value.zero?,
1166
+ z: value == 0,
1167
1167
  n: false,
1168
1168
  h: false,
1169
1169
  c: false
1170
1170
  )
1171
1171
 
1172
- x.type == :register8 ? 8 : 16
1172
+ x[:type] == :register8 ? 8 : 16
1173
1173
  end
1174
1174
 
1175
1175
  def srl8(x)
@@ -1178,24 +1178,24 @@ module Rubyboy
1178
1178
  value >>= 1
1179
1179
  set_value(x, value)
1180
1180
  update_flags(
1181
- z: value.zero?,
1181
+ z: value == 0,
1182
1182
  n: false,
1183
1183
  h: false,
1184
1184
  c: cflag
1185
1185
  )
1186
1186
 
1187
- x.type == :register8 ? 8 : 16
1187
+ x[:type] == :register8 ? 8 : 16
1188
1188
  end
1189
1189
 
1190
1190
  def bit8(n, x)
1191
1191
  value = get_value(x)
1192
1192
  update_flags(
1193
- z: value[n].zero?,
1193
+ z: value[n] == 0,
1194
1194
  n: false,
1195
1195
  h: true
1196
1196
  )
1197
1197
 
1198
- x.type == :register8 ? 8 : 12
1198
+ x[:type] == :register8 ? 8 : 12
1199
1199
  end
1200
1200
 
1201
1201
  def res8(n, x)
@@ -1203,7 +1203,7 @@ module Rubyboy
1203
1203
  value &= ((~(1 << n)) & 0xff)
1204
1204
  set_value(x, value)
1205
1205
 
1206
- x.type == :register8 ? 8 : 16
1206
+ x[:type] == :register8 ? 8 : 16
1207
1207
  end
1208
1208
 
1209
1209
  def set8(n, x)
@@ -1211,19 +1211,19 @@ module Rubyboy
1211
1211
  value |= (1 << n)
1212
1212
  set_value(x, value)
1213
1213
 
1214
- x.type == :register8 ? 8 : 16
1214
+ x[:type] == :register8 ? 8 : 16
1215
1215
  end
1216
1216
 
1217
1217
  def get_value(operand)
1218
- case operand.type
1219
- when :register8 then @registers.read8(operand.value)
1220
- when :register16 then @registers.read16(operand.value)
1218
+ case operand[:type]
1219
+ when :register8 then @registers.read8(operand[:value])
1220
+ when :register16 then @registers.read16(operand[:value])
1221
1221
  when :sp then @sp
1222
1222
  when :immediate8 then read_byte_and_advance_pc
1223
1223
  when :immediate16 then read_word_and_advance_pc
1224
1224
  when :direct8 then read_byte(read_word_and_advance_pc)
1225
1225
  when :direct16 then read_word(read_word_and_advance_pc)
1226
- when :indirect then read_byte(@registers.read16(operand.value))
1226
+ when :indirect then read_byte(@registers.read16(operand[:value]))
1227
1227
  when :ff00 then read_byte(0xff00 + read_byte_and_advance_pc)
1228
1228
  when :ff00_c then read_byte(0xff00 + @registers.read8(:c))
1229
1229
  when :hl_inc
@@ -1239,13 +1239,13 @@ module Rubyboy
1239
1239
  end
1240
1240
 
1241
1241
  def set_value(operand, value)
1242
- case operand.type
1243
- when :register8 then @registers.write8(operand.value, value)
1244
- when :register16 then @registers.write16(operand.value, value)
1242
+ case operand[:type]
1243
+ when :register8 then @registers.write8(operand[:value], value)
1244
+ when :register16 then @registers.write16(operand[:value], value)
1245
1245
  when :sp then @sp = value & 0xffff
1246
1246
  when :direct8 then write_byte(read_word_and_advance_pc, value)
1247
1247
  when :direct16 then write_word(read_word_and_advance_pc, value)
1248
- when :indirect then write_byte(@registers.read16(operand.value), value)
1248
+ when :indirect then write_byte(@registers.read16(operand[:value]), value)
1249
1249
  when :ff00 then write_byte(0xff00 + read_byte_and_advance_pc, value)
1250
1250
  when :ff00_c then write_byte(0xff00 + @registers.read8(:c), value)
1251
1251
  when :hl_inc