6502 C64, VIC 20 Atari 2600 (http://www.z64k.com), Lorenzes, bclark asap. , , . , , . , , . ADC, SBC ARR ( ARR).
public ALU ADC=new ALU(9,1,-1);
public ALU SBC=new ALU(15,-1,0);
public ALU ARR=new ALU(5,1,-1){
protected void setSB(){AC.ror.execute();SB=AC.value;}
protected void fixlo(){SB=(SB&0xf0)|((SB+c0)&0x0f);}
protected void setVC(){V.set(((AC.value^(SB>>1))&0x20)==0x20);C.set((SB&0x40)==0x40);if((P&8)==8){Dhi(hb);}}
};
public class ALU{
protected final int base,s,m,c0,c1,c2;
protected int lb,hb;
public ALU(int base,int s,int m){this.base=base;this.s=s;this.m=m;c0=6*s;c1=0x10*s;c2=c0<<4;}
public void execute(int c){
lb=(AC.value&0x0f)+(((DL.value&0x0f)+c)*s);
hb=(AC.value&0xf0)+((DL.value&0xf0)*s);
setSB();
if(((P&8)==8)&&(lb&0x1f)>base){fixlo();}
N.set((SB&0x80)==0x80);
setVC();
AC.value=SB&0xff;
}
protected void setSB(){SB=hb+lb;Z.set((SB&0xff)==0);}
protected void fixlo(){SB=(hb+c1)|((SB+c0)&0x0f);}
protected void Dhi(int a){if((a&0x1f0)>base<<4){SB+=c2;C.set(s==1);}}
protected void setVC(){V.set(((AC.value^SB)&(AC.value^DL.value^m)&0x80)==0x80);C.set(SB>=(0x100&m));if((P&8)==8){Dhi(SB);}}
}