Annotation of nono/exp/optestxp/optestxp_gen.cpp, revision 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.