END_TEST START_TEST (test_cpu_and) { cpu_t cpu; cpu.A = 0x55; cpu_set_z(&cpu, true); cpu_set_n(&cpu, true); cpu_set_c(&cpu, true); cpu_set_h(&cpu, false); cpu_and(&cpu, 0xF0); fail_unless(cpu.A == 0x50); fail_unless(!cpu_get_z(&cpu)); fail_unless(!cpu_get_n(&cpu)); fail_unless(!cpu_get_c(&cpu)); fail_unless(cpu_get_h(&cpu)); cpu_and(&cpu, 0x00); fail_unless(cpu.A == 0); fail_unless(cpu_get_z(&cpu)); }
void AND(cpu_state_t *state, const enum ARG_TYPE arg0, const union REG_INPUT i0, const enum ARG_TYPE arg1, const union REG_INPUT i1) { reg_t data0 = cpu_load_reg8(state, A_REG); reg_t data1; if(arg0 == ARG_TYPE_DATA8) { data1 = (reg_t)state->arg; } else if(arg0 == ARG_TYPE_REG16_INDIRECT) { data1 = (reg_t)cpu_load16_indirect(state, i0); } else if(arg0 == ARG_TYPE_REG8) { data1 = cpu_load_reg8(state, i0); } else { Error("Incorrect argument type.\n"); } data0 = cpu_and(state, data0, data1); cpu_store_reg8(state, A_REG, data0); }