1 #include <stdio.h>
2 
3 enum { N_FLAG = 0x80 };
4 enum { V_FLAG = 0x40 };
5 enum { T_FLAG = 0x20 };
6 enum { B_FLAG = 0x10 };
7 enum { D_FLAG = 0x08 };
8 enum { I_FLAG = 0x04 };
9 enum { Z_FLAG = 0x02 };
10 enum { C_FLAG = 0x01 };
11 
12 typedef unsigned char uint8;
13 typedef unsigned int uint32;
14 
GenADC(void)15 static void GenADC(void)
16 {
17  uint8 ftab[4] = { 0x00, 0x01, 0xC2, 0xC3 };
18  FILE* fp = fopen("adcresults.bin", "wb");
19 
20  for(int FI = 0; FI < 4; FI++)
21  {
22   for(int arg = 0x00; arg < 0x100; arg++)
23   {
24    for(int A = 0x00; A < 0x100; A++)
25    {
26     uint8 P = ftab[FI] | I_FLAG | D_FLAG | B_FLAG;
27     uint8 Aout;
28     uint32 tmp;
29 
30     tmp = (A & 0x0F) + (arg & 0x0F) + (P & 1);
31     if(tmp >= 0x0A)
32      tmp += 0x06;
33 
34     tmp += (A & 0xF0) + (arg & 0xF0);
35     if(tmp >= 0xA0)
36      tmp += 0x60;
37 
38     P &= ~(Z_FLAG | N_FLAG | C_FLAG);
39 
40     if(tmp & 0xFF00)
41      P |= C_FLAG;
42 
43     Aout = tmp;
44 
45     if(Aout & 0x80)
46      P |= N_FLAG;
47 
48     if(!Aout)
49      P |= Z_FLAG;
50 
51     if(Aout & 0x80)
52      P |= N_FLAG;
53 
54     fseek(fp, (FI << 17) + ((arg & 0xF0) << 9) + ((arg & 0x0F) << 8) + A + 0x0000, SEEK_SET);
55     fwrite(&Aout, 1, 1, fp);
56 
57     fseek(fp, (FI << 17) + ((arg & 0xF0) << 9) + ((arg & 0x0F) << 8) + A + 0x1000, SEEK_SET);
58     fwrite(&P, 1, 1, fp);
59    }
60   }
61  }
62 
63  fclose(fp);
64 }
65 
GenSBC(void)66 static void GenSBC(void)
67 {
68  uint8 ftab[4] = { 0x00, 0x01, 0xC2, 0xC3 };
69  FILE* fp = fopen("sbcresults.bin", "wb");
70 
71  for(int FI = 0; FI < 4; FI++)
72  {
73   for(int arg = 0x00; arg < 0x100; arg++)
74   {
75    for(int A = 0x00; A < 0x100; A++)
76    {
77     uint8 P = ftab[FI] | I_FLAG | D_FLAG | B_FLAG;
78     uint8 Aout;
79 
80     uint8 res = A - arg - ((P & 1) ^ 1);
81     const uint8 m = (A & 0xF) - (arg & 0xF) - ((P & 1) ^ 1);
82     const uint8 n = (A >> 4) - (arg >> 4) - ((m >> 4) & 1);
83 
84     P &= ~(Z_FLAG | N_FLAG | C_FLAG);
85 
86     if(m & 0x10)
87      res -= 0x06;
88 
89     if(n & 0x10)
90      res -= 0x60;
91 
92     Aout = res;
93     P |= ((n >> 4) & 0x1) ^ 1;
94 
95     if(!Aout)
96      P |= Z_FLAG;
97 
98     if(Aout & 0x80)
99      P |= N_FLAG;
100 
101     //if(A == 0x00 && arg == 0x0A && FI == 0)
102     // printf("00 0A 00: %02x %02x\n", Aout, P);
103 
104     //if(A == 0x0F && arg == 0x0A && FI == 0)
105     // printf("00 0A 00: %02x %02x\n", Aout, P);
106 
107     //if(A == 0x10 && arg == 0x0A && FI == 0)
108     // printf("00 0A 10: %02x %02x\n", Aout, P);
109 
110     fseek(fp, (FI << 17) + ((arg & 0xF0) << 9) + ((arg & 0x0F) << 8) + A + 0x0000, SEEK_SET);
111     fwrite(&Aout, 1, 1, fp);
112 
113     fseek(fp, (FI << 17) + ((arg & 0xF0) << 9) + ((arg & 0x0F) << 8) + A + 0x1000, SEEK_SET);
114     fwrite(&P, 1, 1, fp);
115    }
116   }
117  }
118 
119  fclose(fp);
120 }
121 
main(int argc,char * argv[])122 int main(int argc, char* argv[])
123 {
124  GenADC();
125  GenSBC();
126  return 0;
127 }
128