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