1 #include <stdio.h>
2 
3 #define CF	0x100
4 #define HF	0x200
5 #define DF	0x400
6 
7 int dab[0x800];
8 
main(int ac,char ** av)9 int main(int ac, char **av)
10 {
11 	int i, result;
12 
13 	for (i = 0; i < DF; i++) {
14 		if (i & CF) {
15 			if (i & 0x0f < 0x0a)
16 				dab[i] = CF | ((i + 0x60) & 0xff);
17 			else
18 				dab[i] = CF | ((i + 0x66) & 0xff);
19 		} else {
20 			if (i & HF) {
21 				if (i & 0xf0 < 0xa0)
22 					dab[i] = ((i + 0x06) & 0xff);
23 				else
24 					dab[i] = CF | ((i + 0x66) & 0xff);
25 			} else {
26 				if ((i & 0xf0) < 0xa0 && (i & 0x0f) < 0x0a)
27 					dab[i] = i & 0xff;
28 				else if ((i & 0xf0) < 0x90 && (i & 0x0f) >= 0x0a)
29 					dab[i] = ((i + 0x06) & 0xff);
30 				else if ((i & 0xf0) >= 0xa0 && (i & 0x0f) < 0x0a)
31 					dab[i] = CF | ((i + 0x60) & 0xff);
32 				else if ((i & 0xf0) >= 0x90 && (i & 0x0f) >= 0x0a)
33 					dab[i] = CF | ((i + 0x66) & 0xff);
34 				else {
35 					fprintf(stderr, "unhandled $%04x\n", i);
36 					return 1;
37 				}
38 
39             }
40         }
41 
42         if (i & CF) {
43 			if (i & HF) {
44 				dab[DF+i] = CF | ((i + 0x9a) & 0xff);
45 			} else {
46 				dab[DF+i] = CF | ((i + 0xa0) & 0xff);
47             }
48 		} else {
49 			if (i & HF) {
50 				dab[DF+i] = CF | ((i + 0xfa) & 0xff);
51             } else {
52 				dab[DF+i] = (i & 0xff);
53             }
54         }
55     }
56 
57 	log_cb(RETRO_LOG_DEBUG, LOGPRE "/************************************************ \n");
58 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * Result table for Z8000 DAB instruction         \n");
59 	log_cb(RETRO_LOG_DEBUG, LOGPRE " *                                                \n");
60     log_cb(RETRO_LOG_DEBUG, LOGPRE " * bits    description                            \n");
61 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * ---------------------------------------------- \n");
62 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * 0..7    destination value                      \n");
63 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * 8       carry flag before                      \n");
64 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * 9       half carry flag before                 \n");
65 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * 10      D flag (0 add/adc, 1 sub/sbc)          \n");
66 	log_cb(RETRO_LOG_DEBUG, LOGPRE " *                                                \n");
67     log_cb(RETRO_LOG_DEBUG, LOGPRE " * result  description                            \n");
68 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * ---------------------------------------------- \n");
69 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * 0..7    result value                           \n");
70 	log_cb(RETRO_LOG_DEBUG, LOGPRE " * 8       carry flag after                       \n");
71     log_cb(RETRO_LOG_DEBUG, LOGPRE " ************************************************/\n");
72     log_cb(RETRO_LOG_DEBUG, LOGPRE "static UINT16 Z8000_dab[0x800] = {\n");
73     for (i = 0; i < 0x800; i++) {
74 		if ((i & 0x3ff) == 0) {
75 			if (i & 0x400)
76 				log_cb(RETRO_LOG_DEBUG, LOGPRE "\t/* sub/sbc results */\n");
77 			else
78 				log_cb(RETRO_LOG_DEBUG, LOGPRE "\t/* add/adc results */\n");
79 		}
80         if ((i & 7) == 0) log_cb(RETRO_LOG_DEBUG, LOGPRE "\t");
81 		log_cb(RETRO_LOG_DEBUG, LOGPRE "0x%03x,",dab[i]);
82 		if ((i & 7) == 7) log_cb(RETRO_LOG_DEBUG, LOGPRE "\n");
83 	}
84 	log_cb(RETRO_LOG_DEBUG, LOGPRE "};\n");
85 
86     return 0;
87 }
88