home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 13 / MA_Cover_13.bin / source / c / gbe / cpu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-12  |  175.1 KB  |  7,152 lines

  1. /*
  2.  *  gbe - gameboy emulator
  3.  *  Copyright (C) 1999  Chuck Mason, Steven Fuller
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  18.  *
  19.  *
  20.  *  Chuck Mason <chuckjr@sinclair.net>
  21.  *  Steven Fuller <relnev@atdot.org>
  22.  */
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25.  
  26. #include "rom.h"
  27. #include "mem.h"
  28. #include "cpu.h"
  29. #include "vram.h"
  30. #include "regs.h"
  31. #include "debug.h"
  32. #include "data.h"
  33. #include "joypad.h"
  34.  
  35. void inst_unimplemented();
  36. void inst_cb_unimplemented();
  37.  
  38. void inst_adc_a_a();
  39. void inst_adc_a_b();
  40. void inst_adc_a_c();
  41. void inst_adc_a_d();
  42. void inst_adc_a_e();
  43. void inst_adc_a_h();
  44. void inst_adc_a_hl_indirect();
  45. void inst_adc_a_l();
  46. void inst_adc_a_n();
  47. void inst_add_a_a();
  48. void inst_add_a_b();
  49. void inst_add_a_c();
  50. void inst_add_a_d();
  51. void inst_add_a_e();
  52. void inst_add_a_h();
  53. void inst_add_a_hl_indirect();
  54. void inst_add_a_l();
  55. void inst_add_a_n();
  56. void inst_add_hl_bc();
  57. void inst_add_hl_de();
  58. void inst_add_hl_hl();
  59. void inst_add_hl_sp();
  60. void inst_add_sp_n();
  61. void inst_and_a();
  62. void inst_and_b();
  63. void inst_and_c();
  64. void inst_and_d();
  65. void inst_and_e();
  66. void inst_and_h();
  67. void inst_and_hl_indirect();
  68. void inst_and_l();
  69. void inst_and_n();
  70. void inst_call_c_nn();
  71. void inst_call_nc_nn();
  72. void inst_call_nn();
  73. void inst_call_nz_nn();
  74. void inst_call_z_nn();
  75. void inst_cb();
  76. void inst_cb_bit_0_a();
  77. void inst_cb_bit_0_b();
  78. void inst_cb_bit_0_c();
  79. void inst_cb_bit_0_d();
  80. void inst_cb_bit_0_e();
  81. void inst_cb_bit_0_h();
  82. void inst_cb_bit_0_hl_indirect();
  83. void inst_cb_bit_0_l();
  84. void inst_cb_bit_1_a();
  85. void inst_cb_bit_1_b();
  86. void inst_cb_bit_1_c();
  87. void inst_cb_bit_1_d();
  88. void inst_cb_bit_1_e();
  89. void inst_cb_bit_1_h();
  90. void inst_cb_bit_1_hl_indirect();
  91. void inst_cb_bit_1_l();
  92. void inst_cb_bit_2_a();
  93. void inst_cb_bit_2_b();
  94. void inst_cb_bit_2_c();
  95. void inst_cb_bit_2_d();
  96. void inst_cb_bit_2_e();
  97. void inst_cb_bit_2_h();
  98. void inst_cb_bit_2_hl_indirect();
  99. void inst_cb_bit_2_l();
  100. void inst_cb_bit_3_a();
  101. void inst_cb_bit_3_b();
  102. void inst_cb_bit_3_c();
  103. void inst_cb_bit_3_d();
  104. void inst_cb_bit_3_e();
  105. void inst_cb_bit_3_h();
  106. void inst_cb_bit_3_hl_indirect();
  107. void inst_cb_bit_3_l();
  108. void inst_cb_bit_4_a();
  109. void inst_cb_bit_4_b();
  110. void inst_cb_bit_4_c();
  111. void inst_cb_bit_4_d();
  112. void inst_cb_bit_4_e();
  113. void inst_cb_bit_4_h();
  114. void inst_cb_bit_4_hl_indirect();
  115. void inst_cb_bit_4_l();
  116. void inst_cb_bit_5_a();
  117. void inst_cb_bit_5_b();
  118. void inst_cb_bit_5_c();
  119. void inst_cb_bit_5_d();
  120. void inst_cb_bit_5_e();
  121. void inst_cb_bit_5_h();
  122. void inst_cb_bit_5_hl_indirect();
  123. void inst_cb_bit_5_l();
  124. void inst_cb_bit_6_a();
  125. void inst_cb_bit_6_b();
  126. void inst_cb_bit_6_c();
  127. void inst_cb_bit_6_d();
  128. void inst_cb_bit_6_e();
  129. void inst_cb_bit_6_h();
  130. void inst_cb_bit_6_hl_indirect();
  131. void inst_cb_bit_6_l();
  132. void inst_cb_bit_7_a();
  133. void inst_cb_bit_7_b();
  134. void inst_cb_bit_7_c();
  135. void inst_cb_bit_7_d();
  136. void inst_cb_bit_7_e();
  137. void inst_cb_bit_7_h();
  138. void inst_cb_bit_7_hl_indirect();
  139. void inst_cb_bit_7_l();
  140. void inst_cb_res_0_a();
  141. void inst_cb_res_0_b();
  142. void inst_cb_res_0_c();
  143. void inst_cb_res_0_d();
  144. void inst_cb_res_0_e();
  145. void inst_cb_res_0_h();
  146. void inst_cb_res_0_hl_indirect();
  147. void inst_cb_res_0_l();
  148. void inst_cb_res_1_a();
  149. void inst_cb_res_1_b();
  150. void inst_cb_res_1_c();
  151. void inst_cb_res_1_d();
  152. void inst_cb_res_1_e();
  153. void inst_cb_res_1_h();
  154. void inst_cb_res_1_hl_indirect();
  155. void inst_cb_res_1_l();
  156. void inst_cb_res_2_a();
  157. void inst_cb_res_2_b();
  158. void inst_cb_res_2_c();
  159. void inst_cb_res_2_d();
  160. void inst_cb_res_2_e();
  161. void inst_cb_res_2_h();
  162. void inst_cb_res_2_hl_indirect();
  163. void inst_cb_res_2_l();
  164. void inst_cb_res_3_a();
  165. void inst_cb_res_3_b();
  166. void inst_cb_res_3_c();
  167. void inst_cb_res_3_d();
  168. void inst_cb_res_3_e();
  169. void inst_cb_res_3_h();
  170. void inst_cb_res_3_hl_indirect();
  171. void inst_cb_res_3_l();
  172. void inst_cb_res_4_a();
  173. void inst_cb_res_4_b();
  174. void inst_cb_res_4_c();
  175. void inst_cb_res_4_d();
  176. void inst_cb_res_4_e();
  177. void inst_cb_res_4_h();
  178. void inst_cb_res_4_hl_indirect();
  179. void inst_cb_res_4_l();
  180. void inst_cb_res_5_a();
  181. void inst_cb_res_5_b();
  182. void inst_cb_res_5_c();
  183. void inst_cb_res_5_d();
  184. void inst_cb_res_5_e();
  185. void inst_cb_res_5_h();
  186. void inst_cb_res_5_hl_indirect();
  187. void inst_cb_res_5_l();
  188. void inst_cb_res_6_a();
  189. void inst_cb_res_6_b();
  190. void inst_cb_res_6_c();
  191. void inst_cb_res_6_d();
  192. void inst_cb_res_6_e();
  193. void inst_cb_res_6_h();
  194. void inst_cb_res_6_hl_indirect();
  195. void inst_cb_res_6_l();
  196. void inst_cb_res_7_a();
  197. void inst_cb_res_7_b();
  198. void inst_cb_res_7_c();
  199. void inst_cb_res_7_d();
  200. void inst_cb_res_7_e();
  201. void inst_cb_res_7_h();
  202. void inst_cb_res_7_hl_indirect();
  203. void inst_cb_res_7_l();
  204. void inst_cb_rl_a();
  205. void inst_cb_rl_b();
  206. void inst_cb_rl_c();
  207. void inst_cb_rl_d();
  208. void inst_cb_rl_e();
  209. void inst_cb_rl_h();
  210. void inst_cb_rl_hl_indirect();
  211. void inst_cb_rl_l();
  212. void inst_cb_rlc_a();
  213. void inst_cb_rlc_b();
  214. void inst_cb_rlc_c();
  215. void inst_cb_rlc_d();
  216. void inst_cb_rlc_e();
  217. void inst_cb_rlc_h();
  218. void inst_cb_rlc_hl_indirect();
  219. void inst_cb_rlc_l();
  220. void inst_cb_rr_a();
  221. void inst_cb_rr_b();
  222. void inst_cb_rr_c();
  223. void inst_cb_rr_d();
  224. void inst_cb_rr_e();
  225. void inst_cb_rr_h();
  226. void inst_cb_rr_hl_indirect();
  227. void inst_cb_rr_l();
  228. void inst_cb_rrc_a();
  229. void inst_cb_rrc_b();
  230. void inst_cb_rrc_c();
  231. void inst_cb_rrc_d();
  232. void inst_cb_rrc_e();
  233. void inst_cb_rrc_h();
  234. void inst_cb_rrc_hl_indirect();
  235. void inst_cb_rrc_l();
  236. void inst_cb_set_0_a();
  237. void inst_cb_set_0_b();
  238. void inst_cb_set_0_c();
  239. void inst_cb_set_0_d();
  240. void inst_cb_set_0_e();
  241. void inst_cb_set_0_h();
  242. void inst_cb_set_0_hl_indirect();
  243. void inst_cb_set_0_l();
  244. void inst_cb_set_1_a();
  245. void inst_cb_set_1_b();
  246. void inst_cb_set_1_c();
  247. void inst_cb_set_1_d();
  248. void inst_cb_set_1_e();
  249. void inst_cb_set_1_h();
  250. void inst_cb_set_1_hl_indirect();
  251. void inst_cb_set_1_l();
  252. void inst_cb_set_2_a();
  253. void inst_cb_set_2_b();
  254. void inst_cb_set_2_c();
  255. void inst_cb_set_2_d();
  256. void inst_cb_set_2_e();
  257. void inst_cb_set_2_h();
  258. void inst_cb_set_2_hl_indirect();
  259. void inst_cb_set_2_l();
  260. void inst_cb_set_3_a();
  261. void inst_cb_set_3_b();
  262. void inst_cb_set_3_c();
  263. void inst_cb_set_3_d();
  264. void inst_cb_set_3_e();
  265. void inst_cb_set_3_h();
  266. void inst_cb_set_3_hl_indirect();
  267. void inst_cb_set_3_l();
  268. void inst_cb_set_4_a();
  269. void inst_cb_set_4_b();
  270. void inst_cb_set_4_c();
  271. void inst_cb_set_4_d();
  272. void inst_cb_set_4_e();
  273. void inst_cb_set_4_h();
  274. void inst_cb_set_4_hl_indirect();
  275. void inst_cb_set_4_l();
  276. void inst_cb_set_5_a();
  277. void inst_cb_set_5_b();
  278. void inst_cb_set_5_c();
  279. void inst_cb_set_5_d();
  280. void inst_cb_set_5_e();
  281. void inst_cb_set_5_h();
  282. void inst_cb_set_5_hl_indirect();
  283. void inst_cb_set_5_l();
  284. void inst_cb_set_6_a();
  285. void inst_cb_set_6_b();
  286. void inst_cb_set_6_c();
  287. void inst_cb_set_6_d();
  288. void inst_cb_set_6_e();
  289. void inst_cb_set_6_h();
  290. void inst_cb_set_6_hl_indirect();
  291. void inst_cb_set_6_l();
  292. void inst_cb_set_7_a();
  293. void inst_cb_set_7_b();
  294. void inst_cb_set_7_c();
  295. void inst_cb_set_7_d();
  296. void inst_cb_set_7_e();
  297. void inst_cb_set_7_h();
  298. void inst_cb_set_7_hl_indirect();
  299. void inst_cb_set_7_l();
  300. void inst_cb_sla_a();
  301. void inst_cb_sla_b();
  302. void inst_cb_sla_c();
  303. void inst_cb_sla_d();
  304. void inst_cb_sla_e();
  305. void inst_cb_sla_h();
  306. void inst_cb_sla_hl_indirect();
  307. void inst_cb_sla_l();
  308. void inst_cb_sra_a();
  309. void inst_cb_sra_b();
  310. void inst_cb_sra_c();
  311. void inst_cb_sra_d();
  312. void inst_cb_sra_e();
  313. void inst_cb_sra_h();
  314. void inst_cb_sra_hl_indirect();
  315. void inst_cb_sra_l();
  316. void inst_cb_srl_a();
  317. void inst_cb_srl_b();
  318. void inst_cb_srl_c();
  319. void inst_cb_srl_d();
  320. void inst_cb_srl_e();
  321. void inst_cb_srl_h();
  322. void inst_cb_srl_hl_indirect();
  323. void inst_cb_srl_l();
  324. void inst_cb_swap_a();
  325. void inst_cb_swap_b();
  326. void inst_cb_swap_c();
  327. void inst_cb_swap_d();
  328. void inst_cb_swap_e();
  329. void inst_cb_swap_h();
  330. void inst_cb_swap_hl_indirect();
  331. void inst_cb_swap_l();
  332. void inst_ccf();
  333. void inst_cp_a();
  334. void inst_cp_b();
  335. void inst_cp_c();
  336. void inst_cp_d();
  337. void inst_cp_e();
  338. void inst_cp_h();
  339. void inst_cp_hl_indirect();
  340. void inst_cp_l();
  341. void inst_cp_n();
  342. void inst_cpl();
  343. void inst_daa();
  344. void inst_dec_a();
  345. void inst_dec_b();
  346. void inst_dec_bc();
  347. void inst_dec_c();
  348. void inst_dec_d();
  349. void inst_dec_de();
  350. void inst_dec_e();
  351. void inst_dec_h();
  352. void inst_dec_hl();
  353. void inst_dec_hl_indirect();
  354. void inst_dec_l();
  355. void inst_dec_sp();
  356. void inst_di();
  357. void inst_ei();
  358. void inst_halt();
  359. void inst_inc_a();
  360. void inst_inc_b();
  361. void inst_inc_bc();
  362. void inst_inc_c();
  363. void inst_inc_d();
  364. void inst_inc_de();
  365. void inst_inc_e();
  366. void inst_inc_h();
  367. void inst_inc_hl();
  368. void inst_inc_hl_indirect();
  369. void inst_inc_l();
  370. void inst_inc_sp();
  371. void inst_jp_c_nn();
  372. void inst_jp_hl();
  373. void inst_jp_nc_nn();
  374. void inst_jp_nn();
  375. void inst_jp_nz_nn();
  376. void inst_jp_z_nn();
  377. void inst_jr_c_n();
  378. void inst_jr_n();
  379. void inst_jr_nc_n();
  380. void inst_jr_nz_n();
  381. void inst_jr_z_n();
  382. void inst_ld_a_b();
  383. void inst_ld_a_bc_indirect();
  384. void inst_ld_a_c();
  385. void inst_ld_a_c_indirect();
  386. void inst_ld_a_d();
  387. void inst_ld_a_de_indirect();
  388. void inst_ld_a_e();
  389. void inst_ld_a_ff_n_indirect();
  390. void inst_ld_a_h();
  391. void inst_ld_a_hl_indirect();
  392. void inst_ld_a_hld_indirect();
  393. void inst_ld_a_hli_indirect();
  394. void inst_ld_a_l();
  395. void inst_ld_a_n();
  396. void inst_ld_a_nn_indirect();
  397. void inst_ld_b_a();
  398. void inst_ld_b_c();
  399. void inst_ld_b_d();
  400. void inst_ld_b_e();
  401. void inst_ld_b_h();
  402. void inst_ld_b_hl_indirect();
  403. void inst_ld_b_l();
  404. void inst_ld_b_n();
  405. void inst_ld_bc_indirect_a();
  406. void inst_ld_bc_nn();
  407. void inst_ld_c_a();
  408. void inst_ld_c_b();
  409. void inst_ld_c_d();
  410. void inst_ld_c_e();
  411. void inst_ld_c_h();
  412. void inst_ld_c_hl_indirect();
  413. void inst_ld_c_indirect_a();
  414. void inst_ld_c_l();
  415. void inst_ld_c_n();
  416. void inst_ld_d_a();
  417. void inst_ld_d_b();
  418. void inst_ld_d_c();
  419. void inst_ld_d_e();
  420. void inst_ld_d_h();
  421. void inst_ld_d_hl_indirect();
  422. void inst_ld_d_l();
  423. void inst_ld_d_n();
  424. void inst_ld_de_indirect_a();
  425. void inst_ld_de_nn();
  426. void inst_ld_e_a();
  427. void inst_ld_e_b();
  428. void inst_ld_e_c();
  429. void inst_ld_e_d();
  430. void inst_ld_e_h();
  431. void inst_ld_e_hl_indirect();
  432. void inst_ld_e_l();
  433. void inst_ld_e_n();
  434. void inst_ld_ff_n_indirect_a();
  435. void inst_ld_h_a();
  436. void inst_ld_h_b();
  437. void inst_ld_h_c();
  438. void inst_ld_h_d();
  439. void inst_ld_h_e();
  440. void inst_ld_h_hl_indirect();
  441. void inst_ld_h_l();
  442. void inst_ld_h_n();
  443. void inst_ld_hl_indirect_a();
  444. void inst_ld_hl_indirect_b();
  445. void inst_ld_hl_indirect_c();
  446. void inst_ld_hl_indirect_d();
  447. void inst_ld_hl_indirect_e();
  448. void inst_ld_hl_indirect_h();
  449. void inst_ld_hl_indirect_l();
  450. void inst_ld_hl_indirect_n();
  451. void inst_ld_hl_nn();
  452. void inst_ld_hl_sp_n();
  453. void inst_ld_hld_indirect_a();
  454. void inst_ld_hli_indirect_a();
  455. void inst_ld_l_a();
  456. void inst_ld_l_b();
  457. void inst_ld_l_c();
  458. void inst_ld_l_d();
  459. void inst_ld_l_e();
  460. void inst_ld_l_h();
  461. void inst_ld_l_hl_indirect();
  462. void inst_ld_l_n();
  463. void inst_ld_nn_indirect_a();
  464. void inst_ld_nn_indirect_sp();
  465. void inst_ld_sp_hl();
  466. void inst_ld_sp_nn();
  467. void inst_nop();
  468. void inst_or_a();
  469. void inst_or_b();
  470. void inst_or_c();
  471. void inst_or_d();
  472. void inst_or_e();
  473. void inst_or_h();
  474. void inst_or_hl_indirect();
  475. void inst_or_l();
  476. void inst_or_n();
  477. void inst_pop_af();
  478. void inst_pop_bc();
  479. void inst_pop_de();
  480. void inst_pop_hl();
  481. void inst_push_af();
  482. void inst_push_bc();
  483. void inst_push_de();
  484. void inst_push_hl();
  485. void inst_ret();
  486. void inst_ret_c();
  487. void inst_ret_nc();
  488. void inst_ret_nz();
  489. void inst_ret_z();
  490. void inst_reti();
  491. void inst_rla();
  492. void inst_rlca();
  493. void inst_rra();
  494. void inst_rrca();
  495. void inst_rst_00h();
  496. void inst_rst_08h();
  497. void inst_rst_10h();
  498. void inst_rst_18h();
  499. void inst_rst_20h();
  500. void inst_rst_28h();
  501. void inst_rst_30h();
  502. void inst_rst_38h();
  503. void inst_sbc_a();
  504. void inst_sbc_b();
  505. void inst_sbc_c();
  506. void inst_sbc_d();
  507. void inst_sbc_e();
  508. void inst_sbc_h();
  509. void inst_sbc_hl_indirect();
  510. void inst_sbc_l();
  511. void inst_sbc_n();
  512. void inst_scf();
  513. void inst_stop();
  514. void inst_sub_a();
  515. void inst_sub_b();
  516. void inst_sub_c();
  517. void inst_sub_d();
  518. void inst_sub_e();
  519. void inst_sub_h();
  520. void inst_sub_hl_indirect();
  521. void inst_sub_l();
  522. void inst_sub_n();
  523. void inst_unknown();
  524. void inst_xor_a();
  525. void inst_xor_b();
  526. void inst_xor_c();
  527. void inst_xor_d();
  528. void inst_xor_e();
  529. void inst_xor_h();
  530. void inst_xor_hl_indirect();
  531. void inst_xor_l();
  532. void inst_xor_n();
  533.  
  534. gameboy_proc_t *gameboy_proc = (gameboy_proc_t *)NULL;
  535. static unsigned char current_opcode = 0;
  536.  
  537. typedef struct _gbz80_instruction {
  538.      unsigned char opcode;
  539.      char *name;
  540.      unsigned char operand_size;
  541.      void (*instruction)(void);
  542. } gbz80_instruction;
  543.  
  544. gbz80_instruction gbz80_instructions[] = {
  545.      { 0x00, "NOP", 0, inst_nop },
  546.      { 0x01, "LD BC, $%04X", 2, inst_ld_bc_nn }, 
  547.      { 0x02, "LD (BC), A", 0, inst_ld_bc_indirect_a },
  548.      { 0x03, "INC BC", 0, inst_inc_bc }, 
  549.      { 0x04, "INC B", 0, inst_inc_b }, 
  550.      { 0x05, "DEC B", 0, inst_dec_b }, 
  551.      { 0x06, "LD B, $%02X", 1, inst_ld_b_n }, 
  552.      { 0x07, "RLCA", 0, inst_rlca }, 
  553.      { 0x08, "LD ($%04X), SP", 2, inst_ld_nn_indirect_sp },
  554.      { 0x09, "ADD HL, BC", 0, inst_add_hl_bc }, 
  555.      { 0x0A, "LD A, (BC)", 0, inst_ld_a_bc_indirect }, 
  556.      { 0x0B, "DEC BC", 0, inst_dec_bc }, 
  557.      { 0x0C, "INC C", 0, inst_inc_c }, 
  558.      { 0x0D, "DEC C", 0, inst_dec_c }, 
  559.      { 0x0E, "LD C, $%02X", 1, inst_ld_c_n }, 
  560.      { 0x0F, "RRCA", 0, inst_rrca },
  561.      { 0x10, "STOP", 1, inst_stop },
  562.      { 0x11, "LD DE, $%04X", 2, inst_ld_de_nn }, 
  563.      { 0x12, "LD (DE), A", 0, inst_ld_de_indirect_a }, 
  564.      { 0x13, "INC DE", 0, inst_inc_de }, 
  565.      { 0x14, "INC D", 0, inst_inc_d }, 
  566.      { 0x15, "DEC D", 0, inst_dec_d }, 
  567.      { 0x16, "LD D, $%02X", 1, inst_ld_d_n }, 
  568.      { 0x17, "RLA", 0, inst_rla },
  569.      { 0x18, "JR $%02X", 1, inst_jr_n }, 
  570.      { 0x19, "ADD HL, DE", 0, inst_add_hl_de }, 
  571.      { 0x1A, "LD A,(DE)", 0, inst_ld_a_de_indirect }, 
  572.      { 0x1B, "DEC DE", 0, inst_dec_de }, 
  573.      { 0x1C, "INC E", 0, inst_inc_e }, 
  574.      { 0x1D, "DEC E", 0, inst_dec_e }, 
  575.      { 0x1E, "LD E, $%02X", 1, inst_ld_e_n }, 
  576.      { 0x1F, "RRA", 0, inst_rra },
  577.      { 0x20, "JR NZ,$%02X", 1, inst_jr_nz_n }, 
  578.      { 0x21, "LD HL, $%04X", 2, inst_ld_hl_nn }, 
  579.      { 0x22, "LD (HL+), A", 0, inst_ld_hli_indirect_a }, 
  580.      { 0x23, "INC HL", 0, inst_inc_hl }, 
  581.      { 0x24, "INC H", 0, inst_inc_h }, 
  582.      { 0x25, "DEC H", 0, inst_dec_h }, 
  583.      { 0x26, "LD H, $%02X", 1, inst_ld_h_n }, 
  584.      { 0x27, "DAA", 0, inst_daa },
  585.      { 0x28, "JR Z,$%02X", 1, inst_jr_z_n },
  586.      { 0x29, "ADD HL, HL", 0, inst_add_hl_hl }, 
  587.      { 0x2A, "LD A, (HL+)", 0, inst_ld_a_hli_indirect }, 
  588.      { 0x2B, "DEC HL", 0, inst_dec_hl }, 
  589.      { 0x2C, "INC L", 0, inst_inc_l }, 
  590.      { 0x2D, "DEC L", 0, inst_dec_l }, 
  591.      { 0x2E, "LD L, $%02X", 1, inst_ld_l_n },
  592.      { 0x2F, "CPL", 0, inst_cpl }, 
  593.      { 0x30, "JR NC, $%02X", 1, inst_jr_nc_n }, 
  594.      { 0x31, "LD SP, $%04X", 2, inst_ld_sp_nn }, 
  595.      { 0x32, "LD (HL-), A", 0, inst_ld_hld_indirect_a },  
  596.      { 0x33, "INC SP", 0, inst_inc_sp }, 
  597.      { 0x34, "INC (HL)", 0, inst_inc_hl_indirect }, 
  598.      { 0x35, "DEC (HL)", 0, inst_dec_hl_indirect }, 
  599.      { 0x36, "LD (HL), $%02X", 1, inst_ld_hl_indirect_n }, 
  600.      { 0x37, "SCF", 0, inst_scf },
  601.      { 0x38, "JR C,$%02X", 1, inst_jr_c_n }, 
  602.      { 0x39, "ADD HL, SP", 0, inst_add_hl_sp },
  603.      { 0x3A, "LD A, (HL-)", 0, inst_ld_a_hld_indirect }, 
  604.      { 0x3B, "DEC SP", 0, inst_dec_sp }, 
  605.      { 0x3C, "INC A", 0, inst_inc_a }, 
  606.      { 0x3D, "DEC A", 0, inst_dec_a }, 
  607.      { 0x3E, "LD A, $%02X", 1, inst_ld_a_n }, 
  608.      { 0x3F, "CCF", 0, inst_ccf }, 
  609.      { 0x40, "LD B, B", 0, inst_nop },
  610.      { 0x41, "LD B, C", 0, inst_ld_b_c },
  611.      { 0x42, "LD B, D", 0, inst_ld_b_d },
  612.      { 0x43, "LD B, E", 0, inst_ld_b_e },
  613.      { 0x44, "LD B, H", 0, inst_ld_b_h },
  614.      { 0x45, "LD B, L", 0, inst_ld_b_l },
  615.      { 0x46, "LD B, (HL)", 0, inst_ld_b_hl_indirect },
  616.      { 0x47, "LD B, A", 0, inst_ld_b_a }, 
  617.      { 0x48, "LD C, B", 0, inst_ld_c_b },
  618.      { 0x49, "LD C, C", 0, inst_nop },
  619.      { 0x4A, "LD C, D", 0, inst_ld_c_d },
  620.      { 0x4B, "LD C, E", 0, inst_ld_c_e },
  621.      { 0x4C, "LD C, H", 0, inst_ld_c_h },
  622.      { 0x4D, "LD C, L", 0, inst_ld_c_l }, 
  623.      { 0x4E, "LD C, (HL)", 0, inst_ld_c_hl_indirect },
  624.      { 0x4F, "LD C, A", 0, inst_ld_c_a },
  625.      { 0x50, "LD D, B", 0, inst_ld_d_b },
  626.      { 0x51, "LD D, C", 0, inst_ld_d_c },
  627.      { 0x52, "LD D, D", 0, inst_nop }, 
  628.      { 0x53, "LD D, E", 0, inst_ld_d_e },
  629.      { 0x54, "LD D, H", 0, inst_ld_d_h },
  630.      { 0x55, "LD D, L", 0, inst_ld_d_l },
  631.      { 0x56, "LD D, (HL)", 0, inst_ld_d_hl_indirect }, 
  632.      { 0x57, "LD D, A", 0, inst_ld_d_a }, 
  633.      { 0x58, "LD E, B", 0, inst_ld_e_b }, 
  634.      { 0x59, "LD E, C", 0, inst_ld_e_c },
  635.      { 0x5A, "LD E, D", 0, inst_ld_e_d },
  636.      { 0x5B, "LD E, E", 0, inst_nop }, 
  637.      { 0x5C, "LD E, H", 0, inst_ld_e_h },
  638.      { 0x5D, "LD E, L", 0, inst_ld_e_l },
  639.      { 0x5E, "LD E, (HL)", 0, inst_ld_e_hl_indirect }, 
  640.      { 0x5F, "LD E, A", 0, inst_ld_e_a }, 
  641.      { 0x60, "LD H, B", 0, inst_ld_h_b },
  642.      { 0x61, "LD H, C", 0, inst_ld_h_c },
  643.      { 0x62, "LD H, D", 0, inst_ld_h_d },
  644.      { 0x63, "LD H, E", 0, inst_ld_h_e },
  645.      { 0x64, "LD H, H", 0, inst_nop },
  646.      { 0x65, "LD H, L", 0, inst_ld_h_l },
  647.      { 0x66, "LD H, (HL)", 0, inst_ld_h_hl_indirect }, 
  648.      { 0x67, "LD H, A", 0, inst_ld_h_a },
  649.      { 0x68, "LD L, B", 0, inst_ld_l_b }, 
  650.      { 0x69, "LD L, C", 0, inst_ld_l_c },
  651.      { 0x6A, "LD L, D", 0, inst_ld_l_d },
  652.      { 0x6B, "LD L, E", 0, inst_ld_l_e },
  653.      { 0x6C, "LD L, H", 0, inst_ld_l_h },
  654.      { 0x6D, "LD L, L", 0, inst_nop },
  655.      { 0x6E, "LD L, (HL)", 0, inst_ld_l_hl_indirect },
  656.      { 0x6F, "LD L, A", 0, inst_ld_l_a }, 
  657.      { 0x70, "LD (HL), B", 0, inst_ld_hl_indirect_b }, 
  658.      { 0x71, "LD (HL), C", 0, inst_ld_hl_indirect_c }, 
  659.      { 0x72, "LD (HL), D", 0, inst_ld_hl_indirect_d }, 
  660.      { 0x73, "LD (HL), E", 0, inst_ld_hl_indirect_e },
  661.      { 0x74, "LD (HL), H", 0, inst_ld_hl_indirect_h }, 
  662.      { 0x75, "LD (HL), L", 0, inst_ld_hl_indirect_l }, 
  663.      { 0x76, "HALT", 0, inst_halt },
  664.      { 0x77, "LD (HL), A", 0, inst_ld_hl_indirect_a }, 
  665.      { 0x78, "LD A, B", 0, inst_ld_a_b }, 
  666.      { 0x79, "LD A, C", 0, inst_ld_a_c }, 
  667.      { 0x7A, "LD A, D", 0, inst_ld_a_d }, 
  668.      { 0x7B, "LD A, E", 0, inst_ld_a_e }, 
  669.      { 0x7C, "LD A, H", 0, inst_ld_a_h }, 
  670.      { 0x7D, "LD A, L", 0, inst_ld_a_l }, 
  671.      { 0x7E, "LD A, (HL)", 0, inst_ld_a_hl_indirect }, 
  672.      { 0x7F, "LD A, A", 0, inst_nop }, 
  673.      { 0x80, "ADD A, B", 0, inst_add_a_b }, 
  674.      { 0x81, "ADD A, C", 0, inst_add_a_c }, 
  675.      { 0x82, "ADD A, D", 0, inst_add_a_d },
  676.      { 0x83, "ADD A, E", 0, inst_add_a_e },
  677.      { 0x84, "ADD A, H", 0, inst_add_a_h },
  678.      { 0x85, "ADD A, L", 0, inst_add_a_l },
  679.      { 0x86, "ADD A, (HL)", 0, inst_add_a_hl_indirect }, 
  680.      { 0x87, "ADD A", 0, inst_add_a_a }, 
  681.      { 0x88, "ADC A, B", 0, inst_adc_a_b },
  682.      { 0x89, "ADC A, C", 0, inst_adc_a_c },
  683.      { 0x8A, "ADC A, D", 0, inst_adc_a_d },
  684.      { 0x8B, "ADC A, E", 0, inst_adc_a_e },
  685.      { 0x8C, "ADC A, H", 0, inst_adc_a_h },
  686.      { 0x8D, "ADC A, L", 0, inst_adc_a_l },
  687.      { 0x8E, "ADC A, (HL)", 0, inst_adc_a_hl_indirect }, 
  688.      { 0x8F, "ADC A, A", 0, inst_adc_a_a },
  689.      { 0x90, "SUB B", 0, inst_sub_b },
  690.      { 0x91, "SUB C", 0, inst_sub_c },
  691.      { 0x92, "SUB D", 0, inst_sub_d },
  692.      { 0x93, "SUB E", 0, inst_sub_e },
  693.      { 0x94, "SUB H", 0, inst_sub_h },
  694.      { 0x95, "SUB L", 0, inst_sub_l },
  695.      { 0x96, "SUB (HL)", 0, inst_sub_hl_indirect },
  696.      { 0x97, "SUB A", 0, inst_sub_a },
  697.      { 0x98, "SBC A, B", 0, inst_sbc_b },
  698.      { 0x99, "SBC A, C", 0, inst_sbc_c },
  699.      { 0x9A, "SBC A, D", 0, inst_sbc_d },
  700.      { 0x9B, "SBC A, E", 0, inst_sbc_e },
  701.      { 0x9C, "SBC A, H", 0, inst_sbc_h },
  702.      { 0x9D, "SBC A, L", 0, inst_sbc_l },
  703.      { 0x9E, "SBC A, (HL)", 0, inst_sbc_hl_indirect },
  704.      { 0x9F, "SBC A, A", 0, inst_sbc_a },
  705.      { 0xA0, "AND B", 0, inst_and_b }, 
  706.      { 0xA1, "AND C", 0, inst_and_c }, 
  707.      { 0xA2, "AND D", 0, inst_and_d }, 
  708.      { 0xA3, "AND E", 0, inst_and_e }, 
  709.      { 0xA4, "AND H", 0, inst_and_h }, 
  710.      { 0xA5, "AND L", 0, inst_and_l }, 
  711.      { 0xA6, "AND (HL)", 0, inst_and_hl_indirect }, 
  712.      { 0xA7, "AND A", 0, inst_and_a }, 
  713.      { 0xA8, "XOR B", 0, inst_xor_b }, 
  714.      { 0xA9, "XOR C", 0, inst_xor_c }, 
  715.      { 0xAA, "XOR D", 0, inst_xor_d }, 
  716.      { 0xAB, "XOR E", 0, inst_xor_e }, 
  717.      { 0xAC, "XOR H", 0, inst_xor_h },
  718.      { 0xAD, "XOR L", 0, inst_xor_l },
  719.      { 0xAE, "XOR (HL)", 0, inst_xor_hl_indirect },
  720.      { 0xAF, "XOR A", 0, inst_xor_a },
  721.      { 0xB0, "OR B", 0, inst_or_b }, 
  722.      { 0xB1, "OR C", 0, inst_or_c }, 
  723.      { 0xB2, "OR D", 0, inst_or_d }, 
  724.      { 0xB3, "OR E", 0, inst_or_e }, 
  725.      { 0xB4, "OR H", 0, inst_or_h },
  726.      { 0xB5, "OR L", 0, inst_or_l },
  727.      { 0xB6, "OR (HL)", 0, inst_or_hl_indirect }, 
  728.      { 0xB7, "OR A", 0, inst_or_a }, 
  729.      { 0xB8, "CP B", 0, inst_cp_b }, 
  730.      { 0xB9, "CP C", 0, inst_cp_c },
  731.      { 0xBA, "CP D", 0, inst_cp_d }, 
  732.      { 0xBB, "CP E", 0, inst_cp_e },
  733.      { 0xBC, "CP H", 0, inst_cp_h },
  734.      { 0xBD, "CP L", 0, inst_cp_l },
  735.      { 0xBE, "CP (HL)", 0, inst_cp_hl_indirect }, 
  736.      { 0xBF, "CP A", 0, inst_cp_a },
  737.      { 0xC0, "RET NZ", 0, inst_ret_nz }, 
  738.      { 0xC1, "POP BC", 0, inst_pop_bc },  
  739.      { 0xC2, "JP NZ, $%04X", 2, inst_jp_nz_nn },
  740.      { 0xC3, "JP $%04X", 2, inst_jp_nn },
  741.      { 0xC4, "CALL NZ, $%04X", 2, inst_call_nz_nn }, 
  742.      { 0xC5, "PUSH BC", 0, inst_push_bc }, 
  743.      { 0xC6, "ADD A, $%02X", 1, inst_add_a_n }, 
  744.      { 0xC7, "RST $00", 0, inst_rst_00h },
  745.      { 0xC8, "RET Z", 0, inst_ret_z }, 
  746.      { 0xC9, "RET", 0, inst_ret }, 
  747.      { 0xCA, "JP Z,$%04X", 2, inst_jp_z_nn }, 
  748.      { 0xCB, "CB%02X", 1, inst_cb },  
  749.      { 0xCC, "CALL Z, $%04X", 2, inst_call_z_nn }, 
  750.      { 0xCD, "CALL $%04X", 2, inst_call_nn }, 
  751.      { 0xCE, "ADC A, $%02X", 1, inst_adc_a_n },
  752.      { 0xCF, "RST $08", 0, inst_rst_08h },
  753.      { 0xD0, "RET NC", 0, inst_ret_nc }, 
  754.      { 0xD1, "POP DE", 0, inst_pop_de }, 
  755.      { 0xD2, "JP NC, $%04X", 2, inst_jp_nc_nn },
  756.      { 0xD3, "UNKNOWN", 0, inst_unknown },
  757.      { 0xD4, "CALL NC, $%04X", 2, inst_call_nc_nn }, 
  758.      { 0xD5, "PUSH DE", 0, inst_push_de }, 
  759.      { 0xD6, "SUB $%02X", 1, inst_sub_n },
  760.      { 0xD7, "RST $10", 0, inst_rst_10h },
  761.      { 0xD8, "RET C", 0, inst_ret_c },
  762.      { 0xD9, "RETI", 0, inst_reti },
  763.      { 0xDA, "JP C, $%04X", 2, inst_jp_c_nn }, 
  764.      { 0xDB, "UNKNOWN", 0, inst_unknown },
  765.      { 0xDC, "CALL C, $%04X", 2, inst_call_c_nn }, 
  766.      { 0xDD, "UNKNOWN", 0, inst_unknown },
  767.      { 0xDE, "SBC A, $%02X", 1, inst_sbc_n },
  768.      { 0xDF, "RST $18", 0, inst_rst_18h },
  769.      { 0xE0, "LD ($FF00 + $%02X), A", 1, inst_ld_ff_n_indirect_a }, 
  770.      { 0xE1, "POP HL", 0, inst_pop_hl }, 
  771.      { 0xE2, "LD ($FF00 + C), A", 0, inst_ld_c_indirect_a }, 
  772.      { 0xE3, "UNKNOWN", 0, inst_unknown },
  773.      { 0xE4, "UNKNOWN", 0, inst_unknown },
  774.      { 0xE5, "PUSH HL", 0, inst_push_hl }, 
  775.      { 0xE6, "AND $%02X", 1, inst_and_n },
  776.      { 0xE7, "RST $20", 0, inst_rst_20h }, 
  777.      { 0xE8, "ADD SP,$%02X", 1, inst_add_sp_n }, 
  778.      { 0xE9, "JP HL", 0, inst_jp_hl }, 
  779.      { 0xEA, "LD ($%04X), A", 2, inst_ld_nn_indirect_a }, 
  780.      { 0xEB, "UNKNOWN", 0, inst_unknown },
  781.      { 0xEC, "UNKNOWN", 0, inst_unknown },
  782.      { 0xED, "UNKNOWN", 0, inst_unknown },
  783.      { 0xEE, "XOR $%02X", 1, inst_xor_n },
  784.      { 0xEF, "RST $28", 0, inst_rst_28h }, 
  785.      { 0xF0, "LD A, ($FF00 + $%02X)", 1, inst_ld_a_ff_n_indirect }, 
  786.      { 0xF1, "POP AF", 0, inst_pop_af }, 
  787.      { 0xF2, "LD A, ($FF00 + C)", 0, inst_ld_a_c_indirect },
  788.      { 0xF3, "DI", 0, inst_di }, 
  789.      { 0xF4, "UNKNOWN", 0, inst_unknown },
  790.      { 0xF5, "PUSH AF", 0, inst_push_af }, 
  791.      { 0xF6, "OR $%02X", 1, inst_or_n }, 
  792.      { 0xF7, "RST $30", 0, inst_rst_30h },
  793.      { 0xF8, "LD HL, SP+$%02X", 1, inst_ld_hl_sp_n }, 
  794.      { 0xF9, "LD SP, HL", 0, inst_ld_sp_hl },
  795.      { 0xFA, "LD A, ($%04X)", 2, inst_ld_a_nn_indirect }, 
  796.      { 0xFB, "EI", 0, inst_ei }, 
  797.      { 0xFC, "UNKNOWN", 0, inst_unknown },
  798.      { 0xFD, "UNKNOWN", 0, inst_unknown },
  799.      { 0xFE, "CP $%02X", 1, inst_cp_n }, 
  800.      { 0xFF, "RST $38", 0, inst_rst_38h },
  801.      { 0, (char *)NULL, 0, (void *)NULL }
  802. };
  803.  
  804. gbz80_instruction gbz80_cb_instructions[] = {
  805.      { 0x00, "RLC B", 0, inst_cb_rlc_b },
  806.      { 0x01, "RLC C", 0, inst_cb_rlc_c },
  807.      { 0x02, "RLC D", 0, inst_cb_rlc_d },
  808.      { 0x03, "RLC E", 0, inst_cb_rlc_e },
  809.      { 0x04, "RLC H", 0, inst_cb_rlc_h },
  810.      { 0x05, "RLC L", 0, inst_cb_rlc_l },
  811.      { 0x06, "RLC (HL)", 0, inst_cb_rlc_hl_indirect },
  812.      { 0x07, "RLC A", 0, inst_cb_rlc_a },
  813.      { 0x08, "RRC B", 0, inst_cb_rrc_b },
  814.      { 0x09, "RRC C", 0, inst_cb_rrc_c },
  815.      { 0x0A, "RRC D", 0, inst_cb_rrc_d },
  816.      { 0x0B, "RRC E", 0, inst_cb_rrc_e },
  817.      { 0x0C, "RRC H", 0, inst_cb_rrc_h },
  818.      { 0x0D, "RRC L", 0, inst_cb_rrc_l },
  819.      { 0x0E, "RRC (HL)", 0, inst_cb_rrc_hl_indirect },
  820.      { 0x0F, "RRC A", 0, inst_cb_rrc_a },
  821.      { 0x10, "RL B", 0, inst_cb_rl_b },
  822.      { 0x11, "RL C", 0, inst_cb_rl_c },
  823.      { 0x12, "RL D", 0, inst_cb_rl_d }, 
  824.      { 0x13, "RL E", 0, inst_cb_rl_e },
  825.      { 0x14, "RL H", 0, inst_cb_rl_h },
  826.      { 0x15, "RL L", 0, inst_cb_rl_l },
  827.      { 0x16, "RL (HL)", 0, inst_cb_rl_hl_indirect },
  828.      { 0x17, "RL A", 0, inst_cb_rl_a },
  829.      { 0x18, "RR B", 0, inst_cb_rr_b },
  830.      { 0x19, "RR C", 0, inst_cb_rr_c },
  831.      { 0x1A, "RR D", 0, inst_cb_rr_d },
  832.      { 0x1B, "RR E", 0, inst_cb_rr_e },
  833.      { 0x1C, "RR H", 0, inst_cb_rr_h },
  834.      { 0x1D, "RR L", 0, inst_cb_rr_l },
  835.      { 0x1E, "RR (HL)", 0, inst_cb_rr_hl_indirect },
  836.      { 0x1F, "RR A", 0, inst_cb_rr_a },
  837.      { 0x20, "SLA B", 0, inst_cb_sla_b },
  838.      { 0x21, "SLA C", 0, inst_cb_sla_c },
  839.      { 0x22, "SLA D", 0, inst_cb_sla_d },
  840.      { 0x23, "SLA E", 0, inst_cb_sla_e },
  841.      { 0x24, "SLA H", 0, inst_cb_sla_h },
  842.      { 0x25, "SLA L", 0, inst_cb_sla_l },
  843.      { 0x26, "SLA (HL)", 0, inst_cb_sla_hl_indirect },
  844.      { 0x27, "SLA A", 0, inst_cb_sla_a }, 
  845.      { 0x28, "SRA B", 0, inst_cb_sra_b },
  846.      { 0x29, "SRA C", 0, inst_cb_sra_c },
  847.      { 0x2A, "SRA D", 0, inst_cb_sra_d },
  848.      { 0x2B, "SRA E", 0, inst_cb_sra_e },
  849.      { 0x2C, "SRA H", 0, inst_cb_sra_h },
  850.      { 0x2D, "SRA L", 0, inst_cb_sra_l },
  851.      { 0x2E, "SRA (HL)", 0, inst_cb_sra_hl_indirect },
  852.      { 0x2F, "SRA A", 0, inst_cb_sra_a },
  853.      { 0x30, "SWAP B", 0, inst_cb_swap_b },
  854.      { 0x31, "SWAP C", 0, inst_cb_swap_c },
  855.      { 0x32, "SWAP D", 0, inst_cb_swap_d },
  856.      { 0x33, "SWAP E", 0, inst_cb_swap_e },
  857.      { 0x34, "SWAP H", 0, inst_cb_swap_h },
  858.      { 0x35, "SWAP L", 0, inst_cb_swap_l },
  859.      { 0x36, "SWAP (HL)", 0, inst_cb_swap_hl_indirect },
  860.      { 0x37, "SWAP A", 0, inst_cb_swap_a }, 
  861.      { 0x38, "SRL B", 0, inst_cb_srl_b },
  862.      { 0x39, "SRL C", 0, inst_cb_srl_c },
  863.      { 0x3A, "SRL D", 0, inst_cb_srl_d },
  864.      { 0x3B, "SRL E", 0, inst_cb_srl_e },
  865.      { 0x3C, "SRL H", 0, inst_cb_srl_h },
  866.      { 0x3D, "SRL L", 0, inst_cb_srl_l },
  867.      { 0x3E, "SRL (HL)", 0, inst_cb_srl_hl_indirect },
  868.      { 0x3F, "SRL A", 0, inst_cb_srl_a },
  869.      { 0x40, "BIT 0, B", 0, inst_cb_bit_0_b },
  870.      { 0x41, "BIT 0, C", 0, inst_cb_bit_0_c },
  871.      { 0x42, "BIT 0, D", 0, inst_cb_bit_0_d },
  872.      { 0x43, "BIT 0, E", 0, inst_cb_bit_0_e },
  873.      { 0x44, "BIT 0, H", 0, inst_cb_bit_0_h },
  874.      { 0x45, "BIT 0, L", 0, inst_cb_bit_0_l }, 
  875.      { 0x46, "BIT 0, (HL)", 0, inst_cb_bit_0_hl_indirect },
  876.      { 0x47, "BIT 0, A", 0, inst_cb_bit_0_a }, 
  877.      { 0x48, "BIT 1, B", 0, inst_cb_bit_1_b },
  878.      { 0x49, "BIT 1, C", 0, inst_cb_bit_1_c },
  879.      { 0x4A, "BIT 1, D", 0, inst_cb_bit_1_d },
  880.      { 0x4B, "BIT 1, E", 0, inst_cb_bit_1_e },
  881.      { 0x4C, "BIT 1, H", 0, inst_cb_bit_1_h },
  882.      { 0x4D, "BIT 1, L", 0, inst_cb_bit_1_l },
  883.      { 0x4E, "BIT 1, (HL)", 0, inst_cb_bit_1_hl_indirect }, 
  884.      { 0x4F, "BIT 1, A", 0, inst_cb_bit_1_a },
  885.      { 0x50, "BIT 2, B", 0, inst_cb_bit_2_b },
  886.      { 0x51, "BIT 2, C", 0, inst_cb_bit_2_c },
  887.      { 0x52, "BIT 2, D", 0, inst_cb_bit_2_d },
  888.      { 0x53, "BIT 2, E", 0, inst_cb_bit_2_e },
  889.      { 0x54, "BIT 2, H", 0, inst_cb_bit_2_h },
  890.      { 0x55, "BIT 2, L", 0, inst_cb_bit_2_l },
  891.      { 0x56, "BIT 2, (HL)", 0, inst_cb_bit_2_hl_indirect },
  892.      { 0x57, "BIT 2, A", 0, inst_cb_bit_2_a },
  893.      { 0x58, "BIT 3, B", 0, inst_cb_bit_3_b },
  894.      { 0x59, "BIT 3, C", 0, inst_cb_bit_3_c },
  895.      { 0x5A, "BIT 3, D", 0, inst_cb_bit_3_d },
  896.      { 0x5B, "BIT 3, E", 0, inst_cb_bit_3_e },
  897.      { 0x5C, "BIT 3, H", 0, inst_cb_bit_3_h },
  898.      { 0x5D, "BIT 3, L", 0, inst_cb_bit_3_l }, 
  899.      { 0x5E, "BIT 3, (HL)", 0, inst_cb_bit_3_hl_indirect },
  900.      { 0x5F, "BIT 3, A", 0, inst_cb_bit_3_a }, 
  901.      { 0x60, "BIT 4, B", 0, inst_cb_bit_4_b },
  902.      { 0x61, "BIT 4, C", 0, inst_cb_bit_4_c },
  903.      { 0x62, "BIT 4, D", 0, inst_cb_bit_4_d },
  904.      { 0x63, "BIT 4, E", 0, inst_cb_bit_4_e },
  905.      { 0x64, "BIT 4, H", 0, inst_cb_bit_4_h },
  906.      { 0x65, "BIT 4, L", 0, inst_cb_bit_4_l }, 
  907.      { 0x66, "BIT 4, (HL)", 0, inst_cb_bit_4_hl_indirect },
  908.      { 0x67, "BIT 4, A", 0, inst_cb_bit_4_a },
  909.      { 0x68, "BIT 5, B", 0, inst_cb_bit_5_b },
  910.      { 0x69, "BIT 5, C", 0, inst_cb_bit_5_c }, 
  911.      { 0x6A, "BIT 5, D", 0, inst_cb_bit_5_d },
  912.      { 0x6B, "BIT 5, E", 0, inst_cb_bit_5_e },
  913.      { 0x6C, "BIT 6, H", 0, inst_cb_bit_5_h },
  914.      { 0x6D, "BIT 6, L", 0, inst_cb_bit_5_l },
  915.      { 0x6E, "BIT 5, (HL)", 0, inst_cb_bit_5_hl_indirect },
  916.      { 0x6F, "BIT 5, A", 0, inst_cb_bit_5_a },
  917.      { 0x70, "BIT 6, B", 0, inst_cb_bit_6_b },
  918.      { 0x71, "BIT 6, C", 0, inst_cb_bit_6_c },
  919.      { 0x72, "BIT 6, D", 0, inst_cb_bit_6_d },
  920.      { 0x73, "BIT 6, E", 0, inst_cb_bit_6_e },
  921.      { 0x74, "BIT 6, H", 0, inst_cb_bit_6_h },
  922.      { 0x75, "BIT 6, L", 0, inst_cb_bit_6_l }, 
  923.      { 0x76, "BIT 6, (HL)", 0, inst_cb_bit_6_hl_indirect },
  924.      { 0x77, "BIT 6, A", 0, inst_cb_bit_6_a },
  925.      { 0x78, "BIT 7, B", 0, inst_cb_bit_7_b },
  926.      { 0x79, "BIT 7, C", 0, inst_cb_bit_7_c },
  927.      { 0x7A, "BIT 7, D", 0, inst_cb_bit_7_d },
  928.      { 0x7B, "BIT 7, E", 0, inst_cb_bit_7_e },
  929.      { 0x7C, "BIT 7, H", 0, inst_cb_bit_7_h },
  930.      { 0x7D, "BIT 7, L", 0, inst_cb_bit_7_l },
  931.      { 0x7E, "BIT 7, (HL)", 0, inst_cb_bit_7_hl_indirect }, 
  932.      { 0x7F, "BIT 7, A", 0, inst_cb_bit_7_a },
  933.      { 0x80, "RES 0, B", 0, inst_cb_res_0_b },
  934.      { 0x81, "RES 0, C", 0, inst_cb_res_0_c },
  935.      { 0x82, "RES 0, D", 0, inst_cb_res_0_d },
  936.         { 0x83, "RES 0, E", 0, inst_cb_res_0_e },
  937.         { 0x84, "RES 0, H", 0, inst_cb_res_0_h },
  938.         { 0x85, "RES 0, L", 0, inst_cb_res_0_l },            
  939.      { 0x86, "RES 0, (HL)", 0, inst_cb_res_0_hl_indirect },
  940.      { 0x87, "RES 0, A", 0, inst_cb_res_0_a }, 
  941.      { 0x88, "RES 1, B", 0, inst_cb_res_1_b },
  942.      { 0x89, "RES 1, C", 0, inst_cb_res_1_c },
  943.      { 0x8A, "RES 1, D", 0, inst_cb_res_1_d },
  944.      { 0x8B, "RES 1, E", 0, inst_cb_res_1_e },
  945.      { 0x8C, "RES 1, H", 0, inst_cb_res_1_h },
  946.      { 0x8D, "RES 1, L", 0, inst_cb_res_1_l },
  947.      { 0x8E, "RES 1, (HL)", 0, inst_cb_res_1_hl_indirect },
  948.      { 0x8F, "RES 1, A", 0, inst_cb_res_1_a },
  949.      { 0x90, "RES 2, B", 0, inst_cb_res_2_b },
  950.      { 0x91, "RES 2, C", 0, inst_cb_res_2_c },
  951.      { 0x92, "RES 2, D", 0, inst_cb_res_2_d },
  952.      { 0x93, "RES 2, E", 0, inst_cb_res_2_e },
  953.      { 0x94, "RES 2, H", 0, inst_cb_res_2_h },
  954.      { 0x95, "RES 2, L", 0, inst_cb_res_2_l },
  955.      { 0x96, "RES 2, (HL)", 0, inst_cb_res_2_hl_indirect },
  956.      { 0x97, "RES 2, A", 0, inst_cb_res_2_a },
  957.      { 0x98, "RES 3, B", 0, inst_cb_res_3_b },
  958.      { 0x99, "RES 3, C", 0, inst_cb_res_3_c },
  959.      { 0x9A, "RES 3, D", 0, inst_cb_res_3_d },
  960.      { 0x9B, "RES 3, E", 0, inst_cb_res_3_e },
  961.      { 0x9C, "RES 3, H", 0, inst_cb_res_3_h },
  962.      { 0x9D, "RES 3, L", 0, inst_cb_res_3_l },
  963.      { 0x9E, "RES 3, (HL)", 0, inst_cb_res_3_hl_indirect },
  964.      { 0x9F, "RES 3, A", 0, inst_cb_res_3_a },
  965.      { 0xA0, "RES 4, B", 0, inst_cb_res_4_b },
  966.      { 0xA1, "RES 4, C", 0, inst_cb_res_4_c },
  967.      { 0xA2, "RES 4, D", 0, inst_cb_res_4_d },
  968.      { 0xA3, "RES 4, E", 0, inst_cb_res_4_e },
  969.      { 0xA4, "RES 4, H", 0, inst_cb_res_4_h },
  970.      { 0xA5, "RES 4, L", 0, inst_cb_res_4_l },
  971.      { 0xA6, "RES 4, (HL)", 0, inst_cb_res_4_hl_indirect },
  972.      { 0xA7, "RES 4, A", 0, inst_cb_res_4_a },
  973.      { 0xA8, "RES 5, B", 0, inst_cb_res_5_b },
  974.      { 0xA9, "RES 5, C", 0, inst_cb_res_5_c },
  975.      { 0xAA, "RES 5, D", 0, inst_cb_res_5_d },
  976.      { 0xAB, "RES 5, E", 0, inst_cb_res_5_e },
  977.      { 0xAC, "RES 5, H", 0, inst_cb_res_5_h },
  978.      { 0xAD, "RES 5, L", 0, inst_cb_res_5_l },
  979.      { 0xAE, "RES 5, (HL)", 0, inst_cb_res_5_hl_indirect },
  980.      { 0xAF, "RES 5, A", 0, inst_cb_res_5_a },
  981.      { 0xB0, "RES 6, B", 0, inst_cb_res_6_b },
  982.      { 0xB1, "RES 6, C", 0, inst_cb_res_6_c },
  983.      { 0xB2, "RES 6, D", 0, inst_cb_res_6_d },
  984.      { 0xB3, "RES 6, E", 0, inst_cb_res_6_e },
  985.      { 0xB4, "RES 6, H", 0, inst_cb_res_6_h },
  986.      { 0xB5, "RES 6, L", 0, inst_cb_res_6_l },
  987.      { 0xB6, "RES 6, (HL)", 0, inst_cb_res_6_hl_indirect },
  988.      { 0xB7, "RES 6, A", 0, inst_cb_res_6_a },
  989.      { 0xB8, "RES 7, B", 0, inst_cb_res_7_b },
  990.      { 0xB9, "RES 7, C", 0, inst_cb_res_7_c },
  991.      { 0xBA, "RES 7, D", 0, inst_cb_res_7_d },
  992.      { 0xBB, "RES 7, E", 0, inst_cb_res_7_e },
  993.      { 0xBC, "RES 7, H", 0, inst_cb_res_7_h },
  994.      { 0xBD, "RES 7, L", 0, inst_cb_res_7_l }, 
  995.      { 0xBE, "RES 7, (HL)", 0, inst_cb_res_7_hl_indirect }, 
  996.      { 0xBF, "RES 7, A", 0, inst_cb_res_7_a },
  997.      { 0xC0, "SET 0, B", 0, inst_cb_set_0_b },
  998.      { 0xC1, "SET 0, C", 0, inst_cb_set_0_c },
  999.      { 0xC2, "SET 0, D", 0, inst_cb_set_0_d },
  1000.      { 0xC3, "SET 0, E", 0, inst_cb_set_0_e },
  1001.      { 0xC4, "SET 0, H", 0, inst_cb_set_0_h },
  1002.      { 0xC5, "SET 0, L", 0, inst_cb_set_0_l },
  1003.      { 0xC6, "SET 0, (HL)", 0, inst_cb_set_0_hl_indirect },
  1004.      { 0xC7, "SET 0, A", 0, inst_cb_set_0_a },
  1005.      { 0xC8, "SET 1, B", 0, inst_cb_set_1_b },
  1006.      { 0xC9, "SET 1, C", 0, inst_cb_set_1_c },
  1007.      { 0xCA, "SET 1, D", 0, inst_cb_set_1_d },
  1008.      { 0xCB, "SET 1, E", 0, inst_cb_set_1_e },
  1009.      { 0xCC, "SET 1, H", 0, inst_cb_set_1_h },
  1010.      { 0xCD, "SET 1, L", 0, inst_cb_set_1_l },
  1011.      { 0xCE, "SET 1, (HL)", 0, inst_cb_set_1_hl_indirect },
  1012.      { 0xCF, "SET 1, A", 0, inst_cb_set_1_a },
  1013.      { 0xD0, "SET 2, B", 0, inst_cb_set_2_b },
  1014.      { 0xD1, "SET 2, C", 0, inst_cb_set_2_c },
  1015.      { 0xD2, "SET 2, D", 0, inst_cb_set_2_d },
  1016.      { 0xD3, "SET 2, E", 0, inst_cb_set_2_e },
  1017.      { 0xD4, "SET 2, H", 0, inst_cb_set_2_h },
  1018.      { 0xD5, "SET 2, L", 0, inst_cb_set_2_l },
  1019.      { 0xD6, "SET 2, (HL)", 0, inst_cb_set_2_hl_indirect },
  1020.      { 0xD7, "SET 2, A", 0, inst_cb_set_2_a },
  1021.      { 0xD8, "SET 3, B", 0, inst_cb_set_3_b },
  1022.      { 0xD9, "SET 3, C", 0, inst_cb_set_3_c },
  1023.      { 0xDA, "SET 3, D", 0, inst_cb_set_3_d },
  1024.      { 0xDB, "SET 3, E", 0, inst_cb_set_3_e },
  1025.      { 0xDC, "SET 3, H", 0, inst_cb_set_3_h },
  1026.      { 0xDD, "SET 3, L", 0, inst_cb_set_3_l },
  1027.      { 0xDE, "SET 3, (HL)", 0, inst_cb_set_3_hl_indirect },
  1028.      { 0xDF, "SET 3, A", 0, inst_cb_set_3_a },
  1029.      { 0xE0, "SET 4, B", 0, inst_cb_set_4_b },
  1030.      { 0xE1, "SET 4, C", 0, inst_cb_set_4_c },
  1031.      { 0xE2, "SET 4, D", 0, inst_cb_set_4_d },
  1032.      { 0xE3, "SET 4, E", 0, inst_cb_set_4_e },
  1033.      { 0xE4, "SET 4, H", 0, inst_cb_set_4_h },
  1034.      { 0xE5, "SET 4, L", 0, inst_cb_set_4_l },
  1035.      { 0xE6, "SET 4, (HL)", 0, inst_cb_set_4_hl_indirect },
  1036.      { 0xE7, "SET 4, A", 0, inst_cb_set_4_a },
  1037.      { 0xE8, "SET 5, B", 0, inst_cb_set_5_b },
  1038.      { 0xE9, "SET 5, C", 0, inst_cb_set_5_c },
  1039.      { 0xEA, "SET 5, D", 0, inst_cb_set_5_d },
  1040.      { 0xEB, "SET 5, E", 0, inst_cb_set_5_e },
  1041.      { 0xEC, "SET 5, H", 0, inst_cb_set_5_h },
  1042.      { 0xED, "SET 5, L", 0, inst_cb_set_5_l },
  1043.      { 0xEE, "SET 5, (HL)", 0, inst_cb_set_5_hl_indirect },
  1044.      { 0xEF, "SET 5, A", 0, inst_cb_set_5_a },
  1045.      { 0xF0, "SET 6, B", 0, inst_cb_set_6_b },
  1046.      { 0xF1, "SET 6, C", 0, inst_cb_set_6_c },
  1047.      { 0xF2, "SET 6, D", 0, inst_cb_set_6_d },
  1048.      { 0xF3, "SET 6, E", 0, inst_cb_set_6_e },
  1049.      { 0xF4, "SET 6, H", 0, inst_cb_set_6_h },
  1050.      { 0xF5, "SET 6, L", 0, inst_cb_set_6_l },
  1051.      { 0xF6, "SET 6, (HL)", 0, inst_cb_set_6_hl_indirect },
  1052.      { 0xF7, "SET 6, A", 0, inst_cb_set_6_a },
  1053.      { 0xF8, "SET 7, B", 0, inst_cb_set_7_b },
  1054.      { 0xF9, "SET 7, C", 0, inst_cb_set_7_c },
  1055.      { 0xFA, "SET 7, D", 0, inst_cb_set_7_d },
  1056.      { 0xFB, "SET 7, E", 0, inst_cb_set_7_e },
  1057.      { 0xFC, "SET 7, H", 0, inst_cb_set_7_h },
  1058.      { 0xFD, "SET 7, L", 0, inst_cb_set_7_l },
  1059.      { 0xFE, "SET 7, (HL)", 0, inst_cb_set_7_hl_indirect },
  1060.      { 0xFF, "SET 7, A", 0, inst_cb_set_7_a },
  1061.      { 0, (char *)NULL, 0, (void *)NULL }
  1062. };
  1063.      
  1064. static void gameboy_init_instructions()
  1065. {
  1066.      int i,j;
  1067.      
  1068.      for(i = 0, j = 0; gbz80_instructions[i].name; i++)
  1069.           j++;
  1070.      
  1071.      printf("%d Regular Instructions Implemented\n", j);
  1072.      for(i = 0, j = 0; gbz80_cb_instructions[i].name; i++)
  1073.           j++;
  1074.           
  1075.      printf("%d Extended CB Instructions Implemented\n", j);     
  1076. }
  1077.  
  1078. gameboy_proc_t *gameboy_cpu_hardreset()
  1079. {
  1080.      gameboy_proc_t *processor;
  1081.      
  1082.      gameboy_init_instructions();
  1083.      
  1084.      processor = (gameboy_proc_t *)malloc(sizeof(gameboy_proc_t));
  1085.      
  1086.      if(!processor) 
  1087.           return 0;
  1088.      
  1089.      if(color_gameboy)
  1090.           processor->AF.b.h = 0x11;
  1091.      else
  1092.           processor->AF.b.h = 0x01;
  1093.      
  1094.      processor->AF.b.l = 0xB0;
  1095.      processor->BC.uw  = 0x0013;
  1096.      processor->DE.uw  = 0x00D8;
  1097.      processor->HL.uw  = 0x014D;
  1098.      processor->SP.uw  = 0xFFFE;
  1099.      processor->PC.uw  = 0x0100;
  1100.      processor->IFF    = 0;
  1101.  
  1102.      processor->tim_cycles = 0;
  1103.      processor->machine_cycles = 0;
  1104.      
  1105.      memory_write_byte(0xFF05, 0);
  1106.      memory_write_byte(0xFF06, 0);
  1107.      memory_write_byte(0xFF07, 0);
  1108.      memory_write_byte(0xFF10, 0x80);
  1109.      memory_write_byte(0xFF11, 0xBF);
  1110.      memory_write_byte(0xFF12, 0xF3);
  1111.      memory_write_byte(0xFF14, 0xBF);
  1112.      memory_write_byte(0xFF16, 0x3F);
  1113.      memory_write_byte(0xFF17, 0x00);
  1114.      memory_write_byte(0xFF19, 0xBF);
  1115.      memory_write_byte(0xFF1A, 0x7A);
  1116.      memory_write_byte(0xFF1B, 0xFF);
  1117.      memory_write_byte(0xFF1C, 0x9F);
  1118.      memory_write_byte(0xFF1E, 0xBF);
  1119.      memory_write_byte(0xFF20, 0xFF);
  1120.      memory_write_byte(0xFF21, 0x00);
  1121.      memory_write_byte(0xFF22, 0x00);
  1122.      memory_write_byte(0xFF23, 0xBF);
  1123.      memory_write_byte(0xFF24, 0x77);
  1124.      memory_write_byte(0xFF25, 0xF3);
  1125.      memory_write_byte(0xFF26, 0xF1);
  1126.      memory_write_byte(0xFF40, 0x91);
  1127.      memory_write_byte(0xFF42, 0x00);
  1128.      memory_write_byte(0xFF43, 0x00);
  1129.      memory_write_byte(0xFF45, 0x00);
  1130.      memory_write_byte(0xFF47, 0xFC);
  1131.      memory_write_byte(0xFF48, 0xFF);
  1132.      memory_write_byte(0xFF49, 0xFF);
  1133.      memory_write_byte(0xFF4A, 0x00);
  1134.      memory_write_byte(0xFF4B, 0x00);
  1135.      memory_write_byte(0xFFFF, 0x00);
  1136.      
  1137.      return processor;
  1138. }
  1139.  
  1140. int  gameboy_cpu_find_instruction(gbz80_instruction *insts, unsigned char opcode)
  1141. {
  1142.      unsigned int i;
  1143.  
  1144.      for(i = 0; (insts+i)->name; i++)
  1145.           if((insts+i)->opcode == opcode)
  1146.                return i;
  1147.      return -1;
  1148. }
  1149.  
  1150. void gameboy_cpu_create_instruction(char *string, gameboy_proc_t *gbz80)
  1151. {
  1152.      int i;
  1153.      unsigned char opcode;
  1154.      
  1155.      opcode = memory_read_byte(gbz80->PC.uw);
  1156.      
  1157.      i = gameboy_cpu_find_instruction(gbz80_instructions, opcode);
  1158.      
  1159.      if(i == -1) {
  1160.           strcpy(string, "unknown");
  1161.           return;
  1162.      } else {
  1163.           unsigned char boff;
  1164.           wordun woff;
  1165.           
  1166.           if (opcode == 0xCB) {
  1167.                opcode = memory_read_byte(gbz80->PC.uw+1);
  1168.                i = gameboy_cpu_find_instruction(gbz80_cb_instructions, opcode);
  1169.                if (i == -1)
  1170.                     sprintf(string, "(CB %02X) %s", opcode, "unknown");
  1171.                else 
  1172.                     sprintf(string, "(CB %02X) %s", opcode, gbz80_cb_instructions[i].name);
  1173.                return;
  1174.           } 
  1175.                
  1176.           switch(gbz80_instructions[i].operand_size) {
  1177.                case 0:
  1178.                     strcpy(string, gbz80_instructions[i].name);
  1179.                     break;
  1180.                case 1:
  1181.                     boff = memory_read_byte(gbz80->PC.uw + 1);
  1182.                     sprintf(string, gbz80_instructions[i].name, boff);
  1183.                     break;
  1184.                case 2:
  1185.                     woff.uw = memory_read_word(gbz80->PC.uw + 1);
  1186.                     sprintf(string, gbz80_instructions[i].name, woff.uw);
  1187.                     break;
  1188.                default:
  1189.                     strcpy(string, "unknown op size");
  1190.                     break;
  1191.           }
  1192.           return;
  1193.      }
  1194. }
  1195.  
  1196. #ifdef CPU_DEBUG
  1197. unsigned int cpucnt[256];
  1198. unsigned int cbcpucnt[256];
  1199. #endif
  1200.  
  1201. void gameboy_cpu_execute_opcode()
  1202. {
  1203. /*     char stringz[256];  */
  1204.      current_opcode = memory_read_byte(gameboy_proc->PC.uw);
  1205.      
  1206.      gameboy_proc->PC.uw++;   
  1207.      
  1208. #ifdef CPU_DEBUG
  1209.      cpucnt[current_opcode]++;
  1210. #endif
  1211.      
  1212.      gbz80_instructions[current_opcode].instruction();
  1213.      
  1214.      if(gameboy_proc->machine_cycles >= cycles_per_hblank) {
  1215.           gameboy_hblank();
  1216.           gameboy_proc->machine_cycles -= cycles_per_hblank;
  1217.      }
  1218. }
  1219.  
  1220. void gameboy_cpu_execute_opcode_bak()
  1221. {
  1222. /*     int which_record;  */
  1223.  
  1224.      if(gameboy_proc->machine_cycles >= 451) {
  1225.           gameboy_hblank();
  1226.           gameboy_proc->machine_cycles -= 451;
  1227.      }    
  1228.  
  1229.      current_opcode = memory_read_byte(gameboy_proc->PC.uw);
  1230.      gameboy_proc->PC.uw++;
  1231.  
  1232. /*   if((which_record = gameboy_cpu_find_instruction(gbz80_instructions, current_opcode)) != -1)
  1233.           gbz80_instructions[which_record].instruction();
  1234.      else
  1235.           inst_unimplemented();
  1236. */
  1237.      gbz80_instructions[current_opcode].instruction();
  1238.      
  1239. }
  1240.  
  1241. void gameboy_cpu_run(gameboy_proc_t *processor)
  1242. {
  1243.      gameboy_proc = processor;
  1244.      
  1245.      gameboy_proc->running = 1;
  1246.      
  1247.      for(;gameboy_proc->running;) {
  1248.           gameboy_cpu_execute_opcode(); 
  1249.      }
  1250. }
  1251.  
  1252. void gameboy_stack_write_word(unsigned short int val)
  1253. {
  1254.      gameboy_proc->SP.uw -= 2;
  1255.      memory_write_word(gameboy_proc->SP.uw, val);
  1256. }
  1257.  
  1258. unsigned short int gameboy_stack_read_word()
  1259. {
  1260.      unsigned short int ret;
  1261.      
  1262.      ret = memory_read_word(gameboy_proc->SP.uw);
  1263.      
  1264.      gameboy_proc->SP.uw += 2;
  1265.      
  1266.      return ret;
  1267. }
  1268.  
  1269. void inst_unimplemented()
  1270. {
  1271.      printf("unknown opcode!\n");
  1272.      gameboy_proc->running = 0;
  1273.      gameboy_proc->PC.uw  -= 1;
  1274.      gbz80_debugger(gameboy_proc);
  1275. }
  1276.  
  1277. void inst_cb()
  1278. {
  1279.      unsigned char cbinst;
  1280. /*     int i;  */
  1281.      
  1282.      cbinst = memory_read_byte(gameboy_proc->PC.uw);
  1283.      gameboy_proc->PC.uw++;
  1284.      
  1285. #ifdef CPU_DEBUG
  1286.      cbcpucnt[cbinst]++;
  1287. #endif
  1288.  
  1289.      gbz80_cb_instructions[cbinst].instruction();
  1290. }
  1291.  
  1292. void inst_cb_unimplemented()
  1293. {
  1294.      printf("Unknown CB Opcode\n");
  1295.      gameboy_proc->running = 0;
  1296.      gameboy_proc->PC.uw  -= 2;
  1297.      gbz80_debugger(gameboy_proc);                          
  1298. }
  1299.  
  1300. /* TODO: Verify:
  1301. Addition sets CARRY if value is greater than register size
  1302. HalfCarry is set if two values lower 4 bits added are greater than 0x0F
  1303.  
  1304. On the other hand, GB CPU Docs and Z80 docs contradict each other with sub
  1305. Affected Opcodes: SUB SBC DEC CP
  1306. A = B - C
  1307. Subtraction sets carry if B >= C (no borrow)
  1308. Subtraction sets halfcarry if B&0x0F >= C&0x0F (no borrow in lower nibbles)
  1309.  
  1310. decided to try the Z80 way since even the gb docs contridicded themselves
  1311. and why would nintendo change how carry/halfcarry worked
  1312. */
  1313.  
  1314. void inst_adc_a_a()
  1315. {
  1316.      unsigned char value = gameboy_proc->AF.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1317.      int result = gameboy_proc->AF.b.h + value;
  1318.      
  1319.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1320.      
  1321.      if(result & 0xFF00)
  1322.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1323.      else
  1324.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1325.           
  1326.      if(value == gameboy_proc->AF.b.h)
  1327.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1328.      else
  1329.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1330.      
  1331.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1332.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1333.      else
  1334.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1335.  
  1336.      gameboy_proc->AF.b.h = result & 0xFF;
  1337.                
  1338.      MORE_CYCLES2(4);
  1339. }
  1340.  
  1341. void inst_adc_a_b()
  1342. {
  1343.      unsigned char value = gameboy_proc->BC.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1344.      int result = gameboy_proc->AF.b.h + value;
  1345.      
  1346.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1347.      
  1348.      if(result & 0xFF00)
  1349.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1350.      else
  1351.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1352.           
  1353.      if(value == gameboy_proc->AF.b.h)
  1354.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1355.      else
  1356.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1357.      
  1358.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1359.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1360.      else
  1361.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1362.  
  1363.      gameboy_proc->AF.b.h = result & 0xFF;
  1364.                
  1365.      MORE_CYCLES2(4);
  1366. }
  1367.  
  1368. void inst_adc_a_c()
  1369. {
  1370.      unsigned char value = gameboy_proc->BC.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1371.      int result = gameboy_proc->AF.b.h + value;
  1372.      
  1373.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1374.      
  1375.      if(result & 0xFF00)
  1376.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1377.      else
  1378.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1379.           
  1380.      if(value == gameboy_proc->AF.b.h)
  1381.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1382.      else
  1383.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1384.      
  1385.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1386.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1387.      else
  1388.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1389.  
  1390.      gameboy_proc->AF.b.h = result & 0xFF;
  1391.                
  1392.      MORE_CYCLES2(4);
  1393. }
  1394.  
  1395. void inst_adc_a_d()
  1396. {
  1397.      unsigned char value = gameboy_proc->DE.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1398.      int result = gameboy_proc->AF.b.h + value;
  1399.      
  1400.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1401.      
  1402.      if(result & 0xFF00)
  1403.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1404.      else
  1405.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1406.           
  1407.      if(value == gameboy_proc->AF.b.h)
  1408.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1409.      else
  1410.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1411.      
  1412.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1413.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1414.      else
  1415.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1416.  
  1417.      gameboy_proc->AF.b.h = result & 0xFF;
  1418.                
  1419.      MORE_CYCLES2(4);
  1420. }
  1421.  
  1422. void inst_adc_a_e()
  1423. {
  1424.      unsigned char value = gameboy_proc->DE.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1425.      int result = gameboy_proc->AF.b.h + value;
  1426.      
  1427.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1428.      
  1429.      if(result & 0xFF00)
  1430.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1431.      else
  1432.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1433.           
  1434.      if(value == gameboy_proc->AF.b.h)
  1435.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1436.      else
  1437.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1438.      
  1439.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1440.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1441.      else
  1442.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1443.  
  1444.      gameboy_proc->AF.b.h = result & 0xFF;
  1445.                
  1446.      MORE_CYCLES2(4);
  1447. }
  1448.  
  1449. void inst_adc_a_h()
  1450. {
  1451.      unsigned char value = gameboy_proc->HL.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1452.      int result = gameboy_proc->AF.b.h + value;
  1453.      
  1454.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1455.      
  1456.      if(result & 0xFF00)
  1457.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1458.      else
  1459.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1460.           
  1461.      if(value == gameboy_proc->AF.b.h)
  1462.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1463.      else
  1464.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1465.      
  1466.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1467.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1468.      else
  1469.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1470.  
  1471.      gameboy_proc->AF.b.h = result & 0xFF;
  1472.                
  1473.      MORE_CYCLES2(4);
  1474. }
  1475.  
  1476. void inst_adc_a_hl_indirect()
  1477. {
  1478.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1479.      int result = gameboy_proc->AF.b.h + value;
  1480.      
  1481.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1482.      
  1483.      if(result & 0xFF00)
  1484.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1485.      else
  1486.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1487.           
  1488.      if(value == gameboy_proc->AF.b.h)
  1489.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1490.      else
  1491.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1492.      
  1493.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1494.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1495.      else
  1496.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1497.  
  1498.      gameboy_proc->AF.b.h = result & 0xFF;
  1499.                
  1500.      MORE_CYCLES2(8);
  1501. }
  1502.  
  1503. void inst_adc_a_l()
  1504. {
  1505.      unsigned char value = gameboy_proc->HL.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1506.      int result = gameboy_proc->AF.b.h + value;
  1507.      
  1508.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1509.      
  1510.      if(result & 0xFF00)
  1511.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1512.      else
  1513.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1514.           
  1515.      if(value == gameboy_proc->AF.b.h)
  1516.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1517.      else
  1518.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1519.      
  1520.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1521.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1522.      else
  1523.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1524.  
  1525.      gameboy_proc->AF.b.h = result & 0xFF;
  1526.                
  1527.      MORE_CYCLES2(4);
  1528. }
  1529.  
  1530. void inst_adc_a_n()
  1531. {
  1532.      unsigned char value = memory_read_byte(gameboy_proc->PC.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  1533.      int result = gameboy_proc->AF.b.h + value;
  1534.      
  1535.      gameboy_proc->PC.uw++;
  1536.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  1537.      
  1538.      if(result & 0xFF00)
  1539.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1540.      else
  1541.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1542.           
  1543.      if(value == gameboy_proc->AF.b.h)
  1544.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1545.      else
  1546.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1547.      
  1548.      if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
  1549.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1550.      else
  1551.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1552.  
  1553.      gameboy_proc->AF.b.h = result & 0xFF;
  1554.                
  1555.      MORE_CYCLES2(8);
  1556. }
  1557.  
  1558. void inst_add_a_a()
  1559. {
  1560.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1561.      
  1562.      if (gameboy_proc->AF.b.h & 0x80)
  1563.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1564.      else
  1565.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1566.      
  1567.      if (gameboy_proc->AF.b.h & 0x08)
  1568.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1569.      else
  1570.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1571.      
  1572.      gameboy_proc->AF.b.h += gameboy_proc->AF.b.h;
  1573.      
  1574.      if (gameboy_proc->AF.b.h)
  1575.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1576.      else
  1577.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1578.           
  1579.      MORE_CYCLES2(4);
  1580. }
  1581.  
  1582. void inst_add_a_b()
  1583. {
  1584.      unsigned char value = gameboy_proc->BC.b.h;
  1585.      int result = gameboy_proc->AF.b.h + value;
  1586.      
  1587.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1588.      
  1589.      if (result & 0xFF00)
  1590.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1591.      else
  1592.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1593.           
  1594.      gameboy_proc->AF.b.h = result & 0xFF;
  1595.      
  1596.      if (gameboy_proc->AF.b.h)
  1597.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1598.      else
  1599.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1600.           
  1601.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1602.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1603.      else
  1604.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1605.      
  1606.      MORE_CYCLES2(4);
  1607. }
  1608.  
  1609. void inst_add_a_c()
  1610. {
  1611.      unsigned char value = gameboy_proc->BC.b.l;
  1612.      int result = gameboy_proc->AF.b.h + value;
  1613.      
  1614.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1615.      
  1616.      if (result & 0xFF00)
  1617.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1618.      else
  1619.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1620.           
  1621.      gameboy_proc->AF.b.h = result & 0xFF;
  1622.      
  1623.      if (gameboy_proc->AF.b.h)
  1624.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1625.      else
  1626.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1627.           
  1628.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1629.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1630.      else
  1631.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1632.      
  1633.      MORE_CYCLES2(4);
  1634. }
  1635.  
  1636. void inst_add_a_d()
  1637. {
  1638.      unsigned char value = gameboy_proc->DE.b.h;
  1639.      int result = gameboy_proc->AF.b.h + value;
  1640.      
  1641.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1642.      
  1643.      if (result & 0xFF00)
  1644.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1645.      else
  1646.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1647.           
  1648.      gameboy_proc->AF.b.h = result & 0xFF;
  1649.      
  1650.      if (gameboy_proc->AF.b.h)
  1651.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1652.      else
  1653.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1654.           
  1655.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1656.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1657.      else
  1658.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1659.      
  1660.      MORE_CYCLES2(4);
  1661. }
  1662.  
  1663. void inst_add_a_e()
  1664. {
  1665.      unsigned char value = gameboy_proc->DE.b.l;
  1666.      int result = gameboy_proc->AF.b.h + value;
  1667.      
  1668.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1669.      
  1670.      if (result & 0xFF00)
  1671.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1672.      else
  1673.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1674.           
  1675.      gameboy_proc->AF.b.h = result & 0xFF;
  1676.      
  1677.      if (gameboy_proc->AF.b.h)
  1678.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1679.      else
  1680.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1681.           
  1682.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1683.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1684.      else
  1685.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1686.      
  1687.      MORE_CYCLES2(4);
  1688. }
  1689.  
  1690. void inst_add_a_h()
  1691. {
  1692.      unsigned char value = gameboy_proc->HL.b.h;
  1693.      int result = gameboy_proc->AF.b.h + value;
  1694.      
  1695.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1696.      
  1697.      if (result & 0xFF00)
  1698.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1699.      else
  1700.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1701.           
  1702.      gameboy_proc->AF.b.h = result & 0xFF;
  1703.      
  1704.      if (gameboy_proc->AF.b.h)
  1705.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1706.      else
  1707.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1708.           
  1709.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1710.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1711.      else
  1712.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1713.      
  1714.      MORE_CYCLES2(4);
  1715. }
  1716.  
  1717. void inst_add_a_hl_indirect()
  1718. {
  1719.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  1720.      int result = gameboy_proc->AF.b.h + value;
  1721.      
  1722.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1723.      
  1724.      if (result & 0xFF00)
  1725.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1726.      else
  1727.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1728.           
  1729.      gameboy_proc->AF.b.h = result & 0xFF;
  1730.      
  1731.      if (gameboy_proc->AF.b.h)
  1732.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1733.      else
  1734.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1735.           
  1736.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1737.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1738.      else
  1739.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1740.      
  1741.      MORE_CYCLES2(8);
  1742. }
  1743.  
  1744. void inst_add_a_l()
  1745. {
  1746.      unsigned char value = gameboy_proc->HL.b.l;
  1747.      int result = gameboy_proc->AF.b.h + value;
  1748.      
  1749.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1750.      
  1751.      if (result & 0xFF00)
  1752.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1753.      else
  1754.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1755.           
  1756.      gameboy_proc->AF.b.h = result & 0xFF;
  1757.      
  1758.      if (gameboy_proc->AF.b.h)
  1759.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1760.      else
  1761.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1762.           
  1763.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1764.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1765.      else
  1766.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1767.      
  1768.      MORE_CYCLES2(4);
  1769. }
  1770.  
  1771. void inst_add_a_n()
  1772. {
  1773.      unsigned char value = memory_read_byte(gameboy_proc->PC.uw);
  1774.      int result = gameboy_proc->AF.b.h + value;
  1775.      
  1776.      gameboy_proc->PC.uw++;
  1777.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1778.      
  1779.      if (result & 0xFF00)
  1780.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1781.      else
  1782.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1783.           
  1784.      gameboy_proc->AF.b.h = result & 0xFF;
  1785.      
  1786.      if (gameboy_proc->AF.b.h)
  1787.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1788.      else
  1789.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1790.           
  1791.      if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
  1792.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1793.      else
  1794.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1795.      
  1796.      MORE_CYCLES2(8);
  1797. }
  1798.  
  1799. void inst_add_hl_bc()
  1800. {
  1801.      unsigned long result;
  1802.      unsigned short value = gameboy_proc->BC.uw;
  1803.      
  1804.      result = gameboy_proc->HL.uw + value;
  1805.      
  1806.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1807.      
  1808.      if(result & 0xFFFF0000)
  1809.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1810.      else
  1811.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1812.           
  1813.      if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
  1814.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1815.      else
  1816.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1817.      
  1818.      gameboy_proc->HL.uw = result & 0xFFFF;
  1819.      
  1820.      MORE_CYCLES2(8);
  1821. }
  1822.  
  1823. void inst_add_hl_de()
  1824. {
  1825.      unsigned long result;
  1826.      unsigned short value = gameboy_proc->DE.uw;
  1827.      
  1828.      result = gameboy_proc->HL.uw + value;
  1829.      
  1830.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1831.      
  1832.      if(result & 0xFFFF0000)
  1833.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1834.      else
  1835.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1836.           
  1837.      if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
  1838.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1839.      else
  1840.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1841.      
  1842.      gameboy_proc->HL.uw = result & 0xFFFF;
  1843.      
  1844.      MORE_CYCLES2(8);
  1845. }
  1846.  
  1847. void inst_add_hl_hl()
  1848. {
  1849.      unsigned long result;
  1850.      unsigned short value = gameboy_proc->HL.uw;
  1851.      
  1852.      result = gameboy_proc->HL.uw + value;
  1853.      
  1854.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1855.      
  1856.      if(result & 0xFFFF0000)
  1857.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1858.      else
  1859.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1860.           
  1861.      if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
  1862.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1863.      else
  1864.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1865.      
  1866.      gameboy_proc->HL.uw = result & 0xFFFF;
  1867.      
  1868.      MORE_CYCLES2(8);
  1869. }
  1870.  
  1871. void inst_add_hl_sp()
  1872. {
  1873.      unsigned long result;
  1874.      unsigned short value = gameboy_proc->SP.uw;
  1875.      
  1876.      result = gameboy_proc->HL.uw + value;
  1877.      
  1878.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  1879.      
  1880.      if(result & 0xFFFF0000)
  1881.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1882.      else
  1883.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1884.           
  1885.      if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
  1886.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1887.      else
  1888.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1889.      
  1890.      gameboy_proc->HL.uw = result & 0xFFFF;
  1891.      
  1892.      MORE_CYCLES2(8);
  1893. }
  1894.  
  1895. void inst_add_sp_n()
  1896. {
  1897.      signed char value = memory_read_byte(gameboy_proc->PC.uw);
  1898.      int result = gameboy_proc->SP.uw + value;
  1899.      
  1900.      gameboy_proc->PC.uw++;
  1901.      FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO | FLAGS_NEGATIVE);
  1902.      
  1903.      if (result & 0xFFFF0000)
  1904.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  1905.      else
  1906.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  1907.           
  1908.      gameboy_proc->SP.uw = result & 0xFFFF;
  1909.      
  1910.      if (((gameboy_proc->SP.uw & 0x0F) + (value & 0x0F)) > 0x0F)
  1911.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1912.      else
  1913.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  1914.      
  1915.      MORE_CYCLES2(16);
  1916. }
  1917.  
  1918. void inst_and_a()
  1919. {
  1920.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  1921.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1922.      if (gameboy_proc->AF.b.h)
  1923.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1924.      else
  1925.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1926.      MORE_CYCLES2(4);
  1927. }
  1928.  
  1929. void inst_and_b()
  1930. {
  1931.      gameboy_proc->AF.b.h &= gameboy_proc->BC.b.h;
  1932.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  1933.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1934.      if (gameboy_proc->AF.b.h)
  1935.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1936.      else
  1937.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1938.      MORE_CYCLES2(4);
  1939. }
  1940.  
  1941. void inst_and_c()
  1942. {
  1943.      gameboy_proc->AF.b.h &= gameboy_proc->BC.b.l;
  1944.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  1945.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1946.      if (gameboy_proc->AF.b.h)
  1947.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1948.      else
  1949.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1950.      MORE_CYCLES2(4);
  1951. }
  1952.  
  1953. void inst_and_d()
  1954. {
  1955.      gameboy_proc->AF.b.h &= gameboy_proc->DE.b.h;
  1956.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  1957.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1958.      if (gameboy_proc->AF.b.h)
  1959.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1960.      else
  1961.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1962.      MORE_CYCLES2(4);
  1963. }
  1964.  
  1965. void inst_and_e()
  1966. {
  1967.      gameboy_proc->AF.b.h &= gameboy_proc->DE.b.l;
  1968.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  1969.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1970.      if (gameboy_proc->AF.b.h)
  1971.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1972.      else
  1973.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1974.      MORE_CYCLES2(4);
  1975. }
  1976.  
  1977. void inst_and_h()
  1978. {
  1979.      gameboy_proc->AF.b.h &= gameboy_proc->HL.b.h;
  1980.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  1981.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1982.      if (gameboy_proc->AF.b.h)
  1983.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1984.      else
  1985.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1986.      MORE_CYCLES2(4);
  1987. }
  1988.  
  1989. void inst_and_hl_indirect()
  1990. {
  1991.      gameboy_proc->AF.b.h &= memory_read_byte(gameboy_proc->HL.uw);
  1992.      
  1993.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  1994.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  1995.      if (gameboy_proc->AF.b.h)
  1996.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  1997.      else
  1998.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  1999.      MORE_CYCLES2(8);
  2000. }
  2001.  
  2002. void inst_and_l()
  2003. {
  2004.      gameboy_proc->AF.b.h &= gameboy_proc->HL.b.l;
  2005.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  2006.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2007.      if (gameboy_proc->AF.b.h)
  2008.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2009.      else
  2010.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2011.      MORE_CYCLES2(4);
  2012. }
  2013.  
  2014. void inst_and_n()
  2015. {
  2016.      gameboy_proc->AF.b.h &= memory_read_byte(gameboy_proc->PC.uw);
  2017.      gameboy_proc->PC.uw++;
  2018.      
  2019.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
  2020.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2021.      if (gameboy_proc->AF.b.h)
  2022.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2023.      else
  2024.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2025.      MORE_CYCLES2(8);
  2026. }
  2027.  
  2028. void inst_call_c_nn()
  2029. {
  2030.      unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
  2031.      gameboy_proc->PC.uw += 2;
  2032.      if (FLAGS_ISCARRY(gameboy_proc)) {
  2033.           gameboy_stack_write_word(gameboy_proc->PC.uw);
  2034.           gameboy_proc->PC.uw = where;
  2035.           MORE_CYCLES2(24);
  2036.      } else {
  2037.           MORE_CYCLES2(12);
  2038.      }
  2039. }
  2040.  
  2041. void inst_call_nc_nn()
  2042. {
  2043.      unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
  2044.      gameboy_proc->PC.uw += 2;
  2045.      if (FLAGS_ISCARRY(gameboy_proc)) {
  2046.           MORE_CYCLES2(12);
  2047.      } else {
  2048.           gameboy_stack_write_word(gameboy_proc->PC.uw);
  2049.           gameboy_proc->PC.uw = where;
  2050.           MORE_CYCLES2(24);
  2051.      }
  2052. }
  2053.  
  2054. void inst_call_nn()
  2055. {
  2056.      gameboy_proc->PC.uw += 2;
  2057.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  2058.      gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw - 2);
  2059.      MORE_CYCLES2(24);
  2060. }
  2061.  
  2062. void inst_call_nz_nn()
  2063. {
  2064.      unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
  2065.      gameboy_proc->PC.uw += 2;
  2066.      if (FLAGS_ISZERO(gameboy_proc)) {
  2067.           MORE_CYCLES2(12);
  2068.      } else {
  2069.           gameboy_stack_write_word(gameboy_proc->PC.uw);
  2070.           gameboy_proc->PC.uw = where;
  2071.           MORE_CYCLES2(24);
  2072.      }
  2073. }
  2074.  
  2075. void inst_call_z_nn()
  2076. {
  2077.      unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
  2078.      gameboy_proc->PC.uw += 2;
  2079.      if (FLAGS_ISZERO(gameboy_proc)) {
  2080.           gameboy_stack_write_word(gameboy_proc->PC.uw);
  2081.           gameboy_proc->PC.uw = where;
  2082.           MORE_CYCLES2(24);
  2083.      } else {
  2084.           MORE_CYCLES2(12);
  2085.      }
  2086. }
  2087.  
  2088. void inst_cb_bit_0_a()
  2089. {
  2090.      if (gameboy_proc->AF.b.h & 0x01)
  2091.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2092.      else
  2093.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2094.      
  2095.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2096.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2097.      
  2098.      MORE_CYCLES2(8);
  2099. }
  2100.  
  2101. void inst_cb_bit_0_b()
  2102. {
  2103.      if (gameboy_proc->BC.b.h & 0x01)
  2104.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2105.      else
  2106.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2107.      
  2108.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2109.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2110.      
  2111.      MORE_CYCLES2(8);
  2112. }
  2113.  
  2114. void inst_cb_bit_0_c()
  2115. {
  2116.      if (gameboy_proc->BC.b.l & 0x01)
  2117.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2118.      else
  2119.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2120.      
  2121.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2122.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2123.      
  2124.      MORE_CYCLES2(8);
  2125. }
  2126.  
  2127. void inst_cb_bit_0_d()
  2128. {
  2129.      if (gameboy_proc->DE.b.h & 0x01)
  2130.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2131.      else
  2132.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2133.      
  2134.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2135.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2136.      
  2137.      MORE_CYCLES2(8);
  2138. }
  2139.  
  2140. void inst_cb_bit_0_e()
  2141. {
  2142.      if (gameboy_proc->DE.b.l & 0x01)
  2143.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2144.      else
  2145.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2146.      
  2147.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2148.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2149.      
  2150.      MORE_CYCLES2(8);
  2151. }
  2152.  
  2153. void inst_cb_bit_0_h()
  2154. {
  2155.      if (gameboy_proc->HL.b.h & 0x01)
  2156.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2157.      else
  2158.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2159.      
  2160.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2161.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2162.      
  2163.      MORE_CYCLES2(8);
  2164. }
  2165.  
  2166. void inst_cb_bit_0_hl_indirect()
  2167. {
  2168.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x01)
  2169.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2170.      else
  2171.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2172.      
  2173.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2174.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2175.      
  2176.      MORE_CYCLES2(12);
  2177. }
  2178.  
  2179. void inst_cb_bit_0_l()
  2180. {
  2181.      if (gameboy_proc->HL.b.l & 0x01)
  2182.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2183.      else
  2184.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2185.      
  2186.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2187.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2188.      
  2189.      MORE_CYCLES2(8);
  2190. }
  2191.  
  2192. void inst_cb_bit_1_a()
  2193. {
  2194.      if (gameboy_proc->AF.b.h & 0x02)
  2195.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2196.      else
  2197.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2198.      
  2199.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2200.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2201.      
  2202.      MORE_CYCLES2(8);
  2203. }
  2204.  
  2205. void inst_cb_bit_1_b()
  2206. {
  2207.      if (gameboy_proc->BC.b.h & 0x02)
  2208.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2209.      else
  2210.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2211.      
  2212.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2213.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2214.      
  2215.      MORE_CYCLES2(8);
  2216. }
  2217.  
  2218. void inst_cb_bit_1_c()
  2219. {
  2220.      if (gameboy_proc->BC.b.l & 0x02)
  2221.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2222.      else
  2223.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2224.      
  2225.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2226.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2227.      
  2228.      MORE_CYCLES2(8);
  2229. }
  2230.  
  2231. void inst_cb_bit_1_d()
  2232. {
  2233.      if (gameboy_proc->DE.b.h & 0x02)
  2234.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2235.      else
  2236.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2237.      
  2238.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2239.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2240.      
  2241.      MORE_CYCLES2(8);
  2242. }
  2243.  
  2244. void inst_cb_bit_1_e()
  2245. {
  2246.      if (gameboy_proc->DE.b.l & 0x02)
  2247.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2248.      else
  2249.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2250.      
  2251.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2252.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2253.      
  2254.      MORE_CYCLES2(8);
  2255. }
  2256.  
  2257. void inst_cb_bit_1_h()
  2258. {
  2259.      if (gameboy_proc->HL.b.h & 0x02)
  2260.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2261.      else
  2262.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2263.      
  2264.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2265.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2266.      
  2267.      MORE_CYCLES2(8);
  2268. }
  2269.  
  2270. void inst_cb_bit_1_hl_indirect()
  2271. {
  2272.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x02)
  2273.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2274.      else
  2275.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2276.      
  2277.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2278.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2279.      
  2280.      MORE_CYCLES2(12);
  2281. }
  2282.  
  2283. void inst_cb_bit_1_l()
  2284. {
  2285.      if (gameboy_proc->HL.b.l & 0x02)
  2286.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2287.      else
  2288.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2289.      
  2290.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2291.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2292.      
  2293.      MORE_CYCLES2(8);
  2294. }
  2295.  
  2296. void inst_cb_bit_2_a()
  2297. {
  2298.      if (gameboy_proc->AF.b.h & 0x04)
  2299.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2300.      else
  2301.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2302.      
  2303.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2304.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2305.      
  2306.      MORE_CYCLES2(8);
  2307. }
  2308.  
  2309. void inst_cb_bit_2_b()
  2310. {
  2311.      if (gameboy_proc->BC.b.h & 0x04)
  2312.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2313.      else
  2314.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2315.      
  2316.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2317.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2318.      
  2319.      MORE_CYCLES2(8);
  2320. }
  2321.  
  2322. void inst_cb_bit_2_c()
  2323. {
  2324.      if (gameboy_proc->BC.b.l & 0x04)
  2325.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2326.      else
  2327.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2328.      
  2329.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2330.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2331.      
  2332.      MORE_CYCLES2(8);
  2333. }
  2334.  
  2335. void inst_cb_bit_2_d()
  2336. {
  2337.      if (gameboy_proc->DE.b.h & 0x04)
  2338.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2339.      else
  2340.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2341.      
  2342.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2343.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2344.      
  2345.      MORE_CYCLES2(8);
  2346. }
  2347.  
  2348. void inst_cb_bit_2_e()
  2349. {
  2350.      if (gameboy_proc->DE.b.l & 0x04)
  2351.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2352.      else
  2353.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2354.      
  2355.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2356.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2357.      
  2358.      MORE_CYCLES2(8);
  2359. }
  2360.  
  2361. void inst_cb_bit_2_h()
  2362. {
  2363.      if (gameboy_proc->HL.b.h & 0x04)
  2364.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2365.      else
  2366.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2367.      
  2368.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2369.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2370.      
  2371.      MORE_CYCLES2(8);
  2372. }
  2373.  
  2374. void inst_cb_bit_2_hl_indirect()
  2375. {
  2376.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x04)
  2377.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2378.      else
  2379.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2380.      
  2381.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2382.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2383.      
  2384.      MORE_CYCLES2(12);
  2385. }
  2386.  
  2387. void inst_cb_bit_2_l()
  2388. {
  2389.      if (gameboy_proc->HL.b.l & 0x04)
  2390.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2391.      else
  2392.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2393.      
  2394.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2395.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2396.      
  2397.      MORE_CYCLES2(8);
  2398. }
  2399.  
  2400. void inst_cb_bit_3_a()
  2401. {
  2402.      if (gameboy_proc->AF.b.h & 0x08)
  2403.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2404.      else
  2405.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2406.      
  2407.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2408.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2409.      
  2410.      MORE_CYCLES2(8);
  2411. }
  2412.  
  2413. void inst_cb_bit_3_b()
  2414. {
  2415.      if (gameboy_proc->BC.b.h & 0x08)
  2416.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2417.      else
  2418.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2419.      
  2420.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2421.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2422.      
  2423.      MORE_CYCLES2(8);
  2424. }
  2425.  
  2426. void inst_cb_bit_3_c()
  2427. {
  2428.      if (gameboy_proc->BC.b.l & 0x08)
  2429.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2430.      else
  2431.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2432.      
  2433.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2434.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2435.      
  2436.      MORE_CYCLES2(8);
  2437. }
  2438.  
  2439. void inst_cb_bit_3_d()
  2440. {
  2441.      if (gameboy_proc->DE.b.h & 0x08)
  2442.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2443.      else
  2444.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2445.      
  2446.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2447.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2448.      
  2449.      MORE_CYCLES2(8);
  2450. }
  2451.  
  2452. void inst_cb_bit_3_e()
  2453. {
  2454.      if (gameboy_proc->DE.b.l & 0x08)
  2455.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2456.      else
  2457.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2458.      
  2459.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2460.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2461.      
  2462.      MORE_CYCLES2(8);
  2463. }
  2464.  
  2465. void inst_cb_bit_3_h()
  2466. {
  2467.      if (gameboy_proc->HL.b.h & 0x08)
  2468.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2469.      else
  2470.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2471.      
  2472.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2473.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2474.      
  2475.      MORE_CYCLES2(8);
  2476. }
  2477.  
  2478. void inst_cb_bit_3_hl_indirect()
  2479. {
  2480.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x08)
  2481.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2482.      else
  2483.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2484.      
  2485.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2486.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2487.      
  2488.      MORE_CYCLES2(12);
  2489. }
  2490.  
  2491. void inst_cb_bit_3_l()
  2492. {
  2493.      if (gameboy_proc->HL.b.l & 0x08)
  2494.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2495.      else
  2496.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2497.      
  2498.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2499.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2500.      
  2501.      MORE_CYCLES2(8);
  2502. }
  2503.  
  2504. void inst_cb_bit_4_a()
  2505. {
  2506.      if (gameboy_proc->AF.b.h & 0x10)
  2507.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2508.      else
  2509.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2510.      
  2511.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2512.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2513.      
  2514.      MORE_CYCLES2(8);
  2515. }
  2516.  
  2517. void inst_cb_bit_4_b()
  2518. {
  2519.      if (gameboy_proc->BC.b.h & 0x10)
  2520.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2521.      else
  2522.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2523.      
  2524.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2525.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2526.      
  2527.      MORE_CYCLES2(8);
  2528. }
  2529.  
  2530. void inst_cb_bit_4_c()
  2531. {
  2532.      if (gameboy_proc->BC.b.l & 0x10)
  2533.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2534.      else
  2535.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2536.      
  2537.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2538.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2539.      
  2540.      MORE_CYCLES2(8);
  2541. }
  2542.  
  2543. void inst_cb_bit_4_d()
  2544. {
  2545.      if (gameboy_proc->DE.b.h & 0x10)
  2546.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2547.      else
  2548.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2549.      
  2550.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2551.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2552.      
  2553.      MORE_CYCLES2(8);
  2554. }
  2555.  
  2556. void inst_cb_bit_4_e()
  2557. {
  2558.      if (gameboy_proc->DE.b.l & 0x10)
  2559.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2560.      else
  2561.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2562.      
  2563.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2564.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2565.      
  2566.      MORE_CYCLES2(8);
  2567. }
  2568.  
  2569. void inst_cb_bit_4_h()
  2570. {
  2571.      if (gameboy_proc->HL.b.h & 0x10)
  2572.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2573.      else
  2574.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2575.      
  2576.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2577.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2578.      
  2579.      MORE_CYCLES2(8);
  2580. }
  2581.  
  2582. void inst_cb_bit_4_hl_indirect()
  2583. {
  2584.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x10)
  2585.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2586.      else
  2587.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2588.      
  2589.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2590.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2591.      
  2592.      MORE_CYCLES2(12);
  2593. }
  2594.  
  2595. void inst_cb_bit_4_l()
  2596. {
  2597.      if (gameboy_proc->HL.b.l & 0x10)
  2598.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2599.      else
  2600.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2601.      
  2602.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2603.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2604.      
  2605.      MORE_CYCLES2(8);
  2606. }
  2607.  
  2608. void inst_cb_bit_5_a()
  2609. {
  2610.      if (gameboy_proc->AF.b.h & 0x20)
  2611.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2612.      else
  2613.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2614.      
  2615.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2616.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2617.      
  2618.      MORE_CYCLES2(8);
  2619. }
  2620.  
  2621. void inst_cb_bit_5_b()
  2622. {
  2623.      if (gameboy_proc->BC.b.h & 0x20)
  2624.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2625.      else
  2626.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2627.      
  2628.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2629.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2630.      
  2631.      MORE_CYCLES2(8);
  2632. }
  2633.  
  2634. void inst_cb_bit_5_c()
  2635. {
  2636.      if (gameboy_proc->BC.b.l & 0x20)
  2637.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2638.      else
  2639.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2640.      
  2641.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2642.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2643.      
  2644.      MORE_CYCLES2(8);
  2645. }
  2646.  
  2647. void inst_cb_bit_5_d()
  2648. {
  2649.      if (gameboy_proc->DE.b.h & 0x20)
  2650.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2651.      else
  2652.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2653.      
  2654.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2655.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2656.      
  2657.      MORE_CYCLES2(8);
  2658. }
  2659.  
  2660. void inst_cb_bit_5_e()
  2661. {
  2662.      if (gameboy_proc->DE.b.l & 0x20)
  2663.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2664.      else
  2665.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2666.      
  2667.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2668.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2669.      
  2670.      MORE_CYCLES2(8);
  2671. }
  2672.  
  2673. void inst_cb_bit_5_h()
  2674. {
  2675.      if (gameboy_proc->HL.b.h & 0x20)
  2676.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2677.      else
  2678.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2679.      
  2680.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2681.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2682.      
  2683.      MORE_CYCLES2(8);
  2684. }
  2685.  
  2686. void inst_cb_bit_5_hl_indirect()
  2687. {
  2688.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x20)
  2689.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2690.      else
  2691.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2692.      
  2693.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2694.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2695.      
  2696.      MORE_CYCLES2(12);
  2697. }
  2698.  
  2699. void inst_cb_bit_5_l()
  2700. {
  2701.      if (gameboy_proc->HL.b.l & 0x20)
  2702.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2703.      else
  2704.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2705.      
  2706.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2707.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2708.      
  2709.      MORE_CYCLES2(8);
  2710. }
  2711.  
  2712. void inst_cb_bit_6_a()
  2713. {
  2714.      if (gameboy_proc->AF.b.h & 0x40)
  2715.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2716.      else
  2717.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2718.      
  2719.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2720.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2721.      
  2722.      MORE_CYCLES2(8);
  2723. }
  2724.  
  2725. void inst_cb_bit_6_b()
  2726. {
  2727.      if (gameboy_proc->BC.b.h & 0x40)
  2728.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2729.      else
  2730.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2731.      
  2732.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2733.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2734.      
  2735.      MORE_CYCLES2(8);
  2736. }
  2737.  
  2738. void inst_cb_bit_6_c()
  2739. {
  2740.      if (gameboy_proc->BC.b.l & 0x40)
  2741.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2742.      else
  2743.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2744.      
  2745.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2746.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2747.      
  2748.      MORE_CYCLES2(8);
  2749. }
  2750.  
  2751. void inst_cb_bit_6_d()
  2752. {
  2753.      if (gameboy_proc->DE.b.h & 0x40)
  2754.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2755.      else
  2756.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2757.      
  2758.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2759.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2760.      
  2761.      MORE_CYCLES2(8);
  2762. }
  2763.  
  2764. void inst_cb_bit_6_e()
  2765. {
  2766.      if (gameboy_proc->DE.b.l & 0x40)
  2767.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2768.      else
  2769.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2770.      
  2771.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2772.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2773.      
  2774.      MORE_CYCLES2(8);
  2775. }
  2776.  
  2777. void inst_cb_bit_6_h()
  2778. {
  2779.      if (gameboy_proc->HL.b.h & 0x40)
  2780.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2781.      else
  2782.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2783.      
  2784.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2785.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2786.      
  2787.      MORE_CYCLES2(8);
  2788. }
  2789.  
  2790. void inst_cb_bit_6_hl_indirect()
  2791. {
  2792.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x40)
  2793.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2794.      else
  2795.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2796.      
  2797.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2798.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2799.      
  2800.      MORE_CYCLES2(12);
  2801. }
  2802.  
  2803. void inst_cb_bit_6_l()
  2804. {
  2805.      if (gameboy_proc->HL.b.l & 0x40)
  2806.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2807.      else
  2808.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2809.      
  2810.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2811.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2812.      
  2813.      MORE_CYCLES2(8);
  2814. }
  2815.  
  2816. void inst_cb_bit_7_a()
  2817. {
  2818.      if (gameboy_proc->AF.b.h & 0x80)
  2819.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2820.      else
  2821.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2822.      
  2823.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2824.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2825.      
  2826.      MORE_CYCLES2(8);
  2827. }
  2828.  
  2829. void inst_cb_bit_7_b()
  2830. {
  2831.      if (gameboy_proc->BC.b.h & 0x80)
  2832.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2833.      else
  2834.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2835.      
  2836.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2837.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2838.      
  2839.      MORE_CYCLES2(8);
  2840. }
  2841.  
  2842. void inst_cb_bit_7_c()
  2843. {
  2844.      if (gameboy_proc->BC.b.l & 0x80)
  2845.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2846.      else
  2847.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2848.      
  2849.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2850.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2851.      
  2852.      MORE_CYCLES2(8);
  2853. }
  2854.  
  2855. void inst_cb_bit_7_d()
  2856. {
  2857.      if (gameboy_proc->DE.b.h & 0x80)
  2858.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2859.      else
  2860.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2861.      
  2862.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2863.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2864.      
  2865.      MORE_CYCLES2(8);
  2866. }
  2867.  
  2868. void inst_cb_bit_7_e()
  2869. {
  2870.      if (gameboy_proc->DE.b.l & 0x80)
  2871.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2872.      else
  2873.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2874.      
  2875.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2876.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2877.      
  2878.      MORE_CYCLES2(8);
  2879. }
  2880.  
  2881. void inst_cb_bit_7_h()
  2882. {
  2883.      if (gameboy_proc->HL.b.h & 0x80)
  2884.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2885.      else
  2886.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2887.      
  2888.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2889.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2890.      
  2891.      MORE_CYCLES2(8);
  2892. }
  2893.  
  2894. void inst_cb_bit_7_hl_indirect()
  2895. {
  2896.      if (memory_read_byte(gameboy_proc->HL.uw) & 0x80)
  2897.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2898.      else
  2899.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2900.      
  2901.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2902.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2903.      
  2904.      MORE_CYCLES2(12);
  2905. }
  2906.  
  2907. void inst_cb_bit_7_l()
  2908. {
  2909.      if (gameboy_proc->HL.b.l & 0x80)
  2910.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  2911.      else
  2912.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  2913.      
  2914.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  2915.      FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  2916.      
  2917.      MORE_CYCLES2(8);
  2918. }
  2919.  
  2920. void inst_cb_res_0_a()
  2921. {
  2922.      gameboy_proc->AF.b.h &= ~0x01;
  2923.      MORE_CYCLES2(8);
  2924. }
  2925.  
  2926. void inst_cb_res_0_b()
  2927. {
  2928.      gameboy_proc->BC.b.h &= ~0x01;
  2929.      MORE_CYCLES2(8);
  2930. }
  2931.  
  2932. void inst_cb_res_0_c()
  2933. {
  2934.      gameboy_proc->BC.b.l &= ~0x01;
  2935.      MORE_CYCLES2(8);
  2936. }
  2937.  
  2938. void inst_cb_res_0_d()
  2939. {
  2940.      gameboy_proc->DE.b.h &= ~0x01;
  2941.      MORE_CYCLES2(8);
  2942. }
  2943.  
  2944. void inst_cb_res_0_e()
  2945. {
  2946.      gameboy_proc->DE.b.l &= ~0x01;
  2947.      MORE_CYCLES2(8);
  2948. }
  2949.  
  2950. void inst_cb_res_0_h()
  2951. {
  2952.      gameboy_proc->HL.b.h &= ~0x01;
  2953.      MORE_CYCLES2(8);
  2954. }
  2955.  
  2956. void inst_cb_res_0_hl_indirect()
  2957. {
  2958.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  2959.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x01);
  2960.      MORE_CYCLES2(12);
  2961. }
  2962.  
  2963. void inst_cb_res_0_l()
  2964. {
  2965.      gameboy_proc->HL.b.l &= ~0x01;
  2966.      MORE_CYCLES2(8);
  2967. }
  2968.  
  2969. void inst_cb_res_1_a()
  2970. {
  2971.      gameboy_proc->AF.b.h &= ~0x02;
  2972.      MORE_CYCLES2(8);
  2973. }
  2974.  
  2975. void inst_cb_res_1_b()
  2976. {
  2977.      gameboy_proc->BC.b.h &= ~0x02;
  2978.      MORE_CYCLES2(8);
  2979. }
  2980.  
  2981. void inst_cb_res_1_c()
  2982. {
  2983.      gameboy_proc->BC.b.l &= ~0x02;
  2984.      MORE_CYCLES2(8);
  2985. }
  2986.  
  2987. void inst_cb_res_1_d()
  2988. {
  2989.      gameboy_proc->DE.b.h &= ~0x02;
  2990.      MORE_CYCLES2(8);
  2991. }
  2992.  
  2993. void inst_cb_res_1_e()
  2994. {
  2995.      gameboy_proc->DE.b.l &= ~0x02;
  2996.      MORE_CYCLES2(8);
  2997. }
  2998.  
  2999. void inst_cb_res_1_h()
  3000. {
  3001.      gameboy_proc->HL.b.h &= ~0x02;
  3002.      MORE_CYCLES2(8);
  3003. }
  3004.  
  3005. void inst_cb_res_1_hl_indirect()
  3006. {
  3007.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  3008.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x02);
  3009.      MORE_CYCLES2(12);
  3010. }
  3011.  
  3012. void inst_cb_res_1_l()
  3013. {
  3014.      gameboy_proc->HL.b.l &= ~0x02;
  3015.      MORE_CYCLES2(8);
  3016. }
  3017.  
  3018. void inst_cb_res_2_a()
  3019. {
  3020.      gameboy_proc->AF.b.h &= ~0x04;
  3021.      MORE_CYCLES2(8);
  3022. }
  3023.  
  3024. void inst_cb_res_2_b()
  3025. {
  3026.      gameboy_proc->BC.b.h &= ~0x04;
  3027.      MORE_CYCLES2(8);
  3028. }
  3029.  
  3030. void inst_cb_res_2_c()
  3031. {
  3032.      gameboy_proc->BC.b.l &= ~0x04;
  3033.      MORE_CYCLES2(8);
  3034. }
  3035.  
  3036. void inst_cb_res_2_d()
  3037. {
  3038.      gameboy_proc->DE.b.h &= ~0x04;
  3039.      MORE_CYCLES2(8);
  3040. }
  3041.  
  3042. void inst_cb_res_2_e()
  3043. {
  3044.      gameboy_proc->DE.b.l &= ~0x04;
  3045.      MORE_CYCLES2(8);
  3046. }
  3047.  
  3048. void inst_cb_res_2_h()
  3049. {
  3050.      gameboy_proc->HL.b.h &= ~0x04;
  3051.      MORE_CYCLES2(8);
  3052. }
  3053.  
  3054. void inst_cb_res_2_hl_indirect()
  3055. {
  3056.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  3057.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x04);
  3058.      MORE_CYCLES2(12);
  3059. }
  3060.  
  3061. void inst_cb_res_2_l()
  3062. {
  3063.      gameboy_proc->HL.b.l &= ~0x04;
  3064.      MORE_CYCLES2(8);
  3065. }
  3066.  
  3067. void inst_cb_res_3_a()
  3068. {
  3069.      gameboy_proc->AF.b.h &= ~0x08;
  3070.      MORE_CYCLES2(8);
  3071. }
  3072.  
  3073. void inst_cb_res_3_b()
  3074. {
  3075.      gameboy_proc->BC.b.h &= ~0x08;
  3076.      MORE_CYCLES2(8);
  3077. }
  3078.  
  3079. void inst_cb_res_3_c()
  3080. {
  3081.      gameboy_proc->BC.b.l &= ~0x08;
  3082.      MORE_CYCLES2(8);
  3083. }
  3084.  
  3085. void inst_cb_res_3_d()
  3086. {
  3087.      gameboy_proc->DE.b.h &= ~0x08;
  3088.      MORE_CYCLES2(8);
  3089. }
  3090.  
  3091. void inst_cb_res_3_e()
  3092. {
  3093.      gameboy_proc->DE.b.l &= ~0x08;
  3094.      MORE_CYCLES2(8);
  3095. }
  3096.  
  3097. void inst_cb_res_3_h()
  3098. {
  3099.      gameboy_proc->HL.b.h &= ~0x08;
  3100.      MORE_CYCLES2(8);
  3101. }
  3102.  
  3103. void inst_cb_res_3_hl_indirect()
  3104. {
  3105.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  3106.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x08);
  3107.      MORE_CYCLES2(12);
  3108. }
  3109.  
  3110. void inst_cb_res_3_l()
  3111. {
  3112.      gameboy_proc->HL.b.l &= ~0x08;
  3113.      MORE_CYCLES2(8);
  3114. }
  3115.  
  3116. void inst_cb_res_4_a()
  3117. {
  3118.      gameboy_proc->AF.b.h &= ~0x10;
  3119.      MORE_CYCLES2(8);
  3120. }
  3121.  
  3122. void inst_cb_res_4_b()
  3123. {
  3124.      gameboy_proc->BC.b.h &= ~0x10;
  3125.      MORE_CYCLES2(8);
  3126. }
  3127.  
  3128. void inst_cb_res_4_c()
  3129. {
  3130.      gameboy_proc->BC.b.l &= ~0x10;
  3131.      MORE_CYCLES2(8);
  3132. }
  3133.  
  3134. void inst_cb_res_4_d()
  3135. {
  3136.      gameboy_proc->DE.b.h &= ~0x10;
  3137.      MORE_CYCLES2(8);
  3138. }
  3139.  
  3140. void inst_cb_res_4_e()
  3141. {
  3142.      gameboy_proc->DE.b.l &= ~0x10;
  3143.      MORE_CYCLES2(8);
  3144. }
  3145.  
  3146. void inst_cb_res_4_h()
  3147. {
  3148.      gameboy_proc->HL.b.h &= ~0x10;
  3149.      MORE_CYCLES2(8);
  3150. }
  3151.  
  3152. void inst_cb_res_4_hl_indirect()
  3153. {
  3154.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  3155.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x10);
  3156.      MORE_CYCLES2(12);
  3157. }
  3158.  
  3159. void inst_cb_res_4_l()
  3160. {
  3161.      gameboy_proc->HL.b.l &= ~0x10;
  3162.      MORE_CYCLES2(8);
  3163. }
  3164.  
  3165. void inst_cb_res_5_a()
  3166. {
  3167.      gameboy_proc->AF.b.h &= ~0x20;
  3168.      MORE_CYCLES2(8);
  3169. }
  3170.  
  3171. void inst_cb_res_5_b()
  3172. {
  3173.      gameboy_proc->BC.b.h &= ~0x20;
  3174.      MORE_CYCLES2(8);
  3175. }
  3176.  
  3177. void inst_cb_res_5_c()
  3178. {
  3179.      gameboy_proc->BC.b.l &= ~0x20;
  3180.      MORE_CYCLES2(8);
  3181. }
  3182.  
  3183. void inst_cb_res_5_d()
  3184. {
  3185.      gameboy_proc->DE.b.h &= ~0x20;
  3186.      MORE_CYCLES2(8);
  3187. }
  3188.  
  3189. void inst_cb_res_5_e()
  3190. {
  3191.      gameboy_proc->DE.b.l &= ~0x20;
  3192.      MORE_CYCLES2(8);
  3193. }
  3194.  
  3195. void inst_cb_res_5_h()
  3196. {
  3197.      gameboy_proc->HL.b.h &= ~0x20;
  3198.      MORE_CYCLES2(8);
  3199. }
  3200.  
  3201. void inst_cb_res_5_hl_indirect()
  3202. {
  3203.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  3204.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x20);
  3205.      MORE_CYCLES2(12);
  3206. }
  3207.  
  3208. void inst_cb_res_5_l()
  3209. {
  3210.      gameboy_proc->HL.b.l &= ~0x20;
  3211.      MORE_CYCLES2(8);
  3212. }
  3213.  
  3214. void inst_cb_res_6_a()
  3215. {
  3216.      gameboy_proc->AF.b.h &= ~0x40;
  3217.      MORE_CYCLES2(8);
  3218. }
  3219.  
  3220. void inst_cb_res_6_b()
  3221. {
  3222.      gameboy_proc->BC.b.h &= ~0x40;
  3223.      MORE_CYCLES2(8);
  3224. }
  3225.  
  3226. void inst_cb_res_6_c()
  3227. {
  3228.      gameboy_proc->BC.b.l &= ~0x40;
  3229.      MORE_CYCLES2(8);
  3230. }
  3231.  
  3232. void inst_cb_res_6_d()
  3233. {
  3234.      gameboy_proc->DE.b.h &= ~0x40;
  3235.      MORE_CYCLES2(8);
  3236. }
  3237.  
  3238. void inst_cb_res_6_e()
  3239. {
  3240.      gameboy_proc->DE.b.l &= ~0x40;
  3241.      MORE_CYCLES2(8);
  3242. }
  3243.  
  3244. void inst_cb_res_6_h()
  3245. {
  3246.      gameboy_proc->HL.b.h &= ~0x40;
  3247.      MORE_CYCLES2(8);
  3248. }
  3249.  
  3250. void inst_cb_res_6_hl_indirect()
  3251. {
  3252.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  3253.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x40);
  3254.      MORE_CYCLES2(12);
  3255. }
  3256.  
  3257. void inst_cb_res_6_l()
  3258. {
  3259.      gameboy_proc->HL.b.l &= ~0x40;
  3260.      MORE_CYCLES2(8);
  3261. }
  3262.  
  3263. void inst_cb_res_7_a()
  3264. {
  3265.      gameboy_proc->AF.b.h &= ~0x80;
  3266.      MORE_CYCLES2(8);
  3267. }
  3268.  
  3269. void inst_cb_res_7_b()
  3270. {
  3271.      gameboy_proc->BC.b.h &= ~0x80;
  3272.      MORE_CYCLES2(8);
  3273. }
  3274.  
  3275. void inst_cb_res_7_c()
  3276. {
  3277.      gameboy_proc->BC.b.l &= ~0x80;
  3278.      MORE_CYCLES2(8);
  3279. }
  3280.  
  3281. void inst_cb_res_7_d()
  3282. {
  3283.      gameboy_proc->DE.b.h &= ~0x80;
  3284.      MORE_CYCLES2(8);
  3285. }
  3286.  
  3287. void inst_cb_res_7_e()
  3288. {
  3289.      gameboy_proc->DE.b.l &= ~0x80;
  3290.      MORE_CYCLES2(8);
  3291. }
  3292.  
  3293. void inst_cb_res_7_h()
  3294. {
  3295.      gameboy_proc->HL.b.h &= ~0x80;
  3296.      MORE_CYCLES2(8);
  3297. }
  3298.  
  3299. void inst_cb_res_7_hl_indirect()
  3300. {
  3301.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  3302.      memory_write_byte(gameboy_proc->HL.uw, what & ~0x80);
  3303.      MORE_CYCLES2(12);
  3304. }
  3305.  
  3306. void inst_cb_res_7_l()
  3307. {
  3308.      gameboy_proc->HL.b.l &= ~0x80;
  3309.      MORE_CYCLES2(8);
  3310. }
  3311.  
  3312. void inst_cb_rl_a()
  3313. {
  3314.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3315.      if (gameboy_proc->AF.b.h & 0x80)
  3316.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3317.      else
  3318.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3319.      gameboy_proc->AF.b.h <<= 1;
  3320.      gameboy_proc->AF.b.h += carry;
  3321.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3322.      MORE_CYCLES2(8);
  3323. }
  3324.  
  3325. void inst_cb_rl_b()
  3326. {
  3327.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3328.      if (gameboy_proc->BC.b.h & 0x80)
  3329.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3330.      else
  3331.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3332.      gameboy_proc->BC.b.h <<= 1;
  3333.      gameboy_proc->BC.b.h += carry;
  3334.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3335.      MORE_CYCLES2(8);
  3336. }
  3337.  
  3338. void inst_cb_rl_c()
  3339. {
  3340.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3341.      if (gameboy_proc->BC.b.l & 0x80)
  3342.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3343.      else
  3344.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3345.      gameboy_proc->BC.b.l <<= 1;
  3346.      gameboy_proc->BC.b.l += carry;
  3347.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3348.      MORE_CYCLES2(8);
  3349. }
  3350.  
  3351. void inst_cb_rl_d()
  3352. {
  3353.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3354.      if (gameboy_proc->DE.b.h & 0x80)
  3355.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3356.      else
  3357.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3358.      gameboy_proc->DE.b.h <<= 1;
  3359.      gameboy_proc->DE.b.h += carry;
  3360.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3361.      MORE_CYCLES2(8);
  3362. }
  3363.  
  3364. void inst_cb_rl_e()
  3365. {
  3366.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3367.      if (gameboy_proc->DE.b.l & 0x80)
  3368.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3369.      else
  3370.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3371.      gameboy_proc->DE.b.l <<= 1;
  3372.      gameboy_proc->DE.b.l += carry;
  3373.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3374.      MORE_CYCLES2(8);
  3375. }
  3376.  
  3377. void inst_cb_rl_h()
  3378. {
  3379.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3380.      if (gameboy_proc->HL.b.h & 0x80)
  3381.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3382.      else
  3383.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3384.      gameboy_proc->HL.b.h <<= 1;
  3385.      gameboy_proc->HL.b.h += carry;
  3386.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3387.      MORE_CYCLES2(8);
  3388. }
  3389.  
  3390. void inst_cb_rl_hl_indirect()
  3391. {
  3392.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  3393.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3394.      
  3395.      if (value & 0x80)
  3396.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3397.      else
  3398.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3399.      value <<= 1;
  3400.      value += carry;
  3401.      
  3402.      memory_write_byte(gameboy_proc->HL.uw, value);
  3403.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3404.      MORE_CYCLES2(16);
  3405. }
  3406.  
  3407. void inst_cb_rl_l()
  3408. {
  3409.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  3410.      if (gameboy_proc->HL.b.l & 0x80)
  3411.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3412.      else
  3413.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3414.      gameboy_proc->HL.b.l <<= 1;
  3415.      gameboy_proc->HL.b.l += carry;
  3416.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  3417.      MORE_CYCLES2(8);
  3418. }
  3419.  
  3420. void inst_cb_rlc_a()
  3421. {
  3422.      int carry = (gameboy_proc->AF.b.h & 0x80) >> 7;
  3423.      
  3424.      if (gameboy_proc->AF.b.h & 0x80) 
  3425.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3426.      else
  3427.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3428.      
  3429.      gameboy_proc->AF.b.h <<= 1;
  3430.      gameboy_proc->AF.b.h += carry;
  3431.      
  3432.      if (gameboy_proc->AF.b.h)
  3433.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3434.      else
  3435.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3436.           
  3437.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3438.      
  3439.      MORE_CYCLES2(8); 
  3440. }
  3441.  
  3442. void inst_cb_rlc_b()
  3443. {
  3444.      int carry = (gameboy_proc->BC.b.h & 0x80) >> 7;
  3445.      
  3446.      if (gameboy_proc->BC.b.h & 0x80) 
  3447.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3448.      else
  3449.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3450.      
  3451.      gameboy_proc->BC.b.h <<= 1;
  3452.      gameboy_proc->BC.b.h += carry;
  3453.      
  3454.      if (gameboy_proc->BC.b.h)
  3455.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3456.      else
  3457.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3458.           
  3459.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3460.      
  3461.      MORE_CYCLES2(8);
  3462. }
  3463.  
  3464. void inst_cb_rlc_c()
  3465. {
  3466.      int carry = (gameboy_proc->BC.b.l & 0x80) >> 7;
  3467.      
  3468.      if (gameboy_proc->BC.b.l & 0x80) 
  3469.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3470.      else
  3471.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3472.      
  3473.      gameboy_proc->BC.b.l <<= 1;
  3474.      gameboy_proc->BC.b.l += carry;
  3475.      
  3476.      if (gameboy_proc->BC.b.l)
  3477.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3478.      else
  3479.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3480.           
  3481.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3482.      
  3483.      MORE_CYCLES2(8);
  3484. }
  3485.  
  3486. void inst_cb_rlc_d()
  3487. {
  3488.      int carry = (gameboy_proc->DE.b.h & 0x80) >> 7;
  3489.      
  3490.      if (gameboy_proc->DE.b.h & 0x80) 
  3491.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3492.      else
  3493.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3494.      
  3495.      gameboy_proc->DE.b.h <<= 1;
  3496.      gameboy_proc->DE.b.h += carry;
  3497.      
  3498.      if (gameboy_proc->DE.b.h)
  3499.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3500.      else
  3501.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3502.           
  3503.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3504.      
  3505.      MORE_CYCLES2(8);
  3506. }
  3507.  
  3508. void inst_cb_rlc_e()
  3509. {
  3510.      int carry = (gameboy_proc->DE.b.l & 0x80) >> 7;
  3511.      
  3512.      if (gameboy_proc->DE.b.l & 0x80) 
  3513.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3514.      else
  3515.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3516.      
  3517.      gameboy_proc->DE.b.l <<= 1;
  3518.      gameboy_proc->DE.b.l += carry;
  3519.      
  3520.      if (gameboy_proc->DE.b.l)
  3521.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3522.      else
  3523.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3524.           
  3525.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3526.      
  3527.      MORE_CYCLES2(8);
  3528. }
  3529.  
  3530. void inst_cb_rlc_h()
  3531. {
  3532.      int carry = (gameboy_proc->HL.b.h & 0x80) >> 7;
  3533.      
  3534.      if (gameboy_proc->HL.b.h & 0x80) 
  3535.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3536.      else
  3537.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3538.      
  3539.      gameboy_proc->HL.b.h <<= 1;
  3540.      gameboy_proc->HL.b.h += carry;
  3541.      
  3542.      if (gameboy_proc->HL.b.h)
  3543.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3544.      else
  3545.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3546.           
  3547.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3548.      
  3549.      MORE_CYCLES2(8);
  3550. }
  3551.  
  3552. void inst_cb_rlc_hl_indirect()
  3553. {
  3554.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  3555.      int carry = (value & 0x80) >> 7;
  3556.      
  3557.      if (value & 0x80) 
  3558.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3559.      else
  3560.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3561.      
  3562.      value <<= 1;
  3563.      value += carry;
  3564.      
  3565.      if (value)
  3566.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3567.      else
  3568.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3569.           
  3570.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3571.      
  3572.      memory_write_byte(gameboy_proc->HL.uw, value);
  3573.      
  3574.      MORE_CYCLES2(16);
  3575. }
  3576.  
  3577. void inst_cb_rlc_l()
  3578. {
  3579.      int carry = (gameboy_proc->HL.b.l & 0x80) >> 7;
  3580.      
  3581.      if (gameboy_proc->HL.b.l & 0x80) 
  3582.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3583.      else
  3584.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3585.      
  3586.      gameboy_proc->HL.b.l <<= 1;
  3587.      gameboy_proc->HL.b.l += carry;
  3588.      
  3589.      if (gameboy_proc->HL.b.l)
  3590.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3591.      else
  3592.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3593.           
  3594.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3595.      
  3596.      MORE_CYCLES2(8);
  3597. }
  3598.  
  3599. void inst_cb_rr_a()
  3600. {
  3601.      int carry = gameboy_proc->AF.b.h & 0x01;
  3602.      
  3603.      gameboy_proc->AF.b.h >>= 1;
  3604.      
  3605.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3606.           gameboy_proc->AF.b.h |= 0x80;
  3607.      }
  3608.      
  3609.      if (carry) {
  3610.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3611.      } else
  3612.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3613.           
  3614.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3615.      
  3616.      if (gameboy_proc->AF.b.h)
  3617.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3618.      else
  3619.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3620.           
  3621.      MORE_CYCLES2(8);
  3622. }
  3623.  
  3624. void inst_cb_rr_b()
  3625. {
  3626.      int carry = gameboy_proc->BC.b.h & 0x01;
  3627.      
  3628.      gameboy_proc->BC.b.h >>= 1;
  3629.      
  3630.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3631.           gameboy_proc->BC.b.h |= 0x80;
  3632.      }
  3633.      
  3634.      if (carry) {
  3635.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3636.      } else
  3637.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3638.           
  3639.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3640.      
  3641.      if (gameboy_proc->BC.b.h)
  3642.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3643.      else
  3644.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3645.           
  3646.      MORE_CYCLES2(8);
  3647. }
  3648.  
  3649. void inst_cb_rr_c()
  3650. {
  3651.      int carry = gameboy_proc->BC.b.l & 0x01;
  3652.      
  3653.      gameboy_proc->BC.b.l >>= 1;
  3654.      
  3655.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3656.           gameboy_proc->BC.b.l |= 0x80;
  3657.      }
  3658.      
  3659.      if (carry) {
  3660.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3661.      } else
  3662.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3663.           
  3664.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3665.      
  3666.      if (gameboy_proc->BC.b.l)
  3667.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3668.      else
  3669.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3670.           
  3671.      MORE_CYCLES2(8);
  3672. }
  3673.  
  3674. void inst_cb_rr_d()
  3675. {
  3676.      int carry = gameboy_proc->DE.b.h & 0x01;
  3677.      
  3678.      gameboy_proc->DE.b.h >>= 1;
  3679.      
  3680.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3681.           gameboy_proc->DE.b.h |= 0x80;
  3682.      }
  3683.      
  3684.      if (carry) {
  3685.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3686.      } else
  3687.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3688.           
  3689.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3690.      
  3691.      if (gameboy_proc->DE.b.h)
  3692.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3693.      else
  3694.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3695.           
  3696.      MORE_CYCLES2(8);
  3697. }
  3698.  
  3699. void inst_cb_rr_e()
  3700. {
  3701.      int carry = gameboy_proc->DE.b.l & 0x01;
  3702.      
  3703.      gameboy_proc->DE.b.l >>= 1;
  3704.      
  3705.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3706.           gameboy_proc->DE.b.l |= 0x80;
  3707.      }
  3708.      
  3709.      if (carry) {
  3710.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3711.      } else
  3712.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3713.           
  3714.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3715.      
  3716.      if (gameboy_proc->DE.b.l)
  3717.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3718.      else
  3719.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3720.           
  3721.      MORE_CYCLES2(8);
  3722. }
  3723.  
  3724. void inst_cb_rr_h()
  3725. {
  3726.      int carry = gameboy_proc->HL.b.h & 0x01;
  3727.      
  3728.      gameboy_proc->HL.b.h >>= 1;
  3729.      
  3730.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3731.           gameboy_proc->HL.b.h |= 0x80;
  3732.      }
  3733.      
  3734.      if (carry) {
  3735.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3736.      } else
  3737.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3738.           
  3739.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3740.      
  3741.      if (gameboy_proc->HL.b.h)
  3742.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3743.      else
  3744.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3745.           
  3746.      MORE_CYCLES2(8);
  3747. }
  3748.  
  3749. void inst_cb_rr_hl_indirect()
  3750. {
  3751.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  3752.      int carry = value & 0x01;
  3753.      
  3754.      value >>= 1;
  3755.      
  3756.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3757.           value |= 0x80;
  3758.      }
  3759.      
  3760.      if (carry) {
  3761.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3762.      } else
  3763.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3764.           
  3765.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3766.      
  3767.      if (value)
  3768.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3769.      else
  3770.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3771.           
  3772.      memory_write_byte(gameboy_proc->HL.uw, value);
  3773.      
  3774.      MORE_CYCLES2(16);
  3775. }
  3776.  
  3777. void inst_cb_rr_l()
  3778. {
  3779.      int carry = gameboy_proc->HL.b.l & 0x01;
  3780.      
  3781.      gameboy_proc->HL.b.l >>= 1;
  3782.      
  3783.      if (FLAGS_ISCARRY(gameboy_proc)) {
  3784.           gameboy_proc->HL.b.l |= 0x80;
  3785.      }
  3786.      
  3787.      if (carry) {
  3788.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3789.      } else
  3790.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3791.           
  3792.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3793.      
  3794.      if (gameboy_proc->HL.b.l)
  3795.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3796.      else
  3797.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3798.           
  3799.      MORE_CYCLES2(8);
  3800. }
  3801.  
  3802. void inst_cb_rrc_a()
  3803. {
  3804.      int carry = gameboy_proc->AF.b.h & 0x01;
  3805.      
  3806.      gameboy_proc->AF.b.h >>= 1;
  3807.      
  3808.      if (carry) {
  3809.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3810.           gameboy_proc->AF.b.h |= 0x80;
  3811.      } else
  3812.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3813.           
  3814.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3815.      
  3816.      if (gameboy_proc->AF.b.h)
  3817.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3818.      else
  3819.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3820.           
  3821.      MORE_CYCLES2(8);
  3822. }
  3823.  
  3824. void inst_cb_rrc_b()
  3825. {
  3826.      int carry = gameboy_proc->BC.b.h & 0x01;
  3827.      
  3828.      gameboy_proc->BC.b.h >>= 1;
  3829.      
  3830.      if (carry) {
  3831.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3832.           gameboy_proc->BC.b.h |= 0x80;
  3833.      } else
  3834.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3835.           
  3836.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3837.      
  3838.      if (gameboy_proc->BC.b.h)
  3839.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3840.      else
  3841.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3842.           
  3843.      MORE_CYCLES2(8);
  3844. }
  3845.  
  3846. void inst_cb_rrc_c()
  3847. {
  3848.      int carry = gameboy_proc->BC.b.l & 0x01;
  3849.      
  3850.      gameboy_proc->BC.b.l >>= 1;
  3851.      
  3852.      if (carry) {
  3853.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3854.           gameboy_proc->BC.b.l |= 0x80;
  3855.      } else
  3856.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3857.           
  3858.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3859.      
  3860.      if (gameboy_proc->BC.b.l)
  3861.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3862.      else
  3863.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3864.           
  3865.      MORE_CYCLES2(8);
  3866. }
  3867.  
  3868. void inst_cb_rrc_d()
  3869. {
  3870.      int carry = gameboy_proc->DE.b.h & 0x01;
  3871.      
  3872.      gameboy_proc->DE.b.h >>= 1;
  3873.      
  3874.      if (carry) {
  3875.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3876.           gameboy_proc->DE.b.h |= 0x80;
  3877.      } else
  3878.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3879.           
  3880.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3881.      
  3882.      if (gameboy_proc->DE.b.h)
  3883.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3884.      else
  3885.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3886.           
  3887.      MORE_CYCLES2(8);
  3888. }
  3889.  
  3890. void inst_cb_rrc_e()
  3891. {
  3892.      int carry = gameboy_proc->DE.b.l & 0x01;
  3893.      
  3894.      gameboy_proc->DE.b.l >>= 1;
  3895.      
  3896.      if (carry) {
  3897.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3898.           gameboy_proc->DE.b.l |= 0x80;
  3899.      } else
  3900.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3901.           
  3902.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3903.      
  3904.      if (gameboy_proc->DE.b.l)
  3905.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3906.      else
  3907.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3908.           
  3909.      MORE_CYCLES2(8);
  3910. }
  3911.  
  3912. void inst_cb_rrc_h()
  3913. {
  3914.      int carry = gameboy_proc->HL.b.h & 0x01;
  3915.      
  3916.      gameboy_proc->HL.b.h >>= 1;
  3917.      
  3918.      if (carry) {
  3919.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3920.           gameboy_proc->HL.b.h |= 0x80;
  3921.      } else
  3922.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3923.           
  3924.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3925.      
  3926.      if (gameboy_proc->HL.b.h)
  3927.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3928.      else
  3929.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3930.           
  3931.      MORE_CYCLES2(8);
  3932. }
  3933.  
  3934. void inst_cb_rrc_hl_indirect()
  3935. {
  3936.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  3937.      int carry = value & 0x01;
  3938.      
  3939.      value >>= 1;
  3940.      
  3941.      if (carry) {
  3942.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3943.           value |= 0x80;
  3944.      } else
  3945.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3946.           
  3947.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3948.      
  3949.      if (value)
  3950.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3951.      else
  3952.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3953.           
  3954.      memory_write_byte(gameboy_proc->HL.uw, value);
  3955.      
  3956.      MORE_CYCLES2(16);
  3957. }
  3958.  
  3959. void inst_cb_rrc_l()
  3960. {
  3961.      int carry = gameboy_proc->HL.b.l & 0x01;
  3962.      
  3963.      gameboy_proc->HL.b.l >>= 1;
  3964.      
  3965.      if (carry) {
  3966.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  3967.           gameboy_proc->HL.b.l |= 0x80;
  3968.      } else
  3969.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  3970.           
  3971.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  3972.      
  3973.      if (gameboy_proc->HL.b.l)
  3974.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  3975.      else
  3976.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  3977.           
  3978.      MORE_CYCLES2(8);
  3979. }
  3980.  
  3981. void inst_cb_set_0_a()
  3982. {
  3983.      gameboy_proc->AF.b.h |= 0x01;
  3984.      MORE_CYCLES2(8);
  3985. }
  3986.  
  3987. void inst_cb_set_0_b()
  3988. {
  3989.      gameboy_proc->BC.b.h |= 0x01;
  3990.      MORE_CYCLES2(8);
  3991. }
  3992.  
  3993. void inst_cb_set_0_c()
  3994. {
  3995.      gameboy_proc->BC.b.l |= 0x01;
  3996.      MORE_CYCLES2(8);
  3997. }
  3998.  
  3999. void inst_cb_set_0_d()
  4000. {
  4001.      gameboy_proc->DE.b.h |= 0x01;
  4002.      MORE_CYCLES2(8);
  4003. }
  4004.  
  4005. void inst_cb_set_0_e()
  4006. {
  4007.      gameboy_proc->DE.b.l |= 0x01;
  4008.      MORE_CYCLES2(8);
  4009. }
  4010.  
  4011. void inst_cb_set_0_h()
  4012. {
  4013.      gameboy_proc->HL.b.h |= 0x01;
  4014.      MORE_CYCLES2(8);
  4015. }
  4016.  
  4017. void inst_cb_set_0_hl_indirect()
  4018. {
  4019.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4020.      memory_write_byte(gameboy_proc->HL.uw, what | 0x01);
  4021.      MORE_CYCLES2(12);
  4022. }
  4023.  
  4024. void inst_cb_set_0_l()
  4025. {
  4026.      gameboy_proc->HL.b.l |= 0x01;
  4027.      MORE_CYCLES2(8);
  4028. }
  4029.  
  4030. void inst_cb_set_1_a()
  4031. {
  4032.      gameboy_proc->AF.b.h |= 0x02;
  4033.      MORE_CYCLES2(8);
  4034. }
  4035.  
  4036. void inst_cb_set_1_b()
  4037. {
  4038.      gameboy_proc->BC.b.h |= 0x02;
  4039.      MORE_CYCLES2(8);
  4040. }
  4041.  
  4042. void inst_cb_set_1_c()
  4043. {
  4044.      gameboy_proc->BC.b.l |= 0x02;
  4045.      MORE_CYCLES2(8);
  4046. }
  4047.  
  4048. void inst_cb_set_1_d()
  4049. {
  4050.      gameboy_proc->DE.b.h |= 0x02;
  4051.      MORE_CYCLES2(8);
  4052. }
  4053.  
  4054. void inst_cb_set_1_e()
  4055. {
  4056.      gameboy_proc->DE.b.l |= 0x02;
  4057.      MORE_CYCLES2(8);
  4058. }
  4059.  
  4060. void inst_cb_set_1_h()
  4061. {
  4062.      gameboy_proc->HL.b.h |= 0x02;
  4063.      MORE_CYCLES2(8);
  4064. }
  4065.  
  4066. void inst_cb_set_1_hl_indirect()
  4067. {
  4068.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4069.      memory_write_byte(gameboy_proc->HL.uw, what | 0x02);
  4070.      MORE_CYCLES2(12);
  4071. }
  4072.  
  4073. void inst_cb_set_1_l()
  4074. {
  4075.      gameboy_proc->HL.b.l |= 0x02;
  4076.      MORE_CYCLES2(8);
  4077. }
  4078.  
  4079. void inst_cb_set_2_a()
  4080. {
  4081.      gameboy_proc->AF.b.h |= 0x04;
  4082.      MORE_CYCLES2(8);
  4083. }
  4084.  
  4085. void inst_cb_set_2_b()
  4086. {
  4087.      gameboy_proc->BC.b.h |= 0x04;
  4088.      MORE_CYCLES2(8);
  4089. }
  4090.  
  4091. void inst_cb_set_2_c()
  4092. {
  4093.      gameboy_proc->BC.b.l |= 0x04;
  4094.      MORE_CYCLES2(8);
  4095. }
  4096.  
  4097. void inst_cb_set_2_d()
  4098. {
  4099.      gameboy_proc->DE.b.h |= 0x04;
  4100.      MORE_CYCLES2(8);
  4101. }
  4102.  
  4103. void inst_cb_set_2_e()
  4104. {
  4105.      gameboy_proc->DE.b.l |= 0x04;
  4106.      MORE_CYCLES2(8);
  4107. }
  4108.  
  4109. void inst_cb_set_2_h()
  4110. {
  4111.      gameboy_proc->HL.b.h |= 0x04;
  4112.      MORE_CYCLES2(8);
  4113. }
  4114.  
  4115. void inst_cb_set_2_hl_indirect()
  4116. {
  4117.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4118.      memory_write_byte(gameboy_proc->HL.uw, what | 0x04);
  4119.      MORE_CYCLES2(12);
  4120. }
  4121.  
  4122. void inst_cb_set_2_l()
  4123. {
  4124.      gameboy_proc->HL.b.l |= 0x04;
  4125.      MORE_CYCLES2(8);
  4126. }
  4127.  
  4128. void inst_cb_set_3_a()
  4129. {
  4130.      gameboy_proc->AF.b.h |= 0x08;
  4131.      MORE_CYCLES2(8);
  4132. }
  4133.  
  4134. void inst_cb_set_3_b()
  4135. {
  4136.      gameboy_proc->BC.b.h |= 0x08;
  4137.      MORE_CYCLES2(8);
  4138. }
  4139.  
  4140. void inst_cb_set_3_c()
  4141. {
  4142.      gameboy_proc->BC.b.l |= 0x08;
  4143.      MORE_CYCLES2(8);
  4144. }
  4145.  
  4146. void inst_cb_set_3_d()
  4147. {
  4148.      gameboy_proc->DE.b.h |= 0x08;
  4149.      MORE_CYCLES2(8);
  4150. }
  4151.  
  4152. void inst_cb_set_3_e()
  4153. {
  4154.      gameboy_proc->DE.b.l |= 0x08;
  4155.      MORE_CYCLES2(8);
  4156. }
  4157.  
  4158. void inst_cb_set_3_h()
  4159. {
  4160.      gameboy_proc->HL.b.h |= 0x08;
  4161.      MORE_CYCLES2(8);
  4162. }
  4163.  
  4164. void inst_cb_set_3_hl_indirect()
  4165. {
  4166.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4167.      memory_write_byte(gameboy_proc->HL.uw, what | 0x08);
  4168.      MORE_CYCLES2(12);
  4169. }
  4170.  
  4171. void inst_cb_set_3_l()
  4172. {
  4173.      gameboy_proc->HL.b.l |= 0x08;
  4174.      MORE_CYCLES2(8);
  4175. }
  4176.  
  4177. void inst_cb_set_4_a()
  4178. {
  4179.      gameboy_proc->AF.b.h |= 0x10;
  4180.      MORE_CYCLES2(8);
  4181. }
  4182.  
  4183. void inst_cb_set_4_b()
  4184. {
  4185.      gameboy_proc->BC.b.h |= 0x10;
  4186.      MORE_CYCLES2(8);
  4187. }
  4188.  
  4189. void inst_cb_set_4_c()
  4190. {
  4191.      gameboy_proc->BC.b.l |= 0x10;
  4192.      MORE_CYCLES2(8);
  4193. }
  4194.  
  4195. void inst_cb_set_4_d()
  4196. {
  4197.      gameboy_proc->DE.b.h |= 0x10;
  4198.      MORE_CYCLES2(8);
  4199. }
  4200.  
  4201. void inst_cb_set_4_e()
  4202. {
  4203.      gameboy_proc->DE.b.l |= 0x10;
  4204.      MORE_CYCLES2(8);
  4205. }
  4206.  
  4207. void inst_cb_set_4_h()
  4208. {
  4209.      gameboy_proc->HL.b.h |= 0x10;
  4210.      MORE_CYCLES2(8);
  4211. }
  4212.  
  4213. void inst_cb_set_4_hl_indirect()
  4214. {
  4215.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4216.      memory_write_byte(gameboy_proc->HL.uw, what | 0x10);
  4217.      MORE_CYCLES2(12);
  4218. }
  4219.  
  4220. void inst_cb_set_4_l()
  4221. {
  4222.      gameboy_proc->HL.b.l |= 0x10;
  4223.      MORE_CYCLES2(8);
  4224. }
  4225.  
  4226. void inst_cb_set_5_a()
  4227. {
  4228.      gameboy_proc->AF.b.h |= 0x20;
  4229.      MORE_CYCLES2(8);
  4230. }
  4231.  
  4232. void inst_cb_set_5_b()
  4233. {
  4234.      gameboy_proc->BC.b.h |= 0x20;
  4235.      MORE_CYCLES2(8);
  4236. }
  4237.  
  4238. void inst_cb_set_5_c()
  4239. {
  4240.      gameboy_proc->BC.b.l |= 0x20;
  4241.      MORE_CYCLES2(8);
  4242. }
  4243.  
  4244. void inst_cb_set_5_d()
  4245. {
  4246.      gameboy_proc->DE.b.h |= 0x20;
  4247.      MORE_CYCLES2(8);
  4248. }
  4249.  
  4250. void inst_cb_set_5_e()
  4251. {
  4252.      gameboy_proc->DE.b.l |= 0x20;
  4253.      MORE_CYCLES2(8);
  4254. }
  4255.  
  4256. void inst_cb_set_5_h()
  4257. {
  4258.      gameboy_proc->HL.b.h |= 0x20;
  4259.      MORE_CYCLES2(8);
  4260. }
  4261.  
  4262. void inst_cb_set_5_hl_indirect()
  4263. {
  4264.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4265.      memory_write_byte(gameboy_proc->HL.uw, what | 0x20);
  4266.      MORE_CYCLES2(12);
  4267. }
  4268.  
  4269. void inst_cb_set_5_l()
  4270. {
  4271.      gameboy_proc->HL.b.l |= 0x20;
  4272.      MORE_CYCLES2(8);
  4273. }
  4274.  
  4275. void inst_cb_set_6_a()
  4276. {
  4277.      gameboy_proc->AF.b.h |= 0x40;
  4278.      MORE_CYCLES2(8);
  4279. }
  4280.  
  4281. void inst_cb_set_6_b()
  4282. {
  4283.      gameboy_proc->BC.b.h |= 0x40;
  4284.      MORE_CYCLES2(8);
  4285. }
  4286.  
  4287. void inst_cb_set_6_c()
  4288. {
  4289.      gameboy_proc->BC.b.l |= 0x40;
  4290.      MORE_CYCLES2(8);
  4291. }
  4292.  
  4293. void inst_cb_set_6_d()
  4294. {
  4295.      gameboy_proc->DE.b.h |= 0x40;
  4296.      MORE_CYCLES2(8);
  4297. }
  4298.  
  4299. void inst_cb_set_6_e()
  4300. {
  4301.      gameboy_proc->DE.b.l |= 0x40;
  4302.      MORE_CYCLES2(8);
  4303. }
  4304.  
  4305. void inst_cb_set_6_h()
  4306. {
  4307.      gameboy_proc->HL.b.h |= 0x40;
  4308.      MORE_CYCLES2(8);
  4309. }
  4310.  
  4311. void inst_cb_set_6_hl_indirect()
  4312. {
  4313.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4314.      memory_write_byte(gameboy_proc->HL.uw, what | 0x40);
  4315.      MORE_CYCLES2(12);
  4316. }
  4317.  
  4318. void inst_cb_set_6_l()
  4319. {
  4320.      gameboy_proc->HL.b.l |= 0x40;
  4321.      MORE_CYCLES2(8);
  4322. }
  4323.  
  4324. void inst_cb_set_7_a()
  4325. {
  4326.      gameboy_proc->AF.b.h |= 0x80;
  4327.      MORE_CYCLES2(8);
  4328. }
  4329.  
  4330. void inst_cb_set_7_b()
  4331. {
  4332.      gameboy_proc->BC.b.h |= 0x80;
  4333.      MORE_CYCLES2(8);
  4334. }
  4335.  
  4336. void inst_cb_set_7_c()
  4337. {
  4338.      gameboy_proc->BC.b.l |= 0x80;
  4339.      MORE_CYCLES2(8);
  4340. }
  4341.  
  4342. void inst_cb_set_7_d()
  4343. {
  4344.      gameboy_proc->DE.b.h |= 0x80;
  4345.      MORE_CYCLES2(8);
  4346. }
  4347.  
  4348. void inst_cb_set_7_e()
  4349. {
  4350.      gameboy_proc->DE.b.l |= 0x80;
  4351.      MORE_CYCLES2(8);
  4352. }
  4353.  
  4354. void inst_cb_set_7_h()
  4355. {
  4356.      gameboy_proc->HL.b.h |= 0x80;
  4357.      MORE_CYCLES2(8);
  4358. }
  4359.  
  4360. void inst_cb_set_7_hl_indirect()
  4361. {
  4362.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4363.      memory_write_byte(gameboy_proc->HL.uw, what | 0x80);
  4364.      MORE_CYCLES2(12);
  4365. }
  4366.  
  4367. void inst_cb_set_7_l()
  4368. {
  4369.      gameboy_proc->HL.b.l |= 0x80;
  4370.      MORE_CYCLES2(8);
  4371. }
  4372.  
  4373. void inst_cb_sla_a()
  4374. {
  4375.      if (gameboy_proc->AF.b.h & 0x80)
  4376.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4377.      else
  4378.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4379.      
  4380.      gameboy_proc->AF.b.h <<= 1;
  4381.      
  4382.      if (gameboy_proc->AF.b.h)
  4383.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4384.      else
  4385.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4386.      
  4387.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4388.      
  4389.      MORE_CYCLES2(8);
  4390. }
  4391.  
  4392. void inst_cb_sla_b()
  4393. {
  4394.      if (gameboy_proc->BC.b.h & 0x80)
  4395.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4396.      else
  4397.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4398.      
  4399.      gameboy_proc->BC.b.h <<= 1;
  4400.      
  4401.      if (gameboy_proc->BC.b.h)
  4402.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4403.      else
  4404.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4405.      
  4406.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4407.      
  4408.      MORE_CYCLES2(8);
  4409. }
  4410.  
  4411. void inst_cb_sla_c()
  4412. {
  4413.      if (gameboy_proc->BC.b.l & 0x80)
  4414.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4415.      else
  4416.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4417.      
  4418.      gameboy_proc->BC.b.l <<= 1;
  4419.      
  4420.      if (gameboy_proc->BC.b.l)
  4421.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4422.      else
  4423.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4424.      
  4425.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4426.      
  4427.      MORE_CYCLES2(8);
  4428. }
  4429.  
  4430. void inst_cb_sla_d()
  4431. {
  4432.      if (gameboy_proc->DE.b.h & 0x80)
  4433.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4434.      else
  4435.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4436.      
  4437.      gameboy_proc->DE.b.h <<= 1;
  4438.      
  4439.      if (gameboy_proc->DE.b.h)
  4440.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4441.      else
  4442.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4443.      
  4444.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4445.      
  4446.      MORE_CYCLES2(8);
  4447. }
  4448.  
  4449. void inst_cb_sla_e()
  4450. {
  4451.      if (gameboy_proc->DE.b.l & 0x80)
  4452.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4453.      else
  4454.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4455.      
  4456.      gameboy_proc->DE.b.l <<= 1;
  4457.      
  4458.      if (gameboy_proc->DE.b.l)
  4459.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4460.      else
  4461.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4462.      
  4463.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4464.      
  4465.      MORE_CYCLES2(8);
  4466. }
  4467.  
  4468. void inst_cb_sla_h()
  4469. {
  4470.      if (gameboy_proc->HL.b.h & 0x80)
  4471.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4472.      else
  4473.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4474.      
  4475.      gameboy_proc->HL.b.h <<= 1;
  4476.      
  4477.      if (gameboy_proc->HL.b.h)
  4478.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4479.      else
  4480.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4481.      
  4482.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4483.      
  4484.      MORE_CYCLES2(8);
  4485. }
  4486.  
  4487. void inst_cb_sla_hl_indirect()
  4488. {
  4489.      unsigned char data = memory_read_byte(gameboy_proc->HL.uw);
  4490.      
  4491.      if (data & 0x80)
  4492.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4493.      else
  4494.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4495.      
  4496.      data <<= 1;
  4497.  
  4498.      memory_write_byte(gameboy_proc->HL.uw, data);     /* fix */
  4499.           
  4500.      if (data)
  4501.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4502.      else
  4503.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4504.      
  4505.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4506.      
  4507.      MORE_CYCLES2(16);
  4508. }
  4509.  
  4510. void inst_cb_sla_l()
  4511. {
  4512.      if (gameboy_proc->HL.b.l & 0x80)
  4513.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4514.      else
  4515.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4516.      
  4517.      gameboy_proc->HL.b.l <<= 1;
  4518.      
  4519.      if (gameboy_proc->HL.b.l)
  4520.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4521.      else
  4522.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4523.      
  4524.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4525.      
  4526.      MORE_CYCLES2(8);
  4527. }
  4528.  
  4529. void inst_cb_sra_a()
  4530. {
  4531.      if (gameboy_proc->AF.b.h & 0x01)
  4532.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4533.      else
  4534.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4535.      
  4536.      gameboy_proc->AF.b.h = (gameboy_proc->AF.b.h & 0x80) | (gameboy_proc->AF.b.h >> 1);
  4537.      
  4538.      if (gameboy_proc->AF.b.h) 
  4539.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4540.      else
  4541.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4542.      
  4543.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4544.      
  4545.      MORE_CYCLES2(8);
  4546. }
  4547.  
  4548. void inst_cb_sra_b()
  4549. {
  4550.      if (gameboy_proc->BC.b.h & 0x01)
  4551.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4552.      else
  4553.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4554.      
  4555.      gameboy_proc->BC.b.h = (gameboy_proc->BC.b.h & 0x80) | (gameboy_proc->BC.b.h >> 1);
  4556.      
  4557.      if (gameboy_proc->BC.b.h) 
  4558.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4559.      else
  4560.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4561.      
  4562.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4563.      
  4564.      MORE_CYCLES2(8);
  4565. }
  4566.  
  4567. void inst_cb_sra_c()
  4568. {
  4569.      if (gameboy_proc->BC.b.l & 0x01)
  4570.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4571.      else
  4572.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4573.      
  4574.      gameboy_proc->BC.b.l = (gameboy_proc->BC.b.l & 0x80) | (gameboy_proc->BC.b.l >> 1);
  4575.      
  4576.      if (gameboy_proc->BC.b.l) 
  4577.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4578.      else
  4579.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4580.      
  4581.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4582.      
  4583.      MORE_CYCLES2(8);
  4584. }
  4585.  
  4586. void inst_cb_sra_d()
  4587. {
  4588.      if (gameboy_proc->DE.b.h & 0x01)
  4589.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4590.      else
  4591.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4592.      
  4593.      gameboy_proc->DE.b.h = (gameboy_proc->DE.b.h & 0x80) | (gameboy_proc->DE.b.h >> 1);
  4594.      
  4595.      if (gameboy_proc->DE.b.h) 
  4596.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4597.      else
  4598.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4599.      
  4600.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4601.      
  4602.      MORE_CYCLES2(8);
  4603. }
  4604.  
  4605. void inst_cb_sra_e()
  4606. {
  4607.      if (gameboy_proc->DE.b.l & 0x01)
  4608.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4609.      else
  4610.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4611.      
  4612.      gameboy_proc->DE.b.l = (gameboy_proc->DE.b.l & 0x80) | (gameboy_proc->DE.b.l >> 1);
  4613.      
  4614.      if (gameboy_proc->DE.b.l) 
  4615.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4616.      else
  4617.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4618.      
  4619.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4620.      
  4621.      MORE_CYCLES2(8);
  4622. }
  4623.  
  4624. void inst_cb_sra_h()
  4625. {
  4626.      if (gameboy_proc->HL.b.h & 0x01)
  4627.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4628.      else
  4629.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4630.      
  4631.      gameboy_proc->HL.b.h = (gameboy_proc->HL.b.h & 0x80) | (gameboy_proc->HL.b.h >> 1);
  4632.      
  4633.      if (gameboy_proc->HL.b.h) 
  4634.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4635.      else
  4636.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4637.      
  4638.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4639.      
  4640.      MORE_CYCLES2(8);
  4641. }
  4642.  
  4643. void inst_cb_sra_hl_indirect()
  4644. {
  4645.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  4646.      
  4647.      if (value & 0x01)
  4648.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4649.      else
  4650.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4651.      
  4652.      value = (value & 0x80) | (value >> 1);
  4653.      
  4654.      if (value) 
  4655.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4656.      else
  4657.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4658.      
  4659.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4660.      
  4661.      memory_write_byte(gameboy_proc->HL.uw, value);
  4662.      
  4663.      MORE_CYCLES2(16);
  4664. }
  4665.  
  4666. void inst_cb_sra_l()
  4667. {
  4668.      if (gameboy_proc->HL.b.l & 0x01)
  4669.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4670.      else
  4671.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4672.      
  4673.      gameboy_proc->HL.b.l = (gameboy_proc->HL.b.l & 0x80) | (gameboy_proc->HL.b.l >> 1);
  4674.      
  4675.      if (gameboy_proc->HL.b.l) 
  4676.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4677.      else
  4678.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4679.      
  4680.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4681.      
  4682.      MORE_CYCLES2(8);
  4683. }
  4684.  
  4685. void inst_cb_srl_a()
  4686. {
  4687.      if (gameboy_proc->AF.b.h & 0x01)
  4688.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4689.      else
  4690.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4691.      
  4692.      gameboy_proc->AF.b.h >>= 1;
  4693.      
  4694.      if (gameboy_proc->AF.b.h)
  4695.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4696.      else
  4697.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4698.           
  4699.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4700.      
  4701.      MORE_CYCLES2(8);
  4702. }
  4703.  
  4704. void inst_cb_srl_b()
  4705. {
  4706.      if (gameboy_proc->BC.b.h & 0x01)
  4707.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4708.      else
  4709.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4710.      
  4711.      gameboy_proc->BC.b.h >>= 1;
  4712.      
  4713.      if (gameboy_proc->BC.b.h)
  4714.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4715.      else
  4716.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4717.           
  4718.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4719.      
  4720.      MORE_CYCLES2(8);
  4721. }
  4722.  
  4723. void inst_cb_srl_c()
  4724. {
  4725.      if (gameboy_proc->BC.b.l & 0x01)
  4726.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4727.      else
  4728.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4729.      
  4730.      gameboy_proc->BC.b.l >>= 1;
  4731.      
  4732.      if (gameboy_proc->BC.b.l)
  4733.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4734.      else
  4735.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4736.           
  4737.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4738.      
  4739.      MORE_CYCLES2(8);
  4740. }
  4741.  
  4742. void inst_cb_srl_d()
  4743. {
  4744.      if (gameboy_proc->DE.b.h & 0x01)
  4745.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4746.      else
  4747.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4748.      
  4749.      gameboy_proc->DE.b.h >>= 1;
  4750.      
  4751.      if (gameboy_proc->DE.b.h)
  4752.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4753.      else
  4754.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4755.           
  4756.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4757.      
  4758.      MORE_CYCLES2(8);
  4759. }
  4760.  
  4761. void inst_cb_srl_e()
  4762. {
  4763.      if (gameboy_proc->DE.b.l & 0x01)
  4764.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4765.      else
  4766.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4767.      
  4768.      gameboy_proc->DE.b.l >>= 1;
  4769.      
  4770.      if (gameboy_proc->DE.b.l)
  4771.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4772.      else
  4773.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4774.           
  4775.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4776.      
  4777.      MORE_CYCLES2(8);
  4778. }
  4779.  
  4780. void inst_cb_srl_h()
  4781. {
  4782.      if (gameboy_proc->HL.b.h & 0x01)
  4783.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4784.      else
  4785.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4786.      
  4787.      gameboy_proc->HL.b.h >>= 1;
  4788.      
  4789.      if (gameboy_proc->HL.b.h)
  4790.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4791.      else
  4792.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4793.           
  4794.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4795.      
  4796.      MORE_CYCLES2(8);
  4797. }
  4798.  
  4799. void inst_cb_srl_hl_indirect()
  4800. {
  4801.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  4802.      
  4803.      if (value & 0x01)
  4804.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4805.      else
  4806.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4807.      
  4808.      value >>= 1;
  4809.      
  4810.      if (value)
  4811.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4812.      else
  4813.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4814.           
  4815.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4816.      
  4817.      memory_write_byte(gameboy_proc->HL.uw, value);
  4818.      
  4819.      MORE_CYCLES2(16);
  4820. }
  4821.  
  4822. void inst_cb_srl_l()
  4823. {
  4824.      if (gameboy_proc->HL.b.l & 0x01)
  4825.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4826.      else
  4827.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4828.      
  4829.      gameboy_proc->HL.b.l >>= 1;
  4830.      
  4831.      if (gameboy_proc->HL.b.l)
  4832.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4833.      else
  4834.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4835.           
  4836.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4837.      
  4838.      MORE_CYCLES2(8);
  4839. }
  4840.  
  4841. void inst_cb_swap_a()
  4842. {
  4843.      unsigned char what = gameboy_proc->AF.b.h;
  4844.      gameboy_proc->AF.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
  4845.      
  4846.      if (what)
  4847.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4848.      else
  4849.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4850.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4851.      
  4852.      MORE_CYCLES2(8);
  4853. }
  4854.  
  4855. void inst_cb_swap_b()
  4856. {
  4857.      unsigned char what = gameboy_proc->BC.b.h;
  4858.      gameboy_proc->BC.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
  4859.      
  4860.      if (what)
  4861.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4862.      else
  4863.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4864.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4865.      
  4866.      MORE_CYCLES2(8);
  4867. }
  4868.  
  4869. void inst_cb_swap_c()
  4870. {
  4871.      unsigned char what = gameboy_proc->BC.b.l;
  4872.      gameboy_proc->BC.b.l = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
  4873.      
  4874.      if (what)
  4875.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4876.      else
  4877.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4878.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4879.      
  4880.      MORE_CYCLES2(8);
  4881. }
  4882.  
  4883. void inst_cb_swap_d()
  4884. {
  4885.      unsigned char what = gameboy_proc->DE.b.h;
  4886.      gameboy_proc->DE.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
  4887.      
  4888.      if (what)
  4889.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4890.      else
  4891.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4892.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4893.      
  4894.      MORE_CYCLES2(8);
  4895. }
  4896.  
  4897. void inst_cb_swap_e()
  4898. {
  4899.      unsigned char what = gameboy_proc->DE.b.l;
  4900.      gameboy_proc->DE.b.l = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
  4901.      
  4902.      if (what)
  4903.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4904.      else
  4905.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4906.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4907.      
  4908.      MORE_CYCLES2(8);
  4909. }
  4910.  
  4911. void inst_cb_swap_h()
  4912. {
  4913.      unsigned char what = gameboy_proc->HL.b.h;
  4914.      gameboy_proc->HL.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
  4915.      
  4916.      if (what)
  4917.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4918.      else
  4919.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4920.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4921.      
  4922.      MORE_CYCLES2(8);
  4923. }
  4924.  
  4925. void inst_cb_swap_hl_indirect()
  4926. {
  4927.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  4928.      memory_write_byte(gameboy_proc->HL.uw, ((what & 0xF) << 4) | ((what & 0xF0) >> 4));
  4929.      
  4930.      if (what)
  4931.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4932.      else
  4933.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4934.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4935.      
  4936.      MORE_CYCLES2(16);
  4937. }
  4938.  
  4939. void inst_cb_swap_l()
  4940. {
  4941.      unsigned char what = gameboy_proc->HL.b.l;
  4942.      gameboy_proc->HL.b.l = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
  4943.      
  4944.      if (what)
  4945.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4946.      else
  4947.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4948.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
  4949.      
  4950.      MORE_CYCLES2(8);
  4951. }
  4952.  
  4953. void inst_ccf()
  4954. {
  4955.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  4956.      if (FLAGS_ISCARRY(gameboy_proc))
  4957.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4958.      else
  4959.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4960.      MORE_CYCLES2(4);
  4961. }
  4962.  
  4963. void inst_cp_a()
  4964. {
  4965.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO);
  4966.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_HALFCARRY);
  4967.      MORE_CYCLES2(4);
  4968. }
  4969.  
  4970. void inst_cp_b()
  4971. {
  4972.      unsigned char value = gameboy_proc->BC.b.h;
  4973.      
  4974.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  4975.      
  4976.      if (gameboy_proc->AF.b.h == value)
  4977.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  4978.      else
  4979.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  4980.      
  4981.      if (value > gameboy_proc->AF.b.h)
  4982.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  4983.      else
  4984.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  4985.           
  4986.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  4987.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  4988.      else
  4989.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  4990.           
  4991.      MORE_CYCLES2(4);
  4992. }
  4993.  
  4994. void inst_cp_c()
  4995. {
  4996.      unsigned char value = gameboy_proc->BC.b.l;
  4997.      
  4998.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  4999.      
  5000.      if (gameboy_proc->AF.b.h == value)
  5001.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5002.      else
  5003.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5004.      
  5005.      if (value > gameboy_proc->AF.b.h)
  5006.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5007.      else
  5008.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5009.           
  5010.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  5011.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5012.      else
  5013.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5014.           
  5015.      MORE_CYCLES2(4);
  5016. }
  5017.  
  5018. void inst_cp_d()
  5019. {
  5020.      unsigned char value = gameboy_proc->DE.b.h;
  5021.      
  5022.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5023.      
  5024.      if (gameboy_proc->AF.b.h == value)
  5025.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5026.      else
  5027.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5028.      
  5029.      if (value > gameboy_proc->AF.b.h)
  5030.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5031.      else
  5032.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5033.           
  5034.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  5035.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5036.      else
  5037.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5038.           
  5039.      MORE_CYCLES2(4);
  5040. }
  5041.  
  5042. void inst_cp_e()
  5043. {
  5044.      unsigned char value = gameboy_proc->DE.b.l;
  5045.      
  5046.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5047.      
  5048.      if (gameboy_proc->AF.b.h == value)
  5049.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5050.      else
  5051.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5052.      
  5053.      if (value > gameboy_proc->AF.b.h)
  5054.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5055.      else
  5056.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5057.           
  5058.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  5059.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5060.      else
  5061.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5062.           
  5063.      MORE_CYCLES2(4);
  5064. }
  5065.  
  5066. void inst_cp_h()
  5067. {
  5068.      unsigned char value = gameboy_proc->HL.b.h;
  5069.      
  5070.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5071.      
  5072.      if (gameboy_proc->AF.b.h == value)
  5073.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5074.      else
  5075.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5076.      
  5077.      if (value > gameboy_proc->AF.b.h)
  5078.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5079.      else
  5080.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5081.           
  5082.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  5083.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5084.      else
  5085.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5086.           
  5087.      MORE_CYCLES2(4);
  5088. }
  5089.  
  5090. void inst_cp_hl_indirect()
  5091. {
  5092.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  5093.      
  5094.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5095.      
  5096.      if (gameboy_proc->AF.b.h == value)
  5097.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5098.      else
  5099.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5100.      
  5101.      if (value > gameboy_proc->AF.b.h)
  5102.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5103.      else
  5104.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5105.           
  5106.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  5107.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5108.      else
  5109.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5110.           
  5111.      MORE_CYCLES2(8);
  5112. }
  5113.  
  5114. void inst_cp_l()
  5115. {
  5116.      unsigned char value = gameboy_proc->HL.b.l;
  5117.      
  5118.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5119.      
  5120.      if (gameboy_proc->AF.b.h == value)
  5121.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5122.      else
  5123.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5124.      
  5125.      if (value > gameboy_proc->AF.b.h)
  5126.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5127.      else
  5128.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5129.           
  5130.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  5131.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5132.      else
  5133.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5134.           
  5135.      MORE_CYCLES2(4);
  5136. }
  5137.  
  5138. void inst_cp_n()
  5139. {
  5140.      unsigned char value = memory_read_byte(gameboy_proc->PC.uw);
  5141.      gameboy_proc->PC.uw++;
  5142.      
  5143.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5144.      
  5145.      if (gameboy_proc->AF.b.h == value)
  5146.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5147.      else
  5148.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5149.      
  5150.      if (value > gameboy_proc->AF.b.h)
  5151.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5152.      else
  5153.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5154.           
  5155.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  5156.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5157.      else
  5158.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5159.           
  5160.      MORE_CYCLES2(8);
  5161. }
  5162.  
  5163. void inst_cpl()
  5164. {
  5165.      gameboy_proc->AF.b.h = ~gameboy_proc->AF.b.h;
  5166.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  5167.      MORE_CYCLES2(4);
  5168. }
  5169.  
  5170. void inst_daa()
  5171. {
  5172.      unsigned char value = gameboy_proc->AF.b.h;
  5173.  
  5174.  
  5175.      if((value & 0x0F) > 0x09) {   /* If its A-F */
  5176.           if(FLAGS_ISNEGATIVE(gameboy_proc))
  5177.                value -= 6;
  5178.           else
  5179.                value += 06;        /* make it not */
  5180.      }
  5181.      if((value & 0xF0) > 0x90) {   /* If its A-F */
  5182.           if(FLAGS_ISNEGATIVE(gameboy_proc))
  5183.                value -= 0x60;
  5184.           else
  5185.                value += 0x60;
  5186.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  5187.      } else
  5188.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  5189.           
  5190.      gameboy_proc->AF.b.h = value; 
  5191.  
  5192.      /* TODO */
  5193.      FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5194.      MORE_CYCLES2(4);
  5195. }
  5196.  
  5197. void inst_dec_a()
  5198. {
  5199.      if (gameboy_proc->AF.b.h & 0x0F) 
  5200.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5201.      else
  5202.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5203.      
  5204.      gameboy_proc->AF.b.h--;
  5205.      
  5206.      if (gameboy_proc->AF.b.h)
  5207.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5208.      else
  5209.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5210.           
  5211.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5212.      
  5213.      MORE_CYCLES2(4);
  5214. }
  5215.  
  5216. void inst_dec_b()
  5217. {
  5218.      if (gameboy_proc->BC.b.h & 0x0F) 
  5219.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5220.      else
  5221.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5222.      
  5223.      gameboy_proc->BC.b.h--;
  5224.      
  5225.      if (gameboy_proc->BC.b.h)
  5226.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5227.      else
  5228.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5229.           
  5230.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5231.      
  5232.      MORE_CYCLES2(4);
  5233. }
  5234.  
  5235. void inst_dec_bc()
  5236. {
  5237.      gameboy_proc->BC.uw--;
  5238.      MORE_CYCLES2(8);
  5239. }
  5240.  
  5241. void inst_dec_c()
  5242. {
  5243.      if (gameboy_proc->BC.b.l & 0x0F) 
  5244.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5245.      else
  5246.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5247.      
  5248.      gameboy_proc->BC.b.l--;
  5249.      
  5250.      if (gameboy_proc->BC.b.l)
  5251.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5252.      else
  5253.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5254.           
  5255.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5256.      
  5257.      MORE_CYCLES2(4);
  5258. }
  5259.  
  5260. void inst_dec_d()
  5261. {
  5262.      if (gameboy_proc->DE.b.h & 0x0F) 
  5263.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5264.      else
  5265.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5266.      
  5267.      gameboy_proc->DE.b.h--;
  5268.      
  5269.      if (gameboy_proc->DE.b.h)
  5270.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5271.      else
  5272.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5273.           
  5274.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5275.      
  5276.      MORE_CYCLES2(4);
  5277. }
  5278.  
  5279. void inst_dec_de()
  5280. {
  5281.      gameboy_proc->DE.uw--;
  5282.      MORE_CYCLES2(8);
  5283. }
  5284.  
  5285. void inst_dec_e()
  5286. {
  5287.      if (gameboy_proc->DE.b.l & 0x0F) 
  5288.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5289.      else
  5290.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5291.      
  5292.      gameboy_proc->DE.b.l--;
  5293.      
  5294.      if (gameboy_proc->DE.b.l)
  5295.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5296.      else
  5297.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5298.           
  5299.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5300.      
  5301.      MORE_CYCLES2(4);
  5302. }
  5303.  
  5304. void inst_dec_h()
  5305. {
  5306.      if (gameboy_proc->HL.b.h & 0x0F) 
  5307.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5308.      else
  5309.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5310.      
  5311.      gameboy_proc->HL.b.h--;
  5312.      
  5313.      if (gameboy_proc->HL.b.h)
  5314.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5315.      else
  5316.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5317.           
  5318.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5319.      
  5320.      MORE_CYCLES2(4);
  5321. }
  5322.  
  5323. void inst_dec_hl()
  5324. {
  5325.      gameboy_proc->HL.uw--;
  5326.      MORE_CYCLES2(8);
  5327. }
  5328.  
  5329. void inst_dec_hl_indirect()
  5330. {
  5331.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  5332.      if (what & 0x0F)
  5333.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5334.      else
  5335.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5336.      what--;
  5337.      memory_write_byte(gameboy_proc->HL.uw, what);
  5338.      if (what)
  5339.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5340.      else
  5341.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5342.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5343.      MORE_CYCLES2(12);
  5344. }
  5345.  
  5346. void inst_dec_l()
  5347. {
  5348.      if (gameboy_proc->HL.b.l & 0x0F) 
  5349.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5350.      else
  5351.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5352.      
  5353.      gameboy_proc->HL.b.l--;
  5354.      
  5355.      if (gameboy_proc->HL.b.l)
  5356.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5357.      else
  5358.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5359.           
  5360.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  5361.      
  5362.      MORE_CYCLES2(4);
  5363. }
  5364.  
  5365. void inst_dec_sp()
  5366. {
  5367.      gameboy_proc->SP.uw--;
  5368.      MORE_CYCLES2(8);
  5369. }
  5370.  
  5371. void inst_di()
  5372. {
  5373.      gameboy_proc->IFF &= ~0x01;
  5374.      MORE_CYCLES2(4);
  5375. }
  5376.  
  5377. void inst_ei()
  5378. {
  5379.      gameboy_proc->IFF |= 0x01;
  5380.      MORE_CYCLES2(4);
  5381. }
  5382.  
  5383. void inst_halt()
  5384. {
  5385.      MORE_CYCLES2(4);
  5386.      /* TODO: halt */
  5387. }
  5388.  
  5389. void inst_inc_a()
  5390. {
  5391.      if ((gameboy_proc->AF.b.h & 0x0F) == 0x0F)
  5392.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5393.      else
  5394.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5395.           
  5396.      gameboy_proc->AF.b.h++;
  5397.      
  5398.      if (gameboy_proc->AF.b.h)
  5399.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5400.      else
  5401.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5402.           
  5403.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5404.      
  5405.      MORE_CYCLES2(4);
  5406. }
  5407.  
  5408. void inst_inc_b()
  5409. {
  5410.      if ((gameboy_proc->BC.b.h & 0x0F) == 0x0F)
  5411.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5412.      else
  5413.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5414.           
  5415.      gameboy_proc->BC.b.h++;
  5416.      
  5417.      if (gameboy_proc->BC.b.h)
  5418.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5419.      else
  5420.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5421.           
  5422.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5423.      
  5424.      MORE_CYCLES2(4);
  5425. }
  5426.  
  5427. void inst_inc_bc()
  5428. {
  5429.      gameboy_proc->BC.uw++;
  5430.      MORE_CYCLES2(8);
  5431. }
  5432.  
  5433. void inst_inc_c()
  5434. {
  5435.      if ((gameboy_proc->BC.b.l & 0x0F) == 0x0F)
  5436.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5437.      else
  5438.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5439.           
  5440.      gameboy_proc->BC.b.l++;
  5441.      
  5442.      if (gameboy_proc->BC.b.l)
  5443.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5444.      else
  5445.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5446.           
  5447.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5448.      
  5449.      MORE_CYCLES2(4);
  5450. }
  5451.  
  5452. void inst_inc_d()
  5453. {
  5454.      if ((gameboy_proc->DE.b.h & 0x0F) == 0x0F)
  5455.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5456.      else
  5457.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5458.           
  5459.      gameboy_proc->DE.b.h++;
  5460.      
  5461.      if (gameboy_proc->DE.b.h)
  5462.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5463.      else
  5464.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5465.           
  5466.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5467.      
  5468.      MORE_CYCLES2(4);
  5469. }
  5470.  
  5471. void inst_inc_de()
  5472. {
  5473.      gameboy_proc->DE.uw++;
  5474.      MORE_CYCLES2(8);
  5475. }
  5476.  
  5477. void inst_inc_e()
  5478. {
  5479.      if ((gameboy_proc->DE.b.l & 0x0F) == 0x0F)
  5480.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5481.      else
  5482.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5483.           
  5484.      gameboy_proc->DE.b.l++;
  5485.      
  5486.      if (gameboy_proc->DE.b.l)
  5487.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5488.      else
  5489.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5490.           
  5491.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5492.      
  5493.      MORE_CYCLES2(4);
  5494. }
  5495.  
  5496. void inst_inc_h()
  5497. {
  5498.      if ((gameboy_proc->HL.b.h & 0x0F) == 0x0F)
  5499.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5500.      else
  5501.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5502.           
  5503.      gameboy_proc->HL.b.h++;
  5504.      
  5505.      if (gameboy_proc->HL.b.h)
  5506.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5507.      else
  5508.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5509.           
  5510.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5511.      
  5512.      MORE_CYCLES2(4);
  5513. }
  5514.  
  5515. void inst_inc_hl()
  5516. {
  5517.      gameboy_proc->HL.uw++;
  5518.      MORE_CYCLES2(8);
  5519. }
  5520.  
  5521. void inst_inc_hl_indirect()
  5522. {
  5523.      unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
  5524.      
  5525.      if ((what & 0x0F) == 0x0F)
  5526.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5527.      else
  5528.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5529.           
  5530.      what++;
  5531.      memory_write_byte(gameboy_proc->HL.uw, what);
  5532.      
  5533.      if (what)
  5534.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5535.      else
  5536.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5537.      
  5538.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5539.      
  5540.      MORE_CYCLES2(12);
  5541. }
  5542.  
  5543. void inst_inc_l()
  5544. {
  5545.      if ((gameboy_proc->HL.b.l & 0x0F) == 0x0F)
  5546.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  5547.      else
  5548.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  5549.           
  5550.      gameboy_proc->HL.b.l++;
  5551.      
  5552.      if (gameboy_proc->HL.b.l)
  5553.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  5554.      else
  5555.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  5556.           
  5557.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
  5558.      
  5559.      MORE_CYCLES2(4);
  5560. }
  5561.  
  5562. void inst_inc_sp()
  5563. {
  5564.      gameboy_proc->SP.uw++;
  5565.      MORE_CYCLES2(8);
  5566. }
  5567.  
  5568. void inst_jp_c_nn()
  5569. {
  5570.      if(FLAGS_ISCARRY(gameboy_proc)) {
  5571.           gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
  5572.           MORE_CYCLES2(16);
  5573.      } else {
  5574.           gameboy_proc->PC.uw += 2;
  5575.           MORE_CYCLES2(12);
  5576.      }
  5577. }
  5578.  
  5579. void inst_jp_hl()
  5580. {
  5581.      gameboy_proc->PC.uw = gameboy_proc->HL.uw;
  5582.      MORE_CYCLES2(4);
  5583. }
  5584.  
  5585. void inst_jp_nc_nn()
  5586. {
  5587.      if (FLAGS_ISCARRY(gameboy_proc)) {
  5588.           gameboy_proc->PC.uw += 2;
  5589.           MORE_CYCLES2(12);
  5590.      } else {
  5591.           gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
  5592.           MORE_CYCLES2(16);
  5593.      }
  5594. }
  5595.  
  5596. void inst_jp_nn() /* C3 */
  5597. {
  5598.      gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
  5599.      MORE_CYCLES2(16);
  5600. }
  5601.  
  5602. void inst_jp_nz_nn()
  5603. {
  5604.      if (FLAGS_ISZERO(gameboy_proc)) {
  5605.           gameboy_proc->PC.uw += 2;
  5606.           MORE_CYCLES2(12);
  5607.      } else {
  5608.           gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
  5609.           MORE_CYCLES2(16);
  5610.      }
  5611. }
  5612.  
  5613. void inst_jp_z_nn()
  5614. {
  5615.      if (FLAGS_ISZERO(gameboy_proc)) {
  5616.           gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
  5617.           MORE_CYCLES2(16);
  5618.      } else {
  5619.           gameboy_proc->PC.uw += 2;
  5620.           MORE_CYCLES2(12);
  5621.      }
  5622. }
  5623.  
  5624. void inst_jr_c_n()
  5625. {
  5626.      signed char offset = memory_read_byte(gameboy_proc->PC.uw);
  5627.      gameboy_proc->PC.uw++;
  5628.      
  5629.      if (FLAGS_ISCARRY(gameboy_proc)) {
  5630.           gameboy_proc->PC.uw += offset;
  5631.           MORE_CYCLES2(12);
  5632.      } else {
  5633.           MORE_CYCLES2(8);
  5634.      }
  5635. }
  5636.  
  5637. void inst_jr_n()
  5638. {
  5639.      signed char offset = memory_read_byte(gameboy_proc->PC.uw);
  5640.      gameboy_proc->PC.uw++;
  5641.      
  5642.      gameboy_proc->PC.uw += offset;
  5643.      MORE_CYCLES2(12);
  5644. }
  5645.  
  5646. void inst_jr_nc_n()
  5647. {
  5648.      signed char offset = memory_read_byte(gameboy_proc->PC.uw);
  5649.      gameboy_proc->PC.uw++;
  5650.      
  5651.      if(FLAGS_ISCARRY(gameboy_proc)) {
  5652.           MORE_CYCLES2(8);
  5653.      } else {
  5654.           gameboy_proc->PC.uw += offset;
  5655.           MORE_CYCLES2(12);
  5656.      }
  5657. }
  5658.  
  5659. void inst_jr_nz_n()
  5660. {
  5661.      signed char offset = memory_read_byte(gameboy_proc->PC.uw);
  5662.      gameboy_proc->PC.uw++;
  5663.      
  5664.      if (FLAGS_ISZERO(gameboy_proc)) {
  5665.           MORE_CYCLES2(8);
  5666.      } else {
  5667.           gameboy_proc->PC.uw += offset;
  5668.           MORE_CYCLES2(12);
  5669.      }
  5670. }
  5671.  
  5672. void inst_jr_z_n()
  5673. {
  5674.      signed char offset = memory_read_byte(gameboy_proc->PC.uw);
  5675.      gameboy_proc->PC.uw++;
  5676.      
  5677.      if (FLAGS_ISZERO(gameboy_proc)) {
  5678.           gameboy_proc->PC.uw += offset;
  5679.           MORE_CYCLES2(12);
  5680.      } else {
  5681.           MORE_CYCLES2(8);
  5682.      }
  5683. }
  5684.  
  5685. void inst_ld_a_b()
  5686. {
  5687.      gameboy_proc->AF.b.h = gameboy_proc->BC.b.h;
  5688.      MORE_CYCLES2(4);
  5689. }
  5690.  
  5691. void inst_ld_a_bc_indirect()
  5692. {
  5693.      gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->BC.uw);
  5694.      MORE_CYCLES2(8);
  5695. }
  5696.  
  5697. void inst_ld_a_c()
  5698. {
  5699.      gameboy_proc->AF.b.h = gameboy_proc->BC.b.l;
  5700.      MORE_CYCLES2(4);
  5701. }
  5702.  
  5703. void inst_ld_a_c_indirect()
  5704. {
  5705.      gameboy_proc->AF.b.h = memory_read_byte(0xFF00 + gameboy_proc->BC.b.l);
  5706.      MORE_CYCLES2(8);
  5707. }
  5708.  
  5709. void inst_ld_a_d()
  5710. {
  5711.      gameboy_proc->AF.b.h = gameboy_proc->DE.b.h;
  5712.      MORE_CYCLES2(4);
  5713. }
  5714.  
  5715. void inst_ld_a_de_indirect()
  5716. {
  5717.      gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->DE.uw);
  5718.      MORE_CYCLES2(8);
  5719. }
  5720.  
  5721. void inst_ld_a_e()
  5722. {
  5723.      gameboy_proc->AF.b.h = gameboy_proc->DE.b.l;
  5724.      MORE_CYCLES2(4);
  5725. }
  5726.  
  5727. void inst_ld_a_ff_n_indirect()
  5728. {
  5729.      gameboy_proc->AF.b.h = memory_read_byte(0xFF00 + memory_read_byte(gameboy_proc->PC.uw));
  5730.      gameboy_proc->PC.uw++;
  5731.      MORE_CYCLES2(12);
  5732. }
  5733.  
  5734. void inst_ld_a_h()
  5735. {
  5736.      gameboy_proc->AF.b.h = gameboy_proc->HL.b.h;
  5737.      MORE_CYCLES2(4);
  5738. }
  5739.  
  5740. void inst_ld_a_hl_indirect()
  5741. {
  5742.      gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->HL.uw);
  5743.      MORE_CYCLES2(8);
  5744. }
  5745.  
  5746. void inst_ld_a_hld_indirect()
  5747. {
  5748.      gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->HL.uw);
  5749.      gameboy_proc->HL.uw--;
  5750.      MORE_CYCLES2(8);
  5751. }
  5752.  
  5753. void inst_ld_a_hli_indirect()
  5754. {
  5755.      gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->HL.uw);
  5756.      gameboy_proc->HL.uw++;
  5757.      MORE_CYCLES2(8);
  5758. }
  5759.  
  5760. void inst_ld_a_l()
  5761. {
  5762.      gameboy_proc->AF.b.h = gameboy_proc->HL.b.l;
  5763.      MORE_CYCLES2(4);
  5764. }
  5765.  
  5766. void inst_ld_a_n()
  5767. {
  5768.      gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->PC.uw);
  5769.      gameboy_proc->PC.uw++;
  5770.      MORE_CYCLES2(8);
  5771. }
  5772.  
  5773. void inst_ld_a_nn_indirect()
  5774. {
  5775.      gameboy_proc->AF.b.h = memory_read_byte(memory_read_word(gameboy_proc->PC.uw));
  5776.      gameboy_proc->PC.uw += 2;
  5777.      MORE_CYCLES2(16);
  5778. }
  5779.  
  5780. void inst_ld_b_a()
  5781. {
  5782.      gameboy_proc->BC.b.h = gameboy_proc->AF.b.h;
  5783.      MORE_CYCLES2(4);
  5784. }
  5785.  
  5786. void inst_ld_b_c()
  5787. {
  5788.      gameboy_proc->BC.b.h = gameboy_proc->BC.b.l;
  5789.      MORE_CYCLES2(4);
  5790. }
  5791.  
  5792. void inst_ld_b_d()
  5793. {
  5794.      gameboy_proc->BC.b.h = gameboy_proc->DE.b.h;
  5795.      MORE_CYCLES2(4);
  5796. }
  5797.  
  5798. void inst_ld_b_e()
  5799. {
  5800.      gameboy_proc->BC.b.h = gameboy_proc->DE.b.l;
  5801.      MORE_CYCLES2(4);
  5802. }
  5803.  
  5804. void inst_ld_b_h()
  5805. {
  5806.      gameboy_proc->BC.b.h = gameboy_proc->HL.b.h;
  5807.      MORE_CYCLES2(4);
  5808. }
  5809.  
  5810. void inst_ld_b_hl_indirect()
  5811. {
  5812.      gameboy_proc->BC.b.h = memory_read_byte(gameboy_proc->HL.uw);
  5813.      MORE_CYCLES2(8);
  5814. }
  5815.  
  5816. void inst_ld_b_l()
  5817. {
  5818.      gameboy_proc->BC.b.h = gameboy_proc->HL.b.l;
  5819.      MORE_CYCLES2(4);
  5820. }
  5821.  
  5822. void inst_ld_b_n()
  5823. {
  5824.      gameboy_proc->BC.b.h = memory_read_byte(gameboy_proc->PC.uw);
  5825.      gameboy_proc->PC.uw++;
  5826.      MORE_CYCLES2(8);
  5827. }
  5828.  
  5829. void inst_ld_bc_indirect_a()
  5830. {
  5831.      memory_write_byte(gameboy_proc->BC.uw, gameboy_proc->AF.b.h);
  5832.      MORE_CYCLES2(8);
  5833. }
  5834.  
  5835. void inst_ld_bc_nn()
  5836. {
  5837.      gameboy_proc->BC.uw = memory_read_word(gameboy_proc->PC.uw);
  5838.      gameboy_proc->PC.uw += 2;
  5839.      
  5840.      MORE_CYCLES2(12);
  5841. }
  5842.  
  5843. void inst_ld_c_a()
  5844. {
  5845.      gameboy_proc->BC.b.l = gameboy_proc->AF.b.h;
  5846.      MORE_CYCLES2(4);
  5847. }
  5848.  
  5849. void inst_ld_c_b()
  5850. {
  5851.      gameboy_proc->BC.b.l = gameboy_proc->BC.b.h;
  5852.      MORE_CYCLES2(4);
  5853. }
  5854.  
  5855. void inst_ld_c_d()
  5856. {
  5857.      gameboy_proc->BC.b.l = gameboy_proc->DE.b.h;
  5858.      MORE_CYCLES2(4);
  5859. }
  5860.  
  5861. void inst_ld_c_e()
  5862. {
  5863.      gameboy_proc->BC.b.l = gameboy_proc->DE.b.l;
  5864.      MORE_CYCLES2(4);
  5865. }
  5866.  
  5867. void inst_ld_c_h()
  5868. {
  5869.      gameboy_proc->BC.b.l = gameboy_proc->HL.b.h;
  5870.      MORE_CYCLES2(4);
  5871. }
  5872.  
  5873. void inst_ld_c_hl_indirect()
  5874. {
  5875.      gameboy_proc->BC.b.l = memory_read_byte(gameboy_proc->HL.uw);
  5876.      MORE_CYCLES2(8);
  5877. }
  5878.  
  5879. void inst_ld_c_indirect_a()
  5880. {
  5881.      memory_write_byte(0xFF00 + gameboy_proc->BC.b.l, gameboy_proc->AF.b.h);
  5882.      MORE_CYCLES2(8);
  5883. }
  5884.  
  5885. void inst_ld_c_l()
  5886. {
  5887.      gameboy_proc->BC.b.l = gameboy_proc->HL.b.l;
  5888.      MORE_CYCLES2(4);
  5889. }
  5890.  
  5891. void inst_ld_c_n()
  5892. {
  5893.      gameboy_proc->BC.b.l = memory_read_byte(gameboy_proc->PC.uw);
  5894.      gameboy_proc->PC.uw++;
  5895.      MORE_CYCLES2(8);
  5896. }
  5897.  
  5898. void inst_ld_d_a()
  5899. {
  5900.      gameboy_proc->DE.b.h = gameboy_proc->AF.b.h;
  5901.      MORE_CYCLES2(4);
  5902. }
  5903.  
  5904. void inst_ld_d_b()
  5905. {
  5906.      gameboy_proc->DE.b.h = gameboy_proc->BC.b.h;
  5907.      MORE_CYCLES2(4);
  5908. }
  5909.  
  5910. void inst_ld_d_c()
  5911. {
  5912.      gameboy_proc->DE.b.h = gameboy_proc->BC.b.l;
  5913.      MORE_CYCLES2(4);
  5914. }
  5915.  
  5916. void inst_ld_d_e()
  5917. {
  5918.      gameboy_proc->DE.b.h = gameboy_proc->DE.b.l;
  5919.      MORE_CYCLES2(4);
  5920. }
  5921.  
  5922. void inst_ld_d_h()
  5923. {
  5924.      gameboy_proc->DE.b.h = gameboy_proc->HL.b.h;
  5925.      MORE_CYCLES2(4);
  5926. }
  5927.  
  5928. void inst_ld_d_hl_indirect()
  5929. {
  5930.      gameboy_proc->DE.b.h = memory_read_byte(gameboy_proc->HL.uw);
  5931.      MORE_CYCLES2(8);
  5932. }
  5933.  
  5934. void inst_ld_d_l()
  5935. {
  5936.      gameboy_proc->DE.b.h = gameboy_proc->HL.b.l;
  5937.      MORE_CYCLES2(4);
  5938. }
  5939.  
  5940. void inst_ld_d_n()
  5941. {
  5942.      gameboy_proc->DE.b.h = memory_read_byte(gameboy_proc->PC.uw);
  5943.      gameboy_proc->PC.uw++;
  5944.      MORE_CYCLES2(8);
  5945. }
  5946.  
  5947. void inst_ld_de_indirect_a()
  5948. {
  5949.      memory_write_byte(gameboy_proc->DE.uw, gameboy_proc->AF.b.h);
  5950.      MORE_CYCLES2(8);
  5951. }
  5952.  
  5953. void inst_ld_de_nn()
  5954. {
  5955.      gameboy_proc->DE.uw = memory_read_word(gameboy_proc->PC.uw);
  5956.      gameboy_proc->PC.uw += 2;
  5957.      
  5958.      MORE_CYCLES2(12);
  5959. }
  5960.  
  5961. void inst_ld_e_a()
  5962. {
  5963.      gameboy_proc->DE.b.l = gameboy_proc->AF.b.h;
  5964.      MORE_CYCLES2(4);
  5965. }
  5966.  
  5967. void inst_ld_e_b()
  5968. {
  5969.      gameboy_proc->DE.b.l = gameboy_proc->BC.b.h;
  5970.      MORE_CYCLES2(4);
  5971. }
  5972.  
  5973. void inst_ld_e_c()
  5974. {
  5975.      gameboy_proc->DE.b.l = gameboy_proc->BC.b.l;
  5976.      MORE_CYCLES2(4);
  5977. }
  5978.  
  5979. void inst_ld_e_d()
  5980. {
  5981.      gameboy_proc->DE.b.l = gameboy_proc->DE.b.h;
  5982.      MORE_CYCLES2(4);
  5983. }
  5984.  
  5985. void inst_ld_e_h()
  5986. {
  5987.      gameboy_proc->DE.b.l = gameboy_proc->HL.b.h;
  5988.      MORE_CYCLES2(4);
  5989. }
  5990.  
  5991. void inst_ld_e_hl_indirect()
  5992. {
  5993.      gameboy_proc->DE.b.l = memory_read_byte(gameboy_proc->HL.uw);
  5994.      MORE_CYCLES2(8);
  5995. }
  5996.  
  5997. void inst_ld_e_l()
  5998. {
  5999.      gameboy_proc->DE.b.l = gameboy_proc->HL.b.l;
  6000.      MORE_CYCLES2(4);
  6001. }
  6002.  
  6003. void inst_ld_e_n()
  6004. {
  6005.      gameboy_proc->DE.b.l = memory_read_byte(gameboy_proc->PC.uw);
  6006.      gameboy_proc->PC.uw++;
  6007.      MORE_CYCLES2(8);
  6008. }
  6009.  
  6010. void inst_ld_ff_n_indirect_a()
  6011. {
  6012.      memory_write_byte(0xFF00 + memory_read_byte(gameboy_proc->PC.uw), gameboy_proc->AF.b.h);
  6013.      gameboy_proc->PC.uw++;
  6014.      MORE_CYCLES2(12);
  6015. }
  6016.  
  6017. void inst_ld_h_a()
  6018. {
  6019.      gameboy_proc->HL.b.h = gameboy_proc->AF.b.h;
  6020.      MORE_CYCLES2(4);
  6021. }
  6022.  
  6023. void inst_ld_h_b()
  6024. {
  6025.      gameboy_proc->HL.b.h = gameboy_proc->BC.b.h;
  6026.      MORE_CYCLES2(4);
  6027. }
  6028.  
  6029. void inst_ld_h_c()
  6030. {
  6031.      gameboy_proc->HL.b.h = gameboy_proc->BC.b.l;
  6032.      MORE_CYCLES2(4);
  6033. }
  6034.  
  6035. void inst_ld_h_d()
  6036. {
  6037.      gameboy_proc->HL.b.h = gameboy_proc->DE.b.h;
  6038.      MORE_CYCLES2(4);
  6039. }
  6040.  
  6041. void inst_ld_h_e()
  6042. {
  6043.      gameboy_proc->HL.b.h = gameboy_proc->DE.b.l;
  6044.      MORE_CYCLES2(4);
  6045. }
  6046.  
  6047. void inst_ld_h_hl_indirect()
  6048. {
  6049.      gameboy_proc->HL.b.h = memory_read_byte(gameboy_proc->HL.uw);
  6050.      MORE_CYCLES2(8);
  6051. }
  6052.  
  6053. void inst_ld_h_l()
  6054. {
  6055.      gameboy_proc->HL.b.h = gameboy_proc->HL.b.l;
  6056.      MORE_CYCLES2(4);
  6057. }
  6058.  
  6059. void inst_ld_h_n()
  6060. {
  6061.      gameboy_proc->HL.b.h = memory_read_byte(gameboy_proc->PC.uw);
  6062.      gameboy_proc->PC.uw++;
  6063.      MORE_CYCLES2(8);
  6064. }
  6065.  
  6066. void inst_ld_hl_indirect_a()
  6067. {
  6068.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->AF.b.h);
  6069.      MORE_CYCLES2(8);
  6070. }
  6071.  
  6072. void inst_ld_hl_indirect_b()
  6073. {
  6074.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->BC.b.h);
  6075.      MORE_CYCLES2(8);
  6076. }
  6077.  
  6078. void inst_ld_hl_indirect_c()
  6079. {
  6080.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->BC.b.l);
  6081.      MORE_CYCLES2(8);
  6082. }
  6083.  
  6084. void inst_ld_hl_indirect_d()
  6085. {
  6086.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->DE.b.h);
  6087.      MORE_CYCLES2(8);
  6088. }
  6089.  
  6090. void inst_ld_hl_indirect_e()
  6091. {
  6092.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->DE.b.l);
  6093.      MORE_CYCLES2(8);
  6094. }
  6095.  
  6096. void inst_ld_hl_indirect_h()
  6097. {
  6098.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->HL.b.h);
  6099.      MORE_CYCLES2(8);
  6100. }
  6101.  
  6102. void inst_ld_hl_indirect_l()
  6103. {
  6104.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->HL.b.l);
  6105.      MORE_CYCLES2(8);
  6106. }
  6107.  
  6108. void inst_ld_hl_indirect_n()
  6109. {
  6110.      memory_write_byte(gameboy_proc->HL.uw, memory_read_byte(gameboy_proc->PC.uw));
  6111.      gameboy_proc->PC.uw++;
  6112.      MORE_CYCLES2(12);
  6113. }
  6114.  
  6115. void inst_ld_hl_nn()
  6116. {
  6117.      gameboy_proc->HL.uw = memory_read_word(gameboy_proc->PC.uw);
  6118.      gameboy_proc->PC.uw += 2;
  6119.      
  6120.      MORE_CYCLES2(12);
  6121. }
  6122.  
  6123. void inst_ld_hl_sp_n()
  6124. {
  6125.      signed char offset = memory_read_byte(gameboy_proc->PC.uw);
  6126.      int result = gameboy_proc->SP.uw + offset;
  6127.      gameboy_proc->PC.uw++;
  6128.      
  6129.      if(result & 0xFFFF0000)
  6130.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6131.      else
  6132.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6133.      
  6134.      if (((gameboy_proc->SP.uw & 0x0F) + (offset & 0x0F)) > 0x0F)
  6135.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6136.      else
  6137.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6138.           
  6139.      FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO | FLAGS_NEGATIVE);
  6140.      
  6141.      gameboy_proc->HL.uw  = result & 0xFFFF;
  6142.      
  6143.      MORE_CYCLES2(12);
  6144. }
  6145.  
  6146. void inst_ld_hld_indirect_a()
  6147. {
  6148.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->AF.b.h);
  6149.      gameboy_proc->HL.uw--;
  6150.      MORE_CYCLES2(8);
  6151. }
  6152.  
  6153. void inst_ld_hli_indirect_a()
  6154. {
  6155.      memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->AF.b.h);
  6156.      gameboy_proc->HL.uw++;
  6157.      MORE_CYCLES2(8);
  6158. }
  6159.  
  6160. void inst_ld_l_a()
  6161. {
  6162.      gameboy_proc->HL.b.l = gameboy_proc->AF.b.h;
  6163.      MORE_CYCLES2(8);
  6164. }
  6165.  
  6166. void inst_ld_l_b()
  6167. {
  6168.      gameboy_proc->HL.b.l = gameboy_proc->BC.b.h;
  6169.      MORE_CYCLES2(8);
  6170. }
  6171.  
  6172. void inst_ld_l_c()
  6173. {
  6174.      gameboy_proc->HL.b.l = gameboy_proc->BC.b.l;
  6175.      MORE_CYCLES2(8);
  6176. }
  6177.  
  6178. void inst_ld_l_d()
  6179. {
  6180.      gameboy_proc->HL.b.l = gameboy_proc->DE.b.h;
  6181.      MORE_CYCLES2(8);
  6182. }
  6183.  
  6184. void inst_ld_l_e()
  6185. {
  6186.      gameboy_proc->HL.b.l = gameboy_proc->DE.b.l;
  6187.      MORE_CYCLES2(8);
  6188. }
  6189.  
  6190. void inst_ld_l_h()
  6191. {
  6192.      gameboy_proc->HL.b.l = gameboy_proc->HL.b.h;
  6193.      MORE_CYCLES2(8);
  6194. }
  6195.  
  6196. void inst_ld_l_hl_indirect()
  6197. {
  6198.      gameboy_proc->HL.b.l = memory_read_byte(gameboy_proc->HL.uw);
  6199.      MORE_CYCLES2(8);
  6200. }
  6201.  
  6202. void inst_ld_l_n()
  6203. {
  6204.      gameboy_proc->HL.b.l = memory_read_byte(gameboy_proc->PC.uw);
  6205.      gameboy_proc->PC.uw++;
  6206.      MORE_CYCLES2(8);
  6207. }
  6208.  
  6209. void inst_ld_nn_indirect_a()
  6210. {
  6211.      memory_write_byte(memory_read_word(gameboy_proc->PC.uw), gameboy_proc->AF.b.h);
  6212.      gameboy_proc->PC.uw += 2;
  6213.      MORE_CYCLES2(16);
  6214. }
  6215.  
  6216. void inst_ld_nn_indirect_sp()
  6217. {
  6218.      memory_write_word(memory_read_word(gameboy_proc->PC.uw), gameboy_proc->SP.uw);
  6219.      gameboy_proc->PC.uw += 2;
  6220.      MORE_CYCLES2(20);
  6221. }
  6222.  
  6223. void inst_ld_sp_hl()
  6224. {
  6225.      gameboy_proc->SP.uw = gameboy_proc->HL.uw;
  6226.      MORE_CYCLES2(8);
  6227. }
  6228.  
  6229. void inst_ld_sp_nn()
  6230. {
  6231.      gameboy_proc->SP.uw = memory_read_word(gameboy_proc->PC.uw);
  6232.      gameboy_proc->PC.uw += 2;
  6233.      MORE_CYCLES2(12);
  6234. }
  6235.  
  6236. /* NOP */
  6237.  
  6238. void inst_nop() /* 00 */
  6239. {
  6240.      MORE_CYCLES2(4);
  6241. }
  6242.  
  6243. void inst_or_a()
  6244. {
  6245.      if (gameboy_proc->AF.b.h)
  6246.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6247.      else
  6248.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6249.      
  6250.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6251.      MORE_CYCLES2(4);
  6252. }
  6253.  
  6254. void inst_or_b()
  6255. {
  6256.      gameboy_proc->AF.b.h |= gameboy_proc->BC.b.h;
  6257.      if (gameboy_proc->AF.b.h)
  6258.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6259.      else
  6260.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6261.      
  6262.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6263.      MORE_CYCLES2(4);
  6264. }
  6265.  
  6266. void inst_or_c()
  6267. {
  6268.      gameboy_proc->AF.b.h |= gameboy_proc->BC.b.l;
  6269.      if (gameboy_proc->AF.b.h)
  6270.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6271.      else
  6272.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6273.      
  6274.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6275.      MORE_CYCLES2(4);
  6276. }
  6277.  
  6278. void inst_or_d()
  6279. {
  6280.      gameboy_proc->AF.b.h |= gameboy_proc->DE.b.h;
  6281.      if (gameboy_proc->AF.b.h)
  6282.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6283.      else
  6284.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6285.      
  6286.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6287.      MORE_CYCLES2(4);
  6288. }
  6289.  
  6290. void inst_or_e()
  6291. {
  6292.      gameboy_proc->AF.b.h |= gameboy_proc->DE.b.l;
  6293.      if (gameboy_proc->AF.b.h)
  6294.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6295.      else
  6296.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6297.      
  6298.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6299.      MORE_CYCLES2(4);
  6300. }
  6301.  
  6302. void inst_or_h()
  6303. {
  6304.      gameboy_proc->AF.b.h |= gameboy_proc->HL.b.h;
  6305.      if (gameboy_proc->AF.b.h)
  6306.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6307.      else
  6308.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6309.      
  6310.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6311.      MORE_CYCLES2(4);
  6312. }
  6313.  
  6314. void inst_or_hl_indirect()
  6315. {
  6316.      gameboy_proc->AF.b.h |= memory_read_byte(gameboy_proc->HL.uw);
  6317.      if (gameboy_proc->AF.b.h)
  6318.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6319.      else
  6320.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6321.      
  6322.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6323.      MORE_CYCLES2(8);
  6324. }
  6325.  
  6326. void inst_or_l()
  6327. {
  6328.      gameboy_proc->AF.b.h |= gameboy_proc->HL.b.l;
  6329.      if (gameboy_proc->AF.b.h)
  6330.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6331.      else
  6332.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6333.      
  6334.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6335.      MORE_CYCLES2(4);
  6336. }
  6337.  
  6338. void inst_or_n()
  6339. {
  6340.      gameboy_proc->AF.b.h |= memory_read_byte(gameboy_proc->PC.uw);
  6341.      gameboy_proc->PC.uw++;
  6342.      
  6343.      if (gameboy_proc->AF.b.h)
  6344.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6345.      else
  6346.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6347.      
  6348.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6349.      MORE_CYCLES2(8);
  6350. }
  6351.  
  6352. void inst_pop_af()
  6353. {
  6354.      gameboy_proc->AF.uw = gameboy_stack_read_word();
  6355.      MORE_CYCLES2(12);
  6356. }
  6357.  
  6358. void inst_pop_bc()
  6359. {
  6360.      gameboy_proc->BC.uw = gameboy_stack_read_word();
  6361.      MORE_CYCLES2(12);
  6362. }
  6363.  
  6364. void inst_pop_de()
  6365. {
  6366.      gameboy_proc->DE.uw = gameboy_stack_read_word();
  6367.      MORE_CYCLES2(12);
  6368. }
  6369.  
  6370. void inst_pop_hl()
  6371. {
  6372.      gameboy_proc->HL.uw = gameboy_stack_read_word();
  6373.      MORE_CYCLES2(12);
  6374. }
  6375.  
  6376. void inst_push_af()
  6377. {
  6378.      gameboy_stack_write_word(gameboy_proc->AF.uw);
  6379.      MORE_CYCLES2(16);
  6380. }
  6381.  
  6382. void inst_push_bc()
  6383. {
  6384.      gameboy_stack_write_word(gameboy_proc->BC.uw);
  6385.      MORE_CYCLES2(16);
  6386. }
  6387.  
  6388. void inst_push_de()
  6389. {
  6390.      gameboy_stack_write_word(gameboy_proc->DE.uw);
  6391.      MORE_CYCLES2(16);
  6392. }
  6393.  
  6394. void inst_push_hl()
  6395. {
  6396.      gameboy_stack_write_word(gameboy_proc->HL.uw);
  6397.      MORE_CYCLES2(16);
  6398. }
  6399.  
  6400. void inst_ret()
  6401. {
  6402.      gameboy_proc->PC.uw = gameboy_stack_read_word();
  6403.      MORE_CYCLES2(16);
  6404. }
  6405.  
  6406. void inst_ret_c()
  6407. {
  6408.      if (FLAGS_ISCARRY(gameboy_proc)) {
  6409.           gameboy_proc->PC.uw = gameboy_stack_read_word();
  6410.           MORE_CYCLES2(20);
  6411.      } else {
  6412.           MORE_CYCLES2(8);
  6413.      }
  6414. }
  6415.  
  6416. void inst_ret_nc()
  6417. {
  6418.      if (FLAGS_ISCARRY(gameboy_proc)) {
  6419.           MORE_CYCLES2(8);
  6420.      } else {
  6421.           gameboy_proc->PC.uw = gameboy_stack_read_word();
  6422.           MORE_CYCLES2(20);
  6423.      }
  6424. }
  6425.  
  6426. void inst_ret_nz()
  6427. {
  6428.      if (FLAGS_ISZERO(gameboy_proc)) {
  6429.           MORE_CYCLES2(8);
  6430.      } else {
  6431.           gameboy_proc->PC.uw = gameboy_stack_read_word();
  6432.           MORE_CYCLES2(20);
  6433.      }
  6434. }
  6435.  
  6436. void inst_ret_z()
  6437. {
  6438.      if (FLAGS_ISZERO(gameboy_proc)) {
  6439.           gameboy_proc->PC.uw = gameboy_stack_read_word();
  6440.           MORE_CYCLES2(20);
  6441.      } else {
  6442.           MORE_CYCLES2(8);
  6443.      }
  6444. }
  6445.  
  6446. void inst_reti()
  6447. {
  6448.      gameboy_proc->PC.uw = gameboy_stack_read_word();
  6449.      gameboy_proc->IFF = 1;
  6450.      MORE_CYCLES2(16);
  6451. }
  6452.  
  6453. void inst_rla()
  6454. {
  6455.      int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
  6456.      if (gameboy_proc->AF.b.h & 0x80)
  6457.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6458.      else
  6459.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6460.      gameboy_proc->AF.b.h <<= 1;
  6461.      gameboy_proc->AF.b.h += carry;
  6462.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  6463.      MORE_CYCLES2(4);
  6464. }
  6465.  
  6466. void inst_rlca()
  6467. {
  6468.      int carry = (gameboy_proc->AF.b.h & 0x80) >> 7;
  6469.      if (carry)
  6470.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6471.      else
  6472.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6473.      gameboy_proc->AF.b.h <<= 1;
  6474.      gameboy_proc->AF.b.h += carry;
  6475.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  6476.      MORE_CYCLES2(4);
  6477. }
  6478.  
  6479. void inst_rra()
  6480. {
  6481.      int carry = (FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0) << 7;
  6482.      if (gameboy_proc->AF.b.h & 0x01)
  6483.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6484.      else
  6485.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6486.      gameboy_proc->AF.b.h >>= 1;
  6487.      gameboy_proc->AF.b.h += carry;
  6488.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  6489.      MORE_CYCLES2(4);
  6490. }
  6491.  
  6492. void inst_rrca()
  6493. {
  6494.      int carry = gameboy_proc->AF.b.h & 0x01;
  6495.      if (carry)
  6496.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6497.      else
  6498.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6499.      gameboy_proc->AF.b.h >>= 1;
  6500.      if (carry)
  6501.           gameboy_proc->AF.b.h |= 0x80;
  6502.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
  6503.      MORE_CYCLES2(4);
  6504. }
  6505.  
  6506. void inst_rst_00h()
  6507. {
  6508.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6509.      gameboy_proc->PC.uw = 0x00;
  6510.      MORE_CYCLES2(16);
  6511. }
  6512.  
  6513. void inst_rst_08h()
  6514. {
  6515.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6516.      gameboy_proc->PC.uw = 0x08;
  6517.      MORE_CYCLES2(16);
  6518. }
  6519.  
  6520. void inst_rst_10h()
  6521. {
  6522.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6523.      gameboy_proc->PC.uw = 0x10;
  6524.      MORE_CYCLES2(16);
  6525. }
  6526.  
  6527. void inst_rst_18h()
  6528. {
  6529.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6530.      gameboy_proc->PC.uw = 0x18;
  6531.      MORE_CYCLES2(16);
  6532. }
  6533.  
  6534. void inst_rst_20h()
  6535. {
  6536.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6537.      gameboy_proc->PC.uw = 0x20;
  6538.      MORE_CYCLES2(16);
  6539. }
  6540.  
  6541. void inst_rst_28h()
  6542. {
  6543.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6544.      gameboy_proc->PC.uw = 0x28;
  6545.      MORE_CYCLES2(16);
  6546. }
  6547.  
  6548. void inst_rst_30h()
  6549. {
  6550.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6551.      gameboy_proc->PC.uw = 0x30;
  6552.      MORE_CYCLES2(16);
  6553. }
  6554.  
  6555. void inst_rst_38h()
  6556. {
  6557.      gameboy_stack_write_word(gameboy_proc->PC.uw);
  6558.      gameboy_proc->PC.uw = 0x38;
  6559.      MORE_CYCLES2(16);
  6560. }
  6561.  
  6562. void inst_sbc_a()
  6563. {
  6564.      if (FLAGS_ISCARRY(gameboy_proc)) {
  6565.           gameboy_proc->AF.b.h = 0xFF;
  6566.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6567.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6568.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6569.      } else {
  6570.           gameboy_proc->AF.b.h = 0;
  6571.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6572.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6573.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6574.      }
  6575.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6576. }
  6577.  
  6578. void inst_sbc_b()
  6579. {
  6580.      unsigned char value = gameboy_proc->BC.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6581.      
  6582.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6583.      
  6584.      if(value > gameboy_proc->AF.b.h)
  6585.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6586.      else
  6587.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6588.           
  6589.      if(value == gameboy_proc->AF.b.h)
  6590.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6591.      else
  6592.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6593.      
  6594.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6595.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6596.      else
  6597.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6598.           
  6599.      gameboy_proc->AF.b.h -= value;
  6600.      
  6601.      MORE_CYCLES2(4);
  6602. }
  6603.  
  6604. void inst_sbc_c()
  6605. {
  6606.      unsigned char value = gameboy_proc->BC.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6607.      
  6608.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6609.      
  6610.      if(value > gameboy_proc->AF.b.h)
  6611.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6612.      else
  6613.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6614.           
  6615.      if(value == gameboy_proc->AF.b.h)
  6616.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6617.      else
  6618.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6619.      
  6620.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6621.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6622.      else
  6623.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6624.           
  6625.      gameboy_proc->AF.b.h -= value;
  6626.      
  6627.      MORE_CYCLES2(4);
  6628. }
  6629.  
  6630. void inst_sbc_d()
  6631. {
  6632.      unsigned char value = gameboy_proc->DE.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6633.      
  6634.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6635.      
  6636.      if(value > gameboy_proc->AF.b.h)
  6637.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6638.      else
  6639.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6640.           
  6641.      if(value == gameboy_proc->AF.b.h)
  6642.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6643.      else
  6644.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6645.      
  6646.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6647.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6648.      else
  6649.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6650.           
  6651.      gameboy_proc->AF.b.h -= value;
  6652.      
  6653.      MORE_CYCLES2(4);
  6654. }
  6655.  
  6656. void inst_sbc_e()
  6657. {
  6658.      unsigned char value = gameboy_proc->DE.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6659.      
  6660.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6661.      
  6662.      if(value > gameboy_proc->AF.b.h)
  6663.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6664.      else
  6665.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6666.           
  6667.      if(value == gameboy_proc->AF.b.h)
  6668.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6669.      else
  6670.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6671.      
  6672.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6673.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6674.      else
  6675.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6676.           
  6677.      gameboy_proc->AF.b.h -= value;
  6678.      
  6679.      MORE_CYCLES2(4);
  6680. }
  6681.  
  6682. void inst_sbc_h()
  6683. {
  6684.      unsigned char value = gameboy_proc->HL.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6685.      
  6686.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6687.      
  6688.      if(value > gameboy_proc->AF.b.h)
  6689.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6690.      else
  6691.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6692.           
  6693.      if(value == gameboy_proc->AF.b.h)
  6694.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6695.      else
  6696.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6697.      
  6698.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6699.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6700.      else
  6701.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6702.           
  6703.      gameboy_proc->AF.b.h -= value;
  6704.      
  6705.      MORE_CYCLES2(4);
  6706. }
  6707.  
  6708. void inst_sbc_hl_indirect()
  6709. {
  6710.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6711.      
  6712.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6713.      
  6714.      if(value > gameboy_proc->AF.b.h)
  6715.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6716.      else
  6717.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6718.           
  6719.      if(value == gameboy_proc->AF.b.h)
  6720.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6721.      else
  6722.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6723.      
  6724.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6725.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6726.      else
  6727.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6728.           
  6729.      gameboy_proc->AF.b.h -= value;
  6730.      
  6731.      MORE_CYCLES2(8);
  6732. }
  6733.  
  6734. void inst_sbc_l()
  6735. {
  6736.      unsigned char value = gameboy_proc->HL.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6737.      
  6738.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6739.      
  6740.      if(value > gameboy_proc->AF.b.h)
  6741.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6742.      else
  6743.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6744.           
  6745.      if(value == gameboy_proc->AF.b.h)
  6746.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6747.      else
  6748.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6749.      
  6750.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6751.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6752.      else
  6753.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6754.           
  6755.      gameboy_proc->AF.b.h -= value;
  6756.      
  6757.      MORE_CYCLES2(4);
  6758. }
  6759.  
  6760. void inst_sbc_n()
  6761. {
  6762.      unsigned char value = memory_read_byte(gameboy_proc->PC.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
  6763.      gameboy_proc->PC.uw++;
  6764.      
  6765.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6766.      
  6767.      if(value > gameboy_proc->AF.b.h)
  6768.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6769.      else
  6770.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6771.           
  6772.      if(value == gameboy_proc->AF.b.h)
  6773.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6774.      else
  6775.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6776.      
  6777.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6778.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6779.      else
  6780.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6781.           
  6782.      gameboy_proc->AF.b.h -= value;
  6783.      
  6784.      MORE_CYCLES2(8);
  6785. }
  6786.  
  6787. void inst_scf()
  6788. {
  6789.      FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6790.      FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  6791.      
  6792.      MORE_CYCLES2(4);
  6793. }
  6794.  
  6795. void inst_stop()
  6796. {
  6797.      unsigned long oc = current_joypad;
  6798.      
  6799.      while(oc != current_joypad)
  6800.           vram_sysupdate();
  6801.      gameboy_proc->PC.uw++; 
  6802.      MORE_CYCLES2(4);
  6803. }
  6804.  
  6805. void inst_sub_a()
  6806. {
  6807.      gameboy_proc->AF.b.h = 0;
  6808.      FLAGS_SET(gameboy_proc, FLAGS_ZERO | FLAGS_NEGATIVE);
  6809.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6810.      FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6811.      
  6812.      MORE_CYCLES2(8);
  6813. }
  6814.  
  6815. void inst_sub_b()
  6816. {
  6817.      unsigned char value = gameboy_proc->BC.b.h;
  6818.      
  6819.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6820.      
  6821.      if(value > gameboy_proc->AF.b.h)
  6822.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6823.      else
  6824.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6825.           
  6826.      if(value == gameboy_proc->AF.b.h)
  6827.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6828.      else
  6829.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6830.      
  6831.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6832.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6833.      else
  6834.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6835.           
  6836.      gameboy_proc->AF.b.h -= value;
  6837.      
  6838.      MORE_CYCLES2(4);
  6839. }
  6840.  
  6841. void inst_sub_c()
  6842. {
  6843.      unsigned char value = gameboy_proc->BC.b.l;
  6844.      
  6845.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6846.      
  6847.      if(value > gameboy_proc->AF.b.h)
  6848.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6849.      else
  6850.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6851.           
  6852.      if(value == gameboy_proc->AF.b.h)
  6853.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6854.      else
  6855.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6856.      
  6857.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6858.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6859.      else
  6860.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6861.           
  6862.      gameboy_proc->AF.b.h -= value;
  6863.      
  6864.      MORE_CYCLES2(4);
  6865. }
  6866.  
  6867. void inst_sub_d()
  6868. {
  6869.      unsigned char value = gameboy_proc->DE.b.h;
  6870.      
  6871.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6872.      
  6873.      if(value > gameboy_proc->AF.b.h)
  6874.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6875.      else
  6876.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6877.           
  6878.      if(value == gameboy_proc->AF.b.h)
  6879.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6880.      else
  6881.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6882.      
  6883.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6884.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6885.      else
  6886.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6887.           
  6888.      gameboy_proc->AF.b.h -= value;
  6889.      
  6890.      MORE_CYCLES2(4);
  6891. }
  6892.  
  6893. void inst_sub_e()
  6894. {
  6895.      unsigned char value = gameboy_proc->DE.b.l;
  6896.      
  6897.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6898.      
  6899.      if(value > gameboy_proc->AF.b.h)
  6900.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6901.      else
  6902.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6903.           
  6904.      if(value == gameboy_proc->AF.b.h)
  6905.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6906.      else
  6907.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6908.      
  6909.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6910.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6911.      else
  6912.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6913.           
  6914.      gameboy_proc->AF.b.h -= value;
  6915.      
  6916.      MORE_CYCLES2(4);
  6917. }
  6918.  
  6919. void inst_sub_h()
  6920. {
  6921.      unsigned char value = gameboy_proc->HL.b.h;
  6922.      
  6923.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6924.      
  6925.      if(value > gameboy_proc->AF.b.h)
  6926.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6927.      else
  6928.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6929.           
  6930.      if(value == gameboy_proc->AF.b.h)
  6931.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6932.      else
  6933.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6934.      
  6935.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6936.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6937.      else
  6938.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6939.           
  6940.      gameboy_proc->AF.b.h -= value;
  6941.      
  6942.      MORE_CYCLES2(4);
  6943. }
  6944.  
  6945. void inst_sub_hl_indirect()
  6946. {
  6947.      unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
  6948.      
  6949.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6950.      
  6951.      if(value > gameboy_proc->AF.b.h)
  6952.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6953.      else
  6954.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6955.           
  6956.      if(value == gameboy_proc->AF.b.h)
  6957.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6958.      else
  6959.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6960.      
  6961.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6962.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6963.      else
  6964.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6965.           
  6966.      gameboy_proc->AF.b.h -= value;
  6967.      
  6968.      MORE_CYCLES2(8);
  6969. }
  6970.  
  6971. void inst_sub_l()
  6972. {
  6973.      unsigned char value = gameboy_proc->HL.b.l;
  6974.      
  6975.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  6976.      
  6977.      if(value > gameboy_proc->AF.b.h)
  6978.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  6979.      else
  6980.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  6981.           
  6982.      if(value == gameboy_proc->AF.b.h)
  6983.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  6984.      else
  6985.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  6986.      
  6987.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  6988.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  6989.      else
  6990.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  6991.           
  6992.      gameboy_proc->AF.b.h -= value;
  6993.      
  6994.      MORE_CYCLES2(4);
  6995. }
  6996.  
  6997. void inst_sub_n()
  6998. {
  6999.      unsigned char value = memory_read_byte(gameboy_proc->PC.uw);
  7000.      gameboy_proc->PC.uw++;
  7001.      
  7002.      FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
  7003.      
  7004.      if(value > gameboy_proc->AF.b.h)
  7005.           FLAGS_SET(gameboy_proc, FLAGS_CARRY);
  7006.      else
  7007.           FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
  7008.           
  7009.      if(value == gameboy_proc->AF.b.h)
  7010.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7011.      else
  7012.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7013.      
  7014.      if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
  7015.           FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
  7016.      else
  7017.           FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
  7018.           
  7019.      gameboy_proc->AF.b.h -= value;
  7020.      
  7021.      MORE_CYCLES2(8);
  7022. }
  7023.  
  7024. void inst_unknown()
  7025. {
  7026.      printf("Unknown opcode!\n");
  7027.      gameboy_proc->running = 0;
  7028.      gameboy_proc->PC.uw  -= 1;
  7029.      gbz80_debugger(gameboy_proc);
  7030. }
  7031.  
  7032. void inst_xor_a() /* AF */
  7033. {
  7034.      gameboy_proc->AF.b.h = 0;
  7035.      FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7036.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7037.      MORE_CYCLES2(4);
  7038. }
  7039.  
  7040. void inst_xor_b() /* A8 */
  7041. {
  7042.      gameboy_proc->AF.b.h ^= gameboy_proc->BC.b.h;
  7043.      
  7044.      if (gameboy_proc->AF.b.h)
  7045.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7046.      else
  7047.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7048.      
  7049.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7050.      
  7051.      MORE_CYCLES2(4);
  7052. }
  7053.  
  7054. void inst_xor_c() /* A9 */
  7055. {
  7056.      gameboy_proc->AF.b.h ^= gameboy_proc->BC.b.l;
  7057.      
  7058.      if (gameboy_proc->AF.b.h)
  7059.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7060.      else
  7061.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7062.           
  7063.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7064.      
  7065.      MORE_CYCLES2(4);
  7066. }
  7067.  
  7068. void inst_xor_d() /* AA */
  7069. {
  7070.      gameboy_proc->AF.b.h ^= gameboy_proc->DE.b.h;
  7071.      
  7072.      if (gameboy_proc->AF.b.h)
  7073.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7074.      else
  7075.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7076.           
  7077.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7078.      
  7079.      MORE_CYCLES2(4);
  7080. }
  7081.  
  7082. void inst_xor_e() /* AB */
  7083. {
  7084.      gameboy_proc->AF.b.h ^= gameboy_proc->DE.b.l;
  7085.      
  7086.      if (gameboy_proc->AF.b.h)
  7087.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7088.      else
  7089.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7090.           
  7091.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7092.      
  7093.      MORE_CYCLES2(4);
  7094. }
  7095.  
  7096. void inst_xor_h() /* AC */
  7097. {
  7098.      gameboy_proc->AF.b.h ^= gameboy_proc->HL.b.h;
  7099.      
  7100.      if (gameboy_proc->AF.b.h)
  7101.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7102.      else
  7103.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7104.           
  7105.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7106.      
  7107.      MORE_CYCLES2(4);
  7108. }
  7109.  
  7110. void inst_xor_hl_indirect() /* AE */
  7111. {
  7112.      gameboy_proc->AF.b.h ^= memory_read_byte(gameboy_proc->HL.uw);
  7113.      
  7114.      if (gameboy_proc->AF.b.h)
  7115.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7116.      else
  7117.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7118.           
  7119.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7120.      
  7121.      MORE_CYCLES2(8);
  7122. }
  7123.  
  7124. void inst_xor_l() /* AD */
  7125. {
  7126.      gameboy_proc->AF.b.h ^= gameboy_proc->HL.b.l;
  7127.      
  7128.      if (gameboy_proc->AF.b.h)
  7129.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7130.      else
  7131.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7132.           
  7133.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7134.      
  7135.      MORE_CYCLES2(4);
  7136. }
  7137.  
  7138. void inst_xor_n() /* EE */
  7139. {
  7140.      gameboy_proc->AF.b.h ^= memory_read_byte(gameboy_proc->PC.uw);
  7141.      gameboy_proc->PC.uw++;
  7142.      
  7143.      if (gameboy_proc->AF.b.h)
  7144.           FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
  7145.      else
  7146.           FLAGS_SET(gameboy_proc, FLAGS_ZERO);
  7147.           
  7148.      FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
  7149.      
  7150.      MORE_CYCLES2(8);
  7151. }
  7152.