Annotation of nono/m680x0/m680x0ops.cpp, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: #include "mpu680x0.h"
                      8: #include "m680x0acc.h"
                      9: #include "m680x0bitfield.h"
                     10: #include "m68040mmu.h"
                     11: 
                     12: #define OP_DEF(name)   void __CONCAT(MPU680x0Device::op_,name)()
                     13: #define OP_FUNC(name)  __CONCAT(op_,name)()
                     14: 
                     15: #define CCR reg.ccr
                     16: #define ACC (*(m680x0ACC*)&reg.ccr)
                     17: 
                     18: #define RegIRX                 ((ir >> 9) & 7)
                     19: #define RegIRY                 (ir & 7)
                     20: #define RegDX                  reg.D[RegIRX]
                     21: #define RegAX                  reg.A[RegIRX]
                     22: #define RegDY                  reg.D[RegIRY]
                     23: #define RegAY                  reg.A[RegIRY]
                     24: 
                     25: // (エミュレータ的)未実装命令
                     26: #define op_unimpl(cpu) \
                     27:        PANIC("unimplemented instruction! %s()", __FUNCTION__)
                     28: 
                     29: // 副作用のあるマクロ
                     30: // 特権違反例外のスタックに積む PC は違反を起こした命令先頭。
                     31: #define SUPERVISOR_OP  do { \
                     32:        if (!IsSuper()) {       \
                     33:                CYCLE2(18, 20); \
                     34:                Exception(M68K::EXCEP_PRIV);    \
                     35:                return; \
                     36:        }       \
                     37: } while (0)
                     38: 
                     39: // %0000_000000_mmmrrr d.m+-rxw.. 034  ORI.B #<imm>,<ea>
                     40: // %0000_000000_111100 .......... 034  ORI.B #<imm>,CCR
                     41: OP_DEF(ori_b)
                     42: {
                     43:        uint n = ir & 0x3f;
                     44: 
                     45:        uint32 src = fetch_2() & 0xff;
                     46:        if (n < 8) {
                     47:                // ORI.B #<imm>,Dn
                     48:                CYCLE(2);
                     49:                uint32 dst = (reg.D[n] & 0xff) | src;
                     50:                ACC.move_8(dst);
                     51:                reg.D[n] = (reg.D[n] & 0xffffff00) | dst;
                     52:        } else if (n == 0b111100) {
                     53:                // ORI.B #<imm>,CCR
                     54:                CYCLE2(12, 14);
                     55:                CCR.Set(CCR.Get() | src);
                     56:        } else {
                     57:                // ORI.B #<imm>,<ea>
                     58:                CYCLE2(3, 4);
                     59:                uint32 ea = cea_data_1();
                     60:                uint32 dst = read_1(ea);
                     61:                dst |= src;
                     62:                ACC.move_8(dst);
                     63:                write_1(ea, dst);
                     64:        }
                     65: }
                     66: 
                     67: // %0000_000001_mmmrrr d.m+-rxw.. 034  ORI.W #<imm>,<ea>
                     68: // %0000_000001_111100 .......... 034  ORI.W #<imm>,SR
                     69: OP_DEF(ori_w)
                     70: {
                     71:        uint n = ir & 0x3f;
                     72: 
                     73:        if (n < 8) {
                     74:                // ORI.W #<imm>,Dn
                     75:                CYCLE(2);
                     76:                uint32 src = fetch_2();
                     77:                uint32 dst = (reg.D[n] & 0xffff) | src;
                     78:                ACC.move_16(dst);
                     79:                reg.D[n] = (reg.D[n] & 0xffff0000) | dst;
                     80:        } else if (n == 0b111100) {
                     81:                // ORI.W #<imm>,SR
                     82:                SUPERVISOR_OP;
                     83:                CYCLE2(12, 14);
                     84:                uint32 src = fetch_2();
                     85:                SetSR(GetSR() | src);
                     86:        } else {
                     87:                // ORI.W #<imm>,<ea>
                     88:                CYCLE2(3, 4);
                     89:                uint32 src = fetch_2();
                     90:                uint32 ea = cea_data_2();
                     91:                uint32 dst = read_2(ea);
                     92:                dst |= src;
                     93:                ACC.move_16(dst);
                     94:                write_2(ea, dst);
                     95:        }
                     96: }
                     97: 
                     98: // %0000_000010_mmmrrr d.m+-rxw.. 034  ORI.L #<imm>,<ea>
                     99: OP_DEF(ori_l)
                    100: {
                    101:        uint n = ir & 0x3f;
                    102: 
                    103:        uint32 src = fetch_4();
                    104:        if (n < 8) {
                    105:                // ORI.L #<imm>,Dn
                    106:                CYCLE(2);
                    107:                reg.D[n] |= src;
                    108:                ACC.move_32(reg.D[n]);
                    109:        } else {
                    110:                // ORI.L #<imm>,<ea>
                    111:                CYCLE2(3, 4);
                    112:                uint32 ea = cea_data_4();
                    113:                uint32 dst = read_4(ea);
                    114:                dst |= src;
                    115:                ACC.move_32(dst);
                    116:                write_4(ea, dst);
                    117:        }
                    118: }
                    119: 
                    120: // %0000_000011_mmmrrr ..m..rxwp. -34  CMP2/CHK2.B <ea>,Rn
                    121: OP_DEF(cmp2chk2_b)
                    122: {
                    123:        ir2 = fetch_2();
                    124:        uint32 compare;
                    125:        uint32 ea = cea_ctrl();
                    126:        uint32 lower;
                    127:        uint32 upper;
                    128: 
                    129:        if ((ir2 & 0x8000) == 0) {
                    130:                // compare が Dn
                    131:                compare = (int32)(int8)(reg.R[ir2 >> 12] & 0xff);
                    132:        } else {
                    133:                // compare が An
                    134:                compare = reg.R[ir2 >> 12];
                    135:        }
                    136: 
                    137:        // 本当は PC 相対ならプログラム空間アクセス、
                    138:        // それ以外はデータ空間アクセスだが、ここでは区別しない。
                    139:        lower = (int32)(int8)read_1(ea);
                    140:        upper = (int32)(int8)read_1(ea + 1);
                    141: 
                    142:        ACC.chk2cmp2_32(compare, lower, upper);
                    143: 
                    144:        // サイクル数はこれは実際には全部最大値
                    145:        if ((ir2 & 0x0800)) {
                    146:                // CHK2 で条件を満たしていれば例外
                    147:                if (reg.ccr.CondCS()) {
                    148:                        CYCLE2(40, 42);
                    149:                        Exception(M68K::EXCEP_CHK);
                    150:                } else {
                    151:                        CYCLE(18);
                    152:                }
                    153:        } else {
                    154:                // CMP2
                    155:                CYCLE(20);
                    156:        }
                    157: }
                    158: 
                    159: // MOVEP.[WL] (d,Ay),Dx と
                    160: // MOVEP.[WL] Dx,(d,Ay) の共通部分。
                    161: void
                    162: MPU680x0Device::ops_movep()
                    163: {
                    164:        uint32 disp = (int32)(int16)fetch_2();
                    165:        uint32 ea = RegAY + disp;
                    166:        bool size_long = ((ir & 0x40) != 0);
                    167:        bool reg2mem = ((ir & 0x80) != 0);
                    168: 
                    169:        CYCLE(14);
                    170: 
                    171:        if (reg2mem) {
                    172:                // Dx -> memory
                    173:                uint32 dx = RegDX;
                    174:                if (size_long) {
                    175:                        write_1(ea, (dx >> 24));
                    176:                        ea += 2;
                    177:                        write_1(ea, (dx >> 16) & 0xff);
                    178:                        ea += 2;
                    179:                }
                    180:                write_1(ea, (dx >> 8) & 0xff);
                    181:                ea += 2;
                    182:                write_1(ea, (dx & 0xff));
                    183:        } else {
                    184:                // memory -> Dx
                    185:                uint32 dx = 0;
                    186:                if (size_long) {
                    187:                        dx = read_1(ea);
                    188:                        dx <<= 8;
                    189:                        ea += 2;
                    190:                        dx |= read_1(ea);
                    191:                        dx <<= 8;
                    192:                        ea += 2;
                    193:                }
                    194:                // word
                    195:                dx |= read_1(ea);
                    196:                dx <<= 8;
                    197:                ea += 2;
                    198:                dx |= read_1(ea);
                    199: 
                    200:                if (size_long) {
                    201:                        RegDX = dx;
                    202:                } else {
                    203:                        RegDX = (RegDX & 0xffff0000) | (dx & 0xffff);
                    204:                }
                    205:        }
                    206: }
                    207: 
                    208: // %0000_xxx100_mmmrrr ..m+-rxwpi 034  BTST.B Dx,<ea>
                    209: // %0000_xxx100_000yyy .......... 034  BTST.L Dx,Dy
                    210: // %0000_xxx100_001yyy .......... 034  MOVEP.W (d,Ay),Dx
                    211: OP_DEF(btst_dn_ea)
                    212: {
                    213:        uint n = ir & 0x3f;
                    214: 
                    215:        if (n < 8) {
                    216:                // BTST.L Dx,Dy
                    217:                CYCLE(4);
                    218:                uint bit = (RegDX & 31);
                    219:                ACC.btst(RegDY, bit);
                    220:        } else if (n < 16) {
                    221:                // MOVEP.W (d,Ay),Dx
                    222:                ops_movep();
                    223:        } else {
                    224:                // BTST.B Dx,<ea>
                    225:                CYCLE(4);
                    226:                uint bit = (RegDX & 7);
                    227:                uint32 data = fea_data_1();
                    228:                ACC.btst(data, bit);
                    229:        }
                    230: }
                    231: 
                    232: // %0000_xxx101_mmmrrr ..m+-rxw.. 034  BCHG.B Dx,<ea>
                    233: // %0000_xxx101_000yyy .......... 034  BCHG.L Dx,Dy
                    234: // %0000_xxx101_001yyy .......... 034  MOVEP.L (d,Ay),Dx
                    235: OP_DEF(bchg_dn_ea)
                    236: {
                    237:        uint n = ir & 0x3f;
                    238: 
                    239:        if (n < 8) {
                    240:                // BCHG.L Dx,Dy
                    241:                CYCLE(6);
                    242:                uint bit = (RegDX & 31);
                    243:                RegDY = ACC.bchg(RegDY, bit);
                    244:        } else if (n < 16) {
                    245:                // MOVEP.L (d,Ay),Dx
                    246:                ops_movep();
                    247:        } else {
                    248:                // BCHG.B Dx,<ea>
                    249:                CYCLE(6);
                    250:                uint bit = (RegDX & 7);
                    251:                uint32 ea = cea_data_1();
                    252:                uint32 data = read_1(ea);
                    253:                data = ACC.bchg(data, bit);
                    254:                write_1(ea, data);
                    255:        }
                    256: }
                    257: 
                    258: // %0000_xxx110_mmmrrr ..m+-rxw.. 034  BCLR.B Dx,<ea>
                    259: // %0000_xxx110_000yyy .......... 034  BCLR.L Dx,Dy
                    260: // %0000_xxx110_001yyy .......... 034  MOVEP.W Dx,(d,Ay)
                    261: OP_DEF(bclr_dn_ea)
                    262: {
                    263:        uint n = ir & 0x3f;
                    264: 
                    265:        if (n < 8) {
                    266:                // BCLR.L Dx,Dy
                    267:                CYCLE(6);
                    268:                uint bit = (RegDX & 31);
                    269:                RegDY = ACC.bclr(RegDY, bit);
                    270:        } else if (n < 16) {
                    271:                // MOVEP.W Dx,(d,Ay)
                    272:                ops_movep();
                    273:        } else {
                    274:                // BCLR.B Dx,<ea>
                    275:                CYCLE(6);
                    276:                uint bit = (RegDX & 7);
                    277:                uint32 ea = cea_data_1();
                    278:                uint32 data = read_1(ea);
                    279:                data = ACC.bclr(data, bit);
                    280:                write_1(ea, data);
                    281:        }
                    282: }
                    283: 
                    284: // %0000_xxx111_mmmrrr ..m+-rxw.. 034  BSET.B Dx,<ea>
                    285: // %0000_xxx111_000yyy .......... 034  BSET.L Dx,Dy
                    286: // %0000_xxx111_001yyy .......... 034  MOVEP.L Dx,(d,Ay)
                    287: OP_DEF(bset_dn_ea)
                    288: {
                    289:        uint n = ir & 0x3f;
                    290: 
                    291:        if (n < 8) {
                    292:                // BSET.L Dx,Dy
                    293:                CYCLE(6);
                    294:                uint bit = (RegDX & 31);
                    295:                RegDY = ACC.bset(RegDY, bit);
                    296:        } else if (n < 16) {
                    297:                // MOVEP.L Dx,(d,Ay)
                    298:                ops_movep();
                    299:        } else {
                    300:                // BSET.B Dx,<ea>
                    301:                CYCLE(6);
                    302:                uint bit = (RegDX & 7);
                    303:                uint32 ea = cea_data_1();
                    304:                uint32 data = read_1(ea);
                    305:                data = ACC.bset(data, bit);
                    306:                write_1(ea, data);
                    307:        }
                    308: }
                    309: 
                    310: // %0000_001000_mmmrrr d.m+-rxw.. 034  ANDI.B #<imm>,<ea>
                    311: // %0000_001000_111100 .......... 034  ANDI.B #<imm>,CCR
                    312: OP_DEF(andi_b)
                    313: {
                    314:        uint n = ir & 0x3f;
                    315: 
                    316:        uint32 src = fetch_2() & 0xff;
                    317:        if (n < 8) {
                    318:                // ANDI.B #<imm>,Dn
                    319:                CYCLE(2);
                    320:                uint32 dst = reg.D[n] & 0xff;
                    321:                dst &= src;
                    322:                ACC.move_8(dst);
                    323:                reg.D[n] = (reg.D[n] & 0xffffff00) | dst;
                    324:        } else if (n == 0b111100) {
                    325:                // ANDI.B #<imm>,CCR
                    326:                CYCLE2(12, 14);
                    327:                CCR.Set(CCR.Get() & src);
                    328:        } else {
                    329:                // ANDI.B #<imm>,<ea>
                    330:                CYCLE2(3, 4);
                    331:                uint32 ea = cea_data_1();
                    332:                uint32 dst = read_1(ea);
                    333:                dst &= src;
                    334:                ACC.move_8(dst);
                    335:                write_1(ea, dst);
                    336:        }
                    337: }
                    338: 
                    339: // %0000_001001_mmmrrr d.m+-rxw.. 034  ANDI.W #<imm>,<ea>
                    340: // %0000_001001_111100 .......... 034  ANDI.W #<imm>,SR
                    341: OP_DEF(andi_w)
                    342: {
                    343:        uint n = ir & 0x3f;
                    344: 
                    345:        if (n < 8) {
                    346:                // ANDI.W #<imm>,Dn
                    347:                CYCLE(2);
                    348:                uint32 src = fetch_2();
                    349:                uint32 dst = reg.D[n] & 0xffff;
                    350:                dst &= src;
                    351:                ACC.move_16(dst);
                    352:                reg.D[n] = (reg.D[n] & 0xffff0000) | dst;
                    353:        } else if (n == 0b111100) {
                    354:                // ANDI.W #<imm>,SR
                    355:                SUPERVISOR_OP;
                    356:                CYCLE2(12, 14);
                    357:                uint32 src = fetch_2();
                    358:                SetSR(GetSR() & src);
                    359:        } else {
                    360:                // ANDI.W #<imm>,<ea>
                    361:                CYCLE2(3, 4);
                    362:                uint32 src = fetch_2();
                    363:                uint32 ea = cea_data_2();
                    364:                uint32 dst = read_2(ea);
                    365:                dst &= src;
                    366:                ACC.move_16(dst);
                    367:                write_2(ea, dst);
                    368:        }
                    369: }
                    370: 
                    371: // %0000_001010_mmmrrr d.m+-rxw.. 034  ANDI.L #<imm>,<ea>
                    372: OP_DEF(andi_l)
                    373: {
                    374:        uint n = ir & 0x3f;
                    375: 
                    376:        uint32 src = fetch_4();
                    377:        if (n < 8) {
                    378:                // ANDI.L #<imm>,Dn
                    379:                CYCLE(2);
                    380:                reg.D[n] &= src;
                    381:                ACC.move_32(reg.D[n]);
                    382:        } else {
                    383:                // ANDI.L #<imm>,<ea>
                    384:                CYCLE2(3, 4);
                    385:                uint32 ea = cea_data_4();
                    386:                uint32 dst = read_4(ea);
                    387:                dst &= src;
                    388:                ACC.move_32(dst);
                    389:                write_4(ea, dst);
                    390:        }
                    391: }
                    392: 
                    393: // %0000_001011_mmmrrr ..m..rxwp. -34  CMP2/CHK2.W <ea>,Rn
                    394: OP_DEF(cmp2chk2_w)
                    395: {
                    396:        ir2 = fetch_2();
                    397:        uint32 compare;
                    398:        uint32 ea = cea_ctrl();
                    399:        uint32 lower;
                    400:        uint32 upper;
                    401: 
                    402:        if ((ir2 & 0x8000) == 0) {
                    403:                // compare が Dn
                    404:                compare = (int32)(int16)(reg.R[ir2 >> 12] & 0xffff);
                    405:        } else {
                    406:                // compare が An
                    407:                compare = reg.R[ir2 >> 12];
                    408:        }
                    409: 
                    410:        // 本当は PC 相対ならプログラム空間アクセス、
                    411:        // それ以外はデータ空間アクセスだが、ここでは区別しない。
                    412:        lower = (int32)(int16)read_2(ea);
                    413:        upper = (int32)(int16)read_2(ea + 2);
                    414: 
                    415:        ACC.chk2cmp2_32(compare, lower, upper);
                    416: 
                    417:        // サイクル数はこれは実際には全部最大値
                    418:        if ((ir2 & 0x0800)) {
                    419:                // CHK2 で条件を満たしていれば例外
                    420:                if (reg.ccr.CondCS()) {
                    421:                        CYCLE2(40, 42);
                    422:                        Exception(M68K::EXCEP_CHK);
                    423:                } else {
                    424:                        CYCLE(18);
                    425:                }
                    426:        } else {
                    427:                // CMP2
                    428:                CYCLE(20);
                    429:        }
                    430: }
                    431: 
                    432: // %0000_010000_mmmrrr d.m+-rxw.. 034  SUBI.B #<imm>,<ea>
                    433: OP_DEF(subi_b)
                    434: {
                    435:        uint n = ir & 0x3f;
                    436: 
                    437:        uint32 src = fetch_2() & 0xff;
                    438:        if (n < 8) {
                    439:                // SUBI.B #<imm>,Dn
                    440:                CYCLE(2);
                    441:                uint32 dst = reg.D[n] & 0xff;
                    442:                dst = ACC.sub_8(src, dst);
                    443:                reg.D[n] = (reg.D[n] & 0xffffff00) | dst;
                    444:        } else {
                    445:                // SUBI.B #<imm>,<ea>
                    446:                CYCLE2(3, 4);
                    447:                uint32 ea = cea_data_1();
                    448:                uint32 dst = read_1(ea);
                    449:                dst = ACC.sub_8(src, dst);
                    450:                write_1(ea, dst);
                    451:        }
                    452: }
                    453: 
                    454: // %0000_010001_mmmrrr d.m+-rxw.. 034  SUBI.W #<imm>,<ea>
                    455: OP_DEF(subi_w)
                    456: {
                    457:        uint n = ir & 0x3f;
                    458: 
                    459:        uint32 src = fetch_2();
                    460:        if (n < 8) {
                    461:                // SUBI.W #<imm>,Dn
                    462:                CYCLE(2);
                    463:                uint32 dst = reg.D[n] & 0xffff;
                    464:                dst = ACC.sub_16(src, dst);
                    465:                reg.D[n] = (reg.D[n] & 0xffff0000) | dst;
                    466:        } else {
                    467:                // SUBI.W #<imm>,<ea>
                    468:                CYCLE2(3, 4);
                    469:                uint32 ea = cea_data_2();
                    470:                uint32 dst = read_2(ea);
                    471:                dst = ACC.sub_16(src, dst);
                    472:                write_2(ea, dst);
                    473:        }
                    474: }
                    475: 
                    476: // %0000_010010_mmmrrr d.m+-rxw.. 034  SUBI.L #<imm>,<ea>
                    477: OP_DEF(subi_l)
                    478: {
                    479:        uint n = ir & 0x3f;
                    480: 
                    481:        uint32 src = fetch_4();
                    482:        if (n < 8) {
                    483:                // SUBI.L #<imm>,Dn
                    484:                CYCLE(2);
                    485:                reg.D[n] = ACC.sub_32(src, reg.D[n]);
                    486:        } else {
                    487:                // SUBI.L #<imm>,<ea>
                    488:                CYCLE2(3, 4);
                    489:                uint32 ea = cea_data_4();
                    490:                uint32 dst = read_4(ea);
                    491:                dst = ACC.sub_32(src, dst);
                    492:                write_4(ea, dst);
                    493:        }
                    494: }
                    495: 
                    496: // %0000_010011_mmmrrr ..m..rxwp. -34  CMP2/CHK2.L <ea>,Rn
                    497: OP_DEF(cmp2chk2_l)
                    498: {
                    499:        ir2 = fetch_2();
                    500:        uint32 compare = reg.R[ir2 >> 12];
                    501:        uint32 ea = cea_ctrl();
                    502:        uint32 lower;
                    503:        uint32 upper;
                    504: 
                    505:        // 本当は PC 相対ならプログラム空間アクセス、
                    506:        // それ以外はデータ空間アクセスだが、ここでは区別しない。
                    507:        lower = read_4(ea);
                    508:        upper = read_4(ea + 4);
                    509: 
                    510:        ACC.chk2cmp2_32(compare, lower, upper);
                    511: 
                    512:        // サイクル数はこれは実際には全部最大値
                    513:        if ((ir2 & 0x0800)) {
                    514:                // CHK2 で条件を満たしていれば例外
                    515:                if (reg.ccr.CondCS()) {
                    516:                        CYCLE2(40, 42);
                    517:                        Exception(M68K::EXCEP_CHK);
                    518:                } else {
                    519:                        CYCLE(18);
                    520:                }
                    521:        } else {
                    522:                // CMP2
                    523:                CYCLE(20);
                    524:        }
                    525: }
                    526: 
                    527: // %0000_011000_mmmrrr d.m+-rxw.. 034  ADDI.B #<imm>,<ea>
                    528: OP_DEF(addi_b)
                    529: {
                    530:        uint n = ir & 0x3f;
                    531: 
                    532:        uint32 src = fetch_2() & 0xff;
                    533:        if (n < 8) {
                    534:                // ADDI.B #<imm>,Dn
                    535:                CYCLE(2);
                    536:                uint32 dst = reg.D[n] & 0xff;
                    537:                dst = ACC.add_8(src, dst);
                    538:                reg.D[n] = (reg.D[n] & 0xffffff00) | dst;
                    539:        } else {
                    540:                // ADDI.B #<imm>,<ea>
                    541:                CYCLE2(3, 4);
                    542:                uint32 ea = cea_data_1();
                    543:                uint32 dst = read_1(ea);
                    544:                dst = ACC.add_8(src, dst);
                    545:                write_1(ea, dst);
                    546:        }
                    547: }
                    548: 
                    549: // %0000_011001_mmmrrr d.m+-rxw.. 034  ADDI.W #<imm>,<ea>
                    550: OP_DEF(addi_w)
                    551: {
                    552:        uint n = ir & 0x3f;
                    553: 
                    554:        uint32 src = fetch_2();
                    555:        if (n < 8) {
                    556:                // ADDI.W #<imm>,Dn
                    557:                CYCLE(2);
                    558:                uint32 dst = reg.D[n] & 0xffff;
                    559:                dst = ACC.add_16(src, dst);
                    560:                reg.D[n] = (reg.D[n] & 0xffff0000) | dst;
                    561:        } else {
                    562:                // ADDI.W #<imm>,<ea>
                    563:                CYCLE2(3, 4);
                    564:                uint32 ea = cea_data_2();
                    565:                uint32 dst = read_2(ea);
                    566:                dst = ACC.add_16(src, dst);
                    567:                write_2(ea, dst);
                    568:        }
                    569: }
                    570: 
                    571: // %0000_011010_mmmrrr d.m+-rxw.. 034  ADDI.L #<imm>,<ea>
                    572: OP_DEF(addi_l)
                    573: {
                    574:        uint n = ir & 0x3f;
                    575: 
                    576:        uint32 src = fetch_4();
                    577:        if (n < 8) {
                    578:                // ADDI.L #<imm>,Dn
                    579:                CYCLE(2);
                    580:                reg.D[n] = ACC.add_32(src, reg.D[n]);
                    581:        } else {
                    582:                // ADDI.L #<imm>,<ea>
                    583:                CYCLE2(3, 4);
                    584:                uint32 ea = cea_data_4();
                    585:                uint32 dst = read_4(ea);
                    586:                dst = ACC.add_32(src, dst);
                    587:                write_4(ea, dst);
                    588:        }
                    589: }
                    590: 
                    591: // %0000_011011_mmmrrr ..m..rxwp. 2--  CALLM #<imm>,<ea>
                    592: // %0000_011011_00nnnn .......... 2--  RTM Rn
                    593: OP_DEF(callm)
                    594: {
                    595:        op_illegal();
                    596: }
                    597: 
                    598: // %0000_100000_mmmrrr ..m+-rxwp. 034  BTST.B #<imm>,<ea>
                    599: // %0000_100000_000yyy .......... 034  BTST.L #<imm>,Dy
                    600: OP_DEF(btst_imm_ea)
                    601: {
                    602:        uint n = ir & 0x3f;
                    603: 
                    604:        if (n < 8) {
                    605:                // BTST.L #<imm>,Dy
                    606:                CYCLE(4);
                    607:                uint bit = fetch_2() & 31;
                    608:                ACC.btst(RegDY, bit);
                    609:        } else if (n == 0x3c) {
                    610:                // BTST.B #<imm>,<ea> の <ea> には #imm はない
                    611:                op_illegal();
                    612:        } else {
                    613:                // BTST.B #<imm>,<ea>
                    614:                CYCLE(4);
                    615:                uint bit = fetch_2() & 7;
                    616:                uint32 data = fea_data_1();
                    617:                ACC.btst(data, bit);
                    618:        }
                    619: }
                    620: 
                    621: // %0000_100001_mmmrrr ..m+-rxw.. 034  BCHG.B #<imm>,<ea>
                    622: // %0000_100001_000yyy .......... 034  BCHG.L #<imm>,Dy
                    623: OP_DEF(bchg_imm_ea)
                    624: {
                    625:        uint n = ir & 0x3f;
                    626: 
                    627:        if (n < 8) {
                    628:                // BCHG.L #<imm>,Dy
                    629:                CYCLE(6);
                    630:                uint bit = fetch_2() & 31;
                    631:                RegDY = ACC.bchg(RegDY, bit);
                    632:        } else if (n == 0x3c) {
                    633:                // BCHG.B #<imm>,<ea> の <ea> には #imm はない
                    634:                op_illegal();
                    635:        } else {
                    636:                // BCHG.B #<imm>,<ea>
                    637:                CYCLE(6);
                    638:                uint bit = fetch_2() & 7;
                    639:                uint32 ea = cea_data_1();
                    640:                uint32 data = read_1(ea);
                    641:                data = ACC.bchg(data, bit);
                    642:                write_1(ea, data);
                    643:        }
                    644: }
                    645: 
                    646: // %0000_100010_mmmrrr ..m+-rxw.. 034  BCLR.B #<imm>,<ea>
                    647: // %0000_100010_000yyy .......... 034  BCLR.L #<imm>,Dy
                    648: OP_DEF(bclr_imm_ea)
                    649: {
                    650:        uint n = ir & 0x3f;
                    651: 
                    652:        if (n < 8) {
                    653:                // BCLR.L #<imm>,Dy
                    654:                CYCLE(6);
                    655:                uint bit = fetch_2() & 31;
                    656:                RegDY = ACC.bclr(RegDY, bit);
                    657:        } else if (n == 0x3c) {
                    658:                // BCLR.B #<imm>,<ea> の <ea> には #imm はない
                    659:                op_illegal();
                    660:        } else {
                    661:                // BCLR.B #<imm>,<ea>
                    662:                CYCLE(6);
                    663:                uint bit = fetch_2() & 7;
                    664:                uint32 ea = cea_data_1();
                    665:                uint32 data = read_1(ea);
                    666:                data = ACC.bclr(data, bit);
                    667:                write_1(ea, data);
                    668:        }
                    669: }
                    670: 
                    671: // %0000_100011_mmmrrr ..m+-rxw.. 034  BSET.B #<imm>,<ea>
                    672: // %0000_100011_000yyy .......... 034  BSET.L #<imm>,Dy
                    673: OP_DEF(bset_imm_ea)
                    674: {
                    675:        uint n = ir & 0x3f;
                    676: 
                    677:        if (n < 8) {
                    678:                // BSET.L #<imm>,Dy
                    679:                CYCLE(6);
                    680:                uint bit = fetch_2() & 31;
                    681:                RegDY = ACC.bset(RegDY, bit);
                    682:        } else if (n == 0x3c) {
                    683:                // BSET.B #<imm>,<ea> の <ea> には #imm はない
                    684:                op_illegal();
                    685:        } else {
                    686:                // BSET.B #<imm>,<ea>
                    687:                CYCLE(6);
                    688:                uint bit = fetch_2() & 7;
                    689:                uint32 ea = cea_data_1();
                    690:                uint32 data = read_1(ea);
                    691:                data = ACC.bset(data, bit);
                    692:                write_1(ea, data);
                    693:        }
                    694: }
                    695: 
                    696: // %0000_101000_mmmrrr d.m+-rxw.. 034  EORI.B #<imm>,<ea>
                    697: // %0000_101000_111100 .......... 034  EORI.B #<imm>,CCR
                    698: OP_DEF(eori_b)
                    699: {
                    700:        uint n = ir & 0x3f;
                    701: 
                    702:        uint32 src = fetch_2() & 0xff;
                    703:        if (n < 8) {
                    704:                // EORI.B #<imm>,Dn
                    705:                CYCLE(2);
                    706:                uint32 dst = (reg.D[n] & 0xff) ^ src;
                    707:                ACC.move_8(dst);
                    708:                reg.D[n] = (reg.D[n] & 0xffffff00) | dst;
                    709:        } else if (n == 0b111100) {
                    710:                // EORI.B #<imm>,CCR
                    711:                CYCLE2(12, 14);
                    712:                CCR.Set(CCR.Get() ^ src);
                    713:        } else {
                    714:                // EORI.B #<imm>,<ea>
                    715:                CYCLE2(3, 4);
                    716:                uint32 ea = cea_data_1();
                    717:                uint32 dst = read_1(ea);
                    718:                dst ^= src;
                    719:                ACC.move_8(dst);
                    720:                write_1(ea, dst);
                    721:        }
                    722: }
                    723: 
                    724: // %0000_101001_mmmrrr d.m+-rxw.. 034  EORI.W #<imm>,<ea>
                    725: // %0000_101001_111100 .......... 034  EORI.W #<imm>,SR
                    726: OP_DEF(eori_w)
                    727: {
                    728:        uint n = ir & 0x3f;
                    729: 
                    730:        if (n < 8) {
                    731:                // EORI.W #<imm>,Dn
                    732:                CYCLE(2);
                    733:                uint32 src = fetch_2();
                    734:                uint32 dst = (reg.D[n] & 0xffff) ^ src;
                    735:                ACC.move_16(dst);
                    736:                reg.D[n] = (reg.D[n] & 0xffff0000) | dst;
                    737:        } else if (n == 0b111100) {
                    738:                // EORI.W #<imm>,SR
                    739:                SUPERVISOR_OP;
                    740:                CYCLE2(12, 14);
                    741:                uint32 src = fetch_2();
                    742:                SetSR(GetSR() ^ src);
                    743:        } else {
                    744:                // EORI.W #<imm>,<ea>
                    745:                CYCLE2(3, 4);
                    746:                uint32 src = fetch_2();
                    747:                uint32 ea = cea_data_2();
                    748:                uint32 dst = read_2(ea);
                    749:                dst ^= src;
                    750:                ACC.move_16(dst);
                    751:                write_2(ea, dst);
                    752:        }
                    753: }
                    754: 
                    755: // %0000_101010_mmmrrr d.m+-rxw.. 034  EORI.L #<imm>,<ea>
                    756: OP_DEF(eori_l)
                    757: {
                    758:        uint n = ir & 0x3f;
                    759: 
                    760:        uint32 src = fetch_4();
                    761:        if (n < 8) {
                    762:                // EORI.L #<imm>,Dn
                    763:                CYCLE(2);
                    764:                reg.D[n] ^= src;
                    765:                ACC.move_32(reg.D[n]);
                    766:        } else {
                    767:                // EORI.L #<imm>,<ea>
                    768:                CYCLE2(3, 4);
                    769:                uint32 ea = cea_data_4();
                    770:                uint32 dst = read_4(ea);
                    771:                dst ^= src;
                    772:                ACC.move_32(dst);
                    773:                write_4(ea, dst);
                    774:        }
                    775: }
                    776: 
                    777: // %0000_101011_mmmrrr ..m+-rxw.. -34  CAS.B Dc,Du,<ea>
                    778: OP_DEF(cas_b)
                    779: {
                    780:        ir2 = fetch_2();
                    781:        uint c = ir2 & 7;
                    782:        uint u = (ir2 >> 6) & 7;
                    783:        uint32 dc = reg.D[c] & 0xff;
                    784:        uint32 du = reg.D[u] & 0xff;
                    785:        uint ea = cea_data_1();
                    786:        uint32 dst = read_1(ea);
                    787: 
                    788:        ACC.cmp_8(dc, dst);
                    789:        if (CCR.IsZ()) {
                    790:                // 等しければ、Du -> dst
                    791:                CYCLE(13);
                    792:                write_1(ea, du);
                    793:        } else {
                    794:                // そうでなければ、dst -> Dc
                    795:                CYCLE(11);
                    796:                reg.D[c] = (reg.D[c] & 0xffffff00) | dst;
                    797:        }
                    798: }
                    799: 
                    800: // %0000_110000_mmmrrr d.m+-rxwp. -34  CMPI.B #<imm>,<ea>
                    801: OP_DEF(cmpi_b)
                    802: {
                    803:        uint n = ir & 0x3f;
                    804: 
                    805:        // CMPI はデータアドレッシングだが #imm がないことに注意
                    806:        if (n == 0x3c) {
                    807:                op_illegal();
                    808:                return;
                    809:        }
                    810:        CYCLE(2);
                    811:        uint32 src = fetch_2() & 0xff;
                    812:        uint32 dst = fea_data_1();
                    813:        ACC.cmp_8(src, dst);
                    814: }
                    815: 
                    816: // %0000_110001_mmmrrr d.m+-rxwp. -34  CMPI.W #<imm>,<ea>
                    817: OP_DEF(cmpi_w)
                    818: {
                    819:        uint n = ir & 0x3f;
                    820: 
                    821:        // CMPI はデータアドレッシングだが #imm がないことに注意
                    822:        if (n == 0x3c) {
                    823:                op_illegal();
                    824:                return;
                    825:        }
                    826:        CYCLE(2);
                    827:        uint32 src = fetch_2();
                    828:        uint32 dst = fea_data_2();
                    829:        ACC.cmp_16(src, dst);
                    830: }
                    831: 
                    832: // %0000_110010_mmmrrr d.m+-rxwp. -34  CMPI.L #<imm>,<ea>
                    833: OP_DEF(cmpi_l)
                    834: {
                    835:        uint n = ir & 0x3f;
                    836: 
                    837:        // CMPI はデータアドレッシングだが #imm がないことに注意
                    838:        if (n == 0x3c) {
                    839:                op_illegal();
                    840:                return;
                    841:        }
                    842:        CYCLE(2);
                    843:        uint32 src = fetch_4();
                    844:        uint32 dst = fea_data_4();
                    845:        ACC.cmp_32(src, dst);
                    846: }
                    847: 
                    848: // %0000_110011_mmmrrr ..m+-rxw.. -34  CAS.W Dc,Du,<ea>
                    849: // %0000_110011_111100 .......... -34  CAS2.W Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
                    850: OP_DEF(cas_w)
                    851: {
                    852:        uint n = ir & 0x3f;
                    853: 
                    854:        if (n == 0x3c) {
                    855:                // CAS2.W Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
                    856:                ir2 = fetch_2();
                    857:                uint32 ir3 = fetch_2();
                    858:                uint c1 = ir2 & 7;
                    859:                uint u1 = (ir2 >> 6) & 7;
                    860:                uint r1 = ir2 >> 12;
                    861:                uint c2 = ir3 & 7;
                    862:                uint u2 = (ir3 >> 6) & 7;
                    863:                uint r2 = ir3 >> 12;
                    864:                uint32 dc1 = reg.D[c1] & 0xffff;
                    865:                uint32 du1 = reg.D[u1] & 0xffff;
                    866:                uint32 ea1 = reg.R[r1];
                    867:                uint32 dc2 = reg.D[c2] & 0xffff;
                    868:                uint32 du2 = reg.D[u2] & 0xffff;
                    869:                uint32 ea2 = reg.R[r2];
                    870: 
                    871:                uint32 dst1 = read_2(ea1);
                    872:                uint32 dst2 = read_2(ea2);
                    873:                ACC.cmp_16(dc1, dst1);
                    874:                if (CCR.IsZ()) {
                    875:                        ACC.cmp_16(dc2, dst2);
                    876:                        if (CCR.IsZ()) {
                    877:                                // 更新オペランド -> デスティネーション
                    878:                                CYCLE2(0, 2);   // これは成功時の追加分
                    879:                                write_2(ea1, du1);
                    880:                                write_2(ea2, du2);
                    881:                        }
                    882:                }
                    883:                // デスティネーション -> 比較オペランド
                    884:                CYCLE(24);      // 本当はこれは最大値
                    885:                reg.D[c1] = (reg.D[c1] & 0xffff0000) | dst1;
                    886:                reg.D[c2] = (reg.D[c2] & 0xffff0000) | dst2;
                    887:        } else {
                    888:                // CAS.W Dc,Du,<ea>
                    889:                ir2 = fetch_2();
                    890:                uint c = ir2 & 7;
                    891:                uint u = (ir2 >> 6) & 7;
                    892:                uint32 dc = reg.D[c] & 0xffff;
                    893:                uint32 du = reg.D[u] & 0xffff;
                    894:                uint ea = cea_data_2();
                    895:                uint32 dst = read_2(ea);
                    896: 
                    897:                ACC.cmp_16(dc, dst);
                    898:                if (CCR.IsZ()) {
                    899:                        // 等しければ、Du -> dst
                    900:                        CYCLE(13);
                    901:                        write_2(ea, du);
                    902:                } else {
                    903:                        // そうでなければ、dst -> Dc
                    904:                        CYCLE(11);
                    905:                        reg.D[c] = (reg.D[c] & 0xffff0000) | dst;
                    906:                }
                    907:        }
                    908: }
                    909: 
                    910: // 68040 は MOVES でのプログラム空間アクセスをデータ空間アクセスに読み替える。
                    911: // バスエラーで報告されるのも読み替え後の FC なので、ここで差し替える。
                    912: // MC68040UM.pdf, p3-22。
                    913: // 68000PRM.pdf, p.6-26 の記述は逆に読めるが、誤りだと思われる。
                    914: busaddr
                    915: MPU680x0Device::translate_fc40(busaddr xfc)
                    916: {
                    917:        if (mpu_type == m680x0MPUType::M68040) {
                    918:                uint32 fc = xfc.GetFC();
                    919:                if (fc == 2) {
                    920:                        xfc.ChangeFC(1);
                    921:                } else if (fc == 6) {
                    922:                        xfc.ChangeFC(5);
                    923:                }
                    924:        }
                    925:        return xfc;
                    926: }
                    927: 
                    928: // %0000_111000_mmmrrr ..m+-rxw.. -34  MOVES.B <ea>,Rn
                    929: // %0000_111000_mmmrrr ..m+-rxw.. -34  MOVES.B Rn,<ea>
                    930: OP_DEF(moves_b)
                    931: {
                    932:        SUPERVISOR_OP;
                    933: 
                    934:        ir2 = fetch_2();
                    935:        uint n = ir2 >> 12;
                    936:        uint ea;
                    937:        uint32 data;
                    938: 
                    939:        if ((ir & 0x3f) < 16) {
                    940:                op_illegal();
                    941:                return;
                    942:        }
                    943: 
                    944:        ea = cea_data_1();
                    945:        if ((ir2 & 0x0800) == 0) {
                    946:                // <ea>,Rn
                    947:                CYCLE(7);
                    948:                busaddr sfc = translate_fc40(reg.sfc);
                    949:                busaddr addr = busaddr(ea) | sfc | BusAddr::Size1;
                    950:                data = read_data(addr);
                    951:                if (n < 8) {    // Dn
                    952:                        reg.D[n] = (reg.D[n] & 0xffffff00) | data;
                    953:                } else {                // An
                    954:                        reg.R[n] = (int32)(int8)data;
                    955:                }
                    956:        } else {
                    957:                // Rn,<ea>
                    958:                CYCLE2(5, 6);
                    959:                busaddr dfc = translate_fc40(reg.dfc);
                    960:                busaddr addr = busaddr(ea) | dfc | BusAddr::Size1;
                    961:                data = reg.R[n] & 0xff;
                    962:                write_data(addr, data);
                    963:        }
                    964: }
                    965: 
                    966: // %0000_111001_mmmrrr ..m+-rxw.. -34  MOVES.W <ea>,Rn
                    967: // %0000_111001_mmmrrr ..m+-rxw.. -34  MOVES.W Rn,<ea>
                    968: OP_DEF(moves_w)
                    969: {
                    970:        SUPERVISOR_OP;
                    971: 
                    972:        ir2 = fetch_2();
                    973:        uint n = ir2 >> 12;
                    974:        uint ea;
                    975:        uint32 data;
                    976: 
                    977:        if ((ir & 0x3f) < 16) {
                    978:                op_illegal();
                    979:                return;
                    980:        }
                    981: 
                    982:        ea = cea_data_2();
                    983:        if ((ir2 & 0x0800) == 0) {
                    984:                // <ea>,Rn
                    985:                CYCLE(7);
                    986:                busaddr sfc = translate_fc40(reg.sfc);
                    987:                busaddr addr = busaddr(ea) | sfc | BusAddr::Size2;
                    988:                data = read_data(addr);
                    989:                if (n < 8) {    // Dn
                    990:                        reg.D[n] = (reg.D[n] & 0xffff0000) | data;
                    991:                } else {                // An
                    992:                        reg.R[n] = (int32)(int16)data;
                    993:                }
                    994:        } else {
                    995:                // Rn,<ea>
                    996:                CYCLE2(5, 6);
                    997:                busaddr dfc = translate_fc40(reg.dfc);
                    998:                busaddr addr = busaddr(ea) | dfc | BusAddr::Size2;
                    999:                data = reg.R[n] & 0xffff;
                   1000:                write_data(addr, data);
                   1001:        }
                   1002: }
                   1003: 
                   1004: // %0000_111010_mmmrrr ..m+-rxw.. -34  MOVES.L <ea>,Rn
                   1005: // %0000_111010_mmmrrr ..m+-rxw.. -34  MOVES.L Rn,<ea>
                   1006: OP_DEF(moves_l)
                   1007: {
                   1008:        SUPERVISOR_OP;
                   1009: 
                   1010:        ir2 = fetch_2();
                   1011:        uint n = ir2 >> 12;
                   1012:        uint ea;
                   1013:        uint32 data;
                   1014: 
                   1015:        if ((ir & 0x3f) < 16) {
                   1016:                op_illegal();
                   1017:                return;
                   1018:        }
                   1019: 
                   1020:        ea = cea_data_4();
                   1021:        if ((ir2 & 0x0800) == 0) {
                   1022:                // <ea>,Rn
                   1023:                CYCLE(7);
                   1024:                busaddr sfc = translate_fc40(reg.sfc);
                   1025:                busaddr addr = busaddr(ea) | sfc | BusAddr::Size4;
                   1026:                data = read_data(addr);
                   1027:                reg.R[n] = data;
                   1028:        } else {
                   1029:                // Rn,<ea>
                   1030:                CYCLE2(5, 6);
                   1031:                busaddr dfc = translate_fc40(reg.dfc);
                   1032:                busaddr addr = busaddr(ea) | dfc | BusAddr::Size4;
                   1033:                data = reg.R[n];
                   1034:                write_data(addr, data);
                   1035:        }
                   1036: }
                   1037: 
                   1038: // %0000_111011_mmmrrr ..m+-rxw.. -34  CAS.L Dc,Du,<ea>
                   1039: // %0000_111011_111100 .......... -34  CAS2.L Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
                   1040: OP_DEF(cas_l)
                   1041: {
                   1042:        uint n = ir & 0x3f;
                   1043: 
                   1044:        if (n == 0x3c) {
                   1045:                // CAS2.L Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
                   1046:                ir2 = fetch_2();
                   1047:                uint32 ir3 = fetch_2();
                   1048:                uint c1 = ir2 & 7;
                   1049:                uint u1 = (ir2 >> 6) & 7;
                   1050:                uint r1 = ir2 >> 12;
                   1051:                uint c2 = ir3 & 7;
                   1052:                uint u2 = (ir3 >> 6) & 7;
                   1053:                uint r2 = ir3 >> 12;
                   1054:                uint32 dc1 = reg.D[c1];
                   1055:                uint32 du1 = reg.D[u1];
                   1056:                uint32 ea1 = reg.R[r1];
                   1057:                uint32 dc2 = reg.D[c2];
                   1058:                uint32 du2 = reg.D[u2];
                   1059:                uint32 ea2 = reg.R[r2];
                   1060: 
                   1061:                uint32 dst1 = read_4(ea1);
                   1062:                uint32 dst2 = read_4(ea2);
                   1063:                ACC.cmp_32(dc1, dst1);
                   1064:                if (CCR.IsZ()) {
                   1065:                        ACC.cmp_32(dc2, dst2);
                   1066:                        if (CCR.IsZ()) {
                   1067:                                // 更新オペランド -> デスティネーション
                   1068:                                CYCLE2(0, 2);   // これは成功時の追加分
                   1069:                                write_4(ea1, du1);
                   1070:                                write_4(ea2, du2);
                   1071:                        }
                   1072:                }
                   1073:                // デスティネーション -> 比較オペランド
                   1074:                CYCLE(24);      // 本当はこれは最大値
                   1075:                reg.D[c1] = dst1;
                   1076:                reg.D[c2] = dst2;
                   1077:        } else {
                   1078:                // CAS.L Dc,Du,<ea>
                   1079:                ir2 = fetch_2();
                   1080:                uint c = ir2 & 7;
                   1081:                uint u = (ir2 >> 6) & 7;
                   1082:                uint32 dc = reg.D[c];
                   1083:                uint32 du = reg.D[u];
                   1084:                uint ea = cea_data_4();
                   1085:                uint32 dst = read_4(ea);
                   1086: 
                   1087:                ACC.cmp_32(dc, dst);
                   1088:                if (CCR.IsZ()) {
                   1089:                        // 等しければ、Du -> dst
                   1090:                        CYCLE(13);
                   1091:                        write_4(ea, du);
                   1092:                } else {
                   1093:                        // そうでなければ、dst -> Dc
                   1094:                        CYCLE(11);
                   1095:                        reg.D[c] = dst;
                   1096:                }
                   1097:        }
                   1098: }
                   1099: 
                   1100: // %0001_xxx000_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,Dx
                   1101: OP_DEF(move_b_ea_dn)
                   1102: {
                   1103:        CYCLE(2);
                   1104:        uint32 data = fea_all_1();
                   1105:        ACC.move_8(data);
                   1106:        RegDX = (RegDX & 0xffffff00) | data;
                   1107: }
                   1108: 
                   1109: // %0001_xxx010_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,(Ax)
                   1110: OP_DEF(move_b_ea_anin)
                   1111: {
                   1112:        // 実際にはソースがレジスタなら (3, 4)、メモリなら (4, 5)
                   1113:        CYCLE2(4, 5);
                   1114:        uint32 data = fea_all_1();
                   1115:        uint32 ea = cea_anin(RegIRX);
                   1116:        ACC.move_8(data);
                   1117:        write_1(ea, data);
                   1118: }
                   1119: 
                   1120: // %0001_xxx011_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,(Ax)+
                   1121: OP_DEF(move_b_ea_anpi)
                   1122: {
                   1123:        // 実際にはソースがレジスタなら (3, 4)、メモリなら (4, 5)
                   1124:        CYCLE2(4, 5);
                   1125:        uint32 data = fea_all_1();
                   1126:        // (An)+,(Ax)+ が n==x なら2回目はセーブしてはいけない。
                   1127:        save_reg_pi_if(RegIRX);
                   1128:        uint32 ea = cea_anpi_1(RegIRX);
                   1129:        ACC.move_8(data);
                   1130:        write_1(ea, data);
                   1131: }
                   1132: 
                   1133: // %0001_xxx100_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,-(Ax)
                   1134: OP_DEF(move_b_ea_anpd)
                   1135: {
                   1136:        // 実際にはソースがレジスタなら (4, 4)、メモリなら (4, 5)
                   1137:        CYCLE2(4, 5);
                   1138:        uint32 data = fea_all_1();
                   1139:        // -(An),-(Ax) が n==x なら2回目はセーブしてはいけない。
                   1140:        save_reg_pd_if(RegIRX);
                   1141:        uint32 ea = cea_anpd_1(RegIRX);
                   1142:        ACC.move_8(data);
                   1143:        write_1(ea, data);
                   1144: }
                   1145: 
                   1146: // %0001_xxx101_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,d16(Ax)
                   1147: OP_DEF(move_b_ea_andi)
                   1148: {
                   1149:        CYCLE2(4, 5);
                   1150:        uint32 data = fea_all_1();
                   1151:        uint32 ea = cea_andi(RegIRX);
                   1152:        ACC.move_8(data);
                   1153:        write_1(ea, data);
                   1154: }
                   1155: 
                   1156: // %0001_xxx110_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,(Ax,IX)
                   1157: OP_DEF(move_b_ea_anix)
                   1158: {
                   1159:        // XXX 実際にはdstのフォーマットによって(8,9)-(20,23)
                   1160:        CYCLE2(16, 18);
                   1161:        uint32 data = fea_all_1();
                   1162:        uint32 ea = cea_anix(RegIRX);
                   1163:        ACC.move_8(data);
                   1164:        write_1(ea, data);
                   1165: }
                   1166: 
                   1167: // %0001_000111_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,Abs.W
                   1168: OP_DEF(move_b_ea_absw)
                   1169: {
                   1170:        CYCLE2(4, 5);
                   1171:        uint32 data = fea_all_1();
                   1172:        uint32 ea = cea_absw();
                   1173:        ACC.move_8(data);
                   1174:        write_1(ea, data);
                   1175: }
                   1176: 
                   1177: // %0001_001111_mmmrrr d.m+-rxwpi 034  MOVE.B <ea>,Abs.L
                   1178: OP_DEF(move_b_ea_absl)
                   1179: {
                   1180:        CYCLE2(6, 7);
                   1181:        uint32 data = fea_all_1();
                   1182:        uint32 ea = cea_absl();
                   1183:        ACC.move_8(data);
                   1184:        write_1(ea, data);
                   1185: }
                   1186: 
                   1187: // %0010_xxx000_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,Dx
                   1188: OP_DEF(move_l_ea_dn)
                   1189: {
                   1190:        CYCLE(2);
                   1191:        uint32 data = fea_all_4();
                   1192:        ACC.move_32(data);
                   1193:        RegDX = data;
                   1194: }
                   1195: 
                   1196: // %0010_xxx001_mmmrrr dam+-rxwpi 034  MOVEA.L <ea>,Ax
                   1197: OP_DEF(movea_l)
                   1198: {
                   1199:        CYCLE(2);
                   1200:        uint32 data = fea_all_4();
                   1201:        RegAX = data;
                   1202: }
                   1203: 
                   1204: // %0010_xxx010_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,(Ax)
                   1205: OP_DEF(move_l_ea_anin)
                   1206: {
                   1207:        // 実際にはソースがレジスタなら (3, 4)、メモリなら (4, 5)
                   1208:        CYCLE2(4, 5);
                   1209:        uint32 data = fea_all_4();
                   1210:        uint32 ea = cea_anin(RegIRX);
                   1211:        ACC.move_32(data);
                   1212:        write_4(ea, data);
                   1213: }
                   1214: 
                   1215: // %0010_xxx011_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,(Ax)+
                   1216: OP_DEF(move_l_ea_anpi)
                   1217: {
                   1218:        // 実際にはソースがレジスタなら (3, 4)、メモリなら (4, 5)
                   1219:        CYCLE2(4, 5);
                   1220:        uint32 data = fea_all_4();
                   1221:        // (An)+,(Ax)+ が n==x なら2回目はセーブしてはいけない。
                   1222:        save_reg_pi_if(RegIRX);
                   1223:        uint32 ea = cea_anpi_4(RegIRX);
                   1224:        ACC.move_32(data);
                   1225:        write_4(ea, data);
                   1226: }
                   1227: 
                   1228: // %0010_xxx100_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,-(Ax)
                   1229: OP_DEF(move_l_ea_anpd)
                   1230: {
                   1231:        // 実際にはソースがレジスタなら (4, 4)、メモリなら (4, 5)
                   1232:        CYCLE2(4, 5);
                   1233:        uint32 data = fea_all_4();
                   1234:        // -(An),-(Ax) が n==x なら2回目はセーブしてはいけない。
                   1235:        save_reg_pd_if(RegIRX);
                   1236:        uint32 ea = cea_anpd_4(RegIRX);
                   1237:        ACC.move_32(data);
                   1238:        write_4(ea, data);
                   1239: }
                   1240: 
                   1241: // %0010_xxx101_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,d16(Ax)
                   1242: OP_DEF(move_l_ea_andi)
                   1243: {
                   1244:        CYCLE2(4, 5);
                   1245:        uint32 data = fea_all_4();
                   1246:        uint32 ea = cea_andi(RegIRX);
                   1247:        ACC.move_32(data);
                   1248:        write_4(ea, data);
                   1249: }
                   1250: 
                   1251: // %0010_xxx110_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,(Ax,IX)
                   1252: OP_DEF(move_l_ea_anix)
                   1253: {
                   1254:        // XXX 実際にはdstのフォーマットによって(8,9)-(20,23)
                   1255:        CYCLE2(16, 18);
                   1256:        uint32 data = fea_all_4();
                   1257:        uint32 ea = cea_anix(RegIRX);
                   1258:        ACC.move_32(data);
                   1259:        write_4(ea, data);
                   1260: }
                   1261: 
                   1262: // %0010_000111_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,Abs.W
                   1263: OP_DEF(move_l_ea_absw)
                   1264: {
                   1265:        CYCLE2(4, 5);
                   1266:        uint32 data = fea_all_4();
                   1267:        uint32 ea = cea_absw();
                   1268:        ACC.move_32(data);
                   1269:        write_4(ea, data);
                   1270: }
                   1271: 
                   1272: // %0010_001111_mmmrrr dam+-rxwpi 034  MOVE.L <ea>,Abs.L
                   1273: OP_DEF(move_l_ea_absl)
                   1274: {
                   1275:        CYCLE2(6, 7);
                   1276:        uint32 data = fea_all_4();
                   1277:        uint32 ea = cea_absl();
                   1278:        ACC.move_32(data);
                   1279:        write_4(ea, data);
                   1280: }
                   1281: 
                   1282: // %0011_xxx000_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,Dx
                   1283: OP_DEF(move_w_ea_dn)
                   1284: {
                   1285:        CYCLE(2);
                   1286:        uint32 data = fea_all_2();
                   1287:        ACC.move_16(data);
                   1288:        RegDX = (RegDX & 0xffff0000) | data;
                   1289: }
                   1290: 
                   1291: // %0011_xxx001_mmmrrr dam+-rxwpi 034  MOVEA.W <ea>,Ax
                   1292: OP_DEF(movea_w)
                   1293: {
                   1294:        CYCLE(2);
                   1295:        uint32 data = (int32)(int16)fea_all_2();
                   1296:        RegAX = data;
                   1297: }
                   1298: 
                   1299: // %0011_xxx010_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,(Ax)
                   1300: OP_DEF(move_w_ea_anin)
                   1301: {
                   1302:        // 実際にはソースがレジスタなら (3, 4)、メモリなら (4, 5)
                   1303:        CYCLE2(4, 5);
                   1304:        uint32 data = fea_all_2();
                   1305:        uint32 ea = cea_anin(RegIRX);
                   1306:        ACC.move_16(data);
                   1307:        write_2(ea, data);
                   1308: }
                   1309: 
                   1310: // %0011_xxx011_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,(Ax)+
                   1311: OP_DEF(move_w_ea_anpi)
                   1312: {
                   1313:        // 実際にはソースがレジスタなら (3, 4)、メモリなら (4, 5)
                   1314:        CYCLE2(4, 5);
                   1315:        uint32 data = fea_all_2();
                   1316:        // (An)+,(Ax)+ が n==x なら2回目はセーブしてはいけない。
                   1317:        save_reg_pi_if(RegIRX);
                   1318:        uint32 ea = cea_anpi_2(RegIRX);
                   1319:        ACC.move_16(data);
                   1320:        write_2(ea, data);
                   1321: }
                   1322: 
                   1323: // %0011_xxx100_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,-(Ax)
                   1324: OP_DEF(move_w_ea_anpd)
                   1325: {
                   1326:        // 実際にはソースがレジスタなら (4, 4)、メモリなら (4, 5)
                   1327:        CYCLE2(4, 5);
                   1328:        uint32 data = fea_all_2();
                   1329:        // -(An),-(Ax) が n==x なら2回目はセーブしてはいけない。
                   1330:        save_reg_pd_if(RegIRX);
                   1331:        uint32 ea = cea_anpd_2(RegIRX);
                   1332:        ACC.move_16(data);
                   1333:        write_2(ea, data);
                   1334: }
                   1335: 
                   1336: // %0011_xxx101_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,d16(Ax)
                   1337: OP_DEF(move_w_ea_andi)
                   1338: {
                   1339:        CYCLE2(4, 5);
                   1340:        uint32 data = fea_all_2();
                   1341:        uint32 ea = cea_andi(RegIRX);
                   1342:        ACC.move_16(data);
                   1343:        write_2(ea, data);
                   1344: }
                   1345: 
                   1346: // %0011_xxx110_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,(Ax,IX)
                   1347: OP_DEF(move_w_ea_anix)
                   1348: {
                   1349:        // XXX 実際にはdstのフォーマットによって(8,9)-(20,23)
                   1350:        CYCLE2(16, 18);
                   1351:        uint32 data = fea_all_2();
                   1352:        uint32 ea = cea_anix(RegIRX);
                   1353:        ACC.move_16(data);
                   1354:        write_2(ea, data);
                   1355: }
                   1356: 
                   1357: // %0011_000111_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,Abs.W
                   1358: OP_DEF(move_w_ea_absw)
                   1359: {
                   1360:        CYCLE2(4, 5);
                   1361:        uint32 data = fea_all_2();
                   1362:        uint32 ea = cea_absw();
                   1363:        ACC.move_16(data);
                   1364:        write_2(ea, data);
                   1365: }
                   1366: 
                   1367: // %0011_001111_mmmrrr dam+-rxwpi 034  MOVE.W <ea>,Abs.L
                   1368: OP_DEF(move_w_ea_absl)
                   1369: {
                   1370:        CYCLE2(6, 7);
                   1371:        uint32 data = fea_all_2();
                   1372:        uint32 ea = cea_absl();
                   1373:        ACC.move_16(data);
                   1374:        write_2(ea, data);
                   1375: }
                   1376: 
                   1377: // %0100_000000_mmmrrr d.m+-rxw.. 034  NEGX.B <ea>
                   1378: OP_DEF(negx_b)
                   1379: {
                   1380:        uint n = ir & 0x3f;
                   1381: 
                   1382:        if (n < 8) {
                   1383:                // NEGX.B Dn
                   1384:                CYCLE(2);
                   1385:                uint32 data = reg.D[n] & 0xff;
                   1386:                data = ACC.subx_8(data, 0);
                   1387:                reg.D[n] = (reg.D[n] & 0xffffff00) | data;
                   1388:        } else if (n < 16) {
                   1389:                op_illegal();
                   1390:        } else {
                   1391:                // NEGX.B <ea>
                   1392:                CYCLE2(3, 4);
                   1393:                uint32 ea = cea_data_1();
                   1394:                uint32 data = read_1(ea);
                   1395:                data = ACC.subx_8(data, 0);
                   1396:                write_1(ea, data);
                   1397:        }
                   1398: }
                   1399: 
                   1400: // %0100_000001_mmmrrr d.m+-rxw.. 034  NEGX.W <ea>
                   1401: OP_DEF(negx_w)
                   1402: {
                   1403:        uint n = ir & 0x3f;
                   1404: 
                   1405:        if (n < 8) {
                   1406:                // NEGX.W Dn
                   1407:                CYCLE(2);
                   1408:                uint32 data = reg.D[n] & 0xffff;
                   1409:                data = ACC.subx_16(data, 0);
                   1410:                reg.D[n] = (reg.D[n] & 0xffff0000) | data;
                   1411:        } else if (n < 16) {
                   1412:                op_illegal();
                   1413:        } else {
                   1414:                // NEGX.W <ea>
                   1415:                CYCLE2(3, 4);
                   1416:                uint32 ea = cea_data_2();
                   1417:                uint32 data = read_2(ea);
                   1418:                data = ACC.subx_16(data, 0);
                   1419:                write_2(ea, data);
                   1420:        }
                   1421: }
                   1422: 
                   1423: // %0100_000010_mmmrrr d.m+-rxw.. 034  NEGX.L <ea>
                   1424: OP_DEF(negx_l)
                   1425: {
                   1426:        uint n = ir & 0x3f;
                   1427: 
                   1428:        if (n < 8) {
                   1429:                // NEGX.L Dn
                   1430:                CYCLE(2);
                   1431:                reg.D[n] = ACC.subx_32(reg.D[n], 0);
                   1432:        } else if (n < 16) {
                   1433:                op_illegal();
                   1434:        } else {
                   1435:                // NEGX.L <ea>
                   1436:                CYCLE2(3, 4);
                   1437:                uint32 ea = cea_data_4();
                   1438:                uint32 data = read_4(ea);
                   1439:                data = ACC.subx_32(data, 0);
                   1440:                write_4(ea, data);
                   1441:        }
                   1442: }
                   1443: 
                   1444: // %0100_000011_mmmrrr d.m+-rxw.. -34  MOVE.W SR,<ea>
                   1445: OP_DEF(move_sr_ea)
                   1446: {
                   1447:        SUPERVISOR_OP;
                   1448: 
                   1449:        uint n = ir & 0x3f;
                   1450:        if (n < 8) {
                   1451:                // MOVE.W SR,Dn
                   1452:                CYCLE(4);
                   1453:                reg.D[n] = (reg.D[n] & 0xffff0000) | GetSR();
                   1454:        } else {
                   1455:                // MOVE.W SR,<ea>
                   1456:                CYCLE2(4, 5);
                   1457:                uint32 ea = cea_data_2();
                   1458:                write_2(ea, GetSR());
                   1459:        }
                   1460: }
                   1461: 
                   1462: // %0100_xxx100_mmmrrr d.m+-rxwpi -34  CHK.L <ea>,Dx
                   1463: OP_DEF(chk_l)
                   1464: {
                   1465:        uint32 dst = RegDX;
                   1466:        ACC.move_32(dst);
                   1467:        if (CCR.IsN()) {
                   1468:                // これは最大値で次の条件式が成立した時の値なので、
                   1469:                // 実際にはこれより小さい確定した値のはずだけど。
                   1470:                CYCLE2(28, 30);
                   1471:                Exception(M68K::EXCEP_CHK);
                   1472:                return;
                   1473:        }
                   1474:        // 本当はこうじゃないけど、とりあえず
                   1475:        uint32 src = fea_data_4();
                   1476:        if ((int32)dst > (int32)src) {
                   1477:                CYCLE2(28, 30);
                   1478:                CCR.SetN(false);
                   1479:                Exception(M68K::EXCEP_CHK);
                   1480:                return;
                   1481:        }
                   1482:        CYCLE(8);
                   1483: }
                   1484: 
                   1485: // %0100_xxx110_mmmrrr d.m+-rxwpi 034  CHK.W <ea>,Dx
                   1486: OP_DEF(chk_w)
                   1487: {
                   1488:        uint32 dst = RegDX & 0xffff;
                   1489:        ACC.move_16(dst);
                   1490:        if (CCR.IsN()) {
                   1491:                // これは最大値で次の条件式が成立した時の値なので、
                   1492:                // 実際にはこれより小さい確定した値のはずだけど。
                   1493:                CYCLE2(28, 30);
                   1494:                Exception(M68K::EXCEP_CHK);
                   1495:                return;
                   1496:        }
                   1497:        // 本当はこうじゃないけど、とりあえず
                   1498:        uint32 src = fea_data_2();
                   1499:        if ((int16)dst > (int16)src) {
                   1500:                CYCLE2(28, 30);
                   1501:                CCR.SetN(false);
                   1502:                Exception(M68K::EXCEP_CHK);
                   1503:                return;
                   1504:        }
                   1505:        CYCLE(8);
                   1506: }
                   1507: 
                   1508: // %0100_xxx111_mmmrrr ..m..rxwp. 034  LEA.L <ea>,Ax
                   1509: // %0100_100111_000yyy .......... -34  EXTB.L Dy
                   1510: OP_DEF(lea)
                   1511: {
                   1512:        uint n = ir & 0x3f;
                   1513: 
                   1514:        if (n < 8) {
                   1515:                // EXTB.L Dy
                   1516:                CYCLE(4);
                   1517:                RegDY = (int32)(int8)(RegDY & 0xff);
                   1518:                ACC.move_32(RegDY);
                   1519:        } else {
                   1520:                // LEA.L <ea>,Ax
                   1521:                CYCLE(2);
                   1522:                RegAX = cea_ctrl();
                   1523:        }
                   1524: }
                   1525: 
                   1526: // %0100_001000_mmmrrr d.m+-rxw.. 034  CLR.B <ea>
                   1527: OP_DEF(clr_b)
                   1528: {
                   1529:        uint n = ir & 0x3f;
                   1530: 
                   1531:        if (n < 8) {
                   1532:                // CLR.B Dn
                   1533:                CYCLE(2);
                   1534:                RegDY &= 0xffffff00;
                   1535:                ACC.move_8(0);
                   1536:        } else {
                   1537:                // CLR.B <ea>
                   1538:                CYCLE2(3, 4);
                   1539:                uint32 ea = cea_data_1();
                   1540:                ACC.move_8(0);
                   1541:                write_1(ea, 0);
                   1542:        }
                   1543: }
                   1544: 
                   1545: // %0100_001001_mmmrrr d.m+-rxw.. 034  CLR.W <ea>
                   1546: OP_DEF(clr_w)
                   1547: {
                   1548:        uint n = ir & 0x3f;
                   1549: 
                   1550:        if (n < 8) {
                   1551:                // CLR.W Dn
                   1552:                CYCLE(2);
                   1553:                RegDY &= 0xffff0000;
                   1554:                ACC.move_16(0);
                   1555:        } else {
                   1556:                // CLR.W <ea>
                   1557:                CYCLE2(3, 4);
                   1558:                uint32 ea = cea_data_2();
                   1559:                ACC.move_16(0);
                   1560:                write_2(ea, 0);
                   1561:        }
                   1562: }
                   1563: 
                   1564: // %0100_001010_mmmrrr d.m+-rxw.. 034  CLR.L <ea>
                   1565: OP_DEF(clr_l)
                   1566: {
                   1567:        uint n = ir & 0x3f;
                   1568: 
                   1569:        if (n < 8) {
                   1570:                // CLR.L Dn
                   1571:                CYCLE(2);
                   1572:                RegDY = 0;
                   1573:                ACC.move_32(0);
                   1574:        } else {
                   1575:                // CLR.L <ea>
                   1576:                CYCLE2(3, 4);
                   1577:                uint32 ea = cea_data_4();
                   1578:                ACC.move_32(0);
                   1579:                write_4(ea, 0);
                   1580:        }
                   1581: }
                   1582: 
                   1583: // %0100_001011_mmmrrr d.m+-rxw.. -34  MOVE.W CCR,<ea>
                   1584: OP_DEF(move_ccr_ea)
                   1585: {
                   1586:        uint n = ir & 0x3f;
                   1587: 
                   1588:        // 転送は16ビットで行われ、上位バイトと未実装ビットは %0 になる。
                   1589:        if (n < 8) {
                   1590:                // MOVE.W CCR,Dn
                   1591:                CYCLE(4);
                   1592:                reg.D[n] = (reg.D[n] & 0xffff0000) | CCR.Get();
                   1593:        } else if (n < 16) {
                   1594:                // MOVE.W CCR,An はない
                   1595:                op_illegal();
                   1596:        } else {
                   1597:                // MOVE.W CCR,<ea>
                   1598:                CYCLE2(4, 5);
                   1599:                uint32 ea = cea_data_2();
                   1600:                write_2(ea, CCR.Get());
                   1601:        }
                   1602: }
                   1603: 
                   1604: // %0100_010000_mmmrrr d.m+-rxw.. 034  NEG.B <ea>
                   1605: OP_DEF(neg_b)
                   1606: {
                   1607:        uint n = ir & 0x3f;
                   1608: 
                   1609:        if (n < 8) {
                   1610:                // NEG.B Dn
                   1611:                CYCLE(2);
                   1612:                uint32 data = ACC.sub_8(reg.D[n] & 0xff, 0);
                   1613:                reg.D[n] = (reg.D[n] & 0xffffff00) | data;
                   1614:        } else {
                   1615:                // NEG.B <ea>
                   1616:                CYCLE2(3, 4);
                   1617:                uint32 ea = cea_data_1();
                   1618:                uint32 data = read_1(ea);
                   1619:                data = ACC.sub_8(data, 0);
                   1620:                write_1(ea, data);
                   1621:        }
                   1622: }
                   1623: 
                   1624: // %0100_010001_mmmrrr d.m+-rxw.. 034  NEG.W <ea>
                   1625: OP_DEF(neg_w)
                   1626: {
                   1627:        uint n = ir & 0x3f;
                   1628: 
                   1629:        if (n < 8) {
                   1630:                // NEG.W Dn
                   1631:                CYCLE(2);
                   1632:                uint32 data = ACC.sub_16(reg.D[n] & 0xffff, 0);
                   1633:                reg.D[n] = (reg.D[n] & 0xffff0000) | data;
                   1634:        } else {
                   1635:                // NEG.W <ea>
                   1636:                CYCLE2(3, 4);
                   1637:                uint32 ea = cea_data_2();
                   1638:                uint32 data = read_2(ea);
                   1639:                data = ACC.sub_16(data, 0);
                   1640:                write_2(ea, data);
                   1641:        }
                   1642: }
                   1643: 
                   1644: // %0100_010010_mmmrrr d.m+-rxw.. 034  NEG.L <ea>
                   1645: OP_DEF(neg_l)
                   1646: {
                   1647:        uint n = ir & 0x3f;
                   1648: 
                   1649:        if (n < 8) {
                   1650:                // NEG.L Dn
                   1651:                CYCLE(2);
                   1652:                reg.D[n] = ACC.sub_32(reg.D[n], 0);
                   1653:        } else {
                   1654:                // NEG.L <ea>
                   1655:                CYCLE2(3, 4);
                   1656:                uint32 ea = cea_data_4();
                   1657:                uint32 data = read_4(ea);
                   1658:                data = ACC.sub_32(data, 0);
                   1659:                write_4(ea, data);
                   1660:        }
                   1661: }
                   1662: 
                   1663: // %0100_010011_mmmrrr d.m+-rxwpi 034  MOVE.W <ea>,CCR
                   1664: OP_DEF(move_ea_ccr)
                   1665: {
                   1666:        uint n = ir & 0x3f;
                   1667: 
                   1668:        if (n < 8) {
                   1669:                // MOVE.W Dn,CCR
                   1670:                CYCLE(4);
                   1671:                uint32 data = reg.D[n] & 0xff;
                   1672:                CCR.Set(data);
                   1673:        } else if (n < 16) {
                   1674:                // MOVE.W An,CCR はない
                   1675:                op_illegal();
                   1676:        } else {
                   1677:                // MOVE.W <ea>,CCR
                   1678:                CYCLE(4);
                   1679:                uint32 data = fea_data_2();
                   1680:                CCR.Set(data);
                   1681:        }
                   1682: }
                   1683: 
                   1684: // %0100_011000_mmmrrr d.m+-rxw.. 034  NOT.B <ea>
                   1685: OP_DEF(not_b)
                   1686: {
                   1687:        uint n = ir & 0x3f;
                   1688: 
                   1689:        if (n < 8) {
                   1690:                // NOT.B Dn
                   1691:                CYCLE(2);
                   1692:                uint32 data = (~reg.D[n]) & 0xff;
                   1693:                ACC.move_8(data);
                   1694:                reg.D[n] = (reg.D[n] & 0xffffff00) | data;
                   1695:        } else {
                   1696:                // NOT.B <ea>
                   1697:                CYCLE2(3, 4);
                   1698:                uint32 ea = cea_data_1();
                   1699:                uint32 data = read_1(ea);
                   1700:                data = (~data) & 0xff;
                   1701:                ACC.move_8(data);
                   1702:                write_1(ea, data);
                   1703:        }
                   1704: }
                   1705: 
                   1706: // %0100_011001_mmmrrr d.m+-rxw.. 034  NOT.W <ea>
                   1707: OP_DEF(not_w)
                   1708: {
                   1709:        uint n = ir & 0x3f;
                   1710: 
                   1711:        if (n < 8) {
                   1712:                // NOT.W Dn
                   1713:                CYCLE(2);
                   1714:                uint32 data = (~reg.D[n]) & 0xffff;
                   1715:                ACC.move_16(data);
                   1716:                reg.D[n] = (reg.D[n] & 0xffff0000) | data;
                   1717:        } else {
                   1718:                // NOT.W <ea>
                   1719:                CYCLE2(3, 4);
                   1720:                uint32 ea = cea_data_2();
                   1721:                uint32 data = read_2(ea);
                   1722:                data = (~data) & 0xffff;
                   1723:                ACC.move_16(data);
                   1724:                write_2(ea, data);
                   1725:        }
                   1726: }
                   1727: 
                   1728: // %0100_011010_mmmrrr d.m+-rxw.. 034  NOT.L <ea>
                   1729: OP_DEF(not_l)
                   1730: {
                   1731:        uint n = ir & 0x3f;
                   1732: 
                   1733:        if (n < 8) {
                   1734:                // NOT.L Dn
                   1735:                CYCLE(2);
                   1736:                reg.D[n] = ~reg.D[n];
                   1737:                ACC.move_32(reg.D[n]);
                   1738:        } else {
                   1739:                // NOT.L <ea>
                   1740:                CYCLE2(3, 4);
                   1741:                uint32 ea = cea_data_4();
                   1742:                uint32 data = read_4(ea);
                   1743:                data = ~data;
                   1744:                ACC.move_32(data);
                   1745:                write_4(ea, data);
                   1746:        }
                   1747: }
                   1748: 
                   1749: // %0100_011011_mmmrrr d.m+-rxwpi 034  MOVE.W <ea>,SR
                   1750: OP_DEF(move_ea_sr)
                   1751: {
                   1752:        SUPERVISOR_OP;
                   1753: 
                   1754:        CYCLE2(8, 10);
                   1755:        uint16 data = fea_data_2();
                   1756:        SetSR(data);
                   1757: }
                   1758: 
                   1759: // LINK.W, LINK.L は即値の取り出しが違うだけ。
                   1760: void
                   1761: MPU680x0Device::ops_link(int32 imm)
                   1762: {
                   1763:        // ページフォルトに備えて保存する。
                   1764:        save_reg_pd(7);
                   1765:        push_4(RegAY);
                   1766:        RegAY = reg.A[7];
                   1767:        reg.A[7] += imm;
                   1768: }
                   1769: 
                   1770: // %0100_100000_mmmrrr d.m+-rxw.. 034  NBCD.B <ea>
                   1771: // %0100_100000_001yyy .......... -34  LINK.L Ay,#<imm>
                   1772: OP_DEF(nbcd)
                   1773: {
                   1774:        uint n = ir & 0x3f;
                   1775: 
                   1776:        if (n < 8) {
                   1777:                // NBCD.B Dn
                   1778:                CYCLE(6);
                   1779:                uint32 dst = RegDY & 0xff;
                   1780:                dst = ACC.sbcd_8(dst, 0);
                   1781:                RegDY = (RegDY & 0xffffff00) | dst;
                   1782:        } else if (n < 16) {
                   1783:                // LINK.L An,#<imm>
                   1784:                CYCLE2(6, 7);
                   1785:                // レジスタやスタックを変更する前にフェッチしないと、
                   1786:                // ページフォルトで再実行できなくなる
                   1787:                int32 imm = fetch_4();
                   1788:                ops_link(imm);
                   1789:        } else {
                   1790:                // NBCD.B <ea>
                   1791:                CYCLE(6);
                   1792:                uint32 ea = cea_data_1();
                   1793:                uint32 dst = read_1(ea);
                   1794:                dst = ACC.sbcd_8(dst, 0);
                   1795:                write_1(ea, dst);
                   1796:        }
                   1797: }
                   1798: 
                   1799: // %0100_100001_mmmrrr ..m..rxwp. 034  PEA.L <ea>
                   1800: // %0100_100001_000yyy .......... 034  SWAP.W Dy
                   1801: // %0100_100001_001nnn .......... -34  BKPT #<imm>
                   1802: OP_DEF(pea)
                   1803: {
                   1804:        uint n = ir & 0x3f;
                   1805: 
                   1806:        if (n < 8) {
                   1807:                // SWAP.W Dy
                   1808:                CYCLE(4);
                   1809:                reg.D[n] = (reg.D[n] << 16) | (reg.D[n] >> 16);
                   1810:                ACC.move_32(reg.D[n]);
                   1811:        } else if (n < 16) {
                   1812:                // BKPT #<imm>
                   1813:                // ブレークポイント・アクノリッジサイクルに応答するデバイスはないので
                   1814:                // 常に不当命令にする。
                   1815:                CYCLE(9);       // ?
                   1816:                op_illegal();
                   1817:        } else {
                   1818:                // PEA.L <ea>
                   1819:                CYCLE(4);
                   1820:                uint32 ea = cea_ctrl();
                   1821:                // ページフォルトに備えて保存する
                   1822:                save_reg_pd(7);
                   1823:                push_4(ea);
                   1824:        }
                   1825: }
                   1826: 
                   1827: // MOVEM.[WL] <list>,<ea> の共通部分。
                   1828: // bytesize は1レジスタ分のサイズ、.Wなら2、.Lなら4。
                   1829: // 本当はテンプレートにしたい。
                   1830: void
                   1831: MPU680x0Device::ops_movem_list_ea(int bytesize)
                   1832: {
                   1833:        uint32 ea;
                   1834:        int regcount;
                   1835: 
                   1836:        // 不当な第1ワードを弾く
                   1837: #define INVALID(x)     (0xffULL << (56 - ((x) * 8)))
                   1838:        const uint64 valid =
                   1839:                INVALID(0)      // Dn
                   1840:          | INVALID(1)  // An
                   1841:          | INVALID(3)  // (An)+
                   1842:          | 0x3fL;              // (PC)...
                   1843:        if ((int64)(valid << (ir & 0x3f)) < 0) {
                   1844:                op_illegal();
                   1845:                return;
                   1846:        }
                   1847: 
                   1848:        // 第2ワードは EA が正当な場合のみ EA より先にフェッチ
                   1849:        ir2 = fetch_2();
                   1850: 
                   1851:        // EA 取得。MOVEM だけ別対応
                   1852:        // |  M -WXZ  | MOVEM list,<ea>
                   1853:        // だが、不当 EA はすでに弾いてあるので cea_data でいい
                   1854:        if (bytesize == 2) {
                   1855:                ea = cea_data_2();
                   1856:        } else {
                   1857:                ea = cea_data_4();
                   1858:        }
                   1859: 
                   1860:        regcount = 0;
                   1861:        uint list = ir2;
                   1862:        if (eamode(ir) == 4/*-(An)*/) {
                   1863:                // -(An) の場合 reglist の格納順が逆(転送順は LSB から)
                   1864:                // bit15                                      bit0
                   1865:                // D0 D1 D2 D3 D4 D5 D6 D7 A0 A1 A2 A3 A4 A5 A6 A7
                   1866:                while (list) {
                   1867:                        int ctz = __builtin_ctz(list);
                   1868:                        if (bytesize == 2) {
                   1869:                                write_2(ea, reg.R[15 - ctz] & 0xffff);
                   1870:                        } else {
                   1871:                                write_4(ea, reg.R[15 - ctz]);
                   1872:                        }
                   1873:                        ea -= bytesize;
                   1874:                        regcount++;
                   1875:                        // 処理した最下位ビットを落とす
                   1876:                        list &= list - 1;
                   1877:                }
                   1878:                // ea は一つ行き過ぎるので補正
                   1879:                RegAY = ea + bytesize;
                   1880:        } else {
                   1881:                // LSB 側から転送
                   1882:                // bit15                                      bit0
                   1883:                // A7 A6 A5 A4 A4 A2 A1 A0 D7 D6 D5 D4 D3 D2 D1 D0
                   1884:                while (list) {
                   1885:                        int ctz = __builtin_ctz(list);
                   1886:                        if (bytesize == 2) {
                   1887:                                write_2(ea, reg.R[ctz] & 0xffff);
                   1888:                        } else {
                   1889:                                write_4(ea, reg.R[ctz]);
                   1890:                        }
                   1891:                        ea += bytesize;
                   1892:                        regcount++;
                   1893:                        // 処理した最下位ビットを落とす
                   1894:                        list &= list - 1;
                   1895:                }
                   1896:        }
                   1897: 
                   1898:        CYCLE(4 + 2 * regcount);
                   1899: }
                   1900: 
                   1901: // %0100_100010_mmmrrr ..m.-rxw.. 034  MOVEM.W <list>,<ea>
                   1902: // %0100_100010_000yyy .......... 034  EXT.W Dy
                   1903: OP_DEF(movem_w_mem)
                   1904: {
                   1905:        uint n = ir & 0x3f;
                   1906: 
                   1907:        if (n < 8) {
                   1908:                // EXT.W Dy
                   1909:                CYCLE(4);
                   1910:                uint16 data = (int16)(int8)(RegDY & 0xff);
                   1911:                ACC.move_16(data);
                   1912:                RegDY = (RegDY & 0xffff0000) | data;
                   1913:        } else {
                   1914:                // MOVEM.W <list>,<ea>
                   1915:                ops_movem_list_ea(2);
                   1916:        }
                   1917: }
                   1918: 
                   1919: // %0100_100011_mmmrrr ..m.-rxw.. 034  MOVEM.L <list>,<ea>
                   1920: // %0100_100011_000yyy .......... 034  EXT.L Dy
                   1921: OP_DEF(movem_l_mem)
                   1922: {
                   1923:        uint n = ir & 0x3f;
                   1924: 
                   1925:        if (n < 8) {
                   1926:                // EXT.L Dy
                   1927:                CYCLE(4);
                   1928:                RegDY = (int32)(int16)(RegDY & 0x0000ffff);
                   1929:                ACC.move_32(RegDY);
                   1930:        } else {
                   1931:                // MOVEM.L <list>,<ea>
                   1932:                ops_movem_list_ea(4);
                   1933:        }
                   1934: }
                   1935: 
                   1936: // %0100_101000_mmmrrr dam+-rxwpi -34  TST.B <ea>
                   1937: OP_DEF(tst_b)
                   1938: {
                   1939:        CYCLE(2);
                   1940:        uint32 data = fea_all_1();
                   1941:        ACC.move_8(data);
                   1942: }
                   1943: 
                   1944: // %0100_101001_mmmrrr dam+-rxwpi -34  TST.W <ea>
                   1945: OP_DEF(tst_w)
                   1946: {
                   1947:        CYCLE(2);
                   1948:        uint32 data = fea_all_2();
                   1949:        ACC.move_16(data);
                   1950: }
                   1951: 
                   1952: // %0100_101010_mmmrrr dam+-rxwpi -34  TST.L <ea>
                   1953: OP_DEF(tst_l)
                   1954: {
                   1955:        CYCLE(2);
                   1956:        uint32 data = fea_all_4();
                   1957:        ACC.move_32(data);
                   1958: }
                   1959: 
                   1960: // %0100_101011_mmmrrr d.m+-rxw.. 034  TAS.B <ea>
                   1961: // %0100_101011_111100 .......... 034  ILLEGAL
                   1962: OP_DEF(tas)
                   1963: {
                   1964:        uint n = ir & 0x3f;
                   1965: 
                   1966:        if (n < 8) {
                   1967:                // TAS.B Dn
                   1968:                // リード・モディファイ・ライトという概念はない
                   1969:                CYCLE(4);
                   1970:                uint32 data = reg.D[n];
                   1971:                ACC.move_8(data);
                   1972:                reg.D[n] |= 0x80;
                   1973:        } else if (n == 0x3c) {
                   1974:                // ILLEGAL
                   1975:                op_illegal();
                   1976:        } else {
                   1977:                // TAS.B <ea>
                   1978:                // リード・モディファイ・ライトという概念はない
                   1979:                CYCLE(12);
                   1980:                uint32 ea = cea_data_1();
                   1981:                uint32 data = read_1(ea);
                   1982:                ACC.move_8(data);
                   1983:                write_1(ea, (data | 0x80));
                   1984:        }
                   1985: }
                   1986: 
                   1987: // %0100_110000_mmmrrr d.m+-rxwpi -34  MULS.L <ea>,Dl
                   1988: // %0100_110000_mmmrrr d.m+-rxwpi -34  MULS.L <ea>,Dh:Dl
                   1989: // %0100_110000_mmmrrr d.m+-rxwpi -34  MULU.L <ea>,Dl
                   1990: // %0100_110000_mmmrrr d.m+-rxwpi -34  MULU.L <ea>,Dh:Dl
                   1991: OP_DEF(mul)
                   1992: {
                   1993:        // 2ワード目
                   1994:        // %0LLL_Ss0000_000HHH
                   1995:        //   +++ ||        +++- Dh
                   1996:        //    |  |+------------ %1:64bit, %0:32bit
                   1997:        //    |  +------------- %1:MULS, %0:MULU
                   1998:        //    +---------------- Dl
                   1999:        ir2 = fetch_2();
                   2000:        uint h = ir2 & 7;
                   2001:        uint l = (ir2 >> 12) & 7;
                   2002: 
                   2003:        CYCLE(44);      // XXX これは本当は最大値だけど
                   2004:        switch ((ir2 >> 10) & 3) {
                   2005:         case 0:
                   2006:         {
                   2007:                // MULU.L <ea>,Dl
                   2008:                uint32 src = fea_data_4();
                   2009:                uint32 dst = reg.D[l];
                   2010:                reg.D[l] = ACC.mulu_32(src, dst);
                   2011:                break;
                   2012:         }
                   2013: 
                   2014:         case 1:
                   2015:         {
                   2016:                // MULU.L <ea>,Dh:Dl
                   2017:                uint32 src = fea_data_4();
                   2018:                uint32 dst = reg.D[l];
                   2019:                uint64 res = ACC.mulu_64(src, dst);
                   2020:                // h == l の時は未定義なので考えない。
                   2021:                reg.D[h] = res >> 32;
                   2022:                reg.D[l] = res;
                   2023:                break;
                   2024:         }
                   2025: 
                   2026:         case 2:
                   2027:         {
                   2028:                // MULS.L <ea>,Dl
                   2029:                uint32 src = fea_data_4();
                   2030:                uint32 dst = reg.D[l];
                   2031:                reg.D[l] = ACC.muls_32(src, dst);
                   2032:                break;
                   2033:         }
                   2034: 
                   2035:         case 3:
                   2036:         {
                   2037:                // MULS.L <ea>,Dh:Dl
                   2038:                uint32 src = fea_data_4();
                   2039:                uint32 dst = reg.D[l];
                   2040:                uint64 res = ACC.muls_64(src, dst);
                   2041:                // h == l の時は未定義なので考えない。
                   2042:                reg.D[h] = res >> 32;
                   2043:                reg.D[l] = res;
                   2044:                break;
                   2045:         }
                   2046: 
                   2047:         default:
                   2048:                __unreachable();
                   2049:        }
                   2050: }
                   2051: 
                   2052: // DIVU.L <ea>,Dq
                   2053: // DIVUL.L <ea>,Dr:Dq
                   2054: void
                   2055: MPU680x0Device::ops_divu_32_32(uint r, uint q)
                   2056: {
                   2057:        CYCLE(78);      // XXX これは本当は最大値だけど
                   2058: 
                   2059:        uint32 src = fea_data_4();
                   2060:        uint32 dst = reg.D[q];
                   2061: 
                   2062:        if (src == 0) {
                   2063:                // ゼロ除算の場合、
                   2064:                // X は変化しない
                   2065:                // C は常にクリア
                   2066:                // N,Z,V は未定義
                   2067:                CCR.SetC(false);
                   2068:                Exception(M68K::EXCEP_ZERODIV);
                   2069:                return;
                   2070:        }
                   2071:        uint32 quo = dst / src;
                   2072:        uint32 rem = dst % src;
                   2073:        // このケースでオーバーフローは起きないはず
                   2074: 
                   2075:        // 正常の場合、
                   2076:        // X は変化しない
                   2077:        // V, C はクリア
                   2078:        // N, Z は quo の結果。
                   2079:        // r == q の場合 quo が残るので、rem を先に書く
                   2080:        reg.D[r] = rem;
                   2081:        reg.D[q] = quo;
                   2082:        ACC.move_32(quo);
                   2083: }
                   2084: 
                   2085: // DIVU.L <ea>,Dr:Dq
                   2086: void
                   2087: MPU680x0Device::ops_divu_64_32(uint r, uint q)
                   2088: {
                   2089:        CYCLE(78);      // XXX これは本当は最大値だけど
                   2090: 
                   2091:        uint32 src = fea_data_4();
                   2092:        uint64 dst = (((uint64)reg.D[r]) << 32) | reg.D[q];
                   2093: 
                   2094:        if (src == 0) {
                   2095:                // ゼロ除算の場合、
                   2096:                // X は変化しない
                   2097:                // C は常にクリア
                   2098:                // N,Z,V は未定義
                   2099:                CCR.SetC(false);
                   2100:                Exception(M68K::EXCEP_ZERODIV);
                   2101:                return;
                   2102:        }
                   2103:        uint64 q64 = dst / src;
                   2104:        if (q64 > 0xffffffffUL) {
                   2105:                // オーバーフローの場合、
                   2106:                // X は変化しない
                   2107:                // N,Z は未定義
                   2108:                // V はセット
                   2109:                // C は常にクリア
                   2110:                CCR.SetV(true);
                   2111:                CCR.SetC(false);
                   2112:                return;
                   2113:        }
                   2114:        uint32 quo = q64;
                   2115:        uint32 rem = dst % src;
                   2116: 
                   2117:        // 正常の場合、
                   2118:        // X は変化しない
                   2119:        // V, C はクリア
                   2120:        // N, Z は quo の結果。
                   2121:        // r == q の場合 quo が残るので、rem を先に書く
                   2122:        reg.D[r] = rem;
                   2123:        reg.D[q] = quo;
                   2124:        ACC.move_32(quo);
                   2125: }
                   2126: 
                   2127: // DIVS.L <ea>,Dq
                   2128: // DIVSL.L <ea>,Dr:Dq
                   2129: void
                   2130: MPU680x0Device::ops_divs_32_32(uint r, uint q)
                   2131: {
                   2132:        CYCLE(90);      // XXX これは本当は最大値だけど
                   2133: 
                   2134:        uint32 src = fea_data_4();
                   2135:        uint32 dst = reg.D[q];
                   2136: 
                   2137:        if (src == 0) {
                   2138:                // ゼロ除算の場合、
                   2139:                // X は変化しない
                   2140:                // C は常にクリア
                   2141:                // N,Z,V は未定義
                   2142:                CCR.SetC(false);
                   2143:                Exception(M68K::EXCEP_ZERODIV);
                   2144:                return;
                   2145:        }
                   2146: 
                   2147:        // ホストでオーバーフローが起きるのはこのケースのみ
                   2148:        if (dst == INT32_MIN && src == -1) {
                   2149:                // オーバーフローの場合、
                   2150:                // X は変化しない
                   2151:                // N,Z は未定義
                   2152:                // V はセット
                   2153:                // C は常にクリア
                   2154:                CCR.SetV(true);
                   2155:                CCR.SetC(false);
                   2156:                return;
                   2157:        }
                   2158: 
                   2159:        uint32 quo = (int32)dst / (int32)src;
                   2160:        uint32 rem = (int32)dst % (int32)src;
                   2161:        // ここでオーバーフローは起きない
                   2162: 
                   2163:        // 正常の場合、
                   2164:        // X は変化しない
                   2165:        // V, C はクリア
                   2166:        // N, Z は quo の結果。
                   2167:        // r == q の場合 quo が残るので、rem を先に書く
                   2168:        reg.D[r] = rem;
                   2169:        reg.D[q] = quo;
                   2170:        ACC.move_32(quo);
                   2171: }
                   2172: 
                   2173: // DIVSL.L
                   2174: void
                   2175: MPU680x0Device::ops_divs_64_32(uint r, uint q)
                   2176: {
                   2177:        CYCLE(90);      // XXX これは本当は最大値だけど
                   2178: 
                   2179:        uint32 src = fea_data_4();
                   2180:        uint64 dst = (((uint64)reg.D[r]) << 32) | reg.D[q];
                   2181: 
                   2182:        if (src == 0) {
                   2183:                // ゼロ除算の場合、
                   2184:                // X は変化しない
                   2185:                // C は常にクリア
                   2186:                // N,Z,V は未定義
                   2187:                CCR.SetC(false);
                   2188:                Exception(M68K::EXCEP_ZERODIV);
                   2189:                return;
                   2190:        }
                   2191: 
                   2192:        // ホストでオーバーフローが起きるのはこのケースのみ
                   2193:        if (dst == INT64_MIN && src == -1) {
                   2194:                // オーバーフローの場合、
                   2195:                // X は変化しない
                   2196:                // N,Z は未定義
                   2197:                // V はセット
                   2198:                // C は常にクリア
                   2199:                CCR.SetV(true);
                   2200:                CCR.SetC(false);
                   2201:                return;
                   2202:        }
                   2203: 
                   2204:        int64 sq64 = (int64)dst / (int32)src;
                   2205:        if ((int32)sq64 != sq64) {
                   2206:                // オーバーフロー
                   2207:                CCR.SetV(true);
                   2208:                CCR.SetC(false);
                   2209:                return;
                   2210:        }
                   2211:        uint32 quo = (uint32)sq64;
                   2212:        uint32 rem = (int64)dst % (int32)src;
                   2213: 
                   2214:        // 正常の場合、
                   2215:        // X は変化しない
                   2216:        // V, C はクリア
                   2217:        // N, Z は quo の結果。
                   2218:        // r == q の場合 quo が残るので、rem を先に書く
                   2219:        reg.D[r] = rem;
                   2220:        reg.D[q] = quo;
                   2221:        ACC.move_32(quo);
                   2222: }
                   2223: 
                   2224: // %0100_110001_mmmrrr d.m+-rxwpi -34  DIVS.L <ea>,Dq
                   2225: // %0100_110001_mmmrrr d.m+-rxwpi -34  DIVS.L <ea>,Dr:Dq
                   2226: // %0100_110001_mmmrrr d.m+-rxwpi -34  DIVSL.L <ea>,Dr:Dq
                   2227: // %0100_110001_mmmrrr d.m+-rxwpi -34  DIVU.L <ea>,Dq
                   2228: // %0100_110001_mmmrrr d.m+-rxwpi -34  DIVU.L <ea>,Dr:Dq
                   2229: // %0100_110001_mmmrrr d.m+-rxwpi -34  DIVUL.L <ea>,Dr:Dq
                   2230: OP_DEF(div)
                   2231: {
                   2232:        // 2ワード目
                   2233:        // %0QQQ_Ss0000_000RRR
                   2234:        //   +++ ||        +++- Dr
                   2235:        //    |  |+------------ %1:64bit, %0:32bit
                   2236:        //    |  +------------- %1:DIVS, %0:DIVU
                   2237:        //    +---------------- Dq
                   2238:        ir2 = fetch_2();
                   2239:        uint r = ir2 & 7;
                   2240:        uint q = (ir2 >> 12) & 7;
                   2241: 
                   2242:        switch ((ir2 >> 10) & 3) {
                   2243:         case 0:
                   2244:                ops_divu_32_32(r, q);
                   2245:                break;
                   2246:         case 1:
                   2247:                ops_divu_64_32(r, q);
                   2248:                break;
                   2249:         case 2:
                   2250:                ops_divs_32_32(r, q);
                   2251:                break;
                   2252:         case 3:
                   2253:                ops_divs_64_32(r, q);
                   2254:                break;
                   2255:         default:
                   2256:                __unreachable();
                   2257:        }
                   2258: }
                   2259: 
                   2260: void
                   2261: MPU680x0Device::ops_movem_ea_list(int bytesize)
                   2262: {
                   2263:        uint32 ea;
                   2264:        int regcount;
                   2265:        bool anpi = false;
                   2266: 
                   2267:        ir2 = fetch_2();
                   2268: 
                   2269:        // EA 取得。MOVEM だけ別対応
                   2270:        // |  M+ WXZP | MOVEM <ea>,list
                   2271:        switch (eamode(ir)) {
                   2272:         case 2:        // (An)
                   2273:                ea = cea_anin(eanum(ir));
                   2274:                break;
                   2275:         case 3:        // (An)+
                   2276:                save_reg_pi(eanum(ir));
                   2277:                if (bytesize == 2) {
                   2278:                        ea = cea_anpi_2(eanum(ir));
                   2279:                } else {
                   2280:                        ea = cea_anpi_4(eanum(ir));
                   2281:                }
                   2282:                anpi = true;
                   2283:                break;
                   2284:         case 5:        // d16(An)
                   2285:                ea = cea_andi(eanum(ir));
                   2286:                break;
                   2287:         case 6:        // (An,IX)
                   2288:                ea = cea_anix(eanum(ir));
                   2289:                break;
                   2290:         case 7:
                   2291:                switch (eanum(ir)) {
                   2292:                 case 0:        // Abs.W
                   2293:                        ea = cea_absw();
                   2294:                        break;
                   2295:                 case 1:        // Abs.L
                   2296:                        ea = cea_absl();
                   2297:                        break;
                   2298:                 case 2:        // d16(PC)
                   2299:                        ea = cea_pcdi();
                   2300:                        break;
                   2301:                 case 3:        // (PC,IX)
                   2302:                        ea = cea_pcix();
                   2303:                        break;
                   2304:                 default:
                   2305:                        op_illegal();
                   2306:                        return;
                   2307:                }
                   2308:                break;
                   2309:         default:
                   2310:                op_illegal();
                   2311:                return;
                   2312:        }
                   2313: 
                   2314:        // XXX レジスタリストに表れて、ea オペランドに出てくる
                   2315:        // レジスタは Dn、IX も含めて全部保存しておく必要がある。
                   2316: 
                   2317:        regcount = 0;
                   2318:        uint list = ir2;
                   2319:        while (list) {
                   2320:                uint32 data;
                   2321:                if (bytesize == 2) {
                   2322:                        data = (int32)(int16)read_2(ea);
                   2323:                } else {
                   2324:                        data = read_4(ea);
                   2325:                }
                   2326:                ea += bytesize;
                   2327:                regcount++;
                   2328:                int ctz = __builtin_ctz(list);
                   2329:                reg.R[ctz] = data;
                   2330:                // clear LSB bits
                   2331:                list &= ((~1U) << ctz);
                   2332:        }
                   2333:        // (An)+ なら An を更新
                   2334:        if (anpi) {
                   2335:                RegAY = ea;
                   2336:        }
                   2337: 
                   2338:        CYCLE(8 + 4 * regcount);
                   2339: }
                   2340: 
                   2341: // %0100_110010_mmmrrr ..m+.rxwp. 034  MOVEM.W <ea>,<list>
                   2342: OP_DEF(movem_w)
                   2343: {
                   2344:        ops_movem_ea_list(2);
                   2345: }
                   2346: 
                   2347: // %0100_110011_mmmrrr ..m+.rxwp. 034  MOVEM.L <ea>,<list>
                   2348: OP_DEF(movem_l)
                   2349: {
                   2350:        ops_movem_ea_list(4);
                   2351: }
                   2352: 
                   2353: // 制御レジスタ:
                   2354: //                             MPU
                   2355: // $000 SFC            234
                   2356: // $001 DFC            234
                   2357: // $002 CACR   234
                   2358: // $003 TC             --4
                   2359: // $004 ITT0   --4
                   2360: // $005 ITT1   --4
                   2361: // $006 DTT0   --4
                   2362: // $007 DTT1   --4
                   2363: // $800 USP            234
                   2364: // $801 VBR            234
                   2365: // $802 CAAR   23-
                   2366: // $803 MSP            234
                   2367: // $804 ISP            234
                   2368: // $805 MMUSR  --4
                   2369: // $806 URP            --4
                   2370: // $807 SRP            --4
                   2371: 
                   2372: // MOVEC.L Rc,Rn
                   2373: void
                   2374: MPU680x0Device::ops_movec_rc_rn()
                   2375: {
                   2376:        SUPERVISOR_OP;
                   2377: 
                   2378:        CYCLE(6);
                   2379:        ir2 = fetch_2();
                   2380:        uint n = ir2 >> 12;
                   2381:        uint c = ir2 & 0xfff;
                   2382: 
                   2383:        // まず CPU 固有レジスタを試す。
                   2384:        if (ops_movec_rc_rn_cpu(c, n)) {
                   2385:                return;
                   2386:        }
                   2387: 
                   2388:        // なければ共通レジスタを試す。
                   2389:        switch (c) {
                   2390:         case 0x000:
                   2391:                reg.R[n] = reg.GetSFC();
                   2392:                return;
                   2393:         case 0x001:
                   2394:                reg.R[n] = reg.GetDFC();
                   2395:                return;
                   2396:         case 0x002:
                   2397:                reg.R[n] = reg.cacr;
                   2398:                return;
                   2399:         case 0x800:
                   2400:                reg.R[n] = reg.usp;
                   2401:                return;
                   2402:         case 0x801:
                   2403:                reg.R[n] = reg.vbr;
                   2404:                return;
                   2405:         case 0x803:
                   2406:                if (reg.m) {
                   2407:                        reg.R[n] = reg.A[7];
                   2408:                } else {
                   2409:                        reg.R[n] = reg.msp;
                   2410:                }
                   2411:                return;
                   2412:         case 0x804:
                   2413:                if (reg.m) {
                   2414:                        reg.R[n] = reg.isp;
                   2415:                } else {
                   2416:                        reg.R[n] = reg.A[7];
                   2417:                }
                   2418:                return;
                   2419:         default:
                   2420:                break;
                   2421:        }
                   2422:        op_illegal();
                   2423: }
                   2424: 
                   2425: // MOVEC.L Rc,Rn (68030 固有)
                   2426: bool
                   2427: MPU68030Device::ops_movec_rc_rn_cpu(uint c, uint n)
                   2428: {
                   2429:        switch (c) {
                   2430:         case 0x802:
                   2431:                reg.R[n] = reg.caar;
                   2432:                return true;
                   2433:         default:
                   2434:                break;
                   2435:        }
                   2436:        return false;
                   2437: }
                   2438: 
                   2439: // MOVEC.L Rc,Rn (68040 固有)
                   2440: bool
                   2441: MPU68040Device::ops_movec_rc_rn_cpu(uint c, uint n)
                   2442: {
                   2443:        switch (c) {
                   2444:         case 0x003:
                   2445:                reg.R[n] = reg.tc40;
                   2446:                return true;
                   2447:         case 0x004:
                   2448:                reg.R[n] = reg.itt[0];
                   2449:                return true;
                   2450:         case 0x005:
                   2451:                reg.R[n] = reg.itt[1];
                   2452:                return true;
                   2453:         case 0x006:
                   2454:                reg.R[n] = reg.dtt[0];
                   2455:                return true;
                   2456:         case 0x007:
                   2457:                reg.R[n] = reg.dtt[1];
                   2458:                return true;
                   2459:         case 0x805:
                   2460:                reg.R[n] = reg.mmusr40;
                   2461:                return true;
                   2462:         case 0x806:
                   2463:                reg.R[n] = reg.urp40;
                   2464:                return true;
                   2465:         case 0x807:
                   2466:                reg.R[n] = reg.srp40;
                   2467:                return true;
                   2468:         default:
                   2469:                break;
                   2470:        }
                   2471:        return false;
                   2472: }
                   2473: 
                   2474: // MOVEC.L Rn,Rc
                   2475: void
                   2476: MPU680x0Device::ops_movec_rn_rc()
                   2477: {
                   2478:        SUPERVISOR_OP;
                   2479: 
                   2480:        ir2 = fetch_2();
                   2481:        uint n = ir2 >> 12;
                   2482:        uint c = ir2 & 0xfff;
                   2483: 
                   2484:        // まず CPU 固有レジスタを試す。
                   2485:        if (ops_movec_rn_rc_cpu(c, n)) {
                   2486:                return;
                   2487:        }
                   2488: 
                   2489:        // なければ共通レジスタを試す。
                   2490:        switch (c) {
                   2491:         case 0x000:
                   2492:                CYCLE(12);
                   2493:                reg.sfc = busaddr::FC(reg.R[n] & 7) | BusAddr::R;
                   2494:                return;
                   2495:         case 0x001:
                   2496:                CYCLE(12);
                   2497:                reg.dfc = busaddr::FC(reg.R[n] & 7) | BusAddr::W;
                   2498:                return;
                   2499:         case 0x002:
                   2500:                CYCLE(12);
                   2501:                SetCACR(reg.R[n]);
                   2502:                return;
                   2503:         case 0x800:
                   2504:                CYCLE(6);
                   2505:                reg.usp = reg.R[n];
                   2506:                return;
                   2507:         case 0x801:
                   2508:                CYCLE(6);
                   2509:                reg.vbr = reg.R[n];
                   2510:                return;
                   2511:         case 0x803:
                   2512:                CYCLE(6);
                   2513:                if (reg.m) {
                   2514:                        reg.A[7] = reg.R[n];
                   2515:                } else {
                   2516:                        reg.msp = reg.R[n];
                   2517:                }
                   2518:                return;
                   2519:         case 0x804:
                   2520:                CYCLE(6);
                   2521:                if (reg.m) {
                   2522:                        reg.isp = reg.R[n];
                   2523:                } else {
                   2524:                        reg.A[7] = reg.R[n];
                   2525:                }
                   2526:                return;
                   2527:         default:
                   2528:                break;
                   2529:        }
                   2530:        op_illegal();
                   2531: }
                   2532: 
                   2533: // MOVEC.L Rn,Rc (68030 固有)
                   2534: bool
                   2535: MPU68030Device::ops_movec_rn_rc_cpu(uint c, uint n)
                   2536: {
                   2537:        switch (c) {
                   2538:         case 0x802:
                   2539:                CYCLE(6);
                   2540:                reg.caar = reg.R[n];
                   2541:                return true;
                   2542:         default:
                   2543:                break;
                   2544:        }
                   2545:        return false;
                   2546: }
                   2547: 
                   2548: // MOVEC.L Rn,Rc (68040 固有)
                   2549: bool
                   2550: MPU68040Device::ops_movec_rn_rc_cpu(uint c, uint n)
                   2551: {
                   2552:        switch (c) {
                   2553:         case 0x003:
                   2554:                SetTC(reg.R[n]);
                   2555:                return true;
                   2556:         case 0x004:
                   2557:                SetTT(mmu_itt[0].get(), reg.R[n]);
                   2558:                return true;
                   2559:         case 0x005:
                   2560:                SetTT(mmu_itt[1].get(), reg.R[n]);
                   2561:                return true;
                   2562:         case 0x006:
                   2563:                SetTT(mmu_dtt[0].get(), reg.R[n]);
                   2564:                return true;
                   2565:         case 0x007:
                   2566:                SetTT(mmu_dtt[1].get(), reg.R[n]);
                   2567:                return true;
                   2568:         case 0x805:
                   2569:                // 書き込める?
                   2570:                //SetMMUSR(reg.R[n]);
                   2571:                OP_FUNC(unimpl);
                   2572:                return true;
                   2573:         case 0x806:
                   2574:                SetURP(reg.R[n]);
                   2575:                return true;
                   2576:         case 0x807:
                   2577:                SetSRP(reg.R[n]);
                   2578:                return true;
                   2579:         default:
                   2580:                break;
                   2581:        }
                   2582:        return false;
                   2583: }
                   2584: 
                   2585: // %0100_111001_00nnnn .......... 034  TRAP #<vector>
                   2586: // %0100_111001_010yyy .......... 034  LINK.W Ay,#<imm>
                   2587: // %0100_111001_011yyy .......... 034  UNLK Ay
                   2588: // %0100_111001_100yyy .......... 034  MOVE.L Ay,USP
                   2589: // %0100_111001_101yyy .......... 034  MOVE.L USP,Ay
                   2590: // %0100_111001_110000 .......... 034  RESET
                   2591: // %0100_111001_110001 .......... 034  NOP
                   2592: // %0100_111001_110010 .......... 034  STOP #<imm>
                   2593: // %0100_111001_110011 .......... 034  RTE
                   2594: // %0100_111001_110100 .......... -34  RTD #<imm>
                   2595: // %0100_111001_110101 .......... 034  RTS
                   2596: // %0100_111001_110110 .......... 034  TRAPV
                   2597: // %0100_111001_110111 .......... 034  RTR
                   2598: // %0100_111001_111010 .......... -34  MOVEC.L Rc,Rn
                   2599: // %0100_111001_111011 .......... -34  MOVEC.L Rn,Rc
                   2600: OP_DEF(trap)
                   2601: {
                   2602:        uint n = ir & 0x3f;
                   2603: 
                   2604:        switch (n) {
                   2605:         case 0x00 ... 0x0e:// TRAP #<vector>
                   2606:                CYCLE2(18, 20);
                   2607:                // TRAP#N 例外
                   2608:                Exception(M68K::EXCEP_TRAP0 + n);
                   2609:                return;
                   2610: 
                   2611:         case 0x0f:                     // TRAP #15
                   2612:                CYCLE2(18, 20);
                   2613:                // TRAP#15 例外 (IOCS コール表示のためこれだけ別処理)
                   2614:                ExceptionTrap15();
                   2615:                return;
                   2616: 
                   2617:         case 0x10:
                   2618:         case 0x11:
                   2619:         case 0x12:
                   2620:         case 0x13:
                   2621:         case 0x14:
                   2622:         case 0x15:
                   2623:         case 0x16:
                   2624:         case 0x17:                     // LINK.W Ay,#<imm>
                   2625:         {
                   2626:                CYCLE2(4, 5);
                   2627:                // レジスタやスタックを変更する前にフェッチとセーブをしないと、
                   2628:                // ページフォルトで再実行できなくなる
                   2629:                int32 imm = (int32)(int16)fetch_2();
                   2630:                ops_link(imm);
                   2631:                return;
                   2632:         }
                   2633: 
                   2634:         case 0x18:
                   2635:         case 0x19:
                   2636:         case 0x1a:
                   2637:         case 0x1b:
                   2638:         case 0x1c:
                   2639:         case 0x1d:
                   2640:         case 0x1e:
                   2641:         case 0x1f:                     // UNLK Ay
                   2642:                CYCLE(5);
                   2643:                // ページフォルトに備えて保存する
                   2644:                save_reg_pi(7);
                   2645:                reg.A[7] = RegAY;
                   2646:                RegAY = pop_4();
                   2647:                return;
                   2648: 
                   2649:         case 0x20:
                   2650:         case 0x21:
                   2651:         case 0x22:
                   2652:         case 0x23:
                   2653:         case 0x24:
                   2654:         case 0x25:
                   2655:         case 0x26:
                   2656:         case 0x27:                     // MOVE.L Ay,USP
                   2657:                SUPERVISOR_OP;
                   2658:                CYCLE(4);
                   2659:                reg.usp = RegAY;
                   2660:                return;
                   2661: 
                   2662:         case 0x28:
                   2663:         case 0x29:
                   2664:         case 0x2a:
                   2665:         case 0x2b:
                   2666:         case 0x2c:
                   2667:         case 0x2d:
                   2668:         case 0x2e:
                   2669:         case 0x2f:                     // MOVE.L USP,Ay
                   2670:                SUPERVISOR_OP;
                   2671:                CYCLE(4);
                   2672:                RegAY = reg.usp;
                   2673:                return;
                   2674: 
                   2675:         case 0x30:                     // RESET
                   2676:                CYCLE(518);
                   2677:                ops_reset();
                   2678:                return;
                   2679: 
                   2680:         case 0x31:                     // NOP
                   2681:                CYCLE(2);
                   2682:                // XXX ほんとは何かするらしいけど
                   2683:                return;
                   2684: 
                   2685:         case 0x32:                     // STOP #<imm>
                   2686:                SUPERVISOR_OP;
                   2687:                CYCLE(8);
                   2688:                ops_stop();
                   2689:                return;
                   2690: 
                   2691:         case 0x33:                     // RTE
                   2692:                SUPERVISOR_OP;
                   2693:                ops_rte();
                   2694:                return;
                   2695: 
                   2696:         case 0x34:                     // RTD #<imm>
                   2697:         {
                   2698:                CYCLE2(10, 12);
                   2699:                // ページフォルトに備えて保存する
                   2700:                save_reg_pi(7);
                   2701:                uint32 disp = fetch_2();
                   2702:                Jump(pop_4());
                   2703:                reg.A[7] += (int32)(int16)disp;
                   2704:                return;
                   2705:         }
                   2706: 
                   2707:         case 0x35:                     // RTS
                   2708:                CYCLE2(9, 11);
                   2709:                // ページフォルトに備えて保存する
                   2710:                save_reg_pi(7);
                   2711:                Jump(pop_4());
                   2712:                return;
                   2713: 
                   2714:         case 0x36:                     // TRAPV
                   2715:                if (CCR.IsV()) {
                   2716:                        CYCLE2(22, 24);
                   2717:                        Exception(M68K::EXCEP_TRAPV);
                   2718:                } else {
                   2719:                        CYCLE(4);
                   2720:                }
                   2721:                return;
                   2722: 
                   2723:         case 0x37:                     // RTR
                   2724:                CYCLE2(12, 14);
                   2725:                // ページフォルトに備えて保存する
                   2726:                save_reg_pi(7);
                   2727:                CCR.Set(pop_2());
                   2728:                Jump(pop_4());
                   2729:                return;
                   2730: 
                   2731:         case 0x3a:                     // MOVEC.L Rc,Rn
                   2732:                ops_movec_rc_rn();
                   2733:                return;
                   2734: 
                   2735:         case 0x3b:                     // MOVEC.L Rn,Rc
                   2736:                ops_movec_rn_rc();
                   2737:                return;
                   2738: 
                   2739:         default:
                   2740:                op_illegal();
                   2741:                return;
                   2742:        }
                   2743: }
                   2744: 
                   2745: // %0100_111010_mmmrrr ..m..rxwp. 034  JSR <ea>
                   2746: OP_DEF(jsr)
                   2747: {
                   2748:        CYCLE2(4, 7);
                   2749:        uint32 ea = cea_ctrl();
                   2750:        uint32 return_addr = reg.pc;
                   2751: 
                   2752:        // ページフォルトに備えて保存する。
                   2753:        save_reg_pd(7);
                   2754:        push_4(return_addr);
                   2755:        Jump(ea);
                   2756: }
                   2757: 
                   2758: // %0100_111011_mmmrrr ..m..rxwp. 034  JMP <ea>
                   2759: OP_DEF(jmp)
                   2760: {
                   2761:        CYCLE2(4, 6);
                   2762:        // 実際には CEA ではなく JEA の実行時間を足すんだがまあいいか
                   2763:        uint32 ea = cea_ctrl();
                   2764:        Jump(ea);
                   2765: }
                   2766: 
                   2767: // %0101_qqq000_mmmrrr d.m+-rxw.. 034  ADDQ.B #qqq,<ea>
                   2768: OP_DEF(addq_b)
                   2769: {
                   2770:        uint n = ir & 0x3f;
                   2771: 
                   2772:        uint32 src = RegIRX;
                   2773:        src = (src == 0) ? 8 : src;
                   2774:        if (n < 8) {
                   2775:                // ADDQ.B #qqq,Dn
                   2776:                CYCLE(2);
                   2777:                uint32 data = ACC.add_8(src, reg.D[n] & 0xff);
                   2778:                reg.D[n] = (reg.D[n] & 0xffffff00) | data;
                   2779:        } else {
                   2780:                // ADDQ.B #qqq,<ea>
                   2781:                CYCLE2(3, 4);
                   2782:                uint32 ea = cea_data_1();
                   2783:                uint32 data = read_1(ea);
                   2784:                data = ACC.add_8(src, data);
                   2785:                write_1(ea, data);
                   2786:        }
                   2787: }
                   2788: 
                   2789: // %0101_qqq001_mmmrrr d.m+-rxw.. 034  ADDQ.W #qqq,<ea>
                   2790: // %0101_qqq001_001yyy .a........ 034  ADDQ.W #qqq,Ay (.Lと等価)
                   2791: OP_DEF(addq_w)
                   2792: {
                   2793:        uint n = ir & 0x3f;
                   2794: 
                   2795:        uint32 src = RegIRX;
                   2796:        src = (src == 0) ? 8 : src;
                   2797:        if (n < 8) {
                   2798:                // ADDQ.W #qqq,Dn
                   2799:                CYCLE(2);
                   2800:                uint32 data = ACC.add_16(src, reg.D[n] & 0xffff);
                   2801:                reg.D[n] = (reg.D[n] & 0xffff0000) | data;
                   2802:        } else if (n < 16) {
                   2803:                // ADDQ.W #qqq,An は ADDQ.L と等価
                   2804:                // フラグは変化しない
                   2805:                CYCLE(2);
                   2806:                reg.R[n] += src;
                   2807:        } else {
                   2808:                // ADDQ.W #qqq,<ea>
                   2809:                CYCLE2(3, 4);
                   2810:                uint32 ea = cea_data_2();
                   2811:                uint32 data = read_2(ea);
                   2812:                data = ACC.add_16(src, data);
                   2813:                write_2(ea, data);
                   2814:        }
                   2815: }
                   2816: 
                   2817: // %0101_qqq010_mmmrrr d.m+-rxw.. 034  ADDQ.L #qqq,<ea>
                   2818: // %0101_qqq010_001yyy .a........ 034  ADDQ.L #qqq,Ay
                   2819: OP_DEF(addq_l)
                   2820: {
                   2821:        uint n = ir & 0x3f;
                   2822: 
                   2823:        uint32 src = RegIRX;
                   2824:        src = (src == 0) ? 8 : src;
                   2825:        if (n < 8) {
                   2826:                // ADDQ.L #qqq,Dn
                   2827:                CYCLE(2);
                   2828:                reg.D[n] = ACC.add_32(src, reg.D[n]);
                   2829:        } else if (n < 16) {
                   2830:                // ADDQ.L #qqq,An
                   2831:                // フラグは変化しない
                   2832:                CYCLE(2);
                   2833:                reg.R[n] += src;
                   2834:        } else {
                   2835:                // ADDQ.L #qqq,<ea>
                   2836:                CYCLE2(3, 4);
                   2837:                uint32 ea = cea_data_4();
                   2838:                uint32 data = read_4(ea);
                   2839:                data = ACC.add_32(src, data);
                   2840:                write_4(ea, data);
                   2841:        }
                   2842: }
                   2843: 
                   2844: // TRAPcc の共通部分。
                   2845: void
                   2846: MPU680x0Device::ops_trapcc(uint cond)
                   2847: {
                   2848:        // 条件成立すれば例外。成立しなければ何もしない。
                   2849:        // いずれの場合もオペランドありの形態なら事前に読み飛ばしておくこと。
                   2850:        if (CCR.Cond(cond)) {
                   2851:                CYCLE2(22, 24);
                   2852:                Exception(M68K::EXCEP_TRAPV);
                   2853:        } else {
                   2854:                // サイクルを消費するだけ
                   2855:                CYCLE(4);
                   2856:        }
                   2857: }
                   2858: 
                   2859: // %0101_cccc11_mmmrrr d.m+-rxw.. 034  Scc.B <ea>
                   2860: // %0101_cccc11_001yyy .......... 034  DBcc.W Dy,<label>
                   2861: // %0101_cccc11_111010 .......... -34  TRAPcc.W #<imm>
                   2862: // %0101_cccc11_111011 .......... -34  TRAPcc.L #<imm>
                   2863: // %0101_cccc11_111100 .......... -34  TRAPcc
                   2864: // %0101_000111_001yyy .......... 034  DBRA.W Dy,<label>
                   2865: OP_DEF(scc)
                   2866: {
                   2867:        uint n = ir & 0x3f;
                   2868:        uint cond = (ir >> 8) & 0x0f;
                   2869: 
                   2870:        switch (n) {
                   2871:         case 0b000000 ... 0b000111:    // Scc.B Dn
                   2872:                CYCLE(4);
                   2873:                if (CCR.Cond(cond)) {
                   2874:                        RegDY |= 0xff;
                   2875:                } else {
                   2876:                        RegDY &= ~0xff;
                   2877:                }
                   2878:                return;
                   2879: 
                   2880:         case 0b001000 ... 0b001111:    // DBcc.W Dy,<label>
                   2881:                if (CCR.Cond(cond)) {
                   2882:                        // 真なら何もしない。disp を読み飛ばして次へ。
                   2883:                        CYCLE2(6, 8);
                   2884:                        fetch_2();
                   2885:                } else {
                   2886:                        // 偽の場合
                   2887: 
                   2888:                        // Dy.W を減算して(下位ワードに)書き戻し、Dy.W が -1 だったら
                   2889:                        // ループ終了。だが最適化のため、減算前の Dy.W が 0 の時は
                   2890:                        // 下位ワードを 0xffff にしてループ終了、そうでなければ Dy.L を
                   2891:                        // 減算するだけでいいはず。
                   2892: 
                   2893:                        uint16 data = RegDY;
                   2894:                        if (data == 0) {
                   2895:                                // ループ終了。disp を読み飛ばす
                   2896:                                CYCLE2(10, 13);
                   2897:                                RegDY |= 0x0000ffff;
                   2898:                                fetch_2();
                   2899:                        } else {
                   2900:                                CYCLE2(6, 8);
                   2901:                                RegDY--;
                   2902:                                uint32 origin = reg.pc;
                   2903:                                int32 disp = (int32)(int16)fetch_2();
                   2904:                                Jump(origin + disp);
                   2905:                        }
                   2906:                }
                   2907:                return;
                   2908: 
                   2909:         case 0b010000 ... 0b010111:    // Scc.B <ea>
                   2910:         case 0b011000 ... 0b011111:    // Scc.B <ea>
                   2911:         case 0b100000 ... 0b100111:    // Scc.B <ea>
                   2912:         case 0b101000 ... 0b101111:    // Scc.B <ea>
                   2913:         case 0b110000 ... 0b110111:    // Scc.B <ea>
                   2914:         case 0b111000:                                 // Scc.B <ea>
                   2915:         case 0b111001:                                 // Scc.B <ea>
                   2916:         {
                   2917:                CYCLE(5);
                   2918:                // 条件成立可否に関わらず EA は取得しないといけない
                   2919:                uint32 ea = cea_data_1();
                   2920:                uint32 data;
                   2921:                if (CCR.Cond(cond)) {
                   2922:                        data = 0xff;
                   2923:                } else {
                   2924:                        data = 0;
                   2925:                }
                   2926:                write_1(ea, data);
                   2927:                return;
                   2928:         }
                   2929: 
                   2930:         case 0b111010:         // TRAPcc.W #<imm>
                   2931:                // オペランドなしTRAPccに比べてすべてのケースで2サイクル多い
                   2932:                CYCLE(2);
                   2933:                fetch_2();
                   2934:                ops_trapcc(cond);
                   2935:                return;
                   2936: 
                   2937:         case 0b111011:         // TRAPcc.L #<imm>
                   2938:                // オペランドなしTRAPccに比べてすべてのケースで4サイクル多い
                   2939:                CYCLE(4);
                   2940:                fetch_4();
                   2941:                ops_trapcc(cond);
                   2942:                return;
                   2943: 
                   2944:         case 0b111100:         // TRAPcc
                   2945:                ops_trapcc(cond);
                   2946:                return;
                   2947: 
                   2948:         default:
                   2949:                OP_FUNC(illegal);
                   2950:                return;
                   2951:        }
                   2952: }
                   2953: 
                   2954: // %0101_qqq100_mmmrrr d.m+-rxw.. 034  SUBQ.B #qqq,<ea>
                   2955: OP_DEF(subq_b)
                   2956: {
                   2957:        uint n = ir & 0x3f;
                   2958: 
                   2959:        uint32 src = RegIRX;
                   2960:        src = (src == 0) ? 8 : src;
                   2961:        if (n < 8) {
                   2962:                // SUBQ.B #qqq,Dn
                   2963:                CYCLE(2);
                   2964:                uint32 data = ACC.sub_8(src, reg.D[n] & 0xff);
                   2965:                reg.D[n] = (reg.D[n] & 0xffffff00) | data;
                   2966:        } else {
                   2967:                // SUBQ.B #qqq,<ea>
                   2968:                CYCLE2(3, 4);
                   2969:                uint32 ea = cea_data_1();
                   2970:                uint32 data = read_1(ea);
                   2971:                data = ACC.sub_8(src, data);
                   2972:                write_1(ea, data);
                   2973:        }
                   2974: }
                   2975: 
                   2976: // %0101_qqq101_mmmrrr d.m+-rxw.. 034  SUBQ.W #qqq,<ea>
                   2977: // %0101_qqq101_001yyy .a........ 034  SUBQ.W #qqq,Ay (.Lと等価)
                   2978: OP_DEF(subq_w)
                   2979: {
                   2980:        uint n = ir & 0x3f;
                   2981: 
                   2982:        uint32 src = RegIRX;
                   2983:        src = (src == 0) ? 8 : src;
                   2984:        if (n < 8) {
                   2985:                // SUBQ.W #qqq,Dn
                   2986:                CYCLE(2);
                   2987:                uint32 data = ACC.sub_16(src, reg.D[n] & 0xffff);
                   2988:                reg.D[n] = (reg.D[n] & 0xffff0000) | data;
                   2989:        } else if (n < 16) {
                   2990:                // SUBQ.W #qqq,An は SUBQ.L と等価
                   2991:                // フラグは変化しない
                   2992:                CYCLE(2);
                   2993:                reg.R[n] -= src;
                   2994:        } else {
                   2995:                // SUBQ.W #qqq,<ea>
                   2996:                CYCLE2(3, 4);
                   2997:                uint32 ea = cea_data_2();
                   2998:                uint32 data = read_2(ea);
                   2999:                data = ACC.sub_16(src, data);
                   3000:                write_2(ea, data);
                   3001:        }
                   3002: }
                   3003: 
                   3004: // %0101_qqq110_mmmrrr d.m+-rxw.. 034  SUBQ.L #qqq,<ea>
                   3005: // %0101_qqq110_001yyy .a........ 034  SUBQ.L #qqq,Ay
                   3006: OP_DEF(subq_l)
                   3007: {
                   3008:        uint n = ir & 0x3f;
                   3009: 
                   3010:        uint32 src = RegIRX;
                   3011:        src = (src == 0) ? 8 : src;
                   3012:        if (n < 8) {
                   3013:                // SUBQ.L #qqq,Dn
                   3014:                CYCLE(2);
                   3015:                reg.D[n] = ACC.sub_32(src, reg.D[n]);
                   3016:        } else if (n < 16) {
                   3017:                // SUBQ.L #qqq,An
                   3018:                // フラグは変化しない
                   3019:                CYCLE(2);
                   3020:                reg.R[n] -= src;
                   3021:        } else {
                   3022:                // SUBQ.L #qqq,<ea>
                   3023:                CYCLE2(3, 4);
                   3024:                uint32 ea = cea_data_4();
                   3025:                uint32 data = read_4(ea);
                   3026:                data = ACC.sub_32(src, data);
                   3027:                write_4(ea, data);
                   3028:        }
                   3029: }
                   3030: 
                   3031: inline void
                   3032: MPU680x0Device::ops_bra()
                   3033: {
                   3034:        CYCLE2(6, 8);
                   3035: 
                   3036:        uint32 origin = reg.pc;
                   3037:        int32 disp = (int32)(int8)(ir & 0xff);
                   3038:        if (disp == -1) {
                   3039:                // Bcc.L
                   3040:                disp = (int32)fetch_4();
                   3041:        } else if (disp == 0) {
                   3042:                // Bcc.W
                   3043:                disp = (int32)(int16)fetch_2();
                   3044:        }
                   3045:        Jump(origin + disp);
                   3046: }
                   3047: 
                   3048: // %0110_0000nn_nnnnnn .......... 034  BRA.B <label>
                   3049: // %0110_000000_000000 .......... 034  BRA.W <label>
                   3050: // %0110_000011_111111 .......... -34  BRA.L <label>
                   3051: OP_DEF(bra)
                   3052: {
                   3053:        ops_bra();
                   3054: }
                   3055: 
                   3056: // %0110_0001nn_nnnnnn .......... 034  BSR.B <label>
                   3057: // %0110_000100_000000 .......... 034  BSR.W <label>
                   3058: // %0110_000111_111111 .......... -34  BSR.L <label>
                   3059: OP_DEF(bsr)
                   3060: {
                   3061:        CYCLE2(6, 9);
                   3062:        uint32 origin = reg.pc;
                   3063:        int32 disp = (int32)(int8)(ir & 0xff);
                   3064:        if (disp == -1) {
                   3065:                // BSR.L <label>
                   3066:                disp = (int32)fetch_4();
                   3067:        } else if (disp == 0) {
                   3068:                // BSR.W <label>
                   3069:                disp = (int32)(int16)fetch_2();
                   3070:        }
                   3071: 
                   3072:        // ページフォルトに備えて保存する。
                   3073:        save_reg_pd(7);
                   3074:        push_4(reg.pc);
                   3075:        Jump(origin + disp);
                   3076: }
                   3077: 
                   3078: // %0110_ccccnn_nnnnnn .......... 034  Bcc.B <label>
                   3079: // %0110_cccc00_000000 .......... 034  Bcc.W <label>
                   3080: // %0110_cccc11_111111 .......... -34  Bcc.L <label>
                   3081: OP_DEF(bcc)
                   3082: {
                   3083:        // ブランチするかどうかでサイクルが変わるので先に条件を調べる
                   3084:        uint cond = (ir >> 8) & 0x0f;
                   3085:        if (CCR.Cond(cond)) {
                   3086:                // Bcc (taken)
                   3087:                ops_bra();
                   3088:        } else {
                   3089:                int32 disp = (int32)(int8)(ir & 0xff);
                   3090:                if (disp == -1) {
                   3091:                        // Bcc.L (not taken)
                   3092:                        CYCLE(8);
                   3093:                        fetch_4();
                   3094:                } else if (disp == 0) {
                   3095:                        // Bcc.W (not taken)
                   3096:                        CYCLE(6);
                   3097:                        fetch_2();
                   3098:                } else {
                   3099:                        // Bcc.B (not taken)
                   3100:                        CYCLE(4);
                   3101:                }
                   3102:        }
                   3103: }
                   3104: 
                   3105: // %0111_xxx0nn_nnnnnn .......... 034  MOVEQ.L #<imm>,Dx
                   3106: OP_DEF(moveq)
                   3107: {
                   3108:        CYCLE(2);
                   3109:        RegDX = (int32)(int8)(ir & 0xff);
                   3110:        ACC.move_32(RegDX);
                   3111: }
                   3112: 
                   3113: // %1000_xxx000_mmmrrr d.m+-rxwpi 034  OR.B <ea>,Dx
                   3114: OP_DEF(or_b_ea_dn)
                   3115: {
                   3116:        uint n = ir & 0x3f;
                   3117: 
                   3118:        CYCLE(2);
                   3119:        uint x = RegIRX;
                   3120:        if (n < 8) {
                   3121:                // OR.B Dn,Dx
                   3122:                uint32 data = (reg.D[x] | reg.D[n]) & 0xff;
                   3123:                ACC.move_8(data);
                   3124:                reg.D[x] = (reg.D[x] & 0xffffff00) | data;
                   3125:        } else {
                   3126:                // OR.B <ea>,Dx
                   3127:                uint32 src = fea_data_1();
                   3128:                uint32 data = (reg.D[x] | src) & 0xff;
                   3129:                ACC.move_8(data);
                   3130:                reg.D[x] = (reg.D[x] & 0xffffff00) | data;
                   3131:        }
                   3132: }
                   3133: 
                   3134: // %1000_xxx001_mmmrrr d.m+-rxwpi 034  OR.W <ea>,Dx
                   3135: OP_DEF(or_w_ea_dn)
                   3136: {
                   3137:        uint n = ir & 0x3f;
                   3138: 
                   3139:        CYCLE(2);
                   3140:        uint x = RegIRX;
                   3141:        if (n < 8) {
                   3142:                // OR.W Dn,Dx
                   3143:                uint32 data = (reg.D[x] | reg.D[n]) & 0xffff;
                   3144:                ACC.move_16(data);
                   3145:                reg.D[x] = (reg.D[x] & 0xffff0000) | data;
                   3146:        } else {
                   3147:                // OR.W <ea>,Dx
                   3148:                uint32 src = fea_data_2();
                   3149:                uint32 data = (reg.D[x] | src) & 0xffff;
                   3150:                ACC.move_16(data);
                   3151:                reg.D[x] = (reg.D[x] & 0xffff0000) | data;
                   3152:        }
                   3153: }
                   3154: 
                   3155: // %1000_xxx010_mmmrrr d.m+-rxwpi 034  OR.L <ea>,Dx
                   3156: OP_DEF(or_l_ea_dn)
                   3157: {
                   3158:        uint n = ir & 0x3f;
                   3159: 
                   3160:        CYCLE(2);
                   3161:        uint x = RegIRX;
                   3162:        if (n < 8) {
                   3163:                // OR.L Dn,Dx
                   3164:                reg.D[x] |= reg.D[n];
                   3165:                ACC.move_32(reg.D[x]);
                   3166:        } else {
                   3167:                // OR.L <ea>,Dx
                   3168:                uint32 src = fea_data_4();
                   3169:                uint32 data = reg.D[x] | src;
                   3170:                ACC.move_32(data);
                   3171:                reg.D[x] = data;
                   3172:        }
                   3173: }
                   3174: 
                   3175: // %1000_xxx011_mmmrrr d.m+-rxwpi 034  DIVU.W <ea>,Dx
                   3176: OP_DEF(divu_w)
                   3177: {
                   3178:        CYCLE(44);      // XXX これは本当は最大値だけど
                   3179: 
                   3180:        uint16 src = fea_data_2();
                   3181:        uint32 dst = RegDX;
                   3182: 
                   3183:        if (src == 0) {
                   3184:                // ゼロ除算の場合、
                   3185:                // X は変化しない
                   3186:                // C は常にクリア
                   3187:                // N,Z,V は未定義
                   3188:                CCR.SetC(false);
                   3189:                Exception(M68K::EXCEP_ZERODIV);
                   3190:                return;
                   3191:        }
                   3192: 
                   3193:        uint32 quo = dst / src;
                   3194:        uint32 rem = dst % src;
                   3195:        if (quo > 0xffff) {
                   3196:                // オーバーフローの場合、
                   3197:                // X は変化しない
                   3198:                // N,Z は未定義
                   3199:                // V はセット
                   3200:                // C は常にクリア
                   3201:                CCR.SetV(true);
                   3202:                CCR.SetC(false);
                   3203:                return;
                   3204:        }
                   3205: 
                   3206:        // 正常の場合、
                   3207:        // X は変化しない
                   3208:        // V, C はクリア
                   3209:        // N, Z は quo の結果。
                   3210:        RegDX = (rem << 16) | quo;
                   3211:        ACC.move_16(quo);
                   3212: }
                   3213: 
                   3214: // %1000_xxx100_mmmrrr ..m+-rxw.. 034  OR.B Dx,<ea>
                   3215: // %1000_xxx100_000yyy .......... 034  SBCD.B Dy,Dx
                   3216: // %1000_xxx100_001yyy .......... 034  SBCD.B -(Ay),-(Ax)
                   3217: OP_DEF(or_b_dn_ea)
                   3218: {
                   3219:        uint n = ir & 0x3f;
                   3220: 
                   3221:        if (n < 8) {
                   3222:                // SBCD.B Dy,Dx
                   3223:                CYCLE(4);
                   3224:                uint32 src = RegDY & 0xff;
                   3225:                uint32 dst = RegDX & 0xff;
                   3226:                dst = ACC.sbcd_8(src, dst);
                   3227:                RegDX &= 0xffffff00;
                   3228:                RegDX |= dst;
                   3229:        } else if (n < 16) {
                   3230:                // SBCD.B -(Ay),-(Ax)
                   3231:                CYCLE2(13, 14);
                   3232:                save_reg_pd_if(RegIRY);
                   3233:                save_reg_pd_if(RegIRX);
                   3234:                uint32 srcea = internal_ea_anpd_1(RegIRY);
                   3235:                uint32 dstea = internal_ea_anpd_1(RegIRX);
                   3236:                uint32 src = read_1(srcea);
                   3237:                uint32 dst = read_1(dstea);
                   3238:                dst = ACC.sbcd_8(src, dst);
                   3239:                write_1(dstea, dst);
                   3240:        } else {
                   3241:                // OR.B Dx,<ea>
                   3242:                CYCLE2(3, 4);
                   3243:                uint32 ea = cea_data_1();
                   3244:                uint8 data = read_1(ea);
                   3245:                data |= RegDX;
                   3246:                ACC.move_8(data);
                   3247:                write_1(ea, data);
                   3248:        }
                   3249: }
                   3250: 
                   3251: // %1000_xxx101_mmmrrr ..m+-rxw.. 034  OR.W Dx,<ea>
                   3252: // %1000_xxx101_000yyy .......... -34  PACK Dy,Dx,#<imm>
                   3253: // %1000_xxx101_001yyy .......... -34  PACK -(Ay),-(Ax),#<imm>
                   3254: OP_DEF(or_w_dn_ea)
                   3255: {
                   3256:        uint n = ir & 0x3f;
                   3257: 
                   3258:        if (n < 8) {
                   3259:                // PACK Dy,Dx,#<imm>
                   3260:                CYCLE(6);
                   3261:                uint32 imm = fetch_2();
                   3262:                uint32 src = RegDY + imm;
                   3263:                RegDX = (RegDX & 0xffffff00) | ((src >> 4) & 0x00f0) | (src & 0x000f);
                   3264:        } else if (n < 16) {
                   3265:                // PACK -(Ay),-(Ax),#<imm>
                   3266:                CYCLE(11);
                   3267:                uint32 imm = fetch_2();
                   3268:                uint32 srcea;
                   3269:                uint32 src;
                   3270:                // -(Ay) を2回行う
                   3271:                save_reg_pd(RegIRY);
                   3272:                srcea = internal_ea_anpd_1(RegIRY);
                   3273:                src = read_1(srcea);
                   3274:                srcea = internal_ea_anpd_1(RegIRY);
                   3275:                src |= (read_1(srcea) << 8);
                   3276:                src += imm;
                   3277:                uint32 dst = ((src >> 4) & 0x00f0) | (src & 0x000f);
                   3278:                save_reg_pd_if(RegIRX);
                   3279:                uint32 dstea = internal_ea_anpd_1(RegIRX);
                   3280:                write_1(dstea, dst);
                   3281:        } else {
                   3282:                // OR.W Dx,<ea>
                   3283:                CYCLE2(3, 4);
                   3284:                uint32 ea = cea_data_2();
                   3285:                uint16 data = read_2(ea);
                   3286:                data |= RegDX;
                   3287:                ACC.move_16(data);
                   3288:                write_2(ea, data);
                   3289:        }
                   3290: }
                   3291: 
                   3292: // %1000_xxx110_mmmrrr ..m+-rxw.. 034  OR.L Dx,<ea>
                   3293: // %1000_xxx110_000yyy .......... -34  UNPK Dy,Dx,#<imm>
                   3294: // %1000_xxx110_001yyy .......... -34  UNPK -(Ay),-(Ax),#<imm>
                   3295: OP_DEF(or_l_dn_ea)
                   3296: {
                   3297:        uint n = ir & 0x3f;
                   3298: 
                   3299:        if (n < 8) {
                   3300:                // UNPK Dy,Dx,#<imm>
                   3301:                CYCLE(8);
                   3302:                uint32 imm = fetch_2();
                   3303:                uint16 src = RegDY;
                   3304:                src = ((src & 0x00f0) << 4) | (src & 0x000f);
                   3305:                src += imm;
                   3306:                RegDX = (RegDX & 0xffff0000) | src;
                   3307:        } else if (n < 16) {
                   3308:                // UNPK -(Ay),-(Ax),#<imm>
                   3309:                CYCLE(11);
                   3310:                uint32 imm = fetch_2();
                   3311:                save_reg_pd(RegIRY);
                   3312:                uint32 srcea = internal_ea_anpd_1(RegIRY);
                   3313:                uint16 src = read_1(srcea);
                   3314:                src = ((src & 0x00f0) << 4) | (src & 0x000f);
                   3315:                src += imm;
                   3316:                // -(Ax) を2回行う
                   3317:                save_reg_pd_if(RegIRX);
                   3318:                uint32 dstea;
                   3319:                dstea = internal_ea_anpd_1(RegIRX);
                   3320:                write_1(dstea, (src & 0xff));
                   3321:                dstea = internal_ea_anpd_1(RegIRX);
                   3322:                write_1(dstea, src >> 8);
                   3323:        } else {
                   3324:                // OR.L Dx,<ea>
                   3325:                CYCLE2(3, 4);
                   3326:                uint32 ea = cea_data_4();
                   3327:                uint32 data = read_4(ea);
                   3328:                data |= RegDX;
                   3329:                ACC.move_32(data);
                   3330:                write_4(ea, data);
                   3331:        }
                   3332: }
                   3333: 
                   3334: // %1000_xxx111_mmmrrr d.m+-rxwpi 034  DIVS.W <ea>,Dx
                   3335: OP_DEF(divs_w)
                   3336: {
                   3337:        CYCLE(56);      // XXX これは本当は最大値だけど
                   3338: 
                   3339:        uint16 src = fea_data_2();
                   3340:        uint32 dst = RegDX;
                   3341: 
                   3342:        if (src == 0) {
                   3343:                // ゼロ除算の場合、
                   3344:                // X は変化しない
                   3345:                // C は常にクリア
                   3346:                // N,Z,V は未定義
                   3347:                CCR.SetC(false);
                   3348:                Exception(M68K::EXCEP_ZERODIV);
                   3349:                return;
                   3350:        }
                   3351: 
                   3352:        // ホストでオーバーフローが起きるのはこのケースのみ
                   3353:        if (dst == 0x80000000 && src == 0xffff) {
                   3354:                // オーバーフローの場合、
                   3355:                // X は変化しない
                   3356:                // N,Z は未定義
                   3357:                // V はセット
                   3358:                // C は常にクリア
                   3359:                CCR.SetV(true);
                   3360:                CCR.SetC(false);
                   3361:                return;
                   3362:        }
                   3363: 
                   3364:        int32 squo = (int32)dst / (int32)(int16)src;
                   3365:        int32 srem = (int32)dst % (int32)(int16)src;
                   3366:        if ((int16)squo != squo) {
                   3367:                // オーバーフローの場合
                   3368:                CCR.SetV(true);
                   3369:                CCR.SetC(false);
                   3370:                return;
                   3371:        }
                   3372:        // 正常の場合、
                   3373:        // X は変化しない
                   3374:        // V, C はクリア
                   3375:        // N, Z は quo の結果。
                   3376:        uint32 quo = (uint32)squo & 0xffff;
                   3377:        uint32 rem = (uint32)srem & 0xffff;
                   3378:        RegDX = (rem << 16) | quo;
                   3379:        ACC.move_16(quo);
                   3380: }
                   3381: 
                   3382: // %1001_xxx000_mmmrrr dam+-rxwpi 034  SUB.B <ea>,Dx
                   3383: OP_DEF(sub_b_ea_dn)
                   3384: {
                   3385:        CYCLE(2);
                   3386:        uint32 src = fea_all_1();
                   3387:        uint32 data = ACC.sub_8(src, RegDX & 0xff);
                   3388:        RegDX = (RegDX & 0xffffff00) | data;
                   3389: }
                   3390: 
                   3391: // %1001_xxx001_mmmrrr dam+-rxwpi 034  SUB.W <ea>,Dx
                   3392: OP_DEF(sub_w_ea_dn)
                   3393: {
                   3394:        CYCLE(2);
                   3395:        uint32 src = fea_all_2();
                   3396:        uint32 data = ACC.sub_16(src, RegDX & 0xffff);
                   3397:        RegDX = (RegDX & 0xffff0000) | data;
                   3398: }
                   3399: 
                   3400: // %1001_xxx010_mmmrrr dam+-rxwpi 034  SUB.L <ea>,Dx
                   3401: OP_DEF(sub_l_ea_dn)
                   3402: {
                   3403:        CYCLE(2);
                   3404:        uint32 src = fea_all_4();
                   3405:        RegDX = ACC.sub_32(src, RegDX);
                   3406: }
                   3407: 
                   3408: // %1001_xxx011_mmmrrr dam+-rxwpi 034  SUBA.W <ea>,Ax
                   3409: OP_DEF(suba_w)
                   3410: {
                   3411:        CYCLE(4);
                   3412:        uint32 src = (int32)(int16)fea_all_2();
                   3413:        RegAX -= src;
                   3414: }
                   3415: 
                   3416: // %1001_xxx100_mmmrrr ..m+-rxw.. 034  SUB.B Dx,<ea>
                   3417: // %1001_xxx100_000yyy .......... 034  SUBX.B Dy,Dx
                   3418: // %1001_xxx100_001yyy .......... 034  SUBX.B -(Ay),-(Ax)
                   3419: OP_DEF(sub_b_dn_ea)
                   3420: {
                   3421:        uint n = ir & 0x3f;
                   3422: 
                   3423:        if (n < 8) {
                   3424:                // SUBX.B Dy,Dx
                   3425:                CYCLE(2);
                   3426:                uint32 src = RegDY & 0xff;
                   3427:                uint32 dst = RegDX & 0xff;
                   3428:                dst = ACC.subx_8(src, dst);
                   3429:                RegDX = (RegDX & 0xffffff00) | dst;
                   3430:        } else if (n < 16) {
                   3431:                // SUBX.B -(Ay),-(Ax)
                   3432:                CYCLE2(9, 10);
                   3433:                save_reg_pd_if(RegIRY);
                   3434:                save_reg_pd_if(RegIRX);
                   3435:                uint32 srcea = internal_ea_anpd_1(RegIRY);
                   3436:                uint32 dstea = internal_ea_anpd_1(RegIRX);
                   3437:                uint32 src = read_1(srcea);
                   3438:                uint32 dst = read_1(dstea);
                   3439:                dst = ACC.subx_8(src, dst);
                   3440:                write_1(dstea, dst);
                   3441:        } else {
                   3442:                // SUB.B Dx,<ea>
                   3443:                CYCLE2(3, 4);
                   3444:                uint32 ea = cea_data_1();
                   3445:                uint32 data = read_1(ea);
                   3446:                data = ACC.sub_8(RegDX & 0xff, data);
                   3447:                write_1(ea, data);
                   3448:        }
                   3449: }
                   3450: 
                   3451: // %1001_xxx101_mmmrrr ..m+-rxw.. 034  SUB.W Dx,<ea>
                   3452: // %1001_xxx101_000yyy .......... 034  SUBX.W Dy,Dx
                   3453: // %1001_xxx101_001yyy .......... 034  SUBX.W -(Ay),-(Ax)
                   3454: OP_DEF(sub_w_dn_ea)
                   3455: {
                   3456:        uint n = ir & 0x3f;
                   3457: 
                   3458:        if (n < 8) {
                   3459:                // SUBX.W Dy,Dx
                   3460:                CYCLE(2);
                   3461:                uint32 src = RegDY & 0xffff;
                   3462:                uint32 dst = RegDX & 0xffff;
                   3463:                dst = ACC.subx_16(src, dst);
                   3464:                RegDX = (RegDX & 0xffff0000) | dst;
                   3465:        } else if (n < 16) {
                   3466:                // SUBX.W -(Ay),-(Ax)
                   3467:                CYCLE2(9, 10);
                   3468:                save_reg_pd_if(RegIRY);
                   3469:                save_reg_pd_if(RegIRX);
                   3470:                uint32 srcea = internal_ea_anpd_2(RegIRY);
                   3471:                uint32 dstea = internal_ea_anpd_2(RegIRX);
                   3472:                uint32 src = read_2(srcea);
                   3473:                uint32 dst = read_2(dstea);
                   3474:                dst = ACC.subx_16(src, dst);
                   3475:                write_2(dstea, dst);
                   3476:        } else {
                   3477:                // SUB.W Dx,<ea>
                   3478:                CYCLE2(3, 4);
                   3479:                uint32 ea = cea_data_2();
                   3480:                uint32 data = read_2(ea);
                   3481:                data = ACC.sub_16(RegDX & 0xffff, data);
                   3482:                write_2(ea, data);
                   3483:        }
                   3484: }
                   3485: 
                   3486: // %1001_xxx110_mmmrrr ..m+-rxw.. 034  SUB.L Dx,<ea>
                   3487: // %1001_xxx110_000yyy .......... 034  SUBX.L Dy,Dx
                   3488: // %1001_xxx110_001yyy .......... 034  SUBX.L -(Ay),-(Ax)
                   3489: OP_DEF(sub_l_dn_ea)
                   3490: {
                   3491:        uint n = ir & 0x3f;
                   3492: 
                   3493:        if (n < 8) {
                   3494:                // SUBX.L Dy,Dx
                   3495:                CYCLE(2);
                   3496:                uint32 src = RegDY;
                   3497:                uint32 dst = RegDX;
                   3498:                RegDX = ACC.subx_32(src, dst);
                   3499:        } else if (n < 16) {
                   3500:                // SUBX.L -(Ay),-(Ax)
                   3501:                CYCLE2(9, 10);
                   3502:                save_reg_pd_if(RegIRY);
                   3503:                save_reg_pd_if(RegIRX);
                   3504:                uint32 srcea = internal_ea_anpd_4(RegIRY);
                   3505:                uint32 dstea = internal_ea_anpd_4(RegIRX);
                   3506:                uint32 src = read_4(srcea);
                   3507:                uint32 dst = read_4(dstea);
                   3508:                dst = ACC.subx_32(src, dst);
                   3509:                write_4(dstea, dst);
                   3510:        } else {
                   3511:                // SUB.L Dx,<ea>
                   3512:                CYCLE2(3, 4);
                   3513:                uint32 ea = cea_data_4();
                   3514:                uint32 data = read_4(ea);
                   3515:                data = ACC.sub_32(RegDX, data);
                   3516:                write_4(ea, data);
                   3517:        }
                   3518: }
                   3519: 
                   3520: // %1001_xxx111_mmmrrr dam+-rxwpi 034  SUBA.L <ea>,Ax
                   3521: OP_DEF(suba_l)
                   3522: {
                   3523:        CYCLE(2);
                   3524:        uint32 src = fea_all_4();
                   3525:        RegAX -= src;
                   3526: }
                   3527: 
                   3528: // %1010_nnnnnn_nnnnnn .......... 034  A-Line
                   3529: OP_DEF(aline)
                   3530: {
                   3531:        if (aline_callback) {
                   3532:                if (aline_callback(this, aline_arg)) {
                   3533:                        return;
                   3534:                }
                   3535:        }
                   3536:        // A系列命令例外
                   3537:        Exception(M68K::EXCEP_ALINE);
                   3538: }
                   3539: 
                   3540: // %1011_xxx000_mmmrrr d.m+-rxwpi 034  CMP.B <ea>,Dx
                   3541: OP_DEF(cmp_b)
                   3542: {
                   3543:        CYCLE(2);
                   3544:        uint32 src = fea_all_1();
                   3545:        uint32 dst = RegDX & 0xff;
                   3546:        ACC.cmp_8(src, dst);
                   3547: }
                   3548: 
                   3549: // %1011_xxx001_mmmrrr d.m+-rxwpi 034  CMP.W <ea>,Dx
                   3550: OP_DEF(cmp_w)
                   3551: {
                   3552:        CYCLE(2);
                   3553:        uint32 src = fea_all_2();
                   3554:        uint32 dst = RegDX & 0xffff;
                   3555:        ACC.cmp_16(src, dst);
                   3556: }
                   3557: 
                   3558: // %1011_xxx010_mmmrrr d.m+-rxwpi 034  CMP.L <ea>,Dx
                   3559: OP_DEF(cmp_l)
                   3560: {
                   3561:        CYCLE(2);
                   3562:        uint32 src = fea_all_4();
                   3563:        ACC.cmp_32(src, RegDX);
                   3564: }
                   3565: 
                   3566: // %1011_xxx011_mmmrrr dam+-rxwpi 034  CMPA.W <ea>,Ax
                   3567: OP_DEF(cmpa_w)
                   3568: {
                   3569:        CYCLE(4);
                   3570:        uint32 src = (uint32)(int32)(int16)fea_all_2();
                   3571:        ACC.cmp_32(src, RegAX);
                   3572: }
                   3573: 
                   3574: // %1011_xxx100_mmmrrr d.m+-rxw.. 034  EOR.B Dx,<ea>
                   3575: // %1011_xxx100_001yyy .......... 034  CMPM.B (Ay)+,(Ax)+
                   3576: OP_DEF(eor_b)
                   3577: {
                   3578:        uint n = ir & 0x3f;
                   3579: 
                   3580:        if (n < 8) {
                   3581:                // EOR.B Dx,Dy
                   3582:                CYCLE(2);
                   3583:                uint32 data = (reg.D[n] ^ RegDX) & 0xff;
                   3584:                reg.D[n] = (reg.D[n] & 0xffffff00) | data;
                   3585:                ACC.move_8(data);
                   3586:        } else if (n < 16) {
                   3587:                // CMPM.B (Ay)+,(Ax)+
                   3588:                CYCLE(8);
                   3589:                save_reg_pi_if(RegIRY);
                   3590:                save_reg_pi_if(RegIRX);
                   3591:                uint32 srcea = internal_ea_anpi_1(RegIRY);
                   3592:                uint32 dstea = internal_ea_anpi_1(RegIRX);
                   3593:                uint32 src = read_1(srcea);
                   3594:                uint32 dst = read_1(dstea);
                   3595:                ACC.cmp_8(src, dst);
                   3596:        } else {
                   3597:                // EOR.B Dx,<ea>
                   3598:                CYCLE2(3, 4);
                   3599:                uint32 ea = cea_data_1();
                   3600:                uint32 data = read_1(ea);
                   3601:                data ^= (RegDX & 0xff);
                   3602:                write_1(ea, data);
                   3603:                ACC.move_8(data);
                   3604:        }
                   3605: }
                   3606: 
                   3607: // %1011_xxx101_mmmrrr d.m+-rxw.. 034  EOR.W Dx,<ea>
                   3608: // %1011_xxx101_001yyy .......... 034  CMPM.W (Ay)+,(Ax)+
                   3609: OP_DEF(eor_w)
                   3610: {
                   3611:        uint n = ir & 0x3f;
                   3612: 
                   3613:        if (n < 8) {
                   3614:                // EOR.W Dx,Dy
                   3615:                CYCLE(2);
                   3616:                uint32 data = (reg.D[n] ^ RegDX) & 0xffff;
                   3617:                reg.D[n] = (reg.D[n] & 0xffff0000) | data;
                   3618:                ACC.move_16(data);
                   3619:        } else if (n < 16) {
                   3620:                // CMPM.W (Ay)+,(Ax)+
                   3621:                CYCLE(8);
                   3622:                save_reg_pi_if(RegIRY);
                   3623:                save_reg_pi_if(RegIRX);
                   3624:                uint32 srcea = internal_ea_anpi_2(RegIRY);
                   3625:                uint32 dstea = internal_ea_anpi_2(RegIRX);
                   3626:                uint32 src = read_2(srcea);
                   3627:                uint32 dst = read_2(dstea);
                   3628:                ACC.cmp_16(src, dst);
                   3629:        } else {
                   3630:                // EOR.W Dx,<ea>
                   3631:                CYCLE2(3, 4);
                   3632:                uint32 ea = cea_data_2();
                   3633:                uint32 data = read_2(ea);
                   3634:                data ^= (RegDX & 0xffff);
                   3635:                write_2(ea, data);
                   3636:                ACC.move_16(data);
                   3637:        }
                   3638: }
                   3639: 
                   3640: // %1011_xxx110_mmmrrr d.m+-rxw.. 034  EOR.L Dx,<ea>
                   3641: // %1011_xxx110_001yyy .......... 034  CMPM.L (Ay)+,(Ax)+
                   3642: OP_DEF(eor_l)
                   3643: {
                   3644:        uint n = ir & 0x3f;
                   3645: 
                   3646:        if (n < 8) {
                   3647:                // EOR.L Dx,Dy
                   3648:                CYCLE(2);
                   3649:                reg.D[n] ^= RegDX;
                   3650:                ACC.move_32(reg.D[n]);
                   3651:        } else if (n < 16) {
                   3652:                // CMPM.L (Ay)+,(Ax)+
                   3653:                CYCLE(8);
                   3654:                save_reg_pi_if(RegIRY);
                   3655:                save_reg_pi_if(RegIRX);
                   3656:                uint32 srcea = internal_ea_anpi_4(RegIRY);
                   3657:                uint32 dstea = internal_ea_anpi_4(RegIRX);
                   3658:                uint32 src = read_4(srcea);
                   3659:                uint32 dst = read_4(dstea);
                   3660:                ACC.cmp_32(src, dst);
                   3661:        } else {
                   3662:                // EOR.L Dx,<ea>
                   3663:                CYCLE2(3, 4);
                   3664:                uint32 ea = cea_data_4();
                   3665:                uint32 data = read_4(ea);
                   3666:                data ^= RegDX;
                   3667:                write_4(ea, data);
                   3668:                ACC.move_32(data);
                   3669:        }
                   3670: }
                   3671: 
                   3672: // %1011_xxx111_mmmrrr dam+-rxwpi 034  CMPA.L <ea>,Ax
                   3673: OP_DEF(cmpa_l)
                   3674: {
                   3675:        CYCLE(4);
                   3676:        uint32 src = fea_all_4();
                   3677:        ACC.cmp_32(src, RegAX);
                   3678: }
                   3679: 
                   3680: // %1100_xxx000_mmmrrr d.m+-rxwpi 034  AND.B <ea>,Dx
                   3681: OP_DEF(and_b_ea_dn)
                   3682: {
                   3683:        CYCLE(2);
                   3684:        uint32 src = fea_data_1();
                   3685:        uint32 dst = (RegDX & 0x000000ff) & src;
                   3686:        ACC.move_8(dst);
                   3687:        RegDX = (RegDX & 0xffffff00) | dst;
                   3688: }
                   3689: 
                   3690: // %1100_xxx001_mmmrrr d.m+-rxwpi 034  AND.W <ea>,Dx
                   3691: OP_DEF(and_w_ea_dn)
                   3692: {
                   3693:        CYCLE(2);
                   3694:        uint32 src = fea_data_2();
                   3695:        uint32 dst = (RegDX & 0x0000ffff) & src;
                   3696:        ACC.move_16(dst);
                   3697:        RegDX = (RegDX & 0xffff0000) | dst;
                   3698: }
                   3699: 
                   3700: // %1100_xxx010_mmmrrr d.m+-rxwpi 034  AND.L <ea>,Dx
                   3701: OP_DEF(and_l_ea_dn)
                   3702: {
                   3703:        CYCLE(2);
                   3704:        uint32 src = fea_data_4();
                   3705:        RegDX = RegDX & src;
                   3706:        ACC.move_32(RegDX);
                   3707: }
                   3708: 
                   3709: // %1100_xxx011_mmmrrr d.m+-rxwpi 034  MULU.W <ea>,Dx
                   3710: OP_DEF(mulu_w)
                   3711: {
                   3712:        CYCLE(28);      // 実際にはこれは最大値
                   3713:        uint32 src = fea_data_2();
                   3714:        uint32 dst = RegDX & 0xffff;
                   3715:        RegDX = ACC.mulu_16(src, dst);
                   3716: }
                   3717: 
                   3718: // %1100_xxx100_mmmrrr ..m+-rxw.. 034  AND.B Dx,<ea>
                   3719: // %1100_xxx100_000yyy .......... 034  ABCD.B Dy,Dx
                   3720: // %1100_xxx100_001yyy .......... 034  ABCD.B -(Ay),-(Ax)
                   3721: OP_DEF(and_b_dn_ea)
                   3722: {
                   3723:        uint n = ir & 0x3f;
                   3724: 
                   3725:        if (n < 8) {
                   3726:                // ABCD.B Dy,Dx
                   3727:                CYCLE(4);
                   3728:                uint32 src = RegDY & 0xff;
                   3729:                uint32 dst = RegDX & 0xff;
                   3730:                dst = ACC.abcd_8(src, dst);
                   3731:                RegDX &= 0xffffff00;
                   3732:                RegDX |= dst;
                   3733:                return;
                   3734:        } else if (n < 16) {
                   3735:                // ABCD.B -(Ay),-(Ax)
                   3736:                CYCLE2(13, 14);
                   3737:                save_reg_pd_if(RegIRY);
                   3738:                save_reg_pd_if(RegIRX);
                   3739:                uint32 srcea = internal_ea_anpd_1(RegIRY);
                   3740:                uint32 dstea = internal_ea_anpd_1(RegIRX);
                   3741:                uint32 src = read_1(srcea);
                   3742:                uint32 dst = read_1(dstea);
                   3743:                dst = ACC.abcd_8(src, dst);
                   3744:                write_1(dstea, dst);
                   3745:                return;
                   3746:        } else {
                   3747:                // AND.B Dx,<ea>
                   3748:                CYCLE2(3, 4);
                   3749:                uint32 ea = cea_data_1();
                   3750:                uint32 dst = read_1(ea);
                   3751:                dst &= RegDX & 0xff;
                   3752:                ACC.move_8(dst);
                   3753:                write_1(ea, dst);
                   3754:        }
                   3755: }
                   3756: 
                   3757: // %1100_xxx101_mmmrrr ..m+-rxw.. 034  AND.W Dx,<ea>
                   3758: // %1100_xxx101_000yyy .......... 034  EXG.L Dx,Dy
                   3759: // %1100_xxx101_001yyy .......... 034  EXG.L Ax,Ay
                   3760: OP_DEF(and_w_dn_ea)
                   3761: {
                   3762:        uint n = ir & 0x3f;
                   3763: 
                   3764:        if (n < 8) {
                   3765:                // EXG.L Dx,Dy
                   3766:                CYCLE(4);
                   3767:                uint x = RegIRX;
                   3768:                uint y = n;
                   3769:                uint32 tmp = reg.D[x];
                   3770:                reg.D[x] = reg.D[y];
                   3771:                reg.D[y] = tmp;
                   3772:                return;
                   3773:        } else if (n < 16) {
                   3774:                // EXG.L Ax,Ay
                   3775:                // ここでは x は 0..7 で A(x)、y は 8..15 で R(y)
                   3776:                CYCLE(4);
                   3777:                uint x = RegIRX;
                   3778:                uint y = n;
                   3779:                uint32 tmp = reg.A[x];
                   3780:                reg.A[x] = reg.R[y];
                   3781:                reg.R[y] = tmp;
                   3782:                return;
                   3783:        } else {
                   3784:                // AND.W Dx,<ea>
                   3785:                CYCLE2(3, 4);
                   3786:                uint32 ea = cea_data_2();
                   3787:                uint32 dst = read_2(ea);
                   3788:                dst &= RegDX & 0xffff;
                   3789:                ACC.move_16(dst);
                   3790:                write_2(ea, dst);
                   3791:        }
                   3792: }
                   3793: 
                   3794: // %1100_xxx110_mmmrrr ..m+-rxw.. 034  AND.L Dx,<ea>
                   3795: // %1100_xxx110_001yyy .......... 034  EXG.L Dx,Ay
                   3796: OP_DEF(and_l_dn_ea)
                   3797: {
                   3798:        uint n = ir & 0x3f;
                   3799: 
                   3800:        if (n < 8) {
                   3801:                op_illegal();
                   3802:                return;
                   3803:        } else if (n < 16) {
                   3804:                // EXG.L Dx,Ay
                   3805:                // ここでは x は 0..7 で D(x)、y は 8..15 で R(y)
                   3806:                CYCLE(4);
                   3807:                uint x = RegIRX;
                   3808:                uint y = n;
                   3809:                uint32 tmp = reg.D[x];
                   3810:                reg.D[x] = reg.R[y];
                   3811:                reg.R[y] = tmp;
                   3812:                return;
                   3813:        } else {
                   3814:                // AND.L Dx,<ea>
                   3815:                CYCLE2(3, 4);
                   3816:                uint32 ea = cea_data_4();
                   3817:                uint32 dst = read_4(ea);
                   3818:                dst &= RegDX;
                   3819:                ACC.move_32(dst);
                   3820:                write_4(ea, dst);
                   3821:        }
                   3822: }
                   3823: 
                   3824: // %1100_xxx111_mmmrrr d.m+-rxwpi 034  MULS.W <ea>,Dx
                   3825: OP_DEF(muls_w)
                   3826: {
                   3827:        CYCLE(28);      // 実際にはこれは最大値
                   3828:        uint32 src = fea_data_2();
                   3829:        uint32 dst = RegDX & 0xffff;
                   3830:        RegDX = ACC.muls_16(src, dst);
                   3831: }
                   3832: 
                   3833: // %1101_xxx000_mmmrrr dam+-rxwpi 034  ADD.B <ea>,Dx
                   3834: OP_DEF(add_b_ea_dn)
                   3835: {
                   3836:        CYCLE(2);
                   3837:        uint32 src = fea_all_1();
                   3838:        uint32 data = ACC.add_8(src, RegDX & 0xff);
                   3839:        RegDX = (RegDX & 0xffffff00) | data;
                   3840: }
                   3841: 
                   3842: // %1101_xxx001_mmmrrr dam+-rxwpi 034  ADD.W <ea>,Dx
                   3843: OP_DEF(add_w_ea_dn)
                   3844: {
                   3845:        CYCLE(2);
                   3846:        uint32 src = fea_all_2();
                   3847:        uint32 data = ACC.add_16(src, RegDX & 0xffff);
                   3848:        RegDX = (RegDX & 0xffff0000) | data;
                   3849: }
                   3850: 
                   3851: // %1101_xxx010_mmmrrr dam+-rxwpi 034  ADD.L <ea>,Dx
                   3852: OP_DEF(add_l_ea_dn)
                   3853: {
                   3854:        CYCLE(2);
                   3855:        uint32 src = fea_all_4();
                   3856:        RegDX = ACC.add_32(src, RegDX);
                   3857: }
                   3858: 
                   3859: // %1101_xxx011_mmmrrr dam+-rxwpi 034  ADDA.W <ea>,Ax
                   3860: OP_DEF(adda_w)
                   3861: {
                   3862:        CYCLE(4);
                   3863:        uint32 src = (int32)(int16)fea_all_2();
                   3864:        RegAX += src;
                   3865: }
                   3866: 
                   3867: // %1101_xxx100_mmmrrr ..m+-rxw.. 034  ADD.B Dx,<ea>
                   3868: // %1101_xxx100_000yyy .......... 034  ADDX.B Dy,Dx
                   3869: // %1101_xxx100_001yyy .......... 034  ADDX.B -(Ay),-(Ax)
                   3870: OP_DEF(add_b_dn_ea)
                   3871: {
                   3872:        uint n = ir & 0x3f;
                   3873: 
                   3874:        if (n < 8) {
                   3875:                // ADDX.B Dy,Dx
                   3876:                CYCLE(2);
                   3877:                uint32 src = RegDY & 0xff;
                   3878:                uint32 dst = RegDX & 0xff;
                   3879:                dst = ACC.addx_8(src, dst);
                   3880:                RegDX = (RegDX & 0xffffff00) | dst;
                   3881:        } else if (n < 16) {
                   3882:                // ADDX.B -(Ay),-(Ax)
                   3883:                CYCLE2(9, 10);
                   3884:                save_reg_pd_if(RegIRY);
                   3885:                save_reg_pd_if(RegIRX);
                   3886:                uint32 srcea = internal_ea_anpd_1(RegIRY);
                   3887:                uint32 dstea = internal_ea_anpd_1(RegIRX);
                   3888:                uint32 src = read_1(srcea);
                   3889:                uint32 dst = read_1(dstea);
                   3890:                dst = ACC.addx_8(src, dst);
                   3891:                write_1(dstea, dst);
                   3892:        } else {
                   3893:                // ADD.B Dx,<ea>
                   3894:                CYCLE2(3, 4);
                   3895:                uint32 ea = cea_data_1();
                   3896:                uint32 data = read_1(ea);
                   3897:                data = ACC.add_8(RegDX & 0xff, data);
                   3898:                write_1(ea, data);
                   3899:        }
                   3900: }
                   3901: 
                   3902: // %1101_xxx101_mmmrrr ..m+-rxw.. 034  ADD.W Dx,<ea>
                   3903: // %1101_xxx101_000yyy .......... 034  ADDX.W Dy,Dx
                   3904: // %1101_xxx101_001yyy .......... 034  ADDX.W -(Ay),-(Ax)
                   3905: OP_DEF(add_w_dn_ea)
                   3906: {
                   3907:        uint n = ir & 0x3f;
                   3908: 
                   3909:        if (n < 8) {
                   3910:                // ADDX.W Dy,Dx
                   3911:                CYCLE(2);
                   3912:                uint32 src = RegDY & 0xffff;
                   3913:                uint32 dst = RegDX & 0xffff;
                   3914:                dst = ACC.addx_16(src, dst);
                   3915:                RegDX = (RegDX & 0xffff0000) | dst;
                   3916:        } else if (n < 16) {
                   3917:                // ADDX.W -(Ay),-(Ax)
                   3918:                CYCLE2(9, 10);
                   3919:                save_reg_pd_if(RegIRY);
                   3920:                save_reg_pd_if(RegIRX);
                   3921:                uint32 srcea = internal_ea_anpd_2(RegIRY);
                   3922:                uint32 dstea = internal_ea_anpd_2(RegIRX);
                   3923:                uint32 src = read_2(srcea);
                   3924:                uint32 dst = read_2(dstea);
                   3925:                dst = ACC.addx_16(src, dst);
                   3926:                write_2(dstea, dst);
                   3927:        } else {
                   3928:                // ADD.W Dx,<ea>
                   3929:                CYCLE2(3, 4);
                   3930:                uint32 ea = cea_data_2();
                   3931:                uint32 data = read_2(ea);
                   3932:                data = ACC.add_16(RegDX & 0xffff, data);
                   3933:                write_2(ea, data);
                   3934:        }
                   3935: }
                   3936: 
                   3937: // %1101_xxx110_mmmrrr ..m+-rxw.. 034  ADD.L Dx,<ea>
                   3938: // %1101_xxx110_000yyy .......... 034  ADDX.L Dy,Dx
                   3939: // %1101_xxx110_001yyy .......... 034  ADDX.L -(Ay),-(Ax)
                   3940: OP_DEF(add_l_dn_ea)
                   3941: {
                   3942:        uint n = ir & 0x3f;
                   3943: 
                   3944:        if (n < 8) {
                   3945:                // ADDX.L Dy,Dx
                   3946:                CYCLE(2);
                   3947:                uint32 src = RegDY;
                   3948:                uint32 dst = RegDX;
                   3949:                RegDX = ACC.addx_32(src, dst);
                   3950:        } else if (n < 16) {
                   3951:                // ADDX.L -(Ay),-(Ax)
                   3952:                CYCLE2(9, 10);
                   3953:                save_reg_pd_if(RegIRY);
                   3954:                save_reg_pd_if(RegIRX);
                   3955:                uint32 srcea = internal_ea_anpd_4(RegIRY);
                   3956:                uint32 dstea = internal_ea_anpd_4(RegIRX);
                   3957:                uint32 src = read_4(srcea);
                   3958:                uint32 dst = read_4(dstea);
                   3959:                dst = ACC.addx_32(src, dst);
                   3960:                write_4(dstea, dst);
                   3961:        } else {
                   3962:                // ADD.L Dx,<ea>
                   3963:                CYCLE2(3, 4);
                   3964:                uint32 ea = cea_data_4();
                   3965:                uint32 data = read_4(ea);
                   3966:                data = ACC.add_32(RegDX, data);
                   3967:                write_4(ea, data);
                   3968:        }
                   3969: }
                   3970: 
                   3971: // %1101_xxx111_mmmrrr dam+-rxwpi 034  ADDA.L <ea>,Ax
                   3972: OP_DEF(adda_l)
                   3973: {
                   3974:        CYCLE(2);
                   3975:        uint32 src = fea_all_4();
                   3976:        RegAX += src;
                   3977: }
                   3978: 
                   3979: // %1110_qqq000_000yyy .......... 034  ASR.B #qqq,Dy
                   3980: // %1110_qqq000_001yyy .......... 034  LSR.B #qqq,Dy
                   3981: // %1110_qqq000_010yyy .......... 034  ROXR.B #qqq,Dy
                   3982: // %1110_qqq000_011yyy .......... 034  ROR.B #qqq,Dy
                   3983: // %1110_xxx000_100yyy .......... 034  ASR.B Dx,Dy
                   3984: // %1110_xxx000_101yyy .......... 034  LSR.B Dx,Dy
                   3985: // %1110_xxx000_110yyy .......... 034  ROXR.B Dx,Dy
                   3986: // %1110_xxx000_111yyy .......... 034  ROR.B Dx,Dy
                   3987: OP_DEF(asr_b_imm)
                   3988: {
                   3989:        int count;
                   3990:        uint32 data;
                   3991:        switch (eamode(ir)) {
                   3992:         case 0:        // ASR.B #qqq,Dy
                   3993:                CYCLE(4);
                   3994:                count = RegIRX;
                   3995:                count = (count == 0) ? 8 : count;
                   3996:                __assume(1 <= count && count <= 8);
                   3997:                data = ACC.asr_8(RegDY & 0xff, count);
                   3998:                RegDY = (RegDY & 0xffffff00) | data;
                   3999:                return;
                   4000:         case 1:        // LSR.B #qqq,Dy
                   4001:                CYCLE(4);
                   4002:                count = RegIRX;
                   4003:                count = (count == 0) ? 8 : count;
                   4004:                __assume(1 <= count && count <= 8);
                   4005:                data = ACC.lsr_8(RegDY & 0xff, count);
                   4006:                RegDY = (RegDY & 0xffffff00) | data;
                   4007:                return;
                   4008:         case 2:        // ROXR.B #qqq,Dy
                   4009:                CYCLE(12);
                   4010:                count = RegIRX;
                   4011:                count = (count == 0) ? 8 : count;
                   4012:                __assume(1 <= count && count <= 8);
                   4013:                data = ACC.roxr_8(RegDY & 0xff, count);
                   4014:                RegDY = (RegDY & 0xffffff00) | data;
                   4015:                return;
                   4016:         case 3:        // ROR.B #qqq,Dy
                   4017:                CYCLE(6);
                   4018:                count = RegIRX;
                   4019:                count = (count == 0) ? 8 : count;
                   4020:                __assume(1 <= count && count <= 8);
                   4021:                data = ACC.ror_8(RegDY & 0xff, count);
                   4022:                RegDY = (RegDY & 0xffffff00) | data;
                   4023:                return;
                   4024:         case 4:        // ASR.B Dx,Dy
                   4025:                count = RegDX & 63;
                   4026:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4027:                CYCLE(count <= 8 ? 6 : 10);
                   4028:                __assume(0 <= count && count < 64);
                   4029:                data = ACC.asr_8(RegDY & 0xff, count);
                   4030:                RegDY = (RegDY & 0xffffff00) | data;
                   4031:                return;
                   4032:         case 5:        // LSR.B Dx,Dy
                   4033:                count = RegDX & 63;
                   4034:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4035:                CYCLE(count <= 8 ? 6 : 8);
                   4036:                __assume(0 <= count && count < 64);
                   4037:                data = ACC.lsr_8(RegDY & 0xff, count);
                   4038:                RegDY = (RegDY & 0xffffff00) | data;
                   4039:                return;
                   4040:         case 6:        // ROXR.B Dx,Dy
                   4041:                CYCLE(12);
                   4042:                count = RegDX & 63;
                   4043:                __assume(0 <= count && count < 64);
                   4044:                data = ACC.roxr_8(RegDY & 0xff, count);
                   4045:                RegDY = (RegDY & 0xffffff00) | data;
                   4046:                return;
                   4047:         case 7:        // ROR.B Dx,Dy
                   4048:                CYCLE(8);
                   4049:                count = RegDX & 63;
                   4050:                __assume(0 <= count && count < 64);
                   4051:                data = ACC.ror_8(RegDY & 0xff, count);
                   4052:                RegDY = (RegDY & 0xffffff00) | data;
                   4053:                return;
                   4054:        }
                   4055: }
                   4056: 
                   4057: // %1110_qqq001_000yyy .......... 034  ASR.W #qqq,Dy
                   4058: // %1110_qqq001_001yyy .......... 034  LSR.W #qqq,Dy
                   4059: // %1110_qqq001_010yyy .......... 034  ROXR.W #qqq,Dy
                   4060: // %1110_qqq001_011yyy .......... 034  ROR.W #qqq,Dy
                   4061: // %1110_xxx001_100yyy .......... 034  ASR.W Dx,Dy
                   4062: // %1110_xxx001_101yyy .......... 034  LSR.W Dx,Dy
                   4063: // %1110_xxx001_110yyy .......... 034  ROXR.W Dx,Dy
                   4064: // %1110_xxx001_111yyy .......... 034  ROR.W Dx,Dy
                   4065: OP_DEF(asr_w_imm)
                   4066: {
                   4067:        int count;
                   4068:        uint32 data;
                   4069:        switch (eamode(ir)) {
                   4070:         case 0:        // ASR.W #qqq,Dy
                   4071:                CYCLE(4);
                   4072:                count = RegIRX;
                   4073:                count = (count == 0) ? 8 : count;
                   4074:                __assume(1 <= count && count <= 8);
                   4075:                data = ACC.asr_16(RegDY & 0xffff, count);
                   4076:                RegDY = (RegDY & 0xffff0000) | data;
                   4077:                return;
                   4078:         case 1:        // LSR.W #qqq,Dy
                   4079:                CYCLE(4);
                   4080:                count = RegIRX;
                   4081:                count = (count == 0) ? 8 : count;
                   4082:                __assume(1 <= count && count <= 8);
                   4083:                data = ACC.lsr_16(RegDY & 0xffff, count);
                   4084:                RegDY = (RegDY & 0xffff0000) | data;
                   4085:                return;
                   4086:         case 2:        // ROXR.W #qqq,Dy
                   4087:                CYCLE(12);
                   4088:                count = RegIRX;
                   4089:                count = (count == 0) ? 8 : count;
                   4090:                __assume(1 <= count && count <= 8);
                   4091:                data = ACC.roxr_16(RegDY & 0xffff, count);
                   4092:                RegDY = (RegDY & 0xffff0000) | data;
                   4093:                return;
                   4094:         case 3:        // ROR.W #qqq,Dy
                   4095:                CYCLE(6);
                   4096:                count = RegIRX;
                   4097:                count = (count == 0) ? 8 : count;
                   4098:                __assume(1 <= count && count <= 8);
                   4099:                data = ACC.ror_16(RegDY & 0xffff, count);
                   4100:                RegDY = (RegDY & 0xffff0000) | data;
                   4101:                return;
                   4102:         case 4:        // ASR.W Dx,Dy
                   4103:                count = RegDX & 63;
                   4104:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4105:                CYCLE(count <= 16 ? 6 : 10);
                   4106:                __assume(0 <= count && count < 64);
                   4107:                data = ACC.asr_16(RegDY & 0xffff, count);
                   4108:                RegDY = (RegDY & 0xffff0000) | data;
                   4109:                return;
                   4110:         case 5:        // LSR.W Dx,Dy
                   4111:                count = RegDX & 63;
                   4112:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4113:                CYCLE(count <= 16 ? 6 : 8);
                   4114:                __assume(0 <= count && count < 64);
                   4115:                data = ACC.lsr_16(RegDY & 0xffff, count);
                   4116:                RegDY = (RegDY & 0xffff0000) | data;
                   4117:                return;
                   4118:         case 6:        // ROXR.W Dx,Dy
                   4119:                CYCLE(12);
                   4120:                count = RegDX & 63;
                   4121:                __assume(0 <= count && count < 64);
                   4122:                data = ACC.roxr_16(RegDY & 0xffff, count);
                   4123:                RegDY = (RegDY & 0xffff0000) | data;
                   4124:                return;
                   4125:         case 7:        // ROR.W Dx,Dy
                   4126:                CYCLE(8);
                   4127:                count = RegDX & 63;
                   4128:                __assume(0 <= count && count < 64);
                   4129:                data = ACC.ror_16(RegDY & 0xffff, count);
                   4130:                RegDY = (RegDY & 0xffff0000) | data;
                   4131:                return;
                   4132:        }
                   4133: }
                   4134: 
                   4135: // %1110_qqq010_000yyy .......... 034  ASR.L #qqq,Dy
                   4136: // %1110_qqq010_001yyy .......... 034  LSR.L #qqq,Dy
                   4137: // %1110_qqq010_010yyy .......... 034  ROXR.L #qqq,Dy
                   4138: // %1110_qqq010_011yyy .......... 034  ROR.L #qqq,Dy
                   4139: // %1110_xxx010_100yyy .......... 034  ASR.L Dx,Dy
                   4140: // %1110_xxx010_101yyy .......... 034  LSR.L Dx,Dy
                   4141: // %1110_xxx010_110yyy .......... 034  ROXR.L Dx,Dy
                   4142: // %1110_xxx010_111yyy .......... 034  ROR.L Dx,Dy
                   4143: OP_DEF(asr_l_imm)
                   4144: {
                   4145:        int count;
                   4146:        switch (eamode(ir)) {
                   4147:         case 0:        // ASR.L #qqq,Dy
                   4148:                CYCLE(4);
                   4149:                count = RegIRX;
                   4150:                count = (count == 0) ? 8 : count;
                   4151:                __assume(1 <= count && count <= 8);
                   4152:                RegDY = ACC.asr_32(RegDY, count);
                   4153:                return;
                   4154:         case 1:        // LSR.L #qqq,Dy
                   4155:                CYCLE(4);
                   4156:                count = RegIRX;
                   4157:                count = (count == 0) ? 8 : count;
                   4158:                __assume(1 <= count && count <= 8);
                   4159:                RegDY = ACC.lsr_32(RegDY, count);
                   4160:                return;
                   4161:         case 2:        // ROXR.L #qqq,Dy
                   4162:                CYCLE(12);
                   4163:                count = RegIRX;
                   4164:                count = (count == 0) ? 8 : count;
                   4165:                __assume(1 <= count && count <= 8);
                   4166:                RegDY = ACC.roxr_32(RegDY, count);
                   4167:                return;
                   4168:         case 3:        // ROR.L #qqq,Dy
                   4169:                CYCLE(6);
                   4170:                count = RegIRX;
                   4171:                count = (count == 0) ? 8 : count;
                   4172:                __assume(1 <= count && count <= 8);
                   4173:                RegDY = ACC.ror_32(RegDY, count);
                   4174:                return;
                   4175:         case 4:        // ASR.L Dx,Dy
                   4176:                count = RegDX & 63;
                   4177:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4178:                CYCLE(count <= 32 ? 6 : 10);
                   4179:                __assume(0 <= count && count < 64);
                   4180:                RegDY = ACC.asr_32(RegDY, count);
                   4181:                return;
                   4182:         case 5:        // LSR.L Dx,Dy
                   4183:                count = RegDX & 63;
                   4184:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4185:                CYCLE(count <= 32 ? 6 : 8);
                   4186:                __assume(0 <= count && count < 64);
                   4187:                RegDY = ACC.lsr_32(RegDY, count);
                   4188:                return;
                   4189:         case 6:        // ROXR.L Dx,Dy
                   4190:                CYCLE(12);
                   4191:                count = RegDX & 63;
                   4192:                __assume(0 <= count && count < 64);
                   4193:                RegDY = ACC.roxr_32(RegDY, count);
                   4194:                return;
                   4195:         case 7:        // ROR.L Dx,Dy
                   4196:                CYCLE(8);
                   4197:                count = RegDX & 63;
                   4198:                __assume(0 <= count && count < 64);
                   4199:                RegDY = ACC.ror_32(RegDY, count);
                   4200:                return;
                   4201:        }
                   4202: }
                   4203: 
                   4204: // %1110_000011_mmmrrr ..m+-rxw.. 034  ASR.W <ea>
                   4205: OP_DEF(asr_w)
                   4206: {
                   4207:        CYCLE(4);
                   4208:        uint32 ea = cea_data_2();
                   4209:        uint32 data = read_2(ea);
                   4210:        data = ACC.asr_16(data, 1);
                   4211:        write_2(ea, data);
                   4212: }
                   4213: 
                   4214: // %1110_qqq100_000yyy .......... 034  ASL.B #qqq,Dy
                   4215: // %1110_qqq100_001yyy .......... 034  LSL.B #qqq,Dy
                   4216: // %1110_qqq100_010yyy .......... 034  ROXL.B #qqq,Dy
                   4217: // %1110_qqq100_011yyy .......... 034  ROL.B #qqq,Dy
                   4218: // %1110_xxx100_100yyy .......... 034  ASL.B Dx,Dy
                   4219: // %1110_xxx100_101yyy .......... 034  LSL.B Dx,Dy
                   4220: // %1110_xxx100_110yyy .......... 034  ROXL.B Dx,Dy
                   4221: // %1110_xxx100_111yyy .......... 034  ROL.B Dx,Dy
                   4222: OP_DEF(asl_b_imm)
                   4223: {
                   4224:        int count;
                   4225:        uint32 data;
                   4226:        switch (eamode(ir)) {
                   4227:         case 0:        // ASL.B #qqq,Dy
                   4228:                CYCLE(6);
                   4229:                count = RegIRX;
                   4230:                count = (count == 0) ? 8 : count;
                   4231:                __assume(1 <= count && count <= 8);
                   4232:                data = ACC.asl_8(RegDY & 0xff, count);
                   4233:                RegDY = (RegDY & 0xffffff00) | data;
                   4234:                return;
                   4235:         case 1:        // LSL.B #qqq,Dy
                   4236:                CYCLE(4);
                   4237:                count = RegIRX;
                   4238:                count = (count == 0) ? 8 : count;
                   4239:                __assume(1 <= count && count <= 8);
                   4240:                data = ACC.lsl_8(RegDY & 0xff, count);
                   4241:                RegDY = (RegDY & 0xffffff00) | data;
                   4242:                return;
                   4243:         case 2:        // ROXL.B #qqq,Dy
                   4244:                CYCLE(12);
                   4245:                count = RegIRX;
                   4246:                count = (count == 0) ? 8 : count;
                   4247:                __assume(1 <= count && count <= 8);
                   4248:                data = ACC.roxl_8(RegDY & 0xff, count);
                   4249:                RegDY = (RegDY & 0xffffff00) | data;
                   4250:                return;
                   4251:         case 3:        // ROL.B #qqq,Dy
                   4252:                CYCLE(6);
                   4253:                count = RegIRX;
                   4254:                count = (count == 0) ? 8 : count;
                   4255:                __assume(1 <= count && count <= 8);
                   4256:                data = ACC.rol_8(RegDY & 0xff, count);
                   4257:                RegDY = (RegDY & 0xffffff00) | data;
                   4258:                return;
                   4259:         case 4:        // ASL.B Dx,Dy
                   4260:                CYCLE(8);
                   4261:                count = RegDX & 63;
                   4262:                __assume(0 <= count && count < 64);
                   4263:                data = ACC.asl_8(RegDY & 0xff, count);
                   4264:                RegDY = (RegDY & 0xffffff00) | data;
                   4265:                return;
                   4266:         case 5:        // LSL.B Dx,Dy
                   4267:                count = RegDX & 63;
                   4268:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4269:                CYCLE(count <= 8 ? 6 : 8);
                   4270:                __assume(0 <= count && count < 64);
                   4271:                data = ACC.lsl_8(RegDY & 0xff, count);
                   4272:                RegDY = (RegDY & 0xffffff00) | data;
                   4273:                return;
                   4274:         case 6:        // ROXL.B Dx,Dy
                   4275:                CYCLE(12);
                   4276:                count = RegDX & 63;
                   4277:                __assume(0 <= count && count < 64);
                   4278:                data = ACC.roxl_8(RegDY & 0xff, count);
                   4279:                RegDY = (RegDY & 0xffffff00) | data;
                   4280:                return;
                   4281:         case 7:        // ROL.B Dx,Dy
                   4282:                CYCLE(8);
                   4283:                count = RegDX & 63;
                   4284:                __assume(0 <= count && count < 64);
                   4285:                data = ACC.rol_8(RegDY & 0xff, count);
                   4286:                RegDY = (RegDY & 0xffffff00) | data;
                   4287:                return;
                   4288:        }
                   4289: }
                   4290: 
                   4291: // %1110_qqq101_000yyy .......... 034  ASL.W #qqq,Dy
                   4292: // %1110_qqq101_001yyy .......... 034  LSL.W #qqq,Dy
                   4293: // %1110_qqq101_010yyy .......... 034  ROXL.W #qqq,Dy
                   4294: // %1110_qqq101_011yyy .......... 034  ROL.W #qqq,Dy
                   4295: // %1110_xxx101_100yyy .......... 034  ASL.W Dx,Dy
                   4296: // %1110_xxx101_101yyy .......... 034  LSL.W Dx,Dy
                   4297: // %1110_xxx101_110yyy .......... 034  ROXL.W Dx,Dy
                   4298: // %1110_xxx101_111yyy .......... 034  ROL.W Dx,Dy
                   4299: OP_DEF(asl_w_imm)
                   4300: {
                   4301:        int count;
                   4302:        uint32 data;
                   4303:        switch (eamode(ir)) {
                   4304:         case 0:        // ASL.W #qqq,Dy
                   4305:                CYCLE(6);
                   4306:                count = RegIRX;
                   4307:                count = (count == 0) ? 8 : count;
                   4308:                __assume(1 <= count && count <= 8);
                   4309:                data = ACC.asl_16(RegDY & 0xffff, count);
                   4310:                RegDY = (RegDY & 0xffff0000) | data;
                   4311:                return;
                   4312:         case 1:        // LSL.W #qqq,Dy
                   4313:                CYCLE(4);
                   4314:                count = RegIRX;
                   4315:                count = (count == 0) ? 8 : count;
                   4316:                __assume(1 <= count && count <= 8);
                   4317:                data = ACC.lsl_16(RegDY & 0xffff, count);
                   4318:                RegDY = (RegDY & 0xffff0000) | data;
                   4319:                return;
                   4320:         case 2:        // ROXL.W #qqq,Dy
                   4321:                CYCLE(12);
                   4322:                count = RegIRX;
                   4323:                count = (count == 0) ? 8 : count;
                   4324:                __assume(1 <= count && count <= 8);
                   4325:                data = ACC.roxl_16(RegDY & 0xffff, count);
                   4326:                RegDY = (RegDY & 0xffff0000) | data;
                   4327:                return;
                   4328:         case 3:        // ROL.W #qqq,Dy
                   4329:                CYCLE(6);
                   4330:                count = RegIRX;
                   4331:                count = (count == 0) ? 8 : count;
                   4332:                __assume(1 <= count && count <= 8);
                   4333:                data = ACC.rol_16(RegDY & 0xffff, count);
                   4334:                RegDY = (RegDY & 0xffff0000) | data;
                   4335:                return;
                   4336:         case 4:        // ASL.W Dx,Dy
                   4337:                CYCLE(8);
                   4338:                count = RegDX & 63;
                   4339:                __assume(0 <= count && count < 64);
                   4340:                data = ACC.asl_16(RegDY & 0xffff, count);
                   4341:                RegDY = (RegDY & 0xffff0000) | data;
                   4342:                return;
                   4343:         case 5:        // LSL.W Dx,Dy
                   4344:                count = RegDX & 63;
                   4345:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4346:                CYCLE(count <= 16 ? 6 : 8);
                   4347:                __assume(0 <= count && count < 64);
                   4348:                data = ACC.lsl_16(RegDY & 0xffff, count);
                   4349:                RegDY = (RegDY & 0xffff0000) | data;
                   4350:                return;
                   4351:         case 6:        // ROXL.W Dx,Dy
                   4352:                CYCLE(12);
                   4353:                count = RegDX & 63;
                   4354:                __assume(0 <= count && count < 64);
                   4355:                data = ACC.roxl_16(RegDY & 0xffff, count);
                   4356:                RegDY = (RegDY & 0xffff0000) | data;
                   4357:                return;
                   4358:         case 7:        // ROL.W Dx,Dy
                   4359:                CYCLE(8);
                   4360:                count = RegDX & 63;
                   4361:                __assume(0 <= count && count < 64);
                   4362:                data = ACC.rol_16(RegDY & 0xffff, count);
                   4363:                RegDY = (RegDY & 0xffff0000) | data;
                   4364:                return;
                   4365:        }
                   4366: }
                   4367: 
                   4368: // %1110_qqq110_000yyy .......... 034  ASL.L #qqq,Dy
                   4369: // %1110_qqq110_001yyy .......... 034  LSL.L #qqq,Dy
                   4370: // %1110_qqq110_010yyy .......... 034  ROXL.L #qqq,Dy
                   4371: // %1110_qqq110_011yyy .......... 034  ROL.L #qqq,Dy
                   4372: // %1110_xxx110_100yyy .......... 034  ASL.L Dx,Dy
                   4373: // %1110_xxx110_101yyy .......... 034  LSL.L Dx,Dy
                   4374: // %1110_xxx110_110yyy .......... 034  ROXL.L Dx,Dy
                   4375: // %1110_xxx110_111yyy .......... 034  ROL.L Dx,Dy
                   4376: OP_DEF(asl_l_imm)
                   4377: {
                   4378:        int count;
                   4379:        switch (eamode(ir)) {
                   4380:         case 0:        // ASL.L #qqq,Dy
                   4381:                CYCLE(6);
                   4382:                count = RegIRX;
                   4383:                count = (count == 0) ? 8 : count;
                   4384:                __assume(1 <= count && count <= 8);
                   4385:                RegDY = ACC.asl_32(RegDY, count);
                   4386:                return;
                   4387:         case 1:        // LSL.L #qqq,Dy
                   4388:                CYCLE(4);
                   4389:                count = RegIRX;
                   4390:                count = (count == 0) ? 8 : count;
                   4391:                __assume(1 <= count && count <= 8);
                   4392:                RegDY = ACC.lsl_32(RegDY, count);
                   4393:                return;
                   4394:         case 2:        // ROXL.L #qqq,Dy
                   4395:                CYCLE(12);
                   4396:                count = RegIRX;
                   4397:                count = (count == 0) ? 8 : count;
                   4398:                __assume(1 <= count && count <= 8);
                   4399:                RegDY = ACC.roxl_32(RegDY, count);
                   4400:                return;
                   4401:         case 3:        // ROL.L #qqq,Dy
                   4402:                CYCLE(6);
                   4403:                count = RegIRX;
                   4404:                count = (count == 0) ? 8 : count;
                   4405:                __assume(1 <= count && count <= 8);
                   4406:                RegDY = ACC.rol_32(RegDY, count);
                   4407:                return;
                   4408:         case 4:        // ASL.L Dx,Dy
                   4409:                CYCLE(8);
                   4410:                count = RegDX & 63;
                   4411:                __assume(0 <= count && count < 64);
                   4412:                RegDY = ACC.asl_32(RegDY, count);
                   4413:                return;
                   4414:         case 5:        // LSL.L Dx,Dy
                   4415:                count = RegDX & 63;
                   4416:                // シフト数がデータサイズを越えるかどうかでサイクルが違う
                   4417:                CYCLE(count <= 32 ? 6 : 8);
                   4418:                __assume(0 <= count && count < 64);
                   4419:                RegDY = ACC.lsl_32(RegDY, count);
                   4420:                return;
                   4421:         case 6:        // ROXL.L Dx,Dy
                   4422:                CYCLE(12);
                   4423:                count = RegDX & 63;
                   4424:                __assume(0 <= count && count < 64);
                   4425:                RegDY = ACC.roxl_32(RegDY, count);
                   4426:                return;
                   4427:         case 7:        // ROL.L Dx,Dy
                   4428:                CYCLE(8);
                   4429:                count = RegDX & 63;
                   4430:                __assume(0 <= count && count < 64);
                   4431:                RegDY = ACC.rol_32(RegDY, count);
                   4432:                return;
                   4433:        }
                   4434: }
                   4435: 
                   4436: // %1110_000111_mmmrrr ..m+-rxw.. 034  ASL.W <ea>
                   4437: OP_DEF(asl_w)
                   4438: {
                   4439:        CYCLE(6);
                   4440:        uint32 ea = cea_data_2();
                   4441:        uint32 data = read_2(ea);
                   4442:        data = ACC.asl_16(data, 1);
                   4443:        write_2(ea, data);
                   4444: }
                   4445: 
                   4446: // %1110_001011_mmmrrr ..m+-rxw.. 034  LSR.W <ea>
                   4447: OP_DEF(lsr_w)
                   4448: {
                   4449:        CYCLE(4);
                   4450:        uint32 ea = cea_data_2();
                   4451:        uint32 data = read_2(ea);
                   4452:        data = ACC.lsr_16(data, 1);
                   4453:        write_2(ea, data);
                   4454: }
                   4455: 
                   4456: // %1110_001111_mmmrrr ..m+-rxw.. 034  LSL.W <ea>
                   4457: OP_DEF(lsl_w)
                   4458: {
                   4459:        CYCLE(4);
                   4460:        uint32 ea = cea_data_2();
                   4461:        uint32 data = read_2(ea);
                   4462:        data = ACC.lsl_16(data, 1);
                   4463:        write_2(ea, data);
                   4464: }
                   4465: 
                   4466: // %1110_010011_mmmrrr ..m+-rxw.. 034  ROXR.W <ea>
                   4467: OP_DEF(roxr_w)
                   4468: {
                   4469:        CYCLE(4);
                   4470:        uint32 ea = cea_data_2();
                   4471:        uint32 data = read_2(ea);
                   4472:        data = ACC.roxr_16(data, 1);
                   4473:        write_2(ea, data);
                   4474: }
                   4475: 
                   4476: // %1110_010111_mmmrrr ..m+-rxw.. 034  ROXL.W <ea>
                   4477: OP_DEF(roxl_w)
                   4478: {
                   4479:        CYCLE(4);
                   4480:        uint32 ea = cea_data_2();
                   4481:        uint32 data = read_2(ea);
                   4482:        data = ACC.roxl_16(data, 1);
                   4483:        write_2(ea, data);
                   4484: }
                   4485: 
                   4486: // %1110_011011_mmmrrr ..m+-rxw.. 034  ROR.W <ea>
                   4487: OP_DEF(ror_w)
                   4488: {
                   4489:        CYCLE(6);
                   4490:        uint32 ea = cea_data_2();
                   4491:        uint32 data = read_2(ea);
                   4492:        data = ACC.ror_16(data, 1);
                   4493:        write_2(ea, data);
                   4494: }
                   4495: 
                   4496: // %1110_011111_mmmrrr ..m+-rxw.. 034  ROL.W <ea>
                   4497: OP_DEF(rol_w)
                   4498: {
                   4499:        CYCLE(6);
                   4500:        uint32 ea = cea_data_2();
                   4501:        uint32 data = read_2(ea);
                   4502:        data = ACC.rol_16(data, 1);
                   4503:        write_2(ea, data);
                   4504: }
                   4505: 
                   4506: // %1110_100011_mmmrrr d.m..rxwp. -34  BFTST <ea>{#o:#w}
                   4507: OP_DEF(bftst)
                   4508: {
                   4509:        uint n = ir & 0x3f;
                   4510:        ir2 = fetch_2();
                   4511: 
                   4512:        acc_bf bf(this);
                   4513:        if (n < 8) {
                   4514:                // BFTST Dn{#o:#w}
                   4515:                bf.LoadReg(n);
                   4516:        } else {
                   4517:                // BFTST <ea>{#o:#w}
                   4518:                uint32 ea = cea_ctrl();
                   4519:                bf.LoadMem(ea);
                   4520:        }
                   4521:        ACC.move_32(bf.data);
                   4522: }
                   4523: 
                   4524: // %1110_100111_mmmrrr d.m..rxwp. -34  BFEXTU <ea>{#o:#w},Dn
                   4525: OP_DEF(bfextu)
                   4526: {
                   4527:        uint n = ir & 0x3f;
                   4528:        ir2 = fetch_2();
                   4529:        uint dn = ir2 >> 12;
                   4530: 
                   4531:        acc_bf bf(this);
                   4532:        if (n < 8) {
                   4533:                // BFEXTU Dn{#o:#w},Dn
                   4534:                bf.LoadReg(n);
                   4535:        } else {
                   4536:                // BFEXTU <ea>{#o:#w},Dn
                   4537:                uint32 ea = cea_ctrl();
                   4538:                bf.LoadMem(ea);
                   4539:        }
                   4540:        // CCR は操作前のビットフィールドに対して
                   4541:        ACC.move_32(bf.data);
                   4542:        // 符号なしシフト
                   4543:        reg.D[dn] = bf.data >> (32 - bf.width);
                   4544: }
                   4545: 
                   4546: // %1110_101011_mmmrrr d.m..rxw.. -34  BFCHG <ea>{#o:#w}
                   4547: OP_DEF(bfchg)
                   4548: {
                   4549:        uint n = ir & 0x3f;
                   4550:        ir2 = fetch_2();
                   4551: 
                   4552:        acc_bf bf(this);
                   4553:        if (n < 8) {
                   4554:                // BFCHG Dn{#o:#w}
                   4555:                bf.LoadReg(n);
                   4556:        } else if (n >= 0x3a) {
                   4557:                // BFCHG <ea> に PC 相対(と #imm) はない
                   4558:                op_illegal();
                   4559:        } else {
                   4560:                // BFCHG <ea>{#o:#w}
                   4561:                uint32 ea = cea_ctrl();
                   4562:                bf.LoadMem(ea);
                   4563:        }
                   4564:        // CCR は操作前のビットフィールドに対して
                   4565:        ACC.move_32(bf.data);
                   4566:        bf.data = ~bf.data;
                   4567:        bf.Store(n);
                   4568: }
                   4569: 
                   4570: // %1110_101111_mmmrrr d.m..rxwp. -34  BFEXTS <ea>{#o:#w},Dn
                   4571: OP_DEF(bfexts)
                   4572: {
                   4573:        uint n = ir & 0x3f;
                   4574:        ir2 = fetch_2();
                   4575:        uint dn = ir2 >> 12;
                   4576: 
                   4577:        acc_bf bf(this);
                   4578:        if (n < 8) {
                   4579:                // BFEXTS Dn{#o:#w},Dn
                   4580:                bf.LoadReg(n);
                   4581:        } else {
                   4582:                // BFEXTS <ea>{#o:#w},Dn
                   4583:                uint32 ea = cea_ctrl();
                   4584:                bf.LoadMem(ea);
                   4585:        }
                   4586:        // CCR は操作前のビットフィールドに対して
                   4587:        ACC.move_32(bf.data);
                   4588:        // 符号付きシフト
                   4589:        // XXX 負数の右シフト
                   4590:        reg.D[dn] = ((int32)bf.data) >> (32 - bf.width);
                   4591: }
                   4592: 
                   4593: // %1110_110011_mmmrrr d.m..rxw.. -34  BFCLR <ea>{#o:#w}
                   4594: OP_DEF(bfclr)
                   4595: {
                   4596:        uint n = ir & 0x3f;
                   4597:        ir2 = fetch_2();
                   4598: 
                   4599:        acc_bf bf(this);
                   4600:        if (n < 8) {
                   4601:                // BFCLR Dn{#o:#w}
                   4602:                bf.LoadReg(n);
                   4603:        } else if (n >= 0x3a) {
                   4604:                // BFCLR <ea> に PC 相対(と #imm) はない
                   4605:                op_illegal();
                   4606:        } else {
                   4607:                // BFCLR <ea>{#o:#w}
                   4608:                uint32 ea = cea_ctrl();
                   4609:                bf.LoadMem(ea);
                   4610:        }
                   4611:        // CCR は操作前のビットフィールドに対して
                   4612:        ACC.move_32(bf.data);
                   4613:        bf.data = 0;
                   4614:        bf.Store(n);
                   4615: }
                   4616: 
                   4617: // %1110_110111_mmmrrr d.m..rxwp. -34  BFFFO <ea>{#o:#w},Dn
                   4618: OP_DEF(bfffo)
                   4619: {
                   4620:        uint n = ir & 0x3f;
                   4621:        ir2 = fetch_2();
                   4622:        uint dn = ir2 >> 12;
                   4623: 
                   4624:        acc_bf bf(this);
                   4625:        if (n < 8) {
                   4626:                // BFFFO Dn{#o:#w},Dn
                   4627:                bf.LoadReg(n);
                   4628:        } else {
                   4629:                // BFFFO <ea>{#o:#w},Dn
                   4630:                uint32 ea = cea_ctrl();
                   4631:                bf.LoadMem(ea);
                   4632:        }
                   4633:        // CCR は操作前のビットフィールドに対して
                   4634:        ACC.move_32(bf.data);
                   4635:        // 1 になっているビットを探す
                   4636:        for (; (int)bf.width-- > 0 && (int32)bf.data >= 0; bf.data <<= 1) {
                   4637:                bf.offset++;
                   4638:        }
                   4639:        reg.D[dn] = bf.offset;
                   4640: }
                   4641: 
                   4642: // %1110_111011_mmmrrr d.m..rxw.. -34  BFSET <ea>{#o:#w}
                   4643: OP_DEF(bfset)
                   4644: {
                   4645:        uint n = ir & 0x3f;
                   4646:        ir2 = fetch_2();
                   4647: 
                   4648:        acc_bf bf(this);
                   4649:        if (n < 8) {
                   4650:                // BFSET Dn{#o:#w}
                   4651:                bf.LoadReg(n);
                   4652:        } else if (n >= 0x3a) {
                   4653:                // BFSET <ea> に PC 相対(と #imm) はない
                   4654:                op_illegal();
                   4655:        } else {
                   4656:                // BFSET <ea>{#o:#w}
                   4657:                uint32 ea = cea_ctrl();
                   4658:                bf.LoadMem(ea);
                   4659:        }
                   4660:        // CCR は操作前のビットフィールドに対して
                   4661:        ACC.move_32(bf.data);
                   4662:        bf.data = 0xffffffff;
                   4663:        bf.Store(n);
                   4664: }
                   4665: 
                   4666: // %1110_111111_mmmrrr d.m..rxw.. -34  BFINS Dn,<ea>{#o:#w}
                   4667: OP_DEF(bfins)
                   4668: {
                   4669:        uint n = ir & 0x3f;
                   4670:        ir2 = fetch_2();
                   4671:        uint dn = ir2 >> 12;
                   4672: 
                   4673:        acc_bf bf(this);
                   4674:        if (n < 8) {
                   4675:                // BFINS Dm,Dn{#o:#w}
                   4676:                bf.LoadReg(n);
                   4677:        } else if (n >= 0x3a) {
                   4678:                // BFINS Dn,<ea> に PC 相対(と #imm) はない
                   4679:                op_illegal();
                   4680:        } else {
                   4681:                // BFINS Dn,<ea>{#o:#w}
                   4682:                uint32 ea = cea_ctrl();
                   4683:                bf.LoadMem(ea);
                   4684:        }
                   4685:        bf.data = reg.D[dn] << (32 - bf.width);
                   4686:        // BFINS のみ CCR は操作後のビットフィールドに対して
                   4687:        ACC.move_32(bf.data);
                   4688:        bf.Store(n);
                   4689: }
                   4690: 
                   4691: // %1111_000nnn_nnnnnn .......... -3-  MMU_OP
                   4692: OP_DEF(mmuop)
                   4693: {
                   4694:        // CPU ごとの virtual 関数になっている。
                   4695:        ops_mmu30();
                   4696: }
                   4697: 
                   4698: // 68030 MMU 命令跡地は 68040 では全部 F ライン例外。
                   4699: void
                   4700: MPU68040Device::ops_mmu30()
                   4701: {
                   4702:        op_illegal();
                   4703: }
                   4704: 
                   4705: // 68030 MMU 命令。
                   4706: void
                   4707: MPU68030Device::ops_mmu30()
                   4708: {
                   4709:        ir2 = fetch_2();
                   4710:        switch ((ir2 >> 8) & 0xff) {
                   4711:         case (0x0800 >> 8):
                   4712:         case (0x0900 >> 8):
                   4713:         case (0x0c00 >> 8):
                   4714:         case (0x0d00 >> 8):
                   4715:         // %000_01n00_000_00000        PMOVE.L <ea>,TTn
                   4716:         // %000_01n01_000_00000        PMOVEFD.L <ea>,TTn
                   4717:         {
                   4718:                CYCLE2(12, 14);
                   4719:                uint32 ea = cea_copro();
                   4720:                uint32 data = read_4(ea);
                   4721:                uint n = (ir2 >> 10) & 1;
                   4722:                SetTT(n, data);
                   4723:                if ((ir2 & 0x0100) == 0)
                   4724:                        atc.flush();
                   4725:                break;
                   4726:         }
                   4727:         case (0x0a00 >> 8):
                   4728:         case (0x0e00 >> 8):
                   4729:         // %000_01n10_000_00000        PMOVE.L TTn,<ea>
                   4730:         {
                   4731:                CYCLE(8);
                   4732:                uint32 ea = cea_copro();
                   4733:                uint n = (ir2 >> 10) & 1;
                   4734:                write_4(ea, GetTT(n));
                   4735:                break;
                   4736:         }
                   4737:         case (0x2000 >> 8):
                   4738:         // %001_00000_000_00000        PLOADW SFC,<ea>
                   4739:         // %001_00000_000_00001        PLOADW DFC,<ea>
                   4740:         // %001_00000_000_01yyy        PLOADW Dy,<ea>
                   4741:         // %001_00000_000_10nnn        PLOADW #<imm>,<ea>
                   4742:         {
                   4743: putlog(0, "ploadw");
                   4744:                mmu_op_pload();
                   4745:                break;
                   4746:         }
                   4747:         case (0x2200 >> 8):
                   4748:         // %001_00010_000_00000        PLOADR SFC,<ea>
                   4749:         // %001_00010_000_00001        PLOADR DFC,<ea>
                   4750:         // %001_00010_000_01yyy        PLOADR Dy,<ea>
                   4751:         // %001_00010_000_10nnn        PLOADR #<imm>,<ea>
                   4752:         {
                   4753: putlog(0, "ploadr");
                   4754:                mmu_op_pload();
                   4755:                break;
                   4756:         }
                   4757:         case (0x2400 >> 8):
                   4758:         // %001_00100_000_00000        PFLUSHA
                   4759:         {
                   4760:                CYCLE2(12, 14);
                   4761:                atc.flush();
                   4762:                break;
                   4763:         }
                   4764:         case (0x3000 >> 8):
                   4765:         // %001_10000_nnn_00000        PFLUSH SFC,#<mask>
                   4766:         // %001_10000_nnn_00001        PFLUSH DFC,#<mask>
                   4767:         // %001_10000_nnn_01yyy        PFLUSH Dy,#<mask>
                   4768:         // %001_10000_nnn_10nnn        PFLUSH #<imm>,#<mask>
                   4769:         {
                   4770:                mmu_op_pflush();
                   4771:                break;
                   4772:         }
                   4773:         case (0x3800 >> 8):
                   4774:         // %001_11000_nnn_00000        PFLUSH SFC,#<mask>,<ea>
                   4775:         // %001_11000_nnn_00001        PFLUSH DFC,#<mask>,<ea>
                   4776:         // %001_11000_nnn_01yyy        PFLUSH Dy,#<mask>,<ea>
                   4777:         // %001_11000_nnn_10nnn        PFLUSH #<imm>,#<mask>,<ea>
                   4778:         {
                   4779:                mmu_op_pflush_ea();
                   4780:                break;
                   4781:         }
                   4782:         case (0x4000 >> 8):
                   4783:         case (0x4100 >> 8):
                   4784:         // %010_00000_000_00000        PMOVE.L <ea>,TC
                   4785:         // %010_00001_000_00000        PMOVEFD.L <ea>,TC
                   4786:         {
                   4787:                // たぶん
                   4788:                // 無効→有効が (38, 40)
                   4789:                // 有効→無効が (56, 58)
                   4790:                // 無効→無効が (14, 16) ってことだと思うんだけど。
                   4791:                CYCLE2(14, 16);
                   4792:                uint32 ea = cea_copro();
                   4793:                uint32 data = read_4(ea);
                   4794:                if (SetTC(data) == false) {
                   4795:                        Exception(M68K::EXCEP_MMU_CONFIG);
                   4796:                        break;
                   4797:                }
                   4798:                if ((ir2 & 0x0100) == 0)
                   4799:                        atc.flush();
                   4800:                break;
                   4801:         }
                   4802:         case (0x4200 >> 8):
                   4803:         // %010_00010_000_00000        PMOVE.L TC,<ea>
                   4804:         {
                   4805:                CYCLE2(4, 5);
                   4806:                uint32 ea = cea_copro();
                   4807:                write_4(ea, GetTC());
                   4808:                break;
                   4809:         }
                   4810:         case (0x4800 >> 8):
                   4811:         case (0x4900 >> 8):
                   4812:         // %010_01000_000_00000        PMOVE.Q <ea>,SRP
                   4813:         // %010_01001_000_00000        PMOVEFD.Q <ea>,SRP
                   4814:         {
                   4815:                // たぶん有効になる時が (12, 14)
                   4816:                // それ以外が (28, 30) ってことかな。
                   4817:                CYCLE2(28, 30);
                   4818:                uint32 ea = cea_copro();
                   4819:                uint32 h = read_4(ea);
                   4820:                uint32 l = read_4(ea + 4);
                   4821:                if (SetSRP(h, l) == false) {
                   4822:                        Exception(M68K::EXCEP_MMU_CONFIG);
                   4823:                        break;
                   4824:                }
                   4825:                if ((ir2 & 0x0100) == 0)
                   4826:                        atc.flush();
                   4827:                break;
                   4828:         }
                   4829:         case (0x4a00 >> 8):
                   4830:         // %010_01010_000_00000        PMOVE.Q SRP,<ea>
                   4831:         {
                   4832:                CYCLE2(4, 5);
                   4833:                uint32 ea = cea_copro();
                   4834:                write_4(ea,     GetSRPh());
                   4835:                write_4(ea + 4, GetSRPl());
                   4836:                break;
                   4837:         }
                   4838:         case (0x4c00 >> 8):
                   4839:         case (0x4d00 >> 8):
                   4840:         // %010_01100_000_00000        PMOVE.Q <ea>,CRP
                   4841:         // %010_01101_000_00000        PMOVEFD.Q <ea>,CRP
                   4842:         {
                   4843:                // たぶん有効になる時が (12, 14)
                   4844:                // それ以外が (28, 30) ってことかな。
                   4845:                CYCLE2(28, 30);
                   4846:                uint32 ea = cea_copro();
                   4847:                uint32 h = read_4(ea);
                   4848:                uint32 l = read_4(ea + 4);
                   4849:                if (SetCRP(h, l) == false) {
                   4850:                        Exception(M68K::EXCEP_MMU_CONFIG);
                   4851:                        break;
                   4852:                }
                   4853:                if ((ir2 & 0x0100) == 0)
                   4854:                        atc.flush();
                   4855:                break;
                   4856:         }
                   4857:         case (0x4e00 >> 8):
                   4858:         // %010_01110_000_00000        PMOVE.Q CRP,<ea>
                   4859:         {
                   4860:                CYCLE2(4, 5);
                   4861:                uint32 ea = cea_copro();
                   4862:                write_4(ea,     GetCRPh());
                   4863:                write_4(ea + 4, GetCRPl());
                   4864:                break;
                   4865:         }
                   4866:         case (0x6000 >> 8):
                   4867:         // %011_00000_000_00000        PMOVE.W <ea>,MMUSR
                   4868:         {
                   4869:                CYCLE(6);
                   4870:                uint32 ea = cea_copro();
                   4871:                uint16 data = read_2(ea);
                   4872:                SetMMUSR(data);
                   4873:                break;
                   4874:         }
                   4875:         case (0x6200 >> 8):
                   4876:         // %011_00010_000_00000        PMOVE.W MMUSR,<ea>
                   4877:         {
                   4878:                CYCLE2(4, 5);
                   4879:                uint32 ea = cea_copro();
                   4880:                write_2(ea, GetMMUSR());
                   4881:                break;
                   4882:         }
                   4883:         case (0x8000 >> 8):
                   4884:         case (0x8400 >> 8):
                   4885:         case (0x8800 >> 8):
                   4886:         case (0x8c00 >> 8):
                   4887:         case (0x9000 >> 8):
                   4888:         case (0x9400 >> 8):
                   4889:         case (0x9800 >> 8):
                   4890:         case (0x9c00 >> 8):
                   4891:         // %100_nnn00_000_00000        PTESTW SFC,<ea>,#<level>
                   4892:         // %100_nnn00_000_00001        PTESTW DFC,<ea>,#<level>
                   4893:         // %100_nnn00_000_01yyy        PTESTW Dy,<ea>,#<level>
                   4894:         // %100_nnn00_000_10nnn        PTESTW #<imm>,<ea>,#<level>
                   4895:         {
                   4896:                mmu_op_ptest();
                   4897:                break;
                   4898:         }
                   4899:         case (0x8100 >> 8):
                   4900:         case (0x8500 >> 8):
                   4901:         case (0x8900 >> 8):
                   4902:         case (0x8d00 >> 8):
                   4903:         case (0x9100 >> 8):
                   4904:         case (0x9500 >> 8):
                   4905:         case (0x9900 >> 8):
                   4906:         case (0x9d00 >> 8):
                   4907:         // %100_nnn01_nnn_00000        PTESTW SFC,<ea>,#<level>,An
                   4908:         // %100_nnn01_nnn_00001        PTESTW DFC,<ea>,#<level>,An
                   4909:         // %100_nnn01_nnn_01yyy        PTESTW Dy,<ea>,#<level>,An
                   4910:         // %100_nnn01_nnn_10nnn        PTESTW #<imm>,<ea>,#<level>,An
                   4911:         {
                   4912:                mmu_op_ptest();
                   4913:                break;
                   4914:         }
                   4915:         case (0x8200 >> 8):
                   4916:         case (0x8600 >> 8):
                   4917:         case (0x8a00 >> 8):
                   4918:         case (0x8e00 >> 8):
                   4919:         case (0x9200 >> 8):
                   4920:         case (0x9600 >> 8):
                   4921:         case (0x9a00 >> 8):
                   4922:         case (0x9e00 >> 8):
                   4923:         // %100_nnn10_000_00000        PTESTR SFC,<ea>,#<level>
                   4924:         // %100_nnn10_000_00001        PTESTR DFC,<ea>,#<level>
                   4925:         // %100_nnn10_000_01yyy        PTESTR Dy,<ea>,#<level>
                   4926:         // %100_nnn10_000_10nnn        PTESTR #<imm>,<ea>,#<level>
                   4927:         {
                   4928:                mmu_op_ptest();
                   4929:                break;
                   4930:         }
                   4931:         case (0x8300 >> 8):
                   4932:         case (0x8700 >> 8):
                   4933:         case (0x8b00 >> 8):
                   4934:         case (0x8f00 >> 8):
                   4935:         case (0x9300 >> 8):
                   4936:         case (0x9700 >> 8):
                   4937:         case (0x9b00 >> 8):
                   4938:         case (0x9f00 >> 8):
                   4939:         // %100_nnn11_nnn_00000        PTESTR SFC,<ea>,#<level>,An
                   4940:         // %100_nnn11_nnn_00001        PTESTR DFC,<ea>,#<level>,An
                   4941:         // %100_nnn11_nnn_01yyy        PTESTR Dy,<ea>,#<level>,An
                   4942:         // %100_nnn11_nnn_10nnn        PTESTR #<imm>,<ea>,#<level>,An
                   4943:         {
                   4944:                mmu_op_ptest();
                   4945:                break;
                   4946:         }
                   4947:         default:
                   4948:                OP_FUNC(illegal);
                   4949:                break;
                   4950:        }
                   4951: }
                   4952: 
                   4953: // 現在の FPCR/FPSR を fe 構造体にコピー。
                   4954: //
                   4955: // fe.fe_{fpcr,fpsr} のほうはこの fpe 用の内部ワークなので破壊してよい。
                   4956: // 命令実行の結果、FPSR レジスタの値を更新する際は fpu_upd_fpsr() を
                   4957: // 呼ぶこと。これを使わず独自に更新する場合は fe.fe_fpframe->fpf_fpsr
                   4958: // (こっちがレジスタ値) と fe.fe_fpsr (FPE 用) を同時に更新すること。
                   4959: // FPCR のほうは FMOVE-to-FPCR 命令以外で変更されることはないはず。
                   4960: #define INIT_FE()      do {    \
                   4961:        fe.fe_fpcr = RegFPCR;   \
                   4962:        fe.fe_fpsr = RegFPSR;   \
                   4963: } while (0)
                   4964: 
                   4965: // ステートを (NULL なら) IDLE に変える。
                   4966: // 6888x では非条件命令、条件命令どちらでも IDLE になる。
                   4967: // 68040 では非条件命令でだけ IDLE になる。
                   4968: // 非条件命令はここでは1ワード目の opclass が 1,2,3 の命令。
                   4969: #define SET_IDLE()     do {    \
                   4970:        if (fpu_state == FPU_STATE_NULL)        \
                   4971:                fpu_state = FPU_STATE_IDLE;     \
                   4972: } while (0)
                   4973: 
                   4974: // %1111_001000_nnnnnn .......... -34  FPGEN
                   4975: OP_DEF(fpgen)
                   4976: {
                   4977:        if (GetFPUType().IsNoFPU()) {
                   4978:                op_illegal();
                   4979:                return;
                   4980:        }
                   4981: 
                   4982:        INIT_FE();
                   4983:        SET_IDLE();
                   4984: 
                   4985:        ir2 = fetch_2();
                   4986:        switch (ir2 >> 13) {
                   4987:         case 0:
                   4988:                fpu_op_fgen_reg();
                   4989:                break;
                   4990:         case 1:
                   4991:                fpu_op_illg();
                   4992:                break;
                   4993:         case 2:
                   4994:                fpu_op_fgen_mem();
                   4995:                break;
                   4996:         case 3:
                   4997:                fpu_op_fmove_to_mem();
                   4998:                break;
                   4999:         case 4:
                   5000:                fpu_op_fmovem_ea2ctl();
                   5001:                break;
                   5002:         case 5:
                   5003:                fpu_op_fmovem_ctl2ea();
                   5004:                break;
                   5005:         case 6:
                   5006:                fpu_op_fmovem_ea2reg();
                   5007:                break;
                   5008:         case 7:
                   5009:                fpu_op_fmovem_reg2ea();
                   5010:                break;
                   5011:        }
                   5012: }
                   5013: 
                   5014: // %1111_001001_mmmrrr d.m+-rxw.. -34  FScc.B <ea>
                   5015: // %1111_001001_001yyy .......... -34  FDBcc Dy,<label>
                   5016: // %1111_001001_111010 .......... -34  FTRAPcc.W #<imm>
                   5017: // %1111_001001_111011 .......... -34  FTRAPcc.L #<imm>
                   5018: // %1111_001001_111100 .......... -34  FTRAPcc
                   5019: OP_DEF(fxcc)
                   5020: {
                   5021:        if (GetFPUType().IsNoFPU()) {
                   5022:                op_illegal();
                   5023:                return;
                   5024:        }
                   5025: 
                   5026:        if ((ir & 077) >= 075) {
                   5027:                op_illegal();
                   5028:                return;
                   5029:        }
                   5030: 
                   5031:        INIT_FE();
                   5032:        if (GetFPUType().Is6888x()) {
                   5033:                SET_IDLE();
                   5034:        }
                   5035: 
                   5036:        // ここまで来ると共通で ir2 に cc が来る。
                   5037:        ir2 = fetch_2();
                   5038:        switch (ir & 077) {
                   5039:         case 010 ... 017:      // FDBcc
                   5040:                fpu_op_fdbcc();
                   5041:                break;
                   5042:         case 000 ... 007:      // FScc
                   5043:         case 020 ... 027:
                   5044:         case 030 ... 037:
                   5045:         case 040 ... 047:
                   5046:         case 050 ... 057:
                   5047:         case 060 ... 067:
                   5048:         case 070 ... 071:
                   5049:                fpu_op_fscc();
                   5050:                break;
                   5051:         case 072:                      // FTRAPcc.W
                   5052:                fpu_op_ftrapcc_w();
                   5053:                break;
                   5054:         case 073:                      // FTRAPcc.L
                   5055:                fpu_op_ftrapcc_l();
                   5056:                break;
                   5057:         case 074:                      // FTRAPcc
                   5058:                fpu_op_ftrapcc();
                   5059:                break;
                   5060:         default:
                   5061:                __unreachable();
                   5062:        }
                   5063: }
                   5064: 
                   5065: // %1111_001010_nnnnnn .......... -34  FBcc.W <label>
                   5066: OP_DEF(fbcc_w)
                   5067: {
                   5068:        if (GetFPUType().IsNoFPU()) {
                   5069:                op_illegal();
                   5070:                return;
                   5071:        }
                   5072: 
                   5073:        INIT_FE();
                   5074:        if (GetFPUType().Is6888x()) {
                   5075:                SET_IDLE();
                   5076:        }
                   5077: 
                   5078:        fpu_op_fbcc_w();
                   5079: }
                   5080: 
                   5081: // %1111_001011_nnnnnn .......... -34  FBcc.L <label>
                   5082: OP_DEF(fbcc_l)
                   5083: {
                   5084:        if (GetFPUType().IsNoFPU()) {
                   5085:                op_illegal();
                   5086:                return;
                   5087:        }
                   5088: 
                   5089:        INIT_FE();
                   5090:        if (GetFPUType().Is6888x()) {
                   5091:                SET_IDLE();
                   5092:        }
                   5093: 
                   5094:        fpu_op_fbcc_l();
                   5095: }
                   5096: 
                   5097: // %1111_001100_mmmrrr ..m.-rxw.. -34  FSAVE <ea>
                   5098: OP_DEF(fsave)
                   5099: {
                   5100:        if (GetFPUType().IsNoFPU()) {
                   5101:                op_illegal();
                   5102:                return;
                   5103:        }
                   5104: 
                   5105:        SUPERVISOR_OP;
                   5106: 
                   5107:        fpu_op_fsave();
                   5108: }
                   5109: 
                   5110: // %1111_001101_mmmrrr ..m+.rxw.. -34  FRESTORE <ea>
                   5111: OP_DEF(frestore)
                   5112: {
                   5113:        if (GetFPUType().IsNoFPU()) {
                   5114:                op_illegal();
                   5115:                return;
                   5116:        }
                   5117: 
                   5118:        SUPERVISOR_OP;
                   5119: 
                   5120:        fpu_op_frestore();
                   5121: }
                   5122: 
                   5123: // %1111_0100nn_001yyy .......... --4  CINVL <caches>,(Ay)
                   5124: // %1111_0100nn_010yyy .......... --4  CINVP <caches>,(Ay)
                   5125: // %1111_0100nn_011000 .......... --4  CINVA <caches>
                   5126: // %1111_0100nn_101yyy .......... --4  CPUSHL <caches>,(Ay)
                   5127: // %1111_0100nn_110yyy .......... --4  CPUSHP <caches>,(Ay)
                   5128: // %1111_0100nn_111000 .......... --4  CPUSHA <caches>
                   5129: OP_DEF(cinv)
                   5130: {
                   5131:        if (mpu_type != m680x0MPUType::M68040) {
                   5132:                op_illegal();
                   5133:                return;
                   5134:        }
                   5135: //     putlog(1, "cinv*/cpush* (NOT IMPLEMENTED)");
                   5136: }
                   5137: 
                   5138: // %1111_010100_mmmrrr ..m.-rxw.. 23-  cpSAVE
                   5139: // %1111_010100_000yyy .......... --4  PFLUSHN (Ay)
                   5140: // %1111_010100_001yyy .......... --4  PFLUSH (Ay)
                   5141: // %1111_010100_010000 .......... --4  PFLUSHAN
                   5142: // %1111_010100_011000 .......... --4  PFLUSHA
                   5143: OP_DEF(pflush)
                   5144: {
                   5145:        // CPU ごとの virtual 関数になっている。
                   5146:        ops_mmu40_pflush();
                   5147: }
                   5148: 
                   5149: // 68030 では 68040 MMU 命令の位置は全部 cpSAVE。
                   5150: void
                   5151: MPU68030Device::ops_mmu40_pflush()
                   5152: {
                   5153:        op_cpsave();
                   5154: }
                   5155: 
                   5156: // 68040 MMU 命令。
                   5157: void
                   5158: MPU68040Device::ops_mmu40_pflush()
                   5159: {
                   5160:        SUPERVISOR_OP;
                   5161: 
                   5162:        // DFC は 1,2,5,6 の場合のみ有効で、0,3,4,7 なら動作不定。
                   5163:        // 68000PRM.pdf, p6-35。
                   5164:        // ここでは FC2 だけで判定する。
                   5165: 
                   5166:        switch (ir & 077) {
                   5167:         case 000 ... 007:      // PFLUSHN (Ay)
                   5168:         {
                   5169:                busaddr addr = busaddr(RegAY) | reg.dfc;
                   5170:                atc_inst->Flush(addr, false);
                   5171:                atc_data->Flush(addr, false);
                   5172:                break;
                   5173:         }
                   5174: 
                   5175:         case 010 ... 017:      // PFLUSH (Ay)
                   5176:         {
                   5177:                busaddr addr = busaddr(RegAY) | reg.dfc;
                   5178:                atc_inst->Flush(addr, true);
                   5179:                atc_data->Flush(addr, true);
                   5180:                break;
                   5181:         }
                   5182: 
                   5183:         case 020:                      // PFLUSHAN
                   5184:         {
                   5185:                bool s = reg.dfc.IsSuper();
                   5186:                atc_inst->Flush(s, false);
                   5187:                atc_data->Flush(s, false);
                   5188:                break;
                   5189:         }
                   5190: 
                   5191:         case 030:                      // PFLUSHA
                   5192:         {
                   5193:                bool s = reg.dfc.IsSuper();
                   5194:                atc_inst->Flush(s, true);
                   5195:                atc_data->Flush(s, true);
                   5196:                break;
                   5197:         }
                   5198: 
                   5199:         default:
                   5200:                op_illegal();
                   5201:                return;
                   5202:        }
                   5203: }
                   5204: 
                   5205: // %1111_010101_mmmrrr ..m+.rxwp. 23-  cpRESTORE
                   5206: // %1111_010101_001yyy .......... --4  PTESTW (Ay)
                   5207: // %1111_010101_101yyy .......... --4  PTESTR (Ay)
                   5208: OP_DEF(ptest)
                   5209: {
                   5210:        if (mpu_type != m680x0MPUType::M68040) {
                   5211:                op_cprestore();
                   5212:                return;
                   5213:        }
                   5214:        OP_FUNC(unimpl);
                   5215: }
                   5216: 
                   5217: // %1111_011000_000yyy .......... --4  MOVE16 (Ay)+,xxx.L
                   5218: // %1111_011000_001yyy .......... --4  MOVE16 xxx.L,(Ay)+
                   5219: // %1111_011000_010yyy .......... --4  MOVE16 (Ay),xxx.L
                   5220: // %1111_011000_011yyy .......... --4  MOVE16 xxx.L,(Ay)
                   5221: // %1111_011000_100yyy .......... --4  MOVE16 (Ay)+,(An)+
                   5222: OP_DEF(move16)
                   5223: {
                   5224:        if (mpu_type != m680x0MPUType::M68040) {
                   5225:                op_illegal();
                   5226:                return;
                   5227:        }
                   5228:        OP_FUNC(unimpl);
                   5229: }
                   5230: 
                   5231: // %1111_011100_mmmrrr ..m.-rxw.. 23-  cpSAVE
                   5232: // %1111_100100_mmmrrr ..m.-rxw.. 23-  cpSAVE
                   5233: // %1111_101100_mmmrrr ..m.-rxw.. 23-  cpSAVE
                   5234: // %1111_110100_mmmrrr ..m.-rxw.. 23-  cpSAVE
                   5235: // %1111_111100_mmmrrr ..m.-rxw.. 23-  cpSAVE
                   5236: OP_DEF(cpsave)
                   5237: {
                   5238:        // 020/030 では、(第1ワードが?) 有効な命令パターンの場合
                   5239:        // まず特権チェックを行う。
                   5240:        // cpSAVE の場合先に CIR で問い合わせて、その後 EA を評価すると書いて
                   5241:        // あるように読める (68020 本 p.104) ので、コプロセッサがいない場合は
                   5242:        // EA は評価しなさそう。
                   5243:        // -(An) はコプロセッサがいなければ変化しないような気がする。
                   5244:        // EA のパターンが無効なら F ライン例外になる。
                   5245:        // cpID=6,7 はユーザ用とあるが cpSAVE は影響を受けるかどうか。
                   5246:        // 040 ではコプロセッサプロトコル自体ないので全部 F ライン例外になる?
                   5247:        //
                   5248:        // ただし、Human68k モードではその特権判定よりも先んじて不当命令に
                   5249:        // ならなければいけない。
                   5250:        // Human68k モードでは F ライン命令は例外を起こすのではなく、命令内部で
                   5251:        // 直接ホストのコールバックを実行しているため、ゲスト側の特権違反ハンドラ
                   5252:        // に来たものを F ライン例外へ回すというような処理は出来ないため。
                   5253:        if (fline_callback == NULL && mpu_type == m680x0MPUType::M68030) {
                   5254:                switch (ir & 077) {
                   5255:                 case 020 ... 027:      // m:(An)
                   5256:                 case 040 ... 047:      // -:-(An)
                   5257:                 case 050 ... 057:      // r:d16(An)
                   5258:                 case 060 ... 067:      // x:d8(An,IX)
                   5259:                 case 070 ... 071:      // w:Abs
                   5260:                        SUPERVISOR_OP;
                   5261:                        // コプロセッサがいないので EA をフェッチせず終了のはず。
                   5262:                        break;
                   5263:                 default:
                   5264:                        break;
                   5265:                }
                   5266:        }
                   5267:        op_illegal();
                   5268: }
                   5269: 
                   5270: // %1111_011101_mmmrrr ..m+.rxwp. 23-  cpRESTORE
                   5271: // %1111_100101_mmmrrr ..m+.rxwp. 23-  cpRESTORE
                   5272: // %1111_101101_mmmrrr ..m+.rxwp. 23-  cpRESTORE
                   5273: // %1111_110101_mmmrrr ..m+.rxwp. 23-  cpRESTORE
                   5274: // %1111_111101_mmmrrr ..m+.rxwp. 23-  cpRESTORE
                   5275: OP_DEF(cprestore)
                   5276: {
                   5277:        // すぐ上の cpsave 内のコメント参照。
                   5278:        // cpRESTORE の場合先に1ロングワード読んでみて、その後コプロセッサに
                   5279:        // 通信するので、コプロセッサがいなくても読み込みは発生する。
                   5280:        // See XEiJ/misc/flinebuserror.x
                   5281:        if (fline_callback == NULL && mpu_type == m680x0MPUType::M68030) {
                   5282:                switch (ir & 077) {
                   5283:                 case 020 ... 027:      // m:(An)
                   5284:                 case 030 ... 037:      // +:(An)+
                   5285:                 case 050 ... 057:      // r:d16(An)
                   5286:                 case 060 ... 067:      // x:d8(An,IX)
                   5287:                 case 070 ... 071:      // w:Abs
                   5288:                 case 072 ... 073:      // p:d8(PC,IX)
                   5289:                 {
                   5290:                        SUPERVISOR_OP;
                   5291:                        uint32 ea = cea_fpu(4);
                   5292:                        read_4(ea);
                   5293:                        break;
                   5294:                 }
                   5295:                 default:
                   5296:                        break;
                   5297:                }
                   5298:        }
                   5299:        op_illegal();
                   5300: }
                   5301: 
                   5302: // illegal (or not-assigned) instructions
                   5303: OP_DEF(illegal)
                   5304: {
                   5305:        // ILLEGAL 命令と F ライン命令と不当命令パターンがすべてここに来る。
                   5306:        // catch 内からも呼ばれるので、ここで C++ の例外をスローしてはいけない。
                   5307: 
                   5308:        CYCLE2(18, 20);
                   5309: 
                   5310:        if ((ir & 0xf000) == 0xf000) {
                   5311:                // F系列命令
                   5312: 
                   5313:                if (fline_callback) {
                   5314:                        if (fline_callback(this, fline_arg)) {
                   5315:                                return;
                   5316:                        }
                   5317:                }
                   5318:                Exception(M68K::EXCEP_FLINE);
                   5319:        } else {
                   5320:                // 不当命令
                   5321:                Exception(M68K::EXCEP_ILLEGAL);
                   5322:        }
                   5323: }

unix.superglobalmegacorp.com

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