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