Annotation of nono/m680x0/m68030ops.cpp, revision 1.1.1.4

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

unix.superglobalmegacorp.com

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