Now a short test program, for playing with the equations:
#include <stdlib.h> int main(void); void byte2bin(int val, int bin[]); int do_add(int a, int b, int c0); void byte2bin(int val, int bin[]) { int i; for(i=0;i<8;i++) { bin[i]=0; if((int)val & 1) bin[i]=-1; val>>=1; } } int main(void) { int a,b; // clrscr(); printf("\n\n C0=0 C0=1 "); printf("\n 0123456789ABCDEF 0123456789ABCDEF "); for(a=0;a<0x10;a++) { printf("\n%1X",a); for(b=0;b<0x10;b++) if(do_add(a,b, 0)) printf("*"); else printf("."); printf("%1X %1X",a,a); for(b=0;b<0x10;b++) if(do_add(a,b,-1)) printf("*"); else printf("."); printf("%1X",a); } printf("\n 0123456789ABCDEF 0123456789ABCDEF "); return(0); } int do_add(int a, int b, int c0) { int g0,g1,g2,g3; int p0,p1,p2,p3; int ab[8],bb[8]; int o1,c1,c2,c3,c4,c_4; byte2bin(a,ab); byte2bin(b,bb); g0=g1=g2=g3=0; p0=p1=p2=p3=0; c1=c2=c3=c4=0; o1=c_4=0; //propagate 0..3: XOR if(ab[0]^bb[0]) p0 =-1; if(ab[1]^bb[1]) p1 =-1; if(ab[2]^bb[2]) p2 =-1; if(ab[3]^bb[3]) p3 =-1; //propagate 1: OR if(ab[1]|bb[1]) o1=-1; //generate 0..3: if(ab[0]&bb[0]) g0=-1; if(ab[1]&bb[1]) g1=-1; if(ab[2]&bb[2]) g2=-1; if(ab[3]&bb[3]) g3=-1; //ripple carry if((c0&p0)|g0) c1=-1; if((c1&p1)|g1) c2=-1; if((c2&p2)|g2) c3=-1; if((c3&p3)|g3) c4=-1; /*----------------------*/ #define NMOS6502 1 #ifdef NMOS6502 if(c4) c_4=-1; if(g1&p2&c1) c_4=-1; if((g2|p3)&(o1|(~g2&p2)|c1)) c_4=-1; //o1=p1|g1 #else if(c4) c_4=-1; if(o1&p3) c_4=-1; //o1=p1|g1 if(p2&p3) c_4=-1; if(o1&g2) c_4=-1; //6+4..7, 7+4..7 //o1=p1|g1 /*9+1:*/ if(g0&p3) c_4=-1; /*7+3:*/ if(g0&g1&p2) c_4=-1; /*5+5:*/ if(g0&g2) c_4=-1; /*9+0+c0, 8+1+c0:*/ if(c0&p0&p3) c_4=-1; /*7+2+c0, 6+3+c0:*/ if(c0&p0&g1&p2) c_4=-1; /*5+4+c0: */ if(c0&p0&g2) c_4=-1; #endif /*----------------------*/ return(c_4); }
That's all for now.
On to part 2.
[HOME] [UP]/ [BACK] [1] [2] [3] [4] [5] [6] [7]
(c) Dieter Mueller 2006