home *** CD-ROM | disk | FTP | other *** search
- /*
- * gbe - gameboy emulator
- * Copyright (C) 1999 Chuck Mason, Steven Fuller
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *
- * Chuck Mason <chuckjr@sinclair.net>
- * Steven Fuller <relnev@atdot.org>
- */
- #include <stdio.h>
- #include <stdlib.h>
-
- #include "rom.h"
- #include "mem.h"
- #include "cpu.h"
- #include "vram.h"
- #include "regs.h"
- #include "debug.h"
- #include "data.h"
- #include "joypad.h"
-
- void inst_unimplemented();
- void inst_cb_unimplemented();
-
- void inst_adc_a_a();
- void inst_adc_a_b();
- void inst_adc_a_c();
- void inst_adc_a_d();
- void inst_adc_a_e();
- void inst_adc_a_h();
- void inst_adc_a_hl_indirect();
- void inst_adc_a_l();
- void inst_adc_a_n();
- void inst_add_a_a();
- void inst_add_a_b();
- void inst_add_a_c();
- void inst_add_a_d();
- void inst_add_a_e();
- void inst_add_a_h();
- void inst_add_a_hl_indirect();
- void inst_add_a_l();
- void inst_add_a_n();
- void inst_add_hl_bc();
- void inst_add_hl_de();
- void inst_add_hl_hl();
- void inst_add_hl_sp();
- void inst_add_sp_n();
- void inst_and_a();
- void inst_and_b();
- void inst_and_c();
- void inst_and_d();
- void inst_and_e();
- void inst_and_h();
- void inst_and_hl_indirect();
- void inst_and_l();
- void inst_and_n();
- void inst_call_c_nn();
- void inst_call_nc_nn();
- void inst_call_nn();
- void inst_call_nz_nn();
- void inst_call_z_nn();
- void inst_cb();
- void inst_cb_bit_0_a();
- void inst_cb_bit_0_b();
- void inst_cb_bit_0_c();
- void inst_cb_bit_0_d();
- void inst_cb_bit_0_e();
- void inst_cb_bit_0_h();
- void inst_cb_bit_0_hl_indirect();
- void inst_cb_bit_0_l();
- void inst_cb_bit_1_a();
- void inst_cb_bit_1_b();
- void inst_cb_bit_1_c();
- void inst_cb_bit_1_d();
- void inst_cb_bit_1_e();
- void inst_cb_bit_1_h();
- void inst_cb_bit_1_hl_indirect();
- void inst_cb_bit_1_l();
- void inst_cb_bit_2_a();
- void inst_cb_bit_2_b();
- void inst_cb_bit_2_c();
- void inst_cb_bit_2_d();
- void inst_cb_bit_2_e();
- void inst_cb_bit_2_h();
- void inst_cb_bit_2_hl_indirect();
- void inst_cb_bit_2_l();
- void inst_cb_bit_3_a();
- void inst_cb_bit_3_b();
- void inst_cb_bit_3_c();
- void inst_cb_bit_3_d();
- void inst_cb_bit_3_e();
- void inst_cb_bit_3_h();
- void inst_cb_bit_3_hl_indirect();
- void inst_cb_bit_3_l();
- void inst_cb_bit_4_a();
- void inst_cb_bit_4_b();
- void inst_cb_bit_4_c();
- void inst_cb_bit_4_d();
- void inst_cb_bit_4_e();
- void inst_cb_bit_4_h();
- void inst_cb_bit_4_hl_indirect();
- void inst_cb_bit_4_l();
- void inst_cb_bit_5_a();
- void inst_cb_bit_5_b();
- void inst_cb_bit_5_c();
- void inst_cb_bit_5_d();
- void inst_cb_bit_5_e();
- void inst_cb_bit_5_h();
- void inst_cb_bit_5_hl_indirect();
- void inst_cb_bit_5_l();
- void inst_cb_bit_6_a();
- void inst_cb_bit_6_b();
- void inst_cb_bit_6_c();
- void inst_cb_bit_6_d();
- void inst_cb_bit_6_e();
- void inst_cb_bit_6_h();
- void inst_cb_bit_6_hl_indirect();
- void inst_cb_bit_6_l();
- void inst_cb_bit_7_a();
- void inst_cb_bit_7_b();
- void inst_cb_bit_7_c();
- void inst_cb_bit_7_d();
- void inst_cb_bit_7_e();
- void inst_cb_bit_7_h();
- void inst_cb_bit_7_hl_indirect();
- void inst_cb_bit_7_l();
- void inst_cb_res_0_a();
- void inst_cb_res_0_b();
- void inst_cb_res_0_c();
- void inst_cb_res_0_d();
- void inst_cb_res_0_e();
- void inst_cb_res_0_h();
- void inst_cb_res_0_hl_indirect();
- void inst_cb_res_0_l();
- void inst_cb_res_1_a();
- void inst_cb_res_1_b();
- void inst_cb_res_1_c();
- void inst_cb_res_1_d();
- void inst_cb_res_1_e();
- void inst_cb_res_1_h();
- void inst_cb_res_1_hl_indirect();
- void inst_cb_res_1_l();
- void inst_cb_res_2_a();
- void inst_cb_res_2_b();
- void inst_cb_res_2_c();
- void inst_cb_res_2_d();
- void inst_cb_res_2_e();
- void inst_cb_res_2_h();
- void inst_cb_res_2_hl_indirect();
- void inst_cb_res_2_l();
- void inst_cb_res_3_a();
- void inst_cb_res_3_b();
- void inst_cb_res_3_c();
- void inst_cb_res_3_d();
- void inst_cb_res_3_e();
- void inst_cb_res_3_h();
- void inst_cb_res_3_hl_indirect();
- void inst_cb_res_3_l();
- void inst_cb_res_4_a();
- void inst_cb_res_4_b();
- void inst_cb_res_4_c();
- void inst_cb_res_4_d();
- void inst_cb_res_4_e();
- void inst_cb_res_4_h();
- void inst_cb_res_4_hl_indirect();
- void inst_cb_res_4_l();
- void inst_cb_res_5_a();
- void inst_cb_res_5_b();
- void inst_cb_res_5_c();
- void inst_cb_res_5_d();
- void inst_cb_res_5_e();
- void inst_cb_res_5_h();
- void inst_cb_res_5_hl_indirect();
- void inst_cb_res_5_l();
- void inst_cb_res_6_a();
- void inst_cb_res_6_b();
- void inst_cb_res_6_c();
- void inst_cb_res_6_d();
- void inst_cb_res_6_e();
- void inst_cb_res_6_h();
- void inst_cb_res_6_hl_indirect();
- void inst_cb_res_6_l();
- void inst_cb_res_7_a();
- void inst_cb_res_7_b();
- void inst_cb_res_7_c();
- void inst_cb_res_7_d();
- void inst_cb_res_7_e();
- void inst_cb_res_7_h();
- void inst_cb_res_7_hl_indirect();
- void inst_cb_res_7_l();
- void inst_cb_rl_a();
- void inst_cb_rl_b();
- void inst_cb_rl_c();
- void inst_cb_rl_d();
- void inst_cb_rl_e();
- void inst_cb_rl_h();
- void inst_cb_rl_hl_indirect();
- void inst_cb_rl_l();
- void inst_cb_rlc_a();
- void inst_cb_rlc_b();
- void inst_cb_rlc_c();
- void inst_cb_rlc_d();
- void inst_cb_rlc_e();
- void inst_cb_rlc_h();
- void inst_cb_rlc_hl_indirect();
- void inst_cb_rlc_l();
- void inst_cb_rr_a();
- void inst_cb_rr_b();
- void inst_cb_rr_c();
- void inst_cb_rr_d();
- void inst_cb_rr_e();
- void inst_cb_rr_h();
- void inst_cb_rr_hl_indirect();
- void inst_cb_rr_l();
- void inst_cb_rrc_a();
- void inst_cb_rrc_b();
- void inst_cb_rrc_c();
- void inst_cb_rrc_d();
- void inst_cb_rrc_e();
- void inst_cb_rrc_h();
- void inst_cb_rrc_hl_indirect();
- void inst_cb_rrc_l();
- void inst_cb_set_0_a();
- void inst_cb_set_0_b();
- void inst_cb_set_0_c();
- void inst_cb_set_0_d();
- void inst_cb_set_0_e();
- void inst_cb_set_0_h();
- void inst_cb_set_0_hl_indirect();
- void inst_cb_set_0_l();
- void inst_cb_set_1_a();
- void inst_cb_set_1_b();
- void inst_cb_set_1_c();
- void inst_cb_set_1_d();
- void inst_cb_set_1_e();
- void inst_cb_set_1_h();
- void inst_cb_set_1_hl_indirect();
- void inst_cb_set_1_l();
- void inst_cb_set_2_a();
- void inst_cb_set_2_b();
- void inst_cb_set_2_c();
- void inst_cb_set_2_d();
- void inst_cb_set_2_e();
- void inst_cb_set_2_h();
- void inst_cb_set_2_hl_indirect();
- void inst_cb_set_2_l();
- void inst_cb_set_3_a();
- void inst_cb_set_3_b();
- void inst_cb_set_3_c();
- void inst_cb_set_3_d();
- void inst_cb_set_3_e();
- void inst_cb_set_3_h();
- void inst_cb_set_3_hl_indirect();
- void inst_cb_set_3_l();
- void inst_cb_set_4_a();
- void inst_cb_set_4_b();
- void inst_cb_set_4_c();
- void inst_cb_set_4_d();
- void inst_cb_set_4_e();
- void inst_cb_set_4_h();
- void inst_cb_set_4_hl_indirect();
- void inst_cb_set_4_l();
- void inst_cb_set_5_a();
- void inst_cb_set_5_b();
- void inst_cb_set_5_c();
- void inst_cb_set_5_d();
- void inst_cb_set_5_e();
- void inst_cb_set_5_h();
- void inst_cb_set_5_hl_indirect();
- void inst_cb_set_5_l();
- void inst_cb_set_6_a();
- void inst_cb_set_6_b();
- void inst_cb_set_6_c();
- void inst_cb_set_6_d();
- void inst_cb_set_6_e();
- void inst_cb_set_6_h();
- void inst_cb_set_6_hl_indirect();
- void inst_cb_set_6_l();
- void inst_cb_set_7_a();
- void inst_cb_set_7_b();
- void inst_cb_set_7_c();
- void inst_cb_set_7_d();
- void inst_cb_set_7_e();
- void inst_cb_set_7_h();
- void inst_cb_set_7_hl_indirect();
- void inst_cb_set_7_l();
- void inst_cb_sla_a();
- void inst_cb_sla_b();
- void inst_cb_sla_c();
- void inst_cb_sla_d();
- void inst_cb_sla_e();
- void inst_cb_sla_h();
- void inst_cb_sla_hl_indirect();
- void inst_cb_sla_l();
- void inst_cb_sra_a();
- void inst_cb_sra_b();
- void inst_cb_sra_c();
- void inst_cb_sra_d();
- void inst_cb_sra_e();
- void inst_cb_sra_h();
- void inst_cb_sra_hl_indirect();
- void inst_cb_sra_l();
- void inst_cb_srl_a();
- void inst_cb_srl_b();
- void inst_cb_srl_c();
- void inst_cb_srl_d();
- void inst_cb_srl_e();
- void inst_cb_srl_h();
- void inst_cb_srl_hl_indirect();
- void inst_cb_srl_l();
- void inst_cb_swap_a();
- void inst_cb_swap_b();
- void inst_cb_swap_c();
- void inst_cb_swap_d();
- void inst_cb_swap_e();
- void inst_cb_swap_h();
- void inst_cb_swap_hl_indirect();
- void inst_cb_swap_l();
- void inst_ccf();
- void inst_cp_a();
- void inst_cp_b();
- void inst_cp_c();
- void inst_cp_d();
- void inst_cp_e();
- void inst_cp_h();
- void inst_cp_hl_indirect();
- void inst_cp_l();
- void inst_cp_n();
- void inst_cpl();
- void inst_daa();
- void inst_dec_a();
- void inst_dec_b();
- void inst_dec_bc();
- void inst_dec_c();
- void inst_dec_d();
- void inst_dec_de();
- void inst_dec_e();
- void inst_dec_h();
- void inst_dec_hl();
- void inst_dec_hl_indirect();
- void inst_dec_l();
- void inst_dec_sp();
- void inst_di();
- void inst_ei();
- void inst_halt();
- void inst_inc_a();
- void inst_inc_b();
- void inst_inc_bc();
- void inst_inc_c();
- void inst_inc_d();
- void inst_inc_de();
- void inst_inc_e();
- void inst_inc_h();
- void inst_inc_hl();
- void inst_inc_hl_indirect();
- void inst_inc_l();
- void inst_inc_sp();
- void inst_jp_c_nn();
- void inst_jp_hl();
- void inst_jp_nc_nn();
- void inst_jp_nn();
- void inst_jp_nz_nn();
- void inst_jp_z_nn();
- void inst_jr_c_n();
- void inst_jr_n();
- void inst_jr_nc_n();
- void inst_jr_nz_n();
- void inst_jr_z_n();
- void inst_ld_a_b();
- void inst_ld_a_bc_indirect();
- void inst_ld_a_c();
- void inst_ld_a_c_indirect();
- void inst_ld_a_d();
- void inst_ld_a_de_indirect();
- void inst_ld_a_e();
- void inst_ld_a_ff_n_indirect();
- void inst_ld_a_h();
- void inst_ld_a_hl_indirect();
- void inst_ld_a_hld_indirect();
- void inst_ld_a_hli_indirect();
- void inst_ld_a_l();
- void inst_ld_a_n();
- void inst_ld_a_nn_indirect();
- void inst_ld_b_a();
- void inst_ld_b_c();
- void inst_ld_b_d();
- void inst_ld_b_e();
- void inst_ld_b_h();
- void inst_ld_b_hl_indirect();
- void inst_ld_b_l();
- void inst_ld_b_n();
- void inst_ld_bc_indirect_a();
- void inst_ld_bc_nn();
- void inst_ld_c_a();
- void inst_ld_c_b();
- void inst_ld_c_d();
- void inst_ld_c_e();
- void inst_ld_c_h();
- void inst_ld_c_hl_indirect();
- void inst_ld_c_indirect_a();
- void inst_ld_c_l();
- void inst_ld_c_n();
- void inst_ld_d_a();
- void inst_ld_d_b();
- void inst_ld_d_c();
- void inst_ld_d_e();
- void inst_ld_d_h();
- void inst_ld_d_hl_indirect();
- void inst_ld_d_l();
- void inst_ld_d_n();
- void inst_ld_de_indirect_a();
- void inst_ld_de_nn();
- void inst_ld_e_a();
- void inst_ld_e_b();
- void inst_ld_e_c();
- void inst_ld_e_d();
- void inst_ld_e_h();
- void inst_ld_e_hl_indirect();
- void inst_ld_e_l();
- void inst_ld_e_n();
- void inst_ld_ff_n_indirect_a();
- void inst_ld_h_a();
- void inst_ld_h_b();
- void inst_ld_h_c();
- void inst_ld_h_d();
- void inst_ld_h_e();
- void inst_ld_h_hl_indirect();
- void inst_ld_h_l();
- void inst_ld_h_n();
- void inst_ld_hl_indirect_a();
- void inst_ld_hl_indirect_b();
- void inst_ld_hl_indirect_c();
- void inst_ld_hl_indirect_d();
- void inst_ld_hl_indirect_e();
- void inst_ld_hl_indirect_h();
- void inst_ld_hl_indirect_l();
- void inst_ld_hl_indirect_n();
- void inst_ld_hl_nn();
- void inst_ld_hl_sp_n();
- void inst_ld_hld_indirect_a();
- void inst_ld_hli_indirect_a();
- void inst_ld_l_a();
- void inst_ld_l_b();
- void inst_ld_l_c();
- void inst_ld_l_d();
- void inst_ld_l_e();
- void inst_ld_l_h();
- void inst_ld_l_hl_indirect();
- void inst_ld_l_n();
- void inst_ld_nn_indirect_a();
- void inst_ld_nn_indirect_sp();
- void inst_ld_sp_hl();
- void inst_ld_sp_nn();
- void inst_nop();
- void inst_or_a();
- void inst_or_b();
- void inst_or_c();
- void inst_or_d();
- void inst_or_e();
- void inst_or_h();
- void inst_or_hl_indirect();
- void inst_or_l();
- void inst_or_n();
- void inst_pop_af();
- void inst_pop_bc();
- void inst_pop_de();
- void inst_pop_hl();
- void inst_push_af();
- void inst_push_bc();
- void inst_push_de();
- void inst_push_hl();
- void inst_ret();
- void inst_ret_c();
- void inst_ret_nc();
- void inst_ret_nz();
- void inst_ret_z();
- void inst_reti();
- void inst_rla();
- void inst_rlca();
- void inst_rra();
- void inst_rrca();
- void inst_rst_00h();
- void inst_rst_08h();
- void inst_rst_10h();
- void inst_rst_18h();
- void inst_rst_20h();
- void inst_rst_28h();
- void inst_rst_30h();
- void inst_rst_38h();
- void inst_sbc_a();
- void inst_sbc_b();
- void inst_sbc_c();
- void inst_sbc_d();
- void inst_sbc_e();
- void inst_sbc_h();
- void inst_sbc_hl_indirect();
- void inst_sbc_l();
- void inst_sbc_n();
- void inst_scf();
- void inst_stop();
- void inst_sub_a();
- void inst_sub_b();
- void inst_sub_c();
- void inst_sub_d();
- void inst_sub_e();
- void inst_sub_h();
- void inst_sub_hl_indirect();
- void inst_sub_l();
- void inst_sub_n();
- void inst_unknown();
- void inst_xor_a();
- void inst_xor_b();
- void inst_xor_c();
- void inst_xor_d();
- void inst_xor_e();
- void inst_xor_h();
- void inst_xor_hl_indirect();
- void inst_xor_l();
- void inst_xor_n();
-
- gameboy_proc_t *gameboy_proc = (gameboy_proc_t *)NULL;
- static unsigned char current_opcode = 0;
-
- typedef struct _gbz80_instruction {
- unsigned char opcode;
- char *name;
- unsigned char operand_size;
- void (*instruction)(void);
- } gbz80_instruction;
-
- gbz80_instruction gbz80_instructions[] = {
- { 0x00, "NOP", 0, inst_nop },
- { 0x01, "LD BC, $%04X", 2, inst_ld_bc_nn },
- { 0x02, "LD (BC), A", 0, inst_ld_bc_indirect_a },
- { 0x03, "INC BC", 0, inst_inc_bc },
- { 0x04, "INC B", 0, inst_inc_b },
- { 0x05, "DEC B", 0, inst_dec_b },
- { 0x06, "LD B, $%02X", 1, inst_ld_b_n },
- { 0x07, "RLCA", 0, inst_rlca },
- { 0x08, "LD ($%04X), SP", 2, inst_ld_nn_indirect_sp },
- { 0x09, "ADD HL, BC", 0, inst_add_hl_bc },
- { 0x0A, "LD A, (BC)", 0, inst_ld_a_bc_indirect },
- { 0x0B, "DEC BC", 0, inst_dec_bc },
- { 0x0C, "INC C", 0, inst_inc_c },
- { 0x0D, "DEC C", 0, inst_dec_c },
- { 0x0E, "LD C, $%02X", 1, inst_ld_c_n },
- { 0x0F, "RRCA", 0, inst_rrca },
- { 0x10, "STOP", 1, inst_stop },
- { 0x11, "LD DE, $%04X", 2, inst_ld_de_nn },
- { 0x12, "LD (DE), A", 0, inst_ld_de_indirect_a },
- { 0x13, "INC DE", 0, inst_inc_de },
- { 0x14, "INC D", 0, inst_inc_d },
- { 0x15, "DEC D", 0, inst_dec_d },
- { 0x16, "LD D, $%02X", 1, inst_ld_d_n },
- { 0x17, "RLA", 0, inst_rla },
- { 0x18, "JR $%02X", 1, inst_jr_n },
- { 0x19, "ADD HL, DE", 0, inst_add_hl_de },
- { 0x1A, "LD A,(DE)", 0, inst_ld_a_de_indirect },
- { 0x1B, "DEC DE", 0, inst_dec_de },
- { 0x1C, "INC E", 0, inst_inc_e },
- { 0x1D, "DEC E", 0, inst_dec_e },
- { 0x1E, "LD E, $%02X", 1, inst_ld_e_n },
- { 0x1F, "RRA", 0, inst_rra },
- { 0x20, "JR NZ,$%02X", 1, inst_jr_nz_n },
- { 0x21, "LD HL, $%04X", 2, inst_ld_hl_nn },
- { 0x22, "LD (HL+), A", 0, inst_ld_hli_indirect_a },
- { 0x23, "INC HL", 0, inst_inc_hl },
- { 0x24, "INC H", 0, inst_inc_h },
- { 0x25, "DEC H", 0, inst_dec_h },
- { 0x26, "LD H, $%02X", 1, inst_ld_h_n },
- { 0x27, "DAA", 0, inst_daa },
- { 0x28, "JR Z,$%02X", 1, inst_jr_z_n },
- { 0x29, "ADD HL, HL", 0, inst_add_hl_hl },
- { 0x2A, "LD A, (HL+)", 0, inst_ld_a_hli_indirect },
- { 0x2B, "DEC HL", 0, inst_dec_hl },
- { 0x2C, "INC L", 0, inst_inc_l },
- { 0x2D, "DEC L", 0, inst_dec_l },
- { 0x2E, "LD L, $%02X", 1, inst_ld_l_n },
- { 0x2F, "CPL", 0, inst_cpl },
- { 0x30, "JR NC, $%02X", 1, inst_jr_nc_n },
- { 0x31, "LD SP, $%04X", 2, inst_ld_sp_nn },
- { 0x32, "LD (HL-), A", 0, inst_ld_hld_indirect_a },
- { 0x33, "INC SP", 0, inst_inc_sp },
- { 0x34, "INC (HL)", 0, inst_inc_hl_indirect },
- { 0x35, "DEC (HL)", 0, inst_dec_hl_indirect },
- { 0x36, "LD (HL), $%02X", 1, inst_ld_hl_indirect_n },
- { 0x37, "SCF", 0, inst_scf },
- { 0x38, "JR C,$%02X", 1, inst_jr_c_n },
- { 0x39, "ADD HL, SP", 0, inst_add_hl_sp },
- { 0x3A, "LD A, (HL-)", 0, inst_ld_a_hld_indirect },
- { 0x3B, "DEC SP", 0, inst_dec_sp },
- { 0x3C, "INC A", 0, inst_inc_a },
- { 0x3D, "DEC A", 0, inst_dec_a },
- { 0x3E, "LD A, $%02X", 1, inst_ld_a_n },
- { 0x3F, "CCF", 0, inst_ccf },
- { 0x40, "LD B, B", 0, inst_nop },
- { 0x41, "LD B, C", 0, inst_ld_b_c },
- { 0x42, "LD B, D", 0, inst_ld_b_d },
- { 0x43, "LD B, E", 0, inst_ld_b_e },
- { 0x44, "LD B, H", 0, inst_ld_b_h },
- { 0x45, "LD B, L", 0, inst_ld_b_l },
- { 0x46, "LD B, (HL)", 0, inst_ld_b_hl_indirect },
- { 0x47, "LD B, A", 0, inst_ld_b_a },
- { 0x48, "LD C, B", 0, inst_ld_c_b },
- { 0x49, "LD C, C", 0, inst_nop },
- { 0x4A, "LD C, D", 0, inst_ld_c_d },
- { 0x4B, "LD C, E", 0, inst_ld_c_e },
- { 0x4C, "LD C, H", 0, inst_ld_c_h },
- { 0x4D, "LD C, L", 0, inst_ld_c_l },
- { 0x4E, "LD C, (HL)", 0, inst_ld_c_hl_indirect },
- { 0x4F, "LD C, A", 0, inst_ld_c_a },
- { 0x50, "LD D, B", 0, inst_ld_d_b },
- { 0x51, "LD D, C", 0, inst_ld_d_c },
- { 0x52, "LD D, D", 0, inst_nop },
- { 0x53, "LD D, E", 0, inst_ld_d_e },
- { 0x54, "LD D, H", 0, inst_ld_d_h },
- { 0x55, "LD D, L", 0, inst_ld_d_l },
- { 0x56, "LD D, (HL)", 0, inst_ld_d_hl_indirect },
- { 0x57, "LD D, A", 0, inst_ld_d_a },
- { 0x58, "LD E, B", 0, inst_ld_e_b },
- { 0x59, "LD E, C", 0, inst_ld_e_c },
- { 0x5A, "LD E, D", 0, inst_ld_e_d },
- { 0x5B, "LD E, E", 0, inst_nop },
- { 0x5C, "LD E, H", 0, inst_ld_e_h },
- { 0x5D, "LD E, L", 0, inst_ld_e_l },
- { 0x5E, "LD E, (HL)", 0, inst_ld_e_hl_indirect },
- { 0x5F, "LD E, A", 0, inst_ld_e_a },
- { 0x60, "LD H, B", 0, inst_ld_h_b },
- { 0x61, "LD H, C", 0, inst_ld_h_c },
- { 0x62, "LD H, D", 0, inst_ld_h_d },
- { 0x63, "LD H, E", 0, inst_ld_h_e },
- { 0x64, "LD H, H", 0, inst_nop },
- { 0x65, "LD H, L", 0, inst_ld_h_l },
- { 0x66, "LD H, (HL)", 0, inst_ld_h_hl_indirect },
- { 0x67, "LD H, A", 0, inst_ld_h_a },
- { 0x68, "LD L, B", 0, inst_ld_l_b },
- { 0x69, "LD L, C", 0, inst_ld_l_c },
- { 0x6A, "LD L, D", 0, inst_ld_l_d },
- { 0x6B, "LD L, E", 0, inst_ld_l_e },
- { 0x6C, "LD L, H", 0, inst_ld_l_h },
- { 0x6D, "LD L, L", 0, inst_nop },
- { 0x6E, "LD L, (HL)", 0, inst_ld_l_hl_indirect },
- { 0x6F, "LD L, A", 0, inst_ld_l_a },
- { 0x70, "LD (HL), B", 0, inst_ld_hl_indirect_b },
- { 0x71, "LD (HL), C", 0, inst_ld_hl_indirect_c },
- { 0x72, "LD (HL), D", 0, inst_ld_hl_indirect_d },
- { 0x73, "LD (HL), E", 0, inst_ld_hl_indirect_e },
- { 0x74, "LD (HL), H", 0, inst_ld_hl_indirect_h },
- { 0x75, "LD (HL), L", 0, inst_ld_hl_indirect_l },
- { 0x76, "HALT", 0, inst_halt },
- { 0x77, "LD (HL), A", 0, inst_ld_hl_indirect_a },
- { 0x78, "LD A, B", 0, inst_ld_a_b },
- { 0x79, "LD A, C", 0, inst_ld_a_c },
- { 0x7A, "LD A, D", 0, inst_ld_a_d },
- { 0x7B, "LD A, E", 0, inst_ld_a_e },
- { 0x7C, "LD A, H", 0, inst_ld_a_h },
- { 0x7D, "LD A, L", 0, inst_ld_a_l },
- { 0x7E, "LD A, (HL)", 0, inst_ld_a_hl_indirect },
- { 0x7F, "LD A, A", 0, inst_nop },
- { 0x80, "ADD A, B", 0, inst_add_a_b },
- { 0x81, "ADD A, C", 0, inst_add_a_c },
- { 0x82, "ADD A, D", 0, inst_add_a_d },
- { 0x83, "ADD A, E", 0, inst_add_a_e },
- { 0x84, "ADD A, H", 0, inst_add_a_h },
- { 0x85, "ADD A, L", 0, inst_add_a_l },
- { 0x86, "ADD A, (HL)", 0, inst_add_a_hl_indirect },
- { 0x87, "ADD A", 0, inst_add_a_a },
- { 0x88, "ADC A, B", 0, inst_adc_a_b },
- { 0x89, "ADC A, C", 0, inst_adc_a_c },
- { 0x8A, "ADC A, D", 0, inst_adc_a_d },
- { 0x8B, "ADC A, E", 0, inst_adc_a_e },
- { 0x8C, "ADC A, H", 0, inst_adc_a_h },
- { 0x8D, "ADC A, L", 0, inst_adc_a_l },
- { 0x8E, "ADC A, (HL)", 0, inst_adc_a_hl_indirect },
- { 0x8F, "ADC A, A", 0, inst_adc_a_a },
- { 0x90, "SUB B", 0, inst_sub_b },
- { 0x91, "SUB C", 0, inst_sub_c },
- { 0x92, "SUB D", 0, inst_sub_d },
- { 0x93, "SUB E", 0, inst_sub_e },
- { 0x94, "SUB H", 0, inst_sub_h },
- { 0x95, "SUB L", 0, inst_sub_l },
- { 0x96, "SUB (HL)", 0, inst_sub_hl_indirect },
- { 0x97, "SUB A", 0, inst_sub_a },
- { 0x98, "SBC A, B", 0, inst_sbc_b },
- { 0x99, "SBC A, C", 0, inst_sbc_c },
- { 0x9A, "SBC A, D", 0, inst_sbc_d },
- { 0x9B, "SBC A, E", 0, inst_sbc_e },
- { 0x9C, "SBC A, H", 0, inst_sbc_h },
- { 0x9D, "SBC A, L", 0, inst_sbc_l },
- { 0x9E, "SBC A, (HL)", 0, inst_sbc_hl_indirect },
- { 0x9F, "SBC A, A", 0, inst_sbc_a },
- { 0xA0, "AND B", 0, inst_and_b },
- { 0xA1, "AND C", 0, inst_and_c },
- { 0xA2, "AND D", 0, inst_and_d },
- { 0xA3, "AND E", 0, inst_and_e },
- { 0xA4, "AND H", 0, inst_and_h },
- { 0xA5, "AND L", 0, inst_and_l },
- { 0xA6, "AND (HL)", 0, inst_and_hl_indirect },
- { 0xA7, "AND A", 0, inst_and_a },
- { 0xA8, "XOR B", 0, inst_xor_b },
- { 0xA9, "XOR C", 0, inst_xor_c },
- { 0xAA, "XOR D", 0, inst_xor_d },
- { 0xAB, "XOR E", 0, inst_xor_e },
- { 0xAC, "XOR H", 0, inst_xor_h },
- { 0xAD, "XOR L", 0, inst_xor_l },
- { 0xAE, "XOR (HL)", 0, inst_xor_hl_indirect },
- { 0xAF, "XOR A", 0, inst_xor_a },
- { 0xB0, "OR B", 0, inst_or_b },
- { 0xB1, "OR C", 0, inst_or_c },
- { 0xB2, "OR D", 0, inst_or_d },
- { 0xB3, "OR E", 0, inst_or_e },
- { 0xB4, "OR H", 0, inst_or_h },
- { 0xB5, "OR L", 0, inst_or_l },
- { 0xB6, "OR (HL)", 0, inst_or_hl_indirect },
- { 0xB7, "OR A", 0, inst_or_a },
- { 0xB8, "CP B", 0, inst_cp_b },
- { 0xB9, "CP C", 0, inst_cp_c },
- { 0xBA, "CP D", 0, inst_cp_d },
- { 0xBB, "CP E", 0, inst_cp_e },
- { 0xBC, "CP H", 0, inst_cp_h },
- { 0xBD, "CP L", 0, inst_cp_l },
- { 0xBE, "CP (HL)", 0, inst_cp_hl_indirect },
- { 0xBF, "CP A", 0, inst_cp_a },
- { 0xC0, "RET NZ", 0, inst_ret_nz },
- { 0xC1, "POP BC", 0, inst_pop_bc },
- { 0xC2, "JP NZ, $%04X", 2, inst_jp_nz_nn },
- { 0xC3, "JP $%04X", 2, inst_jp_nn },
- { 0xC4, "CALL NZ, $%04X", 2, inst_call_nz_nn },
- { 0xC5, "PUSH BC", 0, inst_push_bc },
- { 0xC6, "ADD A, $%02X", 1, inst_add_a_n },
- { 0xC7, "RST $00", 0, inst_rst_00h },
- { 0xC8, "RET Z", 0, inst_ret_z },
- { 0xC9, "RET", 0, inst_ret },
- { 0xCA, "JP Z,$%04X", 2, inst_jp_z_nn },
- { 0xCB, "CB%02X", 1, inst_cb },
- { 0xCC, "CALL Z, $%04X", 2, inst_call_z_nn },
- { 0xCD, "CALL $%04X", 2, inst_call_nn },
- { 0xCE, "ADC A, $%02X", 1, inst_adc_a_n },
- { 0xCF, "RST $08", 0, inst_rst_08h },
- { 0xD0, "RET NC", 0, inst_ret_nc },
- { 0xD1, "POP DE", 0, inst_pop_de },
- { 0xD2, "JP NC, $%04X", 2, inst_jp_nc_nn },
- { 0xD3, "UNKNOWN", 0, inst_unknown },
- { 0xD4, "CALL NC, $%04X", 2, inst_call_nc_nn },
- { 0xD5, "PUSH DE", 0, inst_push_de },
- { 0xD6, "SUB $%02X", 1, inst_sub_n },
- { 0xD7, "RST $10", 0, inst_rst_10h },
- { 0xD8, "RET C", 0, inst_ret_c },
- { 0xD9, "RETI", 0, inst_reti },
- { 0xDA, "JP C, $%04X", 2, inst_jp_c_nn },
- { 0xDB, "UNKNOWN", 0, inst_unknown },
- { 0xDC, "CALL C, $%04X", 2, inst_call_c_nn },
- { 0xDD, "UNKNOWN", 0, inst_unknown },
- { 0xDE, "SBC A, $%02X", 1, inst_sbc_n },
- { 0xDF, "RST $18", 0, inst_rst_18h },
- { 0xE0, "LD ($FF00 + $%02X), A", 1, inst_ld_ff_n_indirect_a },
- { 0xE1, "POP HL", 0, inst_pop_hl },
- { 0xE2, "LD ($FF00 + C), A", 0, inst_ld_c_indirect_a },
- { 0xE3, "UNKNOWN", 0, inst_unknown },
- { 0xE4, "UNKNOWN", 0, inst_unknown },
- { 0xE5, "PUSH HL", 0, inst_push_hl },
- { 0xE6, "AND $%02X", 1, inst_and_n },
- { 0xE7, "RST $20", 0, inst_rst_20h },
- { 0xE8, "ADD SP,$%02X", 1, inst_add_sp_n },
- { 0xE9, "JP HL", 0, inst_jp_hl },
- { 0xEA, "LD ($%04X), A", 2, inst_ld_nn_indirect_a },
- { 0xEB, "UNKNOWN", 0, inst_unknown },
- { 0xEC, "UNKNOWN", 0, inst_unknown },
- { 0xED, "UNKNOWN", 0, inst_unknown },
- { 0xEE, "XOR $%02X", 1, inst_xor_n },
- { 0xEF, "RST $28", 0, inst_rst_28h },
- { 0xF0, "LD A, ($FF00 + $%02X)", 1, inst_ld_a_ff_n_indirect },
- { 0xF1, "POP AF", 0, inst_pop_af },
- { 0xF2, "LD A, ($FF00 + C)", 0, inst_ld_a_c_indirect },
- { 0xF3, "DI", 0, inst_di },
- { 0xF4, "UNKNOWN", 0, inst_unknown },
- { 0xF5, "PUSH AF", 0, inst_push_af },
- { 0xF6, "OR $%02X", 1, inst_or_n },
- { 0xF7, "RST $30", 0, inst_rst_30h },
- { 0xF8, "LD HL, SP+$%02X", 1, inst_ld_hl_sp_n },
- { 0xF9, "LD SP, HL", 0, inst_ld_sp_hl },
- { 0xFA, "LD A, ($%04X)", 2, inst_ld_a_nn_indirect },
- { 0xFB, "EI", 0, inst_ei },
- { 0xFC, "UNKNOWN", 0, inst_unknown },
- { 0xFD, "UNKNOWN", 0, inst_unknown },
- { 0xFE, "CP $%02X", 1, inst_cp_n },
- { 0xFF, "RST $38", 0, inst_rst_38h },
- { 0, (char *)NULL, 0, (void *)NULL }
- };
-
- gbz80_instruction gbz80_cb_instructions[] = {
- { 0x00, "RLC B", 0, inst_cb_rlc_b },
- { 0x01, "RLC C", 0, inst_cb_rlc_c },
- { 0x02, "RLC D", 0, inst_cb_rlc_d },
- { 0x03, "RLC E", 0, inst_cb_rlc_e },
- { 0x04, "RLC H", 0, inst_cb_rlc_h },
- { 0x05, "RLC L", 0, inst_cb_rlc_l },
- { 0x06, "RLC (HL)", 0, inst_cb_rlc_hl_indirect },
- { 0x07, "RLC A", 0, inst_cb_rlc_a },
- { 0x08, "RRC B", 0, inst_cb_rrc_b },
- { 0x09, "RRC C", 0, inst_cb_rrc_c },
- { 0x0A, "RRC D", 0, inst_cb_rrc_d },
- { 0x0B, "RRC E", 0, inst_cb_rrc_e },
- { 0x0C, "RRC H", 0, inst_cb_rrc_h },
- { 0x0D, "RRC L", 0, inst_cb_rrc_l },
- { 0x0E, "RRC (HL)", 0, inst_cb_rrc_hl_indirect },
- { 0x0F, "RRC A", 0, inst_cb_rrc_a },
- { 0x10, "RL B", 0, inst_cb_rl_b },
- { 0x11, "RL C", 0, inst_cb_rl_c },
- { 0x12, "RL D", 0, inst_cb_rl_d },
- { 0x13, "RL E", 0, inst_cb_rl_e },
- { 0x14, "RL H", 0, inst_cb_rl_h },
- { 0x15, "RL L", 0, inst_cb_rl_l },
- { 0x16, "RL (HL)", 0, inst_cb_rl_hl_indirect },
- { 0x17, "RL A", 0, inst_cb_rl_a },
- { 0x18, "RR B", 0, inst_cb_rr_b },
- { 0x19, "RR C", 0, inst_cb_rr_c },
- { 0x1A, "RR D", 0, inst_cb_rr_d },
- { 0x1B, "RR E", 0, inst_cb_rr_e },
- { 0x1C, "RR H", 0, inst_cb_rr_h },
- { 0x1D, "RR L", 0, inst_cb_rr_l },
- { 0x1E, "RR (HL)", 0, inst_cb_rr_hl_indirect },
- { 0x1F, "RR A", 0, inst_cb_rr_a },
- { 0x20, "SLA B", 0, inst_cb_sla_b },
- { 0x21, "SLA C", 0, inst_cb_sla_c },
- { 0x22, "SLA D", 0, inst_cb_sla_d },
- { 0x23, "SLA E", 0, inst_cb_sla_e },
- { 0x24, "SLA H", 0, inst_cb_sla_h },
- { 0x25, "SLA L", 0, inst_cb_sla_l },
- { 0x26, "SLA (HL)", 0, inst_cb_sla_hl_indirect },
- { 0x27, "SLA A", 0, inst_cb_sla_a },
- { 0x28, "SRA B", 0, inst_cb_sra_b },
- { 0x29, "SRA C", 0, inst_cb_sra_c },
- { 0x2A, "SRA D", 0, inst_cb_sra_d },
- { 0x2B, "SRA E", 0, inst_cb_sra_e },
- { 0x2C, "SRA H", 0, inst_cb_sra_h },
- { 0x2D, "SRA L", 0, inst_cb_sra_l },
- { 0x2E, "SRA (HL)", 0, inst_cb_sra_hl_indirect },
- { 0x2F, "SRA A", 0, inst_cb_sra_a },
- { 0x30, "SWAP B", 0, inst_cb_swap_b },
- { 0x31, "SWAP C", 0, inst_cb_swap_c },
- { 0x32, "SWAP D", 0, inst_cb_swap_d },
- { 0x33, "SWAP E", 0, inst_cb_swap_e },
- { 0x34, "SWAP H", 0, inst_cb_swap_h },
- { 0x35, "SWAP L", 0, inst_cb_swap_l },
- { 0x36, "SWAP (HL)", 0, inst_cb_swap_hl_indirect },
- { 0x37, "SWAP A", 0, inst_cb_swap_a },
- { 0x38, "SRL B", 0, inst_cb_srl_b },
- { 0x39, "SRL C", 0, inst_cb_srl_c },
- { 0x3A, "SRL D", 0, inst_cb_srl_d },
- { 0x3B, "SRL E", 0, inst_cb_srl_e },
- { 0x3C, "SRL H", 0, inst_cb_srl_h },
- { 0x3D, "SRL L", 0, inst_cb_srl_l },
- { 0x3E, "SRL (HL)", 0, inst_cb_srl_hl_indirect },
- { 0x3F, "SRL A", 0, inst_cb_srl_a },
- { 0x40, "BIT 0, B", 0, inst_cb_bit_0_b },
- { 0x41, "BIT 0, C", 0, inst_cb_bit_0_c },
- { 0x42, "BIT 0, D", 0, inst_cb_bit_0_d },
- { 0x43, "BIT 0, E", 0, inst_cb_bit_0_e },
- { 0x44, "BIT 0, H", 0, inst_cb_bit_0_h },
- { 0x45, "BIT 0, L", 0, inst_cb_bit_0_l },
- { 0x46, "BIT 0, (HL)", 0, inst_cb_bit_0_hl_indirect },
- { 0x47, "BIT 0, A", 0, inst_cb_bit_0_a },
- { 0x48, "BIT 1, B", 0, inst_cb_bit_1_b },
- { 0x49, "BIT 1, C", 0, inst_cb_bit_1_c },
- { 0x4A, "BIT 1, D", 0, inst_cb_bit_1_d },
- { 0x4B, "BIT 1, E", 0, inst_cb_bit_1_e },
- { 0x4C, "BIT 1, H", 0, inst_cb_bit_1_h },
- { 0x4D, "BIT 1, L", 0, inst_cb_bit_1_l },
- { 0x4E, "BIT 1, (HL)", 0, inst_cb_bit_1_hl_indirect },
- { 0x4F, "BIT 1, A", 0, inst_cb_bit_1_a },
- { 0x50, "BIT 2, B", 0, inst_cb_bit_2_b },
- { 0x51, "BIT 2, C", 0, inst_cb_bit_2_c },
- { 0x52, "BIT 2, D", 0, inst_cb_bit_2_d },
- { 0x53, "BIT 2, E", 0, inst_cb_bit_2_e },
- { 0x54, "BIT 2, H", 0, inst_cb_bit_2_h },
- { 0x55, "BIT 2, L", 0, inst_cb_bit_2_l },
- { 0x56, "BIT 2, (HL)", 0, inst_cb_bit_2_hl_indirect },
- { 0x57, "BIT 2, A", 0, inst_cb_bit_2_a },
- { 0x58, "BIT 3, B", 0, inst_cb_bit_3_b },
- { 0x59, "BIT 3, C", 0, inst_cb_bit_3_c },
- { 0x5A, "BIT 3, D", 0, inst_cb_bit_3_d },
- { 0x5B, "BIT 3, E", 0, inst_cb_bit_3_e },
- { 0x5C, "BIT 3, H", 0, inst_cb_bit_3_h },
- { 0x5D, "BIT 3, L", 0, inst_cb_bit_3_l },
- { 0x5E, "BIT 3, (HL)", 0, inst_cb_bit_3_hl_indirect },
- { 0x5F, "BIT 3, A", 0, inst_cb_bit_3_a },
- { 0x60, "BIT 4, B", 0, inst_cb_bit_4_b },
- { 0x61, "BIT 4, C", 0, inst_cb_bit_4_c },
- { 0x62, "BIT 4, D", 0, inst_cb_bit_4_d },
- { 0x63, "BIT 4, E", 0, inst_cb_bit_4_e },
- { 0x64, "BIT 4, H", 0, inst_cb_bit_4_h },
- { 0x65, "BIT 4, L", 0, inst_cb_bit_4_l },
- { 0x66, "BIT 4, (HL)", 0, inst_cb_bit_4_hl_indirect },
- { 0x67, "BIT 4, A", 0, inst_cb_bit_4_a },
- { 0x68, "BIT 5, B", 0, inst_cb_bit_5_b },
- { 0x69, "BIT 5, C", 0, inst_cb_bit_5_c },
- { 0x6A, "BIT 5, D", 0, inst_cb_bit_5_d },
- { 0x6B, "BIT 5, E", 0, inst_cb_bit_5_e },
- { 0x6C, "BIT 6, H", 0, inst_cb_bit_5_h },
- { 0x6D, "BIT 6, L", 0, inst_cb_bit_5_l },
- { 0x6E, "BIT 5, (HL)", 0, inst_cb_bit_5_hl_indirect },
- { 0x6F, "BIT 5, A", 0, inst_cb_bit_5_a },
- { 0x70, "BIT 6, B", 0, inst_cb_bit_6_b },
- { 0x71, "BIT 6, C", 0, inst_cb_bit_6_c },
- { 0x72, "BIT 6, D", 0, inst_cb_bit_6_d },
- { 0x73, "BIT 6, E", 0, inst_cb_bit_6_e },
- { 0x74, "BIT 6, H", 0, inst_cb_bit_6_h },
- { 0x75, "BIT 6, L", 0, inst_cb_bit_6_l },
- { 0x76, "BIT 6, (HL)", 0, inst_cb_bit_6_hl_indirect },
- { 0x77, "BIT 6, A", 0, inst_cb_bit_6_a },
- { 0x78, "BIT 7, B", 0, inst_cb_bit_7_b },
- { 0x79, "BIT 7, C", 0, inst_cb_bit_7_c },
- { 0x7A, "BIT 7, D", 0, inst_cb_bit_7_d },
- { 0x7B, "BIT 7, E", 0, inst_cb_bit_7_e },
- { 0x7C, "BIT 7, H", 0, inst_cb_bit_7_h },
- { 0x7D, "BIT 7, L", 0, inst_cb_bit_7_l },
- { 0x7E, "BIT 7, (HL)", 0, inst_cb_bit_7_hl_indirect },
- { 0x7F, "BIT 7, A", 0, inst_cb_bit_7_a },
- { 0x80, "RES 0, B", 0, inst_cb_res_0_b },
- { 0x81, "RES 0, C", 0, inst_cb_res_0_c },
- { 0x82, "RES 0, D", 0, inst_cb_res_0_d },
- { 0x83, "RES 0, E", 0, inst_cb_res_0_e },
- { 0x84, "RES 0, H", 0, inst_cb_res_0_h },
- { 0x85, "RES 0, L", 0, inst_cb_res_0_l },
- { 0x86, "RES 0, (HL)", 0, inst_cb_res_0_hl_indirect },
- { 0x87, "RES 0, A", 0, inst_cb_res_0_a },
- { 0x88, "RES 1, B", 0, inst_cb_res_1_b },
- { 0x89, "RES 1, C", 0, inst_cb_res_1_c },
- { 0x8A, "RES 1, D", 0, inst_cb_res_1_d },
- { 0x8B, "RES 1, E", 0, inst_cb_res_1_e },
- { 0x8C, "RES 1, H", 0, inst_cb_res_1_h },
- { 0x8D, "RES 1, L", 0, inst_cb_res_1_l },
- { 0x8E, "RES 1, (HL)", 0, inst_cb_res_1_hl_indirect },
- { 0x8F, "RES 1, A", 0, inst_cb_res_1_a },
- { 0x90, "RES 2, B", 0, inst_cb_res_2_b },
- { 0x91, "RES 2, C", 0, inst_cb_res_2_c },
- { 0x92, "RES 2, D", 0, inst_cb_res_2_d },
- { 0x93, "RES 2, E", 0, inst_cb_res_2_e },
- { 0x94, "RES 2, H", 0, inst_cb_res_2_h },
- { 0x95, "RES 2, L", 0, inst_cb_res_2_l },
- { 0x96, "RES 2, (HL)", 0, inst_cb_res_2_hl_indirect },
- { 0x97, "RES 2, A", 0, inst_cb_res_2_a },
- { 0x98, "RES 3, B", 0, inst_cb_res_3_b },
- { 0x99, "RES 3, C", 0, inst_cb_res_3_c },
- { 0x9A, "RES 3, D", 0, inst_cb_res_3_d },
- { 0x9B, "RES 3, E", 0, inst_cb_res_3_e },
- { 0x9C, "RES 3, H", 0, inst_cb_res_3_h },
- { 0x9D, "RES 3, L", 0, inst_cb_res_3_l },
- { 0x9E, "RES 3, (HL)", 0, inst_cb_res_3_hl_indirect },
- { 0x9F, "RES 3, A", 0, inst_cb_res_3_a },
- { 0xA0, "RES 4, B", 0, inst_cb_res_4_b },
- { 0xA1, "RES 4, C", 0, inst_cb_res_4_c },
- { 0xA2, "RES 4, D", 0, inst_cb_res_4_d },
- { 0xA3, "RES 4, E", 0, inst_cb_res_4_e },
- { 0xA4, "RES 4, H", 0, inst_cb_res_4_h },
- { 0xA5, "RES 4, L", 0, inst_cb_res_4_l },
- { 0xA6, "RES 4, (HL)", 0, inst_cb_res_4_hl_indirect },
- { 0xA7, "RES 4, A", 0, inst_cb_res_4_a },
- { 0xA8, "RES 5, B", 0, inst_cb_res_5_b },
- { 0xA9, "RES 5, C", 0, inst_cb_res_5_c },
- { 0xAA, "RES 5, D", 0, inst_cb_res_5_d },
- { 0xAB, "RES 5, E", 0, inst_cb_res_5_e },
- { 0xAC, "RES 5, H", 0, inst_cb_res_5_h },
- { 0xAD, "RES 5, L", 0, inst_cb_res_5_l },
- { 0xAE, "RES 5, (HL)", 0, inst_cb_res_5_hl_indirect },
- { 0xAF, "RES 5, A", 0, inst_cb_res_5_a },
- { 0xB0, "RES 6, B", 0, inst_cb_res_6_b },
- { 0xB1, "RES 6, C", 0, inst_cb_res_6_c },
- { 0xB2, "RES 6, D", 0, inst_cb_res_6_d },
- { 0xB3, "RES 6, E", 0, inst_cb_res_6_e },
- { 0xB4, "RES 6, H", 0, inst_cb_res_6_h },
- { 0xB5, "RES 6, L", 0, inst_cb_res_6_l },
- { 0xB6, "RES 6, (HL)", 0, inst_cb_res_6_hl_indirect },
- { 0xB7, "RES 6, A", 0, inst_cb_res_6_a },
- { 0xB8, "RES 7, B", 0, inst_cb_res_7_b },
- { 0xB9, "RES 7, C", 0, inst_cb_res_7_c },
- { 0xBA, "RES 7, D", 0, inst_cb_res_7_d },
- { 0xBB, "RES 7, E", 0, inst_cb_res_7_e },
- { 0xBC, "RES 7, H", 0, inst_cb_res_7_h },
- { 0xBD, "RES 7, L", 0, inst_cb_res_7_l },
- { 0xBE, "RES 7, (HL)", 0, inst_cb_res_7_hl_indirect },
- { 0xBF, "RES 7, A", 0, inst_cb_res_7_a },
- { 0xC0, "SET 0, B", 0, inst_cb_set_0_b },
- { 0xC1, "SET 0, C", 0, inst_cb_set_0_c },
- { 0xC2, "SET 0, D", 0, inst_cb_set_0_d },
- { 0xC3, "SET 0, E", 0, inst_cb_set_0_e },
- { 0xC4, "SET 0, H", 0, inst_cb_set_0_h },
- { 0xC5, "SET 0, L", 0, inst_cb_set_0_l },
- { 0xC6, "SET 0, (HL)", 0, inst_cb_set_0_hl_indirect },
- { 0xC7, "SET 0, A", 0, inst_cb_set_0_a },
- { 0xC8, "SET 1, B", 0, inst_cb_set_1_b },
- { 0xC9, "SET 1, C", 0, inst_cb_set_1_c },
- { 0xCA, "SET 1, D", 0, inst_cb_set_1_d },
- { 0xCB, "SET 1, E", 0, inst_cb_set_1_e },
- { 0xCC, "SET 1, H", 0, inst_cb_set_1_h },
- { 0xCD, "SET 1, L", 0, inst_cb_set_1_l },
- { 0xCE, "SET 1, (HL)", 0, inst_cb_set_1_hl_indirect },
- { 0xCF, "SET 1, A", 0, inst_cb_set_1_a },
- { 0xD0, "SET 2, B", 0, inst_cb_set_2_b },
- { 0xD1, "SET 2, C", 0, inst_cb_set_2_c },
- { 0xD2, "SET 2, D", 0, inst_cb_set_2_d },
- { 0xD3, "SET 2, E", 0, inst_cb_set_2_e },
- { 0xD4, "SET 2, H", 0, inst_cb_set_2_h },
- { 0xD5, "SET 2, L", 0, inst_cb_set_2_l },
- { 0xD6, "SET 2, (HL)", 0, inst_cb_set_2_hl_indirect },
- { 0xD7, "SET 2, A", 0, inst_cb_set_2_a },
- { 0xD8, "SET 3, B", 0, inst_cb_set_3_b },
- { 0xD9, "SET 3, C", 0, inst_cb_set_3_c },
- { 0xDA, "SET 3, D", 0, inst_cb_set_3_d },
- { 0xDB, "SET 3, E", 0, inst_cb_set_3_e },
- { 0xDC, "SET 3, H", 0, inst_cb_set_3_h },
- { 0xDD, "SET 3, L", 0, inst_cb_set_3_l },
- { 0xDE, "SET 3, (HL)", 0, inst_cb_set_3_hl_indirect },
- { 0xDF, "SET 3, A", 0, inst_cb_set_3_a },
- { 0xE0, "SET 4, B", 0, inst_cb_set_4_b },
- { 0xE1, "SET 4, C", 0, inst_cb_set_4_c },
- { 0xE2, "SET 4, D", 0, inst_cb_set_4_d },
- { 0xE3, "SET 4, E", 0, inst_cb_set_4_e },
- { 0xE4, "SET 4, H", 0, inst_cb_set_4_h },
- { 0xE5, "SET 4, L", 0, inst_cb_set_4_l },
- { 0xE6, "SET 4, (HL)", 0, inst_cb_set_4_hl_indirect },
- { 0xE7, "SET 4, A", 0, inst_cb_set_4_a },
- { 0xE8, "SET 5, B", 0, inst_cb_set_5_b },
- { 0xE9, "SET 5, C", 0, inst_cb_set_5_c },
- { 0xEA, "SET 5, D", 0, inst_cb_set_5_d },
- { 0xEB, "SET 5, E", 0, inst_cb_set_5_e },
- { 0xEC, "SET 5, H", 0, inst_cb_set_5_h },
- { 0xED, "SET 5, L", 0, inst_cb_set_5_l },
- { 0xEE, "SET 5, (HL)", 0, inst_cb_set_5_hl_indirect },
- { 0xEF, "SET 5, A", 0, inst_cb_set_5_a },
- { 0xF0, "SET 6, B", 0, inst_cb_set_6_b },
- { 0xF1, "SET 6, C", 0, inst_cb_set_6_c },
- { 0xF2, "SET 6, D", 0, inst_cb_set_6_d },
- { 0xF3, "SET 6, E", 0, inst_cb_set_6_e },
- { 0xF4, "SET 6, H", 0, inst_cb_set_6_h },
- { 0xF5, "SET 6, L", 0, inst_cb_set_6_l },
- { 0xF6, "SET 6, (HL)", 0, inst_cb_set_6_hl_indirect },
- { 0xF7, "SET 6, A", 0, inst_cb_set_6_a },
- { 0xF8, "SET 7, B", 0, inst_cb_set_7_b },
- { 0xF9, "SET 7, C", 0, inst_cb_set_7_c },
- { 0xFA, "SET 7, D", 0, inst_cb_set_7_d },
- { 0xFB, "SET 7, E", 0, inst_cb_set_7_e },
- { 0xFC, "SET 7, H", 0, inst_cb_set_7_h },
- { 0xFD, "SET 7, L", 0, inst_cb_set_7_l },
- { 0xFE, "SET 7, (HL)", 0, inst_cb_set_7_hl_indirect },
- { 0xFF, "SET 7, A", 0, inst_cb_set_7_a },
- { 0, (char *)NULL, 0, (void *)NULL }
- };
-
- static void gameboy_init_instructions()
- {
- int i,j;
-
- for(i = 0, j = 0; gbz80_instructions[i].name; i++)
- j++;
-
- printf("%d Regular Instructions Implemented\n", j);
- for(i = 0, j = 0; gbz80_cb_instructions[i].name; i++)
- j++;
-
- printf("%d Extended CB Instructions Implemented\n", j);
- }
-
- gameboy_proc_t *gameboy_cpu_hardreset()
- {
- gameboy_proc_t *processor;
-
- gameboy_init_instructions();
-
- processor = (gameboy_proc_t *)malloc(sizeof(gameboy_proc_t));
-
- if(!processor)
- return 0;
-
- if(color_gameboy)
- processor->AF.b.h = 0x11;
- else
- processor->AF.b.h = 0x01;
-
- processor->AF.b.l = 0xB0;
- processor->BC.uw = 0x0013;
- processor->DE.uw = 0x00D8;
- processor->HL.uw = 0x014D;
- processor->SP.uw = 0xFFFE;
- processor->PC.uw = 0x0100;
- processor->IFF = 0;
-
- processor->tim_cycles = 0;
- processor->machine_cycles = 0;
-
- memory_write_byte(0xFF05, 0);
- memory_write_byte(0xFF06, 0);
- memory_write_byte(0xFF07, 0);
- memory_write_byte(0xFF10, 0x80);
- memory_write_byte(0xFF11, 0xBF);
- memory_write_byte(0xFF12, 0xF3);
- memory_write_byte(0xFF14, 0xBF);
- memory_write_byte(0xFF16, 0x3F);
- memory_write_byte(0xFF17, 0x00);
- memory_write_byte(0xFF19, 0xBF);
- memory_write_byte(0xFF1A, 0x7A);
- memory_write_byte(0xFF1B, 0xFF);
- memory_write_byte(0xFF1C, 0x9F);
- memory_write_byte(0xFF1E, 0xBF);
- memory_write_byte(0xFF20, 0xFF);
- memory_write_byte(0xFF21, 0x00);
- memory_write_byte(0xFF22, 0x00);
- memory_write_byte(0xFF23, 0xBF);
- memory_write_byte(0xFF24, 0x77);
- memory_write_byte(0xFF25, 0xF3);
- memory_write_byte(0xFF26, 0xF1);
- memory_write_byte(0xFF40, 0x91);
- memory_write_byte(0xFF42, 0x00);
- memory_write_byte(0xFF43, 0x00);
- memory_write_byte(0xFF45, 0x00);
- memory_write_byte(0xFF47, 0xFC);
- memory_write_byte(0xFF48, 0xFF);
- memory_write_byte(0xFF49, 0xFF);
- memory_write_byte(0xFF4A, 0x00);
- memory_write_byte(0xFF4B, 0x00);
- memory_write_byte(0xFFFF, 0x00);
-
- return processor;
- }
-
- int gameboy_cpu_find_instruction(gbz80_instruction *insts, unsigned char opcode)
- {
- unsigned int i;
-
- for(i = 0; (insts+i)->name; i++)
- if((insts+i)->opcode == opcode)
- return i;
- return -1;
- }
-
- void gameboy_cpu_create_instruction(char *string, gameboy_proc_t *gbz80)
- {
- int i;
- unsigned char opcode;
-
- opcode = memory_read_byte(gbz80->PC.uw);
-
- i = gameboy_cpu_find_instruction(gbz80_instructions, opcode);
-
- if(i == -1) {
- strcpy(string, "unknown");
- return;
- } else {
- unsigned char boff;
- wordun woff;
-
- if (opcode == 0xCB) {
- opcode = memory_read_byte(gbz80->PC.uw+1);
- i = gameboy_cpu_find_instruction(gbz80_cb_instructions, opcode);
- if (i == -1)
- sprintf(string, "(CB %02X) %s", opcode, "unknown");
- else
- sprintf(string, "(CB %02X) %s", opcode, gbz80_cb_instructions[i].name);
- return;
- }
-
- switch(gbz80_instructions[i].operand_size) {
- case 0:
- strcpy(string, gbz80_instructions[i].name);
- break;
- case 1:
- boff = memory_read_byte(gbz80->PC.uw + 1);
- sprintf(string, gbz80_instructions[i].name, boff);
- break;
- case 2:
- woff.uw = memory_read_word(gbz80->PC.uw + 1);
- sprintf(string, gbz80_instructions[i].name, woff.uw);
- break;
- default:
- strcpy(string, "unknown op size");
- break;
- }
- return;
- }
- }
-
- #ifdef CPU_DEBUG
- unsigned int cpucnt[256];
- unsigned int cbcpucnt[256];
- #endif
-
- void gameboy_cpu_execute_opcode()
- {
- /* char stringz[256]; */
- current_opcode = memory_read_byte(gameboy_proc->PC.uw);
-
- gameboy_proc->PC.uw++;
-
- #ifdef CPU_DEBUG
- cpucnt[current_opcode]++;
- #endif
-
- gbz80_instructions[current_opcode].instruction();
-
- if(gameboy_proc->machine_cycles >= cycles_per_hblank) {
- gameboy_hblank();
- gameboy_proc->machine_cycles -= cycles_per_hblank;
- }
- }
-
- void gameboy_cpu_execute_opcode_bak()
- {
- /* int which_record; */
-
- if(gameboy_proc->machine_cycles >= 451) {
- gameboy_hblank();
- gameboy_proc->machine_cycles -= 451;
- }
-
- current_opcode = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- /* if((which_record = gameboy_cpu_find_instruction(gbz80_instructions, current_opcode)) != -1)
- gbz80_instructions[which_record].instruction();
- else
- inst_unimplemented();
- */
- gbz80_instructions[current_opcode].instruction();
-
- }
-
- void gameboy_cpu_run(gameboy_proc_t *processor)
- {
- gameboy_proc = processor;
-
- gameboy_proc->running = 1;
-
- for(;gameboy_proc->running;) {
- gameboy_cpu_execute_opcode();
- }
- }
-
- void gameboy_stack_write_word(unsigned short int val)
- {
- gameboy_proc->SP.uw -= 2;
- memory_write_word(gameboy_proc->SP.uw, val);
- }
-
- unsigned short int gameboy_stack_read_word()
- {
- unsigned short int ret;
-
- ret = memory_read_word(gameboy_proc->SP.uw);
-
- gameboy_proc->SP.uw += 2;
-
- return ret;
- }
-
- void inst_unimplemented()
- {
- printf("unknown opcode!\n");
- gameboy_proc->running = 0;
- gameboy_proc->PC.uw -= 1;
- gbz80_debugger(gameboy_proc);
- }
-
- void inst_cb()
- {
- unsigned char cbinst;
- /* int i; */
-
- cbinst = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- #ifdef CPU_DEBUG
- cbcpucnt[cbinst]++;
- #endif
-
- gbz80_cb_instructions[cbinst].instruction();
- }
-
- void inst_cb_unimplemented()
- {
- printf("Unknown CB Opcode\n");
- gameboy_proc->running = 0;
- gameboy_proc->PC.uw -= 2;
- gbz80_debugger(gameboy_proc);
- }
-
- /* TODO: Verify:
- Addition sets CARRY if value is greater than register size
- HalfCarry is set if two values lower 4 bits added are greater than 0x0F
-
- On the other hand, GB CPU Docs and Z80 docs contradict each other with sub
- Affected Opcodes: SUB SBC DEC CP
- A = B - C
- Subtraction sets carry if B >= C (no borrow)
- Subtraction sets halfcarry if B&0x0F >= C&0x0F (no borrow in lower nibbles)
-
- decided to try the Z80 way since even the gb docs contridicded themselves
- and why would nintendo change how carry/halfcarry worked
- */
-
- void inst_adc_a_a()
- {
- unsigned char value = gameboy_proc->AF.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(4);
- }
-
- void inst_adc_a_b()
- {
- unsigned char value = gameboy_proc->BC.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(4);
- }
-
- void inst_adc_a_c()
- {
- unsigned char value = gameboy_proc->BC.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(4);
- }
-
- void inst_adc_a_d()
- {
- unsigned char value = gameboy_proc->DE.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(4);
- }
-
- void inst_adc_a_e()
- {
- unsigned char value = gameboy_proc->DE.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(4);
- }
-
- void inst_adc_a_h()
- {
- unsigned char value = gameboy_proc->HL.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(4);
- }
-
- void inst_adc_a_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(8);
- }
-
- void inst_adc_a_l()
- {
- unsigned char value = gameboy_proc->HL.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(4);
- }
-
- void inst_adc_a_n()
- {
- unsigned char value = memory_read_byte(gameboy_proc->PC.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- int result = gameboy_proc->AF.b.h + value;
-
- gameboy_proc->PC.uw++;
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (((value & 0x0F) + (gameboy_proc->AF.b.h & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- MORE_CYCLES2(8);
- }
-
- void inst_add_a_a()
- {
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if (gameboy_proc->AF.b.h & 0x08)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h += gameboy_proc->AF.b.h;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(4);
- }
-
- void inst_add_a_b()
- {
- unsigned char value = gameboy_proc->BC.b.h;
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_add_a_c()
- {
- unsigned char value = gameboy_proc->BC.b.l;
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_add_a_d()
- {
- unsigned char value = gameboy_proc->DE.b.h;
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_add_a_e()
- {
- unsigned char value = gameboy_proc->DE.b.l;
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_add_a_h()
- {
- unsigned char value = gameboy_proc->HL.b.h;
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_add_a_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_add_a_l()
- {
- unsigned char value = gameboy_proc->HL.b.l;
- int result = gameboy_proc->AF.b.h + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_add_a_n()
- {
- unsigned char value = memory_read_byte(gameboy_proc->PC.uw);
- int result = gameboy_proc->AF.b.h + value;
-
- gameboy_proc->PC.uw++;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if (result & 0xFF00)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = result & 0xFF;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- if (((gameboy_proc->AF.b.h & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_add_hl_bc()
- {
- unsigned long result;
- unsigned short value = gameboy_proc->BC.uw;
-
- result = gameboy_proc->HL.uw + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFFFF0000)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.uw = result & 0xFFFF;
-
- MORE_CYCLES2(8);
- }
-
- void inst_add_hl_de()
- {
- unsigned long result;
- unsigned short value = gameboy_proc->DE.uw;
-
- result = gameboy_proc->HL.uw + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFFFF0000)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.uw = result & 0xFFFF;
-
- MORE_CYCLES2(8);
- }
-
- void inst_add_hl_hl()
- {
- unsigned long result;
- unsigned short value = gameboy_proc->HL.uw;
-
- result = gameboy_proc->HL.uw + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFFFF0000)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.uw = result & 0xFFFF;
-
- MORE_CYCLES2(8);
- }
-
- void inst_add_hl_sp()
- {
- unsigned long result;
- unsigned short value = gameboy_proc->SP.uw;
-
- result = gameboy_proc->HL.uw + value;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- if(result & 0xFFFF0000)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if (((gameboy_proc->HL.uw & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.uw = result & 0xFFFF;
-
- MORE_CYCLES2(8);
- }
-
- void inst_add_sp_n()
- {
- signed char value = memory_read_byte(gameboy_proc->PC.uw);
- int result = gameboy_proc->SP.uw + value;
-
- gameboy_proc->PC.uw++;
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO | FLAGS_NEGATIVE);
-
- if (result & 0xFFFF0000)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->SP.uw = result & 0xFFFF;
-
- if (((gameboy_proc->SP.uw & 0x0F) + (value & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(16);
- }
-
- void inst_and_a()
- {
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(4);
- }
-
- void inst_and_b()
- {
- gameboy_proc->AF.b.h &= gameboy_proc->BC.b.h;
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(4);
- }
-
- void inst_and_c()
- {
- gameboy_proc->AF.b.h &= gameboy_proc->BC.b.l;
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(4);
- }
-
- void inst_and_d()
- {
- gameboy_proc->AF.b.h &= gameboy_proc->DE.b.h;
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(4);
- }
-
- void inst_and_e()
- {
- gameboy_proc->AF.b.h &= gameboy_proc->DE.b.l;
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(4);
- }
-
- void inst_and_h()
- {
- gameboy_proc->AF.b.h &= gameboy_proc->HL.b.h;
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(4);
- }
-
- void inst_and_hl_indirect()
- {
- gameboy_proc->AF.b.h &= memory_read_byte(gameboy_proc->HL.uw);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(8);
- }
-
- void inst_and_l()
- {
- gameboy_proc->AF.b.h &= gameboy_proc->HL.b.l;
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(4);
- }
-
- void inst_and_n()
- {
- gameboy_proc->AF.b.h &= memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- MORE_CYCLES2(8);
- }
-
- void inst_call_c_nn()
- {
- unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = where;
- MORE_CYCLES2(24);
- } else {
- MORE_CYCLES2(12);
- }
- }
-
- void inst_call_nc_nn()
- {
- unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
- if (FLAGS_ISCARRY(gameboy_proc)) {
- MORE_CYCLES2(12);
- } else {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = where;
- MORE_CYCLES2(24);
- }
- }
-
- void inst_call_nn()
- {
- gameboy_proc->PC.uw += 2;
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw - 2);
- MORE_CYCLES2(24);
- }
-
- void inst_call_nz_nn()
- {
- unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
- if (FLAGS_ISZERO(gameboy_proc)) {
- MORE_CYCLES2(12);
- } else {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = where;
- MORE_CYCLES2(24);
- }
- }
-
- void inst_call_z_nn()
- {
- unsigned short int where = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
- if (FLAGS_ISZERO(gameboy_proc)) {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = where;
- MORE_CYCLES2(24);
- } else {
- MORE_CYCLES2(12);
- }
- }
-
- void inst_cb_bit_0_a()
- {
- if (gameboy_proc->AF.b.h & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_0_b()
- {
- if (gameboy_proc->BC.b.h & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_0_c()
- {
- if (gameboy_proc->BC.b.l & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_0_d()
- {
- if (gameboy_proc->DE.b.h & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_0_e()
- {
- if (gameboy_proc->DE.b.l & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_0_h()
- {
- if (gameboy_proc->HL.b.h & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_0_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_0_l()
- {
- if (gameboy_proc->HL.b.l & 0x01)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_1_a()
- {
- if (gameboy_proc->AF.b.h & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_1_b()
- {
- if (gameboy_proc->BC.b.h & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_1_c()
- {
- if (gameboy_proc->BC.b.l & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_1_d()
- {
- if (gameboy_proc->DE.b.h & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_1_e()
- {
- if (gameboy_proc->DE.b.l & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_1_h()
- {
- if (gameboy_proc->HL.b.h & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_1_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_1_l()
- {
- if (gameboy_proc->HL.b.l & 0x02)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_2_a()
- {
- if (gameboy_proc->AF.b.h & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_2_b()
- {
- if (gameboy_proc->BC.b.h & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_2_c()
- {
- if (gameboy_proc->BC.b.l & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_2_d()
- {
- if (gameboy_proc->DE.b.h & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_2_e()
- {
- if (gameboy_proc->DE.b.l & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_2_h()
- {
- if (gameboy_proc->HL.b.h & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_2_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_2_l()
- {
- if (gameboy_proc->HL.b.l & 0x04)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_3_a()
- {
- if (gameboy_proc->AF.b.h & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_3_b()
- {
- if (gameboy_proc->BC.b.h & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_3_c()
- {
- if (gameboy_proc->BC.b.l & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_3_d()
- {
- if (gameboy_proc->DE.b.h & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_3_e()
- {
- if (gameboy_proc->DE.b.l & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_3_h()
- {
- if (gameboy_proc->HL.b.h & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_3_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_3_l()
- {
- if (gameboy_proc->HL.b.l & 0x08)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_4_a()
- {
- if (gameboy_proc->AF.b.h & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_4_b()
- {
- if (gameboy_proc->BC.b.h & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_4_c()
- {
- if (gameboy_proc->BC.b.l & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_4_d()
- {
- if (gameboy_proc->DE.b.h & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_4_e()
- {
- if (gameboy_proc->DE.b.l & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_4_h()
- {
- if (gameboy_proc->HL.b.h & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_4_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_4_l()
- {
- if (gameboy_proc->HL.b.l & 0x10)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_5_a()
- {
- if (gameboy_proc->AF.b.h & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_5_b()
- {
- if (gameboy_proc->BC.b.h & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_5_c()
- {
- if (gameboy_proc->BC.b.l & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_5_d()
- {
- if (gameboy_proc->DE.b.h & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_5_e()
- {
- if (gameboy_proc->DE.b.l & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_5_h()
- {
- if (gameboy_proc->HL.b.h & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_5_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_5_l()
- {
- if (gameboy_proc->HL.b.l & 0x20)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_6_a()
- {
- if (gameboy_proc->AF.b.h & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_6_b()
- {
- if (gameboy_proc->BC.b.h & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_6_c()
- {
- if (gameboy_proc->BC.b.l & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_6_d()
- {
- if (gameboy_proc->DE.b.h & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_6_e()
- {
- if (gameboy_proc->DE.b.l & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_6_h()
- {
- if (gameboy_proc->HL.b.h & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_6_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_6_l()
- {
- if (gameboy_proc->HL.b.l & 0x40)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_7_a()
- {
- if (gameboy_proc->AF.b.h & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_7_b()
- {
- if (gameboy_proc->BC.b.h & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_7_c()
- {
- if (gameboy_proc->BC.b.l & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_7_d()
- {
- if (gameboy_proc->DE.b.h & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_7_e()
- {
- if (gameboy_proc->DE.b.l & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_7_h()
- {
- if (gameboy_proc->HL.b.h & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_bit_7_hl_indirect()
- {
- if (memory_read_byte(gameboy_proc->HL.uw) & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(12);
- }
-
- void inst_cb_bit_7_l()
- {
- if (gameboy_proc->HL.b.l & 0x80)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_0_a()
- {
- gameboy_proc->AF.b.h &= ~0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_0_b()
- {
- gameboy_proc->BC.b.h &= ~0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_0_c()
- {
- gameboy_proc->BC.b.l &= ~0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_0_d()
- {
- gameboy_proc->DE.b.h &= ~0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_0_e()
- {
- gameboy_proc->DE.b.l &= ~0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_0_h()
- {
- gameboy_proc->HL.b.h &= ~0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_0_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x01);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_0_l()
- {
- gameboy_proc->HL.b.l &= ~0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_1_a()
- {
- gameboy_proc->AF.b.h &= ~0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_1_b()
- {
- gameboy_proc->BC.b.h &= ~0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_1_c()
- {
- gameboy_proc->BC.b.l &= ~0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_1_d()
- {
- gameboy_proc->DE.b.h &= ~0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_1_e()
- {
- gameboy_proc->DE.b.l &= ~0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_1_h()
- {
- gameboy_proc->HL.b.h &= ~0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_1_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x02);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_1_l()
- {
- gameboy_proc->HL.b.l &= ~0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_2_a()
- {
- gameboy_proc->AF.b.h &= ~0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_2_b()
- {
- gameboy_proc->BC.b.h &= ~0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_2_c()
- {
- gameboy_proc->BC.b.l &= ~0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_2_d()
- {
- gameboy_proc->DE.b.h &= ~0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_2_e()
- {
- gameboy_proc->DE.b.l &= ~0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_2_h()
- {
- gameboy_proc->HL.b.h &= ~0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_2_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x04);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_2_l()
- {
- gameboy_proc->HL.b.l &= ~0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_3_a()
- {
- gameboy_proc->AF.b.h &= ~0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_3_b()
- {
- gameboy_proc->BC.b.h &= ~0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_3_c()
- {
- gameboy_proc->BC.b.l &= ~0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_3_d()
- {
- gameboy_proc->DE.b.h &= ~0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_3_e()
- {
- gameboy_proc->DE.b.l &= ~0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_3_h()
- {
- gameboy_proc->HL.b.h &= ~0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_3_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x08);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_3_l()
- {
- gameboy_proc->HL.b.l &= ~0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_4_a()
- {
- gameboy_proc->AF.b.h &= ~0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_4_b()
- {
- gameboy_proc->BC.b.h &= ~0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_4_c()
- {
- gameboy_proc->BC.b.l &= ~0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_4_d()
- {
- gameboy_proc->DE.b.h &= ~0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_4_e()
- {
- gameboy_proc->DE.b.l &= ~0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_4_h()
- {
- gameboy_proc->HL.b.h &= ~0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_4_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x10);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_4_l()
- {
- gameboy_proc->HL.b.l &= ~0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_5_a()
- {
- gameboy_proc->AF.b.h &= ~0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_5_b()
- {
- gameboy_proc->BC.b.h &= ~0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_5_c()
- {
- gameboy_proc->BC.b.l &= ~0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_5_d()
- {
- gameboy_proc->DE.b.h &= ~0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_5_e()
- {
- gameboy_proc->DE.b.l &= ~0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_5_h()
- {
- gameboy_proc->HL.b.h &= ~0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_5_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x20);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_5_l()
- {
- gameboy_proc->HL.b.l &= ~0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_6_a()
- {
- gameboy_proc->AF.b.h &= ~0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_6_b()
- {
- gameboy_proc->BC.b.h &= ~0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_6_c()
- {
- gameboy_proc->BC.b.l &= ~0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_6_d()
- {
- gameboy_proc->DE.b.h &= ~0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_6_e()
- {
- gameboy_proc->DE.b.l &= ~0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_6_h()
- {
- gameboy_proc->HL.b.h &= ~0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_6_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x40);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_6_l()
- {
- gameboy_proc->HL.b.l &= ~0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_7_a()
- {
- gameboy_proc->AF.b.h &= ~0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_7_b()
- {
- gameboy_proc->BC.b.h &= ~0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_7_c()
- {
- gameboy_proc->BC.b.l &= ~0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_7_d()
- {
- gameboy_proc->DE.b.h &= ~0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_7_e()
- {
- gameboy_proc->DE.b.l &= ~0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_7_h()
- {
- gameboy_proc->HL.b.h &= ~0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_res_7_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what & ~0x80);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_res_7_l()
- {
- gameboy_proc->HL.b.l &= ~0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rl_a()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->AF.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->AF.b.h <<= 1;
- gameboy_proc->AF.b.h += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rl_b()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->BC.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->BC.b.h <<= 1;
- gameboy_proc->BC.b.h += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rl_c()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->BC.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->BC.b.l <<= 1;
- gameboy_proc->BC.b.l += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rl_d()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->DE.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->DE.b.h <<= 1;
- gameboy_proc->DE.b.h += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rl_e()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->DE.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->DE.b.l <<= 1;
- gameboy_proc->DE.b.l += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rl_h()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->HL.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->HL.b.h <<= 1;
- gameboy_proc->HL.b.h += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rl_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
-
- if (value & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- value <<= 1;
- value += carry;
-
- memory_write_byte(gameboy_proc->HL.uw, value);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(16);
- }
-
- void inst_cb_rl_l()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->HL.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->HL.b.l <<= 1;
- gameboy_proc->HL.b.l += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rlc_a()
- {
- int carry = (gameboy_proc->AF.b.h & 0x80) >> 7;
-
- if (gameboy_proc->AF.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h <<= 1;
- gameboy_proc->AF.b.h += carry;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rlc_b()
- {
- int carry = (gameboy_proc->BC.b.h & 0x80) >> 7;
-
- if (gameboy_proc->BC.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.h <<= 1;
- gameboy_proc->BC.b.h += carry;
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rlc_c()
- {
- int carry = (gameboy_proc->BC.b.l & 0x80) >> 7;
-
- if (gameboy_proc->BC.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.l <<= 1;
- gameboy_proc->BC.b.l += carry;
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rlc_d()
- {
- int carry = (gameboy_proc->DE.b.h & 0x80) >> 7;
-
- if (gameboy_proc->DE.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.h <<= 1;
- gameboy_proc->DE.b.h += carry;
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rlc_e()
- {
- int carry = (gameboy_proc->DE.b.l & 0x80) >> 7;
-
- if (gameboy_proc->DE.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.l <<= 1;
- gameboy_proc->DE.b.l += carry;
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rlc_h()
- {
- int carry = (gameboy_proc->HL.b.h & 0x80) >> 7;
-
- if (gameboy_proc->HL.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.h <<= 1;
- gameboy_proc->HL.b.h += carry;
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rlc_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
- int carry = (value & 0x80) >> 7;
-
- if (value & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- value <<= 1;
- value += carry;
-
- if (value)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- memory_write_byte(gameboy_proc->HL.uw, value);
-
- MORE_CYCLES2(16);
- }
-
- void inst_cb_rlc_l()
- {
- int carry = (gameboy_proc->HL.b.l & 0x80) >> 7;
-
- if (gameboy_proc->HL.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.l <<= 1;
- gameboy_proc->HL.b.l += carry;
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rr_a()
- {
- int carry = gameboy_proc->AF.b.h & 0x01;
-
- gameboy_proc->AF.b.h >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->AF.b.h |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rr_b()
- {
- int carry = gameboy_proc->BC.b.h & 0x01;
-
- gameboy_proc->BC.b.h >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->BC.b.h |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rr_c()
- {
- int carry = gameboy_proc->BC.b.l & 0x01;
-
- gameboy_proc->BC.b.l >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->BC.b.l |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rr_d()
- {
- int carry = gameboy_proc->DE.b.h & 0x01;
-
- gameboy_proc->DE.b.h >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->DE.b.h |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rr_e()
- {
- int carry = gameboy_proc->DE.b.l & 0x01;
-
- gameboy_proc->DE.b.l >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->DE.b.l |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rr_h()
- {
- int carry = gameboy_proc->HL.b.h & 0x01;
-
- gameboy_proc->HL.b.h >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->HL.b.h |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rr_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
- int carry = value & 0x01;
-
- value >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- value |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (value)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- memory_write_byte(gameboy_proc->HL.uw, value);
-
- MORE_CYCLES2(16);
- }
-
- void inst_cb_rr_l()
- {
- int carry = gameboy_proc->HL.b.l & 0x01;
-
- gameboy_proc->HL.b.l >>= 1;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->HL.b.l |= 0x80;
- }
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rrc_a()
- {
- int carry = gameboy_proc->AF.b.h & 0x01;
-
- gameboy_proc->AF.b.h >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->AF.b.h |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rrc_b()
- {
- int carry = gameboy_proc->BC.b.h & 0x01;
-
- gameboy_proc->BC.b.h >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->BC.b.h |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rrc_c()
- {
- int carry = gameboy_proc->BC.b.l & 0x01;
-
- gameboy_proc->BC.b.l >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->BC.b.l |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rrc_d()
- {
- int carry = gameboy_proc->DE.b.h & 0x01;
-
- gameboy_proc->DE.b.h >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->DE.b.h |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rrc_e()
- {
- int carry = gameboy_proc->DE.b.l & 0x01;
-
- gameboy_proc->DE.b.l >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->DE.b.l |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rrc_h()
- {
- int carry = gameboy_proc->HL.b.h & 0x01;
-
- gameboy_proc->HL.b.h >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->HL.b.h |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_rrc_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
- int carry = value & 0x01;
-
- value >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- value |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (value)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- memory_write_byte(gameboy_proc->HL.uw, value);
-
- MORE_CYCLES2(16);
- }
-
- void inst_cb_rrc_l()
- {
- int carry = gameboy_proc->HL.b.l & 0x01;
-
- gameboy_proc->HL.b.l >>= 1;
-
- if (carry) {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->HL.b.l |= 0x80;
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_0_a()
- {
- gameboy_proc->AF.b.h |= 0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_0_b()
- {
- gameboy_proc->BC.b.h |= 0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_0_c()
- {
- gameboy_proc->BC.b.l |= 0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_0_d()
- {
- gameboy_proc->DE.b.h |= 0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_0_e()
- {
- gameboy_proc->DE.b.l |= 0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_0_h()
- {
- gameboy_proc->HL.b.h |= 0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_0_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x01);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_0_l()
- {
- gameboy_proc->HL.b.l |= 0x01;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_1_a()
- {
- gameboy_proc->AF.b.h |= 0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_1_b()
- {
- gameboy_proc->BC.b.h |= 0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_1_c()
- {
- gameboy_proc->BC.b.l |= 0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_1_d()
- {
- gameboy_proc->DE.b.h |= 0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_1_e()
- {
- gameboy_proc->DE.b.l |= 0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_1_h()
- {
- gameboy_proc->HL.b.h |= 0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_1_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x02);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_1_l()
- {
- gameboy_proc->HL.b.l |= 0x02;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_2_a()
- {
- gameboy_proc->AF.b.h |= 0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_2_b()
- {
- gameboy_proc->BC.b.h |= 0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_2_c()
- {
- gameboy_proc->BC.b.l |= 0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_2_d()
- {
- gameboy_proc->DE.b.h |= 0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_2_e()
- {
- gameboy_proc->DE.b.l |= 0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_2_h()
- {
- gameboy_proc->HL.b.h |= 0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_2_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x04);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_2_l()
- {
- gameboy_proc->HL.b.l |= 0x04;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_3_a()
- {
- gameboy_proc->AF.b.h |= 0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_3_b()
- {
- gameboy_proc->BC.b.h |= 0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_3_c()
- {
- gameboy_proc->BC.b.l |= 0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_3_d()
- {
- gameboy_proc->DE.b.h |= 0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_3_e()
- {
- gameboy_proc->DE.b.l |= 0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_3_h()
- {
- gameboy_proc->HL.b.h |= 0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_3_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x08);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_3_l()
- {
- gameboy_proc->HL.b.l |= 0x08;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_4_a()
- {
- gameboy_proc->AF.b.h |= 0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_4_b()
- {
- gameboy_proc->BC.b.h |= 0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_4_c()
- {
- gameboy_proc->BC.b.l |= 0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_4_d()
- {
- gameboy_proc->DE.b.h |= 0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_4_e()
- {
- gameboy_proc->DE.b.l |= 0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_4_h()
- {
- gameboy_proc->HL.b.h |= 0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_4_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x10);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_4_l()
- {
- gameboy_proc->HL.b.l |= 0x10;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_5_a()
- {
- gameboy_proc->AF.b.h |= 0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_5_b()
- {
- gameboy_proc->BC.b.h |= 0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_5_c()
- {
- gameboy_proc->BC.b.l |= 0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_5_d()
- {
- gameboy_proc->DE.b.h |= 0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_5_e()
- {
- gameboy_proc->DE.b.l |= 0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_5_h()
- {
- gameboy_proc->HL.b.h |= 0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_5_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x20);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_5_l()
- {
- gameboy_proc->HL.b.l |= 0x20;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_6_a()
- {
- gameboy_proc->AF.b.h |= 0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_6_b()
- {
- gameboy_proc->BC.b.h |= 0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_6_c()
- {
- gameboy_proc->BC.b.l |= 0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_6_d()
- {
- gameboy_proc->DE.b.h |= 0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_6_e()
- {
- gameboy_proc->DE.b.l |= 0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_6_h()
- {
- gameboy_proc->HL.b.h |= 0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_6_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x40);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_6_l()
- {
- gameboy_proc->HL.b.l |= 0x40;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_7_a()
- {
- gameboy_proc->AF.b.h |= 0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_7_b()
- {
- gameboy_proc->BC.b.h |= 0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_7_c()
- {
- gameboy_proc->BC.b.l |= 0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_7_d()
- {
- gameboy_proc->DE.b.h |= 0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_7_e()
- {
- gameboy_proc->DE.b.l |= 0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_7_h()
- {
- gameboy_proc->HL.b.h |= 0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_set_7_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, what | 0x80);
- MORE_CYCLES2(12);
- }
-
- void inst_cb_set_7_l()
- {
- gameboy_proc->HL.b.l |= 0x80;
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sla_a()
- {
- if (gameboy_proc->AF.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h <<= 1;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sla_b()
- {
- if (gameboy_proc->BC.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.h <<= 1;
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sla_c()
- {
- if (gameboy_proc->BC.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.l <<= 1;
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sla_d()
- {
- if (gameboy_proc->DE.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.h <<= 1;
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sla_e()
- {
- if (gameboy_proc->DE.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.l <<= 1;
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sla_h()
- {
- if (gameboy_proc->HL.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.h <<= 1;
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sla_hl_indirect()
- {
- unsigned char data = memory_read_byte(gameboy_proc->HL.uw);
-
- if (data & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- data <<= 1;
-
- memory_write_byte(gameboy_proc->HL.uw, data); /* fix */
-
- if (data)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(16);
- }
-
- void inst_cb_sla_l()
- {
- if (gameboy_proc->HL.b.l & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.l <<= 1;
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sra_a()
- {
- if (gameboy_proc->AF.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = (gameboy_proc->AF.b.h & 0x80) | (gameboy_proc->AF.b.h >> 1);
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sra_b()
- {
- if (gameboy_proc->BC.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.h = (gameboy_proc->BC.b.h & 0x80) | (gameboy_proc->BC.b.h >> 1);
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sra_c()
- {
- if (gameboy_proc->BC.b.l & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.l = (gameboy_proc->BC.b.l & 0x80) | (gameboy_proc->BC.b.l >> 1);
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sra_d()
- {
- if (gameboy_proc->DE.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.h = (gameboy_proc->DE.b.h & 0x80) | (gameboy_proc->DE.b.h >> 1);
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sra_e()
- {
- if (gameboy_proc->DE.b.l & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.l = (gameboy_proc->DE.b.l & 0x80) | (gameboy_proc->DE.b.l >> 1);
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sra_h()
- {
- if (gameboy_proc->HL.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.h = (gameboy_proc->HL.b.h & 0x80) | (gameboy_proc->HL.b.h >> 1);
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_sra_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
-
- if (value & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- value = (value & 0x80) | (value >> 1);
-
- if (value)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- memory_write_byte(gameboy_proc->HL.uw, value);
-
- MORE_CYCLES2(16);
- }
-
- void inst_cb_sra_l()
- {
- if (gameboy_proc->HL.b.l & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.l = (gameboy_proc->HL.b.l & 0x80) | (gameboy_proc->HL.b.l >> 1);
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_srl_a()
- {
- if (gameboy_proc->AF.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h >>= 1;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_srl_b()
- {
- if (gameboy_proc->BC.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.h >>= 1;
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_srl_c()
- {
- if (gameboy_proc->BC.b.l & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->BC.b.l >>= 1;
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_srl_d()
- {
- if (gameboy_proc->DE.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.h >>= 1;
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_srl_e()
- {
- if (gameboy_proc->DE.b.l & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->DE.b.l >>= 1;
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_srl_h()
- {
- if (gameboy_proc->HL.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.h >>= 1;
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_srl_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
-
- if (value & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- value >>= 1;
-
- if (value)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- memory_write_byte(gameboy_proc->HL.uw, value);
-
- MORE_CYCLES2(16);
- }
-
- void inst_cb_srl_l()
- {
- if (gameboy_proc->HL.b.l & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->HL.b.l >>= 1;
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_swap_a()
- {
- unsigned char what = gameboy_proc->AF.b.h;
- gameboy_proc->AF.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_swap_b()
- {
- unsigned char what = gameboy_proc->BC.b.h;
- gameboy_proc->BC.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_swap_c()
- {
- unsigned char what = gameboy_proc->BC.b.l;
- gameboy_proc->BC.b.l = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_swap_d()
- {
- unsigned char what = gameboy_proc->DE.b.h;
- gameboy_proc->DE.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_swap_e()
- {
- unsigned char what = gameboy_proc->DE.b.l;
- gameboy_proc->DE.b.l = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_swap_h()
- {
- unsigned char what = gameboy_proc->HL.b.h;
- gameboy_proc->HL.b.h = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cb_swap_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- memory_write_byte(gameboy_proc->HL.uw, ((what & 0xF) << 4) | ((what & 0xF0) >> 4));
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(16);
- }
-
- void inst_cb_swap_l()
- {
- unsigned char what = gameboy_proc->HL.b.l;
- gameboy_proc->HL.b.l = ((what & 0xF) << 4) | ((what & 0xF0) >> 4);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY | FLAGS_CARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_ccf()
- {
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- if (FLAGS_ISCARRY(gameboy_proc))
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_cp_a()
- {
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_cp_b()
- {
- unsigned char value = gameboy_proc->BC.b.h;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_cp_c()
- {
- unsigned char value = gameboy_proc->BC.b.l;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_cp_d()
- {
- unsigned char value = gameboy_proc->DE.b.h;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_cp_e()
- {
- unsigned char value = gameboy_proc->DE.b.l;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_cp_h()
- {
- unsigned char value = gameboy_proc->HL.b.h;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_cp_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cp_l()
- {
- unsigned char value = gameboy_proc->HL.b.l;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_cp_n()
- {
- unsigned char value = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if (gameboy_proc->AF.b.h == value)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if (value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_cpl()
- {
- gameboy_proc->AF.b.h = ~gameboy_proc->AF.b.h;
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_daa()
- {
- unsigned char value = gameboy_proc->AF.b.h;
-
-
- if((value & 0x0F) > 0x09) { /* If its A-F */
- if(FLAGS_ISNEGATIVE(gameboy_proc))
- value -= 6;
- else
- value += 06; /* make it not */
- }
- if((value & 0xF0) > 0x90) { /* If its A-F */
- if(FLAGS_ISNEGATIVE(gameboy_proc))
- value -= 0x60;
- else
- value += 0x60;
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- } else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- gameboy_proc->AF.b.h = value;
-
- /* TODO */
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_dec_a()
- {
- if (gameboy_proc->AF.b.h & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h--;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_dec_b()
- {
- if (gameboy_proc->BC.b.h & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->BC.b.h--;
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_dec_bc()
- {
- gameboy_proc->BC.uw--;
- MORE_CYCLES2(8);
- }
-
- void inst_dec_c()
- {
- if (gameboy_proc->BC.b.l & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->BC.b.l--;
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_dec_d()
- {
- if (gameboy_proc->DE.b.h & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->DE.b.h--;
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_dec_de()
- {
- gameboy_proc->DE.uw--;
- MORE_CYCLES2(8);
- }
-
- void inst_dec_e()
- {
- if (gameboy_proc->DE.b.l & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->DE.b.l--;
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_dec_h()
- {
- if (gameboy_proc->HL.b.h & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.b.h--;
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_dec_hl()
- {
- gameboy_proc->HL.uw--;
- MORE_CYCLES2(8);
- }
-
- void inst_dec_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
- if (what & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- what--;
- memory_write_byte(gameboy_proc->HL.uw, what);
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
- MORE_CYCLES2(12);
- }
-
- void inst_dec_l()
- {
- if (gameboy_proc->HL.b.l & 0x0F)
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.b.l--;
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_dec_sp()
- {
- gameboy_proc->SP.uw--;
- MORE_CYCLES2(8);
- }
-
- void inst_di()
- {
- gameboy_proc->IFF &= ~0x01;
- MORE_CYCLES2(4);
- }
-
- void inst_ei()
- {
- gameboy_proc->IFF |= 0x01;
- MORE_CYCLES2(4);
- }
-
- void inst_halt()
- {
- MORE_CYCLES2(4);
- /* TODO: halt */
- }
-
- void inst_inc_a()
- {
- if ((gameboy_proc->AF.b.h & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h++;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_inc_b()
- {
- if ((gameboy_proc->BC.b.h & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->BC.b.h++;
-
- if (gameboy_proc->BC.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_inc_bc()
- {
- gameboy_proc->BC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_inc_c()
- {
- if ((gameboy_proc->BC.b.l & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->BC.b.l++;
-
- if (gameboy_proc->BC.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_inc_d()
- {
- if ((gameboy_proc->DE.b.h & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->DE.b.h++;
-
- if (gameboy_proc->DE.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_inc_de()
- {
- gameboy_proc->DE.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_inc_e()
- {
- if ((gameboy_proc->DE.b.l & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->DE.b.l++;
-
- if (gameboy_proc->DE.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_inc_h()
- {
- if ((gameboy_proc->HL.b.h & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.b.h++;
-
- if (gameboy_proc->HL.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_inc_hl()
- {
- gameboy_proc->HL.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_inc_hl_indirect()
- {
- unsigned char what = memory_read_byte(gameboy_proc->HL.uw);
-
- if ((what & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- what++;
- memory_write_byte(gameboy_proc->HL.uw, what);
-
- if (what)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(12);
- }
-
- void inst_inc_l()
- {
- if ((gameboy_proc->HL.b.l & 0x0F) == 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->HL.b.l++;
-
- if (gameboy_proc->HL.b.l)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE);
-
- MORE_CYCLES2(4);
- }
-
- void inst_inc_sp()
- {
- gameboy_proc->SP.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_jp_c_nn()
- {
- if(FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
- MORE_CYCLES2(16);
- } else {
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(12);
- }
- }
-
- void inst_jp_hl()
- {
- gameboy_proc->PC.uw = gameboy_proc->HL.uw;
- MORE_CYCLES2(4);
- }
-
- void inst_jp_nc_nn()
- {
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(12);
- } else {
- gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
- MORE_CYCLES2(16);
- }
- }
-
- void inst_jp_nn() /* C3 */
- {
- gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
- MORE_CYCLES2(16);
- }
-
- void inst_jp_nz_nn()
- {
- if (FLAGS_ISZERO(gameboy_proc)) {
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(12);
- } else {
- gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
- MORE_CYCLES2(16);
- }
- }
-
- void inst_jp_z_nn()
- {
- if (FLAGS_ISZERO(gameboy_proc)) {
- gameboy_proc->PC.uw = memory_read_word(gameboy_proc->PC.uw);
- MORE_CYCLES2(16);
- } else {
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(12);
- }
- }
-
- void inst_jr_c_n()
- {
- signed char offset = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->PC.uw += offset;
- MORE_CYCLES2(12);
- } else {
- MORE_CYCLES2(8);
- }
- }
-
- void inst_jr_n()
- {
- signed char offset = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- gameboy_proc->PC.uw += offset;
- MORE_CYCLES2(12);
- }
-
- void inst_jr_nc_n()
- {
- signed char offset = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- if(FLAGS_ISCARRY(gameboy_proc)) {
- MORE_CYCLES2(8);
- } else {
- gameboy_proc->PC.uw += offset;
- MORE_CYCLES2(12);
- }
- }
-
- void inst_jr_nz_n()
- {
- signed char offset = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- if (FLAGS_ISZERO(gameboy_proc)) {
- MORE_CYCLES2(8);
- } else {
- gameboy_proc->PC.uw += offset;
- MORE_CYCLES2(12);
- }
- }
-
- void inst_jr_z_n()
- {
- signed char offset = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- if (FLAGS_ISZERO(gameboy_proc)) {
- gameboy_proc->PC.uw += offset;
- MORE_CYCLES2(12);
- } else {
- MORE_CYCLES2(8);
- }
- }
-
- void inst_ld_a_b()
- {
- gameboy_proc->AF.b.h = gameboy_proc->BC.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_a_bc_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->BC.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_a_c()
- {
- gameboy_proc->AF.b.h = gameboy_proc->BC.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_a_c_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(0xFF00 + gameboy_proc->BC.b.l);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_a_d()
- {
- gameboy_proc->AF.b.h = gameboy_proc->DE.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_a_de_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->DE.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_a_e()
- {
- gameboy_proc->AF.b.h = gameboy_proc->DE.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_a_ff_n_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(0xFF00 + memory_read_byte(gameboy_proc->PC.uw));
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(12);
- }
-
- void inst_ld_a_h()
- {
- gameboy_proc->AF.b.h = gameboy_proc->HL.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_a_hl_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->HL.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_a_hld_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->HL.uw);
- gameboy_proc->HL.uw--;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_a_hli_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->HL.uw);
- gameboy_proc->HL.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_a_l()
- {
- gameboy_proc->AF.b.h = gameboy_proc->HL.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_a_n()
- {
- gameboy_proc->AF.b.h = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_a_nn_indirect()
- {
- gameboy_proc->AF.b.h = memory_read_byte(memory_read_word(gameboy_proc->PC.uw));
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(16);
- }
-
- void inst_ld_b_a()
- {
- gameboy_proc->BC.b.h = gameboy_proc->AF.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_b_c()
- {
- gameboy_proc->BC.b.h = gameboy_proc->BC.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_b_d()
- {
- gameboy_proc->BC.b.h = gameboy_proc->DE.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_b_e()
- {
- gameboy_proc->BC.b.h = gameboy_proc->DE.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_b_h()
- {
- gameboy_proc->BC.b.h = gameboy_proc->HL.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_b_hl_indirect()
- {
- gameboy_proc->BC.b.h = memory_read_byte(gameboy_proc->HL.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_b_l()
- {
- gameboy_proc->BC.b.h = gameboy_proc->HL.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_b_n()
- {
- gameboy_proc->BC.b.h = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_bc_indirect_a()
- {
- memory_write_byte(gameboy_proc->BC.uw, gameboy_proc->AF.b.h);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_bc_nn()
- {
- gameboy_proc->BC.uw = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
-
- MORE_CYCLES2(12);
- }
-
- void inst_ld_c_a()
- {
- gameboy_proc->BC.b.l = gameboy_proc->AF.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_c_b()
- {
- gameboy_proc->BC.b.l = gameboy_proc->BC.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_c_d()
- {
- gameboy_proc->BC.b.l = gameboy_proc->DE.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_c_e()
- {
- gameboy_proc->BC.b.l = gameboy_proc->DE.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_c_h()
- {
- gameboy_proc->BC.b.l = gameboy_proc->HL.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_c_hl_indirect()
- {
- gameboy_proc->BC.b.l = memory_read_byte(gameboy_proc->HL.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_c_indirect_a()
- {
- memory_write_byte(0xFF00 + gameboy_proc->BC.b.l, gameboy_proc->AF.b.h);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_c_l()
- {
- gameboy_proc->BC.b.l = gameboy_proc->HL.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_c_n()
- {
- gameboy_proc->BC.b.l = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_d_a()
- {
- gameboy_proc->DE.b.h = gameboy_proc->AF.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_d_b()
- {
- gameboy_proc->DE.b.h = gameboy_proc->BC.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_d_c()
- {
- gameboy_proc->DE.b.h = gameboy_proc->BC.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_d_e()
- {
- gameboy_proc->DE.b.h = gameboy_proc->DE.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_d_h()
- {
- gameboy_proc->DE.b.h = gameboy_proc->HL.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_d_hl_indirect()
- {
- gameboy_proc->DE.b.h = memory_read_byte(gameboy_proc->HL.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_d_l()
- {
- gameboy_proc->DE.b.h = gameboy_proc->HL.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_d_n()
- {
- gameboy_proc->DE.b.h = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_de_indirect_a()
- {
- memory_write_byte(gameboy_proc->DE.uw, gameboy_proc->AF.b.h);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_de_nn()
- {
- gameboy_proc->DE.uw = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
-
- MORE_CYCLES2(12);
- }
-
- void inst_ld_e_a()
- {
- gameboy_proc->DE.b.l = gameboy_proc->AF.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_e_b()
- {
- gameboy_proc->DE.b.l = gameboy_proc->BC.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_e_c()
- {
- gameboy_proc->DE.b.l = gameboy_proc->BC.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_e_d()
- {
- gameboy_proc->DE.b.l = gameboy_proc->DE.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_e_h()
- {
- gameboy_proc->DE.b.l = gameboy_proc->HL.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_e_hl_indirect()
- {
- gameboy_proc->DE.b.l = memory_read_byte(gameboy_proc->HL.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_e_l()
- {
- gameboy_proc->DE.b.l = gameboy_proc->HL.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_e_n()
- {
- gameboy_proc->DE.b.l = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_ff_n_indirect_a()
- {
- memory_write_byte(0xFF00 + memory_read_byte(gameboy_proc->PC.uw), gameboy_proc->AF.b.h);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(12);
- }
-
- void inst_ld_h_a()
- {
- gameboy_proc->HL.b.h = gameboy_proc->AF.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_h_b()
- {
- gameboy_proc->HL.b.h = gameboy_proc->BC.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_h_c()
- {
- gameboy_proc->HL.b.h = gameboy_proc->BC.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_h_d()
- {
- gameboy_proc->HL.b.h = gameboy_proc->DE.b.h;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_h_e()
- {
- gameboy_proc->HL.b.h = gameboy_proc->DE.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_h_hl_indirect()
- {
- gameboy_proc->HL.b.h = memory_read_byte(gameboy_proc->HL.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_h_l()
- {
- gameboy_proc->HL.b.h = gameboy_proc->HL.b.l;
- MORE_CYCLES2(4);
- }
-
- void inst_ld_h_n()
- {
- gameboy_proc->HL.b.h = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_a()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->AF.b.h);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_b()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->BC.b.h);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_c()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->BC.b.l);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_d()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->DE.b.h);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_e()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->DE.b.l);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_h()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->HL.b.h);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_l()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->HL.b.l);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hl_indirect_n()
- {
- memory_write_byte(gameboy_proc->HL.uw, memory_read_byte(gameboy_proc->PC.uw));
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(12);
- }
-
- void inst_ld_hl_nn()
- {
- gameboy_proc->HL.uw = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
-
- MORE_CYCLES2(12);
- }
-
- void inst_ld_hl_sp_n()
- {
- signed char offset = memory_read_byte(gameboy_proc->PC.uw);
- int result = gameboy_proc->SP.uw + offset;
- gameboy_proc->PC.uw++;
-
- if(result & 0xFFFF0000)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if (((gameboy_proc->SP.uw & 0x0F) + (offset & 0x0F)) > 0x0F)
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO | FLAGS_NEGATIVE);
-
- gameboy_proc->HL.uw = result & 0xFFFF;
-
- MORE_CYCLES2(12);
- }
-
- void inst_ld_hld_indirect_a()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->AF.b.h);
- gameboy_proc->HL.uw--;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_hli_indirect_a()
- {
- memory_write_byte(gameboy_proc->HL.uw, gameboy_proc->AF.b.h);
- gameboy_proc->HL.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_a()
- {
- gameboy_proc->HL.b.l = gameboy_proc->AF.b.h;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_b()
- {
- gameboy_proc->HL.b.l = gameboy_proc->BC.b.h;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_c()
- {
- gameboy_proc->HL.b.l = gameboy_proc->BC.b.l;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_d()
- {
- gameboy_proc->HL.b.l = gameboy_proc->DE.b.h;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_e()
- {
- gameboy_proc->HL.b.l = gameboy_proc->DE.b.l;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_h()
- {
- gameboy_proc->HL.b.l = gameboy_proc->HL.b.h;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_hl_indirect()
- {
- gameboy_proc->HL.b.l = memory_read_byte(gameboy_proc->HL.uw);
- MORE_CYCLES2(8);
- }
-
- void inst_ld_l_n()
- {
- gameboy_proc->HL.b.l = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_nn_indirect_a()
- {
- memory_write_byte(memory_read_word(gameboy_proc->PC.uw), gameboy_proc->AF.b.h);
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(16);
- }
-
- void inst_ld_nn_indirect_sp()
- {
- memory_write_word(memory_read_word(gameboy_proc->PC.uw), gameboy_proc->SP.uw);
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(20);
- }
-
- void inst_ld_sp_hl()
- {
- gameboy_proc->SP.uw = gameboy_proc->HL.uw;
- MORE_CYCLES2(8);
- }
-
- void inst_ld_sp_nn()
- {
- gameboy_proc->SP.uw = memory_read_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw += 2;
- MORE_CYCLES2(12);
- }
-
- /* NOP */
-
- void inst_nop() /* 00 */
- {
- MORE_CYCLES2(4);
- }
-
- void inst_or_a()
- {
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_or_b()
- {
- gameboy_proc->AF.b.h |= gameboy_proc->BC.b.h;
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_or_c()
- {
- gameboy_proc->AF.b.h |= gameboy_proc->BC.b.l;
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_or_d()
- {
- gameboy_proc->AF.b.h |= gameboy_proc->DE.b.h;
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_or_e()
- {
- gameboy_proc->AF.b.h |= gameboy_proc->DE.b.l;
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_or_h()
- {
- gameboy_proc->AF.b.h |= gameboy_proc->HL.b.h;
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_or_hl_indirect()
- {
- gameboy_proc->AF.b.h |= memory_read_byte(gameboy_proc->HL.uw);
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_or_l()
- {
- gameboy_proc->AF.b.h |= gameboy_proc->HL.b.l;
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_or_n()
- {
- gameboy_proc->AF.b.h |= memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(8);
- }
-
- void inst_pop_af()
- {
- gameboy_proc->AF.uw = gameboy_stack_read_word();
- MORE_CYCLES2(12);
- }
-
- void inst_pop_bc()
- {
- gameboy_proc->BC.uw = gameboy_stack_read_word();
- MORE_CYCLES2(12);
- }
-
- void inst_pop_de()
- {
- gameboy_proc->DE.uw = gameboy_stack_read_word();
- MORE_CYCLES2(12);
- }
-
- void inst_pop_hl()
- {
- gameboy_proc->HL.uw = gameboy_stack_read_word();
- MORE_CYCLES2(12);
- }
-
- void inst_push_af()
- {
- gameboy_stack_write_word(gameboy_proc->AF.uw);
- MORE_CYCLES2(16);
- }
-
- void inst_push_bc()
- {
- gameboy_stack_write_word(gameboy_proc->BC.uw);
- MORE_CYCLES2(16);
- }
-
- void inst_push_de()
- {
- gameboy_stack_write_word(gameboy_proc->DE.uw);
- MORE_CYCLES2(16);
- }
-
- void inst_push_hl()
- {
- gameboy_stack_write_word(gameboy_proc->HL.uw);
- MORE_CYCLES2(16);
- }
-
- void inst_ret()
- {
- gameboy_proc->PC.uw = gameboy_stack_read_word();
- MORE_CYCLES2(16);
- }
-
- void inst_ret_c()
- {
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->PC.uw = gameboy_stack_read_word();
- MORE_CYCLES2(20);
- } else {
- MORE_CYCLES2(8);
- }
- }
-
- void inst_ret_nc()
- {
- if (FLAGS_ISCARRY(gameboy_proc)) {
- MORE_CYCLES2(8);
- } else {
- gameboy_proc->PC.uw = gameboy_stack_read_word();
- MORE_CYCLES2(20);
- }
- }
-
- void inst_ret_nz()
- {
- if (FLAGS_ISZERO(gameboy_proc)) {
- MORE_CYCLES2(8);
- } else {
- gameboy_proc->PC.uw = gameboy_stack_read_word();
- MORE_CYCLES2(20);
- }
- }
-
- void inst_ret_z()
- {
- if (FLAGS_ISZERO(gameboy_proc)) {
- gameboy_proc->PC.uw = gameboy_stack_read_word();
- MORE_CYCLES2(20);
- } else {
- MORE_CYCLES2(8);
- }
- }
-
- void inst_reti()
- {
- gameboy_proc->PC.uw = gameboy_stack_read_word();
- gameboy_proc->IFF = 1;
- MORE_CYCLES2(16);
- }
-
- void inst_rla()
- {
- int carry = FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0;
- if (gameboy_proc->AF.b.h & 0x80)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->AF.b.h <<= 1;
- gameboy_proc->AF.b.h += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_rlca()
- {
- int carry = (gameboy_proc->AF.b.h & 0x80) >> 7;
- if (carry)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->AF.b.h <<= 1;
- gameboy_proc->AF.b.h += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_rra()
- {
- int carry = (FLAGS_ISSET(gameboy_proc, FLAGS_CARRY) ? 1 : 0) << 7;
- if (gameboy_proc->AF.b.h & 0x01)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->AF.b.h >>= 1;
- gameboy_proc->AF.b.h += carry;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_rrca()
- {
- int carry = gameboy_proc->AF.b.h & 0x01;
- if (carry)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- gameboy_proc->AF.b.h >>= 1;
- if (carry)
- gameboy_proc->AF.b.h |= 0x80;
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_ZERO | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_rst_00h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x00;
- MORE_CYCLES2(16);
- }
-
- void inst_rst_08h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x08;
- MORE_CYCLES2(16);
- }
-
- void inst_rst_10h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x10;
- MORE_CYCLES2(16);
- }
-
- void inst_rst_18h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x18;
- MORE_CYCLES2(16);
- }
-
- void inst_rst_20h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x20;
- MORE_CYCLES2(16);
- }
-
- void inst_rst_28h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x28;
- MORE_CYCLES2(16);
- }
-
- void inst_rst_30h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x30;
- MORE_CYCLES2(16);
- }
-
- void inst_rst_38h()
- {
- gameboy_stack_write_word(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw = 0x38;
- MORE_CYCLES2(16);
- }
-
- void inst_sbc_a()
- {
- if (FLAGS_ISCARRY(gameboy_proc)) {
- gameboy_proc->AF.b.h = 0xFF;
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- } else {
- gameboy_proc->AF.b.h = 0;
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
- }
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
- }
-
- void inst_sbc_b()
- {
- unsigned char value = gameboy_proc->BC.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sbc_c()
- {
- unsigned char value = gameboy_proc->BC.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sbc_d()
- {
- unsigned char value = gameboy_proc->DE.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sbc_e()
- {
- unsigned char value = gameboy_proc->DE.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sbc_h()
- {
- unsigned char value = gameboy_proc->HL.b.h + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sbc_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(8);
- }
-
- void inst_sbc_l()
- {
- unsigned char value = gameboy_proc->HL.b.l + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sbc_n()
- {
- unsigned char value = memory_read_byte(gameboy_proc->PC.uw) + (FLAGS_ISCARRY(gameboy_proc) ? 1 : 0);
- gameboy_proc->PC.uw++;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(8);
- }
-
- void inst_scf()
- {
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- FLAGS_CLEAR(gameboy_proc, FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_stop()
- {
- unsigned long oc = current_joypad;
-
- while(oc != current_joypad)
- vram_sysupdate();
- gameboy_proc->PC.uw++;
- MORE_CYCLES2(4);
- }
-
- void inst_sub_a()
- {
- gameboy_proc->AF.b.h = 0;
- FLAGS_SET(gameboy_proc, FLAGS_ZERO | FLAGS_NEGATIVE);
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_sub_b()
- {
- unsigned char value = gameboy_proc->BC.b.h;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sub_c()
- {
- unsigned char value = gameboy_proc->BC.b.l;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sub_d()
- {
- unsigned char value = gameboy_proc->DE.b.h;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sub_e()
- {
- unsigned char value = gameboy_proc->DE.b.l;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sub_h()
- {
- unsigned char value = gameboy_proc->HL.b.h;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sub_hl_indirect()
- {
- unsigned char value = memory_read_byte(gameboy_proc->HL.uw);
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(8);
- }
-
- void inst_sub_l()
- {
- unsigned char value = gameboy_proc->HL.b.l;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(4);
- }
-
- void inst_sub_n()
- {
- unsigned char value = memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- FLAGS_SET(gameboy_proc, FLAGS_NEGATIVE);
-
- if(value > gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_CARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY);
-
- if(value == gameboy_proc->AF.b.h)
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
-
- if ((value & 0x0F) > (gameboy_proc->AF.b.h & 0x0F))
- FLAGS_SET(gameboy_proc, FLAGS_HALFCARRY);
- else
- FLAGS_CLEAR(gameboy_proc, FLAGS_HALFCARRY);
-
- gameboy_proc->AF.b.h -= value;
-
- MORE_CYCLES2(8);
- }
-
- void inst_unknown()
- {
- printf("Unknown opcode!\n");
- gameboy_proc->running = 0;
- gameboy_proc->PC.uw -= 1;
- gbz80_debugger(gameboy_proc);
- }
-
- void inst_xor_a() /* AF */
- {
- gameboy_proc->AF.b.h = 0;
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
- MORE_CYCLES2(4);
- }
-
- void inst_xor_b() /* A8 */
- {
- gameboy_proc->AF.b.h ^= gameboy_proc->BC.b.h;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_xor_c() /* A9 */
- {
- gameboy_proc->AF.b.h ^= gameboy_proc->BC.b.l;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_xor_d() /* AA */
- {
- gameboy_proc->AF.b.h ^= gameboy_proc->DE.b.h;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_xor_e() /* AB */
- {
- gameboy_proc->AF.b.h ^= gameboy_proc->DE.b.l;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_xor_h() /* AC */
- {
- gameboy_proc->AF.b.h ^= gameboy_proc->HL.b.h;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_xor_hl_indirect() /* AE */
- {
- gameboy_proc->AF.b.h ^= memory_read_byte(gameboy_proc->HL.uw);
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-
- void inst_xor_l() /* AD */
- {
- gameboy_proc->AF.b.h ^= gameboy_proc->HL.b.l;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(4);
- }
-
- void inst_xor_n() /* EE */
- {
- gameboy_proc->AF.b.h ^= memory_read_byte(gameboy_proc->PC.uw);
- gameboy_proc->PC.uw++;
-
- if (gameboy_proc->AF.b.h)
- FLAGS_CLEAR(gameboy_proc, FLAGS_ZERO);
- else
- FLAGS_SET(gameboy_proc, FLAGS_ZERO);
-
- FLAGS_CLEAR(gameboy_proc, FLAGS_CARRY | FLAGS_NEGATIVE | FLAGS_HALFCARRY);
-
- MORE_CYCLES2(8);
- }
-