§ ADC

void ADC(byte src) {

    word temp = reg_A + src + (IF_CARRY() ? 1 : 0);

    SET_ZERO(temp & 0xFF);
    SET_SIGN(temp);
    SET_OVERFLOW((reg_A ^ src ^ 0x80) & (reg_A ^ temp)) & 0x80);
    SET_CARRY(temp > 0xFF);

    reg_A = temp & 0xff;
}

§ ADC

void SBC(byte src) {

    temp = reg_A - src - (IF_CARRY() ? 0 : 1);

    SET_SIGN(temp);
    SET_ZERO(temp & 0xff);
    SET_OVERFLOW(((reg_A ^ temp) & 0x80) && ((reg_A ^ src) & 0x80));
    SET_CARRY(temp >= 0);

    reg_A = temp & 0xff;
}

§ CMP

void CMP(byte dst, byte src) {

    int src = dst - src;

    SET_CARRY(src >= 0);
    SET_SIGN(src);
    SET_ZERO(src & 0xFF);
}

§ AND

void AND(byte src) {

    src &= reg_A;
    SET_SIGN(src);
    SET_ZERO(src);
    reg_A = src;
}

§ EOR

void EOR(byte src) {

    src ^= reg_A;
    SET_SIGN(src);
    SET_ZERO(src);
    reg_A = src;
}

§ ORA

void ORA(byte src) {

    src |= reg_A;
    SET_SIGN(src);
    SET_ZERO(src);
    reg_A = src;
}

§ LDA

byte LDA(byte src) {

    SET_SIGN(src);
    SET_ZERO(src);
    return src;
}

§ BIT

void BIT(byte src) {

    SET_SIGN(src);
    SET_OVERFLOW(0x40 & src);
    SET_ZERO(src & reg_A);
}

§ INC

byte INC(byte src) {

    src = (src + 1) & 0xff;

    SET_SIGN(src);
    SET_ZERO(src);

    return src;
}

§ DEC

byte DEC(byte src) {

    src = (src - 1) & 0xff;

    SET_SIGN(src);
    SET_ZERO(src);

    return src;
}

§ ASL

void ASL(byte src) {

    SET_CARRY(src & 0x80);
    src <<= 1;
    src &= 0xFF;
    SET_SIGN(src);
    SET_ZERO(src);
}

§ LSR

byte LSR(byte src) {

    SET_CARRY(src & 0x01);
    src >>= 1;
    SET_SIGN(src);
    SET_ZERO(src);
    return src;
}

§ ROL

byte ROL(byte src) {

    src <<= 1;
    if (IF_CARRY()) src |= 0x1;
    SET_CARRY(src > 0xff);
    src &= 0xFF;
    SET_SIGN(src);
    SET_ZERO(src);
    return src;
}

§ ROR

byte ROR(byte src) {

    if (IF_CARRY()) src |= 0x100;
    SET_CARRY(src & 0x01);
    src >>= 1;
    SET_SIGN(src);
    SET_ZERO(src);

    return src;
}