#include <stdio.h>
#define Byte unsigned char
#define Word unsigned short
int daa(Byte a, Byte *status)
{
Byte hc = (*status & 0x20);
Byte carry = (*status & 0x01);
Word t, c = 0;
Byte lsn = a & 0x0f;
Byte msn = a & 0xf0;
Byte r;
if (hc || (lsn > 9)) {
c |= 0x06;
}
if ( carry ||
(msn > 0x90) ||
((msn > 0x80) && (lsn > 9))) {
c |= 0x60;
}
t = c + a;
*status = 0;
if (carry || t & 0x100) *status |= 0x01;
if (t & 0x80) *status |= 0x08;
if ((t & 0xFF) == 0) *status |= 0x04;
r = (Byte)t;
return r;
}
int main()
{
Byte r;
int count = 0;
Byte a = 0;
Byte cc = 0;
fprintf(stdout, "Carry: 0, Halfcarry: o\n");
for (count = 0; count < 256; count++)
{
cc = 0;
r = daa(a, &cc);
fprintf(stdout, "%02X%02X ", r, cc);
a += 1;
}
fprintf(stdout, "\nCarry: 1, Halfcarry: o\n");
for (count = 0; count < 256; count++)
{
cc = 1;
r = daa(a, &cc);
fprintf(stdout, "%02X%02X ", r, cc);
a += 1;
}
fprintf(stdout, "\nCarry: 0, Halfcarry: 1\n");
for (count = 0; count < 256; count++)
{
cc = 0x20;
r = daa(a, &cc);
fprintf(stdout, "%02X%02X ", r, cc);
a += 1;
}
fprintf(stdout, "\nCarry: 1, Halfcarry: 1\n");
for (count = 0; count < 256; count++)
{
cc = 0x21;
r = daa(a, &cc);
fprintf(stdout, "%02X%02X ", r, cc);
a += 1;
}
return 0;
}