Главная »
Денди » Арифметико-логическое устройство
Оглавление
§ Инструкция 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;
}