Annotation of nono/hd64180/hd64180disasm.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2022 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: //
        !             8: // HD64180 逆アセンブラ
        !             9: //
        !            10: 
        !            11: #include "hd64180disasm.h"
        !            12: #include "debugger_memory.h"
        !            13: 
        !            14: #define OP_DEF(name)   void __CONCAT(hd64180disasm::op_,name)()
        !            15: #define OP_FUNC(name)  __CONCAT(op_,name)()
        !            16: 
        !            17: // コンストラクタ
        !            18: hd64180disasm::hd64180disasm()
        !            19: {
        !            20: }
        !            21: 
        !            22: // デストラクタ
        !            23: hd64180disasm::~hd64180disasm()
        !            24: {
        !            25: }
        !            26: 
        !            27: // 逆アセンブルを実行
        !            28: bool
        !            29: hd64180disasm::Exec(DebuggerMemoryStream *mem_)
        !            30: {
        !            31:        ExecInit(mem_);
        !            32: 
        !            33:        name.clear();
        !            34:        arg1.clear();
        !            35:        arg2.clear();
        !            36: 
        !            37:        ppc = (uint32)mem->laddr;
        !            38:        ixiy = USE_HL;
        !            39:        ixd = (uint32)-1;
        !            40:        // 1バイト目処理
        !            41:        op = fetch8();
        !            42:        switch (op) {
        !            43: #include "hd64180switch_00.inc"
        !            44:         default:
        !            45:                __unreachable();
        !            46:        }
        !            47: 
        !            48:        // 出力文字列(ダンプ)
        !            49:        dump = string_format("%02x ", bin[0]);
        !            50:        for (int i = 1; i < bin.size(); i++) {
        !            51:                dump += string_format("%02x ", bin[i]);
        !            52:        }
        !            53:        if (bin.size() < 5) {
        !            54:                dump += std::string(15 - bin.size() * 3, ' ');
        !            55:        }
        !            56: 
        !            57:        // 出力文字列(命令)
        !            58:        text = name;
        !            59: 
        !            60:        // arg2 だけがあるという状態は認めないが、
        !            61:        // ここでシフトしておけばいいか。
        !            62:        if (__predict_false(!arg2.empty() && arg1.empty())) {
        !            63:                arg1 = arg2;
        !            64:                arg2.clear();
        !            65:        }
        !            66: 
        !            67:        // arg1 があればインデントして追加
        !            68:        if (!arg1.empty()) {
        !            69:                int len = text.length();
        !            70:                if (len < 8) {
        !            71:                        text += std::string(8 - len, ' ');
        !            72:                } else {
        !            73:                        text += ' ';
        !            74:                }
        !            75: 
        !            76:                text += arg1;
        !            77:        }
        !            78: 
        !            79:        // arg2 があればカンマで区切って追加
        !            80:        if (!arg2.empty()) {
        !            81:                text += ",";
        !            82:                text += arg2;
        !            83:        }
        !            84: 
        !            85:        return true;
        !            86: }
        !            87: 
        !            88: // バイトフェッチ
        !            89: uint8
        !            90: hd64180disasm::fetch8()
        !            91: {
        !            92:        uint8 data = mem->Read(1);
        !            93:        bin.push_back(data);
        !            94:        return data;
        !            95: }
        !            96: 
        !            97: // ワードフェッチ
        !            98: uint16
        !            99: hd64180disasm::fetch16()
        !           100: {
        !           101:        uint16 data;
        !           102: 
        !           103:        data  = fetch8();
        !           104:        data |= fetch8() << 8;
        !           105: 
        !           106:        return data;
        !           107: }
        !           108: 
        !           109: 
        !           110: // ixiy に応じて HL/IX/IY のレジスタ名を返す。
        !           111: std::string
        !           112: hd64180disasm::HL()
        !           113: {
        !           114:        static const char *name[] = {
        !           115:                "HL",
        !           116:                "IX",
        !           117:                "IY",
        !           118:        };
        !           119:        return name[(int)ixiy];
        !           120: }
        !           121: 
        !           122: // (HL)/(IX+d)/(IY+d) を出力する。
        !           123: std::string
        !           124: hd64180disasm::HLin()
        !           125: {
        !           126:        if (ixiy) {
        !           127:                // ixd を読むタイミングが DD CB の時だけ違う。
        !           128:                if ((int32)ixd < 0) {
        !           129:                        ixd = fetch8();
        !           130:                }
        !           131:                if (ixd < 0x80) {
        !           132:                        return string_format("(%s+%02XH)", HL().c_str(), ixd);
        !           133:                } else {
        !           134:                        int v = -(int)(int8)ixd;
        !           135:                        return string_format("(%s-%02XH)", HL().c_str(), v);
        !           136:                }
        !           137:        } else {
        !           138:                return "(HL)";
        !           139:        }
        !           140: }
        !           141: 
        !           142: #define op_ww  (((op) >> 4) & 3)
        !           143: #define op_zz  (((op) >> 4) & 3)
        !           144: #define op_fff (((op) >> 3) & 7)
        !           145: #define op_bbb (((op) >> 3) & 7)
        !           146: #define op_rrr (((op) >> 3) & 7)
        !           147: #define op_sss ( (op)       & 7)
        !           148: 
        !           149: // ww のレジスタ名を返す。HL は必要に応じて IX, IY を出力する。
        !           150: std::string
        !           151: hd64180disasm::ww()
        !           152: {
        !           153:        static const char * const wwnames[] = {
        !           154:                "BC",
        !           155:                "DE",
        !           156:                "HL?",  // 参照されないはず
        !           157:                "SP",
        !           158:        };
        !           159: 
        !           160:        uint r = op_ww;
        !           161:        if (r == 2) {
        !           162:                return HL();
        !           163:        } else {
        !           164:                return std::string(wwnames[r]);
        !           165:        }
        !           166: }
        !           167: 
        !           168: // ww のレジスタ間接名 ("(BC)"形式) を返す。
        !           169: // (HL) は必要に応じて (IX+d)、(IY+d) を出力する。
        !           170: std::string
        !           171: hd64180disasm::wwin()
        !           172: {
        !           173:        uint r = op_ww;
        !           174:        if (r == 2) {
        !           175:                return HLin();
        !           176:        } else {
        !           177:                return "(" + ww() + ")";
        !           178:        }
        !           179: }
        !           180: 
        !           181: // zz レジスタの "BC", "DE", "HL" を返す。
        !           182: // "AF" は独立してるのでここでは扱わない。
        !           183: std::string
        !           184: hd64180disasm::zz()
        !           185: {
        !           186:        static const char * const zznames[] = {
        !           187:                "BC",
        !           188:                "DE",
        !           189:                // HL は参照されないはず
        !           190:        };
        !           191: 
        !           192:        uint r = op_zz;
        !           193:        if (r == 2) {
        !           194:                return HL();
        !           195:        } else {
        !           196:                return std::string(zznames[r]);
        !           197:        }
        !           198: }
        !           199: 
        !           200: // rrr (!=%110) のレジスタ名を返す。
        !           201: std::string
        !           202: hd64180disasm::rrr()
        !           203: {
        !           204:        return rrrsss(op_rrr);
        !           205: }
        !           206: 
        !           207: // sss (!=%110) のレジスタ名を返す。
        !           208: std::string
        !           209: hd64180disasm::sss()
        !           210: {
        !           211:        return rrrsss(op_sss);
        !           212: }
        !           213: 
        !           214: // rrr/sss (!=%110) のレジスタ名を返す。
        !           215: std::string
        !           216: hd64180disasm::rrrsss(uint r)
        !           217: {
        !           218:        static const char rrrnames[] = "BCDEHL?A";
        !           219: 
        !           220:        if (__predict_true(ixiy == USE_HL)) {
        !           221:                return std::string(1, rrrnames[r]);
        !           222:        } else {
        !           223:                switch (r) {
        !           224:                 case 4:        return HL() + "H";
        !           225:                 case 5:        return HL() + "L";
        !           226:                 default:       return std::string(1, rrrnames[r]);
        !           227:                }
        !           228:        }
        !           229: }
        !           230: 
        !           231: std::string
        !           232: hd64180disasm::fff() const
        !           233: {
        !           234:        static const char *name[] = {
        !           235:                "NZ",
        !           236:                "Z",
        !           237:                "NC",
        !           238:                "C",
        !           239:                "PO",
        !           240:                "PE",
        !           241:                "P",
        !           242:                "M",
        !           243:        };
        !           244:        uint r = op_fff;
        !           245:        return name[r];
        !           246: }
        !           247: 
        !           248: std::string
        !           249: hd64180disasm::bbb() const
        !           250: {
        !           251:        uint b = op_bbb;
        !           252:        return std::string(1, '0' + b);
        !           253: }
        !           254: 
        !           255: std::string
        !           256: hd64180disasm::imm8()
        !           257: {
        !           258:        uint8 imm = fetch8();
        !           259:        if (imm < 0xa0) {
        !           260:                return string_format("%02XH", imm);
        !           261:        } else {
        !           262:                return string_format("0%02XH", imm);
        !           263:        }
        !           264: }
        !           265: 
        !           266: std::string
        !           267: hd64180disasm::imm16()
        !           268: {
        !           269:        uint16 imm = fetch16();
        !           270:        if (imm < 0xa000) {
        !           271:                return string_format("%04XH", imm);
        !           272:        } else {
        !           273:                return string_format("0%04XH", imm);
        !           274:        }
        !           275: }
        !           276: 
        !           277: std::string
        !           278: hd64180disasm::disp8()
        !           279: {
        !           280:        int8 disp = (int8)fetch8();
        !           281:        // 外部的な表記はこの命令位置 + 2 となっているが、実際には
        !           282:        // disp をフェッチした後の PC が起点になっているということのはず。
        !           283:        uint32 pc = (uint32)mem->laddr;
        !           284:        uint32 addr = pc + disp;
        !           285:        if (addr < 0xa000) {
        !           286:                return string_format("%04XH", addr);
        !           287:        } else {
        !           288:                return string_format("0%04XH", addr);
        !           289:        }
        !           290: }
        !           291: 
        !           292: // 不当命令
        !           293: OP_DEF(illegal)
        !           294: {
        !           295:        name = "<illegal instruction>";
        !           296: }
        !           297: 
        !           298: // エミュレータ的未実装
        !           299: OP_DEF(undef)
        !           300: {
        !           301:        name = "<not implemented?>";
        !           302: }
        !           303: 
        !           304: // 00000000: NOP
        !           305: OP_DEF(nop)
        !           306: {
        !           307:        name = "NOP";
        !           308: }
        !           309: 
        !           310: //    00ww0001: LD ww,nn
        !           311: // DD:00100001: LD IX,nn
        !           312: OP_DEF(ld_ww_nn)
        !           313: {
        !           314:        name = "LD";
        !           315:        arg1 = ww();
        !           316:        arg2 = imm16();
        !           317: }
        !           318: 
        !           319: // 00ww0010: LD (ww),A
        !           320: OP_DEF(ld_wwin_a)
        !           321: {
        !           322:        name = "LD";
        !           323:        arg1 = wwin();
        !           324:        arg2 = "A";
        !           325: }
        !           326: 
        !           327: //    00ww0011: INC ww
        !           328: // DD:00100011: INC IX
        !           329: OP_DEF(inc_ww)
        !           330: {
        !           331:        name = "INC";
        !           332:        arg1 = ww();
        !           333: }
        !           334: 
        !           335: // 00rrr100: INC r
        !           336: OP_DEF(inc_r)
        !           337: {
        !           338:        name = "INC";
        !           339:        arg1 = rrr();
        !           340: }
        !           341: 
        !           342: // 00rrr101: DEC r
        !           343: OP_DEF(dec_r)
        !           344: {
        !           345:        name = "DEC";
        !           346:        arg1 = rrr();
        !           347: }
        !           348: 
        !           349: // 00rrr110: LD r,n
        !           350: OP_DEF(ld_r_n)
        !           351: {
        !           352:        name = "LD";
        !           353:        arg1 = rrr();
        !           354:        arg2 = imm8();
        !           355: }
        !           356: 
        !           357: // 00000111: RLCA
        !           358: OP_DEF(rlca)
        !           359: {
        !           360:        name = "RLCA";
        !           361: }
        !           362: 
        !           363: // 00001000: EX AF,AF'
        !           364: OP_DEF(ex_af_af)
        !           365: {
        !           366:        name = "EX";
        !           367:        arg1 = "AF";
        !           368:        arg2 = "AF'";
        !           369: }
        !           370: 
        !           371: //    00ww1001: ADD HL,ww
        !           372: // DD:00ww1001: ADD IX,ww
        !           373: OP_DEF(add_hl_ww)
        !           374: {
        !           375:        name = "ADD";
        !           376:        arg1 = HL();
        !           377:        arg2 = ww();
        !           378: }
        !           379: 
        !           380: // 00ww1010: LD A,(ww)
        !           381: OP_DEF(ld_a_wwin)
        !           382: {
        !           383:        name = "LD";
        !           384:        arg1 = "A";
        !           385:        arg2 = wwin();
        !           386: }
        !           387: 
        !           388: //    00ww1011: DEC ww
        !           389: // DD:00101011: DEC IX
        !           390: OP_DEF(dec_ww)
        !           391: {
        !           392:        name = "DEC";
        !           393:        arg1 = ww();
        !           394: }
        !           395: 
        !           396: // 00001111: RRCA
        !           397: OP_DEF(rrca)
        !           398: {
        !           399:        name = "RRCA";
        !           400: }
        !           401: 
        !           402: // 00010000: DJNZ n
        !           403: OP_DEF(djnz)
        !           404: {
        !           405:        name = "DJNZ";
        !           406:        arg1 = disp8();
        !           407: }
        !           408: 
        !           409: // 00010111: RLA
        !           410: OP_DEF(rla)
        !           411: {
        !           412:        name = "RLA";
        !           413: }
        !           414: 
        !           415: // 00011000: JR n
        !           416: OP_DEF(jr)
        !           417: {
        !           418:        name = "JR";
        !           419:        arg1 = disp8();
        !           420: }
        !           421: 
        !           422: // 00011111: RRA
        !           423: OP_DEF(rra)
        !           424: {
        !           425:        name = "RRA";
        !           426: }
        !           427: 
        !           428: // 00100000: JR NZ,n
        !           429: OP_DEF(jr_nz)
        !           430: {
        !           431:        name = "JR";
        !           432:        arg1 = "NZ";
        !           433:        arg2 = disp8();
        !           434: }
        !           435: 
        !           436: //    00100010: LD (nn),HL
        !           437: // DD:00100010: LD (nn),IX
        !           438: OP_DEF(ld_nnin_hl)
        !           439: {
        !           440:        name = "LD";
        !           441:        arg1 = "(" + imm16() + ")";
        !           442:        arg2 = HL();
        !           443: }
        !           444: 
        !           445: // 00100111: DAA
        !           446: OP_DEF(daa)
        !           447: {
        !           448:        name = "DAA";
        !           449: }
        !           450: 
        !           451: // 00101000: JR Z,n
        !           452: OP_DEF(jr_z)
        !           453: {
        !           454:        name = "JR";
        !           455:        arg1 = "Z";
        !           456:        arg2 = disp8();
        !           457: }
        !           458: 
        !           459: //    00101010: LD HL,(nn)
        !           460: // DD:00101010: LD IX,(nn)
        !           461: OP_DEF(ld_hl_nnin)
        !           462: {
        !           463:        name = "LD";
        !           464:        arg1 = HL();
        !           465:        arg2 = "(" + imm16() + ")";
        !           466: }
        !           467: 
        !           468: // 00101111: CPL
        !           469: OP_DEF(cpl)
        !           470: {
        !           471:        name = "CPL";
        !           472: }
        !           473: 
        !           474: // 00110000: JR NC,n
        !           475: OP_DEF(jr_nc)
        !           476: {
        !           477:        name = "JR";
        !           478:        arg1 = "NC";
        !           479:        arg2 = disp8();
        !           480: }
        !           481: 
        !           482: // 00110010: LD (nn),A
        !           483: OP_DEF(ld_nnin_a)
        !           484: {
        !           485:        name = "LD";
        !           486:        arg1 = "(" + imm16() + ")";
        !           487:        arg2 = "A";
        !           488: }
        !           489: 
        !           490: //    00110100: INC (HL)
        !           491: // DD:00110100: INC (IX+d)
        !           492: OP_DEF(inc_hlin)
        !           493: {
        !           494:        name = "INC";
        !           495:        arg1 = HLin();
        !           496: }
        !           497: 
        !           498: //    00110101: DEC (HL)
        !           499: // DD:00110101: DEC (IX+d)
        !           500: OP_DEF(dec_hlin)
        !           501: {
        !           502:        name = "DEC";
        !           503:        arg1 = HLin();
        !           504: }
        !           505: 
        !           506: //    00110110: LD (HL),n
        !           507: // DD:00110110: LD (IX+d),n
        !           508: OP_DEF(ld_hlin_n)
        !           509: {
        !           510:        name = "LD";
        !           511:        arg1 = HLin();
        !           512:        arg2 = imm8();
        !           513: }
        !           514: 
        !           515: // 00110111: SCF
        !           516: OP_DEF(scf)
        !           517: {
        !           518:        name = "SCF";
        !           519: }
        !           520: 
        !           521: // 00111000: JR C,n
        !           522: OP_DEF(jr_c)
        !           523: {
        !           524:        name = "JR";
        !           525:        arg1 = "C";
        !           526:        arg2 = disp8();
        !           527: }
        !           528: 
        !           529: // 00111010: LD A,(nn)
        !           530: OP_DEF(ld_a_nnin)
        !           531: {
        !           532:        name = "LD";
        !           533:        arg1 = "A";
        !           534:        arg2 = "(" + imm16() + ")";
        !           535: }
        !           536: 
        !           537: // 00111111: CCF
        !           538: OP_DEF(ccf)
        !           539: {
        !           540:        name = "CCF";
        !           541: }
        !           542: 
        !           543: // 01rrrsss: LD r,s
        !           544: OP_DEF(ld_r_s)
        !           545: {
        !           546:        name = "LD";
        !           547:        arg1 = rrr();
        !           548:        arg2 = sss();
        !           549: }
        !           550: 
        !           551: //    01rrr110: LD r,(HL)
        !           552: // DD:01rrr110: LD r,(IX+d)
        !           553: OP_DEF(ld_r_hlin)
        !           554: {
        !           555:        name = "LD";
        !           556:        arg1 = rrr();
        !           557:        arg2 = HLin();
        !           558: }
        !           559: 
        !           560: //    01110sss: LD (HL),s
        !           561: // DD:01110sss: LD (IX+d),s
        !           562: OP_DEF(ld_hlin_s)
        !           563: {
        !           564:        name = "LD";
        !           565:        arg1 = HLin();
        !           566:        arg2 = sss();
        !           567: }
        !           568: 
        !           569: // 01110110: HALT
        !           570: OP_DEF(halt)
        !           571: {
        !           572:        name = "HALT";
        !           573: }
        !           574: 
        !           575: // 10000rrr: ADD A,r
        !           576: OP_DEF(add_a_r)
        !           577: {
        !           578:        name = "ADD";
        !           579:        arg1 = "A";
        !           580:        arg2 = sss();
        !           581: }
        !           582: 
        !           583: //    10000110: ADD A,(HL)
        !           584: // DD:10000110: ADD A,(IX+d)
        !           585: OP_DEF(add_a_hlin)
        !           586: {
        !           587:        name = "ADD";
        !           588:        arg1 = "A";
        !           589:        arg2 = HLin();
        !           590: }
        !           591: 
        !           592: // 10001rrr: ADC A,r
        !           593: OP_DEF(adc_a_r)
        !           594: {
        !           595:        name = "ADC";
        !           596:        arg1 = "A";
        !           597:        arg2 = sss();
        !           598: }
        !           599: 
        !           600: //    10001110: ADC A,(HL)
        !           601: // DD:10001110: ADC A,(IX+d)
        !           602: OP_DEF(adc_a_hlin)
        !           603: {
        !           604:        name = "ADC";
        !           605:        arg1 = "A";
        !           606:        arg2 = HLin();
        !           607: }
        !           608: 
        !           609: // 10010rrr: SUB r
        !           610: OP_DEF(sub_r)
        !           611: {
        !           612:        name = "SUB";
        !           613:        arg1 = sss();
        !           614: }
        !           615: 
        !           616: //    10010110: SUB (HL)
        !           617: // DD:10010110: SUB (IX+d)
        !           618: OP_DEF(sub_hlin)
        !           619: {
        !           620:        name = "SUB";
        !           621:        arg1 = HLin();
        !           622: }
        !           623: 
        !           624: // 10011rrr: SBC A,r
        !           625: OP_DEF(sbc_a_r)
        !           626: {
        !           627:        name = "SBC";
        !           628:        arg1 = "A";
        !           629:        arg2 = sss();
        !           630: }
        !           631: 
        !           632: //    10011110: SBC A,(HL)
        !           633: // DD:10011110: SBC A,(IX+d)
        !           634: OP_DEF(sbc_a_hlin)
        !           635: {
        !           636:        name = "SBC";
        !           637:        arg1 = "A";
        !           638:        arg2 = HLin();
        !           639: }
        !           640: 
        !           641: // 10100rrr: AND r
        !           642: OP_DEF(and_r)
        !           643: {
        !           644:        name = "AND";
        !           645:        arg1 = sss();
        !           646: }
        !           647: 
        !           648: //    10100110: AND (HL)
        !           649: // DD:10100110: AND (IX+d)
        !           650: OP_DEF(and_hlin)
        !           651: {
        !           652:        name = "AND";
        !           653:        arg1 = HLin();
        !           654: }
        !           655: 
        !           656: // 10101rrr: XOR r
        !           657: OP_DEF(xor_r)
        !           658: {
        !           659:        name = "XOR";
        !           660:        arg1 = sss();
        !           661: }
        !           662: 
        !           663: //    10101110: XOR (HL)
        !           664: // DD:10101110: XOR (IX+d)
        !           665: OP_DEF(xor_hlin)
        !           666: {
        !           667:        name = "XOR";
        !           668:        arg1 = HLin();
        !           669: }
        !           670: 
        !           671: // 10110rrr: OR r
        !           672: OP_DEF(or_r)
        !           673: {
        !           674:        name = "OR";
        !           675:        arg1 = sss();
        !           676: }
        !           677: 
        !           678: //    10110110: OR (HL)
        !           679: // DD:10110110: OR (IX+d)
        !           680: OP_DEF(or_hlin)
        !           681: {
        !           682:        name = "OR";
        !           683:        arg1 = HLin();
        !           684: }
        !           685: 
        !           686: // 10111rrr: CP r
        !           687: OP_DEF(cp_r)
        !           688: {
        !           689:        name = "CP";
        !           690:        arg1 = sss();
        !           691: }
        !           692: 
        !           693: //    10111110: CP (HL)
        !           694: // DD:10111110: CP (IX+d)
        !           695: OP_DEF(cp_hlin)
        !           696: {
        !           697:        name = "CP";
        !           698:        arg1 = HLin();
        !           699: }
        !           700: 
        !           701: // 11fff000: RET f
        !           702: OP_DEF(ret_f)
        !           703: {
        !           704:        name = "RET";
        !           705:        arg1 = fff();
        !           706: }
        !           707: 
        !           708: //    11zz0001: POP zz
        !           709: // DD:11100001: POP IX
        !           710: OP_DEF(pop_zz)
        !           711: {
        !           712:        name = "POP";
        !           713:        arg1 = zz();
        !           714: }
        !           715: 
        !           716: // 11fff010: JP f,nn
        !           717: OP_DEF(jp_f_nn)
        !           718: {
        !           719:        name = "JP";
        !           720:        arg1 = fff();
        !           721:        arg2 = imm16();
        !           722: }
        !           723: 
        !           724: // 11000011: JP nn
        !           725: OP_DEF(jp_nn)
        !           726: {
        !           727:        name = "JP";
        !           728:        arg1 = imm16();
        !           729: }
        !           730: 
        !           731: // 11fff100: CALL f,nn
        !           732: OP_DEF(call_f_nn)
        !           733: {
        !           734:        name = "CALL";
        !           735:        arg1 = fff();
        !           736:        arg2 = imm16();
        !           737: }
        !           738: 
        !           739: //    11zz0101: PUSH zz
        !           740: // DD:11100101: PUSH IX
        !           741: OP_DEF(push_zz)
        !           742: {
        !           743:        name = "PUSH";
        !           744:        arg1 = zz();
        !           745: }
        !           746: 
        !           747: // 11000110: ADD A,n
        !           748: OP_DEF(add_a_n)
        !           749: {
        !           750:        name = "ADD";
        !           751:        arg1 = "A";
        !           752:        arg2 = imm8();
        !           753: }
        !           754: 
        !           755: // 11vvv111: RST v
        !           756: OP_DEF(rst)
        !           757: {
        !           758:        uint v = (op >> 3) & 7;
        !           759:        name = "RST";
        !           760:        arg1 = string_format("%02xH", v * 8);
        !           761: }
        !           762: 
        !           763: // 11001001: RET
        !           764: OP_DEF(ret)
        !           765: {
        !           766:        name = "RET";
        !           767: }
        !           768: 
        !           769: // 11001011: op_CB
        !           770: OP_DEF(cb)
        !           771: {
        !           772:        op = fetch8();
        !           773:        switch (op) {
        !           774: #include "hd64180switch_cb.inc"
        !           775:         default:
        !           776:                OP_FUNC(illegal);
        !           777:                break;
        !           778:        }
        !           779: }
        !           780: 
        !           781: // 11001101: CALL nn
        !           782: OP_DEF(call)
        !           783: {
        !           784:        name = "CALL";
        !           785:        arg1 = imm16();
        !           786: }
        !           787: 
        !           788: // 11001110: ADC A,n
        !           789: OP_DEF(adc_a_n)
        !           790: {
        !           791:        name = "ADC";
        !           792:        arg1 = "A";
        !           793:        arg2 = imm8();
        !           794: }
        !           795: 
        !           796: // 11010011: OUT (n),A
        !           797: OP_DEF(out_n_a)
        !           798: {
        !           799:        name = "OUT";
        !           800:        arg1 = "(" + imm8() + ")";
        !           801:        arg2 = "A";
        !           802: }
        !           803: 
        !           804: // 11010110: SUB n
        !           805: OP_DEF(sub_n)
        !           806: {
        !           807:        name = "SUB";
        !           808:        arg1 = imm8();
        !           809: }
        !           810: 
        !           811: // 11011001: EXX
        !           812: OP_DEF(exx)
        !           813: {
        !           814:        name = "EXX";
        !           815: }
        !           816: 
        !           817: // 11011011: IN A,(n)
        !           818: OP_DEF(in_a_n)
        !           819: {
        !           820:        name = "IN";
        !           821:        arg1 = "A";
        !           822:        arg2 = "(" + imm8() + ")";
        !           823: }
        !           824: 
        !           825: // DD/FD の共通部
        !           826: void
        !           827: hd64180disasm::ops_ddfd(ixiy_t xy)
        !           828: {
        !           829:        ixiy = xy;
        !           830: 
        !           831:        // 2バイト目をフェッチ
        !           832:        op = fetch8();
        !           833:        // で分岐
        !           834:        switch (op) {
        !           835: #include "hd64180switch_dd.inc"
        !           836:         default:
        !           837:                OP_FUNC(illegal);
        !           838:                break;
        !           839:        }
        !           840: }
        !           841: 
        !           842: // 11011101: op_DD
        !           843: OP_DEF(dd)
        !           844: {
        !           845:        ops_ddfd(USE_IX);
        !           846: }
        !           847: 
        !           848: // 11011110: SBC A,n
        !           849: OP_DEF(sbc_a_n)
        !           850: {
        !           851:        name = "SBC";
        !           852:        arg1 = "A";
        !           853:        arg2 = imm8();
        !           854: }
        !           855: 
        !           856: //    11100011: EX (SP),HL
        !           857: // DD:11100011: EX (SP),IX
        !           858: OP_DEF(ex_sp_hl)
        !           859: {
        !           860:        name = "EX";
        !           861:        arg1 = "(SP)";
        !           862:        arg2 = HL();
        !           863: }
        !           864: 
        !           865: // 11100110: AND n
        !           866: OP_DEF(and_n)
        !           867: {
        !           868:        name = "AND";
        !           869:        arg1 = imm8();
        !           870: }
        !           871: 
        !           872: //    11101001: JP (HL)
        !           873: // DD:11101001: JP (IX)
        !           874: OP_DEF(jp_hl)
        !           875: {
        !           876:        // これは DD/FD の時に (IX+d)/(IY+d) ではなく (IX)/(IY) になる
        !           877:        name = "JP";
        !           878:        arg1 = "(" + HL() + ")";
        !           879: }
        !           880: 
        !           881: // 11101011: EX DE,HL
        !           882: OP_DEF(ex_de_hl)
        !           883: {
        !           884:        name = "EX";
        !           885:        arg1 = "DE";
        !           886:        arg2 = "HL";
        !           887: }
        !           888: 
        !           889: // 11101101: op_ED
        !           890: OP_DEF(ed)
        !           891: {
        !           892:        op = fetch8();
        !           893:        switch (op) {
        !           894: #include "hd64180switch_ed.inc"
        !           895:         default:
        !           896:                OP_FUNC(illegal);
        !           897:                break;
        !           898:        }
        !           899: }
        !           900: 
        !           901: // 11101110: XOR n
        !           902: OP_DEF(xor_n)
        !           903: {
        !           904:        name = "XOR";
        !           905:        arg1 = imm8();
        !           906: }
        !           907: 
        !           908: // 11110001: POP AF
        !           909: OP_DEF(pop_af)
        !           910: {
        !           911:        name = "POP";
        !           912:        arg1 = "AF";
        !           913: }
        !           914: 
        !           915: // 11110011: DI
        !           916: OP_DEF(di)
        !           917: {
        !           918:        name = "DI";
        !           919: }
        !           920: 
        !           921: // 11110101: PUSH AF
        !           922: OP_DEF(push_af)
        !           923: {
        !           924:        name = "PUSH";
        !           925:        arg1 = "AF";
        !           926: }
        !           927: 
        !           928: // 11110110: OR n
        !           929: OP_DEF(or_n)
        !           930: {
        !           931:        name = "OR";
        !           932:        arg1 = imm8();
        !           933: }
        !           934: 
        !           935: //    11111001: LD SP,HL
        !           936: // DD:11111001: LD SP,IX
        !           937: OP_DEF(ld_sp_hl)
        !           938: {
        !           939:        name = "LD";
        !           940:        arg1 = "SP";
        !           941:        arg2 = HL();
        !           942: }
        !           943: 
        !           944: // 11111011: EI
        !           945: OP_DEF(ei)
        !           946: {
        !           947:        name = "EI";
        !           948: }
        !           949: 
        !           950: // 11111101: op_FD
        !           951: OP_DEF(fd)
        !           952: {
        !           953:        ops_ddfd(USE_IY);
        !           954: }
        !           955: 
        !           956: // 11111110: CP n
        !           957: OP_DEF(cp_n)
        !           958: {
        !           959:        name = "CP";
        !           960:        arg1 = imm8();
        !           961: }
        !           962: 
        !           963: // CB:00000rrr: RLC r
        !           964: OP_DEF(rlc_r)
        !           965: {
        !           966:        name = "RLC";
        !           967:        arg1 = sss();
        !           968: }
        !           969: 
        !           970: //    CB:00000110: RLC (HL)
        !           971: // DD_CB:00000110: RLC (IX+d)
        !           972: OP_DEF(rlc_hlin)
        !           973: {
        !           974:        name = "RLC";
        !           975:        arg1 = HLin();
        !           976: }
        !           977: 
        !           978: // CB:00001rrr: RRC r
        !           979: OP_DEF(rrc_r)
        !           980: {
        !           981:        name = "RRC";
        !           982:        arg1 = sss();
        !           983: }
        !           984: 
        !           985: //    CB:00001110: RRC (HL)
        !           986: // DD_CB:00001110: RRC (IX+d)
        !           987: OP_DEF(rrc_hlin)
        !           988: {
        !           989:        name = "RRC";
        !           990:        arg1 = HLin();
        !           991: }
        !           992: 
        !           993: // CB:00010rrr: RL r
        !           994: OP_DEF(rl_r)
        !           995: {
        !           996:        name = "RL";
        !           997:        arg1 = sss();
        !           998: }
        !           999: 
        !          1000: //    CB:00010110: RL (HL)
        !          1001: // DD_CB:00010110: RL (IX+d)
        !          1002: OP_DEF(rl_hlin)
        !          1003: {
        !          1004:        name = "RL";
        !          1005:        arg1 = HLin();
        !          1006: }
        !          1007: 
        !          1008: // CB:00011rrr: RR r
        !          1009: OP_DEF(rr_r)
        !          1010: {
        !          1011:        name = "RR";
        !          1012:        arg1 = sss();
        !          1013: }
        !          1014: 
        !          1015: //    CB:00011110: RR (HL)
        !          1016: // DD_CB:00011110: RR (IX+d)
        !          1017: OP_DEF(rr_hlin)
        !          1018: {
        !          1019:        name = "RR";
        !          1020:        arg1 = HLin();
        !          1021: }
        !          1022: 
        !          1023: // CB:00100rrr: SLA r
        !          1024: OP_DEF(sla_r)
        !          1025: {
        !          1026:        name = "SLA";
        !          1027:        arg1 = sss();
        !          1028: }
        !          1029: 
        !          1030: //    CB:00100110: SLA (HL)
        !          1031: // DD_CB:00100110: SLA (IX+d)
        !          1032: OP_DEF(sla_hlin)
        !          1033: {
        !          1034:        name = "SLA";
        !          1035:        arg1 = HLin();
        !          1036: }
        !          1037: 
        !          1038: // CB:00101rrr: SRA r
        !          1039: OP_DEF(sra_r)
        !          1040: {
        !          1041:        name = "SRA";
        !          1042:        arg1 = sss();
        !          1043: }
        !          1044: 
        !          1045: //    CB:00101110: SRA (HL)
        !          1046: // DD_CB:00101110: SRA (IX+d)
        !          1047: OP_DEF(sra_hlin)
        !          1048: {
        !          1049:        name = "SRA";
        !          1050:        arg1 = HLin();
        !          1051: }
        !          1052: 
        !          1053: // CB:00111rrr: SRL r
        !          1054: OP_DEF(srl_r)
        !          1055: {
        !          1056:        name = "SRL";
        !          1057:        arg1 = sss();
        !          1058: }
        !          1059: 
        !          1060: //    CB:00111110: SRL (HL)
        !          1061: // DD_CB:00111110: SRL (IX+d)
        !          1062: OP_DEF(srl_hlin)
        !          1063: {
        !          1064:        name = "SRL";
        !          1065:        arg1 = HLin();
        !          1066: }
        !          1067: 
        !          1068: // CB:01bbbrrr: BIT b,r
        !          1069: OP_DEF(bit_r)
        !          1070: {
        !          1071:        name = "BIT";
        !          1072:        arg1 = bbb();
        !          1073:        arg2 = sss();
        !          1074: }
        !          1075: 
        !          1076: //    CB:01bbb110: BIT b,(HL)
        !          1077: // DD_CB:01bbb110: BIT b,(IX+d)
        !          1078: OP_DEF(bit_hlin)
        !          1079: {
        !          1080:        name = "BIT";
        !          1081:        arg1 = bbb();
        !          1082:        arg2 = HLin();
        !          1083: }
        !          1084: 
        !          1085: // CB:10bbbrrr: RES b,r
        !          1086: OP_DEF(res_r)
        !          1087: {
        !          1088:        name = "RES";
        !          1089:        arg1 = bbb();
        !          1090:        arg2 = sss();
        !          1091: }
        !          1092: 
        !          1093: //    CB:10bbb110: RES b,(HL)
        !          1094: // DD_CB:10bbb110: RES b,(IX+d)
        !          1095: OP_DEF(res_hlin)
        !          1096: {
        !          1097:        name = "RES";
        !          1098:        arg1 = bbb();
        !          1099:        arg2 = HLin();
        !          1100: }
        !          1101: 
        !          1102: // CB:11bbbrrr: SET b,r
        !          1103: OP_DEF(set_r)
        !          1104: {
        !          1105:        name = "SET";
        !          1106:        arg1 = bbb();
        !          1107:        arg2 = sss();
        !          1108: }
        !          1109: 
        !          1110: //    CB:11bbb110: SET b,(HL)
        !          1111: // DD_CB:11bbb110: SET b,(IX+d)
        !          1112: OP_DEF(set_hlin)
        !          1113: {
        !          1114:        name = "SET";
        !          1115:        arg1 = bbb();
        !          1116:        arg2 = HLin();
        !          1117: }
        !          1118: 
        !          1119: // ED:00rrr000: IN0 r,(n)      (HD64*180 only)
        !          1120: OP_DEF(in0_r_n)
        !          1121: {
        !          1122:        name = "IN0";
        !          1123:        arg1 = rrr();
        !          1124:        arg2 = "(" + imm8() + ")";
        !          1125: }
        !          1126: 
        !          1127: // ED:00rrr001: OUT0 (n),r     (HD64*180 only)
        !          1128: OP_DEF(out0_n_r)
        !          1129: {
        !          1130:        name = "OUT0";
        !          1131:        arg1 = "(" + imm8() + ")";
        !          1132:        arg2 = rrr();
        !          1133: }
        !          1134: 
        !          1135: // ED:00rrr100: TST r  (HD64*180 only)
        !          1136: OP_DEF(tst_r)
        !          1137: {
        !          1138:        name = "TST";
        !          1139:        arg1 = rrr();
        !          1140: }
        !          1141: 
        !          1142: // ED:00110000: IN0 F,(n)      (HD64*180 only)
        !          1143: OP_DEF(in0_f_n)
        !          1144: {
        !          1145:        name = "IN0";
        !          1146:        arg1 = "F";
        !          1147:        arg2 = "(" + imm8() + ")";
        !          1148: }
        !          1149: 
        !          1150: // ED:00110100: TST (HL)       (HD64*180 only)
        !          1151: OP_DEF(tst_hlin)
        !          1152: {
        !          1153:        name = "TST";
        !          1154:        arg1 = HLin();
        !          1155: }
        !          1156: 
        !          1157: // ED:01rrr000: IN r,(C)
        !          1158: OP_DEF(in_r_c)
        !          1159: {
        !          1160:        name = "IN";
        !          1161:        arg1 = rrr();
        !          1162:        arg2 = "(C)";
        !          1163: }
        !          1164: 
        !          1165: // ED:01rrr001: OUT (C),r
        !          1166: OP_DEF(out_c_r)
        !          1167: {
        !          1168:        name = "OUT";
        !          1169:        arg1 = "(C)";
        !          1170:        arg2 = rrr();
        !          1171: }
        !          1172: 
        !          1173: // ED:01ww0010: SBC HL,ww
        !          1174: OP_DEF(sbc_hl_ww)
        !          1175: {
        !          1176:        name = "SBC";
        !          1177:        arg1 = HL();
        !          1178:        arg2 = ww();
        !          1179: }
        !          1180: 
        !          1181: // ED:01ww0011: LD (nn),ww
        !          1182: OP_DEF(ld_nnin_ww)
        !          1183: {
        !          1184:        name = "LD";
        !          1185:        arg1 = "(" + imm16() + ")";
        !          1186:        arg2 = ww();
        !          1187: }
        !          1188: 
        !          1189: // ED:01000100: NEG
        !          1190: OP_DEF(neg)
        !          1191: {
        !          1192:        name = "NEG";
        !          1193: }
        !          1194: 
        !          1195: // ED:01000101: RETN
        !          1196: OP_DEF(retn)
        !          1197: {
        !          1198:        name = "RETN";
        !          1199: }
        !          1200: 
        !          1201: // ED:01000110: IM 0
        !          1202: OP_DEF(im_0)
        !          1203: {
        !          1204:        name = "IM";
        !          1205:        arg1 = "0";
        !          1206: }
        !          1207: 
        !          1208: // ED:01000111: LD I,A
        !          1209: OP_DEF(ld_i_a)
        !          1210: {
        !          1211:        name = "LD";
        !          1212:        arg1 = "I";
        !          1213:        arg2 = "A";
        !          1214: }
        !          1215: 
        !          1216: // ED:01ww1010: ADC HL,ww
        !          1217: OP_DEF(adc_hl_ww)
        !          1218: {
        !          1219:        name = "ADC";
        !          1220:        arg1 = HL();
        !          1221:        arg2 = ww();
        !          1222: }
        !          1223: 
        !          1224: // ED:01ww1011: LD ww,(nn)
        !          1225: OP_DEF(ld_ww_nnin)
        !          1226: {
        !          1227:        name = "LD";
        !          1228:        arg1 = ww();
        !          1229:        arg2 = "(" + imm16() + ")";
        !          1230: }
        !          1231: 
        !          1232: // ED:01ww1100: MLT ww (HD64*180 only)
        !          1233: OP_DEF(mlt)
        !          1234: {
        !          1235:        name = "MLT";
        !          1236:        arg1 = ww();
        !          1237: }
        !          1238: 
        !          1239: // ED:01001101: RETI
        !          1240: OP_DEF(reti)
        !          1241: {
        !          1242:        name = "RETI";
        !          1243: }
        !          1244: 
        !          1245: // ED:01001111: LD R,A
        !          1246: OP_DEF(ld_r_a)
        !          1247: {
        !          1248:        name = "LD";
        !          1249:        arg1 = "R";
        !          1250:        arg2 = "A";
        !          1251: }
        !          1252: 
        !          1253: // ED:01010110: IM 1
        !          1254: OP_DEF(im_1)
        !          1255: {
        !          1256:        name = "IM";
        !          1257:        arg1 = "1";
        !          1258: }
        !          1259: 
        !          1260: // ED:01010111: LD A,I
        !          1261: OP_DEF(ld_a_i)
        !          1262: {
        !          1263:        name = "LD";
        !          1264:        arg1 = "A";
        !          1265:        arg2 = "I";
        !          1266: }
        !          1267: 
        !          1268: // ED:01011110: IM 2
        !          1269: OP_DEF(im_2)
        !          1270: {
        !          1271:        name = "IM";
        !          1272:        arg1 = "2";
        !          1273: }
        !          1274: 
        !          1275: // ED:01011111: LD A,R
        !          1276: OP_DEF(ld_a_r)
        !          1277: {
        !          1278:        name = "LD";
        !          1279:        arg1 = "A";
        !          1280:        arg2 = "R";
        !          1281: }
        !          1282: 
        !          1283: // ED:01100100: TST n  (HD64*180 only)
        !          1284: OP_DEF(tst_n)
        !          1285: {
        !          1286:        name = "TST";
        !          1287:        arg1 = imm8();
        !          1288: }
        !          1289: 
        !          1290: // ED:01100111: RRD
        !          1291: OP_DEF(rrd)
        !          1292: {
        !          1293:        name = "RRD";
        !          1294: }
        !          1295: 
        !          1296: // ED:01101111: RLD
        !          1297: OP_DEF(rld)
        !          1298: {
        !          1299:        name = "RLD";
        !          1300: }
        !          1301: 
        !          1302: // ED:01110000: IN F,(C)
        !          1303: OP_DEF(in_f_c)
        !          1304: {
        !          1305:        name = "IN";
        !          1306:        arg1 = "F";
        !          1307:        arg2 = "(C)";
        !          1308: }
        !          1309: 
        !          1310: // ED:01110100: TSTIO n        (HD64*180 only)
        !          1311: OP_DEF(tstio_n)
        !          1312: {
        !          1313:        name = "TSTIO";
        !          1314:        arg1 = imm8();
        !          1315: }
        !          1316: 
        !          1317: // ED:01110110: SLP    (HD64*180 only)
        !          1318: OP_DEF(slp)
        !          1319: {
        !          1320:        name = "SLP";
        !          1321: }
        !          1322: 
        !          1323: // ED:10000011: OTIM   (HD64*180 only)
        !          1324: OP_DEF(otim)
        !          1325: {
        !          1326:        name = "OTIM";
        !          1327: }
        !          1328: 
        !          1329: // ED:10001011: OTDM   (HD64*180 only)
        !          1330: OP_DEF(otdm)
        !          1331: {
        !          1332:        name = "OTDM";
        !          1333: }
        !          1334: 
        !          1335: // ED:10010011: OTIMR  (HD64*180 only)
        !          1336: OP_DEF(otimr)
        !          1337: {
        !          1338:        name = "OTIMR";
        !          1339: }
        !          1340: 
        !          1341: // ED:10011011: OTDMR  (HD64*180 only)
        !          1342: OP_DEF(otdmr)
        !          1343: {
        !          1344:        name = "OTDMR";
        !          1345: }
        !          1346: 
        !          1347: // ED:10100000: LDI
        !          1348: OP_DEF(ldi)
        !          1349: {
        !          1350:        name = "LDI";
        !          1351: }
        !          1352: 
        !          1353: // ED:10100001: CPI
        !          1354: OP_DEF(cpi)
        !          1355: {
        !          1356:        name = "CPI";
        !          1357: }
        !          1358: 
        !          1359: // ED:10100010: INI
        !          1360: OP_DEF(ini)
        !          1361: {
        !          1362:        name = "INI";
        !          1363: }
        !          1364: 
        !          1365: // ED:10100011: OUTI
        !          1366: OP_DEF(outi)
        !          1367: {
        !          1368:        name = "OUTI";
        !          1369: }
        !          1370: 
        !          1371: // ED:10101000: LDD
        !          1372: OP_DEF(ldd)
        !          1373: {
        !          1374:        name = "LDD";
        !          1375: }
        !          1376: 
        !          1377: // ED:10101001: CPD
        !          1378: OP_DEF(cpd)
        !          1379: {
        !          1380:        name = "CPD";
        !          1381: }
        !          1382: 
        !          1383: // ED:10101010: IND
        !          1384: OP_DEF(ind)
        !          1385: {
        !          1386:        name = "IND";
        !          1387: }
        !          1388: 
        !          1389: // ED:10101011: OUTD
        !          1390: OP_DEF(outd)
        !          1391: {
        !          1392:        name = "OUTD";
        !          1393: }
        !          1394: 
        !          1395: // ED:10110000: LDIR
        !          1396: OP_DEF(ldir)
        !          1397: {
        !          1398:        name = "LDIR";
        !          1399: }
        !          1400: 
        !          1401: // ED:10110001: CPIR
        !          1402: OP_DEF(cpir)
        !          1403: {
        !          1404:        name = "CPIR";
        !          1405: }
        !          1406: 
        !          1407: // ED:10110010: INIR
        !          1408: OP_DEF(inir)
        !          1409: {
        !          1410:        name = "INIR";
        !          1411: }
        !          1412: 
        !          1413: // ED:10110011: OTIR
        !          1414: OP_DEF(otir)
        !          1415: {
        !          1416:        name = "OTIR";
        !          1417: }
        !          1418: 
        !          1419: // ED:10111000: LDDR
        !          1420: OP_DEF(lddr)
        !          1421: {
        !          1422:        name = "LDDR";
        !          1423: }
        !          1424: 
        !          1425: // ED:10111001: CPDR
        !          1426: OP_DEF(cpdr)
        !          1427: {
        !          1428:        name = "CPDR";
        !          1429: }
        !          1430: 
        !          1431: // ED:10111010: INDR
        !          1432: OP_DEF(indr)
        !          1433: {
        !          1434:        name = "INDR";
        !          1435: }
        !          1436: 
        !          1437: // ED:10111011: OTDR
        !          1438: OP_DEF(otdr)
        !          1439: {
        !          1440:        name = "OTDR";
        !          1441: }
        !          1442: 
        !          1443: // ED:11rrr001: MULUB A,r      (R800 only)
        !          1444: OP_DEF(mulub_a_r)
        !          1445: {
        !          1446:        name = "MULUB";
        !          1447:        arg1 = "A";
        !          1448:        arg2 = rrr();
        !          1449: }
        !          1450: 
        !          1451: // ED:11000011: MULUB HL,BC    (R800 only)
        !          1452: OP_DEF(mulub_hl_bc)
        !          1453: {
        !          1454:        name = "MULUB";
        !          1455:        arg1 = "HL";
        !          1456:        arg2 = "BC";
        !          1457: }
        !          1458: 
        !          1459: // ED:11110011: MULUB HL,SP    (R800 only)
        !          1460: OP_DEF(mulub_hl_sp)
        !          1461: {
        !          1462:        name = "MULUB";
        !          1463:        arg1 = "HL";
        !          1464:        arg2 = "SP";
        !          1465: }
        !          1466: 
        !          1467: // ED:11111111: SYSCALL        (HD64*180 only)
        !          1468: OP_DEF(syscall)
        !          1469: {
        !          1470:        name = "SYSCALL";
        !          1471: }
        !          1472: 
        !          1473: // DD:00rrr100: INC ixr        (Z80/R800)
        !          1474: OP_DEF(inc_ixr)
        !          1475: {
        !          1476:        OP_FUNC(inc_r);
        !          1477: }
        !          1478: 
        !          1479: // DD:00rrr101: DEC ixr        (Z80/R800)
        !          1480: OP_DEF(dec_ixr)
        !          1481: {
        !          1482:        OP_FUNC(dec_r);
        !          1483: }
        !          1484: 
        !          1485: // DD:01rrrsss: LD r,ixs       (Z80/R800)
        !          1486: OP_DEF(ld_r_ixs)
        !          1487: {
        !          1488:        OP_FUNC(ld_r_s);
        !          1489: }
        !          1490: 
        !          1491: // DD:10000rrr: ADD A,ixr      (Z80/R800)
        !          1492: OP_DEF(add_a_ixr)
        !          1493: {
        !          1494:        OP_FUNC(add_a_r);
        !          1495: }
        !          1496: 
        !          1497: // DD:10001rrr: ADC A,ixr      (Z80/R800)
        !          1498: OP_DEF(adc_a_ixr)
        !          1499: {
        !          1500:        OP_FUNC(adc_a_r);
        !          1501: }
        !          1502: 
        !          1503: // DD:10010rrr: SUB ixr        (Z80/R800)
        !          1504: OP_DEF(sub_ixr)
        !          1505: {
        !          1506:        OP_FUNC(sub_r);
        !          1507: }
        !          1508: 
        !          1509: // DD:10011rrr: SBC A,ixr      (Z80/R800)
        !          1510: OP_DEF(sbc_a_ixr)
        !          1511: {
        !          1512:        OP_FUNC(sbc_a_r);
        !          1513: }
        !          1514: 
        !          1515: // DD:10100rrr: AND ixr        (Z80/R800)
        !          1516: OP_DEF(and_ixr)
        !          1517: {
        !          1518:        OP_FUNC(and_r);
        !          1519: }
        !          1520: 
        !          1521: // DD:10101rrr: XOR ixr        (Z80/R800)
        !          1522: OP_DEF(xor_ixr)
        !          1523: {
        !          1524:        OP_FUNC(xor_r);
        !          1525: }
        !          1526: 
        !          1527: // DD:10110rrr: OR ixr (Z80/R800)
        !          1528: OP_DEF(or_ixr)
        !          1529: {
        !          1530:        OP_FUNC(or_r);
        !          1531: }
        !          1532: 
        !          1533: // DD:10111rrr: CP ixr (Z80/R800)
        !          1534: OP_DEF(cp_ixr)
        !          1535: {
        !          1536:        OP_FUNC(cp_r);
        !          1537: }
        !          1538: 
        !          1539: // DD:11001011: op_DD_CB
        !          1540: OP_DEF(dd_cb)
        !          1541: {
        !          1542:        // DD/FD CB の場合は 3バイト目が <d> で 4バイト目が命令語の順。
        !          1543:        // どうして…。
        !          1544:        ixd = fetch8();
        !          1545: 
        !          1546:        op = fetch8();
        !          1547:        switch (op) {
        !          1548: #include "hd64180switch_dd_cb.inc"
        !          1549:         default:
        !          1550:                OP_FUNC(illegal);
        !          1551:                break;
        !          1552:        }
        !          1553: }

unix.superglobalmegacorp.com

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