|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2023 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: #include "header.h"
8: #include "mystring.h"
9: #include <vector>
10:
11: class hd64180flag
12: {
13: public:
14: bool S {};
15: bool Z {};
16: bool H {};
17: bool PV {};
18: bool N {};
19: bool C {};
20:
21: uint8 Get() const {
22: uint8 data = 0;
23: if (S) data |= 0x80;
24: if (Z) data |= 0x40;
25: if (H) data |= 0x10;
26: if (PV) data |= 0x04;
27: if (N) data |= 0x02;
28: if (C) data |= 0x01;
29: return data;
30: }
31: };
32:
33: static void out(const char *, ...);
34:
35: static const char *name;
36: static int testpos;
37: static std::vector<std::string> testlist;
38:
39: static std::vector<uint8> values1 = {
40: 0x00,
41: 0x01,
42: 0x0f,
43: 0x10,
44: 0x7f,
45: 0x80,
46: 0xff,
47: };
48: static std::vector<uint8> values2 = {
49: 0x00,
50: 0x01,
51: 0x03,
52: 0x55,
53: 0x7f,
54: 0xaa,
55: 0xff,
56: };
57:
58: static inline bool
59: vflag_add(uint32 dst, uint32 src, uint32 res)
60: {
61: uint32 v = (src ^ res) & (dst ^ res);
62: return (v & 0x80);
63: }
64:
65: static inline bool
66: vflag_sub(uint32 dst, uint32 src, uint32 res)
67: {
68: uint32 v = (src ^ dst) & (dst ^ res);
69: return (v & 0x80);
70: }
71:
72: static bool
73: hflag_add(uint32 dst, uint32 src)
74: {
75: uint32 res = (dst & 0x0f) + (src & 0x0f);
76: return (res & 0x10);
77: }
78:
79: static bool
80: hflag_sub(uint32 dst, uint32 src)
81: {
82: uint32 res = (dst & 0x0f) - (src & 0x0f);
83: return (res & 0x10);
84: }
85:
86: static bool
87: pflag(uint32 res)
88: {
89: return ((__builtin_popcount(res) & 1) == 0);
90: }
91:
92: // gentest の最初で行うことまとめ。
93: static void
94: init(const char *name_, const char *method)
95: {
96: name = name_;
97: testlist.push_back(name);
98:
99: out("test_%s:\n", name);
100: out(" LD HL,testset_%s\n", name);
101: out(" JP %s\n", method);
102:
103: testpos = 0;
104: }
105:
106: // テストセットのテーブルを出力。
107: static void
108: out_testset(const char *name)
109: {
110: out("testset_%s:\n", name);
111: out(" defw testname_%s\n", name);
112: out(" defw testexec_%s\n", name);
113: out(" defw testdata_%s_00\n", name);
114:
115: out("testname_%s:\n", name);
116: std::string upper = string_toupper(name);
117: out(" defm \"%s $\"\n", upper.c_str());
118: out("\n");
119: }
120:
121: // testrun1 テスト用のデータテーブルを出力。
122: static void
123: out_testdata_run1(uint32 dst, const hd64180flag& inflag,
124: uint32 res, const hd64180flag& flag)
125: {
126: out("testdata_%s_%02x:", name, testpos++);
127: out(" defb 0%02xH,0%02xH,0%02xH,0%02xH\n",
128: dst, inflag.Get(), res, flag.Get());
129: }
130:
131: // testrun2 テスト用のデータテーブルを出力。
132: static void
133: out_testdata_run2(uint32 dst, const hd64180flag& inflag, uint32 src,
134: uint32 res, const hd64180flag& flag)
135: {
136: out("testdata_%s_%02x:", name, testpos++);
137: out(" defb 0%02xH,0%02xH,0%02xH,0%02xH,0%02xH\n",
138: dst, inflag.Get(), src, res, flag.Get());
139: }
140:
141: static void
142: gentest_add()
143: {
144: init("add", "testrun2");
145:
146: out("testexec_%s:\n", name);
147: out(" ADD A,D\n");
148: out(" RET\n");
149:
150: out_testset(name);
151:
152: for (auto dst : values1) {
153: for (auto src : values1) {
154: uint32 res32 = dst + src;
155: uint8 res = res32;
156: hd64180flag inflag;
157: inflag.N = true;
158: hd64180flag flag;
159: flag.Z = (res == 0);
160: flag.S = ((res & 0x80) != 0);
161: flag.C = ((res32 & 0x0100) != 0);
162: flag.PV = vflag_add(dst, src, res);
163: flag.H = hflag_add(dst, src);
164: flag.N = false;
165: out_testdata_run2(dst, inflag, src, res, flag);
166: }
167: }
168: out(" defb 0,0,0,0,0FFH\n");
169: out("\n");
170: }
171:
172: static void
173: gentest_adc()
174: {
175: init("adc", "testrun2");
176:
177: out("testexec_%s:\n", name);
178: out(" ADC A,D\n");
179: out(" RET\n");
180:
181: out_testset(name);
182:
183: for (auto dst : values1) {
184: for (auto src : values1) {
185: for (int cin = 0; cin <= 1; cin++) {
186: uint32 res32 = dst + src + cin;
187: uint8 res = res32;
188: hd64180flag inflag;
189: inflag.C = cin;
190: inflag.N = true;
191: hd64180flag flag;
192: flag.Z = (res == 0);
193: flag.S = ((res & 0x80) != 0);
194: flag.C = ((res32 & 0x0100) != 0);
195: flag.PV = vflag_add(dst, src, res);
196: flag.H = hflag_add(dst, src) | hflag_add(src + dst, cin);
197: flag.N = false;
198: out_testdata_run2(dst, inflag, src, res, flag);
199: }
200: }
201: }
202: out(" defb 0,0,0,0,0FFH\n");
203: out("\n");
204: }
205:
206: static void
207: gentest_sub()
208: {
209: init("sub", "testrun2");
210:
211: out("testexec_%s:\n", name);
212: out(" SUB D\n");
213: out(" RET\n");
214:
215: out_testset(name);
216:
217: for (auto dst : values1) {
218: for (auto src : values1) {
219: uint32 res32 = dst - src;
220: uint8 res = res32;
221: hd64180flag inflag;
222: inflag.N = false;
223: hd64180flag flag;
224: flag.Z = (res == 0);
225: flag.S = ((res & 0x80) != 0);
226: flag.C = ((res32 & 0x0100) != 0);
227: flag.PV = vflag_sub(dst, src, res);
228: flag.H = hflag_sub(dst, src);
229: flag.N = true;
230: out_testdata_run2(dst, inflag, src, res, flag);
231: }
232: }
233: out(" defb 0,0,0,0,0FFH\n");
234: out("\n");
235: }
236:
237: static void
238: gentest_sbc()
239: {
240: init("sbc", "testrun2");
241:
242: out("testexec_%s:\n", name);
243: out(" SBC A,D\n");
244: out(" RET\n");
245:
246: out_testset(name);
247:
248: for (auto dst : values1) {
249: for (auto src : values1) {
250: for (int cin = 0; cin <= 1; cin++) {
251: uint32 res32 = dst - src - cin;
252: uint8 res = res32;
253: hd64180flag inflag;
254: inflag.C = cin;
255: inflag.N = false;
256: hd64180flag flag;
257: flag.Z = (res == 0);
258: flag.S = ((res & 0x80) != 0);
259: flag.C = ((res32 & 0x0100) != 0);
260: flag.PV = vflag_sub(dst, src, res);
261: flag.H = hflag_sub(dst, src) | hflag_sub(dst - src, cin);
262: flag.N = true;
263: out_testdata_run2(dst, inflag, src, res, flag);
264: }
265: }
266: }
267: out(" defb 0,0,0,0,0FFH\n");
268: out("\n");
269: }
270:
271: static void
272: gentest_and()
273: {
274: init("and", "testrun2");
275:
276: out("testexec_%s:\n", name);
277: out(" AND D\n");
278: out(" RET\n");
279:
280: out_testset(name);
281:
282: for (auto dst : values2) {
283: for (auto src : values2) {
284: uint32 res32 = dst & src;
285: uint8 res = res32;
286: hd64180flag inflag;
287: inflag.H = false;
288: inflag.N = true;
289: inflag.C = true;
290: hd64180flag flag;
291: flag.Z = (res == 0);
292: flag.S = ((res & 0x80) != 0);
293: flag.C = false;
294: flag.PV = pflag(res);
295: flag.H = true;
296: flag.N = false;
297: out_testdata_run2(dst, inflag, src, res, flag);
298: }
299: }
300: out(" defb 0,0,0,0,0FFH\n");
301: out("\n");
302: }
303:
304: static void
305: gentest_or()
306: {
307: init("or", "testrun2");
308:
309: out("testexec_%s:\n", name);
310: out(" OR D\n");
311: out(" RET\n");
312:
313: out_testset(name);
314:
315: for (auto dst : values2) {
316: for (auto src : values2) {
317: uint32 res32 = dst | src;
318: uint8 res = res32;
319: hd64180flag inflag;
320: inflag.H = true;
321: inflag.N = true;
322: inflag.C = true;
323: hd64180flag flag;
324: flag.Z = (res == 0);
325: flag.S = ((res & 0x80) != 0);
326: flag.C = false;
327: flag.PV = pflag(res);
328: flag.H = false;
329: flag.N = false;
330: out_testdata_run2(dst, inflag, src, res, flag);
331: }
332: }
333: out(" defb 0,0,0,0,0FFH\n");
334: out("\n");
335: }
336:
337: static void
338: gentest_xor()
339: {
340: init("xor", "testrun2");
341:
342: out("testexec_%s:\n", name);
343: out(" XOR D\n");
344: out(" RET\n");
345:
346: out_testset(name);
347:
348: for (auto dst : values2) {
349: for (auto src : values2) {
350: uint32 res32 = dst ^ src;
351: uint8 res = res32;
352: hd64180flag inflag;
353: inflag.H = true;
354: inflag.N = true;
355: inflag.C = true;
356: hd64180flag flag;
357: flag.Z = (res == 0);
358: flag.S = ((res & 0x80) != 0);
359: flag.C = false;
360: flag.PV = pflag(res);
361: flag.H = false;
362: flag.N = false;
363: out_testdata_run2(dst, inflag, src, res, flag);
364: }
365: }
366: out(" defb 0,0,0,0,0FFH\n");
367: out("\n");
368: }
369:
370: static void
371: gentest_cp()
372: {
373: init("cp", "testrun2");
374:
375: out("testexec_%s:\n", name);
376: out(" CP D\n");
377: out(" RET\n");
378:
379: out_testset(name);
380:
381: for (auto dst : values1) {
382: for (auto src : values1) {
383: uint32 res32 = dst - src;
384: uint8 res = res32;
385: hd64180flag inflag;
386: inflag.N = false;
387: hd64180flag flag;
388: flag.Z = (res == 0);
389: flag.S = ((res & 0x80) != 0);
390: flag.C = ((res32 & 0x0100) != 0);
391: flag.PV = vflag_sub(dst, src, res);
392: flag.H = hflag_sub(dst, src);
393: flag.N = true;
394: out_testdata_run2(dst, inflag, src, dst, flag);
395: }
396: }
397: out(" defb 0,0,0,0,0FFH\n");
398: out("\n");
399: }
400:
401: static void
402: gentest_inc()
403: {
404: init("inc", "testrun1");
405:
406: out("testexec_%s:\n", name);
407: out(" INC A\n");
408: out(" RET\n");
409:
410: out_testset(name);
411:
412: for (auto dst : values1) {
413: for (int cin = 0; cin <= 1; cin++) {
414: uint32 res32 = dst + 1;
415: uint8 res = res32;
416: hd64180flag inflag;
417: inflag.C = cin;
418: inflag.N = true;
419: hd64180flag flag;
420: flag.Z = (res == 0);
421: flag.S = ((res & 0x80) != 0);
422: flag.C = cin;
423: flag.PV = vflag_add(dst, 1, res);
424: flag.H = hflag_add(dst, 1);
425: flag.N = false;
426: out_testdata_run1(dst, inflag, res, flag);
427: }
428: }
429: out(" defb 0,0,0,0FFH\n");
430: out("\n");
431: }
432:
433: static void
434: gentest_dec()
435: {
436: init("dec", "testrun1");
437:
438: out("testexec_%s:\n", name);
439: out(" DEC A\n");
440: out(" RET\n");
441:
442: out_testset(name);
443:
444: for (auto dst : values1) {
445: for (int cin = 0; cin <= 1; cin++) {
446: uint32 res32 = dst - 1;
447: uint8 res = res32;
448: hd64180flag inflag;
449: inflag.C = cin;
450: inflag.N = false;
451: hd64180flag flag;
452: flag.Z = (res == 0);
453: flag.S = ((res & 0x80) != 0);
454: flag.C = cin;
455: flag.PV = vflag_sub(dst, 1, res);
456: flag.H = hflag_sub(dst, 1);
457: flag.N = true;
458: out_testdata_run1(dst, inflag, res, flag);
459: }
460: }
461: out(" defb 0,0,0,0FFH\n");
462: out("\n");
463: }
464:
465: static void
466: gentest_neg()
467: {
468: init("neg", "testrun1");
469:
470: out("testexec_%s:\n", name);
471: out(" NEG\n");
472: out(" RET\n");
473:
474: out_testset(name);
475:
476: for (auto dst : values1) {
477: uint32 res32 = 0 - dst;
478: uint8 res = res32;
479: hd64180flag inflag;
480: inflag.N = false;
481: hd64180flag flag;
482: flag.Z = (res == 0);
483: flag.S = ((res & 0x80) != 0);
484: flag.C = ((res32 & 0x100) != 0);
485: flag.PV = vflag_sub(0, dst, res);
486: flag.H = hflag_sub(0, dst);
487: flag.N = true;
488: out_testdata_run1(dst, inflag, res, flag);
489: }
490: out(" defb 0,0,0,0FFH\n");
491: out("\n");
492: }
493:
494: static void
495: gentest_cpl()
496: {
497: init("cpl", "testrun1");
498:
499: out("testexec_%s:\n", name);
500: out(" CPL\n");
501: out(" RET\n");
502:
503: out_testset(name);
504:
505: bool fin = false;
506: for (auto dst : values2) {
507: fin = !fin;
508: uint32 res32 = ~dst;
509: uint8 res = res32;
510: hd64180flag inflag;
511: inflag.Z = fin;
512: inflag.S = fin;
513: inflag.C = fin;
514: inflag.PV = fin;
515: inflag.N = false;
516: inflag.H = false;
517: hd64180flag flag;
518: flag.Z = fin;
519: flag.S = fin;
520: flag.C = fin;
521: flag.PV = fin;
522: flag.H = true;
523: flag.N = true;
524: out_testdata_run1(dst, inflag, res, flag);
525: }
526: out(" defb 0,0,0,0FFH\n");
527: out("\n");
528: }
529:
530: static void
531: gentest_rla()
532: {
533: init("rla", "testrun1");
534:
535: out("testexec_%s:\n", name);
536: out(" RLA\n");
537: out(" RET\n");
538:
539: out_testset(name);
540:
541: bool fin = false;
542: for (auto dst : values2) {
543: fin = !fin;
544: for (int cin = 0; cin <= 1; cin++) {
545: uint32 res32 = dst << 1;
546: res32 |= cin;
547: uint8 res = res32;
548: hd64180flag inflag;
549: inflag.Z = fin;
550: inflag.S = fin;
551: inflag.C = cin;
552: inflag.PV = fin;
553: inflag.N = true;
554: inflag.H = true;
555: hd64180flag flag;
556: flag.Z = fin;
557: flag.S = fin;
558: flag.C = ((res32 & 0x100) != 0);
559: flag.PV = fin;
560: flag.H = false;
561: flag.N = false;
562: out_testdata_run1(dst, inflag, res, flag);
563: }
564: }
565: out(" defb 0,0,0,0FFH\n");
566: out("\n");
567: }
568:
569: static void
570: gentest_rra()
571: {
572: init("rra", "testrun1");
573:
574: out("testexec_%s:\n", name);
575: out(" RRA\n");
576: out(" RET\n");
577:
578: out_testset(name);
579:
580: bool fin = false;
581: for (auto dst : values2) {
582: fin = !fin;
583: for (int cin = 0; cin <= 1; cin++) {
584: uint32 res32 = dst >> 1;
585: res32 |= cin ? 0x80 : 0;
586: uint8 res = res32;
587: hd64180flag inflag;
588: inflag.Z = fin;
589: inflag.S = fin;
590: inflag.C = cin;
591: inflag.PV = fin;
592: inflag.N = true;
593: inflag.H = true;
594: hd64180flag flag;
595: flag.Z = fin;
596: flag.S = fin;
597: flag.C = ((dst & 1) != 0);
598: flag.PV = fin;
599: flag.H = false;
600: flag.N = false;
601: out_testdata_run1(dst, inflag, res, flag);
602: }
603: }
604: out(" defb 0,0,0,0FFH\n");
605: out("\n");
606: }
607:
608: static void
609: gentest_rlca()
610: {
611: init("rlca", "testrun1");
612:
613: out("testexec_%s:\n", name);
614: out(" RLCA\n");
615: out(" RET\n");
616:
617: out_testset(name);
618:
619: bool fin = false;
620: for (auto dst : values2) {
621: fin = !fin;
622: uint32 res32 = dst << 1;
623: res32 |= (res32 >> 8);
624: uint8 res = res32;
625: hd64180flag inflag;
626: inflag.Z = fin;
627: inflag.S = fin;
628: inflag.PV = fin;
629: inflag.N = true;
630: inflag.H = true;
631: hd64180flag flag;
632: flag.Z = fin;
633: flag.S = fin;
634: flag.C = ((res32 & 0x100) != 0);
635: flag.PV = fin;
636: flag.H = false;
637: flag.N = false;
638: out_testdata_run1(dst, inflag, res, flag);
639: }
640: out(" defb 0,0,0,0FFH\n");
641: out("\n");
642: }
643:
644: static void
645: gentest_rrca()
646: {
647: init("rrca", "testrun1");
648:
649: out("testexec_%s:\n", name);
650: out(" RRCA\n");
651: out(" RET\n");
652:
653: out_testset(name);
654:
655: bool fin = false;
656: for (auto dst : values2) {
657: fin = !fin;
658: uint32 res32 = dst >> 1;
659: res32 |= dst << 7;
660: uint8 res = res32;
661: hd64180flag inflag;
662: inflag.Z = fin;
663: inflag.S = fin;
664: inflag.PV = fin;
665: inflag.N = true;
666: inflag.H = true;
667: hd64180flag flag;
668: flag.Z = fin;
669: flag.S = fin;
670: flag.C = ((dst & 1) != 0);
671: flag.PV = fin;
672: flag.H = false;
673: flag.N = false;
674: out_testdata_run1(dst, inflag, res, flag);
675: }
676: out(" defb 0,0,0,0FFH\n");
677: out("\n");
678: }
679:
680: static void
681: gentest_rl()
682: {
683: init("rl", "testrun1");
684:
685: out("testexec_%s:\n", name);
686: out(" RL A\n");
687: out(" RET\n");
688:
689: out_testset(name);
690:
691: for (auto dst : values2) {
692: for (int cin = 0; cin <= 1; cin++) {
693: uint32 res32 = dst << 1;
694: res32 |= cin;
695: uint8 res = res32;
696: hd64180flag inflag;
697: inflag.C = cin;
698: inflag.N = true;
699: inflag.H = true;
700: hd64180flag flag;
701: flag.Z = (res == 0);
702: flag.S = ((res & 0x80) != 0);
703: flag.C = ((res32 & 0x100) != 0);
704: flag.PV = pflag(res);
705: flag.H = false;
706: flag.N = false;
707: out_testdata_run1(dst, inflag, res, flag);
708: }
709: }
710: out(" defb 0,0,0,0FFH\n");
711: out("\n");
712: }
713:
714: static void
715: gentest_rr()
716: {
717: init("rr", "testrun1");
718:
719: out("testexec_%s:\n", name);
720: out(" RR A\n");
721: out(" RET\n");
722:
723: out_testset(name);
724:
725: for (auto dst : values2) {
726: for (int cin = 0; cin <= 1; cin++) {
727: uint32 res32 = dst >> 1;
728: res32 |= cin ? 0x80 : 0;
729: uint8 res = res32;
730: hd64180flag inflag;
731: inflag.C = cin;
732: inflag.N = true;
733: inflag.H = true;
734: hd64180flag flag;
735: flag.Z = (res == 0);
736: flag.S = ((res & 0x80) != 0);
737: flag.C = ((dst & 1) != 0);
738: flag.PV = pflag(res);
739: flag.H = false;
740: flag.N = false;
741: out_testdata_run1(dst, inflag, res, flag);
742: }
743: }
744: out(" defb 0,0,0,0FFH\n");
745: out("\n");
746: }
747:
748: static void
749: gentest_rlc()
750: {
751: init("rlc", "testrun1");
752:
753: out("testexec_%s:\n", name);
754: out(" RLC A\n");
755: out(" RET\n");
756:
757: out_testset(name);
758:
759: for (auto dst : values2) {
760: uint32 res32 = dst << 1;
761: res32 |= (res32 >> 8);
762: uint8 res = res32;
763: hd64180flag inflag;
764: inflag.N = true;
765: inflag.H = true;
766: hd64180flag flag;
767: flag.Z = (res == 0);
768: flag.S = ((res & 0x80) != 0);
769: flag.C = ((res32 & 0x100) != 0);
770: flag.PV = pflag(res);
771: flag.H = false;
772: flag.N = false;
773: out_testdata_run1(dst, inflag, res, flag);
774: }
775: out(" defb 0,0,0,0FFH\n");
776: out("\n");
777: }
778:
779: static void
780: gentest_rrc()
781: {
782: init("rrc", "testrun1");
783:
784: out("testexec_%s:\n", name);
785: out(" RRC A\n");
786: out(" RET\n");
787:
788: out_testset(name);
789:
790: for (auto dst : values2) {
791: uint32 res32 = dst >> 1;
792: res32 |= dst << 7;
793: uint8 res = res32;
794: hd64180flag inflag;
795: inflag.N = true;
796: inflag.H = true;
797: hd64180flag flag;
798: flag.Z = (res == 0);
799: flag.S = ((res & 0x80) != 0);
800: flag.C = ((dst & 1) != 0);
801: flag.PV = pflag(res);
802: flag.H = false;
803: flag.N = false;
804: out_testdata_run1(dst, inflag, res, flag);
805: }
806: out(" defb 0,0,0,0FFH\n");
807: out("\n");
808: }
809:
810: static void
811: gentest_sla()
812: {
813: init("sla", "testrun1");
814:
815: out("testexec_%s:\n", name);
816: out(" SLA A\n");
817: out(" RET\n");
818:
819: out_testset(name);
820:
821: for (auto dst : values2) {
822: uint32 res32 = dst << 1;
823: uint8 res = res32;
824: hd64180flag inflag;
825: inflag.N = true;
826: inflag.H = true;
827: hd64180flag flag;
828: flag.Z = (res == 0);
829: flag.S = ((res & 0x80) != 0);
830: flag.C = ((res32 & 0x100) != 0);
831: flag.PV = pflag(res);
832: flag.H = false;
833: flag.N = false;
834: out_testdata_run1(dst, inflag, res, flag);
835: }
836: out(" defb 0,0,0,0FFH\n");
837: out("\n");
838: }
839:
840: static void
841: gentest_sra()
842: {
843: init("sra", "testrun1");
844:
845: out("testexec_%s:\n", name);
846: out(" SRA A\n");
847: out(" RET\n");
848:
849: out_testset(name);
850:
851: for (auto dst : values2) {
852: uint32 res32 = dst >> 1;
853: res32 |= (dst & 0x80);
854: uint8 res = res32;
855: hd64180flag inflag;
856: inflag.N = true;
857: inflag.H = true;
858: hd64180flag flag;
859: flag.Z = (res == 0);
860: flag.S = ((res & 0x80) != 0);
861: flag.C = ((dst & 1) != 0);
862: flag.PV = pflag(res);
863: flag.H = false;
864: flag.N = false;
865: out_testdata_run1(dst, inflag, res, flag);
866: }
867: out(" defb 0,0,0,0FFH\n");
868: out("\n");
869: }
870:
871: static void
872: gentest_srl()
873: {
874: init("srl", "testrun1");
875:
876: out("testexec_%s:\n", name);
877: out(" SRL A\n");
878: out(" RET\n");
879:
880: out_testset(name);
881:
882: for (auto dst : values2) {
883: uint32 res32 = dst >> 1;
884: uint8 res = res32;
885: hd64180flag inflag;
886: inflag.N = true;
887: inflag.H = true;
888: hd64180flag flag;
889: flag.Z = (res == 0);
890: flag.S = ((res & 0x80) != 0);
891: flag.C = ((dst & 1) != 0);
892: flag.PV = pflag(res);
893: flag.H = false;
894: flag.N = false;
895: out_testdata_run1(dst, inflag, res, flag);
896: }
897: out(" defb 0,0,0,0FFH\n");
898: out("\n");
899: }
900:
901: static void
902: out(const char *fmt, ...)
903: {
904: va_list ap;
905:
906: va_start(ap, fmt);
907: vprintf(fmt, ap);
908: va_end(ap);
909: }
910:
911: int
912: main(int ac, char *av[])
913: {
914: out(" org 0100H\n");
915: out(" JP main\n");
916: out("\n");
917:
918: gentest_add();
919: gentest_adc();
920: gentest_sub();
921: gentest_sbc();
922: gentest_and();
923: gentest_or();
924: gentest_xor();
925: gentest_cp();
926:
927: gentest_inc();
928: gentest_dec();
929: gentest_neg();
930: gentest_cpl();
931:
932: gentest_rla();
933: gentest_rra();
934: gentest_rlca();
935: gentest_rrca();
936:
937: gentest_rl();
938: gentest_rr();
939: gentest_rlc();
940: gentest_rrc();
941: gentest_sla();
942: gentest_sra();
943: gentest_srl();
944:
945: out("main:\n");
946: for (auto name : testlist) {
947: out(" CALL test_%s\n", name.c_str());
948: }
949: out(" RET\n");
950: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.