📄 opcodesubb.java
字号:
/** * Projet de langage JAVA IFITEP 3 2005 - Simulateur 8051 * <p> * D閒inition de l'instruction SUBB. * Cf.: * - documentation technique 8051 * - Ouvrage "Microcontroleur 8051 et 8052", edition Dunod * * @author Matthieu SIMON * @version 1.0 du 14/06/05 */public class OpcodeSUBB extends Opcode { public void execute(CORE_CPU8051 cpu) throws OpcodeException { int a, src; if((a = decodeAddressingMode(cpu.getCurrentLine().getOperand(1))) != CORE_CPU8051.ACC) throw new OpcodeException(this, "Bad Addressing Mode"); if((src = decodeAddressingMode(cpu.getCurrentLine().getOperand(2))) == Integer.MAX_VALUE) throw new OpcodeException(this, "Bad Addressing Mode"); a = CORE_CPU8051.internalDataMem[a]; src = CORE_CPU8051.internalDataMem[src]; int i, out = 0; byte old_c = (byte)((CORE_CPU8051.internalDataMem[CORE_CPU8051.PSW]>>7)&1), new_c = 0; byte s, OV = 0; CORE_CPU8051.internalDataMem[CORE_CPU8051.PSW] &= ~0xC4; // clear C, AC et OV for(i = 0; i < 8; i++) { s = (byte)((byte)((a>>i)&1) - (byte)((src>>i)&1)); if(s == -1) { s = 1; new_c = 1; } s -= old_c; if(s == -1) { s = 1; new_c = 1; } out |= s << i; old_c = new_c; new_c = 0; if(i == 3 && old_c == 1) // Carry BCD CORE_CPU8051.internalDataMem[CORE_CPU8051.PSW] |= 0x40; // AC flag if(i == 6 && old_c == 1) // Overflow si pas de retenu a la fin OV = 1; } OV = (byte)(((OV == 1 && old_c == 0) || (OV == 0 && old_c == 1)) ? 1 : 0); CORE_CPU8051.internalDataMem[CORE_CPU8051.PSW] |= (old_c<<7) | (OV<<2); CORE_CPU8051.internalDataMem[CORE_CPU8051.ACC] = (byte)out; cpu.incCyclesCount(1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -