Annotation of nono/exp/optestxp/optestxp_gen.cpp, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.