MC68010.java
     1: //========================================================================================
     2: //  MC68000.java
     3: //    en:MC68010 core
     4: //    ja:MC68010コア
     5: //  Copyright (C) 2003-2025 Makoto Kamada
     6: //
     7: //  This file is part of the XEiJ (X68000 Emulator in Java).
     8: //  You can use, modify and redistribute the XEiJ if the conditions are met.
     9: //  Read the XEiJ License for more details.
    10: //  https://stdkmd.net/xeij/
    11: //========================================================================================
    12: 
    13: package xeij;
    14: 
    15: import java.lang.*;  //Boolean,Character,Class,Comparable,Double,Exception,Float,IllegalArgumentException,Integer,Long,Math,Number,Object,Runnable,SecurityException,String,StringBuilder,System
    16: 
    17: public class MC68010 {
    18: 
    19:   public static void mpuCore () {
    20: 
    21:     //例外ループ
    22:     //  別のメソッドで検出された例外を命令ループの外側でcatchすることで命令ループを高速化する
    23:   errorLoop:
    24:     while (XEiJ.mpuClockTime < XEiJ.mpuClockLimit) {
    25:       try {
    26:         //命令ループ
    27:         while (XEiJ.mpuClockTime < XEiJ.mpuClockLimit) {
    28:           int t;
    29:           //命令を実行する
    30:           XEiJ.mpuTraceFlag = XEiJ.regSRT1;  //命令実行前のsrT1
    31:           XEiJ.mpuCycleCount = 0;  //第1オペコードからROMのアクセスウエイトを有効にする。命令のサイクル数はすべてXEiJ.mpuCycleCount+=~で加えること
    32:           XEiJ.regPC0 = t = XEiJ.regPC;  //命令の先頭アドレス
    33:           XEiJ.regPC = t + 2;
    34:           XEiJ.regOC = (InstructionBreakPoint.IBP_ON ? InstructionBreakPoint.ibpOp1MemoryMap : DataBreakPoint.DBP_ON ? XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap : XEiJ.busMemoryMap)[t >>> XEiJ.BUS_PAGE_BITS].mmdRwz (t);  //第1オペコード。必ずゼロ拡張すること。pcに奇数が入っていることはないのでアドレスエラーのチェックを省略する
    35: 
    36:           //命令の処理
    37:           //  第1オペコードの上位10bitで分岐する
    38:           //  分岐方法
    39:           //    XEiJ.IRP_STATIC
    40:           //      手順
    41:           //        命令の処理をstaticメソッドに書く
    42:           //        switch(XEiJ.regOC>>>6)で分岐してirpXXX()で呼び出す
    43:           //          Javaはメソッドのサイズに制限があるためswitch(XEiJ.regOC>>>6)の中にすべての命令の処理を書くことができない
    44:           //          C言語のときはswitchの中にすべての命令の処理を書くことができる
    45:           //      利点
    46:           //        速い
    47:           //    XEiJ.IRP_ENUM_DIRECT
    48:           //      手順
    49:           //        命令の処理をenum bodyのメソッドに書く
    50:           //        switch(XEiJ.regOC>>>6)で分岐してIRP.XXX.exec()で呼び出す
    51:           //      欠点
    52:           //        XEiJ.IRP_STATICよりも遅い
    53:           //          staticなメソッドを直接呼び出せることに変わりないはずだが、インライン展開などの最適化が弱くなるのかも知れない
    54:           //        XEiJ.IRP_STATICと共存させようとすると命令の処理を2回書かなければならず管理が面倒になる
    55:           //    XEiJ.IRP_ENUM_INDIRECT
    56:           //      手順
    57:           //        命令の処理をenum bodyのメソッドに書く
    58:           //        XEiJ.regOCの上位10bit→enum値の配列を用意する
    59:           //        IRPMAP.IRPMAP0[XEiJ.regOC>>>6].exec()で呼び出す
    60:           //          C言語のときは関数を指すポインタの配列が使えるのでIRPMAP0[XEiJ.regOC>>>6]()で済む
    61:           //      利点
    62:           //        命令の処理を動的に組み替えることができる
    63:           //      欠点
    64:           //        XEiJ.IRP_ENUM_DIRECTよりも遅い
    65:           //          配列参照による多分岐とenum bodyのメソッドの動的呼び出しによる多分岐の2段階になる
    66:           //        XEiJ.IRP_STATICと共存させようとすると命令の処理を2回書かなければならず管理が面倒になる
    67:           //        enum値の配列の初期化コードが大きくなるのでクラスを分ける必要がある
    68:         irpSwitch:
    69:           switch (XEiJ.regOC >>> 6) {  //第1オペコードの上位10ビット。XEiJ.regOCはゼロ拡張されているので0b1111_111_111&を省略
    70: 
    71:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
    72:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
    73:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
    74:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
    75:             //ORI.B #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_000_mmm_rrr-{data}
    76:             //OR.B #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_000_mmm_rrr-{data}  [ORI.B #<data>,<ea>]
    77:             //ORI.B #<data>,CCR                               |-|012346|-|*****|*****|          |0000_000_000_111_100-{data}
    78:           case 0b0000_000_000:
    79:             irpOriByte ();
    80:             break irpSwitch;
    81: 
    82:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
    83:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
    84:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
    85:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
    86:             //ORI.W #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_001_mmm_rrr-{data}
    87:             //OR.W #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_001_mmm_rrr-{data}  [ORI.W #<data>,<ea>]
    88:             //ORI.W #<data>,SR                                |-|012346|P|*****|*****|          |0000_000_001_111_100-{data}
    89:           case 0b0000_000_001:
    90:             irpOriWord ();
    91:             break irpSwitch;
    92: 
    93:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
    94:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
    95:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
    96:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
    97:             //ORI.L #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_010_mmm_rrr-{data}
    98:             //OR.L #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_010_mmm_rrr-{data}  [ORI.L #<data>,<ea>]
    99:           case 0b0000_000_010:
   100:             irpOriLong ();
   101:             break irpSwitch;
   102: 
   103:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   104:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   105:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   106:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   107:             //BITREV.L Dr                                     |-|------|-|-----|-----|D         |0000_000_011_000_rrr (ISA_C)
   108:           case 0b0000_000_011:
   109:             irpCmp2Chk2Byte ();
   110:             break irpSwitch;
   111: 
   112:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   113:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   114:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   115:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   116:             //BTST.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_100_000_rrr
   117:             //MOVEP.W (d16,Ar),Dq                             |-|01234S|-|-----|-----|          |0000_qqq_100_001_rrr-{data}
   118:             //BTST.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZPI|0000_qqq_100_mmm_rrr
   119:           case 0b0000_000_100:
   120:           case 0b0000_001_100:
   121:           case 0b0000_010_100:
   122:           case 0b0000_011_100:
   123:           case 0b0000_100_100:
   124:           case 0b0000_101_100:
   125:           case 0b0000_110_100:
   126:           case 0b0000_111_100:
   127:             irpBtstReg ();
   128:             break irpSwitch;
   129: 
   130:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   131:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   132:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   133:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   134:             //BCHG.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_101_000_rrr
   135:             //MOVEP.L (d16,Ar),Dq                             |-|01234S|-|-----|-----|          |0000_qqq_101_001_rrr-{data}
   136:             //BCHG.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_101_mmm_rrr
   137:           case 0b0000_000_101:
   138:           case 0b0000_001_101:
   139:           case 0b0000_010_101:
   140:           case 0b0000_011_101:
   141:           case 0b0000_100_101:
   142:           case 0b0000_101_101:
   143:           case 0b0000_110_101:
   144:           case 0b0000_111_101:
   145:             irpBchgReg ();
   146:             break irpSwitch;
   147: 
   148:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   149:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   150:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   151:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   152:             //BCLR.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_110_000_rrr
   153:             //MOVEP.W Dq,(d16,Ar)                             |-|01234S|-|-----|-----|          |0000_qqq_110_001_rrr-{data}
   154:             //BCLR.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_110_mmm_rrr
   155:           case 0b0000_000_110:
   156:           case 0b0000_001_110:
   157:           case 0b0000_010_110:
   158:           case 0b0000_011_110:
   159:           case 0b0000_100_110:
   160:           case 0b0000_101_110:
   161:           case 0b0000_110_110:
   162:           case 0b0000_111_110:
   163:             irpBclrReg ();
   164:             break irpSwitch;
   165: 
   166:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   167:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   168:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   169:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   170:             //BSET.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_111_000_rrr
   171:             //MOVEP.L Dq,(d16,Ar)                             |-|01234S|-|-----|-----|          |0000_qqq_111_001_rrr-{data}
   172:             //BSET.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_111_mmm_rrr
   173:           case 0b0000_000_111:
   174:           case 0b0000_001_111:
   175:           case 0b0000_010_111:
   176:           case 0b0000_011_111:
   177:           case 0b0000_100_111:
   178:           case 0b0000_101_111:
   179:           case 0b0000_110_111:
   180:           case 0b0000_111_111:
   181:             irpBsetReg ();
   182:             break irpSwitch;
   183: 
   184:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   185:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   186:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   187:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   188:             //ANDI.B #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_000_mmm_rrr-{data}
   189:             //AND.B #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_000_mmm_rrr-{data}  [ANDI.B #<data>,<ea>]
   190:             //ANDI.B #<data>,CCR                              |-|012346|-|*****|*****|          |0000_001_000_111_100-{data}
   191:           case 0b0000_001_000:
   192:             irpAndiByte ();
   193:             break irpSwitch;
   194: 
   195:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   196:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   197:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   198:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   199:             //ANDI.W #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_001_mmm_rrr-{data}
   200:             //AND.W #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_001_mmm_rrr-{data}  [ANDI.W #<data>,<ea>]
   201:             //ANDI.W #<data>,SR                               |-|012346|P|*****|*****|          |0000_001_001_111_100-{data}
   202:           case 0b0000_001_001:
   203:             irpAndiWord ();
   204:             break irpSwitch;
   205: 
   206:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   207:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   208:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   209:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   210:             //ANDI.L #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_010_mmm_rrr-{data}
   211:             //AND.L #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_010_mmm_rrr-{data}  [ANDI.L #<data>,<ea>]
   212:           case 0b0000_001_010:
   213:             irpAndiLong ();
   214:             break irpSwitch;
   215: 
   216:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   217:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   218:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   219:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   220:             //BYTEREV.L Dr                                    |-|------|-|-----|-----|D         |0000_001_011_000_rrr (ISA_C)
   221:           case 0b0000_001_011:
   222:             irpCmp2Chk2Word ();
   223:             break irpSwitch;
   224: 
   225:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   226:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   227:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   228:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   229:             //SUBI.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_000_mmm_rrr-{data}
   230:             //SUB.B #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_000_mmm_rrr-{data}  [SUBI.B #<data>,<ea>]
   231:           case 0b0000_010_000:
   232:             irpSubiByte ();
   233:             break irpSwitch;
   234: 
   235:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   236:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   237:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   238:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   239:             //SUBI.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_001_mmm_rrr-{data}
   240:             //SUB.W #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_001_mmm_rrr-{data}  [SUBI.W #<data>,<ea>]
   241:           case 0b0000_010_001:
   242:             irpSubiWord ();
   243:             break irpSwitch;
   244: 
   245:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   246:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   247:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   248:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   249:             //SUBI.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_010_mmm_rrr-{data}
   250:             //SUB.L #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_010_mmm_rrr-{data}  [SUBI.L #<data>,<ea>]
   251:           case 0b0000_010_010:
   252:             irpSubiLong ();
   253:             break irpSwitch;
   254: 
   255:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   256:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   257:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   258:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   259:             //FF1.L Dr                                        |-|------|-|-UUUU|-**00|D         |0000_010_011_000_rrr (ISA_C)
   260:           case 0b0000_010_011:
   261:             irpCmp2Chk2Long ();
   262:             break irpSwitch;
   263: 
   264:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   265:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   266:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   267:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   268:             //ADDI.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_000_mmm_rrr-{data}
   269:           case 0b0000_011_000:
   270:             irpAddiByte ();
   271:             break irpSwitch;
   272: 
   273:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   274:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   275:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   276:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   277:             //ADDI.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_001_mmm_rrr-{data}
   278:           case 0b0000_011_001:
   279:             irpAddiWord ();
   280:             break irpSwitch;
   281: 
   282:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   283:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   284:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   285:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   286:             //ADDI.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_010_mmm_rrr-{data}
   287:           case 0b0000_011_010:
   288:             irpAddiLong ();
   289:             break irpSwitch;
   290: 
   291:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   292:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   293:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   294:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   295:             //BTST.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_000_000_rrr-{data}
   296:             //BTST.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZP |0000_100_000_mmm_rrr-{data}
   297:           case 0b0000_100_000:
   298:             irpBtstImm ();
   299:             break irpSwitch;
   300: 
   301:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   302:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   303:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   304:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   305:             //BCHG.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_001_000_rrr-{data}
   306:             //BCHG.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_001_mmm_rrr-{data}
   307:           case 0b0000_100_001:
   308:             irpBchgImm ();
   309:             break irpSwitch;
   310: 
   311:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   312:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   313:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   314:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   315:             //BCLR.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_010_000_rrr-{data}
   316:             //BCLR.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_010_mmm_rrr-{data}
   317:           case 0b0000_100_010:
   318:             irpBclrImm ();
   319:             break irpSwitch;
   320: 
   321:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   322:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   323:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   324:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   325:             //BSET.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_011_000_rrr-{data}
   326:             //BSET.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_011_mmm_rrr-{data}
   327:           case 0b0000_100_011:
   328:             irpBsetImm ();
   329:             break irpSwitch;
   330: 
   331:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   332:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   333:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   334:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   335:             //EORI.B #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_000_mmm_rrr-{data}
   336:             //EOR.B #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_000_mmm_rrr-{data}  [EORI.B #<data>,<ea>]
   337:             //EORI.B #<data>,CCR                              |-|012346|-|*****|*****|          |0000_101_000_111_100-{data}
   338:           case 0b0000_101_000:
   339:             irpEoriByte ();
   340:             break irpSwitch;
   341: 
   342:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   343:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   344:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   345:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   346:             //EORI.W #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_001_mmm_rrr-{data}
   347:             //EOR.W #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_001_mmm_rrr-{data}  [EORI.W #<data>,<ea>]
   348:             //EORI.W #<data>,SR                               |-|012346|P|*****|*****|          |0000_101_001_111_100-{data}
   349:           case 0b0000_101_001:
   350:             irpEoriWord ();
   351:             break irpSwitch;
   352: 
   353:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   354:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   355:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   356:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   357:             //EORI.L #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_010_mmm_rrr-{data}
   358:             //EOR.L #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_010_mmm_rrr-{data}  [EORI.L #<data>,<ea>]
   359:           case 0b0000_101_010:
   360:             irpEoriLong ();
   361:             break irpSwitch;
   362: 
   363:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   364:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   365:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   366:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   367:             //CMPI.B #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_000_mmm_rrr-{data}
   368:             //CMP.B #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_000_mmm_rrr-{data}  [CMPI.B #<data>,<ea>]
   369:           case 0b0000_110_000:
   370:             irpCmpiByte ();
   371:             break irpSwitch;
   372: 
   373:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   374:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   375:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   376:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   377:             //CMPI.W #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_001_mmm_rrr-{data}
   378:             //CMP.W #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_001_mmm_rrr-{data}  [CMPI.W #<data>,<ea>]
   379:           case 0b0000_110_001:
   380:             irpCmpiWord ();
   381:             break irpSwitch;
   382: 
   383:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   384:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   385:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   386:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   387:             //CMPI.L #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_010_mmm_rrr-{data}
   388:             //CMP.L #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_010_mmm_rrr-{data}  [CMPI.L #<data>,<ea>]
   389:           case 0b0000_110_010:
   390:             irpCmpiLong ();
   391:             break irpSwitch;
   392: 
   393:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   394:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   395:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   396:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   397:             //MOVES.B <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_000_mmm_rrr-rnnn000000000000
   398:             //MOVES.B Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_000_mmm_rrr-rnnn100000000000
   399:           case 0b0000_111_000:
   400:             irpMovesByte ();
   401:             break irpSwitch;
   402: 
   403:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   404:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   405:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   406:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   407:             //MOVES.W <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_001_mmm_rrr-rnnn000000000000
   408:             //MOVES.W Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_001_mmm_rrr-rnnn100000000000
   409:           case 0b0000_111_001:
   410:             irpMovesWord ();
   411:             break irpSwitch;
   412: 
   413:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   414:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   415:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   416:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   417:             //MOVES.L <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_010_mmm_rrr-rnnn000000000000
   418:             //MOVES.L Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_010_mmm_rrr-rnnn100000000000
   419:           case 0b0000_111_010:
   420:             irpMovesLong ();
   421:             break irpSwitch;
   422: 
   423:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   424:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   425:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   426:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   427:             //MOVE.B <ea>,Dq                                  |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr
   428:           case 0b0001_000_000:
   429:           case 0b0001_001_000:
   430:           case 0b0001_010_000:
   431:           case 0b0001_011_000:
   432:           case 0b0001_100_000:
   433:           case 0b0001_101_000:
   434:           case 0b0001_110_000:
   435:           case 0b0001_111_000:
   436:             irpMoveToDRByte ();
   437:             break irpSwitch;
   438: 
   439:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   440:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   441:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   442:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   443:             //MOVE.B <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr
   444:           case 0b0001_000_010:
   445:           case 0b0001_001_010:
   446:           case 0b0001_010_010:
   447:           case 0b0001_011_010:
   448:           case 0b0001_100_010:
   449:           case 0b0001_101_010:
   450:           case 0b0001_110_010:
   451:           case 0b0001_111_010:
   452:             irpMoveToMMByte ();
   453:             break irpSwitch;
   454: 
   455:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   456:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   457:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   458:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   459:             //MOVE.B <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr
   460:           case 0b0001_000_011:
   461:           case 0b0001_001_011:
   462:           case 0b0001_010_011:
   463:           case 0b0001_011_011:
   464:           case 0b0001_100_011:
   465:           case 0b0001_101_011:
   466:           case 0b0001_110_011:
   467:           case 0b0001_111_011:
   468:             irpMoveToMPByte ();
   469:             break irpSwitch;
   470: 
   471:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   472:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   473:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   474:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   475:             //MOVE.B <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr
   476:           case 0b0001_000_100:
   477:           case 0b0001_001_100:
   478:           case 0b0001_010_100:
   479:           case 0b0001_011_100:
   480:           case 0b0001_100_100:
   481:           case 0b0001_101_100:
   482:           case 0b0001_110_100:
   483:           case 0b0001_111_100:
   484:             irpMoveToMNByte ();
   485:             break irpSwitch;
   486: 
   487:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   488:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   489:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   490:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   491:             //MOVE.B <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr
   492:           case 0b0001_000_101:
   493:           case 0b0001_001_101:
   494:           case 0b0001_010_101:
   495:           case 0b0001_011_101:
   496:           case 0b0001_100_101:
   497:           case 0b0001_101_101:
   498:           case 0b0001_110_101:
   499:           case 0b0001_111_101:
   500:             irpMoveToMWByte ();
   501:             break irpSwitch;
   502: 
   503:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   504:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   505:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   506:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   507:             //MOVE.B <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr
   508:           case 0b0001_000_110:
   509:           case 0b0001_001_110:
   510:           case 0b0001_010_110:
   511:           case 0b0001_011_110:
   512:           case 0b0001_100_110:
   513:           case 0b0001_101_110:
   514:           case 0b0001_110_110:
   515:           case 0b0001_111_110:
   516:             irpMoveToMXByte ();
   517:             break irpSwitch;
   518: 
   519:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   520:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   521:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   522:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   523:             //MOVE.B <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr
   524:           case 0b0001_000_111:
   525:             irpMoveToZWByte ();
   526:             break irpSwitch;
   527: 
   528:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   529:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   530:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   531:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   532:             //MOVE.B <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr
   533:           case 0b0001_001_111:
   534:             irpMoveToZLByte ();
   535:             break irpSwitch;
   536: 
   537:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   538:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   539:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   540:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   541:             //MOVE.L <ea>,Dq                                  |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr
   542:           case 0b0010_000_000:
   543:           case 0b0010_001_000:
   544:           case 0b0010_010_000:
   545:           case 0b0010_011_000:
   546:           case 0b0010_100_000:
   547:           case 0b0010_101_000:
   548:           case 0b0010_110_000:
   549:           case 0b0010_111_000:
   550:             irpMoveToDRLong ();
   551:             break irpSwitch;
   552: 
   553:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   554:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   555:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   556:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   557:             //MOVEA.L <ea>,Aq                                 |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr
   558:             //MOVE.L <ea>,Aq                                  |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq]
   559:           case 0b0010_000_001:
   560:           case 0b0010_001_001:
   561:           case 0b0010_010_001:
   562:           case 0b0010_011_001:
   563:           case 0b0010_100_001:
   564:           case 0b0010_101_001:
   565:           case 0b0010_110_001:
   566:           case 0b0010_111_001:
   567:             irpMoveaLong ();
   568:             break irpSwitch;
   569: 
   570:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   571:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   572:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   573:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   574:             //MOVE.L <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr
   575:           case 0b0010_000_010:
   576:           case 0b0010_001_010:
   577:           case 0b0010_010_010:
   578:           case 0b0010_011_010:
   579:           case 0b0010_100_010:
   580:           case 0b0010_101_010:
   581:           case 0b0010_110_010:
   582:           case 0b0010_111_010:
   583:             irpMoveToMMLong ();
   584:             break irpSwitch;
   585: 
   586:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   587:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   588:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   589:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   590:             //MOVE.L <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr
   591:           case 0b0010_000_011:
   592:           case 0b0010_001_011:
   593:           case 0b0010_010_011:
   594:           case 0b0010_011_011:
   595:           case 0b0010_100_011:
   596:           case 0b0010_101_011:
   597:           case 0b0010_110_011:
   598:           case 0b0010_111_011:
   599:             irpMoveToMPLong ();
   600:             break irpSwitch;
   601: 
   602:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   603:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   604:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   605:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   606:             //MOVE.L <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr
   607:           case 0b0010_000_100:
   608:           case 0b0010_001_100:
   609:           case 0b0010_010_100:
   610:           case 0b0010_011_100:
   611:           case 0b0010_100_100:
   612:           case 0b0010_101_100:
   613:           case 0b0010_110_100:
   614:           case 0b0010_111_100:
   615:             irpMoveToMNLong ();
   616:             break irpSwitch;
   617: 
   618:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   619:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   620:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   621:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   622:             //MOVE.L <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr
   623:           case 0b0010_000_101:
   624:           case 0b0010_001_101:
   625:           case 0b0010_010_101:
   626:           case 0b0010_011_101:
   627:           case 0b0010_100_101:
   628:           case 0b0010_101_101:
   629:           case 0b0010_110_101:
   630:           case 0b0010_111_101:
   631:             irpMoveToMWLong ();
   632:             break irpSwitch;
   633: 
   634:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   635:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   636:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   637:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   638:             //MOVE.L <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr
   639:           case 0b0010_000_110:
   640:           case 0b0010_001_110:
   641:           case 0b0010_010_110:
   642:           case 0b0010_011_110:
   643:           case 0b0010_100_110:
   644:           case 0b0010_101_110:
   645:           case 0b0010_110_110:
   646:           case 0b0010_111_110:
   647:             irpMoveToMXLong ();
   648:             break irpSwitch;
   649: 
   650:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   651:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   652:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   653:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   654:             //MOVE.L <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr
   655:           case 0b0010_000_111:
   656:             irpMoveToZWLong ();
   657:             break irpSwitch;
   658: 
   659:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   660:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   661:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   662:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   663:             //MOVE.L <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr
   664:           case 0b0010_001_111:
   665:             irpMoveToZLLong ();
   666:             break irpSwitch;
   667: 
   668:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   669:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   670:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   671:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   672:             //MOVE.W <ea>,Dq                                  |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr
   673:           case 0b0011_000_000:
   674:           case 0b0011_001_000:
   675:           case 0b0011_010_000:
   676:           case 0b0011_011_000:
   677:           case 0b0011_100_000:
   678:           case 0b0011_101_000:
   679:           case 0b0011_110_000:
   680:           case 0b0011_111_000:
   681:             irpMoveToDRWord ();
   682:             break irpSwitch;
   683: 
   684:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   685:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   686:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   687:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   688:             //MOVEA.W <ea>,Aq                                 |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr
   689:             //MOVE.W <ea>,Aq                                  |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq]
   690:           case 0b0011_000_001:
   691:           case 0b0011_001_001:
   692:           case 0b0011_010_001:
   693:           case 0b0011_011_001:
   694:           case 0b0011_100_001:
   695:           case 0b0011_101_001:
   696:           case 0b0011_110_001:
   697:           case 0b0011_111_001:
   698:             irpMoveaWord ();
   699:             break irpSwitch;
   700: 
   701:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   702:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   703:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   704:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   705:             //MOVE.W <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr
   706:           case 0b0011_000_010:
   707:           case 0b0011_001_010:
   708:           case 0b0011_010_010:
   709:           case 0b0011_011_010:
   710:           case 0b0011_100_010:
   711:           case 0b0011_101_010:
   712:           case 0b0011_110_010:
   713:           case 0b0011_111_010:
   714:             irpMoveToMMWord ();
   715:             break irpSwitch;
   716: 
   717:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   718:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   719:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   720:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   721:             //MOVE.W <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr
   722:           case 0b0011_000_011:
   723:           case 0b0011_001_011:
   724:           case 0b0011_010_011:
   725:           case 0b0011_011_011:
   726:           case 0b0011_100_011:
   727:           case 0b0011_101_011:
   728:           case 0b0011_110_011:
   729:           case 0b0011_111_011:
   730:             irpMoveToMPWord ();
   731:             break irpSwitch;
   732: 
   733:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   734:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   735:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   736:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   737:             //MOVE.W <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr
   738:           case 0b0011_000_100:
   739:           case 0b0011_001_100:
   740:           case 0b0011_010_100:
   741:           case 0b0011_011_100:
   742:           case 0b0011_100_100:
   743:           case 0b0011_101_100:
   744:           case 0b0011_110_100:
   745:           case 0b0011_111_100:
   746:             irpMoveToMNWord ();
   747:             break irpSwitch;
   748: 
   749:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   750:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   751:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   752:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   753:             //MOVE.W <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr
   754:           case 0b0011_000_101:
   755:           case 0b0011_001_101:
   756:           case 0b0011_010_101:
   757:           case 0b0011_011_101:
   758:           case 0b0011_100_101:
   759:           case 0b0011_101_101:
   760:           case 0b0011_110_101:
   761:           case 0b0011_111_101:
   762:             irpMoveToMWWord ();
   763:             break irpSwitch;
   764: 
   765:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   766:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   767:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   768:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   769:             //MOVE.W <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr
   770:           case 0b0011_000_110:
   771:           case 0b0011_001_110:
   772:           case 0b0011_010_110:
   773:           case 0b0011_011_110:
   774:           case 0b0011_100_110:
   775:           case 0b0011_101_110:
   776:           case 0b0011_110_110:
   777:           case 0b0011_111_110:
   778:             irpMoveToMXWord ();
   779:             break irpSwitch;
   780: 
   781:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   782:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   783:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   784:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   785:             //MOVE.W <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr
   786:           case 0b0011_000_111:
   787:             irpMoveToZWWord ();
   788:             break irpSwitch;
   789: 
   790:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   791:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   792:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   793:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   794:             //MOVE.W <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr
   795:           case 0b0011_001_111:
   796:             irpMoveToZLWord ();
   797:             break irpSwitch;
   798: 
   799:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   800:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   801:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   802:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   803:             //NEGX.B <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_000_mmm_rrr
   804:           case 0b0100_000_000:
   805:             irpNegxByte ();
   806:             break irpSwitch;
   807: 
   808:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   809:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   810:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   811:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   812:             //NEGX.W <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_001_mmm_rrr
   813:           case 0b0100_000_001:
   814:             irpNegxWord ();
   815:             break irpSwitch;
   816: 
   817:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   818:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   819:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   820:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   821:             //NEGX.L <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_010_mmm_rrr
   822:           case 0b0100_000_010:
   823:             irpNegxLong ();
   824:             break irpSwitch;
   825: 
   826:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   827:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   828:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   829:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   830:             //MOVE.W SR,<ea>                                  |-|-12346|P|*****|-----|D M+-WXZ  |0100_000_011_mmm_rrr
   831:           case 0b0100_000_011:
   832:             irpMoveFromSR ();
   833:             break irpSwitch;
   834: 
   835:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   836:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   837:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   838:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   839:             //CHK.W <ea>,Dq                                   |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr
   840:           case 0b0100_000_110:
   841:           case 0b0100_001_110:
   842:           case 0b0100_010_110:
   843:           case 0b0100_011_110:
   844:           case 0b0100_100_110:
   845:           case 0b0100_101_110:
   846:           case 0b0100_110_110:
   847:           case 0b0100_111_110:
   848:             irpChkWord ();
   849:             break irpSwitch;
   850: 
   851:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   852:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   853:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   854:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   855:             //LEA.L <ea>,Aq                                   |-|012346|-|-----|-----|  M  WXZP |0100_qqq_111_mmm_rrr
   856:           case 0b0100_000_111:
   857:           case 0b0100_001_111:
   858:           case 0b0100_010_111:
   859:           case 0b0100_011_111:
   860:           case 0b0100_100_111:
   861:           case 0b0100_101_111:
   862:           case 0b0100_110_111:
   863:           case 0b0100_111_111:
   864:             irpLea ();
   865:             break irpSwitch;
   866: 
   867:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   868:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   869:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   870:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   871:             //CLR.B <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_000_mmm_rrr (68000 and 68008 read before clear)
   872:           case 0b0100_001_000:
   873:             irpClrByte ();
   874:             break irpSwitch;
   875: 
   876:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   877:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   878:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   879:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   880:             //CLR.W <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_001_mmm_rrr (68000 and 68008 read before clear)
   881:           case 0b0100_001_001:
   882:             irpClrWord ();
   883:             break irpSwitch;
   884: 
   885:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   886:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   887:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   888:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   889:             //CLR.L <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_010_mmm_rrr (68000 and 68008 read before clear)
   890:           case 0b0100_001_010:
   891:             irpClrLong ();
   892:             break irpSwitch;
   893: 
   894:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   895:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   896:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   897:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   898:             //MOVE.W CCR,<ea>                                 |-|-12346|-|*****|-----|D M+-WXZ  |0100_001_011_mmm_rrr
   899:           case 0b0100_001_011:
   900:             irpMoveFromCCR ();
   901:             break irpSwitch;
   902: 
   903:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   904:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   905:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   906:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   907:             //NEG.B <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_000_mmm_rrr
   908:           case 0b0100_010_000:
   909:             irpNegByte ();
   910:             break irpSwitch;
   911: 
   912:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   913:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   914:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   915:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   916:             //NEG.W <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_001_mmm_rrr
   917:           case 0b0100_010_001:
   918:             irpNegWord ();
   919:             break irpSwitch;
   920: 
   921:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   922:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   923:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   924:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   925:             //NEG.L <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_010_mmm_rrr
   926:           case 0b0100_010_010:
   927:             irpNegLong ();
   928:             break irpSwitch;
   929: 
   930:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   931:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   932:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   933:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   934:             //MOVE.W <ea>,CCR                                 |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr
   935:           case 0b0100_010_011:
   936:             irpMoveToCCR ();
   937:             break irpSwitch;
   938: 
   939:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   940:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   941:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   942:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   943:             //NOT.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_000_mmm_rrr
   944:           case 0b0100_011_000:
   945:             irpNotByte ();
   946:             break irpSwitch;
   947: 
   948:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   949:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   950:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   951:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   952:             //NOT.W <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_001_mmm_rrr
   953:           case 0b0100_011_001:
   954:             irpNotWord ();
   955:             break irpSwitch;
   956: 
   957:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   958:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   959:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   960:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   961:             //NOT.L <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_010_mmm_rrr
   962:           case 0b0100_011_010:
   963:             irpNotLong ();
   964:             break irpSwitch;
   965: 
   966:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   967:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   968:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   969:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   970:             //MOVE.W <ea>,SR                                  |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr
   971:           case 0b0100_011_011:
   972:             irpMoveToSR ();
   973:             break irpSwitch;
   974: 
   975:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   976:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   977:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   978:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   979:             //NBCD.B <ea>                                     |-|012346|-|UUUUU|*U*U*|D M+-WXZ  |0100_100_000_mmm_rrr
   980:           case 0b0100_100_000:
   981:             irpNbcd ();
   982:             break irpSwitch;
   983: 
   984:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   985:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   986:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   987:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   988:             //SWAP.W Dr                                       |-|012346|-|-UUUU|-**00|D         |0100_100_001_000_rrr
   989:             //BKPT #<data>                                    |-|-12346|-|-----|-----|          |0100_100_001_001_ddd
   990:             //PEA.L <ea>                                      |-|012346|-|-----|-----|  M  WXZP |0100_100_001_mmm_rrr
   991:           case 0b0100_100_001:
   992:             irpPea ();
   993:             break irpSwitch;
   994: 
   995:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   996:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
   997:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
   998:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
   999:             //EXT.W Dr                                        |-|012346|-|-UUUU|-**00|D         |0100_100_010_000_rrr
  1000:             //MOVEM.W <list>,<ea>                             |-|012346|-|-----|-----|  M -WXZ  |0100_100_010_mmm_rrr-llllllllllllllll
  1001:           case 0b0100_100_010:
  1002:             irpMovemToMemWord ();
  1003:             break irpSwitch;
  1004: 
  1005:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1006:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1007:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1008:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1009:             //EXT.L Dr                                        |-|012346|-|-UUUU|-**00|D         |0100_100_011_000_rrr
  1010:             //MOVEM.L <list>,<ea>                             |-|012346|-|-----|-----|  M -WXZ  |0100_100_011_mmm_rrr-llllllllllllllll
  1011:           case 0b0100_100_011:
  1012:             irpMovemToMemLong ();
  1013:             break irpSwitch;
  1014: 
  1015:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1016:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1017:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1018:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1019:             //TST.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_000_mmm_rrr
  1020:           case 0b0100_101_000:
  1021:             irpTstByte ();
  1022:             break irpSwitch;
  1023: 
  1024:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1025:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1026:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1027:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1028:             //TST.W <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_001_mmm_rrr
  1029:           case 0b0100_101_001:
  1030:             irpTstWord ();
  1031:             break irpSwitch;
  1032: 
  1033:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1034:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1035:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1036:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1037:             //TST.L <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_010_mmm_rrr
  1038:           case 0b0100_101_010:
  1039:             irpTstLong ();
  1040:             break irpSwitch;
  1041: 
  1042:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1043:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1044:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1045:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1046:             //TAS.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_011_mmm_rrr
  1047:             //ILLEGAL                                         |-|012346|-|-----|-----|          |0100_101_011_111_100
  1048:           case 0b0100_101_011:
  1049:             irpTas ();
  1050:             break irpSwitch;
  1051: 
  1052:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1053:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1054:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1055:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1056:             //SATS.L Dr                                       |-|------|-|-UUUU|-**00|D         |0100_110_010_000_rrr (ISA_B)
  1057:             //MOVEM.W <ea>,<list>                             |-|012346|-|-----|-----|  M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll
  1058:           case 0b0100_110_010:
  1059:             irpMovemToRegWord ();
  1060:             break irpSwitch;
  1061: 
  1062:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1063:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1064:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1065:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1066:             //MOVEM.L <ea>,<list>                             |-|012346|-|-----|-----|  M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll
  1067:           case 0b0100_110_011:
  1068:             irpMovemToRegLong ();
  1069:             break irpSwitch;
  1070: 
  1071:           case 0b0100_111_001:
  1072:             switch (XEiJ.regOC & 0b111_111) {
  1073: 
  1074:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1075:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1076:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1077:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1078:               //TRAP #<vector>                                  |-|012346|-|-----|-----|          |0100_111_001_00v_vvv
  1079:             case 0b000_000:
  1080:             case 0b000_001:
  1081:             case 0b000_010:
  1082:             case 0b000_011:
  1083:             case 0b000_100:
  1084:             case 0b000_101:
  1085:             case 0b000_110:
  1086:             case 0b000_111:
  1087:             case 0b001_000:
  1088:             case 0b001_001:
  1089:             case 0b001_010:
  1090:             case 0b001_011:
  1091:             case 0b001_100:
  1092:             case 0b001_101:
  1093:             case 0b001_110:
  1094:               irpTrap ();
  1095:               break irpSwitch;
  1096:             case 0b001_111:
  1097:               irpTrap15 ();
  1098:               break irpSwitch;
  1099: 
  1100:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1101:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1102:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1103:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1104:               //LINK.W Ar,#<data>                               |-|012346|-|-----|-----|          |0100_111_001_010_rrr-{data}
  1105:             case 0b010_000:
  1106:             case 0b010_001:
  1107:             case 0b010_010:
  1108:             case 0b010_011:
  1109:             case 0b010_100:
  1110:             case 0b010_101:
  1111:             case 0b010_110:
  1112:             case 0b010_111:
  1113:               irpLinkWord ();
  1114:               break irpSwitch;
  1115: 
  1116:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1117:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1118:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1119:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1120:               //UNLK Ar                                         |-|012346|-|-----|-----|          |0100_111_001_011_rrr
  1121:             case 0b011_000:
  1122:             case 0b011_001:
  1123:             case 0b011_010:
  1124:             case 0b011_011:
  1125:             case 0b011_100:
  1126:             case 0b011_101:
  1127:             case 0b011_110:
  1128:             case 0b011_111:
  1129:               irpUnlk ();
  1130:               break irpSwitch;
  1131: 
  1132:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1133:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1134:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1135:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1136:               //MOVE.L Ar,USP                                   |-|012346|P|-----|-----|          |0100_111_001_100_rrr
  1137:             case 0b100_000:
  1138:             case 0b100_001:
  1139:             case 0b100_010:
  1140:             case 0b100_011:
  1141:             case 0b100_100:
  1142:             case 0b100_101:
  1143:             case 0b100_110:
  1144:             case 0b100_111:
  1145:               irpMoveToUsp ();
  1146:               break irpSwitch;
  1147: 
  1148:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1149:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1150:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1151:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1152:               //MOVE.L USP,Ar                                   |-|012346|P|-----|-----|          |0100_111_001_101_rrr
  1153:             case 0b101_000:
  1154:             case 0b101_001:
  1155:             case 0b101_010:
  1156:             case 0b101_011:
  1157:             case 0b101_100:
  1158:             case 0b101_101:
  1159:             case 0b101_110:
  1160:             case 0b101_111:
  1161:               irpMoveFromUsp ();
  1162:               break irpSwitch;
  1163: 
  1164:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1165:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1166:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1167:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1168:               //RESET                                           |-|012346|P|-----|-----|          |0100_111_001_110_000
  1169:             case 0b110_000:
  1170:               irpReset ();
  1171:               break irpSwitch;
  1172: 
  1173:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1174:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1175:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1176:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1177:               //NOP                                             |-|012346|-|-----|-----|          |0100_111_001_110_001
  1178:             case 0b110_001:
  1179:               irpNop ();
  1180:               break irpSwitch;
  1181: 
  1182:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1183:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1184:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1185:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1186:               //STOP #<data>                                    |-|012346|P|UUUUU|*****|          |0100_111_001_110_010-{data}
  1187:             case 0b110_010:
  1188:               irpStop ();
  1189:               break irpSwitch;
  1190: 
  1191:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1192:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1193:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1194:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1195:               //RTE                                             |-|012346|P|UUUUU|*****|          |0100_111_001_110_011
  1196:             case 0b110_011:
  1197:               irpRte ();
  1198:               break irpSwitch;
  1199: 
  1200:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1201:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1202:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1203:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1204:               //RTD #<data>                                     |-|-12346|-|-----|-----|          |0100_111_001_110_100-{data}
  1205:             case 0b110_100:
  1206:               irpRtd ();
  1207:               break irpSwitch;
  1208: 
  1209:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1210:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1211:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1212:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1213:               //RTS                                             |-|012346|-|-----|-----|          |0100_111_001_110_101
  1214:             case 0b110_101:
  1215:               irpRts ();
  1216:               break irpSwitch;
  1217: 
  1218:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1219:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1220:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1221:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1222:               //TRAPV                                           |-|012346|-|---*-|-----|          |0100_111_001_110_110
  1223:             case 0b110_110:
  1224:               irpTrapv ();
  1225:               break irpSwitch;
  1226: 
  1227:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1228:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1229:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1230:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1231:               //RTR                                             |-|012346|-|UUUUU|*****|          |0100_111_001_110_111
  1232:             case 0b110_111:
  1233:               irpRtr ();
  1234:               break irpSwitch;
  1235: 
  1236:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1237:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1238:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1239:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1240:               //MOVEC.L Rc,Rn                                   |-|-12346|P|-----|-----|          |0100_111_001_111_010-rnnncccccccccccc
  1241:             case 0b111_010:
  1242:               irpMovecFromControl ();
  1243:               break irpSwitch;
  1244: 
  1245:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1246:               //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1247:               //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1248:               //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1249:               //MOVEC.L Rn,Rc                                   |-|-12346|P|-----|-----|          |0100_111_001_111_011-rnnncccccccccccc
  1250:             case 0b111_011:
  1251:               irpMovecToControl ();
  1252:               break irpSwitch;
  1253: 
  1254:             default:
  1255:               irpIllegal ();
  1256: 
  1257:             }  //switch XEiJ.regOC & 0b111_111
  1258:             break irpSwitch;
  1259: 
  1260:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1261:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1262:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1263:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1264:             //JSR <ea>                                        |-|012346|-|-----|-----|  M  WXZP |0100_111_010_mmm_rrr
  1265:             //JBSR.L <label>                                  |A|012346|-|-----|-----|          |0100_111_010_111_001-{address}       [JSR <label>]
  1266:           case 0b0100_111_010:
  1267:             irpJsr ();
  1268:             break irpSwitch;
  1269: 
  1270:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1271:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1272:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1273:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1274:             //JMP <ea>                                        |-|012346|-|-----|-----|  M  WXZP |0100_111_011_mmm_rrr
  1275:             //JBRA.L <label>                                  |A|012346|-|-----|-----|          |0100_111_011_111_001-{address}       [JMP <label>]
  1276:           case 0b0100_111_011:
  1277:             irpJmp ();
  1278:             break irpSwitch;
  1279: 
  1280:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1281:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1282:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1283:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1284:             //ADDQ.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_000_mmm_rrr
  1285:             //INC.B <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>]
  1286:           case 0b0101_000_000:
  1287:           case 0b0101_001_000:
  1288:           case 0b0101_010_000:
  1289:           case 0b0101_011_000:
  1290:           case 0b0101_100_000:
  1291:           case 0b0101_101_000:
  1292:           case 0b0101_110_000:
  1293:           case 0b0101_111_000:
  1294:             irpAddqByte ();
  1295:             break irpSwitch;
  1296: 
  1297:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1298:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1299:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1300:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1301:             //ADDQ.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_001_mmm_rrr
  1302:             //ADDQ.W #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_001_001_rrr
  1303:             //INC.W <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>]
  1304:             //INC.W Ar                                        |A|012346|-|-----|-----| A        |0101_001_001_001_rrr [ADDQ.W #1,Ar]
  1305:           case 0b0101_000_001:
  1306:           case 0b0101_001_001:
  1307:           case 0b0101_010_001:
  1308:           case 0b0101_011_001:
  1309:           case 0b0101_100_001:
  1310:           case 0b0101_101_001:
  1311:           case 0b0101_110_001:
  1312:           case 0b0101_111_001:
  1313:             irpAddqWord ();
  1314:             break irpSwitch;
  1315: 
  1316:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1317:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1318:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1319:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1320:             //ADDQ.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_010_mmm_rrr
  1321:             //ADDQ.L #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_010_001_rrr
  1322:             //INC.L <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>]
  1323:             //INC.L Ar                                        |A|012346|-|-----|-----| A        |0101_001_010_001_rrr [ADDQ.L #1,Ar]
  1324:           case 0b0101_000_010:
  1325:           case 0b0101_001_010:
  1326:           case 0b0101_010_010:
  1327:           case 0b0101_011_010:
  1328:           case 0b0101_100_010:
  1329:           case 0b0101_101_010:
  1330:           case 0b0101_110_010:
  1331:           case 0b0101_111_010:
  1332:             irpAddqLong ();
  1333:             break irpSwitch;
  1334: 
  1335:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1336:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1337:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1338:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1339:             //ST.B <ea>                                       |-|012346|-|-----|-----|D M+-WXZ  |0101_000_011_mmm_rrr
  1340:             //SNF.B <ea>                                      |A|012346|-|-----|-----|D M+-WXZ  |0101_000_011_mmm_rrr [ST.B <ea>]
  1341:             //DBT.W Dr,<label>                                |-|012346|-|-----|-----|          |0101_000_011_001_rrr-{offset}
  1342:             //DBNF.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_011_001_rrr-{offset}        [DBT.W Dr,<label>]
  1343:           case 0b0101_000_011:
  1344:             irpSt ();
  1345:             break irpSwitch;
  1346: 
  1347:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1348:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1349:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1350:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1351:             //SUBQ.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_100_mmm_rrr
  1352:             //DEC.B <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>]
  1353:           case 0b0101_000_100:
  1354:           case 0b0101_001_100:
  1355:           case 0b0101_010_100:
  1356:           case 0b0101_011_100:
  1357:           case 0b0101_100_100:
  1358:           case 0b0101_101_100:
  1359:           case 0b0101_110_100:
  1360:           case 0b0101_111_100:
  1361:             irpSubqByte ();
  1362:             break irpSwitch;
  1363: 
  1364:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1365:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1366:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1367:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1368:             //SUBQ.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_101_mmm_rrr
  1369:             //SUBQ.W #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_101_001_rrr
  1370:             //DEC.W <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>]
  1371:             //DEC.W Ar                                        |A|012346|-|-----|-----| A        |0101_001_101_001_rrr [SUBQ.W #1,Ar]
  1372:           case 0b0101_000_101:
  1373:           case 0b0101_001_101:
  1374:           case 0b0101_010_101:
  1375:           case 0b0101_011_101:
  1376:           case 0b0101_100_101:
  1377:           case 0b0101_101_101:
  1378:           case 0b0101_110_101:
  1379:           case 0b0101_111_101:
  1380:             irpSubqWord ();
  1381:             break irpSwitch;
  1382: 
  1383:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1384:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1385:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1386:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1387:             //SUBQ.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_110_mmm_rrr
  1388:             //SUBQ.L #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_110_001_rrr
  1389:             //DEC.L <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>]
  1390:             //DEC.L Ar                                        |A|012346|-|-----|-----| A        |0101_001_110_001_rrr [SUBQ.L #1,Ar]
  1391:           case 0b0101_000_110:
  1392:           case 0b0101_001_110:
  1393:           case 0b0101_010_110:
  1394:           case 0b0101_011_110:
  1395:           case 0b0101_100_110:
  1396:           case 0b0101_101_110:
  1397:           case 0b0101_110_110:
  1398:           case 0b0101_111_110:
  1399:             irpSubqLong ();
  1400:             break irpSwitch;
  1401: 
  1402:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1403:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1404:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1405:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1406:             //SF.B <ea>                                       |-|012346|-|-----|-----|D M+-WXZ  |0101_000_111_mmm_rrr
  1407:             //SNT.B <ea>                                      |A|012346|-|-----|-----|D M+-WXZ  |0101_000_111_mmm_rrr [SF.B <ea>]
  1408:             //DBF.W Dr,<label>                                |-|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}
  1409:             //DBNT.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}        [DBF.W Dr,<label>]
  1410:             //DBRA.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}        [DBF.W Dr,<label>]
  1411:           case 0b0101_000_111:
  1412:             irpSf ();
  1413:             break irpSwitch;
  1414: 
  1415:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1416:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1417:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1418:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1419:             //SHI.B <ea>                                      |-|012346|-|--*-*|-----|D M+-WXZ  |0101_001_011_mmm_rrr
  1420:             //SNLS.B <ea>                                     |A|012346|-|--*-*|-----|D M+-WXZ  |0101_001_011_mmm_rrr [SHI.B <ea>]
  1421:             //DBHI.W Dr,<label>                               |-|012346|-|--*-*|-----|          |0101_001_011_001_rrr-{offset}
  1422:             //DBNLS.W Dr,<label>                              |A|012346|-|--*-*|-----|          |0101_001_011_001_rrr-{offset}        [DBHI.W Dr,<label>]
  1423:           case 0b0101_001_011:
  1424:             irpShi ();
  1425:             break irpSwitch;
  1426: 
  1427:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1428:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1429:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1430:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1431:             //SLS.B <ea>                                      |-|012346|-|--*-*|-----|D M+-WXZ  |0101_001_111_mmm_rrr
  1432:             //SNHI.B <ea>                                     |A|012346|-|--*-*|-----|D M+-WXZ  |0101_001_111_mmm_rrr [SLS.B <ea>]
  1433:             //DBLS.W Dr,<label>                               |-|012346|-|--*-*|-----|          |0101_001_111_001_rrr-{offset}
  1434:             //DBNHI.W Dr,<label>                              |A|012346|-|--*-*|-----|          |0101_001_111_001_rrr-{offset}        [DBLS.W Dr,<label>]
  1435:           case 0b0101_001_111:
  1436:             irpSls ();
  1437:             break irpSwitch;
  1438: 
  1439:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1440:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1441:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1442:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1443:             //SCC.B <ea>                                      |-|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr
  1444:             //SHS.B <ea>                                      |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  1445:             //SNCS.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  1446:             //SNLO.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  1447:             //DBCC.W Dr,<label>                               |-|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}
  1448:             //DBHS.W Dr,<label>                               |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  1449:             //DBNCS.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  1450:             //DBNLO.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  1451:           case 0b0101_010_011:
  1452:             irpShs ();
  1453:             break irpSwitch;
  1454: 
  1455:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1456:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1457:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1458:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1459:             //SCS.B <ea>                                      |-|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr
  1460:             //SLO.B <ea>                                      |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  1461:             //SNCC.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  1462:             //SNHS.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  1463:             //DBCS.W Dr,<label>                               |-|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}
  1464:             //DBLO.W Dr,<label>                               |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  1465:             //DBNCC.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  1466:             //DBNHS.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  1467:           case 0b0101_010_111:
  1468:             irpSlo ();
  1469:             break irpSwitch;
  1470: 
  1471:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1472:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1473:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1474:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1475:             //SNE.B <ea>                                      |-|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr
  1476:             //SNEQ.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  1477:             //SNZ.B <ea>                                      |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  1478:             //SNZE.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  1479:             //DBNE.W Dr,<label>                               |-|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}
  1480:             //DBNEQ.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  1481:             //DBNZ.W Dr,<label>                               |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  1482:             //DBNZE.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  1483:           case 0b0101_011_011:
  1484:             irpSne ();
  1485:             break irpSwitch;
  1486: 
  1487:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1488:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1489:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1490:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1491:             //SEQ.B <ea>                                      |-|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr
  1492:             //SNNE.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  1493:             //SNNZ.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  1494:             //SZE.B <ea>                                      |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  1495:             //DBEQ.W Dr,<label>                               |-|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}
  1496:             //DBNNE.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  1497:             //DBNNZ.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  1498:             //DBZE.W Dr,<label>                               |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  1499:           case 0b0101_011_111:
  1500:             irpSeq ();
  1501:             break irpSwitch;
  1502: 
  1503:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1504:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1505:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1506:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1507:             //SVC.B <ea>                                      |-|012346|-|---*-|-----|D M+-WXZ  |0101_100_011_mmm_rrr
  1508:             //SNVS.B <ea>                                     |A|012346|-|---*-|-----|D M+-WXZ  |0101_100_011_mmm_rrr [SVC.B <ea>]
  1509:             //DBVC.W Dr,<label>                               |-|012346|-|---*-|-----|          |0101_100_011_001_rrr-{offset}
  1510:             //DBNVS.W Dr,<label>                              |A|012346|-|---*-|-----|          |0101_100_011_001_rrr-{offset}        [DBVC.W Dr,<label>]
  1511:           case 0b0101_100_011:
  1512:             irpSvc ();
  1513:             break irpSwitch;
  1514: 
  1515:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1516:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1517:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1518:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1519:             //SVS.B <ea>                                      |-|012346|-|---*-|-----|D M+-WXZ  |0101_100_111_mmm_rrr
  1520:             //SNVC.B <ea>                                     |A|012346|-|---*-|-----|D M+-WXZ  |0101_100_111_mmm_rrr [SVS.B <ea>]
  1521:             //DBVS.W Dr,<label>                               |-|012346|-|---*-|-----|          |0101_100_111_001_rrr-{offset}
  1522:             //DBNVC.W Dr,<label>                              |A|012346|-|---*-|-----|          |0101_100_111_001_rrr-{offset}        [DBVS.W Dr,<label>]
  1523:           case 0b0101_100_111:
  1524:             irpSvs ();
  1525:             break irpSwitch;
  1526: 
  1527:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1528:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1529:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1530:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1531:             //SPL.B <ea>                                      |-|012346|-|-*---|-----|D M+-WXZ  |0101_101_011_mmm_rrr
  1532:             //SNMI.B <ea>                                     |A|012346|-|-*---|-----|D M+-WXZ  |0101_101_011_mmm_rrr [SPL.B <ea>]
  1533:             //DBPL.W Dr,<label>                               |-|012346|-|-*---|-----|          |0101_101_011_001_rrr-{offset}
  1534:             //DBNMI.W Dr,<label>                              |A|012346|-|-*---|-----|          |0101_101_011_001_rrr-{offset}        [DBPL.W Dr,<label>]
  1535:           case 0b0101_101_011:
  1536:             irpSpl ();
  1537:             break irpSwitch;
  1538: 
  1539:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1540:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1541:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1542:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1543:             //SMI.B <ea>                                      |-|012346|-|-*---|-----|D M+-WXZ  |0101_101_111_mmm_rrr
  1544:             //SNPL.B <ea>                                     |A|012346|-|-*---|-----|D M+-WXZ  |0101_101_111_mmm_rrr [SMI.B <ea>]
  1545:             //DBMI.W Dr,<label>                               |-|012346|-|-*---|-----|          |0101_101_111_001_rrr-{offset}
  1546:             //DBNPL.W Dr,<label>                              |A|012346|-|-*---|-----|          |0101_101_111_001_rrr-{offset}        [DBMI.W Dr,<label>]
  1547:           case 0b0101_101_111:
  1548:             irpSmi ();
  1549:             break irpSwitch;
  1550: 
  1551:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1552:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1553:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1554:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1555:             //SGE.B <ea>                                      |-|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_011_mmm_rrr
  1556:             //SNLT.B <ea>                                     |A|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_011_mmm_rrr [SGE.B <ea>]
  1557:             //DBGE.W Dr,<label>                               |-|012346|-|-*-*-|-----|          |0101_110_011_001_rrr-{offset}
  1558:             //DBNLT.W Dr,<label>                              |A|012346|-|-*-*-|-----|          |0101_110_011_001_rrr-{offset}        [DBGE.W Dr,<label>]
  1559:           case 0b0101_110_011:
  1560:             irpSge ();
  1561:             break irpSwitch;
  1562: 
  1563:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1564:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1565:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1566:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1567:             //SLT.B <ea>                                      |-|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_111_mmm_rrr
  1568:             //SNGE.B <ea>                                     |A|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_111_mmm_rrr [SLT.B <ea>]
  1569:             //DBLT.W Dr,<label>                               |-|012346|-|-*-*-|-----|          |0101_110_111_001_rrr-{offset}
  1570:             //DBNGE.W Dr,<label>                              |A|012346|-|-*-*-|-----|          |0101_110_111_001_rrr-{offset}        [DBLT.W Dr,<label>]
  1571:           case 0b0101_110_111:
  1572:             irpSlt ();
  1573:             break irpSwitch;
  1574: 
  1575:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1576:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1577:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1578:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1579:             //SGT.B <ea>                                      |-|012346|-|-***-|-----|D M+-WXZ  |0101_111_011_mmm_rrr
  1580:             //SNLE.B <ea>                                     |A|012346|-|-***-|-----|D M+-WXZ  |0101_111_011_mmm_rrr [SGT.B <ea>]
  1581:             //DBGT.W Dr,<label>                               |-|012346|-|-***-|-----|          |0101_111_011_001_rrr-{offset}
  1582:             //DBNLE.W Dr,<label>                              |A|012346|-|-***-|-----|          |0101_111_011_001_rrr-{offset}        [DBGT.W Dr,<label>]
  1583:           case 0b0101_111_011:
  1584:             irpSgt ();
  1585:             break irpSwitch;
  1586: 
  1587:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1588:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1589:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1590:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1591:             //SLE.B <ea>                                      |-|012346|-|-***-|-----|D M+-WXZ  |0101_111_111_mmm_rrr
  1592:             //SNGT.B <ea>                                     |A|012346|-|-***-|-----|D M+-WXZ  |0101_111_111_mmm_rrr [SLE.B <ea>]
  1593:             //DBLE.W Dr,<label>                               |-|012346|-|-***-|-----|          |0101_111_111_001_rrr-{offset}
  1594:             //DBNGT.W Dr,<label>                              |A|012346|-|-***-|-----|          |0101_111_111_001_rrr-{offset}        [DBLE.W Dr,<label>]
  1595:           case 0b0101_111_111:
  1596:             irpSle ();
  1597:             break irpSwitch;
  1598: 
  1599:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1600:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1601:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1602:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1603:             //BRA.W <label>                                   |-|012346|-|-----|-----|          |0110_000_000_000_000-{offset}
  1604:             //JBRA.W <label>                                  |A|012346|-|-----|-----|          |0110_000_000_000_000-{offset}        [BRA.W <label>]
  1605:             //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_000_sss_sss (s is not equal to 0)
  1606:             //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_000_sss_sss (s is not equal to 0)   [BRA.S <label>]
  1607:           case 0b0110_000_000:
  1608:             irpBrasw ();
  1609:             break irpSwitch;
  1610: 
  1611:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1612:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1613:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1614:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1615:             //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_001_sss_sss
  1616:             //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_001_sss_sss [BRA.S <label>]
  1617:           case 0b0110_000_001:
  1618:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1619:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1620:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1621:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1622:             //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_010_sss_sss
  1623:             //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_010_sss_sss [BRA.S <label>]
  1624:           case 0b0110_000_010:
  1625:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1626:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1627:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1628:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1629:             //BRA.S <label>                                   |-|01----|-|-----|-----|          |0110_000_011_sss_sss
  1630:             //JBRA.S <label>                                  |A|01----|-|-----|-----|          |0110_000_011_sss_sss [BRA.S <label>]
  1631:           case 0b0110_000_011:
  1632:             irpBras ();
  1633:             break irpSwitch;
  1634: 
  1635:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1636:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1637:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1638:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1639:             //BSR.W <label>                                   |-|012346|-|-----|-----|          |0110_000_100_000_000-{offset}
  1640:             //JBSR.W <label>                                  |A|012346|-|-----|-----|          |0110_000_100_000_000-{offset}        [BSR.W <label>]
  1641:             //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_100_sss_sss (s is not equal to 0)
  1642:             //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_100_sss_sss (s is not equal to 0)   [BSR.S <label>]
  1643:           case 0b0110_000_100:
  1644:             irpBsrsw ();
  1645:             break irpSwitch;
  1646: 
  1647:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1648:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1649:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1650:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1651:             //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_101_sss_sss
  1652:             //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_101_sss_sss [BSR.S <label>]
  1653:           case 0b0110_000_101:
  1654:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1655:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1656:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1657:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1658:             //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_110_sss_sss
  1659:             //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_110_sss_sss [BSR.S <label>]
  1660:           case 0b0110_000_110:
  1661:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1662:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1663:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1664:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1665:             //BSR.S <label>                                   |-|01----|-|-----|-----|          |0110_000_111_sss_sss
  1666:             //JBSR.S <label>                                  |A|01----|-|-----|-----|          |0110_000_111_sss_sss [BSR.S <label>]
  1667:           case 0b0110_000_111:
  1668:             irpBsrs ();
  1669:             break irpSwitch;
  1670: 
  1671:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1672:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1673:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1674:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1675:             //BHI.W <label>                                   |-|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}
  1676:             //BNLS.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  1677:             //JBHI.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  1678:             //JBNLS.W <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  1679:             //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)
  1680:             //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  1681:             //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  1682:             //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  1683:             //JBLS.L <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_110-0100111011111001-{address}      [BHI.S (*)+8;JMP <label>]
  1684:             //JBNHI.L <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_000_110-0100111011111001-{address}      [BHI.S (*)+8;JMP <label>]
  1685:           case 0b0110_001_000:
  1686:             irpBhisw ();
  1687:             break irpSwitch;
  1688: 
  1689:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1690:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1691:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1692:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1693:             //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_001_sss_sss
  1694:             //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  1695:             //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  1696:             //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  1697:           case 0b0110_001_001:
  1698:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1699:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1700:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1701:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1702:             //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_010_sss_sss
  1703:             //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  1704:             //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  1705:             //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  1706:           case 0b0110_001_010:
  1707:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1708:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1709:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1710:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1711:             //BHI.S <label>                                   |-|01----|-|--*-*|-----|          |0110_001_011_sss_sss
  1712:             //BNLS.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  1713:             //JBHI.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  1714:             //JBNLS.S <label>                                 |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  1715:           case 0b0110_001_011:
  1716:             irpBhis ();
  1717:             break irpSwitch;
  1718: 
  1719:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1720:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1721:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1722:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1723:             //BLS.W <label>                                   |-|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}
  1724:             //BNHI.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  1725:             //JBLS.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  1726:             //JBNHI.W <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  1727:             //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)
  1728:             //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  1729:             //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  1730:             //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  1731:             //JBHI.L <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_110-0100111011111001-{address}      [BLS.S (*)+8;JMP <label>]
  1732:             //JBNLS.L <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_000_110-0100111011111001-{address}      [BLS.S (*)+8;JMP <label>]
  1733:           case 0b0110_001_100:
  1734:             irpBlssw ();
  1735:             break irpSwitch;
  1736: 
  1737:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1738:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1739:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1740:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1741:             //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_101_sss_sss
  1742:             //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  1743:             //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  1744:             //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  1745:           case 0b0110_001_101:
  1746:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1747:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1748:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1749:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1750:             //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_110_sss_sss
  1751:             //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  1752:             //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  1753:             //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  1754:           case 0b0110_001_110:
  1755:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1756:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1757:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1758:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1759:             //BLS.S <label>                                   |-|01----|-|--*-*|-----|          |0110_001_111_sss_sss
  1760:             //BNHI.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  1761:             //JBLS.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  1762:             //JBNHI.S <label>                                 |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  1763:           case 0b0110_001_111:
  1764:             irpBlss ();
  1765:             break irpSwitch;
  1766: 
  1767:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1768:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1769:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1770:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1771:             //BCC.W <label>                                   |-|012346|-|----*|-----|          |0110_010_000_000_000-{offset}
  1772:             //BHS.W <label>                                   |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  1773:             //BNCS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  1774:             //BNLO.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  1775:             //JBCC.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  1776:             //JBHS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  1777:             //JBNCS.W <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  1778:             //JBNLO.W <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  1779:             //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)
  1780:             //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  1781:             //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  1782:             //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  1783:             //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  1784:             //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  1785:             //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  1786:             //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  1787:             //JBCS.L <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  1788:             //JBLO.L <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  1789:             //JBNCC.L <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  1790:             //JBNHS.L <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  1791:           case 0b0110_010_000:
  1792:             irpBhssw ();
  1793:             break irpSwitch;
  1794: 
  1795:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1796:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1797:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1798:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1799:             //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_001_sss_sss
  1800:             //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  1801:             //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  1802:             //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  1803:             //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  1804:             //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  1805:             //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  1806:             //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  1807:           case 0b0110_010_001:
  1808:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1809:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1810:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1811:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1812:             //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_010_sss_sss
  1813:             //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  1814:             //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  1815:             //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  1816:             //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  1817:             //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  1818:             //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  1819:             //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  1820:           case 0b0110_010_010:
  1821:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1822:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1823:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1824:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1825:             //BCC.S <label>                                   |-|01----|-|----*|-----|          |0110_010_011_sss_sss
  1826:             //BHS.S <label>                                   |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  1827:             //BNCS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  1828:             //BNLO.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  1829:             //JBCC.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  1830:             //JBHS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  1831:             //JBNCS.S <label>                                 |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  1832:             //JBNLO.S <label>                                 |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  1833:           case 0b0110_010_011:
  1834:             irpBhss ();
  1835:             break irpSwitch;
  1836: 
  1837:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1838:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1839:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1840:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1841:             //BCS.W <label>                                   |-|012346|-|----*|-----|          |0110_010_100_000_000-{offset}
  1842:             //BLO.W <label>                                   |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  1843:             //BNCC.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  1844:             //BNHS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  1845:             //JBCS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  1846:             //JBLO.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  1847:             //JBNCC.W <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  1848:             //JBNHS.W <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  1849:             //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)
  1850:             //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  1851:             //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  1852:             //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  1853:             //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  1854:             //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  1855:             //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  1856:             //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  1857:             //JBCC.L <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  1858:             //JBHS.L <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  1859:             //JBNCS.L <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  1860:             //JBNLO.L <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  1861:           case 0b0110_010_100:
  1862:             irpBlosw ();
  1863:             break irpSwitch;
  1864: 
  1865:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1866:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1867:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1868:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1869:             //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_101_sss_sss
  1870:             //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  1871:             //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  1872:             //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  1873:             //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  1874:             //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  1875:             //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  1876:             //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  1877:           case 0b0110_010_101:
  1878:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1879:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1880:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1881:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1882:             //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_110_sss_sss
  1883:             //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  1884:             //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  1885:             //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  1886:             //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  1887:             //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  1888:             //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  1889:             //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  1890:           case 0b0110_010_110:
  1891:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1892:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1893:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1894:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1895:             //BCS.S <label>                                   |-|01----|-|----*|-----|          |0110_010_111_sss_sss
  1896:             //BLO.S <label>                                   |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  1897:             //BNCC.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  1898:             //BNHS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  1899:             //JBCS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  1900:             //JBLO.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  1901:             //JBNCC.S <label>                                 |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  1902:             //JBNHS.S <label>                                 |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  1903:           case 0b0110_010_111:
  1904:             irpBlos ();
  1905:             break irpSwitch;
  1906: 
  1907:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1908:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1909:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1910:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1911:             //BNE.W <label>                                   |-|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}
  1912:             //BNEQ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  1913:             //BNZ.W <label>                                   |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  1914:             //BNZE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  1915:             //JBNE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  1916:             //JBNEQ.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  1917:             //JBNZ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  1918:             //JBNZE.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  1919:             //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)
  1920:             //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  1921:             //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  1922:             //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  1923:             //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  1924:             //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  1925:             //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  1926:             //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  1927:             //JBEQ.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  1928:             //JBNEQ.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  1929:             //JBNNE.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  1930:             //JBNNZ.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  1931:             //JBNZ.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  1932:             //JBNZE.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  1933:             //JBZE.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  1934:           case 0b0110_011_000:
  1935:             irpBnesw ();
  1936:             break irpSwitch;
  1937: 
  1938:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1939:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1940:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1941:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1942:             //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_001_sss_sss
  1943:             //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  1944:             //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  1945:             //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  1946:             //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  1947:             //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  1948:             //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  1949:             //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  1950:           case 0b0110_011_001:
  1951:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1952:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1953:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1954:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1955:             //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_010_sss_sss
  1956:             //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  1957:             //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  1958:             //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  1959:             //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  1960:             //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  1961:             //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  1962:             //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  1963:           case 0b0110_011_010:
  1964:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1965:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1966:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1967:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1968:             //BNE.S <label>                                   |-|01----|-|--*--|-----|          |0110_011_011_sss_sss
  1969:             //BNEQ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  1970:             //BNZ.S <label>                                   |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  1971:             //BNZE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  1972:             //JBNE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  1973:             //JBNEQ.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  1974:             //JBNZ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  1975:             //JBNZE.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  1976:           case 0b0110_011_011:
  1977:             irpBnes ();
  1978:             break irpSwitch;
  1979: 
  1980:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1981:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  1982:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  1983:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  1984:             //BEQ.W <label>                                   |-|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}
  1985:             //BNNE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  1986:             //BNNZ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  1987:             //BZE.W <label>                                   |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  1988:             //JBEQ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  1989:             //JBNNE.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  1990:             //JBNNZ.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  1991:             //JBZE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  1992:             //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)
  1993:             //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  1994:             //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  1995:             //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  1996:             //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  1997:             //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  1998:             //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  1999:             //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  2000:             //JBNE.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_110-0100111011111001-{address}      [BEQ.S (*)+8;JMP <label>]
  2001:           case 0b0110_011_100:
  2002:             irpBeqsw ();
  2003:             break irpSwitch;
  2004: 
  2005:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2006:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2007:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2008:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2009:             //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_101_sss_sss
  2010:             //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  2011:             //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  2012:             //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  2013:             //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  2014:             //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  2015:             //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  2016:             //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  2017:           case 0b0110_011_101:
  2018:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2019:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2020:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2021:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2022:             //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_110_sss_sss
  2023:             //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  2024:             //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  2025:             //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  2026:             //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  2027:             //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  2028:             //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  2029:             //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  2030:           case 0b0110_011_110:
  2031:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2032:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2033:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2034:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2035:             //BEQ.S <label>                                   |-|01----|-|--*--|-----|          |0110_011_111_sss_sss
  2036:             //BNNE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  2037:             //BNNZ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  2038:             //BZE.S <label>                                   |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  2039:             //JBEQ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  2040:             //JBNNE.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  2041:             //JBNNZ.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  2042:             //JBZE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  2043:           case 0b0110_011_111:
  2044:             irpBeqs ();
  2045:             break irpSwitch;
  2046: 
  2047:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2048:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2049:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2050:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2051:             //BVC.W <label>                                   |-|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}
  2052:             //BNVS.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  2053:             //JBNVS.W <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  2054:             //JBVC.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  2055:             //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)
  2056:             //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  2057:             //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  2058:             //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  2059:             //JBNVC.L <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_000_110-0100111011111001-{address}      [BVC.S (*)+8;JMP <label>]
  2060:             //JBVS.L <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_110-0100111011111001-{address}      [BVC.S (*)+8;JMP <label>]
  2061:           case 0b0110_100_000:
  2062:             irpBvcsw ();
  2063:             break irpSwitch;
  2064: 
  2065:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2066:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2067:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2068:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2069:             //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_001_sss_sss
  2070:             //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
  2071:             //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
  2072:             //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
  2073:           case 0b0110_100_001:
  2074:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2075:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2076:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2077:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2078:             //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_010_sss_sss
  2079:             //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
  2080:             //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
  2081:             //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
  2082:           case 0b0110_100_010:
  2083:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2084:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2085:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2086:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2087:             //BVC.S <label>                                   |-|01----|-|---*-|-----|          |0110_100_011_sss_sss
  2088:             //BNVS.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
  2089:             //JBNVS.S <label>                                 |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
  2090:             //JBVC.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
  2091:           case 0b0110_100_011:
  2092:             irpBvcs ();
  2093:             break irpSwitch;
  2094: 
  2095:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2096:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2097:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2098:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2099:             //BVS.W <label>                                   |-|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}
  2100:             //BNVC.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
  2101:             //JBNVC.W <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
  2102:             //JBVS.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
  2103:             //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)
  2104:             //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
  2105:             //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
  2106:             //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
  2107:             //JBNVS.L <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_000_110-0100111011111001-{address}      [BVS.S (*)+8;JMP <label>]
  2108:             //JBVC.L <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_110-0100111011111001-{address}      [BVS.S (*)+8;JMP <label>]
  2109:           case 0b0110_100_100:
  2110:             irpBvssw ();
  2111:             break irpSwitch;
  2112: 
  2113:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2114:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2115:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2116:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2117:             //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_101_sss_sss
  2118:             //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
  2119:             //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
  2120:             //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
  2121:           case 0b0110_100_101:
  2122:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2123:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2124:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2125:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2126:             //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_110_sss_sss
  2127:             //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
  2128:             //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
  2129:             //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
  2130:           case 0b0110_100_110:
  2131:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2132:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2133:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2134:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2135:             //BVS.S <label>                                   |-|01----|-|---*-|-----|          |0110_100_111_sss_sss
  2136:             //BNVC.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
  2137:             //JBNVC.S <label>                                 |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
  2138:             //JBVS.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
  2139:           case 0b0110_100_111:
  2140:             irpBvss ();
  2141:             break irpSwitch;
  2142: 
  2143:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2144:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2145:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2146:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2147:             //BPL.W <label>                                   |-|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}
  2148:             //BNMI.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
  2149:             //JBNMI.W <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
  2150:             //JBPL.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
  2151:             //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)
  2152:             //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
  2153:             //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
  2154:             //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
  2155:             //JBMI.L <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_110-0100111011111001-{address}      [BPL.S (*)+8;JMP <label>]
  2156:             //JBNPL.L <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_000_110-0100111011111001-{address}      [BPL.S (*)+8;JMP <label>]
  2157:           case 0b0110_101_000:
  2158:             irpBplsw ();
  2159:             break irpSwitch;
  2160: 
  2161:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2162:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2163:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2164:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2165:             //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_001_sss_sss
  2166:             //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
  2167:             //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
  2168:             //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
  2169:           case 0b0110_101_001:
  2170:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2171:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2172:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2173:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2174:             //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_010_sss_sss
  2175:             //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
  2176:             //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
  2177:             //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
  2178:           case 0b0110_101_010:
  2179:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2180:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2181:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2182:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2183:             //BPL.S <label>                                   |-|01----|-|-*---|-----|          |0110_101_011_sss_sss
  2184:             //BNMI.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
  2185:             //JBNMI.S <label>                                 |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
  2186:             //JBPL.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
  2187:           case 0b0110_101_011:
  2188:             irpBpls ();
  2189:             break irpSwitch;
  2190: 
  2191:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2192:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2193:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2194:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2195:             //BMI.W <label>                                   |-|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}
  2196:             //BNPL.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
  2197:             //JBMI.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
  2198:             //JBNPL.W <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
  2199:             //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)
  2200:             //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
  2201:             //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
  2202:             //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
  2203:             //JBNMI.L <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_000_110-0100111011111001-{address}      [BMI.S (*)+8;JMP <label>]
  2204:             //JBPL.L <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_110-0100111011111001-{address}      [BMI.S (*)+8;JMP <label>]
  2205:           case 0b0110_101_100:
  2206:             irpBmisw ();
  2207:             break irpSwitch;
  2208: 
  2209:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2210:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2211:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2212:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2213:             //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_101_sss_sss
  2214:             //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
  2215:             //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
  2216:             //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
  2217:           case 0b0110_101_101:
  2218:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2219:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2220:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2221:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2222:             //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_110_sss_sss
  2223:             //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
  2224:             //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
  2225:             //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
  2226:           case 0b0110_101_110:
  2227:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2228:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2229:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2230:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2231:             //BMI.S <label>                                   |-|01----|-|-*---|-----|          |0110_101_111_sss_sss
  2232:             //BNPL.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
  2233:             //JBMI.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
  2234:             //JBNPL.S <label>                                 |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
  2235:           case 0b0110_101_111:
  2236:             irpBmis ();
  2237:             break irpSwitch;
  2238: 
  2239:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2240:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2241:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2242:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2243:             //BGE.W <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}
  2244:             //BNLT.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
  2245:             //JBGE.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
  2246:             //JBNLT.W <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
  2247:             //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)
  2248:             //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
  2249:             //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
  2250:             //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
  2251:             //JBLT.L <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_110-0100111011111001-{address}      [BGE.S (*)+8;JMP <label>]
  2252:             //JBNGE.L <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_000_110-0100111011111001-{address}      [BGE.S (*)+8;JMP <label>]
  2253:           case 0b0110_110_000:
  2254:             irpBgesw ();
  2255:             break irpSwitch;
  2256: 
  2257:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2258:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2259:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2260:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2261:             //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_001_sss_sss
  2262:             //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
  2263:             //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
  2264:             //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
  2265:           case 0b0110_110_001:
  2266:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2267:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2268:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2269:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2270:             //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_010_sss_sss
  2271:             //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
  2272:             //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
  2273:             //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
  2274:           case 0b0110_110_010:
  2275:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2276:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2277:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2278:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2279:             //BGE.S <label>                                   |-|01----|-|-*-*-|-----|          |0110_110_011_sss_sss
  2280:             //BNLT.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
  2281:             //JBGE.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
  2282:             //JBNLT.S <label>                                 |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
  2283:           case 0b0110_110_011:
  2284:             irpBges ();
  2285:             break irpSwitch;
  2286: 
  2287:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2288:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2289:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2290:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2291:             //BLT.W <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}
  2292:             //BNGE.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
  2293:             //JBLT.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
  2294:             //JBNGE.W <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
  2295:             //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)
  2296:             //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
  2297:             //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
  2298:             //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
  2299:             //JBGE.L <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_110-0100111011111001-{address}      [BLT.S (*)+8;JMP <label>]
  2300:             //JBNLT.L <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_000_110-0100111011111001-{address}      [BLT.S (*)+8;JMP <label>]
  2301:           case 0b0110_110_100:
  2302:             irpBltsw ();
  2303:             break irpSwitch;
  2304: 
  2305:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2306:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2307:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2308:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2309:             //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_101_sss_sss
  2310:             //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
  2311:             //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
  2312:             //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
  2313:           case 0b0110_110_101:
  2314:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2315:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2316:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2317:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2318:             //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_110_sss_sss
  2319:             //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
  2320:             //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
  2321:             //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
  2322:           case 0b0110_110_110:
  2323:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2324:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2325:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2326:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2327:             //BLT.S <label>                                   |-|01----|-|-*-*-|-----|          |0110_110_111_sss_sss
  2328:             //BNGE.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
  2329:             //JBLT.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
  2330:             //JBNGE.S <label>                                 |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
  2331:           case 0b0110_110_111:
  2332:             irpBlts ();
  2333:             break irpSwitch;
  2334: 
  2335:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2336:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2337:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2338:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2339:             //BGT.W <label>                                   |-|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}
  2340:             //BNLE.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
  2341:             //JBGT.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
  2342:             //JBNLE.W <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
  2343:             //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)
  2344:             //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
  2345:             //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
  2346:             //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
  2347:             //JBLE.L <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_110-0100111011111001-{address}      [BGT.S (*)+8;JMP <label>]
  2348:             //JBNGT.L <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_000_110-0100111011111001-{address}      [BGT.S (*)+8;JMP <label>]
  2349:           case 0b0110_111_000:
  2350:             irpBgtsw ();
  2351:             break irpSwitch;
  2352: 
  2353:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2354:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2355:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2356:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2357:             //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_001_sss_sss
  2358:             //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
  2359:             //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
  2360:             //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
  2361:           case 0b0110_111_001:
  2362:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2363:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2364:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2365:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2366:             //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_010_sss_sss
  2367:             //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
  2368:             //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
  2369:             //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
  2370:           case 0b0110_111_010:
  2371:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2372:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2373:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2374:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2375:             //BGT.S <label>                                   |-|01----|-|-***-|-----|          |0110_111_011_sss_sss
  2376:             //BNLE.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
  2377:             //JBGT.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
  2378:             //JBNLE.S <label>                                 |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
  2379:           case 0b0110_111_011:
  2380:             irpBgts ();
  2381:             break irpSwitch;
  2382: 
  2383:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2384:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2385:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2386:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2387:             //BLE.W <label>                                   |-|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}
  2388:             //BNGT.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
  2389:             //JBLE.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
  2390:             //JBNGT.W <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
  2391:             //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)
  2392:             //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
  2393:             //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
  2394:             //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
  2395:             //JBGT.L <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_110-0100111011111001-{address}      [BLE.S (*)+8;JMP <label>]
  2396:             //JBNLE.L <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_000_110-0100111011111001-{address}      [BLE.S (*)+8;JMP <label>]
  2397:           case 0b0110_111_100:
  2398:             irpBlesw ();
  2399:             break irpSwitch;
  2400: 
  2401:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2402:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2403:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2404:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2405:             //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_101_sss_sss
  2406:             //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
  2407:             //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
  2408:             //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
  2409:           case 0b0110_111_101:
  2410:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2411:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2412:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2413:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2414:             //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_110_sss_sss
  2415:             //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
  2416:             //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
  2417:             //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
  2418:           case 0b0110_111_110:
  2419:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2420:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2421:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2422:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2423:             //BLE.S <label>                                   |-|01----|-|-***-|-----|          |0110_111_111_sss_sss
  2424:             //BNGT.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
  2425:             //JBLE.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
  2426:             //JBNGT.S <label>                                 |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
  2427:           case 0b0110_111_111:
  2428:             irpBles ();
  2429:             break irpSwitch;
  2430: 
  2431:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2432:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2433:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2434:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2435:             //IOCS <name>                                     |A|012346|-|UUUUU|UUUUU|          |0111_000_0dd_ddd_ddd-0100111001001111        [MOVEQ.L #<data>,D0;TRAP #15]
  2436:             //MOVEQ.L #<data>,Dq                              |-|012346|-|-UUUU|-**00|          |0111_qqq_0dd_ddd_ddd
  2437:           case 0b0111_000_000:
  2438:           case 0b0111_000_001:
  2439:           case 0b0111_000_010:
  2440:           case 0b0111_000_011:
  2441:           case 0b0111_001_000:
  2442:           case 0b0111_001_001:
  2443:           case 0b0111_001_010:
  2444:           case 0b0111_001_011:
  2445:           case 0b0111_010_000:
  2446:           case 0b0111_010_001:
  2447:           case 0b0111_010_010:
  2448:           case 0b0111_010_011:
  2449:           case 0b0111_011_000:
  2450:           case 0b0111_011_001:
  2451:           case 0b0111_011_010:
  2452:           case 0b0111_011_011:
  2453:           case 0b0111_100_000:
  2454:           case 0b0111_100_001:
  2455:           case 0b0111_100_010:
  2456:           case 0b0111_100_011:
  2457:           case 0b0111_101_000:
  2458:           case 0b0111_101_001:
  2459:           case 0b0111_101_010:
  2460:           case 0b0111_101_011:
  2461:           case 0b0111_110_000:
  2462:           case 0b0111_110_001:
  2463:           case 0b0111_110_010:
  2464:           case 0b0111_110_011:
  2465:           case 0b0111_111_000:
  2466:           case 0b0111_111_001:
  2467:           case 0b0111_111_010:
  2468:           case 0b0111_111_011:
  2469:             irpMoveq ();
  2470:             break irpSwitch;
  2471: 
  2472:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2473:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2474:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2475:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2476:             //MVS.B <ea>,Dq                                   |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B)
  2477:           case 0b0111_000_100:
  2478:           case 0b0111_001_100:
  2479:           case 0b0111_010_100:
  2480:           case 0b0111_011_100:
  2481:           case 0b0111_100_100:
  2482:           case 0b0111_101_100:
  2483:           case 0b0111_110_100:
  2484:           case 0b0111_111_100:
  2485:             irpMvsByte ();
  2486:             break irpSwitch;
  2487: 
  2488:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2489:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2490:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2491:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2492:             //MVS.W <ea>,Dq                                   |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B)
  2493:           case 0b0111_000_101:
  2494:           case 0b0111_001_101:
  2495:           case 0b0111_010_101:
  2496:           case 0b0111_011_101:
  2497:           case 0b0111_100_101:
  2498:           case 0b0111_101_101:
  2499:           case 0b0111_110_101:
  2500:           case 0b0111_111_101:
  2501:             irpMvsWord ();
  2502:             break irpSwitch;
  2503: 
  2504:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2505:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2506:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2507:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2508:             //MVZ.B <ea>,Dq                                   |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B)
  2509:           case 0b0111_000_110:
  2510:           case 0b0111_001_110:
  2511:           case 0b0111_010_110:
  2512:           case 0b0111_011_110:
  2513:           case 0b0111_100_110:
  2514:           case 0b0111_101_110:
  2515:           case 0b0111_110_110:
  2516:           case 0b0111_111_110:
  2517:             irpMvzByte ();
  2518:             break irpSwitch;
  2519: 
  2520:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2521:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2522:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2523:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2524:             //MVZ.W <ea>,Dq                                   |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B)
  2525:           case 0b0111_000_111:
  2526:           case 0b0111_001_111:
  2527:           case 0b0111_010_111:
  2528:           case 0b0111_011_111:
  2529:           case 0b0111_100_111:
  2530:           case 0b0111_101_111:
  2531:           case 0b0111_110_111:
  2532:           case 0b0111_111_111:
  2533:             irpMvzWord ();
  2534:             break irpSwitch;
  2535: 
  2536:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2537:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2538:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2539:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2540:             //OR.B <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr
  2541:           case 0b1000_000_000:
  2542:           case 0b1000_001_000:
  2543:           case 0b1000_010_000:
  2544:           case 0b1000_011_000:
  2545:           case 0b1000_100_000:
  2546:           case 0b1000_101_000:
  2547:           case 0b1000_110_000:
  2548:           case 0b1000_111_000:
  2549:             irpOrToRegByte ();
  2550:             break irpSwitch;
  2551: 
  2552:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2553:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2554:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2555:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2556:             //OR.W <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr
  2557:           case 0b1000_000_001:
  2558:           case 0b1000_001_001:
  2559:           case 0b1000_010_001:
  2560:           case 0b1000_011_001:
  2561:           case 0b1000_100_001:
  2562:           case 0b1000_101_001:
  2563:           case 0b1000_110_001:
  2564:           case 0b1000_111_001:
  2565:             irpOrToRegWord ();
  2566:             break irpSwitch;
  2567: 
  2568:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2569:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2570:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2571:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2572:             //OR.L <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr
  2573:           case 0b1000_000_010:
  2574:           case 0b1000_001_010:
  2575:           case 0b1000_010_010:
  2576:           case 0b1000_011_010:
  2577:           case 0b1000_100_010:
  2578:           case 0b1000_101_010:
  2579:           case 0b1000_110_010:
  2580:           case 0b1000_111_010:
  2581:             irpOrToRegLong ();
  2582:             break irpSwitch;
  2583: 
  2584:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2585:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2586:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2587:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2588:             //DIVU.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr
  2589:           case 0b1000_000_011:
  2590:           case 0b1000_001_011:
  2591:           case 0b1000_010_011:
  2592:           case 0b1000_011_011:
  2593:           case 0b1000_100_011:
  2594:           case 0b1000_101_011:
  2595:           case 0b1000_110_011:
  2596:           case 0b1000_111_011:
  2597:             irpDivuWord ();
  2598:             break irpSwitch;
  2599: 
  2600:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2601:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2602:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2603:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2604:             //SBCD.B Dr,Dq                                    |-|012346|-|UUUUU|*U*U*|          |1000_qqq_100_000_rrr
  2605:             //SBCD.B -(Ar),-(Aq)                              |-|012346|-|UUUUU|*U*U*|          |1000_qqq_100_001_rrr
  2606:             //OR.B Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_100_mmm_rrr
  2607:           case 0b1000_000_100:
  2608:           case 0b1000_001_100:
  2609:           case 0b1000_010_100:
  2610:           case 0b1000_011_100:
  2611:           case 0b1000_100_100:
  2612:           case 0b1000_101_100:
  2613:           case 0b1000_110_100:
  2614:           case 0b1000_111_100:
  2615:             irpOrToMemByte ();
  2616:             break irpSwitch;
  2617: 
  2618:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2619:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2620:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2621:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2622:             //OR.W Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_101_mmm_rrr
  2623:           case 0b1000_000_101:
  2624:           case 0b1000_001_101:
  2625:           case 0b1000_010_101:
  2626:           case 0b1000_011_101:
  2627:           case 0b1000_100_101:
  2628:           case 0b1000_101_101:
  2629:           case 0b1000_110_101:
  2630:           case 0b1000_111_101:
  2631:             irpOrToMemWord ();
  2632:             break irpSwitch;
  2633: 
  2634:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2635:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2636:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2637:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2638:             //OR.L Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_110_mmm_rrr
  2639:           case 0b1000_000_110:
  2640:           case 0b1000_001_110:
  2641:           case 0b1000_010_110:
  2642:           case 0b1000_011_110:
  2643:           case 0b1000_100_110:
  2644:           case 0b1000_101_110:
  2645:           case 0b1000_110_110:
  2646:           case 0b1000_111_110:
  2647:             irpOrToMemLong ();
  2648:             break irpSwitch;
  2649: 
  2650:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2651:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2652:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2653:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2654:             //DIVS.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr
  2655:           case 0b1000_000_111:
  2656:           case 0b1000_001_111:
  2657:           case 0b1000_010_111:
  2658:           case 0b1000_011_111:
  2659:           case 0b1000_100_111:
  2660:           case 0b1000_101_111:
  2661:           case 0b1000_110_111:
  2662:           case 0b1000_111_111:
  2663:             irpDivsWord ();
  2664:             break irpSwitch;
  2665: 
  2666:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2667:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2668:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2669:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2670:             //SUB.B <ea>,Dq                                   |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr
  2671:           case 0b1001_000_000:
  2672:           case 0b1001_001_000:
  2673:           case 0b1001_010_000:
  2674:           case 0b1001_011_000:
  2675:           case 0b1001_100_000:
  2676:           case 0b1001_101_000:
  2677:           case 0b1001_110_000:
  2678:           case 0b1001_111_000:
  2679:             irpSubToRegByte ();
  2680:             break irpSwitch;
  2681: 
  2682:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2683:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2684:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2685:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2686:             //SUB.W <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr
  2687:           case 0b1001_000_001:
  2688:           case 0b1001_001_001:
  2689:           case 0b1001_010_001:
  2690:           case 0b1001_011_001:
  2691:           case 0b1001_100_001:
  2692:           case 0b1001_101_001:
  2693:           case 0b1001_110_001:
  2694:           case 0b1001_111_001:
  2695:             irpSubToRegWord ();
  2696:             break irpSwitch;
  2697: 
  2698:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2699:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2700:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2701:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2702:             //SUB.L <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr
  2703:           case 0b1001_000_010:
  2704:           case 0b1001_001_010:
  2705:           case 0b1001_010_010:
  2706:           case 0b1001_011_010:
  2707:           case 0b1001_100_010:
  2708:           case 0b1001_101_010:
  2709:           case 0b1001_110_010:
  2710:           case 0b1001_111_010:
  2711:             irpSubToRegLong ();
  2712:             break irpSwitch;
  2713: 
  2714:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2715:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2716:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2717:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2718:             //SUBA.W <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr
  2719:             //SUB.W <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq]
  2720:             //CLR.W Ar                                        |A|012346|-|-----|-----| A        |1001_rrr_011_001_rrr [SUBA.W Ar,Ar]
  2721:           case 0b1001_000_011:
  2722:           case 0b1001_001_011:
  2723:           case 0b1001_010_011:
  2724:           case 0b1001_011_011:
  2725:           case 0b1001_100_011:
  2726:           case 0b1001_101_011:
  2727:           case 0b1001_110_011:
  2728:           case 0b1001_111_011:
  2729:             irpSubaWord ();
  2730:             break irpSwitch;
  2731: 
  2732:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2733:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2734:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2735:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2736:             //SUBX.B Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_100_000_rrr
  2737:             //SUBX.B -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_100_001_rrr
  2738:             //SUB.B Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_100_mmm_rrr
  2739:           case 0b1001_000_100:
  2740:           case 0b1001_001_100:
  2741:           case 0b1001_010_100:
  2742:           case 0b1001_011_100:
  2743:           case 0b1001_100_100:
  2744:           case 0b1001_101_100:
  2745:           case 0b1001_110_100:
  2746:           case 0b1001_111_100:
  2747:             irpSubToMemByte ();
  2748:             break irpSwitch;
  2749: 
  2750:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2751:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2752:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2753:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2754:             //SUBX.W Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_101_000_rrr
  2755:             //SUBX.W -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_101_001_rrr
  2756:             //SUB.W Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_101_mmm_rrr
  2757:           case 0b1001_000_101:
  2758:           case 0b1001_001_101:
  2759:           case 0b1001_010_101:
  2760:           case 0b1001_011_101:
  2761:           case 0b1001_100_101:
  2762:           case 0b1001_101_101:
  2763:           case 0b1001_110_101:
  2764:           case 0b1001_111_101:
  2765:             irpSubToMemWord ();
  2766:             break irpSwitch;
  2767: 
  2768:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2769:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2770:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2771:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2772:             //SUBX.L Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_110_000_rrr
  2773:             //SUBX.L -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_110_001_rrr
  2774:             //SUB.L Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_110_mmm_rrr
  2775:           case 0b1001_000_110:
  2776:           case 0b1001_001_110:
  2777:           case 0b1001_010_110:
  2778:           case 0b1001_011_110:
  2779:           case 0b1001_100_110:
  2780:           case 0b1001_101_110:
  2781:           case 0b1001_110_110:
  2782:           case 0b1001_111_110:
  2783:             irpSubToMemLong ();
  2784:             break irpSwitch;
  2785: 
  2786:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2787:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2788:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2789:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2790:             //SUBA.L <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr
  2791:             //SUB.L <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq]
  2792:             //CLR.L Ar                                        |A|012346|-|-----|-----| A        |1001_rrr_111_001_rrr [SUBA.L Ar,Ar]
  2793:           case 0b1001_000_111:
  2794:           case 0b1001_001_111:
  2795:           case 0b1001_010_111:
  2796:           case 0b1001_011_111:
  2797:           case 0b1001_100_111:
  2798:           case 0b1001_101_111:
  2799:           case 0b1001_110_111:
  2800:           case 0b1001_111_111:
  2801:             irpSubaLong ();
  2802:             break irpSwitch;
  2803: 
  2804:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2805:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2806:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2807:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2808:             //SXCALL <name>                                   |A|012346|-|UUUUU|*****|          |1010_0dd_ddd_ddd_ddd [ALINE #<data>]
  2809:           case 0b1010_000_000:
  2810:           case 0b1010_000_001:
  2811:           case 0b1010_000_010:
  2812:           case 0b1010_000_011:
  2813:           case 0b1010_000_100:
  2814:           case 0b1010_000_101:
  2815:           case 0b1010_000_110:
  2816:           case 0b1010_000_111:
  2817:           case 0b1010_001_000:
  2818:           case 0b1010_001_001:
  2819:           case 0b1010_001_010:
  2820:           case 0b1010_001_011:
  2821:           case 0b1010_001_100:
  2822:           case 0b1010_001_101:
  2823:           case 0b1010_001_110:
  2824:           case 0b1010_001_111:
  2825:           case 0b1010_010_000:
  2826:           case 0b1010_010_001:
  2827:           case 0b1010_010_010:
  2828:           case 0b1010_010_011:
  2829:           case 0b1010_010_100:
  2830:           case 0b1010_010_101:
  2831:           case 0b1010_010_110:
  2832:           case 0b1010_010_111:
  2833:           case 0b1010_011_000:
  2834:           case 0b1010_011_001:
  2835:           case 0b1010_011_010:
  2836:           case 0b1010_011_011:
  2837:           case 0b1010_011_100:
  2838:           case 0b1010_011_101:
  2839:           case 0b1010_011_110:
  2840:           case 0b1010_011_111:
  2841:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2842:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2843:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2844:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2845:             //ALINE #<data>                                   |-|012346|-|UUUUU|*****|          |1010_ddd_ddd_ddd_ddd (line 1010 emulator)
  2846:           case 0b1010_100_000:
  2847:           case 0b1010_100_001:
  2848:           case 0b1010_100_010:
  2849:           case 0b1010_100_011:
  2850:           case 0b1010_100_100:
  2851:           case 0b1010_100_101:
  2852:           case 0b1010_100_110:
  2853:           case 0b1010_100_111:
  2854:           case 0b1010_101_000:
  2855:           case 0b1010_101_001:
  2856:           case 0b1010_101_010:
  2857:           case 0b1010_101_011:
  2858:           case 0b1010_101_100:
  2859:           case 0b1010_101_101:
  2860:           case 0b1010_101_110:
  2861:           case 0b1010_101_111:
  2862:           case 0b1010_110_000:
  2863:           case 0b1010_110_001:
  2864:           case 0b1010_110_010:
  2865:           case 0b1010_110_011:
  2866:           case 0b1010_110_100:
  2867:           case 0b1010_110_101:
  2868:           case 0b1010_110_110:
  2869:           case 0b1010_110_111:
  2870:           case 0b1010_111_000:
  2871:           case 0b1010_111_001:
  2872:           case 0b1010_111_010:
  2873:           case 0b1010_111_011:
  2874:           case 0b1010_111_100:
  2875:           case 0b1010_111_101:
  2876:           case 0b1010_111_110:
  2877:           case 0b1010_111_111:
  2878:             irpAline ();
  2879:             break irpSwitch;
  2880: 
  2881:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2882:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2883:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2884:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2885:             //CMP.B <ea>,Dq                                   |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr
  2886:           case 0b1011_000_000:
  2887:           case 0b1011_001_000:
  2888:           case 0b1011_010_000:
  2889:           case 0b1011_011_000:
  2890:           case 0b1011_100_000:
  2891:           case 0b1011_101_000:
  2892:           case 0b1011_110_000:
  2893:           case 0b1011_111_000:
  2894:             irpCmpByte ();
  2895:             break irpSwitch;
  2896: 
  2897:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2898:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2899:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2900:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2901:             //CMP.W <ea>,Dq                                   |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr
  2902:           case 0b1011_000_001:
  2903:           case 0b1011_001_001:
  2904:           case 0b1011_010_001:
  2905:           case 0b1011_011_001:
  2906:           case 0b1011_100_001:
  2907:           case 0b1011_101_001:
  2908:           case 0b1011_110_001:
  2909:           case 0b1011_111_001:
  2910:             irpCmpWord ();
  2911:             break irpSwitch;
  2912: 
  2913:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2914:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2915:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2916:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2917:             //CMP.L <ea>,Dq                                   |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr
  2918:           case 0b1011_000_010:
  2919:           case 0b1011_001_010:
  2920:           case 0b1011_010_010:
  2921:           case 0b1011_011_010:
  2922:           case 0b1011_100_010:
  2923:           case 0b1011_101_010:
  2924:           case 0b1011_110_010:
  2925:           case 0b1011_111_010:
  2926:             irpCmpLong ();
  2927:             break irpSwitch;
  2928: 
  2929:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2930:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2931:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2932:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2933:             //CMPA.W <ea>,Aq                                  |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr
  2934:             //CMP.W <ea>,Aq                                   |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq]
  2935:           case 0b1011_000_011:
  2936:           case 0b1011_001_011:
  2937:           case 0b1011_010_011:
  2938:           case 0b1011_011_011:
  2939:           case 0b1011_100_011:
  2940:           case 0b1011_101_011:
  2941:           case 0b1011_110_011:
  2942:           case 0b1011_111_011:
  2943:             irpCmpaWord ();
  2944:             break irpSwitch;
  2945: 
  2946:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2947:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2948:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2949:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2950:             //EOR.B Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_100_mmm_rrr
  2951:             //CMPM.B (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_100_001_rrr
  2952:           case 0b1011_000_100:
  2953:           case 0b1011_001_100:
  2954:           case 0b1011_010_100:
  2955:           case 0b1011_011_100:
  2956:           case 0b1011_100_100:
  2957:           case 0b1011_101_100:
  2958:           case 0b1011_110_100:
  2959:           case 0b1011_111_100:
  2960:             irpEorByte ();
  2961:             break irpSwitch;
  2962: 
  2963:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2964:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2965:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2966:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2967:             //EOR.W Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_101_mmm_rrr
  2968:             //CMPM.W (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_101_001_rrr
  2969:           case 0b1011_000_101:
  2970:           case 0b1011_001_101:
  2971:           case 0b1011_010_101:
  2972:           case 0b1011_011_101:
  2973:           case 0b1011_100_101:
  2974:           case 0b1011_101_101:
  2975:           case 0b1011_110_101:
  2976:           case 0b1011_111_101:
  2977:             irpEorWord ();
  2978:             break irpSwitch;
  2979: 
  2980:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2981:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2982:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  2983:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2984:             //EOR.L Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_110_mmm_rrr
  2985:             //CMPM.L (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_110_001_rrr
  2986:           case 0b1011_000_110:
  2987:           case 0b1011_001_110:
  2988:           case 0b1011_010_110:
  2989:           case 0b1011_011_110:
  2990:           case 0b1011_100_110:
  2991:           case 0b1011_101_110:
  2992:           case 0b1011_110_110:
  2993:           case 0b1011_111_110:
  2994:             irpEorLong ();
  2995:             break irpSwitch;
  2996: 
  2997:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  2998:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  2999:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3000:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3001:             //CMPA.L <ea>,Aq                                  |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr
  3002:             //CMP.L <ea>,Aq                                   |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq]
  3003:           case 0b1011_000_111:
  3004:           case 0b1011_001_111:
  3005:           case 0b1011_010_111:
  3006:           case 0b1011_011_111:
  3007:           case 0b1011_100_111:
  3008:           case 0b1011_101_111:
  3009:           case 0b1011_110_111:
  3010:           case 0b1011_111_111:
  3011:             irpCmpaLong ();
  3012:             break irpSwitch;
  3013: 
  3014:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3015:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3016:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3017:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3018:             //AND.B <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr
  3019:           case 0b1100_000_000:
  3020:           case 0b1100_001_000:
  3021:           case 0b1100_010_000:
  3022:           case 0b1100_011_000:
  3023:           case 0b1100_100_000:
  3024:           case 0b1100_101_000:
  3025:           case 0b1100_110_000:
  3026:           case 0b1100_111_000:
  3027:             irpAndToRegByte ();
  3028:             break irpSwitch;
  3029: 
  3030:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3031:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3032:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3033:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3034:             //AND.W <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr
  3035:           case 0b1100_000_001:
  3036:           case 0b1100_001_001:
  3037:           case 0b1100_010_001:
  3038:           case 0b1100_011_001:
  3039:           case 0b1100_100_001:
  3040:           case 0b1100_101_001:
  3041:           case 0b1100_110_001:
  3042:           case 0b1100_111_001:
  3043:             irpAndToRegWord ();
  3044:             break irpSwitch;
  3045: 
  3046:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3047:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3048:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3049:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3050:             //AND.L <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr
  3051:           case 0b1100_000_010:
  3052:           case 0b1100_001_010:
  3053:           case 0b1100_010_010:
  3054:           case 0b1100_011_010:
  3055:           case 0b1100_100_010:
  3056:           case 0b1100_101_010:
  3057:           case 0b1100_110_010:
  3058:           case 0b1100_111_010:
  3059:             irpAndToRegLong ();
  3060:             break irpSwitch;
  3061: 
  3062:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3063:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3064:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3065:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3066:             //MULU.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr
  3067:           case 0b1100_000_011:
  3068:           case 0b1100_001_011:
  3069:           case 0b1100_010_011:
  3070:           case 0b1100_011_011:
  3071:           case 0b1100_100_011:
  3072:           case 0b1100_101_011:
  3073:           case 0b1100_110_011:
  3074:           case 0b1100_111_011:
  3075:             irpMuluWord ();
  3076:             break irpSwitch;
  3077: 
  3078:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3079:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3080:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3081:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3082:             //ABCD.B Dr,Dq                                    |-|012346|-|UUUUU|*U*U*|          |1100_qqq_100_000_rrr
  3083:             //ABCD.B -(Ar),-(Aq)                              |-|012346|-|UUUUU|*U*U*|          |1100_qqq_100_001_rrr
  3084:             //AND.B Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_100_mmm_rrr
  3085:           case 0b1100_000_100:
  3086:           case 0b1100_001_100:
  3087:           case 0b1100_010_100:
  3088:           case 0b1100_011_100:
  3089:           case 0b1100_100_100:
  3090:           case 0b1100_101_100:
  3091:           case 0b1100_110_100:
  3092:           case 0b1100_111_100:
  3093:             irpAndToMemByte ();
  3094:             break irpSwitch;
  3095: 
  3096:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3097:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3098:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3099:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3100:             //EXG.L Dq,Dr                                     |-|012346|-|-----|-----|          |1100_qqq_101_000_rrr
  3101:             //EXG.L Aq,Ar                                     |-|012346|-|-----|-----|          |1100_qqq_101_001_rrr
  3102:             //AND.W Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_101_mmm_rrr
  3103:           case 0b1100_000_101:
  3104:           case 0b1100_001_101:
  3105:           case 0b1100_010_101:
  3106:           case 0b1100_011_101:
  3107:           case 0b1100_100_101:
  3108:           case 0b1100_101_101:
  3109:           case 0b1100_110_101:
  3110:           case 0b1100_111_101:
  3111:             irpAndToMemWord ();
  3112:             break irpSwitch;
  3113: 
  3114:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3115:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3116:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3117:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3118:             //EXG.L Dq,Ar                                     |-|012346|-|-----|-----|          |1100_qqq_110_001_rrr
  3119:             //AND.L Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_110_mmm_rrr
  3120:           case 0b1100_000_110:
  3121:           case 0b1100_001_110:
  3122:           case 0b1100_010_110:
  3123:           case 0b1100_011_110:
  3124:           case 0b1100_100_110:
  3125:           case 0b1100_101_110:
  3126:           case 0b1100_110_110:
  3127:           case 0b1100_111_110:
  3128:             irpAndToMemLong ();
  3129:             break irpSwitch;
  3130: 
  3131:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3132:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3133:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3134:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3135:             //MULS.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr
  3136:           case 0b1100_000_111:
  3137:           case 0b1100_001_111:
  3138:           case 0b1100_010_111:
  3139:           case 0b1100_011_111:
  3140:           case 0b1100_100_111:
  3141:           case 0b1100_101_111:
  3142:           case 0b1100_110_111:
  3143:           case 0b1100_111_111:
  3144:             irpMulsWord ();
  3145:             break irpSwitch;
  3146: 
  3147:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3148:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3149:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3150:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3151:             //ADD.B <ea>,Dq                                   |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr
  3152:           case 0b1101_000_000:
  3153:           case 0b1101_001_000:
  3154:           case 0b1101_010_000:
  3155:           case 0b1101_011_000:
  3156:           case 0b1101_100_000:
  3157:           case 0b1101_101_000:
  3158:           case 0b1101_110_000:
  3159:           case 0b1101_111_000:
  3160:             irpAddToRegByte ();
  3161:             break irpSwitch;
  3162: 
  3163:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3164:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3165:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3166:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3167:             //ADD.W <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr
  3168:           case 0b1101_000_001:
  3169:           case 0b1101_001_001:
  3170:           case 0b1101_010_001:
  3171:           case 0b1101_011_001:
  3172:           case 0b1101_100_001:
  3173:           case 0b1101_101_001:
  3174:           case 0b1101_110_001:
  3175:           case 0b1101_111_001:
  3176:             irpAddToRegWord ();
  3177:             break irpSwitch;
  3178: 
  3179:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3180:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3181:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3182:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3183:             //ADD.L <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr
  3184:           case 0b1101_000_010:
  3185:           case 0b1101_001_010:
  3186:           case 0b1101_010_010:
  3187:           case 0b1101_011_010:
  3188:           case 0b1101_100_010:
  3189:           case 0b1101_101_010:
  3190:           case 0b1101_110_010:
  3191:           case 0b1101_111_010:
  3192:             irpAddToRegLong ();
  3193:             break irpSwitch;
  3194: 
  3195:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3196:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3197:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3198:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3199:             //ADDA.W <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr
  3200:             //ADD.W <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq]
  3201:           case 0b1101_000_011:
  3202:           case 0b1101_001_011:
  3203:           case 0b1101_010_011:
  3204:           case 0b1101_011_011:
  3205:           case 0b1101_100_011:
  3206:           case 0b1101_101_011:
  3207:           case 0b1101_110_011:
  3208:           case 0b1101_111_011:
  3209:             irpAddaWord ();
  3210:             break irpSwitch;
  3211: 
  3212:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3213:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3214:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3215:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3216:             //ADDX.B Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_100_000_rrr
  3217:             //ADDX.B -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_100_001_rrr
  3218:             //ADD.B Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_100_mmm_rrr
  3219:           case 0b1101_000_100:
  3220:           case 0b1101_001_100:
  3221:           case 0b1101_010_100:
  3222:           case 0b1101_011_100:
  3223:           case 0b1101_100_100:
  3224:           case 0b1101_101_100:
  3225:           case 0b1101_110_100:
  3226:           case 0b1101_111_100:
  3227:             irpAddToMemByte ();
  3228:             break irpSwitch;
  3229: 
  3230:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3231:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3232:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3233:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3234:             //ADDX.W Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_101_000_rrr
  3235:             //ADDX.W -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_101_001_rrr
  3236:             //ADD.W Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_101_mmm_rrr
  3237:           case 0b1101_000_101:
  3238:           case 0b1101_001_101:
  3239:           case 0b1101_010_101:
  3240:           case 0b1101_011_101:
  3241:           case 0b1101_100_101:
  3242:           case 0b1101_101_101:
  3243:           case 0b1101_110_101:
  3244:           case 0b1101_111_101:
  3245:             irpAddToMemWord ();
  3246:             break irpSwitch;
  3247: 
  3248:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3249:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3250:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3251:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3252:             //ADDX.L Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_110_000_rrr
  3253:             //ADDX.L -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_110_001_rrr
  3254:             //ADD.L Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_110_mmm_rrr
  3255:           case 0b1101_000_110:
  3256:           case 0b1101_001_110:
  3257:           case 0b1101_010_110:
  3258:           case 0b1101_011_110:
  3259:           case 0b1101_100_110:
  3260:           case 0b1101_101_110:
  3261:           case 0b1101_110_110:
  3262:           case 0b1101_111_110:
  3263:             irpAddToMemLong ();
  3264:             break irpSwitch;
  3265: 
  3266:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3267:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3268:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3269:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3270:             //ADDA.L <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr
  3271:             //ADD.L <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq]
  3272:           case 0b1101_000_111:
  3273:           case 0b1101_001_111:
  3274:           case 0b1101_010_111:
  3275:           case 0b1101_011_111:
  3276:           case 0b1101_100_111:
  3277:           case 0b1101_101_111:
  3278:           case 0b1101_110_111:
  3279:           case 0b1101_111_111:
  3280:             irpAddaLong ();
  3281:             break irpSwitch;
  3282: 
  3283:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3284:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3285:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3286:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3287:             //ASR.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_000_000_rrr
  3288:             //LSR.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_000_001_rrr
  3289:             //ROXR.B #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_000_010_rrr
  3290:             //ROR.B #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_000_011_rrr
  3291:             //ASR.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_000_100_rrr
  3292:             //LSR.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_000_101_rrr
  3293:             //ROXR.B Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_000_110_rrr
  3294:             //ROR.B Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_000_111_rrr
  3295:             //ASR.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_000_000_rrr [ASR.B #1,Dr]
  3296:             //LSR.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_000_001_rrr [LSR.B #1,Dr]
  3297:             //ROXR.B Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_000_010_rrr [ROXR.B #1,Dr]
  3298:             //ROR.B Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_000_011_rrr [ROR.B #1,Dr]
  3299:           case 0b1110_000_000:
  3300:           case 0b1110_001_000:
  3301:           case 0b1110_010_000:
  3302:           case 0b1110_011_000:
  3303:           case 0b1110_100_000:
  3304:           case 0b1110_101_000:
  3305:           case 0b1110_110_000:
  3306:           case 0b1110_111_000:
  3307:             irpXxrToRegByte ();
  3308:             break irpSwitch;
  3309: 
  3310:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3311:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3312:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3313:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3314:             //ASR.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_001_000_rrr
  3315:             //LSR.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_001_001_rrr
  3316:             //ROXR.W #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_001_010_rrr
  3317:             //ROR.W #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_001_011_rrr
  3318:             //ASR.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_001_100_rrr
  3319:             //LSR.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_001_101_rrr
  3320:             //ROXR.W Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_001_110_rrr
  3321:             //ROR.W Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_001_111_rrr
  3322:             //ASR.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_001_000_rrr [ASR.W #1,Dr]
  3323:             //LSR.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_001_001_rrr [LSR.W #1,Dr]
  3324:             //ROXR.W Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_001_010_rrr [ROXR.W #1,Dr]
  3325:             //ROR.W Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_001_011_rrr [ROR.W #1,Dr]
  3326:           case 0b1110_000_001:
  3327:           case 0b1110_001_001:
  3328:           case 0b1110_010_001:
  3329:           case 0b1110_011_001:
  3330:           case 0b1110_100_001:
  3331:           case 0b1110_101_001:
  3332:           case 0b1110_110_001:
  3333:           case 0b1110_111_001:
  3334:             irpXxrToRegWord ();
  3335:             break irpSwitch;
  3336: 
  3337:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3338:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3339:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3340:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3341:             //ASR.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_010_000_rrr
  3342:             //LSR.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_010_001_rrr
  3343:             //ROXR.L #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_010_010_rrr
  3344:             //ROR.L #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_010_011_rrr
  3345:             //ASR.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_010_100_rrr
  3346:             //LSR.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_010_101_rrr
  3347:             //ROXR.L Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_010_110_rrr
  3348:             //ROR.L Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_010_111_rrr
  3349:             //ASR.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_010_000_rrr [ASR.L #1,Dr]
  3350:             //LSR.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_010_001_rrr [LSR.L #1,Dr]
  3351:             //ROXR.L Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_010_010_rrr [ROXR.L #1,Dr]
  3352:             //ROR.L Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_010_011_rrr [ROR.L #1,Dr]
  3353:           case 0b1110_000_010:
  3354:           case 0b1110_001_010:
  3355:           case 0b1110_010_010:
  3356:           case 0b1110_011_010:
  3357:           case 0b1110_100_010:
  3358:           case 0b1110_101_010:
  3359:           case 0b1110_110_010:
  3360:           case 0b1110_111_010:
  3361:             irpXxrToRegLong ();
  3362:             break irpSwitch;
  3363: 
  3364:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3365:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3366:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3367:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3368:             //ASR.W <ea>                                      |-|012346|-|UUUUU|***0*|  M+-WXZ  |1110_000_011_mmm_rrr
  3369:           case 0b1110_000_011:
  3370:             irpAsrToMem ();
  3371:             break irpSwitch;
  3372: 
  3373:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3374:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3375:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3376:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3377:             //ASL.B #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_100_000_rrr
  3378:             //LSL.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_100_001_rrr
  3379:             //ROXL.B #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_100_010_rrr
  3380:             //ROL.B #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_100_011_rrr
  3381:             //ASL.B Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_100_100_rrr
  3382:             //LSL.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_100_101_rrr
  3383:             //ROXL.B Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_100_110_rrr
  3384:             //ROL.B Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_100_111_rrr
  3385:             //ASL.B Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_100_000_rrr [ASL.B #1,Dr]
  3386:             //LSL.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_100_001_rrr [LSL.B #1,Dr]
  3387:             //ROXL.B Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_100_010_rrr [ROXL.B #1,Dr]
  3388:             //ROL.B Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_100_011_rrr [ROL.B #1,Dr]
  3389:           case 0b1110_000_100:
  3390:           case 0b1110_001_100:
  3391:           case 0b1110_010_100:
  3392:           case 0b1110_011_100:
  3393:           case 0b1110_100_100:
  3394:           case 0b1110_101_100:
  3395:           case 0b1110_110_100:
  3396:           case 0b1110_111_100:
  3397:             irpXxlToRegByte ();
  3398:             break irpSwitch;
  3399: 
  3400:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3401:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3402:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3403:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3404:             //ASL.W #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_101_000_rrr
  3405:             //LSL.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_101_001_rrr
  3406:             //ROXL.W #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_101_010_rrr
  3407:             //ROL.W #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_101_011_rrr
  3408:             //ASL.W Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_101_100_rrr
  3409:             //LSL.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_101_101_rrr
  3410:             //ROXL.W Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_101_110_rrr
  3411:             //ROL.W Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_101_111_rrr
  3412:             //ASL.W Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_101_000_rrr [ASL.W #1,Dr]
  3413:             //LSL.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_101_001_rrr [LSL.W #1,Dr]
  3414:             //ROXL.W Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_101_010_rrr [ROXL.W #1,Dr]
  3415:             //ROL.W Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_101_011_rrr [ROL.W #1,Dr]
  3416:           case 0b1110_000_101:
  3417:           case 0b1110_001_101:
  3418:           case 0b1110_010_101:
  3419:           case 0b1110_011_101:
  3420:           case 0b1110_100_101:
  3421:           case 0b1110_101_101:
  3422:           case 0b1110_110_101:
  3423:           case 0b1110_111_101:
  3424:             irpXxlToRegWord ();
  3425:             break irpSwitch;
  3426: 
  3427:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3428:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3429:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3430:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3431:             //ASL.L #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_110_000_rrr
  3432:             //LSL.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_110_001_rrr
  3433:             //ROXL.L #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_110_010_rrr
  3434:             //ROL.L #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_110_011_rrr
  3435:             //ASL.L Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_110_100_rrr
  3436:             //LSL.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_110_101_rrr
  3437:             //ROXL.L Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_110_110_rrr
  3438:             //ROL.L Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_110_111_rrr
  3439:             //ASL.L Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_110_000_rrr [ASL.L #1,Dr]
  3440:             //LSL.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_110_001_rrr [LSL.L #1,Dr]
  3441:             //ROXL.L Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_110_010_rrr [ROXL.L #1,Dr]
  3442:             //ROL.L Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_110_011_rrr [ROL.L #1,Dr]
  3443:           case 0b1110_000_110:
  3444:           case 0b1110_001_110:
  3445:           case 0b1110_010_110:
  3446:           case 0b1110_011_110:
  3447:           case 0b1110_100_110:
  3448:           case 0b1110_101_110:
  3449:           case 0b1110_110_110:
  3450:           case 0b1110_111_110:
  3451:             irpXxlToRegLong ();
  3452:             break irpSwitch;
  3453: 
  3454:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3455:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3456:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3457:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3458:             //ASL.W <ea>                                      |-|012346|-|UUUUU|*****|  M+-WXZ  |1110_000_111_mmm_rrr
  3459:           case 0b1110_000_111:
  3460:             irpAslToMem ();
  3461:             break irpSwitch;
  3462: 
  3463:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3464:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3465:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3466:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3467:             //LSR.W <ea>                                      |-|012346|-|UUUUU|*0*0*|  M+-WXZ  |1110_001_011_mmm_rrr
  3468:           case 0b1110_001_011:
  3469:             irpLsrToMem ();
  3470:             break irpSwitch;
  3471: 
  3472:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3473:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3474:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3475:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3476:             //LSL.W <ea>                                      |-|012346|-|UUUUU|***0*|  M+-WXZ  |1110_001_111_mmm_rrr
  3477:           case 0b1110_001_111:
  3478:             irpLslToMem ();
  3479:             break irpSwitch;
  3480: 
  3481:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3482:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3483:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3484:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3485:             //ROXR.W <ea>                                     |-|012346|-|*UUUU|***0*|  M+-WXZ  |1110_010_011_mmm_rrr
  3486:           case 0b1110_010_011:
  3487:             irpRoxrToMem ();
  3488:             break irpSwitch;
  3489: 
  3490:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3491:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3492:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3493:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3494:             //ROXL.W <ea>                                     |-|012346|-|*UUUU|***0*|  M+-WXZ  |1110_010_111_mmm_rrr
  3495:           case 0b1110_010_111:
  3496:             irpRoxlToMem ();
  3497:             break irpSwitch;
  3498: 
  3499:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3500:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3501:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3502:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3503:             //ROR.W <ea>                                      |-|012346|-|-UUUU|-**0*|  M+-WXZ  |1110_011_011_mmm_rrr
  3504:           case 0b1110_011_011:
  3505:             irpRorToMem ();
  3506:             break irpSwitch;
  3507: 
  3508:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3509:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3510:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3511:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3512:             //ROL.W <ea>                                      |-|012346|-|-UUUU|-**0*|  M+-WXZ  |1110_011_111_mmm_rrr
  3513:           case 0b1110_011_111:
  3514:             irpRolToMem ();
  3515:             break irpSwitch;
  3516: 
  3517:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3518:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3519:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3520:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3521:             //FPACK <data>                                    |A|012346|-|UUUUU|*****|          |1111_111_0dd_ddd_ddd [FLINE #<data>]
  3522:           case 0b1111_111_000:
  3523:           case 0b1111_111_001:
  3524:           case 0b1111_111_010:
  3525:           case 0b1111_111_011:
  3526:             irpFpack ();
  3527:             break irpSwitch;
  3528: 
  3529:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3530:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3531:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3532:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3533:             //DOS <data>                                      |A|012346|-|UUUUU|UUUUU|          |1111_111_1dd_ddd_ddd [FLINE #<data>]
  3534:           case 0b1111_111_100:
  3535:           case 0b1111_111_101:
  3536:           case 0b1111_111_110:
  3537:           case 0b1111_111_111:
  3538:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3539:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3540:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3541:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3542:             //FLINE #<data>                                   |-|012346|-|UUUUU|UUUUU|          |1111_ddd_ddd_ddd_ddd (line 1111 emulator)
  3543:           case 0b1111_000_000:
  3544:           case 0b1111_000_001:
  3545:           case 0b1111_000_010:
  3546:           case 0b1111_000_011:
  3547:           case 0b1111_000_100:
  3548:           case 0b1111_000_101:
  3549:           case 0b1111_000_110:
  3550:           case 0b1111_000_111:
  3551:           case 0b1111_001_000:
  3552:           case 0b1111_001_001:
  3553:           case 0b1111_001_010:
  3554:           case 0b1111_001_011:
  3555:           case 0b1111_001_100:
  3556:           case 0b1111_001_101:
  3557:           case 0b1111_001_110:
  3558:           case 0b1111_001_111:
  3559:           case 0b1111_010_000:
  3560:           case 0b1111_010_001:
  3561:           case 0b1111_010_010:
  3562:           case 0b1111_010_011:
  3563:           case 0b1111_010_100:
  3564:           case 0b1111_010_101:
  3565:           case 0b1111_010_110:
  3566:           case 0b1111_010_111:
  3567:           case 0b1111_011_000:
  3568:           case 0b1111_011_001:
  3569:           case 0b1111_011_010:
  3570:           case 0b1111_011_011:
  3571:           case 0b1111_011_100:
  3572:           case 0b1111_011_101:
  3573:           case 0b1111_011_110:
  3574:           case 0b1111_011_111:
  3575:           case 0b1111_100_000:
  3576:           case 0b1111_100_001:
  3577:           case 0b1111_100_010:
  3578:           case 0b1111_100_011:
  3579:           case 0b1111_100_100:
  3580:           case 0b1111_100_101:
  3581:           case 0b1111_100_110:
  3582:           case 0b1111_100_111:
  3583:           case 0b1111_101_000:
  3584:           case 0b1111_101_001:
  3585:           case 0b1111_101_010:
  3586:           case 0b1111_101_011:
  3587:           case 0b1111_101_100:
  3588:           case 0b1111_101_101:
  3589:           case 0b1111_101_110:
  3590:           case 0b1111_101_111:
  3591:           case 0b1111_110_000:
  3592:           case 0b1111_110_001:
  3593:           case 0b1111_110_010:
  3594:           case 0b1111_110_011:
  3595:           case 0b1111_110_100:
  3596:           case 0b1111_110_101:
  3597:           case 0b1111_110_110:
  3598:           case 0b1111_110_111:
  3599:             irpFline ();
  3600:             break irpSwitch;
  3601: 
  3602:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3603:             //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  3604:             //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  3605:             //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  3606:             //HFSBOOT                                         |-|012346|-|-----|-----|          |0100_111_000_000_000
  3607:             //HFSINST                                         |-|012346|-|-----|-----|          |0100_111_000_000_001
  3608:             //HFSSTR                                          |-|012346|-|-----|-----|          |0100_111_000_000_010
  3609:             //HFSINT                                          |-|012346|-|-----|-----|          |0100_111_000_000_011
  3610:             //EMXNOP                                          |-|012346|-|-----|-----|          |0100_111_000_000_100
  3611:           case 0b0100_111_000:
  3612:             irpEmx ();
  3613:             break;
  3614: 
  3615:           default:
  3616:             irpIllegal ();
  3617: 
  3618:           }  //switch XEiJ.regOC >>> 6
  3619: 
  3620:           //トレース例外
  3621:           //  命令実行前にsrのTビットがセットされていたとき命令実行後にトレース例外が発生する
  3622:           //  トレース例外の発動は命令の機能拡張であり、他の例外処理で命令が中断されたときはトレース例外は発生しない
  3623:           //  命令例外はトレース例外の前に、割り込み例外はトレース例外の後に処理される
  3624:           //  未実装命令のエミュレーションルーチンはrteの直前にsrのTビットを復元することで未実装命令が1個の命令としてトレースされたように見せる
  3625:           //    ;DOSコールの終了
  3626:           //    ~008616:
  3627:           //            btst.b  #$07,(sp)
  3628:           //            bne.s   ~00861E
  3629:           //            rte
  3630:           //    ~00861E:
  3631:           //            ori.w   #$8000,sr
  3632:           //            rte
  3633:           if (XEiJ.mpuTraceFlag != 0) {  //命令実行前にsrのTビットがセットされていた
  3634:             XEiJ.mpuCycleCount += 34;
  3635:             irpException (M68kException.M6E_TRACE, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは次の命令
  3636:           }
  3637:           //クロックをカウントアップする
  3638:           //  オペランドをアクセスした時点ではまだXEiJ.mpuClockTimeが更新されていないのでXEiJ.mpuClockTime<xxxClock
  3639:           //  xxxTickを呼び出すときはXEiJ.mpuClockTime>=xxxClock
  3640:           XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount;
  3641:           //デバイスを呼び出す
  3642:           TickerQueue.tkqRun (XEiJ.mpuClockTime);
  3643:           //割り込みを受け付ける
  3644:           if ((t = XEiJ.mpuIMR & XEiJ.mpuIRR) != 0) {  //マスクされているレベルよりも高くて受け付けていない割り込みがあるとき
  3645:             if (XEiJ.MPU_INTERRUPT_SWITCH) {
  3646:               switch (t) {
  3647:               case 0b00000001:
  3648:               case 0b00000011:
  3649:               case 0b00000101:
  3650:               case 0b00000111:
  3651:               case 0b00001001:
  3652:               case 0b00001011:
  3653:               case 0b00001101:
  3654:               case 0b00001111:
  3655:               case 0b00010001:
  3656:               case 0b00010011:
  3657:               case 0b00010101:
  3658:               case 0b00010111:
  3659:               case 0b00011001:
  3660:               case 0b00011011:
  3661:               case 0b00011101:
  3662:               case 0b00011111:
  3663:               case 0b00100001:
  3664:               case 0b00100011:
  3665:               case 0b00100101:
  3666:               case 0b00100111:
  3667:               case 0b00101001:
  3668:               case 0b00101011:
  3669:               case 0b00101101:
  3670:               case 0b00101111:
  3671:               case 0b00110001:
  3672:               case 0b00110011:
  3673:               case 0b00110101:
  3674:               case 0b00110111:
  3675:               case 0b00111001:
  3676:               case 0b00111011:
  3677:               case 0b00111101:
  3678:               case 0b00111111:
  3679:               case 0b01000001:
  3680:               case 0b01000011:
  3681:               case 0b01000101:
  3682:               case 0b01000111:
  3683:               case 0b01001001:
  3684:               case 0b01001011:
  3685:               case 0b01001101:
  3686:               case 0b01001111:
  3687:               case 0b01010001:
  3688:               case 0b01010011:
  3689:               case 0b01010101:
  3690:               case 0b01010111:
  3691:               case 0b01011001:
  3692:               case 0b01011011:
  3693:               case 0b01011101:
  3694:               case 0b01011111:
  3695:               case 0b01100001:
  3696:               case 0b01100011:
  3697:               case 0b01100101:
  3698:               case 0b01100111:
  3699:               case 0b01101001:
  3700:               case 0b01101011:
  3701:               case 0b01101101:
  3702:               case 0b01101111:
  3703:               case 0b01110001:
  3704:               case 0b01110011:
  3705:               case 0b01110101:
  3706:               case 0b01110111:
  3707:               case 0b01111001:
  3708:               case 0b01111011:
  3709:               case 0b01111101:
  3710:               case 0b01111111:
  3711:               case 0b10000001:
  3712:               case 0b10000011:
  3713:               case 0b10000101:
  3714:               case 0b10000111:
  3715:               case 0b10001001:
  3716:               case 0b10001011:
  3717:               case 0b10001101:
  3718:               case 0b10001111:
  3719:               case 0b10010001:
  3720:               case 0b10010011:
  3721:               case 0b10010101:
  3722:               case 0b10010111:
  3723:               case 0b10011001:
  3724:               case 0b10011011:
  3725:               case 0b10011101:
  3726:               case 0b10011111:
  3727:               case 0b10100001:
  3728:               case 0b10100011:
  3729:               case 0b10100101:
  3730:               case 0b10100111:
  3731:               case 0b10101001:
  3732:               case 0b10101011:
  3733:               case 0b10101101:
  3734:               case 0b10101111:
  3735:               case 0b10110001:
  3736:               case 0b10110011:
  3737:               case 0b10110101:
  3738:               case 0b10110111:
  3739:               case 0b10111001:
  3740:               case 0b10111011:
  3741:               case 0b10111101:
  3742:               case 0b10111111:
  3743:               case 0b11000001:
  3744:               case 0b11000011:
  3745:               case 0b11000101:
  3746:               case 0b11000111:
  3747:               case 0b11001001:
  3748:               case 0b11001011:
  3749:               case 0b11001101:
  3750:               case 0b11001111:
  3751:               case 0b11010001:
  3752:               case 0b11010011:
  3753:               case 0b11010101:
  3754:               case 0b11010111:
  3755:               case 0b11011001:
  3756:               case 0b11011011:
  3757:               case 0b11011101:
  3758:               case 0b11011111:
  3759:               case 0b11100001:
  3760:               case 0b11100011:
  3761:               case 0b11100101:
  3762:               case 0b11100111:
  3763:               case 0b11101001:
  3764:               case 0b11101011:
  3765:               case 0b11101101:
  3766:               case 0b11101111:
  3767:               case 0b11110001:
  3768:               case 0b11110011:
  3769:               case 0b11110101:
  3770:               case 0b11110111:
  3771:               case 0b11111001:
  3772:               case 0b11111011:
  3773:               case 0b11111101:
  3774:               case 0b11111111:
  3775:                 //レベル7
  3776:                 XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK;  //割り込みを受け付ける
  3777:                 if ((t = XEiJ.sysAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3778:                   irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3779:                 }
  3780:                 break;
  3781:               case 0b00000010:
  3782:               case 0b00000110:
  3783:               case 0b00001010:
  3784:               case 0b00001110:
  3785:               case 0b00010010:
  3786:               case 0b00010110:
  3787:               case 0b00011010:
  3788:               case 0b00011110:
  3789:               case 0b00100010:
  3790:               case 0b00100110:
  3791:               case 0b00101010:
  3792:               case 0b00101110:
  3793:               case 0b00110010:
  3794:               case 0b00110110:
  3795:               case 0b00111010:
  3796:               case 0b00111110:
  3797:               case 0b01000010:
  3798:               case 0b01000110:
  3799:               case 0b01001010:
  3800:               case 0b01001110:
  3801:               case 0b01010010:
  3802:               case 0b01010110:
  3803:               case 0b01011010:
  3804:               case 0b01011110:
  3805:               case 0b01100010:
  3806:               case 0b01100110:
  3807:               case 0b01101010:
  3808:               case 0b01101110:
  3809:               case 0b01110010:
  3810:               case 0b01110110:
  3811:               case 0b01111010:
  3812:               case 0b01111110:
  3813:               case 0b10000010:
  3814:               case 0b10000110:
  3815:               case 0b10001010:
  3816:               case 0b10001110:
  3817:               case 0b10010010:
  3818:               case 0b10010110:
  3819:               case 0b10011010:
  3820:               case 0b10011110:
  3821:               case 0b10100010:
  3822:               case 0b10100110:
  3823:               case 0b10101010:
  3824:               case 0b10101110:
  3825:               case 0b10110010:
  3826:               case 0b10110110:
  3827:               case 0b10111010:
  3828:               case 0b10111110:
  3829:               case 0b11000010:
  3830:               case 0b11000110:
  3831:               case 0b11001010:
  3832:               case 0b11001110:
  3833:               case 0b11010010:
  3834:               case 0b11010110:
  3835:               case 0b11011010:
  3836:               case 0b11011110:
  3837:               case 0b11100010:
  3838:               case 0b11100110:
  3839:               case 0b11101010:
  3840:               case 0b11101110:
  3841:               case 0b11110010:
  3842:               case 0b11110110:
  3843:               case 0b11111010:
  3844:               case 0b11111110:
  3845:                 //レベル6
  3846:                 XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK;  //割り込みを受け付ける
  3847:                 if ((t = MC68901.mfpAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3848:                   irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3849:                 }
  3850:                 break;
  3851:               case 0b00000100:
  3852:               case 0b00001100:
  3853:               case 0b00010100:
  3854:               case 0b00011100:
  3855:               case 0b00100100:
  3856:               case 0b00101100:
  3857:               case 0b00110100:
  3858:               case 0b00111100:
  3859:               case 0b01000100:
  3860:               case 0b01001100:
  3861:               case 0b01010100:
  3862:               case 0b01011100:
  3863:               case 0b01100100:
  3864:               case 0b01101100:
  3865:               case 0b01110100:
  3866:               case 0b01111100:
  3867:               case 0b10000100:
  3868:               case 0b10001100:
  3869:               case 0b10010100:
  3870:               case 0b10011100:
  3871:               case 0b10100100:
  3872:               case 0b10101100:
  3873:               case 0b10110100:
  3874:               case 0b10111100:
  3875:               case 0b11000100:
  3876:               case 0b11001100:
  3877:               case 0b11010100:
  3878:               case 0b11011100:
  3879:               case 0b11100100:
  3880:               case 0b11101100:
  3881:               case 0b11110100:
  3882:               case 0b11111100:
  3883:                 //レベル5
  3884:                 XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK;  //割り込みを受け付ける
  3885:                 if ((t = Z8530.sccAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3886:                   irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3887:                 }
  3888:                 break;
  3889:               case 0b00010000:
  3890:               case 0b00110000:
  3891:               case 0b01010000:
  3892:               case 0b01110000:
  3893:               case 0b10010000:
  3894:               case 0b10110000:
  3895:               case 0b11010000:
  3896:               case 0b11110000:
  3897:                 //レベル3
  3898:                 XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK;  //割り込みを受け付ける
  3899:                 if ((t = HD63450.dmaAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3900:                   irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3901:                 }
  3902:                 break;
  3903:               case 0b00100000:
  3904:               case 0b01100000:
  3905:               case 0b10100000:
  3906:               case 0b11100000:
  3907:                 //レベル2
  3908:                 XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK;  //割り込みを受け付ける
  3909:                 if ((t = XEiJ.eb2Acknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3910:                   irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3911:                 }
  3912:                 break;
  3913:               case 0b01000000:
  3914:               case 0b11000000:
  3915:                 //レベル1
  3916:                 XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK;  //割り込みを受け付ける
  3917:                 if ((t = IOInterrupt.ioiAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3918:                   irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3919:                 }
  3920:                 break;
  3921:               }
  3922:             } else {
  3923:               t &= -t;
  3924:               //  x&=-xはxの最下位の1のビットだけを残す演算
  3925:               //  すなわちマスクされているレベルよりも高くて受け付けていない割り込みの中で最高レベルの割り込みのビットだけが残る
  3926:               //  最高レベルの割り込みのビットしか残っていないので、割り込みの有無をレベルの高い順ではなく使用頻度の高い順に調べられる
  3927:               //  MFPやDMAの割り込みがかかる度にそれより優先度の高いインタラプトスイッチが押されていないかどうかを確かめる必要がない
  3928:               if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) {
  3929:                 XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK;  //割り込みを受け付ける
  3930:                 if ((t = MC68901.mfpAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3931:                   irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3932:                 }
  3933:               } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) {
  3934:                 XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK;  //割り込みを受け付ける
  3935:                 if ((t = HD63450.dmaAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3936:                   irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3937:                 }
  3938:               } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) {
  3939:                 XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK;  //割り込みを受け付ける
  3940:                 if ((t = Z8530.sccAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3941:                   irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3942:                 }
  3943:               } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) {
  3944:                 XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK;  //割り込みを受け付ける
  3945:                 if ((t = IOInterrupt.ioiAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3946:                   irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3947:                 }
  3948:               } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) {
  3949:                 XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK;  //割り込みを受け付ける
  3950:                 if ((t = XEiJ.eb2Acknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3951:                   irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3952:                 }
  3953:               } else if (t == XEiJ.MPU_SYS_INTERRUPT_MASK) {
  3954:                 XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK;  //割り込みを受け付ける
  3955:                 if ((t = XEiJ.sysAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  3956:                   irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL);  //割り込み処理を開始する
  3957:                 }
  3958:               }
  3959:             }
  3960:           }  //if t!=0
  3961:           if (MC68901.MFP_DELAYED_INTERRUPT) {
  3962:             XEiJ.mpuIRR |= XEiJ.mpuDIRR;  //遅延割り込み要求
  3963:             XEiJ.mpuDIRR = 0;
  3964:           }
  3965:         }  //命令ループ
  3966:       } catch (M68kException e) {
  3967:         if (M68kException.m6eNumber == M68kException.M6E_WAIT_EXCEPTION) {  //待機例外
  3968:           if (irpWaitException ()) {
  3969:             continue;
  3970:           } else {
  3971:             break errorLoop;
  3972:           }
  3973:         }
  3974:         if (M68kException.m6eNumber == M68kException.M6E_INSTRUCTION_BREAK_POINT) {  //命令ブレークポイントによる停止
  3975:           XEiJ.regPC = XEiJ.regPC0;
  3976:           XEiJ.mpuStop1 (null);  //"Instruction Break Point"
  3977:           break errorLoop;
  3978:         }
  3979:         XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount;
  3980:         //例外処理
  3981:         //  ここで処理するのはベクタ番号が2~31の例外に限る。TRAP #n命令はインライン展開する
  3982:         //  使用頻度が高いと思われる例外はインライン展開するのでここには来ない
  3983:         //    例外処理をインライン展開する場合はMC68000とMC68030のコードを分けなければならずコードが冗長になる
  3984:         //    使用頻度が低いと思われる例外はインライン展開しない
  3985:         //  セーブされるpcは以下の例外は命令の先頭、これ以外は次の命令
  3986:         //     2  BUS_ERROR
  3987:         //     3  ADDRESS_ERROR
  3988:         //     4  ILLEGAL_INSTRUCTION
  3989:         //     8  PRIVILEGE_VIOLATION
  3990:         //    10  LINE_1010_EMULATOR
  3991:         //    11  LINE_1111_EMULATOR
  3992:         //                                      fedcba9876543210fedcba9876543210
  3993:         //if ((1 << M68kException.m6eNumber & 0b00000000000000000000110100011100) != 0) {
  3994:         //    0123456789abcdef0123456789abcdef
  3995:         if (0b00111000101100000000000000000000 << M68kException.m6eNumber < 0) {
  3996:           XEiJ.regPC = XEiJ.regPC0;  //セーブされるpcは命令の先頭
  3997:         }
  3998:         try {
  3999:           int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  4000:           int sp = XEiJ.regRn[15];
  4001:           XEiJ.regSRT1 = 0;  //srのTビットを消す
  4002:           if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  4003:             XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
  4004:             XEiJ.mpuUSP = sp;  //USPを保存
  4005:             sp = XEiJ.mpuISP;  //SSPを復元
  4006:             if (DataBreakPoint.DBP_ON) {
  4007:               DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
  4008:             } else {
  4009:               XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
  4010:             }
  4011:             if (InstructionBreakPoint.IBP_ON) {
  4012:               InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
  4013:             }
  4014:           }
  4015:           int vectorOffset = M68kException.m6eNumber << 2;  //vector offset
  4016:           if (M68kException.m6eNumber <= M68kException.M6E_ADDRESS_ERROR) {  //バスエラーまたはアドレスエラー
  4017:             //ホストファイルシステムのデバイスコマンドを強制終了させる
  4018:             HFS.hfsState = HFS.HFS_STATE_IDLE;
  4019:             XEiJ.mpuClockTime += 50 * XEiJ.mpuModifiedUnit;
  4020:             //long format stack frame (bus error/address error)
  4021:             //    $0000   .w      status register
  4022:             //    $0002   .l      program counter
  4023:             //    $0006   .w      format and vector offset. $8008=bus error, $800C=address error
  4024:             //    $0008   .w      special status word
  4025:             //    $000A   .l      fault address
  4026:             //    $000E   .w      unused, reserved
  4027:             //    $0010   .w      data output buffer
  4028:             //    $0012   .w      unused, reserved
  4029:             //    $0014   .w      data input buffer
  4030:             //    $0016   .w      unused, reserved
  4031:             //    $0018   .w      instruction input buffer
  4032:             //    $001A   .w[16]  internal information, 16 words
  4033:             //    29 words, 58 bytes
  4034:             //special status word
  4035:             //    bit15   RR      Rerun flag; 0=processor rerun (default), 1=software rerun
  4036:             //    bit14   *       These bits are reserved for future use by Motorola and will be zero when written by the MC68010.
  4037:             //    bit13   IF      Instruction fetch to the instruction input buffer
  4038:             //    bit12   DF      Data fetch to the data input buffer
  4039:             //    bit11   RM      Read-modify-write cycle
  4040:             //    bit10   HB      High-byte transfer from the data output buffer or to the data input buffer
  4041:             //    bit9    BY      Byte-transfer flag; HB selects the high or low byte of the transfer register.
  4042:             //                    If BY is clear, the transfer is word.
  4043:             //    bit8    RW      Read/write flag; 0=write, 1=read
  4044:             //    bit7-3  *
  4045:             //    bit2-0  FC2-FC0 The function code used during the faulted access
  4046:             XEiJ.regRn[15] = sp -= 58;  //long format
  4047:             XEiJ.busWl (sp + 10, M68kException.m6eAddress);  //fault address
  4048:             XEiJ.busWw (sp + 8,
  4049:                         (M68kException.m6eSize == XEiJ.MPU_SS_BYTE ? 0x0200 : 0x0000) |  //BY
  4050:                         (M68kException.m6eDirection == XEiJ.MPU_WR_READ ? 0x0100 : 0x0000)  //RW
  4051:                         //!!! 他のフラグをセットしていない
  4052:                         );  //special status word
  4053:             XEiJ.busWw (sp + 6, 0x8000 | vectorOffset);  //format and vector offset
  4054:             XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  4055:             XEiJ.busWw (sp, save_sr);  //status register
  4056:           } else {
  4057:             //short format stack frame
  4058:             //    $0000   .w      status register
  4059:             //    $0002   .l      program counter
  4060:             //    $0006   .w      format and vector offset
  4061:             //    4 words, 8 bytes
  4062:             XEiJ.regRn[15] = sp -= 8;  //short format
  4063:             XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
  4064:             XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  4065:             XEiJ.busWw (sp, save_sr);  //status register
  4066:           }
  4067:           irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
  4068:           if (XEiJ.dbgStopOnError) {  //エラーで停止する場合
  4069:             if (XEiJ.dbgDoStopOnError ()) {
  4070:               break errorLoop;
  4071:             }
  4072:           }
  4073:         } catch (M68kException ee) {  //ダブルバスフォルト
  4074:           XEiJ.dbgDoubleBusFault ();
  4075:           break errorLoop;
  4076:         }
  4077:       }  //catch M68kException
  4078:     }  //例外ループ
  4079: 
  4080:     //  通常
  4081:     //    pc0  最後に実行した命令
  4082:     //    pc  次に実行する命令
  4083:     //  バスエラー、アドレスエラー、不当命令、特権違反で停止したとき
  4084:     //    pc0  エラーを発生させた命令
  4085:     //    pc  例外処理ルーチンの先頭
  4086:     //  ダブルバスフォルトで停止したとき
  4087:     //    pc0  エラーを発生させた命令
  4088:     //    pc  エラーを発生させた命令
  4089:     //  命令ブレークポイントで停止したとき
  4090:     //    pc0  命令ブレークポイントが設定された、次に実行する命令
  4091:     //    pc  命令ブレークポイントが設定された、次に実行する命令
  4092:     //  データブレークポイントで停止したとき
  4093:     //    pc0  データを書き換えた、最後に実行した命令
  4094:     //    pc  次に実行する命令
  4095: 
  4096:     //分岐ログに停止レコードを記録する
  4097:     if (BranchLog.BLG_ON) {
  4098:       BranchLog.blgStop ();
  4099:     }
  4100: 
  4101:   }  //mpuCore()
  4102: 
  4103: 
  4104: 
  4105:   //cont = irpWaitException ()
  4106:   //  待機例外をキャッチしたとき
  4107:   public static boolean irpWaitException () {
  4108:     XEiJ.regPC = XEiJ.regPC0;  //PCを巻き戻す
  4109:     XEiJ.regRn[8 + (XEiJ.regOC & 7)] += WaitInstruction.REWIND_AR[XEiJ.regOC >> 3];  //(Ar)+|-(Ar)で変化したArを巻き戻す
  4110:     try {
  4111:       //トレース例外を処理する
  4112:       if (XEiJ.mpuTraceFlag != 0) {  //命令実行前にsrのTビットがセットされていた
  4113:         XEiJ.mpuCycleCount += 34;
  4114:         irpException (M68kException.M6E_TRACE, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは次の命令
  4115:       }
  4116:       //デバイスを呼び出す
  4117:       TickerQueue.tkqRun (XEiJ.mpuClockTime);
  4118:       //割り込みを受け付ける
  4119:       int t;
  4120:       if ((t = XEiJ.mpuIMR & XEiJ.mpuIRR) != 0) {  //マスクされているレベルよりも高くて受け付けていない割り込みがあるとき
  4121:         t &= -t;
  4122:         //  x&=-xはxの最下位の1のビットだけを残す演算
  4123:         //  すなわちマスクされているレベルよりも高くて受け付けていない割り込みの中で最高レベルの割り込みのビットだけが残る
  4124:         //  最高レベルの割り込みのビットしか残っていないので、割り込みの有無をレベルの高い順ではなく使用頻度の高い順に調べられる
  4125:         //  MFPやDMAの割り込みがかかる度にそれより優先度の高いインタラプトスイッチが押されていないかどうかを確かめる必要がない
  4126:         if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) {
  4127:           XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK;  //割り込みを受け付ける
  4128:           if ((t = MC68901.mfpAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  4129:             irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL);  //割り込み処理を開始する
  4130:           }
  4131:         } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) {
  4132:           XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK;  //割り込みを受け付ける
  4133:           if ((t = HD63450.dmaAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  4134:             irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL);  //割り込み処理を開始する
  4135:           }
  4136:         } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) {
  4137:           XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK;  //割り込みを受け付ける
  4138:           if ((t = Z8530.sccAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  4139:             irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL);  //割り込み処理を開始する
  4140:           }
  4141:         } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) {
  4142:           XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK;  //割り込みを受け付ける
  4143:           if ((t = IOInterrupt.ioiAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  4144:             irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL);  //割り込み処理を開始する
  4145:           }
  4146:         } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) {
  4147:           XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK;  //割り込みを受け付ける
  4148:           if ((t = XEiJ.eb2Acknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  4149:             irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL);  //割り込み処理を開始する
  4150:           }
  4151:         } else if (t == XEiJ.MPU_SYS_INTERRUPT_MASK) {
  4152:           XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK;  //割り込みを受け付ける
  4153:           if ((t = XEiJ.sysAcknowledge ()) != 0) {  //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき
  4154:             irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL);  //割り込み処理を開始する
  4155:           }
  4156:         }
  4157:       }  //if t!=0
  4158:       if (MC68901.MFP_DELAYED_INTERRUPT) {
  4159:         XEiJ.mpuIRR |= XEiJ.mpuDIRR;  //遅延割り込み要求
  4160:         XEiJ.mpuDIRR = 0;
  4161:       }
  4162:     } catch (M68kException e) {
  4163:       //!!! 待機例外処理中のバスエラーの処理は省略
  4164:       XEiJ.dbgDoubleBusFault ();
  4165:       return false;
  4166:     }  //catch M68kException
  4167:     return true;
  4168:   }  //irpWaitException
  4169: 
  4170: 
  4171: 
  4172:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4173:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4174:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4175:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4176:   //ORI.B #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_000_mmm_rrr-{data}
  4177:   //OR.B #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_000_mmm_rrr-{data}  [ORI.B #<data>,<ea>]
  4178:   //ORI.B #<data>,CCR                               |-|012346|-|*****|*****|          |0000_000_000_111_100-{data}
  4179:   public static void irpOriByte () throws M68kException {
  4180:     int ea = XEiJ.regOC & 63;
  4181:     int z;
  4182:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4183:       z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4184:     } else {
  4185:       z = XEiJ.regPC;
  4186:       XEiJ.regPC = z + 2;
  4187:       z = XEiJ.busRbs (z + 1);  //pcbs
  4188:     }
  4189:     if (ea < XEiJ.EA_AR) {  //ORI.B #<data>,Dr
  4190:       if (XEiJ.DBG_ORI_BYTE_ZERO_D0) {
  4191:         if (z == 0 && ea == 0 && XEiJ.dbgOriByteZeroD0) {  //ORI.B #$00,D0
  4192:           XEiJ.mpuCycleCount += 34;
  4193:           M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4194:           throw M68kException.m6eSignal;
  4195:         }
  4196:       }
  4197:       XEiJ.mpuCycleCount += 8;
  4198:       z = XEiJ.regRn[ea] |= 255 & z;  //0拡張してからOR
  4199:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4200:     } else if (ea == XEiJ.EA_IM) {  //ORI.B #<data>,CCR
  4201:       XEiJ.mpuCycleCount += 20;
  4202:       XEiJ.regCCR |= XEiJ.REG_CCR_MASK & z;
  4203:     } else {  //ORI.B #<data>,<mem>
  4204:       XEiJ.mpuCycleCount += 12;
  4205:       int a = efaMltByte (ea);
  4206:       XEiJ.busWb (a, z |= XEiJ.busRbs (a));
  4207:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4208:     }
  4209:   }  //irpOriByte
  4210: 
  4211:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4212:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4213:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4214:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4215:   //ORI.W #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_001_mmm_rrr-{data}
  4216:   //OR.W #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_001_mmm_rrr-{data}  [ORI.W #<data>,<ea>]
  4217:   //ORI.W #<data>,SR                                |-|012346|P|*****|*****|          |0000_000_001_111_100-{data}
  4218:   public static void irpOriWord () throws M68kException {
  4219:     int ea = XEiJ.regOC & 63;
  4220:     if (ea < XEiJ.EA_AR) {  //ORI.W #<data>,Dr
  4221:       int z;
  4222:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4223:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4224:       } else {
  4225:         z = XEiJ.regPC;
  4226:         XEiJ.regPC = z + 2;
  4227:         z = XEiJ.busRwse (z);  //pcws
  4228:       }
  4229:       XEiJ.mpuCycleCount += 8;
  4230:       z = XEiJ.regRn[ea] |= (char) z;  //0拡張してからOR
  4231:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  4232:     } else if (ea == XEiJ.EA_IM) {  //ORI.W #<data>,SR
  4233:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  4234:         XEiJ.mpuCycleCount += 34;
  4235:         M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  4236:         throw M68kException.m6eSignal;
  4237:       }
  4238:       //以下はスーパーバイザモード
  4239:       XEiJ.mpuCycleCount += 20;
  4240:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4241:         irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  4242:       } else {
  4243:         int t = XEiJ.regPC;
  4244:         XEiJ.regPC = t + 2;
  4245:         irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse (t));  //pcws。特権違反チェックが先
  4246:       }
  4247:     } else {  //ORI.W #<data>,<mem>
  4248:       int z;
  4249:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4250:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4251:       } else {
  4252:         z = XEiJ.regPC;
  4253:         XEiJ.regPC = z + 2;
  4254:         z = XEiJ.busRwse (z);  //pcws
  4255:       }
  4256:       XEiJ.mpuCycleCount += 12;
  4257:       int a = efaMltWord (ea);
  4258:       XEiJ.busWw (a, z |= XEiJ.busRws (a));
  4259:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  4260:     }
  4261:   }  //irpOriWord
  4262: 
  4263:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4264:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4265:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4266:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4267:   //ORI.L #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_010_mmm_rrr-{data}
  4268:   //OR.L #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_010_mmm_rrr-{data}  [ORI.L #<data>,<ea>]
  4269:   public static void irpOriLong () throws M68kException {
  4270:     int ea = XEiJ.regOC & 63;
  4271:     int y;
  4272:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4273:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4274:     } else {
  4275:       y = XEiJ.regPC;
  4276:       XEiJ.regPC = y + 4;
  4277:       y = XEiJ.busRlse (y);  //pcls
  4278:     }
  4279:     int z;
  4280:     if (ea < XEiJ.EA_AR) {  //ORI.L #<data>,Dr
  4281:       XEiJ.mpuCycleCount += 16;
  4282:       z = XEiJ.regRn[ea] |= y;
  4283:     } else {  //ORI.L #<data>,<mem>
  4284:       XEiJ.mpuCycleCount += 20;
  4285:       int a = efaMltLong (ea);
  4286:       XEiJ.busWl (a, z = XEiJ.busRls (a) | y);
  4287:     }
  4288:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  4289:   }  //irpOriLong
  4290: 
  4291:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4292:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4293:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4294:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4295:   //BITREV.L Dr                                     |-|------|-|-----|-----|D         |0000_000_011_000_rrr (ISA_C)
  4296:   //
  4297:   //BITREV.L Dr
  4298:   //  Drのビットの並びを逆順にする。CCRは変化しない
  4299:   public static void irpCmp2Chk2Byte () throws M68kException {
  4300:     int ea = XEiJ.regOC & 63;
  4301:     if (ea < XEiJ.EA_AR) {  //BITREV.L Dr
  4302:       XEiJ.mpuCycleCount += 4;
  4303:       if (XEiJ.IRP_BITREV_REVERSE) {  //2.83ns  0x0f801f3c
  4304:         XEiJ.regRn[ea] = Integer.reverse (XEiJ.regRn[ea]);
  4305:       } else if (XEiJ.IRP_BITREV_SHIFT) {  //2.57ns  0x0f801f3c
  4306:         int x = XEiJ.regRn[ea];
  4307:         x = x << 16 | x >>> 16;
  4308:         x = x << 8 & 0xff00ff00 | x >>> 8 & 0x00ff00ff;
  4309:         x = x << 4 & 0xf0f0f0f0 | x >>> 4 & 0x0f0f0f0f;
  4310:         x = x << 2 & 0xcccccccc | x >>> 2 & 0x33333333;
  4311:         XEiJ.regRn[ea] = x << 1 & 0xaaaaaaaa | x >>> 1 & 0x55555555;
  4312:       } else if (XEiJ.IRP_BITREV_TABLE) {  //1.57ns  0x0f801f3c
  4313:         int x = XEiJ.regRn[ea];
  4314:         XEiJ.regRn[ea] = XEiJ.MPU_BITREV_TABLE_0[x & 2047] | XEiJ.MPU_BITREV_TABLE_1[x << 10 >>> 21] | XEiJ.MPU_BITREV_TABLE_2[x >>> 22];
  4315:       }
  4316:     } else {  //CMP2/CHK2.B <ea>,Rn
  4317:       //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない
  4318:       XEiJ.mpuCycleCount += 34;
  4319:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4320:       throw M68kException.m6eSignal;
  4321:     }
  4322:   }  //irpCmp2Chk2Byte
  4323: 
  4324:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4325:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4326:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4327:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4328:   //BTST.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_100_000_rrr
  4329:   //MOVEP.W (d16,Ar),Dq                             |-|01234S|-|-----|-----|          |0000_qqq_100_001_rrr-{data}
  4330:   //BTST.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZPI|0000_qqq_100_mmm_rrr
  4331:   public static void irpBtstReg () throws M68kException {
  4332:     int ea = XEiJ.regOC & 63;
  4333:     int qqq = XEiJ.regOC >> 9;  //qqq
  4334:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.W (d16,Ar),Dq
  4335:       XEiJ.mpuCycleCount += 16;
  4336:       int a;
  4337:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4338:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4339:       } else {
  4340:         a = XEiJ.regPC;
  4341:         XEiJ.regPC = a + 2;
  4342:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4343:       }
  4344:       XEiJ.regRn[qqq] = ~0xffff & XEiJ.regRn[qqq] | XEiJ.busRbz (a) << 8 | XEiJ.busRbz (a + 2);  //Javaは評価順序が保証されている
  4345:     } else {  //BTST.L Dq,Dr/<ea>
  4346:       int y = XEiJ.regRn[qqq];
  4347:       if (ea < XEiJ.EA_AR) {  //BTST.L Dq,Dr
  4348:         XEiJ.mpuCycleCount += 6;
  4349:         XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.regRn[ea] >>> y & 1) << 2;  //ccr_btst。intのシフトは5bitでマスクされるので&31を省略
  4350:       } else {  //BTST.B Dq,<ea>
  4351:         XEiJ.mpuCycleCount += 4;
  4352:         XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.busRbs (efaAnyByte (ea)) >>> (y & 7) & 1) << 2;  //ccr_btst
  4353:       }
  4354:     }
  4355:   }  //irpBtstReg
  4356: 
  4357:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4358:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4359:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4360:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4361:   //BCHG.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_101_000_rrr
  4362:   //MOVEP.L (d16,Ar),Dq                             |-|01234S|-|-----|-----|          |0000_qqq_101_001_rrr-{data}
  4363:   //BCHG.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_101_mmm_rrr
  4364:   public static void irpBchgReg () throws M68kException {
  4365:     int ea = XEiJ.regOC & 63;
  4366:     int qqq = XEiJ.regOC >> 9;  //qqq
  4367:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.L (d16,Ar),Dq
  4368:       XEiJ.mpuCycleCount += 24;
  4369:       int a;
  4370:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4371:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4372:       } else {
  4373:         a = XEiJ.regPC;
  4374:         XEiJ.regPC = a + 2;
  4375:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4376:       }
  4377:       XEiJ.regRn[qqq] = XEiJ.busRbs (a) << 24 | XEiJ.busRbz (a + 2) << 16 | XEiJ.busRbz (a + 4) << 8 | XEiJ.busRbz (a + 6);  //Javaは評価順序が保証されている
  4378:     } else {  //BCHG.L Dq,Dr/<ea>
  4379:       int x;
  4380:       int y = XEiJ.regRn[qqq];
  4381:       if (ea < XEiJ.EA_AR) {  //BCHG.L Dq,Dr
  4382:         XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4383:         XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8;  //(0xffff&y)!=0
  4384:       } else {  //BCHG.B Dq,<ea>
  4385:         XEiJ.mpuCycleCount += 8;
  4386:         int a = efaMltByte (ea);
  4387:         XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7)));
  4388:       }
  4389:       XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2;  //ccr_btst
  4390:     }
  4391:   }  //irpBchgReg
  4392: 
  4393:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4394:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4395:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4396:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4397:   //BCLR.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_110_000_rrr
  4398:   //MOVEP.W Dq,(d16,Ar)                             |-|01234S|-|-----|-----|          |0000_qqq_110_001_rrr-{data}
  4399:   //BCLR.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_110_mmm_rrr
  4400:   public static void irpBclrReg () throws M68kException {
  4401:     int ea = XEiJ.regOC & 63;
  4402:     int y = XEiJ.regRn[XEiJ.regOC >> 9];  //qqq
  4403:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.W Dq,(d16,Ar)
  4404:       XEiJ.mpuCycleCount += 16;
  4405:       int a;
  4406:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4407:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4408:       } else {
  4409:         a = XEiJ.regPC;
  4410:         XEiJ.regPC = a + 2;
  4411:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4412:       }
  4413:       XEiJ.busWb (a, y >> 8);
  4414:       XEiJ.busWb (a + 2, y);
  4415:     } else {  //BCLR.L Dq,Dr/<ea>
  4416:       int x;
  4417:       if (ea < XEiJ.EA_AR) {  //BCLR.L Dq,Dr
  4418:         XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4419:         XEiJ.mpuCycleCount += (char) y != 0 ? 8 : 10;  //(0xffff&y)!=0
  4420:       } else {  //BCLR.B Dq,<ea>
  4421:         XEiJ.mpuCycleCount += 8;
  4422:         int a = efaMltByte (ea);
  4423:         XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7)));
  4424:       }
  4425:       XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2;  //ccr_btst
  4426:     }
  4427:   }  //irpBclrReg
  4428: 
  4429:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4430:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4431:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4432:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4433:   //BSET.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_111_000_rrr
  4434:   //MOVEP.L Dq,(d16,Ar)                             |-|01234S|-|-----|-----|          |0000_qqq_111_001_rrr-{data}
  4435:   //BSET.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_111_mmm_rrr
  4436:   public static void irpBsetReg () throws M68kException {
  4437:     int ea = XEiJ.regOC & 63;
  4438:     int y = XEiJ.regRn[XEiJ.regOC >> 9];  //qqq
  4439:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.L Dq,(d16,Ar)
  4440:       XEiJ.mpuCycleCount += 24;
  4441:       int a;
  4442:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4443:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4444:       } else {
  4445:         a = XEiJ.regPC;
  4446:         XEiJ.regPC = a + 2;
  4447:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4448:       }
  4449:       XEiJ.busWb (a, y >> 24);
  4450:       XEiJ.busWb (a + 2, y >> 16);
  4451:       XEiJ.busWb (a + 4, y >> 8);
  4452:       XEiJ.busWb (a + 6, y);
  4453:     } else {  //BSET.L Dq,Dr/<ea>
  4454:       int x;
  4455:       if (ea < XEiJ.EA_AR) {  //BSET.L Dq,Dr
  4456:         XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4457:         XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8;  //(0xffff&y)!=0
  4458:       } else {  //BSET.B Dq,<ea>
  4459:         XEiJ.mpuCycleCount += 8;
  4460:         int a = efaMltByte (ea);
  4461:         XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7)));
  4462:       }
  4463:       XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2;  //ccr_btst
  4464:     }
  4465:   }  //irpBsetReg
  4466: 
  4467:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4468:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4469:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4470:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4471:   //ANDI.B #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_000_mmm_rrr-{data}
  4472:   //AND.B #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_000_mmm_rrr-{data}  [ANDI.B #<data>,<ea>]
  4473:   //ANDI.B #<data>,CCR                              |-|012346|-|*****|*****|          |0000_001_000_111_100-{data}
  4474:   public static void irpAndiByte () throws M68kException {
  4475:     int ea = XEiJ.regOC & 63;
  4476:     int z;
  4477:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4478:       z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4479:     } else {
  4480:       z = XEiJ.regPC;
  4481:       XEiJ.regPC = z + 2;
  4482:       z = XEiJ.busRbs (z + 1);  //pcbs
  4483:     }
  4484:     if (ea < XEiJ.EA_AR) {  //ANDI.B #<data>,Dr
  4485:       XEiJ.mpuCycleCount += 8;
  4486:       z = XEiJ.regRn[ea] &= ~255 | z;  //1拡張してからAND
  4487:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4488:     } else if (ea == XEiJ.EA_IM) {  //ANDI.B #<data>,CCR
  4489:       XEiJ.mpuCycleCount += 20;
  4490:       XEiJ.regCCR &= z;
  4491:     } else {  //ANDI.B #<data>,<mem>
  4492:       XEiJ.mpuCycleCount += 12;
  4493:       int a = efaMltByte (ea);
  4494:       XEiJ.busWb (a, z &= XEiJ.busRbs (a));
  4495:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4496:     }
  4497:   }  //irpAndiByte
  4498: 
  4499:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4500:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4501:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4502:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4503:   //ANDI.W #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_001_mmm_rrr-{data}
  4504:   //AND.W #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_001_mmm_rrr-{data}  [ANDI.W #<data>,<ea>]
  4505:   //ANDI.W #<data>,SR                               |-|012346|P|*****|*****|          |0000_001_001_111_100-{data}
  4506:   public static void irpAndiWord () throws M68kException {
  4507:     int ea = XEiJ.regOC & 63;
  4508:     if (ea < XEiJ.EA_AR) {  //ANDI.W #<data>,Dr
  4509:       int z;
  4510:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4511:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4512:       } else {
  4513:         z = XEiJ.regPC;
  4514:         XEiJ.regPC = z + 2;
  4515:         z = XEiJ.busRwse (z);  //pcws
  4516:       }
  4517:       XEiJ.mpuCycleCount += 8;
  4518:       z = XEiJ.regRn[ea] &= ~65535 | z;  //1拡張してからAND
  4519:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  4520:     } else if (ea == XEiJ.EA_IM) {  //ANDI.W #<data>,SR
  4521:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  4522:         XEiJ.mpuCycleCount += 34;
  4523:         M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  4524:         throw M68kException.m6eSignal;
  4525:       }
  4526:       //以下はスーパーバイザモード
  4527:       XEiJ.mpuCycleCount += 20;
  4528:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4529:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  4530:       } else {
  4531:         int t = XEiJ.regPC;
  4532:         XEiJ.regPC = t + 2;
  4533:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse (t));  //pcws。特権違反チェックが先
  4534:       }
  4535:     } else {  //ANDI.W #<data>,<mem>
  4536:       int z;
  4537:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4538:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4539:       } else {
  4540:         z = XEiJ.regPC;
  4541:         XEiJ.regPC = z + 2;
  4542:         z = XEiJ.busRwse (z);  //pcws
  4543:       }
  4544:       XEiJ.mpuCycleCount += 12;
  4545:       int a = efaMltWord (ea);
  4546:       XEiJ.busWw (a, z &= XEiJ.busRws (a));
  4547:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  4548:     }
  4549:   }  //irpAndiWord
  4550: 
  4551:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4552:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4553:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4554:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4555:   //ANDI.L #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_010_mmm_rrr-{data}
  4556:   //AND.L #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_010_mmm_rrr-{data}  [ANDI.L #<data>,<ea>]
  4557:   public static void irpAndiLong () throws M68kException {
  4558:     int ea = XEiJ.regOC & 63;
  4559:     int y;
  4560:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4561:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4562:     } else {
  4563:       y = XEiJ.regPC;
  4564:       XEiJ.regPC = y + 4;
  4565:       y = XEiJ.busRlse (y);  //pcls
  4566:     }
  4567:     int z;
  4568:     if (ea < XEiJ.EA_AR) {  //ANDI.L #<data>,Dr
  4569:       XEiJ.mpuCycleCount += 16;
  4570:       z = XEiJ.regRn[ea] &= y;
  4571:     } else {  //ANDI.L #<data>,<mem>
  4572:       XEiJ.mpuCycleCount += 20;
  4573:       int a = efaMltLong (ea);
  4574:       XEiJ.busWl (a, z = XEiJ.busRls (a) & y);
  4575:     }
  4576:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  4577:   }  //irpAndiLong
  4578: 
  4579:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4580:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4581:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4582:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4583:   //BYTEREV.L Dr                                    |-|------|-|-----|-----|D         |0000_001_011_000_rrr (ISA_C)
  4584:   //
  4585:   //BYTEREV.L Dr
  4586:   //  Drのバイトの並びを逆順にする。CCRは変化しない
  4587:   public static void irpCmp2Chk2Word () throws M68kException {
  4588:     int ea = XEiJ.regOC & 63;
  4589:     if (ea < XEiJ.EA_AR) {  //BYTEREV.L Dr
  4590:       XEiJ.mpuCycleCount += 4;
  4591:       if (true) {  //0.10ns-0.18ns  0x782750ec
  4592:         XEiJ.regRn[ea] = Integer.reverseBytes (XEiJ.regRn[ea]);
  4593:       } else {  //1.06ns  0x782750ec
  4594:         int x = XEiJ.regRn[ea];
  4595:         XEiJ.regRn[ea] = x << 24 | x << 8 & 0x00ff0000 | x >>> 8 & 0x0000ff00 | x >>> 24;
  4596:       }
  4597:     } else {  //CMP2/CHK2.W <ea>,Rn
  4598:       //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない
  4599:       XEiJ.mpuCycleCount += 34;
  4600:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4601:       throw M68kException.m6eSignal;
  4602:     }
  4603:   }  //irpCmp2Chk2Word
  4604: 
  4605:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4606:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4607:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4608:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4609:   //SUBI.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_000_mmm_rrr-{data}
  4610:   //SUB.B #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_000_mmm_rrr-{data}  [SUBI.B #<data>,<ea>]
  4611:   public static void irpSubiByte () throws M68kException {
  4612:     int ea = XEiJ.regOC & 63;
  4613:     int x;
  4614:     int y;
  4615:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4616:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4617:     } else {
  4618:       y = XEiJ.regPC;
  4619:       XEiJ.regPC = y + 2;
  4620:       y = XEiJ.busRbs (y + 1);  //pcbs
  4621:     }
  4622:     int z;
  4623:     if (ea < XEiJ.EA_AR) {  //SUBI.B #<data>,Dr
  4624:       XEiJ.mpuCycleCount += 8;
  4625:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y);
  4626:     } else {  //SUBI.B #<data>,<mem>
  4627:       XEiJ.mpuCycleCount += 12;
  4628:       int a = efaMltByte (ea);
  4629:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y));
  4630:     }
  4631:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4632:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  4633:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
  4634:   }  //irpSubiByte
  4635: 
  4636:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4637:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4638:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4639:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4640:   //SUBI.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_001_mmm_rrr-{data}
  4641:   //SUB.W #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_001_mmm_rrr-{data}  [SUBI.W #<data>,<ea>]
  4642:   public static void irpSubiWord () throws M68kException {
  4643:     int ea = XEiJ.regOC & 63;
  4644:     int x;
  4645:     int y;
  4646:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4647:       y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4648:     } else {
  4649:       y = XEiJ.regPC;
  4650:       XEiJ.regPC = y + 2;
  4651:       y = XEiJ.busRwse (y);  //pcws
  4652:     }
  4653:     int z;
  4654:     if (ea < XEiJ.EA_AR) {  //SUBI.W #<data>,Dr
  4655:       XEiJ.mpuCycleCount += 8;
  4656:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y));
  4657:     } else {  //SUBI.W #<data>,<mem>
  4658:       XEiJ.mpuCycleCount += 12;
  4659:       int a = efaMltWord (ea);
  4660:       XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y));
  4661:     }
  4662:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4663:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  4664:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
  4665:   }  //irpSubiWord
  4666: 
  4667:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4668:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4669:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4670:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4671:   //SUBI.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_010_mmm_rrr-{data}
  4672:   //SUB.L #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_010_mmm_rrr-{data}  [SUBI.L #<data>,<ea>]
  4673:   public static void irpSubiLong () throws M68kException {
  4674:     int ea = XEiJ.regOC & 63;
  4675:     int x;
  4676:     int y;
  4677:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4678:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4679:     } else {
  4680:       y = XEiJ.regPC;
  4681:       XEiJ.regPC = y + 4;
  4682:       y = XEiJ.busRlse (y);  //pcls
  4683:     }
  4684:     int z;
  4685:     if (ea < XEiJ.EA_AR) {  //SUBI.L #<data>,Dr
  4686:       XEiJ.mpuCycleCount += 16;
  4687:       XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y;
  4688:     } else {  //SUBI.L #<data>,<mem>
  4689:       XEiJ.mpuCycleCount += 20;
  4690:       int a = efaMltLong (ea);
  4691:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y);
  4692:     }
  4693:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4694:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  4695:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
  4696:   }  //irpSubiLong
  4697: 
  4698:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4699:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4700:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4701:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4702:   //FF1.L Dr                                        |-|------|-|-UUUU|-**00|D         |0000_010_011_000_rrr (ISA_C)
  4703:   //
  4704:   //FF1.L Dr
  4705:   //  Drの最上位の1のbit31からのオフセットをDrに格納する
  4706:   //  Drが0のときは32になる
  4707:   public static void irpCmp2Chk2Long () throws M68kException {
  4708:     int ea = XEiJ.regOC & 63;
  4709:     if (ea < XEiJ.EA_AR) {  //FF1.L Dr
  4710:       XEiJ.mpuCycleCount += 4;
  4711:       int z = XEiJ.regRn[ea];
  4712:       if (true) {
  4713:         XEiJ.regRn[ea] = Integer.numberOfLeadingZeros (z);
  4714:       } else {
  4715:         if (z == 0) {
  4716:           XEiJ.regRn[ea] = 32;
  4717:         } else {
  4718:           int k = -(z >>> 16) >> 16 & 16;
  4719:           k += -(z >>> k + 8) >> 8 & 8;
  4720:           k += -(z >>> k + 4) >> 4 & 4;
  4721:           //     bit3  1  1  1  1  1  1  1  1  0  0  0  0  0  0  0  0
  4722:           //     bit2  1  1  1  1  0  0  0  0  1  1  1  1  0  0  0  0
  4723:           //     bit1  1  1  0  0  1  1  0  0  1  1  0  0  1  1  0  0
  4724:           //     bit0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0
  4725:           XEiJ.regRn[ea] = ((0b11_11_11_11_11_11_11_11_10_10_10_10_01_01_00_00 >>> (z >>> k << 1)) & 3) + k;  //intのシフトカウントは下位5bitだけが使用される
  4726:         }
  4727:       }
  4728:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  4729:     } else {  //CMP2/CHK2.L <ea>,Rn
  4730:       //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない
  4731:       XEiJ.mpuCycleCount += 34;
  4732:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4733:       throw M68kException.m6eSignal;
  4734:     }
  4735:   }  //irpCmp2Chk2Long
  4736: 
  4737:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4738:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4739:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4740:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4741:   //ADDI.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_000_mmm_rrr-{data}
  4742:   public static void irpAddiByte () throws M68kException {
  4743:     int ea = XEiJ.regOC & 63;
  4744:     int x;
  4745:     int y;
  4746:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4747:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4748:     } else {
  4749:       y = XEiJ.regPC;
  4750:       XEiJ.regPC = y + 2;
  4751:       y = XEiJ.busRbs (y + 1);  //pcbs
  4752:     }
  4753:     int z;
  4754:     if (ea < XEiJ.EA_AR) {  //ADDI.B #<data>,Dr
  4755:       XEiJ.mpuCycleCount += 8;
  4756:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y);
  4757:     } else {  //ADDI.B #<data>,<mem>
  4758:       XEiJ.mpuCycleCount += 12;
  4759:       int a = efaMltByte (ea);
  4760:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y));
  4761:     }
  4762:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4763:            ((x ^ z) & (y ^ z)) >>> 31 << 1 |
  4764:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
  4765:   }  //irpAddiByte
  4766: 
  4767:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4768:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4769:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4770:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4771:   //ADDI.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_001_mmm_rrr-{data}
  4772:   public static void irpAddiWord () throws M68kException {
  4773:     int ea = XEiJ.regOC & 63;
  4774:     int x;
  4775:     int y;
  4776:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4777:       y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4778:     } else {
  4779:       y = XEiJ.regPC;
  4780:       XEiJ.regPC = y + 2;
  4781:       y = XEiJ.busRwse (y);  //pcws
  4782:     }
  4783:     int z;
  4784:     if (ea < XEiJ.EA_AR) {  //ADDI.W #<data>,Dr
  4785:       XEiJ.mpuCycleCount += 8;
  4786:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y));
  4787:     } else {  //ADDI.W #<data>,<mem>
  4788:       XEiJ.mpuCycleCount += 12;
  4789:       int a = efaMltWord (ea);
  4790:       XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y));
  4791:     }
  4792:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4793:            ((x ^ z) & (y ^ z)) >>> 31 << 1 |
  4794:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
  4795:   }  //irpAddiWord
  4796: 
  4797:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4798:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4799:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4800:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4801:   //ADDI.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_010_mmm_rrr-{data}
  4802:   public static void irpAddiLong () throws M68kException {
  4803:     int ea = XEiJ.regOC & 63;
  4804:     int x;
  4805:     int y;
  4806:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4807:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4808:     } else {
  4809:       y = XEiJ.regPC;
  4810:       XEiJ.regPC = y + 4;
  4811:       y = XEiJ.busRlse (y);  //pcls
  4812:     }
  4813:     int z;
  4814:     if (ea < XEiJ.EA_AR) {  //ADDI.L #<data>,Dr
  4815:       XEiJ.mpuCycleCount += 16;
  4816:       XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y;
  4817:     } else {  //ADDI.L #<data>,<mem>
  4818:       XEiJ.mpuCycleCount += 20;
  4819:       int a = efaMltLong (ea);
  4820:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y);
  4821:     }
  4822:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4823:            ((x ^ z) & (y ^ z)) >>> 31 << 1 |
  4824:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
  4825:   }  //irpAddiLong
  4826: 
  4827:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4828:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4829:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4830:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4831:   //BTST.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_000_000_rrr-{data}
  4832:   //BTST.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZP |0000_100_000_mmm_rrr-{data}
  4833:   public static void irpBtstImm () throws M68kException {
  4834:     int ea = XEiJ.regOC & 63;
  4835:     int y;
  4836:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4837:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4838:     } else {
  4839:       y = XEiJ.regPC;
  4840:       XEiJ.regPC = y + 2;
  4841:       y = XEiJ.busRbs (y + 1);  //pcbs
  4842:     }
  4843:     if (ea < XEiJ.EA_AR) {  //BTST.L #<data>,Dr
  4844:       XEiJ.mpuCycleCount += 10;
  4845:       XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.regRn[ea] >>> y & 1) << 2;  //ccr_btst。intのシフトは5bitでマスクされるので&31を省略
  4846:     } else {  //BTST.B #<data>,<ea>
  4847:       XEiJ.mpuCycleCount += 8;
  4848:       XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.busRbs (efaMemByte (ea)) >>> (y & 7) & 1) << 2;  //ccr_btst
  4849:     }
  4850:   }  //irpBtstImm
  4851: 
  4852:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4853:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4854:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4855:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4856:   //BCHG.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_001_000_rrr-{data}
  4857:   //BCHG.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_001_mmm_rrr-{data}
  4858:   public static void irpBchgImm () throws M68kException {
  4859:     int ea = XEiJ.regOC & 63;
  4860:     int x;
  4861:     int y;
  4862:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4863:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4864:     } else {
  4865:       y = XEiJ.regPC;
  4866:       XEiJ.regPC = y + 2;
  4867:       y = XEiJ.busRbs (y + 1);  //pcbs
  4868:     }
  4869:     if (ea < XEiJ.EA_AR) {  //BCHG.L #<data>,Dr
  4870:       XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4871:       XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12;  //(0xffff&y)!=0
  4872:     } else {  //BCHG.B #<data>,<ea>
  4873:       XEiJ.mpuCycleCount += 12;
  4874:       int a = efaMltByte (ea);
  4875:       XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7)));
  4876:     }
  4877:     XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2;  //ccr_btst
  4878:   }  //irpBchgImm
  4879: 
  4880:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4881:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4882:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4883:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4884:   //BCLR.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_010_000_rrr-{data}
  4885:   //BCLR.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_010_mmm_rrr-{data}
  4886:   public static void irpBclrImm () throws M68kException {
  4887:     int ea = XEiJ.regOC & 63;
  4888:     int x;
  4889:     int y;
  4890:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4891:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4892:     } else {
  4893:       y = XEiJ.regPC;
  4894:       XEiJ.regPC = y + 2;
  4895:       y = XEiJ.busRbs (y + 1);  //pcbs
  4896:     }
  4897:     if (ea < XEiJ.EA_AR) {  //BCLR.L #<data>,Dr
  4898:       XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4899:       XEiJ.mpuCycleCount += (char) y != 0 ? 12 : 14;  //(0xffff&y)!=0
  4900:     } else {  //BCLR.B #<data>,<ea>
  4901:       XEiJ.mpuCycleCount += 12;
  4902:       int a = efaMltByte (ea);
  4903:       XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7)));
  4904:     }
  4905:     XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2;  //ccr_btst
  4906:   }  //irpBclrImm
  4907: 
  4908:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4909:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4910:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4911:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4912:   //BSET.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_011_000_rrr-{data}
  4913:   //BSET.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_011_mmm_rrr-{data}
  4914:   public static void irpBsetImm () throws M68kException {
  4915:     int ea = XEiJ.regOC & 63;
  4916:     int x;
  4917:     int y;
  4918:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4919:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4920:     } else {
  4921:       y = XEiJ.regPC;
  4922:       XEiJ.regPC = y + 2;
  4923:       y = XEiJ.busRbs (y + 1);  //pcbs
  4924:     }
  4925:     if (ea < XEiJ.EA_AR) {  //BSET.L #<data>,Dr
  4926:       XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4927:       XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12;  //(0xffff&y)!=0
  4928:     } else {  //BSET.B #<data>,<ea>
  4929:       XEiJ.mpuCycleCount += 12;
  4930:       int a = efaMltByte (ea);
  4931:       XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7)));
  4932:     }
  4933:     XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2;  //ccr_btst
  4934:   }  //irpBsetImm
  4935: 
  4936:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4937:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4938:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4939:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4940:   //EORI.B #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_000_mmm_rrr-{data}
  4941:   //EOR.B #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_000_mmm_rrr-{data}  [EORI.B #<data>,<ea>]
  4942:   //EORI.B #<data>,CCR                              |-|012346|-|*****|*****|          |0000_101_000_111_100-{data}
  4943:   public static void irpEoriByte () throws M68kException {
  4944:     int ea = XEiJ.regOC & 63;
  4945:     int z;
  4946:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4947:       z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4948:     } else {
  4949:       z = XEiJ.regPC;
  4950:       XEiJ.regPC = z + 2;
  4951:       z = XEiJ.busRbs (z + 1);  //pcbs
  4952:     }
  4953:     if (ea < XEiJ.EA_AR) {  //EORI.B #<data>,Dr
  4954:       XEiJ.mpuCycleCount += 8;
  4955:       z = XEiJ.regRn[ea] ^= 255 & z;  //0拡張してからEOR
  4956:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4957:     } else if (ea == XEiJ.EA_IM) {  //EORI.B #<data>,CCR
  4958:       XEiJ.mpuCycleCount += 20;
  4959:       XEiJ.regCCR ^= XEiJ.REG_CCR_MASK & z;
  4960:     } else {  //EORI.B #<data>,<mem>
  4961:       XEiJ.mpuCycleCount += 12;
  4962:       int a = efaMltByte (ea);
  4963:       XEiJ.busWb (a, z ^= XEiJ.busRbs (a));
  4964:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4965:     }
  4966:   }  //irpEoriByte
  4967: 
  4968:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4969:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4970:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4971:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4972:   //EORI.W #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_001_mmm_rrr-{data}
  4973:   //EOR.W #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_001_mmm_rrr-{data}  [EORI.W #<data>,<ea>]
  4974:   //EORI.W #<data>,SR                               |-|012346|P|*****|*****|          |0000_101_001_111_100-{data}
  4975:   public static void irpEoriWord () throws M68kException {
  4976:     int ea = XEiJ.regOC & 63;
  4977:     if (ea < XEiJ.EA_AR) {  //EORI.W #<data>,Dr
  4978:       int z;
  4979:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4980:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4981:       } else {
  4982:         z = XEiJ.regPC;
  4983:         XEiJ.regPC = z + 2;
  4984:         z = XEiJ.busRwse (z);  //pcws
  4985:       }
  4986:       XEiJ.mpuCycleCount += 8;
  4987:       z = XEiJ.regRn[ea] ^= (char) z;  //0拡張してからEOR
  4988:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  4989:     } else if (ea == XEiJ.EA_IM) {  //EORI.W #<data>,SR
  4990:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  4991:         XEiJ.mpuCycleCount += 34;
  4992:         M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  4993:         throw M68kException.m6eSignal;
  4994:       }
  4995:       //以下はスーパーバイザモード
  4996:       XEiJ.mpuCycleCount += 20;
  4997:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4998:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  4999:       } else {
  5000:         int t = XEiJ.regPC;
  5001:         XEiJ.regPC = t + 2;
  5002:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse (t));  //pcws。特権違反チェックが先
  5003:       }
  5004:     } else {  //EORI.W #<data>,<mem>
  5005:       int z;
  5006:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5007:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  5008:       } else {
  5009:         z = XEiJ.regPC;
  5010:         XEiJ.regPC = z + 2;
  5011:         z = XEiJ.busRwse (z);  //pcws
  5012:       }
  5013:       XEiJ.mpuCycleCount += 12;
  5014:       int a = efaMltWord (ea);
  5015:       XEiJ.busWw (a, z ^= XEiJ.busRws (a));
  5016:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5017:     }
  5018:   }  //irpEoriWord
  5019: 
  5020:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5021:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5022:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5023:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5024:   //EORI.L #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_010_mmm_rrr-{data}
  5025:   //EOR.L #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_010_mmm_rrr-{data}  [EORI.L #<data>,<ea>]
  5026:   public static void irpEoriLong () throws M68kException {
  5027:     int ea = XEiJ.regOC & 63;
  5028:     int y;
  5029:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5030:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  5031:     } else {
  5032:       y = XEiJ.regPC;
  5033:       XEiJ.regPC = y + 4;
  5034:       y = XEiJ.busRlse (y);  //pcls
  5035:     }
  5036:     int z;
  5037:     if (ea < XEiJ.EA_AR) {  //EORI.L #<data>,Dr
  5038:       XEiJ.mpuCycleCount += 16;
  5039:       z = XEiJ.regRn[ea] ^= y;
  5040:     } else {  //EORI.L #<data>,<mem>
  5041:       XEiJ.mpuCycleCount += 20;
  5042:       int a = efaMltLong (ea);
  5043:       XEiJ.busWl (a, z = XEiJ.busRls (a) ^ y);
  5044:     }
  5045:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5046:   }  //irpEoriLong
  5047: 
  5048:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5049:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5050:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5051:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5052:   //CMPI.B #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_000_mmm_rrr-{data}
  5053:   //CMP.B #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_000_mmm_rrr-{data}  [CMPI.B #<data>,<ea>]
  5054:   public static void irpCmpiByte () throws M68kException {
  5055:     XEiJ.mpuCycleCount += 8;
  5056:     int ea = XEiJ.regOC & 63;
  5057:     int x;
  5058:     int y;
  5059:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5060:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  5061:     } else {
  5062:       y = XEiJ.regPC;
  5063:       XEiJ.regPC = y + 2;
  5064:       y = XEiJ.busRbs (y + 1);  //pcbs
  5065:     }
  5066:     int z = (byte) ((x = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea))) - y);  //アドレッシングモードに注意
  5067:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
  5068:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  5069:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
  5070:   }  //irpCmpiByte
  5071: 
  5072:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5073:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5074:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5075:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5076:   //CMPI.W #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_001_mmm_rrr-{data}
  5077:   //CMP.W #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_001_mmm_rrr-{data}  [CMPI.W #<data>,<ea>]
  5078:   public static void irpCmpiWord () throws M68kException {
  5079:     XEiJ.mpuCycleCount += 8;
  5080:     int ea = XEiJ.regOC & 63;
  5081:     int x;
  5082:     int y;
  5083:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5084:       y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  5085:     } else {
  5086:       y = XEiJ.regPC;
  5087:       XEiJ.regPC = y + 2;
  5088:       y = XEiJ.busRwse (y);  //pcws
  5089:     }
  5090:     int z = (short) ((x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea))) - y);  //アドレッシングモードに注意
  5091:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
  5092:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  5093:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
  5094:   }  //irpCmpiWord
  5095: 
  5096:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5097:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5098:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5099:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5100:   //CMPI.L #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_010_mmm_rrr-{data}
  5101:   //CMP.L #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_010_mmm_rrr-{data}  [CMPI.L #<data>,<ea>]
  5102:   public static void irpCmpiLong () throws M68kException {
  5103:     int ea = XEiJ.regOC & 63;
  5104:     int x;
  5105:     int y;
  5106:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5107:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  5108:     } else {
  5109:       y = XEiJ.regPC;
  5110:       XEiJ.regPC = y + 4;
  5111:       y = XEiJ.busRlse (y);  //pcls
  5112:     }
  5113:     int z;
  5114:     if (ea < XEiJ.EA_AR) {  //CMPI.L #<data>,Dr
  5115:       XEiJ.mpuCycleCount += 14;
  5116:       z = (x = XEiJ.regRn[ea]) - y;
  5117:     } else {  //CMPI.L #<data>,<mem>
  5118:       XEiJ.mpuCycleCount += 12;
  5119:       z = (x = XEiJ.busRls (efaMltLong (ea))) - y;  //アドレッシングモードに注意
  5120:     }
  5121:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
  5122:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  5123:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
  5124:   }  //irpCmpiLong
  5125: 
  5126:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5127:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5128:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5129:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5130:   //MOVES.B <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_000_mmm_rrr-rnnn000000000000
  5131:   //MOVES.B Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_000_mmm_rrr-rnnn100000000000
  5132:   //
  5133:   //MOVES.B <ea>,Rn
  5134:   //  MOVES.B <ea>,DnはDnの最下位バイトだけ更新する
  5135:   //  MOVES.B <ea>,Anはバイトデータをロングに符号拡張してAnの全体を更新する
  5136:   //  SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、
  5137:   //  SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5138:   //
  5139:   //MOVES.B Rn,<ea>
  5140:   //  DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、
  5141:   //  DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5142:   public static void irpMovesByte () throws M68kException {
  5143:     int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz
  5144:     if (w << -11 != 0) {
  5145:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  5146:       throw M68kException.m6eSignal;
  5147:     }
  5148:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5149:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5150:       throw M68kException.m6eSignal;
  5151:     }
  5152:     //以下はスーパーバイザモード
  5153:     XEiJ.mpuCycleCount += 4;
  5154:     int a = efaMltByte (XEiJ.regOC & 63);
  5155:     int n = w >>> 12;  //n
  5156:     if (w << 31 - 11 >= 0) {  //MOVES.B <ea>,Rn。リード
  5157:       MemoryMappedDevice[] mm;
  5158:       if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) {  //ユーザモード
  5159:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5160:       } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) {  //スーパーバイザモード
  5161:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5162:       } else {  //CPU空間などは不可
  5163:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5164:         M68kException.m6eAddress = a;
  5165:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5166:         M68kException.m6eSize = XEiJ.MPU_SS_BYTE;
  5167:         throw M68kException.m6eSignal;
  5168:       }
  5169:       if (n < 8) {  //MOVES.B <ea>,Dn
  5170:         XEiJ.regRn[n] = XEiJ.regRn[n] & ~255 | mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbz (a);
  5171:       } else {  //MOVES.B <ea>,An
  5172:         XEiJ.regRn[n] = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbs (a);
  5173:       }
  5174:     } else {  //MOVES.B Rn,<ea>。ライト
  5175:       MemoryMappedDevice[] mm;
  5176:       if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) {  //ユーザモード
  5177:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5178:       } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) {  //スーパーバイザモード
  5179:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5180:       } else {  //CPU空間などは不可
  5181:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5182:         M68kException.m6eAddress = a;
  5183:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5184:         M68kException.m6eSize = XEiJ.MPU_SS_BYTE;
  5185:         throw M68kException.m6eSignal;
  5186:       }
  5187:       mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWb (a, XEiJ.regRn[n]);
  5188:     }
  5189:   }  //irpMovesByte
  5190: 
  5191:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5192:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5193:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5194:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5195:   //MOVES.W <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_001_mmm_rrr-rnnn000000000000
  5196:   //MOVES.W Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_001_mmm_rrr-rnnn100000000000
  5197:   //
  5198:   //MOVES.W <ea>,Rn
  5199:   //  MOVES.W <ea>,DnはDnの下位ワードだけ更新する
  5200:   //  MOVES.W <ea>,Anはワードデータをロングに符号拡張してAnの全体を更新する
  5201:   //  SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、
  5202:   //  SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5203:   //
  5204:   //MOVES.W Rn,<ea>
  5205:   //  DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、
  5206:   //  DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5207:   public static void irpMovesWord () throws M68kException {
  5208:     int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz
  5209:     if (w << -11 != 0) {
  5210:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  5211:       throw M68kException.m6eSignal;
  5212:     }
  5213:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5214:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5215:       throw M68kException.m6eSignal;
  5216:     }
  5217:     //以下はスーパーバイザモード
  5218:     XEiJ.mpuCycleCount += 4;
  5219:     int a = efaMltWord (XEiJ.regOC & 63);
  5220:     int n = w >>> 12;  //n
  5221:     if (w << 31 - 11 >= 0) {  //MOVES.W <ea>,Rn。リード
  5222:       MemoryMappedDevice[] mm;
  5223:       if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) {  //ユーザモード
  5224:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5225:       } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) {  //スーパーバイザモード
  5226:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5227:       } else {  //CPU空間などは不可
  5228:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5229:         M68kException.m6eAddress = a;
  5230:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5231:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5232:         throw M68kException.m6eSignal;
  5233:       }
  5234:       int z;
  5235:       if ((a & 1) == 0) {  //偶数
  5236:         z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a);
  5237:       } else {  //奇数
  5238:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5239:         M68kException.m6eAddress = a;
  5240:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5241:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5242:         throw M68kException.m6eSignal;
  5243:       }
  5244:       if (n < 8) {  //MOVES.W <ea>,Dn
  5245:         XEiJ.regRn[n] = XEiJ.regRn[n] & ~65535 | z;
  5246:       } else {  //MOVES.W <ea>,An
  5247:         XEiJ.regRn[n] = (short) z;
  5248:       }
  5249:     } else {  //MOVES.W Rn,<ea>。ライト
  5250:       MemoryMappedDevice[] mm;
  5251:       if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) {  //ユーザモード
  5252:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5253:       } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) {  //スーパーバイザモード
  5254:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5255:       } else {  //CPU空間などは不可
  5256:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5257:         M68kException.m6eAddress = a;
  5258:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5259:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5260:         throw M68kException.m6eSignal;
  5261:       }
  5262:       int z = XEiJ.regRn[n];
  5263:       if ((a & 1) == 0) {  //偶数
  5264:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z);
  5265:       } else {  //奇数
  5266:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5267:         M68kException.m6eAddress = a;
  5268:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5269:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5270:         throw M68kException.m6eSignal;
  5271:       }
  5272:     }
  5273:   }  //irpMovesWord
  5274: 
  5275:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5276:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5277:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5278:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5279:   //MOVES.L <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_010_mmm_rrr-rnnn000000000000
  5280:   //MOVES.L Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_010_mmm_rrr-rnnn100000000000
  5281:   //
  5282:   //MOVES.L <ea>,Rn
  5283:   //  SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、
  5284:   //  SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5285:   //
  5286:   //MOVES.L Rn,<ea>
  5287:   //  DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、
  5288:   //  DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5289:   public static void irpMovesLong () throws M68kException {
  5290:     int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz
  5291:     if (w << -11 != 0) {
  5292:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  5293:       throw M68kException.m6eSignal;
  5294:     }
  5295:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5296:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5297:       throw M68kException.m6eSignal;
  5298:     }
  5299:     //以下はスーパーバイザモード
  5300:     XEiJ.mpuCycleCount += 4;
  5301:     int a = efaMltLong (XEiJ.regOC & 63);
  5302:     int n = w >>> 12;  //n
  5303:     if (w << 31 - 11 >= 0) {  //MOVES.L <ea>,Rn。リード
  5304:       MemoryMappedDevice[] mm;
  5305:       if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) {  //ユーザモード
  5306:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5307:       } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) {  //スーパーバイザモード
  5308:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5309:       } else {  //CPU空間などは不可
  5310:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5311:         M68kException.m6eAddress = a;
  5312:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5313:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5314:         throw M68kException.m6eSignal;
  5315:       }
  5316:       int z;
  5317:       if ((a & 3) == 0) {  //4の倍数
  5318:         z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRls (a);
  5319:       } else if ((a & 1) == 0) {  //4の倍数+2
  5320:         z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRws (a) << 16;
  5321:         a += 2;
  5322:         z |= mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a);
  5323:       } else {  //奇数
  5324:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5325:         M68kException.m6eAddress = a;
  5326:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5327:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5328:         throw M68kException.m6eSignal;
  5329:       }
  5330:       XEiJ.regRn[n] = z;
  5331:     } else {  //MOVES.L Rn,<ea>。ライト
  5332:       MemoryMappedDevice[] mm;
  5333:       if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) {  //ユーザモード
  5334:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5335:       } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) {  //スーパーバイザモード
  5336:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5337:       } else {  //CPU空間などは不可
  5338:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5339:         M68kException.m6eAddress = a;
  5340:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5341:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5342:         throw M68kException.m6eSignal;
  5343:       }
  5344:       int z = XEiJ.regRn[n];
  5345:       if ((a & 3) == 0) {  //4の倍数
  5346:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWl (a, z);
  5347:       } else if ((a & 1) == 0) {  //4の倍数+2
  5348:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z >> 16);
  5349:         a += 2;
  5350:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z);
  5351:       } else {  //奇数
  5352:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5353:         M68kException.m6eAddress = a;
  5354:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5355:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5356:         throw M68kException.m6eSignal;
  5357:       }
  5358:     }
  5359:   }  //irpMovesLong
  5360: 
  5361:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5362:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5363:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5364:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5365:   //MOVE.B <ea>,Dq                                  |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr
  5366:   public static void irpMoveToDRByte () throws M68kException {
  5367:     XEiJ.mpuCycleCount += 4;
  5368:     int ea = XEiJ.regOC & 63;
  5369:     int qqq = XEiJ.regOC >> 9 & 7;
  5370:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
  5371:     XEiJ.regRn[qqq] = ~255 & XEiJ.regRn[qqq] | 255 & z;
  5372:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5373:   }  //irpMoveToDRByte
  5374: 
  5375:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5376:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5377:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5378:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5379:   //MOVE.B <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr
  5380:   public static void irpMoveToMMByte () throws M68kException {
  5381:     XEiJ.mpuCycleCount += 8;
  5382:     int ea = XEiJ.regOC & 63;
  5383:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5384:     XEiJ.busWb (XEiJ.regRn[XEiJ.regOC >> 9], z);  //1qqq=aqq
  5385:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5386:   }  //irpMoveToMMByte
  5387: 
  5388:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5389:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5390:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5391:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5392:   //MOVE.B <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr
  5393:   public static void irpMoveToMPByte () throws M68kException {
  5394:     XEiJ.mpuCycleCount += 8;
  5395:     int ea = XEiJ.regOC & 63;
  5396:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5397:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5398:     XEiJ.busWb (aqq < 15 ? XEiJ.regRn[aqq]++ : (XEiJ.regRn[15] += 2) - 2, z);
  5399:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5400:   }  //irpMoveToMPByte
  5401: 
  5402:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5403:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5404:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5405:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5406:   //MOVE.B <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr
  5407:   public static void irpMoveToMNByte () throws M68kException {
  5408:     XEiJ.mpuCycleCount += 8;
  5409:     int ea = XEiJ.regOC & 63;
  5410:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5411:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5412:     XEiJ.busWb (aqq < 15 ? --XEiJ.regRn[aqq] : (XEiJ.regRn[15] -= 2), z);
  5413:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5414:   }  //irpMoveToMNByte
  5415: 
  5416:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5417:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5418:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5419:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5420:   //MOVE.B <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr
  5421:   public static void irpMoveToMWByte () throws M68kException {
  5422:     XEiJ.mpuCycleCount += 12;
  5423:     int ea = XEiJ.regOC & 63;
  5424:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5425:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5426:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5427:       XEiJ.busWb (XEiJ.regRn[aqq]  //ベースレジスタ
  5428:           + XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws。ワードディスプレースメント
  5429:           z);
  5430:     } else {
  5431:       int t = XEiJ.regPC;
  5432:       XEiJ.regPC = t + 2;
  5433:       XEiJ.busWb (XEiJ.regRn[aqq]  //ベースレジスタ
  5434:           + XEiJ.busRwse (t),  //pcws。ワードディスプレースメント
  5435:           z);
  5436:     }
  5437:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5438:   }  //irpMoveToMWByte
  5439: 
  5440:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5441:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5442:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5443:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5444:   //MOVE.B <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr
  5445:   public static void irpMoveToMXByte () throws M68kException {
  5446:     XEiJ.mpuCycleCount += 14;
  5447:     int ea = XEiJ.regOC & 63;
  5448:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5449:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5450:     int w;
  5451:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5452:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  5453:     } else {
  5454:       w = XEiJ.regPC;
  5455:       XEiJ.regPC = w + 2;
  5456:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  5457:     }
  5458:     XEiJ.busWb (XEiJ.regRn[aqq]  //ベースレジスタ
  5459:         + (byte) w  //バイトディスプレースメント
  5460:         + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
  5461:            XEiJ.regRn[w >> 12]),  //ロングインデックス
  5462:         z);
  5463:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5464:   }  //irpMoveToMXByte
  5465: 
  5466:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5467:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5468:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5469:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5470:   //MOVE.B <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr
  5471:   public static void irpMoveToZWByte () throws M68kException {
  5472:     XEiJ.mpuCycleCount += 12;
  5473:     int ea = XEiJ.regOC & 63;
  5474:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
  5475:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5476:       XEiJ.busWb (XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws
  5477:           z);
  5478:     } else {
  5479:       int t = XEiJ.regPC;
  5480:       XEiJ.regPC = t + 2;
  5481:       XEiJ.busWb (XEiJ.busRwse (t),  //pcws
  5482:           z);
  5483:     }
  5484:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5485:   }  //irpMoveToZWByte
  5486: 
  5487:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5488:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5489:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5490:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5491:   //MOVE.B <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr
  5492:   public static void irpMoveToZLByte () throws M68kException {
  5493:     XEiJ.mpuCycleCount += 16;
  5494:     int ea = XEiJ.regOC & 63;
  5495:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
  5496:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5497:       XEiJ.busWb (XEiJ.busRlse ((XEiJ.regPC += 4) - 4),  //pcls
  5498:           z);
  5499:     } else {
  5500:       int t = XEiJ.regPC;
  5501:       XEiJ.regPC = t + 4;
  5502:       XEiJ.busWb (XEiJ.busRlse (t),  //pcls
  5503:           z);
  5504:     }
  5505:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5506:   }  //irpMoveToZLByte
  5507: 
  5508:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5509:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5510:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5511:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5512:   //MOVE.L <ea>,Dq                                  |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr
  5513:   public static void irpMoveToDRLong () throws M68kException {
  5514:     XEiJ.mpuCycleCount += 4;
  5515:     int ea = XEiJ.regOC & 63;
  5516:     int z;
  5517:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5518:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5519:   }  //irpMoveToDRLong
  5520: 
  5521:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5522:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5523:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5524:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5525:   //MOVEA.L <ea>,Aq                                 |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr
  5526:   //MOVE.L <ea>,Aq                                  |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq]
  5527:   public static void irpMoveaLong () throws M68kException {
  5528:     XEiJ.mpuCycleCount += 4;
  5529:     int ea = XEiJ.regOC & 63;
  5530:     XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意
  5531:   }  //irpMoveaLong
  5532: 
  5533:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5534:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5535:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5536:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5537:   //MOVE.L <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr
  5538:   public static void irpMoveToMMLong () throws M68kException {
  5539:     XEiJ.mpuCycleCount += 12;
  5540:     int ea = XEiJ.regOC & 63;
  5541:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5542:     XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)], z);
  5543:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5544:   }  //irpMoveToMMLong
  5545: 
  5546:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5547:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5548:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5549:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5550:   //MOVE.L <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr
  5551:   public static void irpMoveToMPLong () throws M68kException {
  5552:     XEiJ.mpuCycleCount += 12;
  5553:     int ea = XEiJ.regOC & 63;
  5554:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5555:     XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] += 4) - 4, z);
  5556:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5557:   }  //irpMoveToMPLong
  5558: 
  5559:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5560:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5561:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5562:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5563:   //MOVE.L <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr
  5564:   public static void irpMoveToMNLong () throws M68kException {
  5565:     XEiJ.mpuCycleCount += 12;
  5566:     int ea = XEiJ.regOC & 63;
  5567:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5568:     XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] -= 4), z);
  5569:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5570:   }  //irpMoveToMNLong
  5571: 
  5572:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5573:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5574:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5575:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5576:   //MOVE.L <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr
  5577:   public static void irpMoveToMWLong () throws M68kException {
  5578:     XEiJ.mpuCycleCount += 16;
  5579:     int ea = XEiJ.regOC & 63;
  5580:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5581:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5582:       XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)]  //ベースレジスタ
  5583:           + XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws。ワードディスプレースメント
  5584:           z);
  5585:     } else {
  5586:       int t = XEiJ.regPC;
  5587:       XEiJ.regPC = t + 2;
  5588:       XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)]  //ベースレジスタ
  5589:           + XEiJ.busRwse (t),  //pcws。ワードディスプレースメント
  5590:           z);
  5591:     }
  5592:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5593:   }  //irpMoveToMWLong
  5594: 
  5595:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5596:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5597:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5598:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5599:   //MOVE.L <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr
  5600:   public static void irpMoveToMXLong () throws M68kException {
  5601:     XEiJ.mpuCycleCount += 18;
  5602:     int ea = XEiJ.regOC & 63;
  5603:     int aqq = (XEiJ.regOC >> 9) - (16 - 8);
  5604:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5605:     int w;
  5606:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5607:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  5608:     } else {
  5609:       w = XEiJ.regPC;
  5610:       XEiJ.regPC = w + 2;
  5611:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  5612:     }
  5613:     XEiJ.busWl (XEiJ.regRn[aqq]  //ベースレジスタ
  5614:         + (byte) w  //バイトディスプレースメント
  5615:         + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
  5616:            XEiJ.regRn[w >> 12]),  //ロングインデックス
  5617:         z);
  5618:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5619:   }  //irpMoveToMXLong
  5620: 
  5621:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5622:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5623:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5624:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5625:   //MOVE.L <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr
  5626:   public static void irpMoveToZWLong () throws M68kException {
  5627:     XEiJ.mpuCycleCount += 16;
  5628:     int ea = XEiJ.regOC & 63;
  5629:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5630:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5631:       XEiJ.busWl (XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws
  5632:           z);
  5633:     } else {
  5634:       int t = XEiJ.regPC;
  5635:       XEiJ.regPC = t + 2;
  5636:       XEiJ.busWl (XEiJ.busRwse (t),  //pcws
  5637:           z);
  5638:     }
  5639:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5640:   }  //irpMoveToZWLong
  5641: 
  5642:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5643:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5644:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5645:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5646:   //MOVE.L <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr
  5647:   public static void irpMoveToZLLong () throws M68kException {
  5648:     XEiJ.mpuCycleCount += 20;
  5649:     int ea = XEiJ.regOC & 63;
  5650:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5651:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5652:       XEiJ.busWl (XEiJ.busRlse ((XEiJ.regPC += 4) - 4),  //pcls
  5653:           z);
  5654:     } else {
  5655:       int t = XEiJ.regPC;
  5656:       XEiJ.regPC = t + 4;
  5657:       XEiJ.busWl (XEiJ.busRlse (t),  //pcls
  5658:           z);
  5659:     }
  5660:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  5661:   }  //irpMoveToZLLong
  5662: 
  5663:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5664:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5665:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5666:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5667:   //MOVE.W <ea>,Dq                                  |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr
  5668:   public static void irpMoveToDRWord () throws M68kException {
  5669:     XEiJ.mpuCycleCount += 4;
  5670:     int ea = XEiJ.regOC & 63;
  5671:     int qqq = XEiJ.regOC >> 9 & 7;
  5672:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5673:     XEiJ.regRn[qqq] = ~65535 & XEiJ.regRn[qqq] | (char) z;
  5674:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5675:   }  //irpMoveToDRWord
  5676: 
  5677:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5678:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5679:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5680:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5681:   //MOVEA.W <ea>,Aq                                 |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr
  5682:   //MOVE.W <ea>,Aq                                  |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq]
  5683:   //
  5684:   //MOVEA.W <ea>,Aq
  5685:   //  ワードデータをロングに符号拡張してAqの全体を更新する
  5686:   public static void irpMoveaWord () throws M68kException {
  5687:     XEiJ.mpuCycleCount += 4;
  5688:     int ea = XEiJ.regOC & 63;
  5689:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //符号拡張して32bit全部書き換える。このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意
  5690:   }  //irpMoveaWord
  5691: 
  5692:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5693:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5694:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5695:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5696:   //MOVE.W <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr
  5697:   public static void irpMoveToMMWord () throws M68kException {
  5698:     XEiJ.mpuCycleCount += 8;
  5699:     int ea = XEiJ.regOC & 63;
  5700:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5701:     XEiJ.busWw (XEiJ.regRn[XEiJ.regOC >> 9 & 15], z);
  5702:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5703:   }  //irpMoveToMMWord
  5704: 
  5705:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5706:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5707:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5708:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5709:   //MOVE.W <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr
  5710:   public static void irpMoveToMPWord () throws M68kException {
  5711:     XEiJ.mpuCycleCount += 8;
  5712:     int ea = XEiJ.regOC & 63;
  5713:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5714:     XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2, z);
  5715:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5716:   }  //irpMoveToMPWord
  5717: 
  5718:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5719:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5720:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5721:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5722:   //MOVE.W <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr
  5723:   public static void irpMoveToMNWord () throws M68kException {
  5724:     XEiJ.mpuCycleCount += 8;
  5725:     int ea = XEiJ.regOC & 63;
  5726:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5727:     XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2), z);
  5728:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5729:   }  //irpMoveToMNWord
  5730: 
  5731:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5732:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5733:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5734:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5735:   //MOVE.W <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr
  5736:   public static void irpMoveToMWWord () throws M68kException {
  5737:     XEiJ.mpuCycleCount += 12;
  5738:     int ea = XEiJ.regOC & 63;
  5739:     int aqq = XEiJ.regOC >> 9 & 15;
  5740:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5741:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5742:       XEiJ.busWw (XEiJ.regRn[aqq]  //ベースレジスタ
  5743:           + XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws。ワードディスプレースメント
  5744:           z);
  5745:     } else {
  5746:       int t = XEiJ.regPC;
  5747:       XEiJ.regPC = t + 2;
  5748:       XEiJ.busWw (XEiJ.regRn[aqq]  //ベースレジスタ
  5749:           + XEiJ.busRwse (t),  //pcws。ワードディスプレースメント
  5750:           z);
  5751:     }
  5752:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5753:   }  //irpMoveToMWWord
  5754: 
  5755:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5756:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5757:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5758:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5759:   //MOVE.W <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr
  5760:   public static void irpMoveToMXWord () throws M68kException {
  5761:     XEiJ.mpuCycleCount += 14;
  5762:     int ea = XEiJ.regOC & 63;
  5763:     int aqq = XEiJ.regOC >> 9 & 15;
  5764:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5765:     int w;
  5766:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5767:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  5768:     } else {
  5769:       w = XEiJ.regPC;
  5770:       XEiJ.regPC = w + 2;
  5771:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  5772:     }
  5773:     XEiJ.busWw (XEiJ.regRn[aqq]  //ベースレジスタ
  5774:         + (byte) w  //バイトディスプレースメント
  5775:         + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
  5776:            XEiJ.regRn[w >> 12]),  //ロングインデックス
  5777:         z);
  5778:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5779:   }  //irpMoveToMXWord
  5780: 
  5781:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5782:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5783:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5784:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5785:   //MOVE.W <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr
  5786:   public static void irpMoveToZWWord () throws M68kException {
  5787:     XEiJ.mpuCycleCount += 12;
  5788:     int ea = XEiJ.regOC & 63;
  5789:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5790:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5791:       XEiJ.busWw (XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws
  5792:           z);
  5793:     } else {
  5794:       int t = XEiJ.regPC;
  5795:       XEiJ.regPC = t + 2;
  5796:       XEiJ.busWw (XEiJ.busRwse (t),  //pcws
  5797:           z);
  5798:     }
  5799:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5800:   }  //irpMoveToZWWord
  5801: 
  5802:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5803:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5804:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5805:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5806:   //MOVE.W <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr
  5807:   public static void irpMoveToZLWord () throws M68kException {
  5808:     XEiJ.mpuCycleCount += 16;
  5809:     int ea = XEiJ.regOC & 63;
  5810:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5811:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5812:       XEiJ.busWw (XEiJ.busRlse ((XEiJ.regPC += 4) - 4),  //pcls
  5813:           z);
  5814:     } else {
  5815:       int t = XEiJ.regPC;
  5816:       XEiJ.regPC = t + 4;
  5817:       XEiJ.busWw (XEiJ.busRlse (t),  //pcls
  5818:           z);
  5819:     }
  5820:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  5821:   }  //irpMoveToZLWord
  5822: 
  5823:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5824:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5825:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5826:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5827:   //NEGX.B <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_000_mmm_rrr
  5828:   public static void irpNegxByte () throws M68kException {
  5829:     int ea = XEiJ.regOC & 63;
  5830:     int y;
  5831:     int z;
  5832:     if (ea < XEiJ.EA_AR) {  //NEGX.B Dr
  5833:       XEiJ.mpuCycleCount += 4;
  5834:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y) - (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
  5835:     } else {  //NEGX.B <mem>
  5836:       XEiJ.mpuCycleCount += 8;
  5837:       int a = efaMltByte (ea);
  5838:       XEiJ.busWb (a, z = (byte) (-(y = XEiJ.busRbs (a)) - (XEiJ.regCCR >> 4)));  //Xの左側はすべて0なのでCCR_X&を省略
  5839:     }
  5840:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
  5841:            (y & z) >>> 31 << 1 |
  5842:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_negx
  5843:   }  //irpNegxByte
  5844: 
  5845:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5846:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5847:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5848:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5849:   //NEGX.W <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_001_mmm_rrr
  5850:   public static void irpNegxWord () throws M68kException {
  5851:     int ea = XEiJ.regOC & 63;
  5852:     int y;
  5853:     int z;
  5854:     if (ea < XEiJ.EA_AR) {  //NEGX.W Dr
  5855:       XEiJ.mpuCycleCount += 4;
  5856:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) (-(y = (short) y) - (XEiJ.regCCR >> 4)));  //Xの左側はすべて0なのでCCR_X&を省略
  5857:     } else {  //NEGX.W <mem>
  5858:       XEiJ.mpuCycleCount += 8;
  5859:       int a = efaMltWord (ea);
  5860:       XEiJ.busWw (a, z = (short) (-(y = XEiJ.busRws (a)) - (XEiJ.regCCR >> 4)));  //Xの左側はすべて0なのでCCR_X&を省略
  5861:     }
  5862:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
  5863:            (y & z) >>> 31 << 1 |
  5864:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_negx
  5865:   }  //irpNegxWord
  5866: 
  5867:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5868:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5869:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5870:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5871:   //NEGX.L <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_010_mmm_rrr
  5872:   public static void irpNegxLong () throws M68kException {
  5873:     int ea = XEiJ.regOC & 63;
  5874:     int y;
  5875:     int z;
  5876:     if (ea < XEiJ.EA_AR) {  //NEGX.L Dr
  5877:       XEiJ.mpuCycleCount += 6;
  5878:       XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
  5879:     } else {  //NEGX.L <mem>
  5880:       XEiJ.mpuCycleCount += 12;
  5881:       int a = efaMltLong (ea);
  5882:       XEiJ.busWl (a, z = -(y = XEiJ.busRls (a)) - (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
  5883:     }
  5884:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
  5885:            (y & z) >>> 31 << 1 |
  5886:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_negx
  5887:   }  //irpNegxLong
  5888: 
  5889:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5890:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5891:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5892:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5893:   //MOVE.W SR,<ea>                                  |-|-12346|P|*****|-----|D M+-WXZ  |0100_000_011_mmm_rrr
  5894:   public static void irpMoveFromSR () throws M68kException {
  5895:     //MC68010以上では特権命令
  5896:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5897:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5898:       throw M68kException.m6eSignal;
  5899:     }
  5900:     //以下はスーパーバイザモード
  5901:     int ea = XEiJ.regOC & 63;
  5902:     if (ea < XEiJ.EA_AR) {  //MOVE.W SR,Dr
  5903:       XEiJ.mpuCycleCount += 6;
  5904:       XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  5905:     } else {  //MOVE.W SR,<mem>
  5906:       //! 軽量化。MOVE from SRによる直後の命令のイミディエイトオペランドの自己書き換えが直後に反映されてしまう
  5907:       //  MC68000でFEファンクションコールやSXコールのようなCCRを変化させる例外処理ルーチンの出口を次のように書くと、
  5908:       //  自己書き換えが直後に反映されずイミディエイトオペランドの領域がバッファになって前回の結果を返すことになるので期待通りに動作しない
  5909:       //              move.w  sr,@f+2
  5910:       //      @@:     move.b  #0,(1,sp)
  5911:       //              rte
  5912:       //  これが期待通りに動作してしまったらMC68000を正しくエミュレートできていないということになる
  5913:       //  https://stdkmd.net/bbs/page2.htm#comment134
  5914:       XEiJ.mpuCycleCount += 8;
  5915:       int a = efaMltWord (ea);
  5916:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  5917:         //! 軽量化。MC68000では書き込む前にリードが入るが省略する
  5918:       } else {
  5919:         XEiJ.busRws (a);
  5920:       }
  5921:       XEiJ.busWw (a, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);
  5922:     }
  5923:   }  //irpMoveFromSR
  5924: 
  5925:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5926:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5927:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5928:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5929:   //CHK.W <ea>,Dq                                   |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr
  5930:   public static void irpChkWord () throws M68kException {
  5931:     XEiJ.mpuCycleCount += 10;
  5932:     int ea = XEiJ.regOC & 63;
  5933:     int x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));
  5934:     int y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7];
  5935:     int z = (short) (x - y);
  5936:     XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |
  5937:                    (y < 0 ? XEiJ.REG_CCR_N : 0) |
  5938:                    (y == 0 ? XEiJ.REG_CCR_Z : 0) |
  5939:                    ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  5940:                    (x & (y ^ z) ^ (y | z)) >>> 31);
  5941:     if (y < 0 || x < y) {
  5942:       XEiJ.mpuCycleCount += 38 - 10;
  5943:       M68kException.m6eNumber = M68kException.M6E_CHK_INSTRUCTION;
  5944:       throw M68kException.m6eSignal;
  5945:     }
  5946:   }  //irpChkWord
  5947: 
  5948:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5949:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5950:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5951:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5952:   //LEA.L <ea>,Aq                                   |-|012346|-|-----|-----|  M  WXZP |0100_qqq_111_mmm_rrr
  5953:   public static void irpLea () throws M68kException {
  5954:     //XEiJ.mpuCycleCount += 4 - 4;
  5955:     XEiJ.regRn[(XEiJ.regOC >> 9) - (32 - 8)] = efaLeaPea (XEiJ.regOC & 63);
  5956:   }  //irpLea
  5957: 
  5958:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5959:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5960:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5961:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5962:   //CLR.B <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_000_mmm_rrr (68000 and 68008 read before clear)
  5963:   public static void irpClrByte () throws M68kException {
  5964:     int ea = XEiJ.regOC & 63;
  5965:     if (ea < XEiJ.EA_AR) {  //CLR.B Dr
  5966:       XEiJ.mpuCycleCount += 4;
  5967:       XEiJ.regRn[ea] &= ~0xff;
  5968:     } else {  //CLR.B <mem>
  5969:       //MC68010はリードしない
  5970:       XEiJ.mpuCycleCount += 8;
  5971:       XEiJ.busWb (efaMltByte (ea), 0);
  5972:     }
  5973:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z;  //ccr_clr
  5974:   }  //irpClrByte
  5975: 
  5976:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5977:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5978:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5979:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5980:   //CLR.W <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_001_mmm_rrr (68000 and 68008 read before clear)
  5981:   public static void irpClrWord () throws M68kException {
  5982:     int ea = XEiJ.regOC & 63;
  5983:     if (ea < XEiJ.EA_AR) {  //CLR.W Dr
  5984:       XEiJ.mpuCycleCount += 4;
  5985:       XEiJ.regRn[ea] &= ~0xffff;
  5986:     } else {  //CLR.W <mem>
  5987:       //MC68010はリードしない
  5988:       XEiJ.mpuCycleCount += 8;
  5989:       XEiJ.busWw (efaMltWord (ea), 0);
  5990:     }
  5991:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z;  //ccr_clr
  5992:   }  //irpClrWord
  5993: 
  5994:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5995:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5996:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5997:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5998:   //CLR.L <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_010_mmm_rrr (68000 and 68008 read before clear)
  5999:   public static void irpClrLong () throws M68kException {
  6000:     int ea = XEiJ.regOC & 63;
  6001:     if (ea < XEiJ.EA_AR) {  //CLR.L Dr
  6002:       XEiJ.mpuCycleCount += 6;
  6003:       XEiJ.regRn[ea] = 0;
  6004:     } else {  //CLR.L <mem>
  6005:       //MC68010はリードしない
  6006:       XEiJ.mpuCycleCount += 12;
  6007:       XEiJ.busWl (efaMltLong (ea), 0);
  6008:     }
  6009:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z;  //ccr_clr
  6010:   }  //irpClrLong
  6011: 
  6012:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6013:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6014:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6015:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6016:   //MOVE.W CCR,<ea>                                 |-|-12346|-|*****|-----|D M+-WXZ  |0100_001_011_mmm_rrr
  6017:   public static void irpMoveFromCCR () throws M68kException {
  6018:     int ea = XEiJ.regOC & 63;
  6019:     if (ea < XEiJ.EA_AR) {  //MOVE.W CCR,Dr
  6020:       XEiJ.mpuCycleCount += 4;
  6021:       XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regCCR;
  6022:     } else {  //MOVE.W CCR,<mem>
  6023:       XEiJ.mpuCycleCount += 8;
  6024:       XEiJ.busWw (efaMltWord (ea), XEiJ.regCCR);
  6025:     }
  6026:   }  //irpMoveFromCCR
  6027: 
  6028:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6029:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6030:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6031:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6032:   //NEG.B <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_000_mmm_rrr
  6033:   public static void irpNegByte () throws M68kException {
  6034:     int ea = XEiJ.regOC & 63;
  6035:     int y;
  6036:     int z;
  6037:     if (ea < XEiJ.EA_AR) {  //NEG.B Dr
  6038:       XEiJ.mpuCycleCount += 4;
  6039:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y));
  6040:     } else {  //NEG.B <mem>
  6041:       XEiJ.mpuCycleCount += 8;
  6042:       int a = efaMltByte (ea);
  6043:       XEiJ.busWb (a, z = (byte) -(y = XEiJ.busRbs (a)));
  6044:     }
  6045:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  6046:            (y & z) >>> 31 << 1 |
  6047:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_neg
  6048:   }  //irpNegByte
  6049: 
  6050:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6051:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6052:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6053:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6054:   //NEG.W <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_001_mmm_rrr
  6055:   public static void irpNegWord () throws M68kException {
  6056:     int ea = XEiJ.regOC & 63;
  6057:     int y;
  6058:     int z;
  6059:     if (ea < XEiJ.EA_AR) {  //NEG.W Dr
  6060:       XEiJ.mpuCycleCount += 4;
  6061:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) -(y = (short) y));
  6062:     } else {  //NEG.W <mem>
  6063:       XEiJ.mpuCycleCount += 8;
  6064:       int a = efaMltWord (ea);
  6065:       XEiJ.busWw (a, z = (short) -(y = XEiJ.busRws (a)));
  6066:     }
  6067:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  6068:            (y & z) >>> 31 << 1 |
  6069:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_neg
  6070:   }  //irpNegWord
  6071: 
  6072:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6073:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6074:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6075:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6076:   //NEG.L <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_010_mmm_rrr
  6077:   public static void irpNegLong () throws M68kException {
  6078:     int ea = XEiJ.regOC & 63;
  6079:     int y;
  6080:     int z;
  6081:     if (ea < XEiJ.EA_AR) {  //NEG.L Dr
  6082:       XEiJ.mpuCycleCount += 6;
  6083:       XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]);
  6084:     } else {  //NEG.L <mem>
  6085:       XEiJ.mpuCycleCount += 12;
  6086:       int a = efaMltLong (ea);
  6087:       XEiJ.busWl (a, z = -(y = XEiJ.busRls (a)));
  6088:     }
  6089:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  6090:            (y & z) >>> 31 << 1 |
  6091:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_neg
  6092:   }  //irpNegLong
  6093: 
  6094:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6095:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6096:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6097:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6098:   //MOVE.W <ea>,CCR                                 |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr
  6099:   public static void irpMoveToCCR () throws M68kException {
  6100:     XEiJ.mpuCycleCount += 12;
  6101:     int ea = XEiJ.regOC & 63;
  6102:     XEiJ.regCCR = XEiJ.REG_CCR_MASK & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)));
  6103:   }  //irpMoveToCCR
  6104: 
  6105:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6106:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6107:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6108:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6109:   //NOT.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_000_mmm_rrr
  6110:   public static void irpNotByte () throws M68kException {
  6111:     int ea = XEiJ.regOC & 63;
  6112:     int z;
  6113:     if (ea < XEiJ.EA_AR) {  //NOT.B Dr
  6114:       XEiJ.mpuCycleCount += 4;
  6115:       z = XEiJ.regRn[ea] ^= 255;  //0拡張してからEOR
  6116:     } else {  //NOT.B <mem>
  6117:       XEiJ.mpuCycleCount += 8;
  6118:       int a = efaMltByte (ea);
  6119:       XEiJ.busWb (a, z = ~XEiJ.busRbs (a));
  6120:     }
  6121:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  6122:   }  //irpNotByte
  6123: 
  6124:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6125:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6126:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6127:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6128:   //NOT.W <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_001_mmm_rrr
  6129:   public static void irpNotWord () throws M68kException {
  6130:     int ea = XEiJ.regOC & 63;
  6131:     int z;
  6132:     if (ea < XEiJ.EA_AR) {  //NOT.W Dr
  6133:       XEiJ.mpuCycleCount += 4;
  6134:       z = XEiJ.regRn[ea] ^= 65535;  //0拡張してからEOR
  6135:     } else {  //NOT.W <mem>
  6136:       XEiJ.mpuCycleCount += 8;
  6137:       int a = efaMltWord (ea);
  6138:       XEiJ.busWw (a, z = ~XEiJ.busRws (a));
  6139:     }
  6140:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  6141:   }  //irpNotWord
  6142: 
  6143:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6144:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6145:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6146:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6147:   //NOT.L <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_010_mmm_rrr
  6148:   public static void irpNotLong () throws M68kException {
  6149:     int ea = XEiJ.regOC & 63;
  6150:     int z;
  6151:     if (ea < XEiJ.EA_AR) {  //NOT.L Dr
  6152:       XEiJ.mpuCycleCount += 6;
  6153:       z = XEiJ.regRn[ea] ^= 0xffffffff;
  6154:     } else {  //NOT.L <mem>
  6155:       XEiJ.mpuCycleCount += 12;
  6156:       int a = efaMltLong (ea);
  6157:       XEiJ.busWl (a, z = ~XEiJ.busRls (a));
  6158:     }
  6159:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  6160:   }  //irpNotLong
  6161: 
  6162:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6163:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6164:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6165:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6166:   //MOVE.W <ea>,SR                                  |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr
  6167:   public static void irpMoveToSR () throws M68kException {
  6168:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  6169:       XEiJ.mpuCycleCount += 34;
  6170:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  6171:       throw M68kException.m6eSignal;
  6172:     }
  6173:     //以下はスーパーバイザモード
  6174:     XEiJ.mpuCycleCount += 12;
  6175:     int ea = XEiJ.regOC & 63;
  6176:     irpSetSR (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)));  //特権違反チェックが先
  6177:   }  //irpMoveToSR
  6178: 
  6179:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6180:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6181:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6182:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6183:   //NBCD.B <ea>                                     |-|012346|-|UUUUU|*U*U*|D M+-WXZ  |0100_100_000_mmm_rrr
  6184:   public static void irpNbcd () throws M68kException {
  6185:     int ea = XEiJ.regOC & 63;
  6186:     if (ea < XEiJ.EA_AR) {  //NBCD.B Dr
  6187:       XEiJ.mpuCycleCount += 6;
  6188:       XEiJ.regRn[ea] = ~0xff & XEiJ.regRn[ea] | irpSbcd (0, XEiJ.regRn[ea]);
  6189:     } else {  //NBCD.B <mem>
  6190:       XEiJ.mpuCycleCount += 8;
  6191:       int a = efaMltByte (ea);
  6192:       XEiJ.busWb (a, irpSbcd (0, XEiJ.busRbs (a)));
  6193:     }
  6194:   }  //irpNbcd
  6195: 
  6196:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6197:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6198:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6199:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6200:   //SWAP.W Dr                                       |-|012346|-|-UUUU|-**00|D         |0100_100_001_000_rrr
  6201:   //BKPT #<data>                                    |-|-12346|-|-----|-----|          |0100_100_001_001_ddd
  6202:   //PEA.L <ea>                                      |-|012346|-|-----|-----|  M  WXZP |0100_100_001_mmm_rrr
  6203:   public static void irpPea () throws M68kException {
  6204:     int ea = XEiJ.regOC & 63;
  6205:     if (ea < XEiJ.EA_AR) {  //SWAP.W Dr
  6206:       XEiJ.mpuCycleCount += 4;
  6207:       int x;
  6208:       int z;
  6209:       XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) << 16 | x >>> 16;
  6210:       //上位ワードと下位ワードを入れ替えた後のDrをロングでテストする
  6211:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  6212:     } else {  //PEA.L <ea>
  6213:       XEiJ.mpuCycleCount += 12 - 4;
  6214:       int a = efaLeaPea (ea);  //BKPT #<data>はここでillegal instructionになる
  6215:       XEiJ.busWl (XEiJ.regRn[15] -= 4, a);  //pushl。評価順序に注意。wl(r[15]-=4,eaz_leapea(ea))は不可
  6216:     }
  6217:   }  //irpPea
  6218: 
  6219:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6220:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6221:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6222:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6223:   //EXT.W Dr                                        |-|012346|-|-UUUU|-**00|D         |0100_100_010_000_rrr
  6224:   //MOVEM.W <list>,<ea>                             |-|012346|-|-----|-----|  M -WXZ  |0100_100_010_mmm_rrr-llllllllllllllll
  6225:   public static void irpMovemToMemWord () throws M68kException {
  6226:     int ea = XEiJ.regOC & 63;
  6227:     if (ea < XEiJ.EA_AR) {  //EXT.W Dr
  6228:       XEiJ.mpuCycleCount += 4;
  6229:       int z;
  6230:       XEiJ.regRn[ea] = ~0xffff & (z = XEiJ.regRn[ea]) | (char) (z = (byte) z);
  6231:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  6232:     } else {  //MOVEM.W <list>,<ea>
  6233:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  6234:       XEiJ.regPC += 2;
  6235:       if (ea >> 3 == XEiJ.MMM_MN) {  //-(Ar)
  6236:         //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む
  6237:         //転送するレジスタが0個のときArは変化しない
  6238:         int arr = ea - (XEiJ.EA_MN - 8);
  6239:         int a = XEiJ.regRn[arr];
  6240:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  6241:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  6242:           M68kException.m6eAddress = a;
  6243:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  6244:           M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  6245:           throw M68kException.m6eSignal;
  6246:         }
  6247:         int t = a;
  6248:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  6249:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 2 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  6250:             2 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) {  //16個転送してもページを跨がない
  6251:           a &= XEiJ.BUS_MOTHER_MASK;
  6252:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6253:             if ((l & 0x0001) != 0) {
  6254:               a -= 2;
  6255:               int x = XEiJ.regRn[15];
  6256:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6257:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6258:             }
  6259:             if ((l & 0x0002) != 0) {
  6260:               a -= 2;
  6261:               int x = XEiJ.regRn[14];
  6262:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6263:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6264:             }
  6265:             if ((l & 0x0004) != 0) {
  6266:               a -= 2;
  6267:               int x = XEiJ.regRn[13];
  6268:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6269:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6270:             }
  6271:             if ((l & 0x0008) != 0) {
  6272:               a -= 2;
  6273:               int x = XEiJ.regRn[12];
  6274:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6275:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6276:             }
  6277:             if ((l & 0x0010) != 0) {
  6278:               a -= 2;
  6279:               int x = XEiJ.regRn[11];
  6280:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6281:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6282:             }
  6283:             if ((l & 0x0020) != 0) {
  6284:               a -= 2;
  6285:               int x = XEiJ.regRn[10];
  6286:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6287:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6288:             }
  6289:             if ((l & 0x0040) != 0) {
  6290:               a -= 2;
  6291:               int x = XEiJ.regRn[ 9];
  6292:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6293:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6294:             }
  6295:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6296:               a -= 2;
  6297:               int x = XEiJ.regRn[ 8];
  6298:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6299:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6300:             }
  6301:             if ((l & 0x0100) != 0) {
  6302:               a -= 2;
  6303:               int x = XEiJ.regRn[ 7];
  6304:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6305:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6306:             }
  6307:             if ((l & 0x0200) != 0) {
  6308:               a -= 2;
  6309:               int x = XEiJ.regRn[ 6];
  6310:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6311:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6312:             }
  6313:             if ((l & 0x0400) != 0) {
  6314:               a -= 2;
  6315:               int x = XEiJ.regRn[ 5];
  6316:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6317:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6318:             }
  6319:             if ((l & 0x0800) != 0) {
  6320:               a -= 2;
  6321:               int x = XEiJ.regRn[ 4];
  6322:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6323:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6324:             }
  6325:             if ((l & 0x1000) != 0) {
  6326:               a -= 2;
  6327:               int x = XEiJ.regRn[ 3];
  6328:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6329:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6330:             }
  6331:             if ((l & 0x2000) != 0) {
  6332:               a -= 2;
  6333:               int x = XEiJ.regRn[ 2];
  6334:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6335:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6336:             }
  6337:             if ((l & 0x4000) != 0) {
  6338:               a -= 2;
  6339:               int x = XEiJ.regRn[ 1];
  6340:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6341:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6342:             }
  6343:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6344:               a -= 2;
  6345:               int x = XEiJ.regRn[ 0];
  6346:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6347:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6348:             }
  6349:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6350:             for (int i = 15; i >= 0; i--) {
  6351:               if ((l & 0x8000 >>> i) != 0) {
  6352:                 a -= 2;
  6353:                 int x = XEiJ.regRn[i];
  6354:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6355:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6356:               }
  6357:             }
  6358:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6359:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6360:             for (int i = 15; l != 0; i--, l <<= 1) {
  6361:               if (l < 0) {
  6362:                 a -= 2;
  6363:                 int x = XEiJ.regRn[i];
  6364:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6365:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6366:               }
  6367:             }
  6368:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6369:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6370:               if ((l & 1) != 0) {
  6371:                 a -= 2;
  6372:                 int x = XEiJ.regRn[i];
  6373:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6374:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6375:               }
  6376:             }
  6377:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6378:             for (int i = 15; l != 0; ) {
  6379:               int k = Integer.numberOfTrailingZeros (l);
  6380:               a -= 2;
  6381:               int x = XEiJ.regRn[i -= k];
  6382:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6383:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6384:               l = l >>> k & ~1;
  6385:             }
  6386:           }
  6387:           a = t - (short) (t - a);
  6388:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  6389:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6390:             if ((l & 0x0001) != 0) {
  6391:               XEiJ.busWwe (a -= 2, XEiJ.regRn[15]);
  6392:             }
  6393:             if ((l & 0x0002) != 0) {
  6394:               XEiJ.busWwe (a -= 2, XEiJ.regRn[14]);
  6395:             }
  6396:             if ((l & 0x0004) != 0) {
  6397:               XEiJ.busWwe (a -= 2, XEiJ.regRn[13]);
  6398:             }
  6399:             if ((l & 0x0008) != 0) {
  6400:               XEiJ.busWwe (a -= 2, XEiJ.regRn[12]);
  6401:             }
  6402:             if ((l & 0x0010) != 0) {
  6403:               XEiJ.busWwe (a -= 2, XEiJ.regRn[11]);
  6404:             }
  6405:             if ((l & 0x0020) != 0) {
  6406:               XEiJ.busWwe (a -= 2, XEiJ.regRn[10]);
  6407:             }
  6408:             if ((l & 0x0040) != 0) {
  6409:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 9]);
  6410:             }
  6411:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6412:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 8]);
  6413:             }
  6414:             if ((l & 0x0100) != 0) {
  6415:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 7]);
  6416:             }
  6417:             if ((l & 0x0200) != 0) {
  6418:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 6]);
  6419:             }
  6420:             if ((l & 0x0400) != 0) {
  6421:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 5]);
  6422:             }
  6423:             if ((l & 0x0800) != 0) {
  6424:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 4]);
  6425:             }
  6426:             if ((l & 0x1000) != 0) {
  6427:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 3]);
  6428:             }
  6429:             if ((l & 0x2000) != 0) {
  6430:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 2]);
  6431:             }
  6432:             if ((l & 0x4000) != 0) {
  6433:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 1]);
  6434:             }
  6435:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6436:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 0]);
  6437:             }
  6438:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6439:             for (int i = 15; i >= 0; i--) {
  6440:               if ((l & 0x8000 >>> i) != 0) {
  6441:                 XEiJ.busWwe (a -= 2, XEiJ.regRn[i]);
  6442:               }
  6443:             }
  6444:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6445:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6446:             for (int i = 15; l != 0; i--, l <<= 1) {
  6447:               if (l < 0) {
  6448:                 XEiJ.busWwe (a -= 2, XEiJ.regRn[i]);
  6449:               }
  6450:             }
  6451:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6452:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6453:               if ((l & 1) != 0) {
  6454:                 XEiJ.busWwe (a -= 2, XEiJ.regRn[i]);
  6455:               }
  6456:             }
  6457:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6458:             for (int i = 15; l != 0; ) {
  6459:               int k = Integer.numberOfTrailingZeros (l);
  6460:               XEiJ.busWwe (a -= 2, XEiJ.regRn[i -= k]);
  6461:               l = l >>> k & ~1;
  6462:             }
  6463:           }
  6464:         }
  6465:         XEiJ.regRn[arr] = a;
  6466:         XEiJ.mpuCycleCount += 8 + (t - a << 1);  //2バイト/個→4サイクル/個
  6467:       } else {  //-(Ar)以外
  6468:         int a = efaCltWord (ea);
  6469:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  6470:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  6471:           M68kException.m6eAddress = a;
  6472:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  6473:           M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  6474:           throw M68kException.m6eSignal;
  6475:         }
  6476:         int t = a;
  6477:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  6478:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  6479:             (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) {  //16個転送してもページを跨がない
  6480:           a &= XEiJ.BUS_MOTHER_MASK;
  6481:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6482:             if ((l & 0x0001) != 0) {
  6483:               int x = XEiJ.regRn[ 0];
  6484:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6485:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6486:               a += 2;
  6487:             }
  6488:             if ((l & 0x0002) != 0) {
  6489:               int x = XEiJ.regRn[ 1];
  6490:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6491:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6492:               a += 2;
  6493:             }
  6494:             if ((l & 0x0004) != 0) {
  6495:               int x = XEiJ.regRn[ 2];
  6496:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6497:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6498:               a += 2;
  6499:             }
  6500:             if ((l & 0x0008) != 0) {
  6501:               int x = XEiJ.regRn[ 3];
  6502:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6503:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6504:               a += 2;
  6505:             }
  6506:             if ((l & 0x0010) != 0) {
  6507:               int x = XEiJ.regRn[ 4];
  6508:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6509:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6510:               a += 2;
  6511:             }
  6512:             if ((l & 0x0020) != 0) {
  6513:               int x = XEiJ.regRn[ 5];
  6514:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6515:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6516:               a += 2;
  6517:             }
  6518:             if ((l & 0x0040) != 0) {
  6519:               int x = XEiJ.regRn[ 6];
  6520:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6521:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6522:               a += 2;
  6523:             }
  6524:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6525:               int x = XEiJ.regRn[ 7];
  6526:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6527:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6528:               a += 2;
  6529:             }
  6530:             if ((l & 0x0100) != 0) {
  6531:               int x = XEiJ.regRn[ 8];
  6532:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6533:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6534:               a += 2;
  6535:             }
  6536:             if ((l & 0x0200) != 0) {
  6537:               int x = XEiJ.regRn[ 9];
  6538:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6539:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6540:               a += 2;
  6541:             }
  6542:             if ((l & 0x0400) != 0) {
  6543:               int x = XEiJ.regRn[10];
  6544:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6545:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6546:               a += 2;
  6547:             }
  6548:             if ((l & 0x0800) != 0) {
  6549:               int x = XEiJ.regRn[11];
  6550:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6551:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6552:               a += 2;
  6553:             }
  6554:             if ((l & 0x1000) != 0) {
  6555:               int x = XEiJ.regRn[12];
  6556:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6557:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6558:               a += 2;
  6559:             }
  6560:             if ((l & 0x2000) != 0) {
  6561:               int x = XEiJ.regRn[13];
  6562:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6563:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6564:               a += 2;
  6565:             }
  6566:             if ((l & 0x4000) != 0) {
  6567:               int x = XEiJ.regRn[14];
  6568:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6569:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6570:               a += 2;
  6571:             }
  6572:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6573:               int x = XEiJ.regRn[15];
  6574:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6575:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6576:               a += 2;
  6577:             }
  6578:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6579:             for (int i = 0; i <= 15; i++) {
  6580:               if ((l & 0x0001 << i) != 0) {
  6581:                 int x = XEiJ.regRn[i];
  6582:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6583:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6584:                 a += 2;
  6585:               }
  6586:             }
  6587:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6588:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6589:             for (int i = 0; l != 0; i++, l <<= 1) {
  6590:               if (l < 0) {
  6591:                 int x = XEiJ.regRn[i];
  6592:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6593:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6594:                 a += 2;
  6595:               }
  6596:             }
  6597:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6598:             for (int i = 0; l != 0; i++, l >>>= 1) {
  6599:               if ((l & 1) != 0) {
  6600:                 int x = XEiJ.regRn[i];
  6601:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6602:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6603:                 a += 2;
  6604:               }
  6605:             }
  6606:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6607:             for (int i = 0; l != 0; ) {
  6608:               int k = Integer.numberOfTrailingZeros (l);
  6609:               int x = XEiJ.regRn[i += k];
  6610:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6611:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6612:               a += 2;
  6613:               l = l >>> k & ~1;
  6614:             }
  6615:           }
  6616:           a = t + (short) (a - t);
  6617:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  6618:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6619:             if ((l & 0x0001) != 0) {
  6620:               XEiJ.busWwe (a, XEiJ.regRn[ 0]);
  6621:               a += 2;
  6622:             }
  6623:             if ((l & 0x0002) != 0) {
  6624:               XEiJ.busWwe (a, XEiJ.regRn[ 1]);
  6625:               a += 2;
  6626:             }
  6627:             if ((l & 0x0004) != 0) {
  6628:               XEiJ.busWwe (a, XEiJ.regRn[ 2]);
  6629:               a += 2;
  6630:             }
  6631:             if ((l & 0x0008) != 0) {
  6632:               XEiJ.busWwe (a, XEiJ.regRn[ 3]);
  6633:               a += 2;
  6634:             }
  6635:             if ((l & 0x0010) != 0) {
  6636:               XEiJ.busWwe (a, XEiJ.regRn[ 4]);
  6637:               a += 2;
  6638:             }
  6639:             if ((l & 0x0020) != 0) {
  6640:               XEiJ.busWwe (a, XEiJ.regRn[ 5]);
  6641:               a += 2;
  6642:             }
  6643:             if ((l & 0x0040) != 0) {
  6644:               XEiJ.busWwe (a, XEiJ.regRn[ 6]);
  6645:               a += 2;
  6646:             }
  6647:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6648:               XEiJ.busWwe (a, XEiJ.regRn[ 7]);
  6649:               a += 2;
  6650:             }
  6651:             if ((l & 0x0100) != 0) {
  6652:               XEiJ.busWwe (a, XEiJ.regRn[ 8]);
  6653:               a += 2;
  6654:             }
  6655:             if ((l & 0x0200) != 0) {
  6656:               XEiJ.busWwe (a, XEiJ.regRn[ 9]);
  6657:               a += 2;
  6658:             }
  6659:             if ((l & 0x0400) != 0) {
  6660:               XEiJ.busWwe (a, XEiJ.regRn[10]);
  6661:               a += 2;
  6662:             }
  6663:             if ((l & 0x0800) != 0) {
  6664:               XEiJ.busWwe (a, XEiJ.regRn[11]);
  6665:               a += 2;
  6666:             }
  6667:             if ((l & 0x1000) != 0) {
  6668:               XEiJ.busWwe (a, XEiJ.regRn[12]);
  6669:               a += 2;
  6670:             }
  6671:             if ((l & 0x2000) != 0) {
  6672:               XEiJ.busWwe (a, XEiJ.regRn[13]);
  6673:               a += 2;
  6674:             }
  6675:             if ((l & 0x4000) != 0) {
  6676:               XEiJ.busWwe (a, XEiJ.regRn[14]);
  6677:               a += 2;
  6678:             }
  6679:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6680:               XEiJ.busWwe (a, XEiJ.regRn[15]);
  6681:               a += 2;
  6682:             }
  6683:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6684:             for (int i = 0; i <= 15; i++) {
  6685:               if ((l & 0x0001 << i) != 0) {
  6686:                 XEiJ.busWwe (a, XEiJ.regRn[i]);
  6687:                 a += 2;
  6688:               }
  6689:             }
  6690:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6691:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6692:             for (int i = 0; l != 0; i++, l <<= 1) {
  6693:               if (l < 0) {
  6694:                 XEiJ.busWwe (a, XEiJ.regRn[i]);
  6695:                 a += 2;
  6696:               }
  6697:             }
  6698:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6699:             for (int i = 0; l != 0; i++, l >>>= 1) {
  6700:               if ((l & 1) != 0) {
  6701:                 XEiJ.busWwe (a, XEiJ.regRn[i]);
  6702:                 a += 2;
  6703:               }
  6704:             }
  6705:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6706:             for (int i = 0; l != 0; ) {
  6707:               int k = Integer.numberOfTrailingZeros (l);
  6708:               XEiJ.busWwe (a, XEiJ.regRn[i += k]);
  6709:               a += 2;
  6710:               l = l >>> k & ~1;
  6711:             }
  6712:           }
  6713:         }
  6714:         XEiJ.mpuCycleCount += 4 + (a - t << 1);  //2バイト/個→4サイクル/個
  6715:       }
  6716:     }
  6717:   }  //irpMovemToMemWord
  6718: 
  6719:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6720:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6721:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6722:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6723:   //EXT.L Dr                                        |-|012346|-|-UUUU|-**00|D         |0100_100_011_000_rrr
  6724:   //MOVEM.L <list>,<ea>                             |-|012346|-|-----|-----|  M -WXZ  |0100_100_011_mmm_rrr-llllllllllllllll
  6725:   public static void irpMovemToMemLong () throws M68kException {
  6726:     int ea = XEiJ.regOC & 63;
  6727:     if (ea < XEiJ.EA_AR) {  //EXT.L Dr
  6728:       XEiJ.mpuCycleCount += 4;
  6729:       int z;
  6730:       XEiJ.regRn[ea] = z = (short) XEiJ.regRn[ea];
  6731:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  6732:     } else {  //MOVEM.L <list>,<ea>
  6733:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  6734:       XEiJ.regPC += 2;
  6735:       if (ea >> 3 == XEiJ.MMM_MN) {  //-(Ar)
  6736:         //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む
  6737:         //転送するレジスタが0個のときArは変化しない
  6738:         int arr = ea - (XEiJ.EA_MN - 8);
  6739:         int a = XEiJ.regRn[arr];
  6740:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  6741:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  6742:           M68kException.m6eAddress = a;
  6743:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  6744:           M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  6745:           throw M68kException.m6eSignal;
  6746:         }
  6747:         int t = a;
  6748:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  6749:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 4 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  6750:             4 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) {  //16個転送してもページを跨がない
  6751:           a &= XEiJ.BUS_MOTHER_MASK;
  6752:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6753:             if ((l & 0x0001) != 0) {
  6754:               a -= 4;
  6755:               int x = XEiJ.regRn[15];
  6756:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6757:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6758:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6759:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6760:             }
  6761:             if ((l & 0x0002) != 0) {
  6762:               a -= 4;
  6763:               int x = XEiJ.regRn[14];
  6764:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6765:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6766:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6767:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6768:             }
  6769:             if ((l & 0x0004) != 0) {
  6770:               a -= 4;
  6771:               int x = XEiJ.regRn[13];
  6772:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6773:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6774:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6775:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6776:             }
  6777:             if ((l & 0x0008) != 0) {
  6778:               a -= 4;
  6779:               int x = XEiJ.regRn[12];
  6780:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6781:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6782:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6783:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6784:             }
  6785:             if ((l & 0x0010) != 0) {
  6786:               a -= 4;
  6787:               int x = XEiJ.regRn[11];
  6788:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6789:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6790:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6791:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6792:             }
  6793:             if ((l & 0x0020) != 0) {
  6794:               a -= 4;
  6795:               int x = XEiJ.regRn[10];
  6796:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6797:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6798:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6799:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6800:             }
  6801:             if ((l & 0x0040) != 0) {
  6802:               a -= 4;
  6803:               int x = XEiJ.regRn[ 9];
  6804:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6805:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6806:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6807:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6808:             }
  6809:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6810:               a -= 4;
  6811:               int x = XEiJ.regRn[ 8];
  6812:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6813:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6814:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6815:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6816:             }
  6817:             if ((l & 0x0100) != 0) {
  6818:               a -= 4;
  6819:               int x = XEiJ.regRn[ 7];
  6820:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6821:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6822:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6823:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6824:             }
  6825:             if ((l & 0x0200) != 0) {
  6826:               a -= 4;
  6827:               int x = XEiJ.regRn[ 6];
  6828:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6829:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6830:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6831:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6832:             }
  6833:             if ((l & 0x0400) != 0) {
  6834:               a -= 4;
  6835:               int x = XEiJ.regRn[ 5];
  6836:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6837:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6838:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6839:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6840:             }
  6841:             if ((l & 0x0800) != 0) {
  6842:               a -= 4;
  6843:               int x = XEiJ.regRn[ 4];
  6844:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6845:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6846:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6847:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6848:             }
  6849:             if ((l & 0x1000) != 0) {
  6850:               a -= 4;
  6851:               int x = XEiJ.regRn[ 3];
  6852:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6853:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6854:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6855:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6856:             }
  6857:             if ((l & 0x2000) != 0) {
  6858:               a -= 4;
  6859:               int x = XEiJ.regRn[ 2];
  6860:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6861:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6862:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6863:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6864:             }
  6865:             if ((l & 0x4000) != 0) {
  6866:               a -= 4;
  6867:               int x = XEiJ.regRn[ 1];
  6868:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6869:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6870:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6871:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6872:             }
  6873:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6874:               a -= 4;
  6875:               int x = XEiJ.regRn[ 0];
  6876:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6877:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6878:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6879:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6880:             }
  6881:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6882:             for (int i = 15; i >= 0; i--) {
  6883:               if ((l & 0x8000 >>> i) != 0) {
  6884:                 a -= 4;
  6885:                 int x = XEiJ.regRn[i];
  6886:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6887:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6888:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6889:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  6890:               }
  6891:             }
  6892:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6893:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6894:             for (int i = 15; l != 0; i--, l <<= 1) {
  6895:               if (l < 0) {
  6896:                 a -= 4;
  6897:                 int x = XEiJ.regRn[i];
  6898:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6899:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6900:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6901:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  6902:               }
  6903:             }
  6904:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6905:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6906:               if ((l & 1) != 0) {
  6907:                 a -= 4;
  6908:                 int x = XEiJ.regRn[i];
  6909:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6910:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6911:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6912:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  6913:               }
  6914:             }
  6915:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6916:             for (int i = 15; l != 0; ) {
  6917:               int k = Integer.numberOfTrailingZeros (l);
  6918:               a -= 4;
  6919:               int x = XEiJ.regRn[i -= k];
  6920:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6921:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6922:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6923:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6924:               l = l >>> k & ~1;
  6925:             }
  6926:           }
  6927:           a = t - (short) (t - a);
  6928:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  6929:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6930:             if ((l & 0x0001) != 0) {
  6931:               XEiJ.busWle (a -= 4, XEiJ.regRn[15]);
  6932:             }
  6933:             if ((l & 0x0002) != 0) {
  6934:               XEiJ.busWle (a -= 4, XEiJ.regRn[14]);
  6935:             }
  6936:             if ((l & 0x0004) != 0) {
  6937:               XEiJ.busWle (a -= 4, XEiJ.regRn[13]);
  6938:             }
  6939:             if ((l & 0x0008) != 0) {
  6940:               XEiJ.busWle (a -= 4, XEiJ.regRn[12]);
  6941:             }
  6942:             if ((l & 0x0010) != 0) {
  6943:               XEiJ.busWle (a -= 4, XEiJ.regRn[11]);
  6944:             }
  6945:             if ((l & 0x0020) != 0) {
  6946:               XEiJ.busWle (a -= 4, XEiJ.regRn[10]);
  6947:             }
  6948:             if ((l & 0x0040) != 0) {
  6949:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 9]);
  6950:             }
  6951:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6952:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 8]);
  6953:             }
  6954:             if ((l & 0x0100) != 0) {
  6955:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 7]);
  6956:             }
  6957:             if ((l & 0x0200) != 0) {
  6958:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 6]);
  6959:             }
  6960:             if ((l & 0x0400) != 0) {
  6961:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 5]);
  6962:             }
  6963:             if ((l & 0x0800) != 0) {
  6964:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 4]);
  6965:             }
  6966:             if ((l & 0x1000) != 0) {
  6967:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 3]);
  6968:             }
  6969:             if ((l & 0x2000) != 0) {
  6970:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 2]);
  6971:             }
  6972:             if ((l & 0x4000) != 0) {
  6973:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 1]);
  6974:             }
  6975:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6976:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 0]);
  6977:             }
  6978:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6979:             for (int i = 15; i >= 0; i--) {
  6980:               if ((l & 0x8000 >>> i) != 0) {
  6981:                 XEiJ.busWle (a -= 4, XEiJ.regRn[i]);
  6982:               }
  6983:             }
  6984:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6985:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6986:             for (int i = 15; l != 0; i--, l <<= 1) {
  6987:               if (l < 0) {
  6988:                 XEiJ.busWle (a -= 4, XEiJ.regRn[i]);
  6989:               }
  6990:             }
  6991:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6992:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6993:               if ((l & 1) != 0) {
  6994:                 XEiJ.busWle (a -= 4, XEiJ.regRn[i]);
  6995:               }
  6996:             }
  6997:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6998:             for (int i = 15; l != 0; ) {
  6999:               int k = Integer.numberOfTrailingZeros (l);
  7000:               XEiJ.busWle (a -= 4, XEiJ.regRn[i -= k]);
  7001:               l = l >>> k & ~1;
  7002:             }
  7003:           }
  7004:         }
  7005:         XEiJ.regRn[arr] = a;
  7006:         XEiJ.mpuCycleCount += 8 + (t - a << 1);  //4バイト/個→8サイクル/個
  7007:       } else {  //-(Ar)以外
  7008:         int a = efaCltLong (ea);
  7009:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  7010:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  7011:           M68kException.m6eAddress = a;
  7012:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  7013:           M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  7014:           throw M68kException.m6eSignal;
  7015:         }
  7016:         int t = a;
  7017:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  7018:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  7019:             (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) {  //16個転送してもページを跨がない
  7020:           a &= XEiJ.BUS_MOTHER_MASK;
  7021:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7022:             if ((l & 0x0001) != 0) {
  7023:               int x = XEiJ.regRn[ 0];
  7024:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7025:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7026:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7027:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7028:               a += 4;
  7029:             }
  7030:             if ((l & 0x0002) != 0) {
  7031:               int x = XEiJ.regRn[ 1];
  7032:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7033:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7034:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7035:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7036:               a += 4;
  7037:             }
  7038:             if ((l & 0x0004) != 0) {
  7039:               int x = XEiJ.regRn[ 2];
  7040:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7041:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7042:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7043:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7044:               a += 4;
  7045:             }
  7046:             if ((l & 0x0008) != 0) {
  7047:               int x = XEiJ.regRn[ 3];
  7048:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7049:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7050:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7051:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7052:               a += 4;
  7053:             }
  7054:             if ((l & 0x0010) != 0) {
  7055:               int x = XEiJ.regRn[ 4];
  7056:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7057:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7058:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7059:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7060:               a += 4;
  7061:             }
  7062:             if ((l & 0x0020) != 0) {
  7063:               int x = XEiJ.regRn[ 5];
  7064:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7065:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7066:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7067:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7068:               a += 4;
  7069:             }
  7070:             if ((l & 0x0040) != 0) {
  7071:               int x = XEiJ.regRn[ 6];
  7072:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7073:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7074:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7075:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7076:               a += 4;
  7077:             }
  7078:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  7079:               int x = XEiJ.regRn[ 7];
  7080:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7081:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7082:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7083:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7084:               a += 4;
  7085:             }
  7086:             if ((l & 0x0100) != 0) {
  7087:               int x = XEiJ.regRn[ 8];
  7088:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7089:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7090:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7091:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7092:               a += 4;
  7093:             }
  7094:             if ((l & 0x0200) != 0) {
  7095:               int x = XEiJ.regRn[ 9];
  7096:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7097:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7098:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7099:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7100:               a += 4;
  7101:             }
  7102:             if ((l & 0x0400) != 0) {
  7103:               int x = XEiJ.regRn[10];
  7104:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7105:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7106:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7107:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7108:               a += 4;
  7109:             }
  7110:             if ((l & 0x0800) != 0) {
  7111:               int x = XEiJ.regRn[11];
  7112:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7113:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7114:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7115:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7116:               a += 4;
  7117:             }
  7118:             if ((l & 0x1000) != 0) {
  7119:               int x = XEiJ.regRn[12];
  7120:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7121:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7122:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7123:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7124:               a += 4;
  7125:             }
  7126:             if ((l & 0x2000) != 0) {
  7127:               int x = XEiJ.regRn[13];
  7128:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7129:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7130:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7131:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7132:               a += 4;
  7133:             }
  7134:             if ((l & 0x4000) != 0) {
  7135:               int x = XEiJ.regRn[14];
  7136:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7137:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7138:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7139:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7140:               a += 4;
  7141:             }
  7142:             if ((short) l < 0) {  //(l & 0x8000) != 0
  7143:               int x = XEiJ.regRn[15];
  7144:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7145:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7146:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7147:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7148:               a += 4;
  7149:             }
  7150:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7151:             for (int i = 0; i <= 15; i++) {
  7152:               if ((l & 0x0001 << i) != 0) {
  7153:                 int x = XEiJ.regRn[i];
  7154:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7155:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7156:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7157:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  7158:                 a += 4;
  7159:               }
  7160:             }
  7161:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7162:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7163:             for (int i = 0; l != 0; i++, l <<= 1) {
  7164:               if (l < 0) {
  7165:                 int x = XEiJ.regRn[i];
  7166:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7167:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7168:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7169:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  7170:                 a += 4;
  7171:               }
  7172:             }
  7173:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7174:             for (int i = 0; l != 0; i++, l >>>= 1) {
  7175:               if ((l & 1) != 0) {
  7176:                 int x = XEiJ.regRn[i];
  7177:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7178:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7179:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7180:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  7181:                 a += 4;
  7182:               }
  7183:             }
  7184:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7185:             for (int i = 0; l != 0; ) {
  7186:               int k = Integer.numberOfTrailingZeros (l);
  7187:               int x = XEiJ.regRn[i += k];
  7188:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7189:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7190:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7191:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7192:               a += 4;
  7193:               l = l >>> k & ~1;
  7194:             }
  7195:           }
  7196:           a = t + (short) (a - t);
  7197:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  7198:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7199:             if ((l & 0x0001) != 0) {
  7200:               XEiJ.busWle (a, XEiJ.regRn[ 0]);
  7201:               a += 4;
  7202:             }
  7203:             if ((l & 0x0002) != 0) {
  7204:               XEiJ.busWle (a, XEiJ.regRn[ 1]);
  7205:               a += 4;
  7206:             }
  7207:             if ((l & 0x0004) != 0) {
  7208:               XEiJ.busWle (a, XEiJ.regRn[ 2]);
  7209:               a += 4;
  7210:             }
  7211:             if ((l & 0x0008) != 0) {
  7212:               XEiJ.busWle (a, XEiJ.regRn[ 3]);
  7213:               a += 4;
  7214:             }
  7215:             if ((l & 0x0010) != 0) {
  7216:               XEiJ.busWle (a, XEiJ.regRn[ 4]);
  7217:               a += 4;
  7218:             }
  7219:             if ((l & 0x0020) != 0) {
  7220:               XEiJ.busWle (a, XEiJ.regRn[ 5]);
  7221:               a += 4;
  7222:             }
  7223:             if ((l & 0x0040) != 0) {
  7224:               XEiJ.busWle (a, XEiJ.regRn[ 6]);
  7225:               a += 4;
  7226:             }
  7227:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  7228:               XEiJ.busWle (a, XEiJ.regRn[ 7]);
  7229:               a += 4;
  7230:             }
  7231:             if ((l & 0x0100) != 0) {
  7232:               XEiJ.busWle (a, XEiJ.regRn[ 8]);
  7233:               a += 4;
  7234:             }
  7235:             if ((l & 0x0200) != 0) {
  7236:               XEiJ.busWle (a, XEiJ.regRn[ 9]);
  7237:               a += 4;
  7238:             }
  7239:             if ((l & 0x0400) != 0) {
  7240:               XEiJ.busWle (a, XEiJ.regRn[10]);
  7241:               a += 4;
  7242:             }
  7243:             if ((l & 0x0800) != 0) {
  7244:               XEiJ.busWle (a, XEiJ.regRn[11]);
  7245:               a += 4;
  7246:             }
  7247:             if ((l & 0x1000) != 0) {
  7248:               XEiJ.busWle (a, XEiJ.regRn[12]);
  7249:               a += 4;
  7250:             }
  7251:             if ((l & 0x2000) != 0) {
  7252:               XEiJ.busWle (a, XEiJ.regRn[13]);
  7253:               a += 4;
  7254:             }
  7255:             if ((l & 0x4000) != 0) {
  7256:               XEiJ.busWle (a, XEiJ.regRn[14]);
  7257:               a += 4;
  7258:             }
  7259:             if ((short) l < 0) {  //(l & 0x8000) != 0
  7260:               XEiJ.busWle (a, XEiJ.regRn[15]);
  7261:               a += 4;
  7262:             }
  7263:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7264:             for (int i = 0; i <= 15; i++) {
  7265:               if ((l & 0x0001 << i) != 0) {
  7266:                 XEiJ.busWle (a, XEiJ.regRn[i]);
  7267:                 a += 4;
  7268:               }
  7269:             }
  7270:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7271:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7272:             for (int i = 0; l != 0; i++, l <<= 1) {
  7273:               if (l < 0) {
  7274:                 XEiJ.busWle (a, XEiJ.regRn[i]);
  7275:                 a += 4;
  7276:               }
  7277:             }
  7278:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7279:             for (int i = 0; l != 0; i++, l >>>= 1) {
  7280:               if ((l & 1) != 0) {
  7281:                 XEiJ.busWle (a, XEiJ.regRn[i]);
  7282:                 a += 4;
  7283:               }
  7284:             }
  7285:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7286:             for (int i = 0; l != 0; ) {
  7287:               int k = Integer.numberOfTrailingZeros (l);
  7288:               XEiJ.busWle (a, XEiJ.regRn[i += k]);
  7289:               a += 4;
  7290:               l = l >>> k & ~1;
  7291:             }
  7292:           }
  7293:         }
  7294:         XEiJ.mpuCycleCount += 0 + (a - t << 1);  //4バイト/個→8サイクル/個
  7295:       }
  7296:     }
  7297:   }  //irpMovemToMemLong
  7298: 
  7299:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7300:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7301:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7302:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7303:   //TST.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_000_mmm_rrr
  7304:   public static void irpTstByte () throws M68kException {
  7305:     XEiJ.mpuCycleCount += 4;
  7306:     int ea = XEiJ.regOC & 63;
  7307:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea)))];  //ccr_tst_byte。アドレッシングモードに注意
  7308:   }  //irpTstByte
  7309: 
  7310:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7311:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7312:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7313:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7314:   //TST.W <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_001_mmm_rrr
  7315:   public static void irpTstWord () throws M68kException {
  7316:     XEiJ.mpuCycleCount += 4;
  7317:     int ea = XEiJ.regOC & 63;
  7318:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea));  //アドレッシングモードに注意
  7319:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
  7320:   }  //irpTstWord
  7321: 
  7322:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7323:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7324:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7325:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7326:   //TST.L <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_010_mmm_rrr
  7327:   public static void irpTstLong () throws M68kException {
  7328:     XEiJ.mpuCycleCount += 4;
  7329:     int ea = XEiJ.regOC & 63;
  7330:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRls (efaMltLong (ea));  //アドレッシングモードに注意
  7331:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  7332:   }  //irpTstLong
  7333: 
  7334:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7335:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7336:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7337:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7338:   //TAS.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_011_mmm_rrr
  7339:   //ILLEGAL                                         |-|012346|-|-----|-----|          |0100_101_011_111_100
  7340:   public static void irpTas () throws M68kException {
  7341:     int ea = XEiJ.regOC & 63;
  7342:     int z;
  7343:     if (ea < XEiJ.EA_AR) {  //TAS.B Dr
  7344:       XEiJ.mpuCycleCount += 4;
  7345:       XEiJ.regRn[ea] = 0x80 | (z = XEiJ.regRn[ea]);
  7346:     } else if (ea == XEiJ.EA_IM) {  //ILLEGAL
  7347:       XEiJ.mpuCycleCount += 34;
  7348:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  7349:       throw M68kException.m6eSignal;
  7350:     } else {  //TAS.B <mem>
  7351:       XEiJ.mpuCycleCount += 10;
  7352:       int a = efaMltByte (ea);
  7353:       XEiJ.busWb (a, 0x80 | (z = XEiJ.busRbs (a)));
  7354:     }
  7355:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  7356:   }  //irpTas
  7357: 
  7358:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7359:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7360:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7361:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7362:   //SATS.L Dr                                       |-|------|-|-UUUU|-**00|D         |0100_110_010_000_rrr (ISA_B)
  7363:   //MOVEM.W <ea>,<list>                             |-|012346|-|-----|-----|  M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll
  7364:   //
  7365:   //SATS.L Dr
  7366:   //  VがセットされていたらDrを符号が逆で絶対値が最大の値にする(直前のDrに対する演算を飽和演算にする)
  7367:   public static void irpMovemToRegWord () throws M68kException {
  7368:     int ea = XEiJ.regOC & 63;
  7369:     if (ea < XEiJ.EA_AR) {  //SATS.L Dr
  7370:       XEiJ.mpuCycleCount += 4;
  7371:       int z = XEiJ.regRn[ea];
  7372:       if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 < 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) != 0) {  //Vがセットされているとき
  7373:         XEiJ.regRn[ea] = z = z >> 31 ^ 0x80000000;  //符号が逆で絶対値が最大の値にする
  7374:       }
  7375:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
  7376:     } else {  //MOVEM.W <ea>,<list>
  7377:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  7378:       XEiJ.regPC += 2;
  7379:       int arr, a;
  7380:       if (ea >> 3 == XEiJ.MMM_MP) {  //(Ar)+
  7381:         XEiJ.mpuCycleCount += 12;
  7382:         arr = ea - (XEiJ.EA_MP - 8);
  7383:         a = XEiJ.regRn[arr];
  7384:       } else {  //(Ar)+以外
  7385:         XEiJ.mpuCycleCount += 8;
  7386:         arr = 16;
  7387:         a = efaCntWord (ea);
  7388:       }
  7389:       if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  7390:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  7391:         M68kException.m6eAddress = a;
  7392:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  7393:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  7394:         throw M68kException.m6eSignal;
  7395:       }
  7396:       int t = a;
  7397:       if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  7398:           (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  7399:           (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) {  //16個転送してもページを跨がない
  7400:         a &= XEiJ.BUS_MOTHER_MASK;
  7401:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7402:           if ((l & 0x0001) != 0) {
  7403:             XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7404:             a += 2;
  7405:           }
  7406:           if ((l & 0x0002) != 0) {
  7407:             XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7408:             a += 2;
  7409:           }
  7410:           if ((l & 0x0004) != 0) {
  7411:             XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7412:             a += 2;
  7413:           }
  7414:           if ((l & 0x0008) != 0) {
  7415:             XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7416:             a += 2;
  7417:           }
  7418:           if ((l & 0x0010) != 0) {
  7419:             XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7420:             a += 2;
  7421:           }
  7422:           if ((l & 0x0020) != 0) {
  7423:             XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7424:             a += 2;
  7425:           }
  7426:           if ((l & 0x0040) != 0) {
  7427:             XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7428:             a += 2;
  7429:           }
  7430:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7431:             XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7432:             a += 2;
  7433:           }
  7434:           if ((l & 0x0100) != 0) {
  7435:             XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7436:             a += 2;
  7437:           }
  7438:           if ((l & 0x0200) != 0) {
  7439:             XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7440:             a += 2;
  7441:           }
  7442:           if ((l & 0x0400) != 0) {
  7443:             XEiJ.regRn[10] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7444:             a += 2;
  7445:           }
  7446:           if ((l & 0x0800) != 0) {
  7447:             XEiJ.regRn[11] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7448:             a += 2;
  7449:           }
  7450:           if ((l & 0x1000) != 0) {
  7451:             XEiJ.regRn[12] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7452:             a += 2;
  7453:           }
  7454:           if ((l & 0x2000) != 0) {
  7455:             XEiJ.regRn[13] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7456:             a += 2;
  7457:           }
  7458:           if ((l & 0x4000) != 0) {
  7459:             XEiJ.regRn[14] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7460:             a += 2;
  7461:           }
  7462:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7463:             XEiJ.regRn[15] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7464:             a += 2;
  7465:           }
  7466:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7467:           for (int i = 0; i <= 15; i++) {
  7468:             if ((l & 0x0001 << i) != 0) {
  7469:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7470:               a += 2;
  7471:             }
  7472:           }
  7473:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7474:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7475:           for (int i = 0; l != 0; i++, l <<= 1) {
  7476:             if (l < 0) {
  7477:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7478:               a += 2;
  7479:             }
  7480:           }
  7481:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7482:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7483:             if ((l & 1) != 0) {
  7484:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7485:               a += 2;
  7486:             }
  7487:           }
  7488:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7489:           for (int i = 0; l != 0; ) {
  7490:             int k = Integer.numberOfTrailingZeros (l);
  7491:             XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7492:             a += 2;
  7493:             l = l >>> k & ~1;
  7494:           }
  7495:         }
  7496:         a = t + (short) (a - t);
  7497:       } else {  //メインメモリでないかページを跨ぐ可能性がある
  7498:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7499:           if ((l & 0x0001) != 0) {
  7500:             XEiJ.regRn[ 0] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7501:             a += 2;
  7502:           }
  7503:           if ((l & 0x0002) != 0) {
  7504:             XEiJ.regRn[ 1] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7505:             a += 2;
  7506:           }
  7507:           if ((l & 0x0004) != 0) {
  7508:             XEiJ.regRn[ 2] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7509:             a += 2;
  7510:           }
  7511:           if ((l & 0x0008) != 0) {
  7512:             XEiJ.regRn[ 3] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7513:             a += 2;
  7514:           }
  7515:           if ((l & 0x0010) != 0) {
  7516:             XEiJ.regRn[ 4] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7517:             a += 2;
  7518:           }
  7519:           if ((l & 0x0020) != 0) {
  7520:             XEiJ.regRn[ 5] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7521:             a += 2;
  7522:           }
  7523:           if ((l & 0x0040) != 0) {
  7524:             XEiJ.regRn[ 6] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7525:             a += 2;
  7526:           }
  7527:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7528:             XEiJ.regRn[ 7] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7529:             a += 2;
  7530:           }
  7531:           if ((l & 0x0100) != 0) {
  7532:             XEiJ.regRn[ 8] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7533:             a += 2;
  7534:           }
  7535:           if ((l & 0x0200) != 0) {
  7536:             XEiJ.regRn[ 9] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7537:             a += 2;
  7538:           }
  7539:           if ((l & 0x0400) != 0) {
  7540:             XEiJ.regRn[10] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7541:             a += 2;
  7542:           }
  7543:           if ((l & 0x0800) != 0) {
  7544:             XEiJ.regRn[11] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7545:             a += 2;
  7546:           }
  7547:           if ((l & 0x1000) != 0) {
  7548:             XEiJ.regRn[12] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7549:             a += 2;
  7550:           }
  7551:           if ((l & 0x2000) != 0) {
  7552:             XEiJ.regRn[13] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7553:             a += 2;
  7554:           }
  7555:           if ((l & 0x4000) != 0) {
  7556:             XEiJ.regRn[14] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7557:             a += 2;
  7558:           }
  7559:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7560:             XEiJ.regRn[15] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7561:             a += 2;
  7562:           }
  7563:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7564:           for (int i = 0; i <= 15; i++) {
  7565:             if ((l & 0x0001 << i) != 0) {
  7566:               XEiJ.regRn[i] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7567:               a += 2;
  7568:             }
  7569:           }
  7570:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7571:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7572:           for (int i = 0; l != 0; i++, l <<= 1) {
  7573:             if (l < 0) {
  7574:               XEiJ.regRn[i] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7575:               a += 2;
  7576:             }
  7577:           }
  7578:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7579:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7580:             if ((l & 1) != 0) {
  7581:               XEiJ.regRn[i] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7582:               a += 2;
  7583:             }
  7584:           }
  7585:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7586:           for (int i = 0; l != 0; ) {
  7587:             int k = Integer.numberOfTrailingZeros (l);
  7588:             XEiJ.regRn[i += k] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7589:             a += 2;
  7590:             l = l >>> k & ~1;
  7591:           }
  7592:         }
  7593:       }
  7594:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  7595:         //! 軽量化。MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするが省略する
  7596:         //  MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する
  7597:         //  RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、
  7598:         //  12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因
  7599:       } else {
  7600:         XEiJ.busRws (a);
  7601:       }
  7602:       //MOVEM.W (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする
  7603:       XEiJ.regRn[arr] = a;
  7604:       XEiJ.mpuCycleCount += a - t << 1;  //2バイト/個→4サイクル/個
  7605:     }
  7606:   }  //irpMovemToRegWord
  7607: 
  7608:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7609:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7610:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7611:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7612:   //MOVEM.L <ea>,<list>                             |-|012346|-|-----|-----|  M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll
  7613:   public static void irpMovemToRegLong () throws M68kException {
  7614:     int ea = XEiJ.regOC & 63;
  7615:     {
  7616:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  7617:       XEiJ.regPC += 2;
  7618:       int arr, a;
  7619:       if (ea >> 3 == XEiJ.MMM_MP) {  //(Ar)+
  7620:         XEiJ.mpuCycleCount += 8;
  7621:         arr = ea - (XEiJ.EA_MP - 8);
  7622:         a = XEiJ.regRn[arr];
  7623:       } else {  //(Ar)+以外
  7624:         XEiJ.mpuCycleCount += 4;
  7625:         arr = 16;
  7626:         a = efaCntLong (ea);
  7627:       }
  7628:       if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  7629:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  7630:         M68kException.m6eAddress = a;
  7631:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  7632:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  7633:         throw M68kException.m6eSignal;
  7634:       }
  7635:       int t = a;
  7636:       if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  7637:           (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  7638:           (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) {  //16個転送してもページを跨がない
  7639:         a &= XEiJ.BUS_MOTHER_MASK;
  7640:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7641:           if ((l & 0x0001) != 0) {
  7642:             XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7643:             a += 4;
  7644:           }
  7645:           if ((l & 0x0002) != 0) {
  7646:             XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7647:             a += 4;
  7648:           }
  7649:           if ((l & 0x0004) != 0) {
  7650:             XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7651:             a += 4;
  7652:           }
  7653:           if ((l & 0x0008) != 0) {
  7654:             XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7655:             a += 4;
  7656:           }
  7657:           if ((l & 0x0010) != 0) {
  7658:             XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7659:             a += 4;
  7660:           }
  7661:           if ((l & 0x0020) != 0) {
  7662:             XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7663:             a += 4;
  7664:           }
  7665:           if ((l & 0x0040) != 0) {
  7666:             XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7667:             a += 4;
  7668:           }
  7669:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7670:             XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7671:             a += 4;
  7672:           }
  7673:           if ((l & 0x0100) != 0) {
  7674:             XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7675:             a += 4;
  7676:           }
  7677:           if ((l & 0x0200) != 0) {
  7678:             XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7679:             a += 4;
  7680:           }
  7681:           if ((l & 0x0400) != 0) {
  7682:             XEiJ.regRn[10] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7683:             a += 4;
  7684:           }
  7685:           if ((l & 0x0800) != 0) {
  7686:             XEiJ.regRn[11] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7687:             a += 4;
  7688:           }
  7689:           if ((l & 0x1000) != 0) {
  7690:             XEiJ.regRn[12] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7691:             a += 4;
  7692:           }
  7693:           if ((l & 0x2000) != 0) {
  7694:             XEiJ.regRn[13] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7695:             a += 4;
  7696:           }
  7697:           if ((l & 0x4000) != 0) {
  7698:             XEiJ.regRn[14] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7699:             a += 4;
  7700:           }
  7701:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7702:             XEiJ.regRn[15] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7703:             a += 4;
  7704:           }
  7705:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7706:           for (int i = 0; i <= 15; i++) {
  7707:             if ((l & 0x0001 << i) != 0) {
  7708:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7709:               a += 4;
  7710:             }
  7711:           }
  7712:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7713:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7714:           for (int i = 0; l != 0; i++, l <<= 1) {
  7715:             if (l < 0) {
  7716:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7717:               a += 4;
  7718:             }
  7719:           }
  7720:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7721:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7722:             if ((l & 1) != 0) {
  7723:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7724:               a += 4;
  7725:             }
  7726:           }
  7727:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7728:           for (int i = 0; l != 0; ) {
  7729:             int k = Integer.numberOfTrailingZeros (l);
  7730:             XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7731:             a += 4;
  7732:             l = l >>> k & ~1;
  7733:           }
  7734:         }
  7735:         a = t + (short) (a - t);
  7736:       } else {  //メインメモリでないかページを跨ぐ可能性がある
  7737:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7738:           if ((l & 0x0001) != 0) {
  7739:             XEiJ.regRn[ 0] = XEiJ.busRlse (a);
  7740:             a += 4;
  7741:           }
  7742:           if ((l & 0x0002) != 0) {
  7743:             XEiJ.regRn[ 1] = XEiJ.busRlse (a);
  7744:             a += 4;
  7745:           }
  7746:           if ((l & 0x0004) != 0) {
  7747:             XEiJ.regRn[ 2] = XEiJ.busRlse (a);
  7748:             a += 4;
  7749:           }
  7750:           if ((l & 0x0008) != 0) {
  7751:             XEiJ.regRn[ 3] = XEiJ.busRlse (a);
  7752:             a += 4;
  7753:           }
  7754:           if ((l & 0x0010) != 0) {
  7755:             XEiJ.regRn[ 4] = XEiJ.busRlse (a);
  7756:             a += 4;
  7757:           }
  7758:           if ((l & 0x0020) != 0) {
  7759:             XEiJ.regRn[ 5] = XEiJ.busRlse (a);
  7760:             a += 4;
  7761:           }
  7762:           if ((l & 0x0040) != 0) {
  7763:             XEiJ.regRn[ 6] = XEiJ.busRlse (a);
  7764:             a += 4;
  7765:           }
  7766:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7767:             XEiJ.regRn[ 7] = XEiJ.busRlse (a);
  7768:             a += 4;
  7769:           }
  7770:           if ((l & 0x0100) != 0) {
  7771:             XEiJ.regRn[ 8] = XEiJ.busRlse (a);
  7772:             a += 4;
  7773:           }
  7774:           if ((l & 0x0200) != 0) {
  7775:             XEiJ.regRn[ 9] = XEiJ.busRlse (a);
  7776:             a += 4;
  7777:           }
  7778:           if ((l & 0x0400) != 0) {
  7779:             XEiJ.regRn[10] = XEiJ.busRlse (a);
  7780:             a += 4;
  7781:           }
  7782:           if ((l & 0x0800) != 0) {
  7783:             XEiJ.regRn[11] = XEiJ.busRlse (a);
  7784:             a += 4;
  7785:           }
  7786:           if ((l & 0x1000) != 0) {
  7787:             XEiJ.regRn[12] = XEiJ.busRlse (a);
  7788:             a += 4;
  7789:           }
  7790:           if ((l & 0x2000) != 0) {
  7791:             XEiJ.regRn[13] = XEiJ.busRlse (a);
  7792:             a += 4;
  7793:           }
  7794:           if ((l & 0x4000) != 0) {
  7795:             XEiJ.regRn[14] = XEiJ.busRlse (a);
  7796:             a += 4;
  7797:           }
  7798:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7799:             XEiJ.regRn[15] = XEiJ.busRlse (a);
  7800:             a += 4;
  7801:           }
  7802:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7803:           for (int i = 0; i <= 15; i++) {
  7804:             if ((l & 0x0001 << i) != 0) {
  7805:               XEiJ.regRn[i] = XEiJ.busRlse (a);
  7806:               a += 4;
  7807:             }
  7808:           }
  7809:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7810:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7811:           for (int i = 0; l != 0; i++, l <<= 1) {
  7812:             if (l < 0) {
  7813:               XEiJ.regRn[i] = XEiJ.busRlse (a);
  7814:               a += 4;
  7815:             }
  7816:           }
  7817:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7818:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7819:             if ((l & 1) != 0) {
  7820:               XEiJ.regRn[i] = XEiJ.busRlse (a);
  7821:               a += 4;
  7822:             }
  7823:           }
  7824:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7825:           for (int i = 0; l != 0; ) {
  7826:             int k = Integer.numberOfTrailingZeros (l);
  7827:             XEiJ.regRn[i += k] = XEiJ.busRlse (a);
  7828:             a += 4;
  7829:             l = l >>> k & ~1;
  7830:           }
  7831:         }
  7832:       }
  7833:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  7834:         //! 軽量化。MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするが省略する
  7835:         //  MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する
  7836:         //  RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、
  7837:         //  12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因
  7838:       } else {
  7839:         XEiJ.busRws (a);
  7840:       }
  7841:       //MOVEM.L (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする
  7842:       XEiJ.regRn[arr] = a;  //XEiJ.regRn[arr]は破壊されているのでXEiJ.regRn[arr]+=a-=tは不可
  7843:       XEiJ.mpuCycleCount += a - t << 1;  //4バイト/個→8サイクル/個
  7844:     }
  7845:   }  //irpMovemToRegLong
  7846: 
  7847:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7848:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7849:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7850:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7851:   //TRAP #<vector>                                  |-|012346|-|-----|-----|          |0100_111_001_00v_vvv
  7852:   public static void irpTrap () throws M68kException {
  7853:     XEiJ.mpuCycleCount += 34;
  7854:     if (XEiJ.MPU_INLINE_EXCEPTION) {
  7855:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  7856:       int sp = XEiJ.regRn[15];
  7857:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
  7858:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7859:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
  7860:         XEiJ.mpuUSP = sp;  //USPを保存
  7861:         sp = XEiJ.mpuISP;  //SSPを復元
  7862:         if (DataBreakPoint.DBP_ON) {
  7863:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
  7864:         } else {
  7865:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
  7866:         }
  7867:         if (InstructionBreakPoint.IBP_ON) {
  7868:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
  7869:         }
  7870:       }
  7871:       int vectorOffset = XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR) << 2;  //vector offset
  7872:       XEiJ.regRn[15] = sp -= 8;  //short format
  7873:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
  7874:       XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  7875:       XEiJ.busWw (sp, save_sr);  //status register
  7876:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
  7877:     } else {
  7878:       irpException (XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR), XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは次の命令
  7879:     }
  7880:   }  //irpTrap
  7881:   public static void irpTrap15 () throws M68kException {
  7882:     if ((XEiJ.regRn[0] & 255) == 0x8e) {  //IOCS _BOOTINF
  7883:       MainMemory.mmrCheckHuman ();
  7884:     }
  7885:     XEiJ.mpuCycleCount += 34;
  7886:     if (XEiJ.MPU_INLINE_EXCEPTION) {
  7887:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  7888:       int sp = XEiJ.regRn[15];
  7889:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
  7890:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7891:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
  7892:         XEiJ.mpuUSP = sp;  //USPを保存
  7893:         sp = XEiJ.mpuISP;  //SSPを復元
  7894:         if (DataBreakPoint.DBP_ON) {
  7895:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
  7896:         } else {
  7897:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
  7898:         }
  7899:         if (InstructionBreakPoint.IBP_ON) {
  7900:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
  7901:         }
  7902:       }
  7903:       int vectorOffset = M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR << 2;  //vector offset
  7904:       XEiJ.regRn[15] = sp -= 8;  //short format
  7905:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
  7906:       XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  7907:       XEiJ.busWw (sp, save_sr);  //status register
  7908:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
  7909:     } else {
  7910:       irpException (M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは次の命令
  7911:     }
  7912:   }  //irpTrap15
  7913: 
  7914:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7915:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7916:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7917:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7918:   //LINK.W Ar,#<data>                               |-|012346|-|-----|-----|          |0100_111_001_010_rrr-{data}
  7919:   //
  7920:   //LINK.W Ar,#<data>
  7921:   //  PEA.L (Ar);MOVEA.L A7,Ar;ADDA.W #<data>,A7と同じ
  7922:   //  LINK.W A7,#<data>はA7をデクリメントする前の値がプッシュされ、A7に#<data>が加算される
  7923:   public static void irpLinkWord () throws M68kException {
  7924:     XEiJ.mpuCycleCount += 16;
  7925:     int arr = XEiJ.regOC - (0b0100_111_001_010_000 - 8);
  7926:     //評価順序に注意
  7927:     //  wl(r[15]-=4,r[8+rrr])は不可
  7928:     int sp = XEiJ.regRn[15] - 4;
  7929:     XEiJ.busWl (sp, XEiJ.regRn[arr]);  //pushl
  7930:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  7931:       XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  7932:     } else {
  7933:       int t = XEiJ.regPC;
  7934:       XEiJ.regPC = t + 2;
  7935:       XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse (t);  //pcws
  7936:     }
  7937:   }  //irpLinkWord
  7938: 
  7939:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7940:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7941:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7942:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7943:   //UNLK Ar                                         |-|012346|-|-----|-----|          |0100_111_001_011_rrr
  7944:   //
  7945:   //UNLK Ar
  7946:   //  MOVEA.L Ar,A7;MOVEA.L (A7)+,Arと同じ
  7947:   //  UNLK A7はMOVEA.L A7,A7;MOVEA.L (A7)+,A7すなわちMOVEA.L (A7),A7と同じ
  7948:   //  ソースオペランドのポストインクリメントはデスティネーションオペランドが評価される前に完了しているとみなされる
  7949:   //    例えばMOVE.L (A0)+,(A0)+はMOVE.L (A0),(4,A0);ADDQ.L #8,A0と同じ
  7950:   //    MOVEA.L (A0)+,A0はポストインクリメントされたA0が(A0)から読み出された値で上書きされるのでMOVEA.L (A0),A0と同じ
  7951:   //  M68000PRMにUNLK Anの動作はAn→SP;(SP)→An;SP+4→SPだと書かれているがこれはn=7の場合に当てはまらない
  7952:   //  余談だが68040の初期のマスクセットはUNLK A7を実行すると固まるらしい
  7953:   public static void irpUnlk () throws M68kException {
  7954:     XEiJ.mpuCycleCount += 12;
  7955:     int arr = XEiJ.regOC - (0b0100_111_001_011_000 - 8);
  7956:     //評価順序に注意
  7957:     int sp = XEiJ.regRn[arr];
  7958:     XEiJ.regRn[15] = sp + 4;
  7959:     XEiJ.regRn[arr] = XEiJ.busRls (sp);  //popls
  7960:   }  //irpUnlk
  7961: 
  7962:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7963:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7964:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7965:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7966:   //MOVE.L Ar,USP                                   |-|012346|P|-----|-----|          |0100_111_001_100_rrr
  7967:   public static void irpMoveToUsp () throws M68kException {
  7968:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7969:       XEiJ.mpuCycleCount += 34;
  7970:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  7971:       throw M68kException.m6eSignal;
  7972:     }
  7973:     //以下はスーパーバイザモード
  7974:     XEiJ.mpuCycleCount += 4;
  7975:     XEiJ.mpuUSP = XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_100_000 - 8)];
  7976:   }  //irpMoveToUsp
  7977: 
  7978:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7979:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7980:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7981:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7982:   //MOVE.L USP,Ar                                   |-|012346|P|-----|-----|          |0100_111_001_101_rrr
  7983:   public static void irpMoveFromUsp () throws M68kException {
  7984:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7985:       XEiJ.mpuCycleCount += 34;
  7986:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  7987:       throw M68kException.m6eSignal;
  7988:     }
  7989:     //以下はスーパーバイザモード
  7990:     XEiJ.mpuCycleCount += 4;
  7991:     XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_101_000 - 8)] = XEiJ.mpuUSP;
  7992:   }  //irpMoveFromUsp
  7993: 
  7994:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7995:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7996:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7997:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7998:   //RESET                                           |-|012346|P|-----|-----|          |0100_111_001_110_000
  7999:   public static void irpReset () throws M68kException {
  8000:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  8001:       XEiJ.mpuCycleCount += 34;
  8002:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  8003:       throw M68kException.m6eSignal;
  8004:     }
  8005:     //以下はスーパーバイザモード
  8006:     XEiJ.mpuCycleCount += 132;
  8007:     XEiJ.irpReset ();
  8008:   }  //irpReset
  8009: 
  8010:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8011:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8012:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8013:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8014:   //NOP                                             |-|012346|-|-----|-----|          |0100_111_001_110_001
  8015:   public static void irpNop () throws M68kException {
  8016:     XEiJ.mpuCycleCount += 4;
  8017:     //何もしない
  8018:   }  //irpNop
  8019: 
  8020:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8021:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8022:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8023:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8024:   //STOP #<data>                                    |-|012346|P|UUUUU|*****|          |0100_111_001_110_010-{data}
  8025:   //
  8026:   //STOP #<data>
  8027:   //    1. #<data>をsrに設定する
  8028:   //    2. pcを進める
  8029:   //    3. 以下のいずれかの条件が成立するまで停止する
  8030:   //      3a. トレース
  8031:   //      3b. マスクされているレベルよりも高い割り込み要求
  8032:   //      3c. リセット
  8033:   //  コアと一緒にデバイスを止めるわけにいかないので、ここでは条件が成立するまで同じ命令を繰り返すループ命令として実装する
  8034:   public static void irpStop () throws M68kException {
  8035:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  8036:       XEiJ.mpuCycleCount += 34;
  8037:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  8038:       throw M68kException.m6eSignal;
  8039:     }
  8040:     //以下はスーパーバイザモード
  8041:     XEiJ.mpuCycleCount += 4;
  8042:     irpSetSR (XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  8043:     if (XEiJ.mpuTraceFlag == 0) {  //トレースまたはマスクされているレベルよりも高い割り込み要求がない
  8044:       XEiJ.regPC = XEiJ.regPC0;  //ループ
  8045:       //任意の負荷率を100%に設定しているときSTOP命令が軽すぎると動作周波数が大きくなりすぎて割り込みがかかったとき次に進めなくなる
  8046:       //負荷率の計算にSTOP命令で止まっていた時間を含めないことにする
  8047:       XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000;  //4μs。10MHzのとき40clk
  8048:       XEiJ.mpuLastNano += 4000L;
  8049:     }
  8050:   }  //irpStop
  8051: 
  8052:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8053:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8054:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8055:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8056:   //RTE                                             |-|012346|P|UUUUU|*****|          |0100_111_001_110_011
  8057:   public static void irpRte () throws M68kException {
  8058:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  8059:       XEiJ.mpuCycleCount += 34;
  8060:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  8061:       throw M68kException.m6eSignal;
  8062:     }
  8063:     //以下はスーパーバイザモード
  8064:     XEiJ.mpuCycleCount += 20;
  8065:     int sp = XEiJ.regRn[15];
  8066:     int format = XEiJ.busRws (sp + 6) >>> 12;
  8067:     int frameSize;
  8068:     if (format == 0x0) {  //010,020,030,040,060
  8069:       frameSize = 8;
  8070:     } else if (format == 0x8) {  //010
  8071:       frameSize = 58;
  8072:     } else {
  8073:       M68kException.m6eNumber = M68kException.M6E_FORMAT_ERROR;
  8074:       throw M68kException.m6eSignal;
  8075:     }
  8076:     XEiJ.regRn[15] = sp + frameSize;
  8077:     int newSR = XEiJ.busRwz (sp);  //popwz。ここでバスエラーが生じる可能性がある
  8078:     int newPC = XEiJ.busRls (sp + 2);  //popls
  8079:     //irpSetSRでモードが切り替わる場合があるのでその前にr[15]を更新しておくこと
  8080:     irpSetSR (newSR);  //ここでユーザモードに戻る場合がある。特権違反チェックが先
  8081:     irpSetPC (newPC);  //分岐ログが新しいsrを使う。順序に注意
  8082:   }  //irpRte
  8083: 
  8084:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8085:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8086:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8087:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8088:   //RTD #<data>                                     |-|-12346|-|-----|-----|          |0100_111_001_110_100-{data}
  8089:   public static void irpRtd () throws M68kException {
  8090:     XEiJ.mpuCycleCount += 20;
  8091:     int sp = XEiJ.regRn[15];
  8092:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  8093:       XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  8094:     } else {
  8095:       int t = XEiJ.regPC;
  8096:       XEiJ.regPC = t + 2;
  8097:       XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse (t);  //pcws
  8098:     }
  8099:     irpSetPC (XEiJ.busRls (sp));  //popls
  8100:   }  //irpRtd
  8101: 
  8102:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8103:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8104:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8105:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8106:   //RTS                                             |-|012346|-|-----|-----|          |0100_111_001_110_101
  8107:   public static void irpRts () throws M68kException {
  8108:     XEiJ.mpuCycleCount += 16;
  8109:     int sp = XEiJ.regRn[15];
  8110:     XEiJ.regRn[15] = sp + 4;
  8111:     irpSetPC (XEiJ.busRls (sp));  //popls
  8112:   }  //irpRts
  8113: 
  8114:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8115:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8116:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8117:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8118:   //TRAPV                                           |-|012346|-|---*-|-----|          |0100_111_001_110_110
  8119:   public static void irpTrapv () throws M68kException {
  8120:     if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 >= 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) == 0) {  //通過
  8121:       XEiJ.mpuCycleCount += 4;
  8122:     } else {
  8123:       XEiJ.mpuCycleCount += 34;
  8124:       M68kException.m6eNumber = M68kException.M6E_TRAPV_INSTRUCTION;
  8125:       throw M68kException.m6eSignal;
  8126:     }
  8127:   }  //irpTrapv
  8128: 
  8129:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8130:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8131:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8132:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8133:   //RTR                                             |-|012346|-|UUUUU|*****|          |0100_111_001_110_111
  8134:   public static void irpRtr () throws M68kException {
  8135:     XEiJ.mpuCycleCount += 20;
  8136:     int sp = XEiJ.regRn[15];
  8137:     XEiJ.regRn[15] = sp + 6;
  8138:     XEiJ.regCCR = XEiJ.REG_CCR_MASK & XEiJ.busRwz (sp);  //popwz
  8139:     irpSetPC (XEiJ.busRlse (sp + 2));  //popls。ccrを読めたのだからspは奇数ではない
  8140:   }  //irpRtr
  8141: 
  8142:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8143:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8144:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8145:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8146:   //MOVEC.L Rc,Rn                                   |-|-12346|P|-----|-----|          |0100_111_001_111_010-rnnncccccccccccc
  8147:   public static void irpMovecFromControl () throws M68kException {
  8148:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  8149:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  8150:       throw M68kException.m6eSignal;
  8151:     }
  8152:     //以下はスーパーバイザモード
  8153:     XEiJ.mpuCycleCount += 10;
  8154:     int w;
  8155:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  8156:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  8157:     } else {
  8158:       w = XEiJ.regPC;
  8159:       XEiJ.regPC = w + 2;
  8160:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  8161:     }
  8162:     switch (w & 0x0fff) {
  8163:     case 0x000:  //SFC
  8164:       XEiJ.regRn[w >> 12] = XEiJ.mpuSFC;
  8165:       break;
  8166:     case 0x001:  //DFC
  8167:       XEiJ.regRn[w >> 12] = XEiJ.mpuDFC;
  8168:       break;
  8169:     case 0x801:  //VBR
  8170:       XEiJ.regRn[w >> 12] = XEiJ.mpuVBR;
  8171:       break;
  8172:     default:
  8173:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  8174:       throw M68kException.m6eSignal;
  8175:     }
  8176:   }  //irpMovecFromControl
  8177: 
  8178:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8179:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8180:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8181:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8182:   //MOVEC.L Rn,Rc                                   |-|-12346|P|-----|-----|          |0100_111_001_111_011-rnnncccccccccccc
  8183:   public static void irpMovecToControl () throws M68kException {
  8184:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  8185:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  8186:       throw M68kException.m6eSignal;
  8187:     }
  8188:     //以下はスーパーバイザモード
  8189:     XEiJ.mpuCycleCount += 12;
  8190:     int w;
  8191:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  8192:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  8193:     } else {
  8194:       w = XEiJ.regPC;
  8195:       XEiJ.regPC = w + 2;
  8196:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  8197:     }
  8198:     int d = XEiJ.regRn[w >> 12];
  8199:     switch (w & 0x0fff) {
  8200:     case 0x000:  //SFC
  8201:       XEiJ.mpuSFC = d & 0x00000007;
  8202:       break;
  8203:     case 0x001:  //DFC
  8204:       XEiJ.mpuDFC = d & 0x00000007;
  8205:       break;
  8206:     case 0x801:  //VBR
  8207:       XEiJ.mpuVBR = d & -4;  //4の倍数でないと困る
  8208:       break;
  8209:     default:
  8210:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  8211:       throw M68kException.m6eSignal;
  8212:     }
  8213:   }  //irpMovecToControl
  8214: 
  8215:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8216:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8217:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8218:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8219:   //JSR <ea>                                        |-|012346|-|-----|-----|  M  WXZP |0100_111_010_mmm_rrr
  8220:   //JBSR.L <label>                                  |A|012346|-|-----|-----|          |0100_111_010_111_001-{address}       [JSR <label>]
  8221:   public static void irpJsr () throws M68kException {
  8222:     XEiJ.mpuCycleCount += 16 - 8;
  8223:     int a = efaJmpJsr (XEiJ.regOC & 63);  //プッシュする前に実効アドレスを計算する
  8224:     XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC);  //pushl
  8225:     irpSetPC (a);
  8226:   }  //irpJsr
  8227: 
  8228:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8229:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8230:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8231:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8232:   //JMP <ea>                                        |-|012346|-|-----|-----|  M  WXZP |0100_111_011_mmm_rrr
  8233:   //JBRA.L <label>                                  |A|012346|-|-----|-----|          |0100_111_011_111_001-{address}       [JMP <label>]
  8234:   public static void irpJmp () throws M68kException {
  8235:     //XEiJ.mpuCycleCount += 8 - 8;
  8236:     irpSetPC (efaJmpJsr (XEiJ.regOC & 63));
  8237:   }  //irpJmp
  8238: 
  8239:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8240:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8241:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8242:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8243:   //ADDQ.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_000_mmm_rrr
  8244:   //INC.B <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>]
  8245:   public static void irpAddqByte () throws M68kException {
  8246:     int ea = XEiJ.regOC & 63;
  8247:     int x;
  8248:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8249:     int z;
  8250:     if (ea < XEiJ.EA_AR) {  //ADDQ.B #<data>,Dr
  8251:       XEiJ.mpuCycleCount += 4;
  8252:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y);
  8253:     } else {  //ADDQ.B #<data>,<mem>
  8254:       XEiJ.mpuCycleCount += 8;
  8255:       int a = efaMltByte (ea);
  8256:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y));
  8257:     }
  8258:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8259:            (~x & z) >>> 31 << 1 |
  8260:            (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addq
  8261:   }  //irpAddqByte
  8262: 
  8263:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8264:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8265:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8266:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8267:   //ADDQ.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_001_mmm_rrr
  8268:   //ADDQ.W #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_001_001_rrr
  8269:   //INC.W <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>]
  8270:   //INC.W Ar                                        |A|012346|-|-----|-----| A        |0101_001_001_001_rrr [ADDQ.W #1,Ar]
  8271:   //
  8272:   //ADDQ.W #<data>,Ar
  8273:   //  ソースを符号拡張してロングで加算する
  8274:   public static void irpAddqWord () throws M68kException {
  8275:     int ea = XEiJ.regOC & 63;
  8276:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8277:     if (ea >> 3 == XEiJ.MMM_AR) {  //ADDQ.W #<data>,Ar
  8278:       XEiJ.mpuCycleCount += 8;  //MC68000 User's Manualに4と書いてあるのは8の間違い
  8279:       XEiJ.regRn[ea] += y;  //ロングで計算する。このr[ea]はアドレスレジスタ
  8280:       //ccrは操作しない
  8281:     } else {
  8282:       int x;
  8283:       int z;
  8284:       if (ea < XEiJ.EA_AR) {  //ADDQ.W #<data>,Dr
  8285:         XEiJ.mpuCycleCount += 4;
  8286:         z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y));
  8287:       } else {  //ADDQ.W #<data>,<mem>
  8288:         XEiJ.mpuCycleCount += 8;
  8289:         int a = efaMltWord (ea);
  8290:         XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y));
  8291:       }
  8292:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8293:              (~x & z) >>> 31 << 1 |
  8294:              (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addq
  8295:     }
  8296:   }  //irpAddqWord
  8297: 
  8298:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8299:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8300:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8301:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8302:   //ADDQ.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_010_mmm_rrr
  8303:   //ADDQ.L #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_010_001_rrr
  8304:   //INC.L <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>]
  8305:   //INC.L Ar                                        |A|012346|-|-----|-----| A        |0101_001_010_001_rrr [ADDQ.L #1,Ar]
  8306:   public static void irpAddqLong () throws M68kException {
  8307:     int ea = XEiJ.regOC & 63;
  8308:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8309:     if (ea >> 3 == XEiJ.MMM_AR) {  //ADDQ.L #<data>,Ar
  8310:       XEiJ.mpuCycleCount += 8;
  8311:       XEiJ.regRn[ea] += y;  //このr[ea]はアドレスレジスタ
  8312:       //ccrは操作しない
  8313:     } else {
  8314:       int x;
  8315:       int z;
  8316:       if (ea < XEiJ.EA_AR) {  //ADDQ.L #<data>,Dr
  8317:         XEiJ.mpuCycleCount += 8;
  8318:         XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y;
  8319:       } else {  //ADDQ.L #<data>,<mem>
  8320:         XEiJ.mpuCycleCount += 12;
  8321:         int a = efaMltLong (ea);
  8322:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y);
  8323:       }
  8324:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8325:              (~x & z) >>> 31 << 1 |
  8326:              (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addq
  8327:     }
  8328:   }  //irpAddqLong
  8329: 
  8330:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8331:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8332:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8333:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8334:   //ST.B <ea>                                       |-|012346|-|-----|-----|D M+-WXZ  |0101_000_011_mmm_rrr
  8335:   //SNF.B <ea>                                      |A|012346|-|-----|-----|D M+-WXZ  |0101_000_011_mmm_rrr [ST.B <ea>]
  8336:   //DBT.W Dr,<label>                                |-|012346|-|-----|-----|          |0101_000_011_001_rrr-{offset}
  8337:   //DBNF.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_011_001_rrr-{offset}        [DBT.W Dr,<label>]
  8338:   public static void irpSt () throws M68kException {
  8339:     int ea = XEiJ.regOC & 63;
  8340:     //DBT.W Dr,<label>よりもST.B Drを優先する
  8341:     if (ea < XEiJ.EA_AR) {  //ST.B Dr
  8342:       XEiJ.mpuCycleCount += 6;
  8343:       XEiJ.regRn[ea] |= 0xff;
  8344:     } else if (ea < XEiJ.EA_MM) {  //DBT.W Dr,<label>
  8345:       //条件が成立しているので通過
  8346:       XEiJ.mpuCycleCount += 12;
  8347:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8348:         //リードを省略する
  8349:       } else {
  8350:         XEiJ.busRws (XEiJ.regPC);
  8351:       }
  8352:       XEiJ.regPC += 2;
  8353:     } else {  //ST.B <mem>
  8354:       XEiJ.mpuCycleCount += 8;
  8355:       XEiJ.busWb (efaMltByte (ea), 0xff);
  8356:     }
  8357:   }  //irpSt
  8358: 
  8359:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8360:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8361:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8362:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8363:   //SUBQ.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_100_mmm_rrr
  8364:   //DEC.B <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>]
  8365:   public static void irpSubqByte () throws M68kException {
  8366:     int ea = XEiJ.regOC & 63;
  8367:     int x;
  8368:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8369:     int z;
  8370:     if (ea < XEiJ.EA_AR) {  //SUBQ.B #<data>,Dr
  8371:       XEiJ.mpuCycleCount += 4;
  8372:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y);
  8373:     } else {  //SUBQ.B #<data>,<mem>
  8374:       XEiJ.mpuCycleCount += 8;
  8375:       int a = efaMltByte (ea);
  8376:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y));
  8377:     }
  8378:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8379:            (x & ~z) >>> 31 << 1 |
  8380:            (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subq
  8381:   }  //irpSubqByte
  8382: 
  8383:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8384:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8385:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8386:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8387:   //SUBQ.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_101_mmm_rrr
  8388:   //SUBQ.W #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_101_001_rrr
  8389:   //DEC.W <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>]
  8390:   //DEC.W Ar                                        |A|012346|-|-----|-----| A        |0101_001_101_001_rrr [SUBQ.W #1,Ar]
  8391:   //
  8392:   //SUBQ.W #<data>,Ar
  8393:   //  ソースを符号拡張してロングで減算する
  8394:   public static void irpSubqWord () throws M68kException {
  8395:     int ea = XEiJ.regOC & 63;
  8396:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8397:     if (ea >> 3 == XEiJ.MMM_AR) {  //SUBQ.W #<data>,Ar
  8398:       XEiJ.mpuCycleCount += 8;
  8399:       XEiJ.regRn[ea] -= y;  //ロングで計算する。このr[ea]はアドレスレジスタ
  8400:       //ccrは操作しない
  8401:     } else {
  8402:       int x;
  8403:       int z;
  8404:       if (ea < XEiJ.EA_AR) {  //SUBQ.W #<data>,Dr
  8405:         XEiJ.mpuCycleCount += 4;
  8406:         z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y));
  8407:       } else {  //SUBQ.W #<data>,<mem>
  8408:         XEiJ.mpuCycleCount += 8;
  8409:         int a = efaMltWord (ea);
  8410:         XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y));
  8411:       }
  8412:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8413:              (x & ~z) >>> 31 << 1 |
  8414:              (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subq
  8415:     }
  8416:   }  //irpSubqWord
  8417: 
  8418:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8419:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8420:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8421:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8422:   //SUBQ.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_110_mmm_rrr
  8423:   //SUBQ.L #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_110_001_rrr
  8424:   //DEC.L <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>]
  8425:   //DEC.L Ar                                        |A|012346|-|-----|-----| A        |0101_001_110_001_rrr [SUBQ.L #1,Ar]
  8426:   public static void irpSubqLong () throws M68kException {
  8427:     int ea = XEiJ.regOC & 63;
  8428:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8429:     if (ea >> 3 == XEiJ.MMM_AR) {  //SUBQ.L #<data>,Ar
  8430:       XEiJ.mpuCycleCount += 8;
  8431:       XEiJ.regRn[ea] -= y;  //このr[ea]はアドレスレジスタ
  8432:       //ccrは操作しない
  8433:     } else {
  8434:       int x;
  8435:       int z;
  8436:       if (ea < XEiJ.EA_AR) {  //SUBQ.L #<data>,Dr
  8437:         XEiJ.mpuCycleCount += 8;
  8438:         XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y;
  8439:       } else {  //SUBQ.L #<data>,<mem>
  8440:         XEiJ.mpuCycleCount += 12;
  8441:         int a = efaMltLong (ea);
  8442:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y);
  8443:       }
  8444:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8445:              (x & ~z) >>> 31 << 1 |
  8446:              (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subq
  8447:     }
  8448:   }  //irpSubqLong
  8449: 
  8450:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8451:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8452:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8453:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8454:   //SF.B <ea>                                       |-|012346|-|-----|-----|D M+-WXZ  |0101_000_111_mmm_rrr
  8455:   //SNT.B <ea>                                      |A|012346|-|-----|-----|D M+-WXZ  |0101_000_111_mmm_rrr [SF.B <ea>]
  8456:   //DBF.W Dr,<label>                                |-|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}
  8457:   //DBNT.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}        [DBF.W Dr,<label>]
  8458:   //DBRA.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}        [DBF.W Dr,<label>]
  8459:   public static void irpSf () throws M68kException {
  8460:     int ea = XEiJ.regOC & 63;
  8461:     //DBRA.W Dr,<label>よりもSF.B Drを優先する
  8462:     if (ea < XEiJ.EA_AR) {  //SF.B Dr
  8463:       XEiJ.mpuCycleCount += 4;
  8464:       XEiJ.regRn[ea] &= ~0xff;
  8465:     } else if (ea < XEiJ.EA_MM) {  //DBRA.W Dr,<label>
  8466:       //条件が成立していないのでデクリメント
  8467:       int rrr = XEiJ.regOC & 7;
  8468:       int t = XEiJ.regRn[rrr];
  8469:       if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8470:         XEiJ.mpuCycleCount += 14;
  8471:         XEiJ.regRn[rrr] = t + 65535;
  8472:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8473:           //リードを省略する
  8474:         } else {
  8475:           XEiJ.busRws (XEiJ.regPC);
  8476:         }
  8477:         XEiJ.regPC += 2;
  8478:       } else {  //Drの下位16bitが0でないのでジャンプ
  8479:         XEiJ.mpuCycleCount += 10;
  8480:         XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8481:         irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8482:       }
  8483:     } else {  //SF.B <mem>
  8484:       XEiJ.mpuCycleCount += 8;
  8485:       XEiJ.busWb (efaMltByte (ea), 0x00);
  8486:     }
  8487:   }  //irpSf
  8488: 
  8489:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8490:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8491:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8492:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8493:   //SHI.B <ea>                                      |-|012346|-|--*-*|-----|D M+-WXZ  |0101_001_011_mmm_rrr
  8494:   //SNLS.B <ea>                                     |A|012346|-|--*-*|-----|D M+-WXZ  |0101_001_011_mmm_rrr [SHI.B <ea>]
  8495:   //DBHI.W Dr,<label>                               |-|012346|-|--*-*|-----|          |0101_001_011_001_rrr-{offset}
  8496:   //DBNLS.W Dr,<label>                              |A|012346|-|--*-*|-----|          |0101_001_011_001_rrr-{offset}        [DBHI.W Dr,<label>]
  8497:   public static void irpShi () throws M68kException {
  8498:     int ea = XEiJ.regOC & 63;
  8499:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBHI.W Dr,<label>
  8500:       if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {
  8501:         //条件が成立しているので通過
  8502:         XEiJ.mpuCycleCount += 12;
  8503:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8504:           //リードを省略する
  8505:         } else {
  8506:           XEiJ.busRws (XEiJ.regPC);
  8507:         }
  8508:         XEiJ.regPC += 2;
  8509:       } else {
  8510:         //条件が成立していないのでデクリメント
  8511:         int rrr = XEiJ.regOC & 7;
  8512:         int t = XEiJ.regRn[rrr];
  8513:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8514:           XEiJ.mpuCycleCount += 14;
  8515:           XEiJ.regRn[rrr] = t + 65535;
  8516:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8517:             //リードを省略する
  8518:           } else {
  8519:             XEiJ.busRws (XEiJ.regPC);
  8520:           }
  8521:           XEiJ.regPC += 2;
  8522:         } else {  //Drの下位16bitが0でないのでジャンプ
  8523:           XEiJ.mpuCycleCount += 10;
  8524:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8525:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8526:         }
  8527:       }
  8528:     } else if (ea < XEiJ.EA_AR) {  //SHI.B Dr
  8529:       if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {  //セット
  8530:         XEiJ.mpuCycleCount += 6;
  8531:         XEiJ.regRn[ea] |= 0xff;
  8532:       } else {  //クリア
  8533:         XEiJ.mpuCycleCount += 4;
  8534:         XEiJ.regRn[ea] &= ~0xff;
  8535:       }
  8536:     } else {  //SHI.B <mem>
  8537:       XEiJ.mpuCycleCount += 8;
  8538:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HI << XEiJ.regCCR >> 31);
  8539:     }
  8540:   }  //irpShi
  8541: 
  8542:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8543:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8544:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8545:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8546:   //SLS.B <ea>                                      |-|012346|-|--*-*|-----|D M+-WXZ  |0101_001_111_mmm_rrr
  8547:   //SNHI.B <ea>                                     |A|012346|-|--*-*|-----|D M+-WXZ  |0101_001_111_mmm_rrr [SLS.B <ea>]
  8548:   //DBLS.W Dr,<label>                               |-|012346|-|--*-*|-----|          |0101_001_111_001_rrr-{offset}
  8549:   //DBNHI.W Dr,<label>                              |A|012346|-|--*-*|-----|          |0101_001_111_001_rrr-{offset}        [DBLS.W Dr,<label>]
  8550:   public static void irpSls () throws M68kException {
  8551:     int ea = XEiJ.regOC & 63;
  8552:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLS.W Dr,<label>
  8553:       if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {
  8554:         //条件が成立しているので通過
  8555:         XEiJ.mpuCycleCount += 12;
  8556:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8557:           //リードを省略する
  8558:         } else {
  8559:           XEiJ.busRws (XEiJ.regPC);
  8560:         }
  8561:         XEiJ.regPC += 2;
  8562:       } else {
  8563:         //条件が成立していないのでデクリメント
  8564:         int rrr = XEiJ.regOC & 7;
  8565:         int t = XEiJ.regRn[rrr];
  8566:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8567:           XEiJ.mpuCycleCount += 14;
  8568:           XEiJ.regRn[rrr] = t + 65535;
  8569:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8570:             //リードを省略する
  8571:           } else {
  8572:             XEiJ.busRws (XEiJ.regPC);
  8573:           }
  8574:           XEiJ.regPC += 2;
  8575:         } else {  //Drの下位16bitが0でないのでジャンプ
  8576:           XEiJ.mpuCycleCount += 10;
  8577:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8578:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8579:         }
  8580:       }
  8581:     } else if (ea < XEiJ.EA_AR) {  //SLS.B Dr
  8582:       if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {  //セット
  8583:         XEiJ.mpuCycleCount += 6;
  8584:         XEiJ.regRn[ea] |= 0xff;
  8585:       } else {  //クリア
  8586:         XEiJ.mpuCycleCount += 4;
  8587:         XEiJ.regRn[ea] &= ~0xff;
  8588:       }
  8589:     } else {  //SLS.B <mem>
  8590:       XEiJ.mpuCycleCount += 8;
  8591:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LS << XEiJ.regCCR >> 31);
  8592:     }
  8593:   }  //irpSls
  8594: 
  8595:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8596:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8597:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8598:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8599:   //SCC.B <ea>                                      |-|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr
  8600:   //SHS.B <ea>                                      |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  8601:   //SNCS.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  8602:   //SNLO.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  8603:   //DBCC.W Dr,<label>                               |-|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}
  8604:   //DBHS.W Dr,<label>                               |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  8605:   //DBNCS.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  8606:   //DBNLO.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  8607:   public static void irpShs () throws M68kException {
  8608:     int ea = XEiJ.regOC & 63;
  8609:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBHS.W Dr,<label>
  8610:       if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {
  8611:         //条件が成立しているので通過
  8612:         XEiJ.mpuCycleCount += 12;
  8613:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8614:           //リードを省略する
  8615:         } else {
  8616:           XEiJ.busRws (XEiJ.regPC);
  8617:         }
  8618:         XEiJ.regPC += 2;
  8619:       } else {
  8620:         //条件が成立していないのでデクリメント
  8621:         int rrr = XEiJ.regOC & 7;
  8622:         int t = XEiJ.regRn[rrr];
  8623:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8624:           XEiJ.mpuCycleCount += 14;
  8625:           XEiJ.regRn[rrr] = t + 65535;
  8626:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8627:             //リードを省略する
  8628:           } else {
  8629:             XEiJ.busRws (XEiJ.regPC);
  8630:           }
  8631:           XEiJ.regPC += 2;
  8632:         } else {  //Drの下位16bitが0でないのでジャンプ
  8633:           XEiJ.mpuCycleCount += 10;
  8634:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8635:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8636:         }
  8637:       }
  8638:     } else if (ea < XEiJ.EA_AR) {  //SHS.B Dr
  8639:       if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {  //セット
  8640:         XEiJ.mpuCycleCount += 6;
  8641:         XEiJ.regRn[ea] |= 0xff;
  8642:       } else {  //クリア
  8643:         XEiJ.mpuCycleCount += 4;
  8644:         XEiJ.regRn[ea] &= ~0xff;
  8645:       }
  8646:     } else {  //SHS.B <mem>
  8647:       XEiJ.mpuCycleCount += 8;
  8648:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HS << XEiJ.regCCR >> 31);
  8649:     }
  8650:   }  //irpShs
  8651: 
  8652:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8653:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8654:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8655:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8656:   //SCS.B <ea>                                      |-|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr
  8657:   //SLO.B <ea>                                      |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  8658:   //SNCC.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  8659:   //SNHS.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  8660:   //DBCS.W Dr,<label>                               |-|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}
  8661:   //DBLO.W Dr,<label>                               |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  8662:   //DBNCC.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  8663:   //DBNHS.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  8664:   public static void irpSlo () throws M68kException {
  8665:     int ea = XEiJ.regOC & 63;
  8666:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLO.W Dr,<label>
  8667:       if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {
  8668:         //条件が成立しているので通過
  8669:         XEiJ.mpuCycleCount += 12;
  8670:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8671:           //リードを省略する
  8672:         } else {
  8673:           XEiJ.busRws (XEiJ.regPC);
  8674:         }
  8675:         XEiJ.regPC += 2;
  8676:       } else {
  8677:         //条件が成立していないのでデクリメント
  8678:         int rrr = XEiJ.regOC & 7;
  8679:         int t = XEiJ.regRn[rrr];
  8680:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8681:           XEiJ.mpuCycleCount += 14;
  8682:           XEiJ.regRn[rrr] = t + 65535;
  8683:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8684:             //リードを省略する
  8685:           } else {
  8686:             XEiJ.busRws (XEiJ.regPC);
  8687:           }
  8688:           XEiJ.regPC += 2;
  8689:         } else {  //Drの下位16bitが0でないのでジャンプ
  8690:           XEiJ.mpuCycleCount += 10;
  8691:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8692:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8693:         }
  8694:       }
  8695:     } else if (ea < XEiJ.EA_AR) {  //SLO.B Dr
  8696:       if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {  //セット
  8697:         XEiJ.mpuCycleCount += 6;
  8698:         XEiJ.regRn[ea] |= 0xff;
  8699:       } else {  //クリア
  8700:         XEiJ.mpuCycleCount += 4;
  8701:         XEiJ.regRn[ea] &= ~0xff;
  8702:       }
  8703:     } else {  //SLO.B <mem>
  8704:       XEiJ.mpuCycleCount += 8;
  8705:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LO << XEiJ.regCCR >> 31);
  8706:     }
  8707:   }  //irpSlo
  8708: 
  8709:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8710:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8711:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8712:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8713:   //SNE.B <ea>                                      |-|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr
  8714:   //SNEQ.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  8715:   //SNZ.B <ea>                                      |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  8716:   //SNZE.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  8717:   //DBNE.W Dr,<label>                               |-|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}
  8718:   //DBNEQ.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  8719:   //DBNZ.W Dr,<label>                               |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  8720:   //DBNZE.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  8721:   public static void irpSne () throws M68kException {
  8722:     int ea = XEiJ.regOC & 63;
  8723:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBNE.W Dr,<label>
  8724:       if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {
  8725:         //条件が成立しているので通過
  8726:         XEiJ.mpuCycleCount += 12;
  8727:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8728:           //リードを省略する
  8729:         } else {
  8730:           XEiJ.busRws (XEiJ.regPC);
  8731:         }
  8732:         XEiJ.regPC += 2;
  8733:       } else {
  8734:         //条件が成立していないのでデクリメント
  8735:         int rrr = XEiJ.regOC & 7;
  8736:         int t = XEiJ.regRn[rrr];
  8737:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8738:           XEiJ.mpuCycleCount += 14;
  8739:           XEiJ.regRn[rrr] = t + 65535;
  8740:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8741:             //リードを省略する
  8742:           } else {
  8743:             XEiJ.busRws (XEiJ.regPC);
  8744:           }
  8745:           XEiJ.regPC += 2;
  8746:         } else {  //Drの下位16bitが0でないのでジャンプ
  8747:           XEiJ.mpuCycleCount += 10;
  8748:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8749:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8750:         }
  8751:       }
  8752:     } else if (ea < XEiJ.EA_AR) {  //SNE.B Dr
  8753:       if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {  //セット
  8754:         XEiJ.mpuCycleCount += 6;
  8755:         XEiJ.regRn[ea] |= 0xff;
  8756:       } else {  //クリア
  8757:         XEiJ.mpuCycleCount += 4;
  8758:         XEiJ.regRn[ea] &= ~0xff;
  8759:       }
  8760:     } else {  //SNE.B <mem>
  8761:       XEiJ.mpuCycleCount += 8;
  8762:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_NE << XEiJ.regCCR >> 31);
  8763:     }
  8764:   }  //irpSne
  8765: 
  8766:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8767:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8768:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8769:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8770:   //SEQ.B <ea>                                      |-|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr
  8771:   //SNNE.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  8772:   //SNNZ.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  8773:   //SZE.B <ea>                                      |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  8774:   //DBEQ.W Dr,<label>                               |-|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}
  8775:   //DBNNE.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  8776:   //DBNNZ.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  8777:   //DBZE.W Dr,<label>                               |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  8778:   public static void irpSeq () throws M68kException {
  8779:     int ea = XEiJ.regOC & 63;
  8780:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBEQ.W Dr,<label>
  8781:       if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {
  8782:         //条件が成立しているので通過
  8783:         XEiJ.mpuCycleCount += 12;
  8784:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8785:           //リードを省略する
  8786:         } else {
  8787:           XEiJ.busRws (XEiJ.regPC);
  8788:         }
  8789:         XEiJ.regPC += 2;
  8790:       } else {
  8791:         //条件が成立していないのでデクリメント
  8792:         int rrr = XEiJ.regOC & 7;
  8793:         int t = XEiJ.regRn[rrr];
  8794:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8795:           XEiJ.mpuCycleCount += 14;
  8796:           XEiJ.regRn[rrr] = t + 65535;
  8797:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8798:             //リードを省略する
  8799:           } else {
  8800:             XEiJ.busRws (XEiJ.regPC);
  8801:           }
  8802:           XEiJ.regPC += 2;
  8803:         } else {  //Drの下位16bitが0でないのでジャンプ
  8804:           XEiJ.mpuCycleCount += 10;
  8805:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8806:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8807:         }
  8808:       }
  8809:     } else if (ea < XEiJ.EA_AR) {  //SEQ.B Dr
  8810:       if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {  //セット
  8811:         XEiJ.mpuCycleCount += 6;
  8812:         XEiJ.regRn[ea] |= 0xff;
  8813:       } else {  //クリア
  8814:         XEiJ.mpuCycleCount += 4;
  8815:         XEiJ.regRn[ea] &= ~0xff;
  8816:       }
  8817:     } else {  //SEQ.B <mem>
  8818:       XEiJ.mpuCycleCount += 8;
  8819:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_EQ << XEiJ.regCCR >> 31);
  8820:     }
  8821:   }  //irpSeq
  8822: 
  8823:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8824:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8825:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8826:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8827:   //SVC.B <ea>                                      |-|012346|-|---*-|-----|D M+-WXZ  |0101_100_011_mmm_rrr
  8828:   //SNVS.B <ea>                                     |A|012346|-|---*-|-----|D M+-WXZ  |0101_100_011_mmm_rrr [SVC.B <ea>]
  8829:   //DBVC.W Dr,<label>                               |-|012346|-|---*-|-----|          |0101_100_011_001_rrr-{offset}
  8830:   //DBNVS.W Dr,<label>                              |A|012346|-|---*-|-----|          |0101_100_011_001_rrr-{offset}        [DBVC.W Dr,<label>]
  8831:   public static void irpSvc () throws M68kException {
  8832:     int ea = XEiJ.regOC & 63;
  8833:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBVC.W Dr,<label>
  8834:       if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {
  8835:         //条件が成立しているので通過
  8836:         XEiJ.mpuCycleCount += 12;
  8837:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8838:           //リードを省略する
  8839:         } else {
  8840:           XEiJ.busRws (XEiJ.regPC);
  8841:         }
  8842:         XEiJ.regPC += 2;
  8843:       } else {
  8844:         //条件が成立していないのでデクリメント
  8845:         int rrr = XEiJ.regOC & 7;
  8846:         int t = XEiJ.regRn[rrr];
  8847:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8848:           XEiJ.mpuCycleCount += 14;
  8849:           XEiJ.regRn[rrr] = t + 65535;
  8850:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8851:             //リードを省略する
  8852:           } else {
  8853:             XEiJ.busRws (XEiJ.regPC);
  8854:           }
  8855:           XEiJ.regPC += 2;
  8856:         } else {  //Drの下位16bitが0でないのでジャンプ
  8857:           XEiJ.mpuCycleCount += 10;
  8858:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8859:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8860:         }
  8861:       }
  8862:     } else if (ea < XEiJ.EA_AR) {  //SVC.B Dr
  8863:       if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {  //セット
  8864:         XEiJ.mpuCycleCount += 6;
  8865:         XEiJ.regRn[ea] |= 0xff;
  8866:       } else {  //クリア
  8867:         XEiJ.mpuCycleCount += 4;
  8868:         XEiJ.regRn[ea] &= ~0xff;
  8869:       }
  8870:     } else {  //SVC.B <mem>
  8871:       XEiJ.mpuCycleCount += 8;
  8872:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VC << XEiJ.regCCR >> 31);
  8873:     }
  8874:   }  //irpSvc
  8875: 
  8876:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8877:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8878:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8879:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8880:   //SVS.B <ea>                                      |-|012346|-|---*-|-----|D M+-WXZ  |0101_100_111_mmm_rrr
  8881:   //SNVC.B <ea>                                     |A|012346|-|---*-|-----|D M+-WXZ  |0101_100_111_mmm_rrr [SVS.B <ea>]
  8882:   //DBVS.W Dr,<label>                               |-|012346|-|---*-|-----|          |0101_100_111_001_rrr-{offset}
  8883:   //DBNVC.W Dr,<label>                              |A|012346|-|---*-|-----|          |0101_100_111_001_rrr-{offset}        [DBVS.W Dr,<label>]
  8884:   public static void irpSvs () throws M68kException {
  8885:     int ea = XEiJ.regOC & 63;
  8886:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBVS.W Dr,<label>
  8887:       if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {
  8888:         //条件が成立しているので通過
  8889:         XEiJ.mpuCycleCount += 12;
  8890:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8891:           //リードを省略する
  8892:         } else {
  8893:           XEiJ.busRws (XEiJ.regPC);
  8894:         }
  8895:         XEiJ.regPC += 2;
  8896:       } else {
  8897:         //条件が成立していないのでデクリメント
  8898:         int rrr = XEiJ.regOC & 7;
  8899:         int t = XEiJ.regRn[rrr];
  8900:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8901:           XEiJ.mpuCycleCount += 14;
  8902:           XEiJ.regRn[rrr] = t + 65535;
  8903:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8904:             //リードを省略する
  8905:           } else {
  8906:             XEiJ.busRws (XEiJ.regPC);
  8907:           }
  8908:           XEiJ.regPC += 2;
  8909:         } else {  //Drの下位16bitが0でないのでジャンプ
  8910:           XEiJ.mpuCycleCount += 10;
  8911:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8912:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8913:         }
  8914:       }
  8915:     } else if (ea < XEiJ.EA_AR) {  //SVS.B Dr
  8916:       if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {  //セット
  8917:         XEiJ.mpuCycleCount += 6;
  8918:         XEiJ.regRn[ea] |= 0xff;
  8919:       } else {  //クリア
  8920:         XEiJ.mpuCycleCount += 4;
  8921:         XEiJ.regRn[ea] &= ~0xff;
  8922:       }
  8923:     } else {  //SVS.B <mem>
  8924:       XEiJ.mpuCycleCount += 8;
  8925:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VS << XEiJ.regCCR >> 31);
  8926:     }
  8927:   }  //irpSvs
  8928: 
  8929:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8930:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8931:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8932:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8933:   //SPL.B <ea>                                      |-|012346|-|-*---|-----|D M+-WXZ  |0101_101_011_mmm_rrr
  8934:   //SNMI.B <ea>                                     |A|012346|-|-*---|-----|D M+-WXZ  |0101_101_011_mmm_rrr [SPL.B <ea>]
  8935:   //DBPL.W Dr,<label>                               |-|012346|-|-*---|-----|          |0101_101_011_001_rrr-{offset}
  8936:   //DBNMI.W Dr,<label>                              |A|012346|-|-*---|-----|          |0101_101_011_001_rrr-{offset}        [DBPL.W Dr,<label>]
  8937:   public static void irpSpl () throws M68kException {
  8938:     int ea = XEiJ.regOC & 63;
  8939:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBPL.W Dr,<label>
  8940:       if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {
  8941:         //条件が成立しているので通過
  8942:         XEiJ.mpuCycleCount += 12;
  8943:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8944:           //リードを省略する
  8945:         } else {
  8946:           XEiJ.busRws (XEiJ.regPC);
  8947:         }
  8948:         XEiJ.regPC += 2;
  8949:       } else {
  8950:         //条件が成立していないのでデクリメント
  8951:         int rrr = XEiJ.regOC & 7;
  8952:         int t = XEiJ.regRn[rrr];
  8953:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8954:           XEiJ.mpuCycleCount += 14;
  8955:           XEiJ.regRn[rrr] = t + 65535;
  8956:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8957:             //リードを省略する
  8958:           } else {
  8959:             XEiJ.busRws (XEiJ.regPC);
  8960:           }
  8961:           XEiJ.regPC += 2;
  8962:         } else {  //Drの下位16bitが0でないのでジャンプ
  8963:           XEiJ.mpuCycleCount += 10;
  8964:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8965:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8966:         }
  8967:       }
  8968:     } else if (ea < XEiJ.EA_AR) {  //SPL.B Dr
  8969:       if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {  //セット
  8970:         XEiJ.mpuCycleCount += 6;
  8971:         XEiJ.regRn[ea] |= 0xff;
  8972:       } else {  //クリア
  8973:         XEiJ.mpuCycleCount += 4;
  8974:         XEiJ.regRn[ea] &= ~0xff;
  8975:       }
  8976:     } else {  //SPL.B <mem>
  8977:       XEiJ.mpuCycleCount += 8;
  8978:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_PL << XEiJ.regCCR >> 31);
  8979:     }
  8980:   }  //irpSpl
  8981: 
  8982:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8983:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8984:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8985:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8986:   //SMI.B <ea>                                      |-|012346|-|-*---|-----|D M+-WXZ  |0101_101_111_mmm_rrr
  8987:   //SNPL.B <ea>                                     |A|012346|-|-*---|-----|D M+-WXZ  |0101_101_111_mmm_rrr [SMI.B <ea>]
  8988:   //DBMI.W Dr,<label>                               |-|012346|-|-*---|-----|          |0101_101_111_001_rrr-{offset}
  8989:   //DBNPL.W Dr,<label>                              |A|012346|-|-*---|-----|          |0101_101_111_001_rrr-{offset}        [DBMI.W Dr,<label>]
  8990:   public static void irpSmi () throws M68kException {
  8991:     int ea = XEiJ.regOC & 63;
  8992:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBMI.W Dr,<label>
  8993:       if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {
  8994:         //条件が成立しているので通過
  8995:         XEiJ.mpuCycleCount += 12;
  8996:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8997:           //リードを省略する
  8998:         } else {
  8999:           XEiJ.busRws (XEiJ.regPC);
  9000:         }
  9001:         XEiJ.regPC += 2;
  9002:       } else {
  9003:         //条件が成立していないのでデクリメント
  9004:         int rrr = XEiJ.regOC & 7;
  9005:         int t = XEiJ.regRn[rrr];
  9006:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9007:           XEiJ.mpuCycleCount += 14;
  9008:           XEiJ.regRn[rrr] = t + 65535;
  9009:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9010:             //リードを省略する
  9011:           } else {
  9012:             XEiJ.busRws (XEiJ.regPC);
  9013:           }
  9014:           XEiJ.regPC += 2;
  9015:         } else {  //Drの下位16bitが0でないのでジャンプ
  9016:           XEiJ.mpuCycleCount += 10;
  9017:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9018:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9019:         }
  9020:       }
  9021:     } else if (ea < XEiJ.EA_AR) {  //SMI.B Dr
  9022:       if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {  //セット
  9023:         XEiJ.mpuCycleCount += 6;
  9024:         XEiJ.regRn[ea] |= 0xff;
  9025:       } else {  //クリア
  9026:         XEiJ.mpuCycleCount += 4;
  9027:         XEiJ.regRn[ea] &= ~0xff;
  9028:       }
  9029:     } else {  //SMI.B <mem>
  9030:       XEiJ.mpuCycleCount += 8;
  9031:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_MI << XEiJ.regCCR >> 31);
  9032:     }
  9033:   }  //irpSmi
  9034: 
  9035:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9036:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9037:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9038:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9039:   //SGE.B <ea>                                      |-|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_011_mmm_rrr
  9040:   //SNLT.B <ea>                                     |A|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_011_mmm_rrr [SGE.B <ea>]
  9041:   //DBGE.W Dr,<label>                               |-|012346|-|-*-*-|-----|          |0101_110_011_001_rrr-{offset}
  9042:   //DBNLT.W Dr,<label>                              |A|012346|-|-*-*-|-----|          |0101_110_011_001_rrr-{offset}        [DBGE.W Dr,<label>]
  9043:   public static void irpSge () throws M68kException {
  9044:     int ea = XEiJ.regOC & 63;
  9045:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBGE.W Dr,<label>
  9046:       if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {
  9047:         //条件が成立しているので通過
  9048:         XEiJ.mpuCycleCount += 12;
  9049:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9050:           //リードを省略する
  9051:         } else {
  9052:           XEiJ.busRws (XEiJ.regPC);
  9053:         }
  9054:         XEiJ.regPC += 2;
  9055:       } else {
  9056:         //条件が成立していないのでデクリメント
  9057:         int rrr = XEiJ.regOC & 7;
  9058:         int t = XEiJ.regRn[rrr];
  9059:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9060:           XEiJ.mpuCycleCount += 14;
  9061:           XEiJ.regRn[rrr] = t + 65535;
  9062:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9063:             //リードを省略する
  9064:           } else {
  9065:             XEiJ.busRws (XEiJ.regPC);
  9066:           }
  9067:           XEiJ.regPC += 2;
  9068:         } else {  //Drの下位16bitが0でないのでジャンプ
  9069:           XEiJ.mpuCycleCount += 10;
  9070:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9071:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9072:         }
  9073:       }
  9074:     } else if (ea < XEiJ.EA_AR) {  //SGE.B Dr
  9075:       if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {  //セット
  9076:         XEiJ.mpuCycleCount += 6;
  9077:         XEiJ.regRn[ea] |= 0xff;
  9078:       } else {  //クリア
  9079:         XEiJ.mpuCycleCount += 4;
  9080:         XEiJ.regRn[ea] &= ~0xff;
  9081:       }
  9082:     } else {  //SGE.B <mem>
  9083:       XEiJ.mpuCycleCount += 8;
  9084:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GE << XEiJ.regCCR >> 31);
  9085:     }
  9086:   }  //irpSge
  9087: 
  9088:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9089:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9090:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9091:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9092:   //SLT.B <ea>                                      |-|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_111_mmm_rrr
  9093:   //SNGE.B <ea>                                     |A|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_111_mmm_rrr [SLT.B <ea>]
  9094:   //DBLT.W Dr,<label>                               |-|012346|-|-*-*-|-----|          |0101_110_111_001_rrr-{offset}
  9095:   //DBNGE.W Dr,<label>                              |A|012346|-|-*-*-|-----|          |0101_110_111_001_rrr-{offset}        [DBLT.W Dr,<label>]
  9096:   public static void irpSlt () throws M68kException {
  9097:     int ea = XEiJ.regOC & 63;
  9098:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLT.W Dr,<label>
  9099:       if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {
  9100:         //条件が成立しているので通過
  9101:         XEiJ.mpuCycleCount += 12;
  9102:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9103:           //リードを省略する
  9104:         } else {
  9105:           XEiJ.busRws (XEiJ.regPC);
  9106:         }
  9107:         XEiJ.regPC += 2;
  9108:       } else {
  9109:         //条件が成立していないのでデクリメント
  9110:         int rrr = XEiJ.regOC & 7;
  9111:         int t = XEiJ.regRn[rrr];
  9112:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9113:           XEiJ.mpuCycleCount += 14;
  9114:           XEiJ.regRn[rrr] = t + 65535;
  9115:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9116:             //リードを省略する
  9117:           } else {
  9118:             XEiJ.busRws (XEiJ.regPC);
  9119:           }
  9120:           XEiJ.regPC += 2;
  9121:         } else {  //Drの下位16bitが0でないのでジャンプ
  9122:           XEiJ.mpuCycleCount += 10;
  9123:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9124:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9125:         }
  9126:       }
  9127:     } else if (ea < XEiJ.EA_AR) {  //SLT.B Dr
  9128:       if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {  //セット
  9129:         XEiJ.mpuCycleCount += 6;
  9130:         XEiJ.regRn[ea] |= 0xff;
  9131:       } else {  //クリア
  9132:         XEiJ.mpuCycleCount += 4;
  9133:         XEiJ.regRn[ea] &= ~0xff;
  9134:       }
  9135:     } else {  //SLT.B <mem>
  9136:       XEiJ.mpuCycleCount += 8;
  9137:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LT << XEiJ.regCCR >> 31);
  9138:     }
  9139:   }  //irpSlt
  9140: 
  9141:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9142:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9143:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9144:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9145:   //SGT.B <ea>                                      |-|012346|-|-***-|-----|D M+-WXZ  |0101_111_011_mmm_rrr
  9146:   //SNLE.B <ea>                                     |A|012346|-|-***-|-----|D M+-WXZ  |0101_111_011_mmm_rrr [SGT.B <ea>]
  9147:   //DBGT.W Dr,<label>                               |-|012346|-|-***-|-----|          |0101_111_011_001_rrr-{offset}
  9148:   //DBNLE.W Dr,<label>                              |A|012346|-|-***-|-----|          |0101_111_011_001_rrr-{offset}        [DBGT.W Dr,<label>]
  9149:   public static void irpSgt () throws M68kException {
  9150:     int ea = XEiJ.regOC & 63;
  9151:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBGT.W Dr,<label>
  9152:       if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {
  9153:         //条件が成立しているので通過
  9154:         XEiJ.mpuCycleCount += 12;
  9155:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9156:           //リードを省略する
  9157:         } else {
  9158:           XEiJ.busRws (XEiJ.regPC);
  9159:         }
  9160:         XEiJ.regPC += 2;
  9161:       } else {
  9162:         //条件が成立していないのでデクリメント
  9163:         int rrr = XEiJ.regOC & 7;
  9164:         int t = XEiJ.regRn[rrr];
  9165:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9166:           XEiJ.mpuCycleCount += 14;
  9167:           XEiJ.regRn[rrr] = t + 65535;
  9168:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9169:             //リードを省略する
  9170:           } else {
  9171:             XEiJ.busRws (XEiJ.regPC);
  9172:           }
  9173:           XEiJ.regPC += 2;
  9174:         } else {  //Drの下位16bitが0でないのでジャンプ
  9175:           XEiJ.mpuCycleCount += 10;
  9176:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9177:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9178:         }
  9179:       }
  9180:     } else if (ea < XEiJ.EA_AR) {  //SGT.B Dr
  9181:       if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {  //セット
  9182:         XEiJ.mpuCycleCount += 6;
  9183:         XEiJ.regRn[ea] |= 0xff;
  9184:       } else {  //クリア
  9185:         XEiJ.mpuCycleCount += 4;
  9186:         XEiJ.regRn[ea] &= ~0xff;
  9187:       }
  9188:     } else {  //SGT.B <mem>
  9189:       XEiJ.mpuCycleCount += 8;
  9190:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GT << XEiJ.regCCR >> 31);
  9191:     }
  9192:   }  //irpSgt
  9193: 
  9194:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9195:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9196:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9197:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9198:   //SLE.B <ea>                                      |-|012346|-|-***-|-----|D M+-WXZ  |0101_111_111_mmm_rrr
  9199:   //SNGT.B <ea>                                     |A|012346|-|-***-|-----|D M+-WXZ  |0101_111_111_mmm_rrr [SLE.B <ea>]
  9200:   //DBLE.W Dr,<label>                               |-|012346|-|-***-|-----|          |0101_111_111_001_rrr-{offset}
  9201:   //DBNGT.W Dr,<label>                              |A|012346|-|-***-|-----|          |0101_111_111_001_rrr-{offset}        [DBLE.W Dr,<label>]
  9202:   public static void irpSle () throws M68kException {
  9203:     int ea = XEiJ.regOC & 63;
  9204:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLE.W Dr,<label>
  9205:       if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {
  9206:         //条件が成立しているので通過
  9207:         XEiJ.mpuCycleCount += 12;
  9208:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9209:           //リードを省略する
  9210:         } else {
  9211:           XEiJ.busRws (XEiJ.regPC);
  9212:         }
  9213:         XEiJ.regPC += 2;
  9214:       } else {
  9215:         //条件が成立していないのでデクリメント
  9216:         int rrr = XEiJ.regOC & 7;
  9217:         int t = XEiJ.regRn[rrr];
  9218:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9219:           XEiJ.mpuCycleCount += 14;
  9220:           XEiJ.regRn[rrr] = t + 65535;
  9221:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9222:             //リードを省略する
  9223:           } else {
  9224:             XEiJ.busRws (XEiJ.regPC);
  9225:           }
  9226:           XEiJ.regPC += 2;
  9227:         } else {  //Drの下位16bitが0でないのでジャンプ
  9228:           XEiJ.mpuCycleCount += 10;
  9229:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9230:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9231:         }
  9232:       }
  9233:     } else if (ea < XEiJ.EA_AR) {  //SLE.B Dr
  9234:       if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {  //セット
  9235:         XEiJ.mpuCycleCount += 6;
  9236:         XEiJ.regRn[ea] |= 0xff;
  9237:       } else {  //クリア
  9238:         XEiJ.mpuCycleCount += 4;
  9239:         XEiJ.regRn[ea] &= ~0xff;
  9240:       }
  9241:     } else {  //SLE.B <mem>
  9242:       XEiJ.mpuCycleCount += 8;
  9243:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LE << XEiJ.regCCR >> 31);
  9244:     }
  9245:   }  //irpSle
  9246: 
  9247:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9248:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9249:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9250:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9251:   //BRA.W <label>                                   |-|012346|-|-----|-----|          |0110_000_000_000_000-{offset}
  9252:   //JBRA.W <label>                                  |A|012346|-|-----|-----|          |0110_000_000_000_000-{offset}        [BRA.W <label>]
  9253:   //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_000_sss_sss (s is not equal to 0)
  9254:   //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_000_sss_sss (s is not equal to 0)   [BRA.S <label>]
  9255:   public static void irpBrasw () throws M68kException {
  9256:     XEiJ.mpuCycleCount += 10;
  9257:     int t = XEiJ.regPC;  //pc0+2
  9258:     int s = (byte) XEiJ.regOC;  //オフセット
  9259:     if (s == 0) {  //BRA.W
  9260:       XEiJ.regPC = t + 2;
  9261:       s = XEiJ.busRwse (t);  //pcws
  9262:     } else {  //BRA.S
  9263:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9264:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9265:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9266:         //! 軽量化。リードを省略する
  9267:       } else {
  9268:         XEiJ.busRwse (t);  //pcws
  9269:       }
  9270:     }
  9271:     irpSetPC (t + s);  //pc0+2+オフセット
  9272:   }  //irpBrasw
  9273: 
  9274:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9275:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9276:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9277:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9278:   //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_001_sss_sss
  9279:   //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_001_sss_sss [BRA.S <label>]
  9280:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9281:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9282:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9283:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9284:   //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_010_sss_sss
  9285:   //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_010_sss_sss [BRA.S <label>]
  9286:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9287:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9288:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9289:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9290:   //BRA.S <label>                                   |-|01----|-|-----|-----|          |0110_000_011_sss_sss
  9291:   //JBRA.S <label>                                  |A|01----|-|-----|-----|          |0110_000_011_sss_sss [BRA.S <label>]
  9292:   public static void irpBras () throws M68kException {
  9293:     XEiJ.mpuCycleCount += 10;
  9294:     int t = XEiJ.regPC;  //pc0+2
  9295:     int s = (byte) XEiJ.regOC;  //オフセット
  9296:     //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9297:     //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9298:     if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9299:       //! 軽量化。リードを省略する
  9300:     } else {
  9301:       XEiJ.busRwse (t);  //pcws
  9302:     }
  9303:     irpSetPC (t + s);  //pc0+2+オフセット
  9304:   }  //irpBras
  9305: 
  9306:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9307:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9308:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9309:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9310:   //BSR.W <label>                                   |-|012346|-|-----|-----|          |0110_000_100_000_000-{offset}
  9311:   //JBSR.W <label>                                  |A|012346|-|-----|-----|          |0110_000_100_000_000-{offset}        [BSR.W <label>]
  9312:   //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_100_sss_sss (s is not equal to 0)
  9313:   //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_100_sss_sss (s is not equal to 0)   [BSR.S <label>]
  9314:   public static void irpBsrsw () throws M68kException {
  9315:     XEiJ.mpuCycleCount += 18;
  9316:     int t = XEiJ.regPC;  //pc0+2
  9317:     int s = (byte) XEiJ.regOC;  //オフセット
  9318:     if (s == 0) {  //BSR.W
  9319:       XEiJ.regPC = t + 2;
  9320:       s = XEiJ.busRwse (t);  //pcws
  9321:     } else {  //BSR.S
  9322:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9323:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9324:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9325:         //! 軽量化。リードを省略する
  9326:       } else {
  9327:         XEiJ.busRwse (t);  //pcws
  9328:       }
  9329:     }
  9330:     XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC);  //pushl
  9331:     irpSetPC (t + s);  //pc0+2+オフセット
  9332:   }  //irpBsrsw
  9333: 
  9334:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9335:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9336:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9337:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9338:   //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_101_sss_sss
  9339:   //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_101_sss_sss [BSR.S <label>]
  9340:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9341:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9342:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9343:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9344:   //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_110_sss_sss
  9345:   //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_110_sss_sss [BSR.S <label>]
  9346:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9347:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9348:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9349:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9350:   //BSR.S <label>                                   |-|01----|-|-----|-----|          |0110_000_111_sss_sss
  9351:   //JBSR.S <label>                                  |A|01----|-|-----|-----|          |0110_000_111_sss_sss [BSR.S <label>]
  9352:   public static void irpBsrs () throws M68kException {
  9353:     XEiJ.mpuCycleCount += 18;
  9354:     int t = XEiJ.regPC;  //pc0+2
  9355:     int s = (byte) XEiJ.regOC;  //オフセット
  9356:     //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9357:     //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9358:     if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9359:       //! 軽量化。リードを省略する
  9360:     } else {
  9361:       XEiJ.busRwse (t);  //pcws
  9362:     }
  9363:     XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC);  //pushl
  9364:     irpSetPC (t + s);  //pc0+2+オフセット
  9365:   }  //irpBsrs
  9366: 
  9367:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9368:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9369:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9370:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9371:   //BHI.W <label>                                   |-|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}
  9372:   //BNLS.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  9373:   //JBHI.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  9374:   //JBNLS.W <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  9375:   //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)
  9376:   //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  9377:   //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  9378:   //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  9379:   //JBLS.L <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_110-0100111011111001-{address}      [BHI.S (*)+8;JMP <label>]
  9380:   //JBNHI.L <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_000_110-0100111011111001-{address}      [BHI.S (*)+8;JMP <label>]
  9381:   public static void irpBhisw () throws M68kException {
  9382:     if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9383:       XEiJ.mpuCycleCount += 10;
  9384:       int t = XEiJ.regPC;  //pc0+2
  9385:       int s = (byte) XEiJ.regOC;  //オフセット
  9386:       if (s == 0) {  //Bcc.Wでジャンプ
  9387:         XEiJ.regPC = t + 2;
  9388:         s = XEiJ.busRwse (t);  //pcws
  9389:       } else {  //Bcc.Sでジャンプ
  9390:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9391:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9392:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9393:           //! 軽量化。リードを省略する
  9394:         } else {
  9395:           XEiJ.busRwse (t);  //pcws
  9396:         }
  9397:       }
  9398:       irpSetPC (t + s);  //pc0+2+オフセット
  9399:     } else if (XEiJ.regOC == 0x6200) {  //Bcc.Wで通過
  9400:       XEiJ.mpuCycleCount += 12;
  9401:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9402:         //リードを省略する
  9403:       } else {
  9404:         XEiJ.busRws (XEiJ.regPC);
  9405:       }
  9406:       XEiJ.regPC += 2;
  9407:     } else {  //Bcc.Sで通過
  9408:       XEiJ.mpuCycleCount += 8;
  9409:     }
  9410:   }  //irpBhisw
  9411: 
  9412:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9413:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9414:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9415:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9416:   //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_001_sss_sss
  9417:   //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  9418:   //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  9419:   //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  9420:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9421:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9422:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9423:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9424:   //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_010_sss_sss
  9425:   //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  9426:   //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  9427:   //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  9428:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9429:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9430:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9431:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9432:   //BHI.S <label>                                   |-|01----|-|--*-*|-----|          |0110_001_011_sss_sss
  9433:   //BNLS.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  9434:   //JBHI.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  9435:   //JBNLS.S <label>                                 |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  9436:   public static void irpBhis () throws M68kException {
  9437:     if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {  //Bcc.Sでジャンプ
  9438:       XEiJ.mpuCycleCount += 10;
  9439:       int t = XEiJ.regPC;  //pc0+2
  9440:       int s = (byte) XEiJ.regOC;  //オフセット
  9441:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9442:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9443:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9444:         //! 軽量化。リードを省略する
  9445:       } else {
  9446:         XEiJ.busRwse (t);  //pcws
  9447:       }
  9448:       irpSetPC (t + s);  //pc0+2+オフセット
  9449:     } else {  //Bcc.Sで通過
  9450:       XEiJ.mpuCycleCount += 8;
  9451:     }
  9452:   }  //irpBhis
  9453: 
  9454:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9455:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9456:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9457:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9458:   //BLS.W <label>                                   |-|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}
  9459:   //BNHI.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  9460:   //JBLS.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  9461:   //JBNHI.W <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  9462:   //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)
  9463:   //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  9464:   //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  9465:   //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  9466:   //JBHI.L <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_110-0100111011111001-{address}      [BLS.S (*)+8;JMP <label>]
  9467:   //JBNLS.L <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_000_110-0100111011111001-{address}      [BLS.S (*)+8;JMP <label>]
  9468:   public static void irpBlssw () throws M68kException {
  9469:     if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9470:       XEiJ.mpuCycleCount += 10;
  9471:       int t = XEiJ.regPC;  //pc0+2
  9472:       int s = (byte) XEiJ.regOC;  //オフセット
  9473:       if (s == 0) {  //Bcc.Wでジャンプ
  9474:         XEiJ.regPC = t + 2;
  9475:         s = XEiJ.busRwse (t);  //pcws
  9476:       } else {  //Bcc.Sでジャンプ
  9477:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9478:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9479:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9480:           //! 軽量化。リードを省略する
  9481:         } else {
  9482:           XEiJ.busRwse (t);  //pcws
  9483:         }
  9484:       }
  9485:       irpSetPC (t + s);  //pc0+2+オフセット
  9486:     } else if (XEiJ.regOC == 0x6300) {  //Bcc.Wで通過
  9487:       XEiJ.mpuCycleCount += 12;
  9488:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9489:         //リードを省略する
  9490:       } else {
  9491:         XEiJ.busRws (XEiJ.regPC);
  9492:       }
  9493:       XEiJ.regPC += 2;
  9494:     } else {  //Bcc.Sで通過
  9495:       XEiJ.mpuCycleCount += 8;
  9496:     }
  9497:   }  //irpBlssw
  9498: 
  9499:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9500:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9501:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9502:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9503:   //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_101_sss_sss
  9504:   //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  9505:   //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  9506:   //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  9507:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9508:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9509:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9510:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9511:   //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_110_sss_sss
  9512:   //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  9513:   //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  9514:   //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  9515:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9516:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9517:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9518:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9519:   //BLS.S <label>                                   |-|01----|-|--*-*|-----|          |0110_001_111_sss_sss
  9520:   //BNHI.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  9521:   //JBLS.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  9522:   //JBNHI.S <label>                                 |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  9523:   public static void irpBlss () throws M68kException {
  9524:     if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {  //Bcc.Sでジャンプ
  9525:       XEiJ.mpuCycleCount += 10;
  9526:       int t = XEiJ.regPC;  //pc0+2
  9527:       int s = (byte) XEiJ.regOC;  //オフセット
  9528:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9529:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9530:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9531:         //! 軽量化。リードを省略する
  9532:       } else {
  9533:         XEiJ.busRwse (t);  //pcws
  9534:       }
  9535:       irpSetPC (t + s);  //pc0+2+オフセット
  9536:     } else {  //Bcc.Sで通過
  9537:       XEiJ.mpuCycleCount += 8;
  9538:     }
  9539:   }  //irpBlss
  9540: 
  9541:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9542:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9543:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9544:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9545:   //BCC.W <label>                                   |-|012346|-|----*|-----|          |0110_010_000_000_000-{offset}
  9546:   //BHS.W <label>                                   |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9547:   //BNCS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9548:   //BNLO.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9549:   //JBCC.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9550:   //JBHS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9551:   //JBNCS.W <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9552:   //JBNLO.W <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9553:   //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)
  9554:   //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9555:   //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9556:   //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9557:   //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9558:   //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9559:   //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9560:   //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9561:   //JBCS.L <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9562:   //JBLO.L <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9563:   //JBNCC.L <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9564:   //JBNHS.L <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9565:   public static void irpBhssw () throws M68kException {
  9566:     if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9567:       XEiJ.mpuCycleCount += 10;
  9568:       int t = XEiJ.regPC;  //pc0+2
  9569:       int s = (byte) XEiJ.regOC;  //オフセット
  9570:       if (s == 0) {  //Bcc.Wでジャンプ
  9571:         XEiJ.regPC = t + 2;
  9572:         s = XEiJ.busRwse (t);  //pcws
  9573:       } else {  //Bcc.Sでジャンプ
  9574:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9575:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9576:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9577:           //! 軽量化。リードを省略する
  9578:         } else {
  9579:           XEiJ.busRwse (t);  //pcws
  9580:         }
  9581:       }
  9582:       irpSetPC (t + s);  //pc0+2+オフセット
  9583:     } else if (XEiJ.regOC == 0x6400) {  //Bcc.Wで通過
  9584:       XEiJ.mpuCycleCount += 12;
  9585:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9586:         //リードを省略する
  9587:       } else {
  9588:         XEiJ.busRws (XEiJ.regPC);
  9589:       }
  9590:       XEiJ.regPC += 2;
  9591:     } else {  //Bcc.Sで通過
  9592:       XEiJ.mpuCycleCount += 8;
  9593:     }
  9594:   }  //irpBhssw
  9595: 
  9596:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9597:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9598:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9599:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9600:   //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_001_sss_sss
  9601:   //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9602:   //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9603:   //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9604:   //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9605:   //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9606:   //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9607:   //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9608:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9609:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9610:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9611:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9612:   //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_010_sss_sss
  9613:   //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9614:   //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9615:   //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9616:   //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9617:   //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9618:   //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9619:   //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9620:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9621:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9622:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9623:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9624:   //BCC.S <label>                                   |-|01----|-|----*|-----|          |0110_010_011_sss_sss
  9625:   //BHS.S <label>                                   |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9626:   //BNCS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9627:   //BNLO.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9628:   //JBCC.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9629:   //JBHS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9630:   //JBNCS.S <label>                                 |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9631:   //JBNLO.S <label>                                 |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9632:   public static void irpBhss () throws M68kException {
  9633:     if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {  //Bcc.Sでジャンプ
  9634:       XEiJ.mpuCycleCount += 10;
  9635:       int t = XEiJ.regPC;  //pc0+2
  9636:       int s = (byte) XEiJ.regOC;  //オフセット
  9637:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9638:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9639:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9640:         //! 軽量化。リードを省略する
  9641:       } else {
  9642:         XEiJ.busRwse (t);  //pcws
  9643:       }
  9644:       irpSetPC (t + s);  //pc0+2+オフセット
  9645:     } else {  //Bcc.Sで通過
  9646:       XEiJ.mpuCycleCount += 8;
  9647:     }
  9648:   }  //irpBhss
  9649: 
  9650:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9651:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9652:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9653:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9654:   //BCS.W <label>                                   |-|012346|-|----*|-----|          |0110_010_100_000_000-{offset}
  9655:   //BLO.W <label>                                   |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9656:   //BNCC.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9657:   //BNHS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9658:   //JBCS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9659:   //JBLO.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9660:   //JBNCC.W <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9661:   //JBNHS.W <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9662:   //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)
  9663:   //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9664:   //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9665:   //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9666:   //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9667:   //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9668:   //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9669:   //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9670:   //JBCC.L <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9671:   //JBHS.L <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9672:   //JBNCS.L <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9673:   //JBNLO.L <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9674:   public static void irpBlosw () throws M68kException {
  9675:     if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9676:       XEiJ.mpuCycleCount += 10;
  9677:       int t = XEiJ.regPC;  //pc0+2
  9678:       int s = (byte) XEiJ.regOC;  //オフセット
  9679:       if (s == 0) {  //Bcc.Wでジャンプ
  9680:         XEiJ.regPC = t + 2;
  9681:         s = XEiJ.busRwse (t);  //pcws
  9682:       } else {  //Bcc.Sでジャンプ
  9683:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9684:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9685:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9686:           //! 軽量化。リードを省略する
  9687:         } else {
  9688:           XEiJ.busRwse (t);  //pcws
  9689:         }
  9690:       }
  9691:       irpSetPC (t + s);  //pc0+2+オフセット
  9692:     } else if (XEiJ.regOC == 0x6500) {  //Bcc.Wで通過
  9693:       XEiJ.mpuCycleCount += 12;
  9694:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9695:         //リードを省略する
  9696:       } else {
  9697:         XEiJ.busRws (XEiJ.regPC);
  9698:       }
  9699:       XEiJ.regPC += 2;
  9700:     } else {  //Bcc.Sで通過
  9701:       XEiJ.mpuCycleCount += 8;
  9702:     }
  9703:   }  //irpBlosw
  9704: 
  9705:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9706:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9707:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9708:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9709:   //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_101_sss_sss
  9710:   //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9711:   //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9712:   //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9713:   //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9714:   //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9715:   //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9716:   //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9717:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9718:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9719:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9720:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9721:   //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_110_sss_sss
  9722:   //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9723:   //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9724:   //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9725:   //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9726:   //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9727:   //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9728:   //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9729:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9730:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9731:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9732:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9733:   //BCS.S <label>                                   |-|01----|-|----*|-----|          |0110_010_111_sss_sss
  9734:   //BLO.S <label>                                   |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9735:   //BNCC.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9736:   //BNHS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9737:   //JBCS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9738:   //JBLO.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9739:   //JBNCC.S <label>                                 |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9740:   //JBNHS.S <label>                                 |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9741:   public static void irpBlos () throws M68kException {
  9742:     if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9743:       XEiJ.mpuCycleCount += 10;
  9744:       int t = XEiJ.regPC;  //pc0+2
  9745:       int s = (byte) XEiJ.regOC;  //オフセット
  9746:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9747:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9748:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9749:         //! 軽量化。リードを省略する
  9750:       } else {
  9751:         XEiJ.busRwse (t);  //pcws
  9752:       }
  9753:       irpSetPC (t + s);  //pc0+2+オフセット
  9754:     } else {  //Bcc.Sで通過
  9755:       XEiJ.mpuCycleCount += 8;
  9756:     }
  9757:   }  //irpBlos
  9758: 
  9759:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9760:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9761:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9762:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9763:   //BNE.W <label>                                   |-|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}
  9764:   //BNEQ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9765:   //BNZ.W <label>                                   |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9766:   //BNZE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9767:   //JBNE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9768:   //JBNEQ.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9769:   //JBNZ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9770:   //JBNZE.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9771:   //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)
  9772:   //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9773:   //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9774:   //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9775:   //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9776:   //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9777:   //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9778:   //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9779:   //JBEQ.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9780:   //JBNEQ.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9781:   //JBNNE.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9782:   //JBNNZ.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9783:   //JBNZ.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9784:   //JBNZE.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9785:   //JBZE.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9786:   public static void irpBnesw () throws M68kException {
  9787:     if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9788:       XEiJ.mpuCycleCount += 10;
  9789:       int t = XEiJ.regPC;  //pc0+2
  9790:       int s = (byte) XEiJ.regOC;  //オフセット
  9791:       if (s == 0) {  //Bcc.Wでジャンプ
  9792:         XEiJ.regPC = t + 2;
  9793:         s = XEiJ.busRwse (t);  //pcws
  9794:       } else {  //Bcc.Sでジャンプ
  9795:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9796:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9797:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9798:           //! 軽量化。リードを省略する
  9799:         } else {
  9800:           XEiJ.busRwse (t);  //pcws
  9801:         }
  9802:       }
  9803:       irpSetPC (t + s);  //pc0+2+オフセット
  9804:     } else if (XEiJ.regOC == 0x6600) {  //Bcc.Wで通過
  9805:       XEiJ.mpuCycleCount += 12;
  9806:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9807:         //リードを省略する
  9808:       } else {
  9809:         XEiJ.busRws (XEiJ.regPC);
  9810:       }
  9811:       XEiJ.regPC += 2;
  9812:     } else {  //Bcc.Sで通過
  9813:       XEiJ.mpuCycleCount += 8;
  9814:     }
  9815:   }  //irpBnesw
  9816: 
  9817:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9818:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9819:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9820:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9821:   //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_001_sss_sss
  9822:   //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9823:   //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9824:   //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9825:   //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9826:   //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9827:   //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9828:   //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9829:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9830:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9831:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9832:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9833:   //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_010_sss_sss
  9834:   //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9835:   //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9836:   //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9837:   //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9838:   //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9839:   //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9840:   //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9841:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9842:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9843:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9844:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9845:   //BNE.S <label>                                   |-|01----|-|--*--|-----|          |0110_011_011_sss_sss
  9846:   //BNEQ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9847:   //BNZ.S <label>                                   |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9848:   //BNZE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9849:   //JBNE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9850:   //JBNEQ.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9851:   //JBNZ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9852:   //JBNZE.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9853:   public static void irpBnes () throws M68kException {
  9854:     if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9855:       XEiJ.mpuCycleCount += 10;
  9856:       int t = XEiJ.regPC;  //pc0+2
  9857:       int s = (byte) XEiJ.regOC;  //オフセット
  9858:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9859:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9860:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9861:         //! 軽量化。リードを省略する
  9862:       } else {
  9863:         XEiJ.busRwse (t);  //pcws
  9864:       }
  9865:       irpSetPC (t + s);  //pc0+2+オフセット
  9866:     } else {  //Bcc.Sで通過
  9867:       XEiJ.mpuCycleCount += 8;
  9868:     }
  9869:   }  //irpBnes
  9870: 
  9871:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9872:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9873:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9874:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9875:   //BEQ.W <label>                                   |-|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}
  9876:   //BNNE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9877:   //BNNZ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9878:   //BZE.W <label>                                   |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9879:   //JBEQ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9880:   //JBNNE.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9881:   //JBNNZ.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9882:   //JBZE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9883:   //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)
  9884:   //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9885:   //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9886:   //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9887:   //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9888:   //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9889:   //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9890:   //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9891:   //JBNE.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_110-0100111011111001-{address}      [BEQ.S (*)+8;JMP <label>]
  9892:   public static void irpBeqsw () throws M68kException {
  9893:     if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9894:       XEiJ.mpuCycleCount += 10;
  9895:       int t = XEiJ.regPC;  //pc0+2
  9896:       int s = (byte) XEiJ.regOC;  //オフセット
  9897:       if (s == 0) {  //Bcc.Wでジャンプ
  9898:         XEiJ.regPC = t + 2;
  9899:         s = XEiJ.busRwse (t);  //pcws
  9900:       } else {  //Bcc.Sでジャンプ
  9901:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9902:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9903:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9904:           //! 軽量化。リードを省略する
  9905:         } else {
  9906:           XEiJ.busRwse (t);  //pcws
  9907:         }
  9908:       }
  9909:       irpSetPC (t + s);  //pc0+2+オフセット
  9910:     } else if (XEiJ.regOC == 0x6700) {  //Bcc.Wで通過
  9911:       XEiJ.mpuCycleCount += 12;
  9912:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9913:         //リードを省略する
  9914:       } else {
  9915:         XEiJ.busRws (XEiJ.regPC);
  9916:       }
  9917:       XEiJ.regPC += 2;
  9918:     } else {  //Bcc.Sで通過
  9919:       XEiJ.mpuCycleCount += 8;
  9920:     }
  9921:   }  //irpBeqsw
  9922: 
  9923:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9924:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9925:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9926:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9927:   //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_101_sss_sss
  9928:   //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9929:   //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9930:   //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9931:   //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9932:   //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9933:   //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9934:   //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9935:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9936:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9937:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9938:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9939:   //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_110_sss_sss
  9940:   //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9941:   //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9942:   //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9943:   //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9944:   //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9945:   //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9946:   //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9947:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9948:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9949:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9950:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9951:   //BEQ.S <label>                                   |-|01----|-|--*--|-----|          |0110_011_111_sss_sss
  9952:   //BNNE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9953:   //BNNZ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9954:   //BZE.S <label>                                   |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9955:   //JBEQ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9956:   //JBNNE.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9957:   //JBNNZ.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9958:   //JBZE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9959:   public static void irpBeqs () throws M68kException {
  9960:     if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9961:       XEiJ.mpuCycleCount += 10;
  9962:       int t = XEiJ.regPC;  //pc0+2
  9963:       int s = (byte) XEiJ.regOC;  //オフセット
  9964:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9965:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9966:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9967:         //! 軽量化。リードを省略する
  9968:       } else {
  9969:         XEiJ.busRwse (t);  //pcws
  9970:       }
  9971:       irpSetPC (t + s);  //pc0+2+オフセット
  9972:     } else {  //Bcc.Sで通過
  9973:       XEiJ.mpuCycleCount += 8;
  9974:     }
  9975:   }  //irpBeqs
  9976: 
  9977:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9978:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9979:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9980:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9981:   //BVC.W <label>                                   |-|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}
  9982:   //BNVS.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  9983:   //JBNVS.W <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  9984:   //JBVC.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  9985:   //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)
  9986:   //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  9987:   //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  9988:   //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  9989:   //JBNVC.L <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_000_110-0100111011111001-{address}      [BVC.S (*)+8;JMP <label>]
  9990:   //JBVS.L <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_110-0100111011111001-{address}      [BVC.S (*)+8;JMP <label>]
  9991:   public static void irpBvcsw () throws M68kException {
  9992:     if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9993:       XEiJ.mpuCycleCount += 10;
  9994:       int t = XEiJ.regPC;  //pc0+2
  9995:       int s = (byte) XEiJ.regOC;  //オフセット
  9996:       if (s == 0) {  //Bcc.Wでジャンプ
  9997:         XEiJ.regPC = t + 2;
  9998:         s = XEiJ.busRwse (t);  //pcws
  9999:       } else {  //Bcc.Sでジャンプ
 10000:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10001:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10002:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10003:           //! 軽量化。リードを省略する
 10004:         } else {
 10005:           XEiJ.busRwse (t);  //pcws
 10006:         }
 10007:       }
 10008:       irpSetPC (t + s);  //pc0+2+オフセット
 10009:     } else if (XEiJ.regOC == 0x6800) {  //Bcc.Wで通過
 10010:       XEiJ.mpuCycleCount += 12;
 10011:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10012:         //リードを省略する
 10013:       } else {
 10014:         XEiJ.busRws (XEiJ.regPC);
 10015:       }
 10016:       XEiJ.regPC += 2;
 10017:     } else {  //Bcc.Sで通過
 10018:       XEiJ.mpuCycleCount += 8;
 10019:     }
 10020:   }  //irpBvcsw
 10021: 
 10022:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10023:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10024:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10025:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10026:   //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_001_sss_sss
 10027:   //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
 10028:   //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
 10029:   //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
 10030:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10031:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10032:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10033:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10034:   //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_010_sss_sss
 10035:   //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
 10036:   //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
 10037:   //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
 10038:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10039:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10040:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10041:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10042:   //BVC.S <label>                                   |-|01----|-|---*-|-----|          |0110_100_011_sss_sss
 10043:   //BNVS.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
 10044:   //JBNVS.S <label>                                 |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
 10045:   //JBVC.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
 10046:   public static void irpBvcs () throws M68kException {
 10047:     if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10048:       XEiJ.mpuCycleCount += 10;
 10049:       int t = XEiJ.regPC;  //pc0+2
 10050:       int s = (byte) XEiJ.regOC;  //オフセット
 10051:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10052:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10053:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10054:         //! 軽量化。リードを省略する
 10055:       } else {
 10056:         XEiJ.busRwse (t);  //pcws
 10057:       }
 10058:       irpSetPC (t + s);  //pc0+2+オフセット
 10059:     } else {  //Bcc.Sで通過
 10060:       XEiJ.mpuCycleCount += 8;
 10061:     }
 10062:   }  //irpBvcs
 10063: 
 10064:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10065:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10066:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10067:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10068:   //BVS.W <label>                                   |-|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}
 10069:   //BNVC.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
 10070:   //JBNVC.W <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
 10071:   //JBVS.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
 10072:   //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)
 10073:   //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
 10074:   //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
 10075:   //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
 10076:   //JBNVS.L <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_000_110-0100111011111001-{address}      [BVS.S (*)+8;JMP <label>]
 10077:   //JBVC.L <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_110-0100111011111001-{address}      [BVS.S (*)+8;JMP <label>]
 10078:   public static void irpBvssw () throws M68kException {
 10079:     if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10080:       XEiJ.mpuCycleCount += 10;
 10081:       int t = XEiJ.regPC;  //pc0+2
 10082:       int s = (byte) XEiJ.regOC;  //オフセット
 10083:       if (s == 0) {  //Bcc.Wでジャンプ
 10084:         XEiJ.regPC = t + 2;
 10085:         s = XEiJ.busRwse (t);  //pcws
 10086:       } else {  //Bcc.Sでジャンプ
 10087:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10088:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10089:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10090:           //! 軽量化。リードを省略する
 10091:         } else {
 10092:           XEiJ.busRwse (t);  //pcws
 10093:         }
 10094:       }
 10095:       irpSetPC (t + s);  //pc0+2+オフセット
 10096:     } else if (XEiJ.regOC == 0x6900) {  //Bcc.Wで通過
 10097:       XEiJ.mpuCycleCount += 12;
 10098:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10099:         //リードを省略する
 10100:       } else {
 10101:         XEiJ.busRws (XEiJ.regPC);
 10102:       }
 10103:       XEiJ.regPC += 2;
 10104:     } else {  //Bcc.Sで通過
 10105:       XEiJ.mpuCycleCount += 8;
 10106:     }
 10107:   }  //irpBvssw
 10108: 
 10109:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10110:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10111:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10112:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10113:   //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_101_sss_sss
 10114:   //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
 10115:   //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
 10116:   //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
 10117:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10118:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10119:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10120:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10121:   //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_110_sss_sss
 10122:   //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
 10123:   //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
 10124:   //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
 10125:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10126:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10127:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10128:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10129:   //BVS.S <label>                                   |-|01----|-|---*-|-----|          |0110_100_111_sss_sss
 10130:   //BNVC.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
 10131:   //JBNVC.S <label>                                 |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
 10132:   //JBVS.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
 10133:   public static void irpBvss () throws M68kException {
 10134:     if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10135:       XEiJ.mpuCycleCount += 10;
 10136:       int t = XEiJ.regPC;  //pc0+2
 10137:       int s = (byte) XEiJ.regOC;  //オフセット
 10138:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10139:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10140:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10141:         //! 軽量化。リードを省略する
 10142:       } else {
 10143:         XEiJ.busRwse (t);  //pcws
 10144:       }
 10145:       irpSetPC (t + s);  //pc0+2+オフセット
 10146:     } else {  //Bcc.Sで通過
 10147:       XEiJ.mpuCycleCount += 8;
 10148:     }
 10149:   }  //irpBvss
 10150: 
 10151:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10152:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10153:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10154:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10155:   //BPL.W <label>                                   |-|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}
 10156:   //BNMI.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
 10157:   //JBNMI.W <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
 10158:   //JBPL.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
 10159:   //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)
 10160:   //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
 10161:   //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
 10162:   //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
 10163:   //JBMI.L <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_110-0100111011111001-{address}      [BPL.S (*)+8;JMP <label>]
 10164:   //JBNPL.L <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_000_110-0100111011111001-{address}      [BPL.S (*)+8;JMP <label>]
 10165:   public static void irpBplsw () throws M68kException {
 10166:     if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10167:       XEiJ.mpuCycleCount += 10;
 10168:       int t = XEiJ.regPC;  //pc0+2
 10169:       int s = (byte) XEiJ.regOC;  //オフセット
 10170:       if (s == 0) {  //Bcc.Wでジャンプ
 10171:         XEiJ.regPC = t + 2;
 10172:         s = XEiJ.busRwse (t);  //pcws
 10173:       } else {  //Bcc.Sでジャンプ
 10174:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10175:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10176:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10177:           //! 軽量化。リードを省略する
 10178:         } else {
 10179:           XEiJ.busRwse (t);  //pcws
 10180:         }
 10181:       }
 10182:       irpSetPC (t + s);  //pc0+2+オフセット
 10183:     } else if (XEiJ.regOC == 0x6a00) {  //Bcc.Wで通過
 10184:       XEiJ.mpuCycleCount += 12;
 10185:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10186:         //リードを省略する
 10187:       } else {
 10188:         XEiJ.busRws (XEiJ.regPC);
 10189:       }
 10190:       XEiJ.regPC += 2;
 10191:     } else {  //Bcc.Sで通過
 10192:       XEiJ.mpuCycleCount += 8;
 10193:     }
 10194:   }  //irpBplsw
 10195: 
 10196:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10197:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10198:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10199:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10200:   //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_001_sss_sss
 10201:   //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
 10202:   //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
 10203:   //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
 10204:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10205:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10206:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10207:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10208:   //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_010_sss_sss
 10209:   //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
 10210:   //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
 10211:   //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
 10212:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10213:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10214:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10215:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10216:   //BPL.S <label>                                   |-|01----|-|-*---|-----|          |0110_101_011_sss_sss
 10217:   //BNMI.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
 10218:   //JBNMI.S <label>                                 |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
 10219:   //JBPL.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
 10220:   public static void irpBpls () throws M68kException {
 10221:     if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10222:       XEiJ.mpuCycleCount += 10;
 10223:       int t = XEiJ.regPC;  //pc0+2
 10224:       int s = (byte) XEiJ.regOC;  //オフセット
 10225:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10226:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10227:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10228:         //! 軽量化。リードを省略する
 10229:       } else {
 10230:         XEiJ.busRwse (t);  //pcws
 10231:       }
 10232:       irpSetPC (t + s);  //pc0+2+オフセット
 10233:     } else {  //Bcc.Sで通過
 10234:       XEiJ.mpuCycleCount += 8;
 10235:     }
 10236:   }  //irpBpls
 10237: 
 10238:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10239:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10240:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10241:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10242:   //BMI.W <label>                                   |-|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}
 10243:   //BNPL.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
 10244:   //JBMI.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
 10245:   //JBNPL.W <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
 10246:   //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)
 10247:   //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
 10248:   //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
 10249:   //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
 10250:   //JBNMI.L <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_000_110-0100111011111001-{address}      [BMI.S (*)+8;JMP <label>]
 10251:   //JBPL.L <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_110-0100111011111001-{address}      [BMI.S (*)+8;JMP <label>]
 10252:   public static void irpBmisw () throws M68kException {
 10253:     if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10254:       XEiJ.mpuCycleCount += 10;
 10255:       int t = XEiJ.regPC;  //pc0+2
 10256:       int s = (byte) XEiJ.regOC;  //オフセット
 10257:       if (s == 0) {  //Bcc.Wでジャンプ
 10258:         XEiJ.regPC = t + 2;
 10259:         s = XEiJ.busRwse (t);  //pcws
 10260:       } else {  //Bcc.Sでジャンプ
 10261:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10262:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10263:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10264:           //! 軽量化。リードを省略する
 10265:         } else {
 10266:           XEiJ.busRwse (t);  //pcws
 10267:         }
 10268:       }
 10269:       irpSetPC (t + s);  //pc0+2+オフセット
 10270:     } else if (XEiJ.regOC == 0x6b00) {  //Bcc.Wで通過
 10271:       XEiJ.mpuCycleCount += 12;
 10272:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10273:         //リードを省略する
 10274:       } else {
 10275:         XEiJ.busRws (XEiJ.regPC);
 10276:       }
 10277:       XEiJ.regPC += 2;
 10278:     } else {  //Bcc.Sで通過
 10279:       XEiJ.mpuCycleCount += 8;
 10280:     }
 10281:   }  //irpBmisw
 10282: 
 10283:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10284:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10285:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10286:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10287:   //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_101_sss_sss
 10288:   //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
 10289:   //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
 10290:   //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
 10291:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10292:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10293:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10294:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10295:   //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_110_sss_sss
 10296:   //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
 10297:   //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
 10298:   //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
 10299:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10300:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10301:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10302:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10303:   //BMI.S <label>                                   |-|01----|-|-*---|-----|          |0110_101_111_sss_sss
 10304:   //BNPL.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
 10305:   //JBMI.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
 10306:   //JBNPL.S <label>                                 |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
 10307:   public static void irpBmis () throws M68kException {
 10308:     if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10309:       XEiJ.mpuCycleCount += 10;
 10310:       int t = XEiJ.regPC;  //pc0+2
 10311:       int s = (byte) XEiJ.regOC;  //オフセット
 10312:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10313:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10314:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10315:         //! 軽量化。リードを省略する
 10316:       } else {
 10317:         XEiJ.busRwse (t);  //pcws
 10318:       }
 10319:       irpSetPC (t + s);  //pc0+2+オフセット
 10320:     } else {  //Bcc.Sで通過
 10321:       XEiJ.mpuCycleCount += 8;
 10322:     }
 10323:   }  //irpBmis
 10324: 
 10325:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10326:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10327:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10328:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10329:   //BGE.W <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}
 10330:   //BNLT.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
 10331:   //JBGE.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
 10332:   //JBNLT.W <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
 10333:   //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)
 10334:   //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
 10335:   //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
 10336:   //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
 10337:   //JBLT.L <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_110-0100111011111001-{address}      [BGE.S (*)+8;JMP <label>]
 10338:   //JBNGE.L <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_000_110-0100111011111001-{address}      [BGE.S (*)+8;JMP <label>]
 10339:   public static void irpBgesw () throws M68kException {
 10340:     if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10341:       XEiJ.mpuCycleCount += 10;
 10342:       int t = XEiJ.regPC;  //pc0+2
 10343:       int s = (byte) XEiJ.regOC;  //オフセット
 10344:       if (s == 0) {  //Bcc.Wでジャンプ
 10345:         XEiJ.regPC = t + 2;
 10346:         s = XEiJ.busRwse (t);  //pcws
 10347:       } else {  //Bcc.Sでジャンプ
 10348:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10349:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10350:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10351:           //! 軽量化。リードを省略する
 10352:         } else {
 10353:           XEiJ.busRwse (t);  //pcws
 10354:         }
 10355:       }
 10356:       irpSetPC (t + s);  //pc0+2+オフセット
 10357:     } else if (XEiJ.regOC == 0x6c00) {  //Bcc.Wで通過
 10358:       XEiJ.mpuCycleCount += 12;
 10359:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10360:         //リードを省略する
 10361:       } else {
 10362:         XEiJ.busRws (XEiJ.regPC);
 10363:       }
 10364:       XEiJ.regPC += 2;
 10365:     } else {  //Bcc.Sで通過
 10366:       XEiJ.mpuCycleCount += 8;
 10367:     }
 10368:   }  //irpBgesw
 10369: 
 10370:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10371:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10372:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10373:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10374:   //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_001_sss_sss
 10375:   //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
 10376:   //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
 10377:   //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
 10378:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10379:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10380:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10381:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10382:   //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_010_sss_sss
 10383:   //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
 10384:   //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
 10385:   //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
 10386:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10387:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10388:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10389:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10390:   //BGE.S <label>                                   |-|01----|-|-*-*-|-----|          |0110_110_011_sss_sss
 10391:   //BNLT.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
 10392:   //JBGE.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
 10393:   //JBNLT.S <label>                                 |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
 10394:   public static void irpBges () throws M68kException {
 10395:     if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10396:       XEiJ.mpuCycleCount += 10;
 10397:       int t = XEiJ.regPC;  //pc0+2
 10398:       int s = (byte) XEiJ.regOC;  //オフセット
 10399:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10400:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10401:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10402:         //! 軽量化。リードを省略する
 10403:       } else {
 10404:         XEiJ.busRwse (t);  //pcws
 10405:       }
 10406:       irpSetPC (t + s);  //pc0+2+オフセット
 10407:     } else {  //Bcc.Sで通過
 10408:       XEiJ.mpuCycleCount += 8;
 10409:     }
 10410:   }  //irpBges
 10411: 
 10412:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10413:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10414:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10415:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10416:   //BLT.W <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}
 10417:   //BNGE.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
 10418:   //JBLT.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
 10419:   //JBNGE.W <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
 10420:   //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)
 10421:   //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
 10422:   //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
 10423:   //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
 10424:   //JBGE.L <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_110-0100111011111001-{address}      [BLT.S (*)+8;JMP <label>]
 10425:   //JBNLT.L <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_000_110-0100111011111001-{address}      [BLT.S (*)+8;JMP <label>]
 10426:   public static void irpBltsw () throws M68kException {
 10427:     if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10428:       XEiJ.mpuCycleCount += 10;
 10429:       int t = XEiJ.regPC;  //pc0+2
 10430:       int s = (byte) XEiJ.regOC;  //オフセット
 10431:       if (s == 0) {  //Bcc.Wでジャンプ
 10432:         XEiJ.regPC = t + 2;
 10433:         s = XEiJ.busRwse (t);  //pcws
 10434:       } else {  //Bcc.Sでジャンプ
 10435:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10436:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10437:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10438:           //! 軽量化。リードを省略する
 10439:         } else {
 10440:           XEiJ.busRwse (t);  //pcws
 10441:         }
 10442:       }
 10443:       irpSetPC (t + s);  //pc0+2+オフセット
 10444:     } else if (XEiJ.regOC == 0x6d00) {  //Bcc.Wで通過
 10445:       XEiJ.mpuCycleCount += 12;
 10446:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10447:         //リードを省略する
 10448:       } else {
 10449:         XEiJ.busRws (XEiJ.regPC);
 10450:       }
 10451:       XEiJ.regPC += 2;
 10452:     } else {  //Bcc.Sで通過
 10453:       XEiJ.mpuCycleCount += 8;
 10454:     }
 10455:   }  //irpBltsw
 10456: 
 10457:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10458:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10459:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10460:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10461:   //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_101_sss_sss
 10462:   //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
 10463:   //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
 10464:   //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
 10465:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10466:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10467:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10468:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10469:   //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_110_sss_sss
 10470:   //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
 10471:   //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
 10472:   //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
 10473:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10474:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10475:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10476:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10477:   //BLT.S <label>                                   |-|01----|-|-*-*-|-----|          |0110_110_111_sss_sss
 10478:   //BNGE.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
 10479:   //JBLT.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
 10480:   //JBNGE.S <label>                                 |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
 10481:   public static void irpBlts () throws M68kException {
 10482:     if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10483:       XEiJ.mpuCycleCount += 10;
 10484:       int t = XEiJ.regPC;  //pc0+2
 10485:       int s = (byte) XEiJ.regOC;  //オフセット
 10486:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10487:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10488:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10489:         //! 軽量化。リードを省略する
 10490:       } else {
 10491:         XEiJ.busRwse (t);  //pcws
 10492:       }
 10493:       irpSetPC (t + s);  //pc0+2+オフセット
 10494:     } else {  //Bcc.Sで通過
 10495:       XEiJ.mpuCycleCount += 8;
 10496:     }
 10497:   }  //irpBlts
 10498: 
 10499:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10500:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10501:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10502:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10503:   //BGT.W <label>                                   |-|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}
 10504:   //BNLE.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
 10505:   //JBGT.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
 10506:   //JBNLE.W <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
 10507:   //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)
 10508:   //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
 10509:   //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
 10510:   //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
 10511:   //JBLE.L <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_110-0100111011111001-{address}      [BGT.S (*)+8;JMP <label>]
 10512:   //JBNGT.L <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_000_110-0100111011111001-{address}      [BGT.S (*)+8;JMP <label>]
 10513:   public static void irpBgtsw () throws M68kException {
 10514:     if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10515:       XEiJ.mpuCycleCount += 10;
 10516:       int t = XEiJ.regPC;  //pc0+2
 10517:       int s = (byte) XEiJ.regOC;  //オフセット
 10518:       if (s == 0) {  //Bcc.Wでジャンプ
 10519:         XEiJ.regPC = t + 2;
 10520:         s = XEiJ.busRwse (t);  //pcws
 10521:       } else {  //Bcc.Sでジャンプ
 10522:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10523:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10524:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10525:           //! 軽量化。リードを省略する
 10526:         } else {
 10527:           XEiJ.busRwse (t);  //pcws
 10528:         }
 10529:       }
 10530:       irpSetPC (t + s);  //pc0+2+オフセット
 10531:     } else if (XEiJ.regOC == 0x6e00) {  //Bcc.Wで通過
 10532:       XEiJ.mpuCycleCount += 12;
 10533:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10534:         //リードを省略する
 10535:       } else {
 10536:         XEiJ.busRws (XEiJ.regPC);
 10537:       }
 10538:       XEiJ.regPC += 2;
 10539:     } else {  //Bcc.Sで通過
 10540:       XEiJ.mpuCycleCount += 8;
 10541:     }
 10542:   }  //irpBgtsw
 10543: 
 10544:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10545:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10546:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10547:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10548:   //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_001_sss_sss
 10549:   //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
 10550:   //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
 10551:   //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
 10552:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10553:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10554:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10555:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10556:   //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_010_sss_sss
 10557:   //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
 10558:   //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
 10559:   //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
 10560:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10561:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10562:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10563:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10564:   //BGT.S <label>                                   |-|01----|-|-***-|-----|          |0110_111_011_sss_sss
 10565:   //BNLE.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
 10566:   //JBGT.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
 10567:   //JBNLE.S <label>                                 |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
 10568:   public static void irpBgts () throws M68kException {
 10569:     if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10570:       XEiJ.mpuCycleCount += 10;
 10571:       int t = XEiJ.regPC;  //pc0+2
 10572:       int s = (byte) XEiJ.regOC;  //オフセット
 10573:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10574:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10575:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10576:         //! 軽量化。リードを省略する
 10577:       } else {
 10578:         XEiJ.busRwse (t);  //pcws
 10579:       }
 10580:       irpSetPC (t + s);  //pc0+2+オフセット
 10581:     } else {  //Bcc.Sで通過
 10582:       XEiJ.mpuCycleCount += 8;
 10583:     }
 10584:   }  //irpBgts
 10585: 
 10586:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10587:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10588:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10589:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10590:   //BLE.W <label>                                   |-|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}
 10591:   //BNGT.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
 10592:   //JBLE.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
 10593:   //JBNGT.W <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
 10594:   //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)
 10595:   //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
 10596:   //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
 10597:   //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
 10598:   //JBGT.L <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_110-0100111011111001-{address}      [BLE.S (*)+8;JMP <label>]
 10599:   //JBNLE.L <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_000_110-0100111011111001-{address}      [BLE.S (*)+8;JMP <label>]
 10600:   public static void irpBlesw () throws M68kException {
 10601:     if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10602:       XEiJ.mpuCycleCount += 10;
 10603:       int t = XEiJ.regPC;  //pc0+2
 10604:       int s = (byte) XEiJ.regOC;  //オフセット
 10605:       if (s == 0) {  //Bcc.Wでジャンプ
 10606:         XEiJ.regPC = t + 2;
 10607:         s = XEiJ.busRwse (t);  //pcws
 10608:       } else {  //Bcc.Sでジャンプ
 10609:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10610:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10611:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10612:           //! 軽量化。リードを省略する
 10613:         } else {
 10614:           XEiJ.busRwse (t);  //pcws
 10615:         }
 10616:       }
 10617:       irpSetPC (t + s);  //pc0+2+オフセット
 10618:     } else if (XEiJ.regOC == 0x6f00) {  //Bcc.Wで通過
 10619:       XEiJ.mpuCycleCount += 12;
 10620:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10621:         //リードを省略する
 10622:       } else {
 10623:         XEiJ.busRws (XEiJ.regPC);
 10624:       }
 10625:       XEiJ.regPC += 2;
 10626:     } else {  //Bcc.Sで通過
 10627:       XEiJ.mpuCycleCount += 8;
 10628:     }
 10629:   }  //irpBlesw
 10630: 
 10631:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10632:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10633:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10634:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10635:   //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_101_sss_sss
 10636:   //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
 10637:   //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
 10638:   //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
 10639:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10640:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10641:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10642:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10643:   //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_110_sss_sss
 10644:   //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
 10645:   //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
 10646:   //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
 10647:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10648:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10649:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10650:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10651:   //BLE.S <label>                                   |-|01----|-|-***-|-----|          |0110_111_111_sss_sss
 10652:   //BNGT.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
 10653:   //JBLE.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
 10654:   //JBNGT.S <label>                                 |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
 10655:   public static void irpBles () throws M68kException {
 10656:     if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10657:       XEiJ.mpuCycleCount += 10;
 10658:       int t = XEiJ.regPC;  //pc0+2
 10659:       int s = (byte) XEiJ.regOC;  //オフセット
 10660:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10661:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10662:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10663:         //! 軽量化。リードを省略する
 10664:       } else {
 10665:         XEiJ.busRwse (t);  //pcws
 10666:       }
 10667:       irpSetPC (t + s);  //pc0+2+オフセット
 10668:     } else {  //Bcc.Sで通過
 10669:       XEiJ.mpuCycleCount += 8;
 10670:     }
 10671:   }  //irpBles
 10672: 
 10673:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10674:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10675:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10676:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10677:   //IOCS <name>                                     |A|012346|-|UUUUU|UUUUU|          |0111_000_0dd_ddd_ddd-0100111001001111        [MOVEQ.L #<data>,D0;TRAP #15]
 10678:   //MOVEQ.L #<data>,Dq                              |-|012346|-|-UUUU|-**00|          |0111_qqq_0dd_ddd_ddd
 10679:   public static void irpMoveq () throws M68kException {
 10680:     XEiJ.mpuCycleCount += 4;
 10681:     int z;
 10682:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = (byte) XEiJ.regOC;
 10683:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 10684:   }  //irpMoveq
 10685: 
 10686:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10687:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10688:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10689:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10690:   //MVS.B <ea>,Dq                                   |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B)
 10691:   //
 10692:   //MVS.B <ea>,Dq
 10693:   //  バイトデータをロングに符号拡張してDqの全体を更新する
 10694:   public static void irpMvsByte () throws M68kException {
 10695:     XEiJ.mpuCycleCount += 4;
 10696:     int ea = XEiJ.regOC & 63;
 10697:     int z;
 10698:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
 10699:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 10700:   }  //irpMvsByte
 10701: 
 10702:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10703:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10704:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10705:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10706:   //MVS.W <ea>,Dq                                   |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B)
 10707:   //
 10708:   //MVS.W <ea>,Dq
 10709:   //  ワードデータをロングに符号拡張してDqの全体を更新する
 10710:   public static void irpMvsWord () throws M68kException {
 10711:     XEiJ.mpuCycleCount += 4;
 10712:     int ea = XEiJ.regOC & 63;
 10713:     int z;
 10714:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));
 10715:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 10716:   }  //irpMvsWord
 10717: 
 10718:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10719:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10720:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10721:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10722:   //MVZ.B <ea>,Dq                                   |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B)
 10723:   //
 10724:   //MVZ.B <ea>,Dq
 10725:   //  バイトデータをロングにゼロ拡張してDqの全体を更新する
 10726:   public static void irpMvzByte () throws M68kException {
 10727:     XEiJ.mpuCycleCount += 4;
 10728:     int ea = XEiJ.regOC & 63;
 10729:     int z;
 10730:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? 0xff & XEiJ.regRn[ea] : XEiJ.busRbz (efaAnyByte (ea));
 10731:     XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0);
 10732:   }  //irpMvzByte
 10733: 
 10734:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10735:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10736:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10737:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10738:   //MVZ.W <ea>,Dq                                   |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B)
 10739:   //
 10740:   //MVZ.W <ea>,Dq
 10741:   //  ワードデータをロングにゼロ拡張してDqの全体を更新する
 10742:   public static void irpMvzWord () throws M68kException {
 10743:     XEiJ.mpuCycleCount += 4;
 10744:     int ea = XEiJ.regOC & 63;
 10745:     int z;
 10746:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea));
 10747:     XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0);
 10748:   }  //irpMvzWord
 10749: 
 10750:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10751:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10752:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10753:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10754:   //OR.B <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr
 10755:   public static void irpOrToRegByte () throws M68kException {
 10756:     XEiJ.mpuCycleCount += 4;
 10757:     int ea = XEiJ.regOC & 63;
 10758:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= 255 & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))))];  //ccr_tst_byte。0拡張してからOR
 10759:   }  //irpOrToRegByte
 10760: 
 10761:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10762:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10763:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10764:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10765:   //OR.W <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr
 10766:   public static void irpOrToRegWord () throws M68kException {
 10767:     XEiJ.mpuCycleCount += 4;
 10768:     int ea = XEiJ.regOC & 63;
 10769:     int z = (short) (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)));  //0拡張してからOR
 10770:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 10771:   }  //irpOrToRegWord
 10772: 
 10773:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10774:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10775:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10776:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10777:   //OR.L <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr
 10778:   public static void irpOrToRegLong () throws M68kException {
 10779:     int ea = XEiJ.regOC & 63;
 10780:     int qqq = XEiJ.regOC >> 9 & 7;
 10781:     int z;
 10782:     if (ea < XEiJ.EA_AR) {  //OR.L Dr,Dq
 10783:       XEiJ.mpuCycleCount += 8;
 10784:       XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.regRn[ea];
 10785:     } else {  //OR.L <mem>,Dq
 10786:       XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 10787:       XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.busRls (efaAnyLong (ea));
 10788:     }
 10789:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 10790:   }  //irpOrToRegLong
 10791: 
 10792:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10793:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10794:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10795:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10796:   //DIVU.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr
 10797:   //
 10798:   //DIVU.W <ea>,Dq
 10799:   //  M68000PRMでDIVU.Wのオーバーフローの条件が16bit符号あり整数と書かれているのは16bit符号なし整数の間違い
 10800:   public static void irpDivuWord () throws M68kException {
 10801:     //  X  変化しない
 10802:     //  N  ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア
 10803:     //  Z  ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア
 10804:     //  V  ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア
 10805:     //  C  常にクリア
 10806:     int ea = XEiJ.regOC & 63;
 10807:     int qqq = XEiJ.regOC >> 9 & 7;
 10808:     int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea));  //除数
 10809:     int x = XEiJ.regRn[qqq];  //被除数
 10810:     XEiJ.mpuCycleCount += irpDivuCyclesModified (x, y);
 10811:     if (y == 0) {  //ゼロ除算
 10812:       //Dqは変化しない
 10813:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10814:                      (x < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは被除数が負のときセット、さもなくばクリア
 10815:                      (x >> 16 == 0 ? XEiJ.REG_CCR_Z : 0) |  //Zは被除数が$0000xxxxのときセット、さもなくばクリア
 10816:                      XEiJ.REG_CCR_V  //Vは常にセット
 10817:                      );  //Cは常にクリア
 10818:       M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO;
 10819:       throw M68kException.m6eSignal;
 10820:     }
 10821:     //無理にintで符号なし除算をやろうとするよりもdoubleにキャストしてから割ったほうが速い
 10822:     //  intの除算をdoubleの除算器で行うプロセッサならばなおさら
 10823:     //被除数を符号なし32ビットとみなすためlongを経由してdoubleに変換する
 10824:     //doubleからlongやintへのキャストは小数点以下が切り捨てられ、オーバーフローは表現できる絶対値最大の値になる
 10825:     //doubleから直接intに戻しているので0xffffffff/0x0001=0xffffffffが絶対値最大の0x7fffffffになってしまうが、
 10826:     //DIVU.Wではオーバーフローになることに変わりはないのでよいことにする
 10827:     //  符号なし32ビットの0xffffffffにしたいときは戻すときもlongを経由すればよい
 10828:     int z = (int) ((double) ((long) x & 0xffffffffL) / (double) y);  //商
 10829:     if (z >>> 16 != 0) {  //オーバーフローあり
 10830:       //Dqは変化しない
 10831:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10832:                      (x < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは被除数が負のときセット、さもなくばクリア
 10833:                      //Zは常にクリア
 10834:                      XEiJ.REG_CCR_V  //Vは常にセット
 10835:                      );  //Cは常にクリア
 10836:     } else {  //オーバーフローなし
 10837:       XEiJ.regRn[qqq] = x - y * z << 16 | z;  //余り<<16|商
 10838:       z = (short) z;
 10839:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10840:                      (z < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは商が負のときセット、さもなくばクリア
 10841:                      (z == 0 ? XEiJ.REG_CCR_Z : 0)  //Zは商が0のときセット、さもなくばクリア
 10842:                      //Vは常にクリア
 10843:                      );  //Cは常にクリア
 10844:     }  //if オーバーフローあり/オーバーフローなし
 10845:   }  //irpDivuWord
 10846: 
 10847:   //DIVUの実行時間
 10848:   //  以下に実効アドレスの時間を加える
 10849:   //    ゼロ除算のとき38
 10850:   //    オーバーフローのとき10
 10851:   //    正常終了のとき76+
 10852:   //      商のビット15~1について
 10853:   //        被除数のビット16が1で商が1のとき0
 10854:   //        被除数のビット16が0で商が1のとき2
 10855:   //        被除数のビット16が0で商が0のとき4
 10856:   //  補足
 10857:   //    商のビット0を計算に含めると最大140になりマニュアルと一致する
 10858:   //  参考
 10859:   //    https://www.atari-forum.com/viewtopic.php?t=6484
 10860:   public static int irpDivuCyclesModified (int x, int y) {
 10861:     y &= 0xffff;  //ゼロ拡張
 10862:     if (y == 0) {  //ゼロ除算
 10863:       return 38;
 10864:     }
 10865:     int r = x >>> 16;  //余り。符号なし右シフト
 10866:     if (y <= r) {  //オーバーフロー
 10867:       return 10;
 10868:     }
 10869:     int c = 76;
 10870:     for (int i = 15; 0 < i; i--) {  //ビット0を含まない
 10871:       r = r << 1 | ((x >> i) & 1);
 10872:       if (0x10000 <= r) {  //被除数のビット16が1で商が1
 10873:         r -= y;
 10874:       } else if (y <= r) {  //被除数のビット16が0で商が1
 10875:         r -= y;
 10876:         c += 2;
 10877:       } else {  //被除数のビット16が0で商が0
 10878:         c += 4;
 10879:       }
 10880:     }
 10881:     return c;
 10882:   }
 10883: 
 10884:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10885:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10886:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10887:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10888:   //SBCD.B Dr,Dq                                    |-|012346|-|UUUUU|*U*U*|          |1000_qqq_100_000_rrr
 10889:   //SBCD.B -(Ar),-(Aq)                              |-|012346|-|UUUUU|*U*U*|          |1000_qqq_100_001_rrr
 10890:   //OR.B Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_100_mmm_rrr
 10891:   public static void irpOrToMemByte () throws M68kException {
 10892:     int ea = XEiJ.regOC & 63;
 10893:     if (ea >= XEiJ.EA_MM) {  //OR.B Dq,<ea>
 10894:       XEiJ.mpuCycleCount += 8;
 10895:       int a = efaMltByte (ea);
 10896:       int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRbs (a);
 10897:       XEiJ.busWb (a, z);
 10898:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
 10899:     } else if (ea < XEiJ.EA_AR) {  //SBCD.B Dr,Dq
 10900:       int qqq = XEiJ.regOC >> 9 & 7;
 10901:       XEiJ.mpuCycleCount += 6;
 10902:       int x;
 10903:       XEiJ.regRn[qqq] = ~0xff & (x = XEiJ.regRn[qqq]) | irpSbcd (x, XEiJ.regRn[ea]);
 10904:     } else {  //SBCD.B -(Ar),-(Aq)
 10905:       XEiJ.mpuCycleCount += 18;
 10906:       int y = XEiJ.busRbz (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 10907:       int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (64 - 8)];
 10908:       XEiJ.busWb (a, irpSbcd (XEiJ.busRbz (a), y));
 10909:     }
 10910:   }  //irpOrToMemByte
 10911: 
 10912:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10913:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10914:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10915:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10916:   //OR.W Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_101_mmm_rrr
 10917:   public static void irpOrToMemWord () throws M68kException {
 10918:     XEiJ.mpuCycleCount += 8;
 10919:     int ea = XEiJ.regOC & 63;
 10920:     int a = efaMltWord (ea);
 10921:     int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRws (a);
 10922:     XEiJ.busWw (a, z);
 10923:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
 10924:   }  //irpOrToMemWord
 10925: 
 10926:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10927:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10928:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10929:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10930:   //OR.L Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_110_mmm_rrr
 10931:   public static void irpOrToMemLong () throws M68kException {
 10932:     XEiJ.mpuCycleCount += 12;
 10933:     int ea = XEiJ.regOC & 63;
 10934:     int a = efaMltLong (ea);
 10935:     int z;
 10936:     XEiJ.busWl (a, z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRls (a));
 10937:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 10938:   }  //irpOrToMemLong
 10939: 
 10940:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10941:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10942:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10943:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10944:   //DIVS.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr
 10945:   //
 10946:   //DIVS.W <ea>,Dq
 10947:   //  DIVSの余りの符号は被除数と一致
 10948:   //  M68000PRMでDIVS.Wのアドレッシングモードがデータ可変と書かれているのはデータの間違い
 10949:   public static void irpDivsWord () throws M68kException {
 10950:     //  X  変化しない
 10951:     //  N  ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア
 10952:     //  Z  ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア
 10953:     //  V  ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア
 10954:     //  C  常にクリア
 10955:     //divsの余りの符号は被除数と一致
 10956:     //Javaの除算演算子の挙動
 10957:     //   10 /  3 ==  3   10 %  3 ==  1   10 =  3 *  3 +  1
 10958:     //   10 / -3 == -3   10 % -3 ==  1   10 = -3 * -3 +  1
 10959:     //  -10 /  3 == -3  -10 %  3 == -1  -10 =  3 * -3 + -1
 10960:     //  -10 / -3 ==  3  -10 % -3 == -1  -10 = -3 *  3 + -1
 10961:     int ea = XEiJ.regOC & 63;
 10962:     int qqq = XEiJ.regOC >> 9 & 7;
 10963:     int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //除数
 10964:     int x = XEiJ.regRn[qqq];  //被除数
 10965:     XEiJ.mpuCycleCount += irpDivsCycles (x, y);
 10966:     if (y == 0) {  //ゼロ除算
 10967:       //Dqは変化しない
 10968:       //!!! MC68030はゼロ除算のときオペランド以外の要因でZとVが変化する。その要因がわからないとZとVを正確に再現することができない
 10969:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10970:                      //Nは常にクリア
 10971:                      XEiJ.REG_CCR_Z |  //Zは常にセット
 10972:                      (x == 0x00008000 ? ~XEiJ.regCCR & XEiJ.REG_CCR_V : (0 <= x && x != 0x7fffffff) || x == 0x80000000 ? XEiJ.REG_CCR_V : XEiJ.regCCR & XEiJ.REG_CCR_V)  //Vは被除数が$00008000のとき反転、被除数が$7fffffffを除く正または$80000000のときセット、さもなくば変化しない
 10973:                      );  //Cは常にクリア
 10974:       M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO;
 10975:       throw M68kException.m6eSignal;
 10976:     }
 10977:     int z = x / y;  //商
 10978:     if ((short) z != z) {  //オーバーフローあり
 10979:       //Dqは変化しない
 10980:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10981:                      (x == 0x80000000 || (z & 0xffff0080) == 0x00000080 || (z & 0xffff0080) == 0xffff0080 ? XEiJ.REG_CCR_N : 0) |  //Nは被除数が$80000000または商が$0000xxyyまたは$ffffxxyyでyyが負のときセット、さもなくばクリア
 10982:                      (z == 0x00008000 || (((z & 0xffff00ff) == 0x00000000 || (z & 0xffff00ff) == 0xffff0000) && (z & 0x0000ff00) != 0) ? XEiJ.REG_CCR_Z : 0) |  //Zは商が$00008000または商が$0000xxyyまたは$ffffxxyyでxxが0でなくてyyが0のときセット、さもなくばクリア
 10983:                      XEiJ.REG_CCR_V  //Vは常にセット
 10984:                      );  //Cは常にクリア
 10985:     } else {  //オーバーフローなし
 10986:       XEiJ.regRn[qqq] = x - y * z << 16 | (char) z;  //Dqは余り<<16|商&$ffff
 10987:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10988:                      (z < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは商が負のときセット、さもなくばクリア
 10989:                      (z == 0 ? XEiJ.REG_CCR_Z : 0)  //Zは商が0のときセット、さもなくばクリア
 10990:                      //Vは常にクリア
 10991:                      );  //Cは常にクリア
 10992:     }  //if オーバーフローあり/オーバーフローなし
 10993:   }  //irpDivsWord
 10994: 
 10995:   //DIVSの実行時間
 10996:   //  以下に実効アドレスの時間を加える
 10997:   //    ゼロ除算のとき38
 10998:   //    符号なしオーバーフローのとき
 10999:   //      被除数が正のとき16
 11000:   //      被除数が負のとき18
 11001:   //    正常終了または符号ありオーバーフローのとき
 11002:   //      被除数が正で除数が正のとき120+
 11003:   //      被除数が正で除数が負のとき122+
 11004:   //      被除数が負で除数が正のとき126+
 11005:   //      被除数が負で除数が負のとき124+
 11006:   //        符号なし商のビット15~1について
 11007:   //          符号なし商が1のとき0
 11008:   //          符号なし商が0のとき2
 11009:   //  補足
 11010:   //    符号なし商のビット0を計算に含めると最大158になりマニュアルと一致する
 11011:   //  参考
 11012:   //    https://www.atari-forum.com/viewtopic.php?t=6484
 11013:   public static int irpDivsCycles (int x, int y) {
 11014:     y = (short) y;  //符号拡張
 11015:     if (y == 0) {  //ゼロ除算
 11016:       return 38;
 11017:     }
 11018:     //符号あり除算だと0x80000000/0xffffffffが0x00000000になる環境があるので
 11019:     //符号なし除算を用いる。JavaはInteger.divideUnsigned
 11020:     //符号なし商に0x80000000が含まれることに注意
 11021:     int q = Integer.divideUnsigned ((x < 0 ? -x : x), (y < 0 ? -y : y));
 11022:     if ((q & 0xffff0000) != 0) {  //符号なしオーバーフロー。0xffff<qは不可
 11023:       return x < 0 ? 18 : 16;
 11024:     }
 11025:     int t = ~q;
 11026:     t = (t & 0x5554) + ((t >> 1) & 0x5555);  //0x5554に注意。ビット0を含まない
 11027:     t = (t & 0x3333) + ((t >> 2) & 0x3333);
 11028:     t = (t & 0x0F0F) + ((t >> 4) & 0x0F0F);
 11029:     t = (t & 0x00FF) + ((t >> 8) & 0x00FF);
 11030:     return (x < 0 ? y < 0 ? 124 : 126 : y < 0 ? 122 : 120) + (t << 1);
 11031:   }
 11032: 
 11033:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11034:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11035:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11036:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11037:   //SUB.B <ea>,Dq                                   |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr
 11038:   public static void irpSubToRegByte () throws M68kException {
 11039:     XEiJ.mpuCycleCount += 4;
 11040:     int ea = XEiJ.regOC & 63;
 11041:     int qqq = XEiJ.regOC >> 9 & 7;
 11042:     int x, y, z;
 11043:     y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
 11044:     x = XEiJ.regRn[qqq];
 11045:     z = x - y;
 11046:     XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 11047:     XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 11048:            ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11049:            (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_byte
 11050:   }  //irpSubToRegByte
 11051: 
 11052:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11053:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11054:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11055:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11056:   //SUB.W <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr
 11057:   public static void irpSubToRegWord () throws M68kException {
 11058:     XEiJ.mpuCycleCount += 4;
 11059:     int ea = XEiJ.regOC & 63;
 11060:     int qqq = XEiJ.regOC >> 9 & 7;
 11061:     int x, y, z;
 11062:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11063:     x = XEiJ.regRn[qqq];
 11064:     z = x - y;
 11065:     XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11066:     XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11067:            ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11068:            (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_word
 11069:   }  //irpSubToRegWord
 11070: 
 11071:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11072:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11073:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11074:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11075:   //SUB.L <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr
 11076:   public static void irpSubToRegLong () throws M68kException {
 11077:     int ea = XEiJ.regOC & 63;
 11078:     int qqq = XEiJ.regOC >> 9 & 7;
 11079:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 11080:     int x, y, z;
 11081:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11082:     x = XEiJ.regRn[qqq];
 11083:     z = x - y;
 11084:     XEiJ.regRn[qqq] = z;
 11085:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11086:            ((x ^ y) & (x ^ z)) >> 30 & XEiJ.REG_CCR_V |
 11087:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
 11088:   }  //irpSubToRegLong
 11089: 
 11090:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11091:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11092:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11093:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11094:   //SUBA.W <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr
 11095:   //SUB.W <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq]
 11096:   //CLR.W Ar                                        |A|012346|-|-----|-----| A        |1001_rrr_011_001_rrr [SUBA.W Ar,Ar]
 11097:   //
 11098:   //SUBA.W <ea>,Aq
 11099:   //  ソースを符号拡張してロングで減算する
 11100:   public static void irpSubaWord () throws M68kException {
 11101:     XEiJ.mpuCycleCount += 8;
 11102:     int ea = XEiJ.regOC & 63;
 11103:     int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11104:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z;  //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可
 11105:     //ccrは変化しない
 11106:   }  //irpSubaWord
 11107: 
 11108:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11109:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11110:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11111:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11112:   //SUBX.B Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_100_000_rrr
 11113:   //SUBX.B -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_100_001_rrr
 11114:   //SUB.B Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_100_mmm_rrr
 11115:   public static void irpSubToMemByte () throws M68kException {
 11116:     int ea = XEiJ.regOC & 63;
 11117:     int a, x, y, z;
 11118:     if (ea < XEiJ.EA_MM) {
 11119:       if (ea < XEiJ.EA_AR) {  //SUBX.B Dr,Dq
 11120:         int qqq = XEiJ.regOC >> 9 & 7;
 11121:         XEiJ.mpuCycleCount += 4;
 11122:         y = XEiJ.regRn[ea];
 11123:         x = XEiJ.regRn[qqq];
 11124:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11125:         XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 11126:       } else {  //SUBX.B -(Ar),-(Aq)
 11127:         XEiJ.mpuCycleCount += 18;
 11128:         y = XEiJ.busRbs (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 11129:         a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15];  //1qqq=aqq
 11130:         x = XEiJ.busRbs (a);
 11131:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11132:         XEiJ.busWb (a, z);
 11133:       }
 11134:       XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //SUBXはZをクリアすることはあるがセットすることはない
 11135:              ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11136:              (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subx_byte
 11137:     } else {  //SUB.B Dq,<ea>
 11138:       XEiJ.mpuCycleCount += 8;
 11139:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11140:       a = efaMltByte (ea);
 11141:       x = XEiJ.busRbs (a);
 11142:       z = x - y;
 11143:       XEiJ.busWb (a, z);
 11144:       XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 11145:              ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11146:              (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_byte
 11147:     }
 11148:   }  //irpSubToMemByte
 11149: 
 11150:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11151:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11152:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11153:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11154:   //SUBX.W Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_101_000_rrr
 11155:   //SUBX.W -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_101_001_rrr
 11156:   //SUB.W Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_101_mmm_rrr
 11157:   public static void irpSubToMemWord () throws M68kException {
 11158:     int ea = XEiJ.regOC & 63;
 11159:     int a, x, y, z;
 11160:     if (ea < XEiJ.EA_MM) {
 11161:       if (ea < XEiJ.EA_AR) {  //SUBX.W Dr,Dq
 11162:         int qqq = XEiJ.regOC >> 9 & 7;
 11163:         XEiJ.mpuCycleCount += 4;
 11164:         y = XEiJ.regRn[ea];
 11165:         x = XEiJ.regRn[qqq];
 11166:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11167:         XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11168:       } else {  //SUBX.W -(Ar),-(Aq)
 11169:         XEiJ.mpuCycleCount += 18;
 11170:         y = XEiJ.busRws (XEiJ.regRn[ea] -= 2);  //このr[ea]はアドレスレジスタ
 11171:         a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2;
 11172:         x = XEiJ.busRws (a);
 11173:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11174:         XEiJ.busWw (a, z);
 11175:       }
 11176:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //ADDXはZをクリアすることはあるがセットすることはない
 11177:              ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11178:              (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subx_word
 11179:     } else {  //SUB.W Dq,<ea>
 11180:       XEiJ.mpuCycleCount += 8;
 11181:       y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11182:       a = efaMltWord (ea);
 11183:       x = XEiJ.busRws (a);
 11184:       z = x - y;
 11185:       XEiJ.busWw (a, z);
 11186:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11187:              ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11188:              (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_word
 11189:     }
 11190:   }  //irpSubToMemWord
 11191: 
 11192:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11193:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11194:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11195:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11196:   //SUBX.L Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_110_000_rrr
 11197:   //SUBX.L -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_110_001_rrr
 11198:   //SUB.L Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_110_mmm_rrr
 11199:   public static void irpSubToMemLong () throws M68kException {
 11200:     int ea = XEiJ.regOC & 63;
 11201:     if (ea < XEiJ.EA_MM) {
 11202:       int x;
 11203:       int y;
 11204:       int z;
 11205:       if (ea < XEiJ.EA_AR) {  //SUBX.L Dr,Dq
 11206:         int qqq = XEiJ.regOC >> 9 & 7;
 11207:         XEiJ.mpuCycleCount += 8;
 11208:         XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) - (y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11209:       } else {  //SUBX.L -(Ar),-(Aq)
 11210:         XEiJ.mpuCycleCount += 30;
 11211:         y = XEiJ.busRls (XEiJ.regRn[ea] -= 4);  //このr[ea]はアドレスレジスタ
 11212:         int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4;
 11213:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y - (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
 11214:       }
 11215:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
 11216:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11217:              (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subx
 11218:     } else {  //SUB.L Dq,<ea>
 11219:       XEiJ.mpuCycleCount += 12;
 11220:       int a = efaMltLong (ea);
 11221:       int x;
 11222:       int y;
 11223:       int z;
 11224:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]));
 11225:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11226:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11227:              (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
 11228:     }
 11229:   }  //irpSubToMemLong
 11230: 
 11231:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11232:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11233:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11234:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11235:   //SUBA.L <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr
 11236:   //SUB.L <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq]
 11237:   //CLR.L Ar                                        |A|012346|-|-----|-----| A        |1001_rrr_111_001_rrr [SUBA.L Ar,Ar]
 11238:   public static void irpSubaLong () throws M68kException {
 11239:     int ea = XEiJ.regOC & 63;
 11240:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //Dr/Ar/#<data>のとき8+、それ以外は6+
 11241:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11242:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z;  //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可
 11243:     //ccrは変化しない
 11244:   }  //irpSubaLong
 11245: 
 11246:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11247:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11248:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11249:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11250:   //SXCALL <name>                                   |A|012346|-|UUUUU|*****|          |1010_0dd_ddd_ddd_ddd [ALINE #<data>]
 11251:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11252:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11253:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11254:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11255:   //ALINE #<data>                                   |-|012346|-|UUUUU|*****|          |1010_ddd_ddd_ddd_ddd (line 1010 emulator)
 11256:   public static void irpAline () throws M68kException {
 11257:     XEiJ.mpuCycleCount += 34;
 11258:     if (XEiJ.MPU_INLINE_EXCEPTION) {
 11259:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
 11260:       int sp = XEiJ.regRn[15];
 11261:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
 11262:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 11263:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 11264:         XEiJ.mpuUSP = sp;  //USPを保存
 11265:         sp = XEiJ.mpuISP;  //SSPを復元
 11266:         if (DataBreakPoint.DBP_ON) {
 11267:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 11268:         } else {
 11269:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 11270:         }
 11271:         if (InstructionBreakPoint.IBP_ON) {
 11272:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 11273:         }
 11274:       }
 11275:       int vectorOffset = M68kException.M6E_LINE_1010_EMULATOR << 2;  //vector offset
 11276:       XEiJ.regRn[15] = sp -= 8;  //short format
 11277:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 11278:       XEiJ.busWl (sp + 2, XEiJ.regPC0);  //program counter
 11279:       XEiJ.busWw (sp, save_sr);  //status register
 11280:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 11281:     } else {
 11282:       irpException (M68kException.M6E_LINE_1010_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは命令の先頭
 11283:     }
 11284:   }  //irpAline
 11285: 
 11286:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11287:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11288:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11289:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11290:   //CMP.B <ea>,Dq                                   |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr
 11291:   public static void irpCmpByte () throws M68kException {
 11292:     XEiJ.mpuCycleCount += 4;
 11293:     int ea = XEiJ.regOC & 63;
 11294:     int x;
 11295:     int y;
 11296:     int z = (byte) ((x = (byte) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))));
 11297:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11298:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11299:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11300:   }  //irpCmpByte
 11301: 
 11302:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11303:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11304:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11305:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11306:   //CMP.W <ea>,Dq                                   |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr
 11307:   public static void irpCmpWord () throws M68kException {
 11308:     XEiJ.mpuCycleCount += 4;
 11309:     int ea = XEiJ.regOC & 63;
 11310:     int x;
 11311:     int y;
 11312:     int z = (short) ((x = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea))));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11313:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11314:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11315:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11316:   }  //irpCmpWord
 11317: 
 11318:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11319:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11320:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11321:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11322:   //CMP.L <ea>,Dq                                   |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr
 11323:   public static void irpCmpLong () throws M68kException {
 11324:     XEiJ.mpuCycleCount += 6;
 11325:     int ea = XEiJ.regOC & 63;
 11326:     int x;
 11327:     int y;
 11328:     int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11329:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11330:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11331:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11332:   }  //irpCmpLong
 11333: 
 11334:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11335:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11336:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11337:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11338:   //CMPA.W <ea>,Aq                                  |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr
 11339:   //CMP.W <ea>,Aq                                   |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq]
 11340:   //
 11341:   //CMPA.W <ea>,Aq
 11342:   //  ソースを符号拡張してロングで比較する
 11343:   public static void irpCmpaWord () throws M68kException {
 11344:     XEiJ.mpuCycleCount += 6;
 11345:     int ea = XEiJ.regOC & 63;
 11346:     //ソースを符号拡張してからロングで比較する
 11347:     int y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11348:     int x;
 11349:     int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y;
 11350:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11351:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11352:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11353:   }  //irpCmpaWord
 11354: 
 11355:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11356:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11357:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11358:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11359:   //EOR.B Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_100_mmm_rrr
 11360:   //CMPM.B (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_100_001_rrr
 11361:   public static void irpEorByte () throws M68kException {
 11362:     int ea = XEiJ.regOC & 63;
 11363:     if (ea >> 3 == XEiJ.MMM_AR) {  //CMPM.B (Ar)+,(Aq)+
 11364:       XEiJ.mpuCycleCount += 12;
 11365:       int y = XEiJ.busRbs (XEiJ.regRn[ea]++);  //このr[ea]はアドレスレジスタ
 11366:       int x;
 11367:       int z = (byte) ((x = XEiJ.busRbs (XEiJ.regRn[XEiJ.regOC >> 9 & 15]++)) - y);
 11368:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11369:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11370:              (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11371:     } else {
 11372:       int qqq = XEiJ.regOC >> 9 & 7;
 11373:       int z;
 11374:       if (ea < XEiJ.EA_AR) {  //EOR.B Dq,Dr
 11375:         XEiJ.mpuCycleCount += 4;
 11376:         z = XEiJ.regRn[ea] ^= 255 & XEiJ.regRn[qqq];  //0拡張してからEOR
 11377:       } else {  //EOR.B Dq,<mem>
 11378:         XEiJ.mpuCycleCount += 8;
 11379:         int a = efaMltByte (ea);
 11380:         XEiJ.busWb (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRbs (a));
 11381:       }
 11382:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
 11383:     }
 11384:   }  //irpEorByte
 11385: 
 11386:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11387:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11388:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11389:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11390:   //EOR.W Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_101_mmm_rrr
 11391:   //CMPM.W (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_101_001_rrr
 11392:   public static void irpEorWord () throws M68kException {
 11393:     int ea = XEiJ.regOC & 63;
 11394:     int rrr = XEiJ.regOC & 7;
 11395:     int mmm = ea >> 3;
 11396:     if (mmm == XEiJ.MMM_AR) {  //CMPM.W (Ar)+,(Aq)+
 11397:       XEiJ.mpuCycleCount += 12;
 11398:       int y = XEiJ.busRws ((XEiJ.regRn[ea] += 2) - 2);  //このr[ea]はアドレスレジスタ
 11399:       int x;
 11400:       int z = (short) ((x = XEiJ.busRws ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2)) - y);
 11401:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11402:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11403:              (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11404:     } else {
 11405:       int qqq = XEiJ.regOC >> 9 & 7;
 11406:       int z;
 11407:       if (ea < XEiJ.EA_AR) {  //EOR.W Dq,Dr
 11408:         XEiJ.mpuCycleCount += 4;
 11409:         z = XEiJ.regRn[rrr] ^= (char) XEiJ.regRn[qqq];  //0拡張してからEOR
 11410:       } else {  //EOR.W Dq,<mem>
 11411:         XEiJ.mpuCycleCount += 8;
 11412:         int a = efaMltWord (ea);
 11413:         XEiJ.busWw (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRws (a));
 11414:       }
 11415:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
 11416:     }
 11417:   }  //irpEorWord
 11418: 
 11419:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11420:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11421:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11422:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11423:   //EOR.L Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_110_mmm_rrr
 11424:   //CMPM.L (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_110_001_rrr
 11425:   public static void irpEorLong () throws M68kException {
 11426:     int ea = XEiJ.regOC & 63;
 11427:     if (ea >> 3 == XEiJ.MMM_AR) {  //CMPM.L (Ar)+,(Aq)+
 11428:       XEiJ.mpuCycleCount += 20;
 11429:       int y = XEiJ.busRls ((XEiJ.regRn[ea] += 4) - 4);  //このr[ea]はアドレスレジスタ
 11430:       int x;
 11431:       int z = (x = XEiJ.busRls ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 4) - 4)) - y;
 11432:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11433:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11434:              (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11435:     } else {
 11436:       int qqq = XEiJ.regOC >> 9 & 7;
 11437:       int z;
 11438:       if (ea < XEiJ.EA_AR) {  //EOR.L Dq,Dr
 11439:         XEiJ.mpuCycleCount += 8;
 11440:         XEiJ.regRn[ea] = z = XEiJ.regRn[ea] ^ XEiJ.regRn[qqq];
 11441:       } else {  //EOR.L Dq,<mem>
 11442:         XEiJ.mpuCycleCount += 12;
 11443:         int a = efaMltLong (ea);
 11444:         XEiJ.busWl (a, z = XEiJ.busRls (a) ^ XEiJ.regRn[qqq]);
 11445:       }
 11446:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 11447:     }
 11448:   }  //irpEorLong
 11449: 
 11450:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11451:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11452:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11453:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11454:   //CMPA.L <ea>,Aq                                  |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr
 11455:   //CMP.L <ea>,Aq                                   |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq]
 11456:   public static void irpCmpaLong () throws M68kException {
 11457:     XEiJ.mpuCycleCount += 6;
 11458:     int ea = XEiJ.regOC & 63;
 11459:     int y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11460:     int x;
 11461:     int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y;
 11462:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) |
 11463:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11464:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11465:   }  //irpCmpaLong
 11466: 
 11467:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11468:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11469:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11470:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11471:   //AND.B <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr
 11472:   public static void irpAndToRegByte () throws M68kException {
 11473:     XEiJ.mpuCycleCount += 4;
 11474:     int ea = XEiJ.regOC & 63;
 11475:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~255 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))))];  //ccr_tst_byte。1拡張してからAND
 11476:   }  //irpAndToRegByte
 11477: 
 11478:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11479:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11480:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11481:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11482:   //AND.W <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr
 11483:   public static void irpAndToRegWord () throws M68kException {
 11484:     XEiJ.mpuCycleCount += 4;
 11485:     int ea = XEiJ.regOC & 63;
 11486:     int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~65535 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)));  //1拡張してからAND
 11487:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
 11488:   }  //irpAndToRegWord
 11489: 
 11490:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11491:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11492:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11493:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11494:   //AND.L <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr
 11495:   public static void irpAndToRegLong () throws M68kException {
 11496:     int ea = XEiJ.regOC & 63;
 11497:     int qqq = XEiJ.regOC >> 9 & 7;
 11498:     int z;
 11499:     if (ea < XEiJ.EA_AR) {  //AND.L Dr,Dq
 11500:       XEiJ.mpuCycleCount += 8;
 11501:       z = XEiJ.regRn[qqq] &= XEiJ.regRn[ea];
 11502:     } else {  //AND.L <mem>,Dq
 11503:       XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 11504:       z = XEiJ.regRn[qqq] &= XEiJ.busRls (efaAnyLong (ea));
 11505:     }
 11506:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 11507:   }  //irpAndToRegLong
 11508: 
 11509:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11510:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11511:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11512:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11513:   //MULU.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr
 11514:   public static void irpMuluWord () throws M68kException {
 11515:     int ea = XEiJ.regOC & 63;
 11516:     int qqq = XEiJ.regOC >> 9 & 7;
 11517:     int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea));
 11518:     //muluの所要サイクル数は38+2n
 11519:     //nはソースに含まれる1の数
 11520:     int s = y & 0x5555;
 11521:     s += y - s >> 1;
 11522:     int t = s & 0x3333;
 11523:     t += s - t >> 2;
 11524:     t += t >> 4;
 11525:     XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1);  //38+2n
 11526:     //XEiJ.mpuCycleCount += 38 + (Integer.bitCount (y) << 1);  //少し遅くなる
 11527:     int z;
 11528:     XEiJ.regRn[qqq] = z = (char) XEiJ.regRn[qqq] * y;  //積の下位32ビット。オーバーフローは無視
 11529:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 11530:   }  //irpMuluWord
 11531: 
 11532:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11533:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11534:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11535:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11536:   //ABCD.B Dr,Dq                                    |-|012346|-|UUUUU|*U*U*|          |1100_qqq_100_000_rrr
 11537:   //ABCD.B -(Ar),-(Aq)                              |-|012346|-|UUUUU|*U*U*|          |1100_qqq_100_001_rrr
 11538:   //AND.B Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_100_mmm_rrr
 11539:   public static void irpAndToMemByte () throws M68kException {
 11540:     int ea = XEiJ.regOC & 63;
 11541:     if (ea >= XEiJ.EA_MM) {  //AND.B Dq,<ea>
 11542:       XEiJ.mpuCycleCount += 8;
 11543:       int a = efaMltByte (ea);
 11544:       int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRbs (a);
 11545:       XEiJ.busWb (a, z);
 11546:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
 11547:     } else if (ea < XEiJ.EA_AR) {  //ABCD.B Dr,Dq
 11548:       int qqq = XEiJ.regOC >> 9 & 7;
 11549:       XEiJ.mpuCycleCount += 6;
 11550:       XEiJ.regRn[qqq] = ~0xff & XEiJ.regRn[qqq] | irpAbcd (XEiJ.regRn[qqq], XEiJ.regRn[ea]);
 11551:     } else {  //ABCD.B -(Ar),-(Aq)
 11552:       XEiJ.mpuCycleCount += 18;
 11553:       int y = XEiJ.busRbz (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 11554:       int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (96 - 8)];
 11555:       XEiJ.busWb (a, irpAbcd (XEiJ.busRbz (a), y));
 11556:     }
 11557:   }  //irpAndToMemByte
 11558: 
 11559:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11560:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11561:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11562:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11563:   //EXG.L Dq,Dr                                     |-|012346|-|-----|-----|          |1100_qqq_101_000_rrr
 11564:   //EXG.L Aq,Ar                                     |-|012346|-|-----|-----|          |1100_qqq_101_001_rrr
 11565:   //AND.W Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_101_mmm_rrr
 11566:   public static void irpAndToMemWord () throws M68kException {
 11567:     int ea = XEiJ.regOC & 63;
 11568:     if (ea < XEiJ.EA_MM) {  //EXG
 11569:       XEiJ.mpuCycleCount += 6;
 11570:       if (ea < XEiJ.EA_AR) {  //EXG.L Dq,Dr
 11571:         int qqq = XEiJ.regOC >> 9 & 7;
 11572:         int t = XEiJ.regRn[qqq];
 11573:         XEiJ.regRn[qqq] = XEiJ.regRn[ea];
 11574:         XEiJ.regRn[ea] = t;
 11575:       } else {  //EXG.L Aq,Ar
 11576:         int aqq = (XEiJ.regOC >> 9) - (96 - 8);
 11577:         int t = XEiJ.regRn[aqq];
 11578:         XEiJ.regRn[aqq] = XEiJ.regRn[ea];  //このr[ea]アドレスレジスタ
 11579:         XEiJ.regRn[ea] = t;  //このr[ea]はアドレスレジスタ
 11580:       }
 11581:     } else {  //AND.W Dq,<ea>
 11582:       XEiJ.mpuCycleCount += 8;
 11583:       int a = efaMltWord (ea);
 11584:       int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRws (a);
 11585:       XEiJ.busWw (a, z);
 11586:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0);  //ccr_tst_word
 11587:     }
 11588:   }  //irpAndToMemWord
 11589: 
 11590:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11591:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11592:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11593:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11594:   //EXG.L Dq,Ar                                     |-|012346|-|-----|-----|          |1100_qqq_110_001_rrr
 11595:   //AND.L Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_110_mmm_rrr
 11596:   public static void irpAndToMemLong () throws M68kException {
 11597:     int ea = XEiJ.regOC & 63;
 11598:     int qqq = XEiJ.regOC >> 9 & 7;
 11599:     if (ea >> 3 == XEiJ.MMM_AR) {  //EXG.L Dq,Ar
 11600:       XEiJ.mpuCycleCount += 6;
 11601:       int t = XEiJ.regRn[qqq];
 11602:       XEiJ.regRn[qqq] = XEiJ.regRn[ea];  //このr[ea]はアドレスレジスタ
 11603:       XEiJ.regRn[ea] = t;  //このr[ea]はアドレスレジスタ
 11604:     } else {  //AND.L Dq,<ea>
 11605:       XEiJ.mpuCycleCount += 12;
 11606:       int a = efaMltLong (ea);
 11607:       int z;
 11608:       XEiJ.busWl (a, z = XEiJ.busRls (a) & XEiJ.regRn[qqq]);
 11609:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 11610:     }
 11611:   }  //irpAndToMemLong
 11612: 
 11613:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11614:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11615:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11616:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11617:   //MULS.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr
 11618:   public static void irpMulsWord () throws M68kException {
 11619:     int ea = XEiJ.regOC & 63;
 11620:     int qqq = XEiJ.regOC >> 9 & 7;
 11621:     int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));
 11622:     int t = y << 1 ^ y;  //右側が1である0と右側が0または末尾である1は1、それ以外は0。ソースは符号拡張されているので上位16ビットはすべて0
 11623:     //mulsの所要サイクル数は38+2n
 11624:     //nはソースの末尾に0を付け加えた17ビットに含まれる10または01の数
 11625:     int s = t & 0x5555;
 11626:     s += t - s >> 1;
 11627:     t = s & 0x3333;
 11628:     t += s - t >> 2;
 11629:     t += t >> 4;
 11630:     XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1);  //38+2n
 11631:     int z;
 11632:     XEiJ.regRn[qqq] = z = (short) XEiJ.regRn[qqq] * y;  //積の下位32ビット。オーバーフローは無視
 11633:     XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X);  //ccr_tst
 11634:   }  //irpMulsWord
 11635: 
 11636:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11637:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11638:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11639:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11640:   //ADD.B <ea>,Dq                                   |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr
 11641:   public static void irpAddToRegByte () throws M68kException {
 11642:     XEiJ.mpuCycleCount += 4;
 11643:     int ea = XEiJ.regOC & 63;
 11644:     int qqq = XEiJ.regOC >> 9 & 7;
 11645:     int x, y, z;
 11646:     y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
 11647:     x = XEiJ.regRn[qqq];
 11648:     z = x + y;
 11649:     XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 11650:     XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 11651:            ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11652:            (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_byte
 11653:   }  //irpAddToRegByte
 11654: 
 11655:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11656:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11657:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11658:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11659:   //ADD.W <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr
 11660:   public static void irpAddToRegWord () throws M68kException {
 11661:     XEiJ.mpuCycleCount += 4;
 11662:     int ea = XEiJ.regOC & 63;
 11663:     int qqq = XEiJ.regOC >> 9 & 7;
 11664:     int x, y, z;
 11665:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11666:     x = XEiJ.regRn[qqq];
 11667:     z = x + y;
 11668:     XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11669:     XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11670:            ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11671:            (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_word
 11672:   }  //irpAddToRegWord
 11673: 
 11674:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11675:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11676:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11677:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11678:   //ADD.L <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr
 11679:   public static void irpAddToRegLong () throws M68kException {
 11680:     int ea = XEiJ.regOC & 63;
 11681:     int qqq = XEiJ.regOC >> 9 & 7;
 11682:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 11683:     int x, y, z;
 11684:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11685:     x = XEiJ.regRn[qqq];
 11686:     z = x + y;
 11687:     XEiJ.regRn[qqq] = z;
 11688:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11689:            ((x ^ z) & (y ^ z)) >> 30 & XEiJ.REG_CCR_V |
 11690:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
 11691:   }  //irpAddToRegLong
 11692: 
 11693:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11694:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11695:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11696:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11697:   //ADDA.W <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr
 11698:   //ADD.W <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq]
 11699:   //
 11700:   //ADDA.W <ea>,Aq
 11701:   //  ソースを符号拡張してロングで加算する
 11702:   public static void irpAddaWord () throws M68kException {
 11703:     XEiJ.mpuCycleCount += 8;
 11704:     int ea = XEiJ.regOC & 63;
 11705:     int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11706:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z;  //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可
 11707:     //ccrは変化しない
 11708:   }  //irpAddaWord
 11709: 
 11710:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11711:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11712:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11713:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11714:   //ADDX.B Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_100_000_rrr
 11715:   //ADDX.B -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_100_001_rrr
 11716:   //ADD.B Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_100_mmm_rrr
 11717:   public static void irpAddToMemByte () throws M68kException {
 11718:     int ea = XEiJ.regOC & 63;
 11719:     int a, x, y, z;
 11720:     if (ea < XEiJ.EA_MM) {
 11721:       if (ea < XEiJ.EA_AR) {  //ADDX.B Dr,Dq
 11722:         int qqq = XEiJ.regOC >> 9 & 7;
 11723:         XEiJ.mpuCycleCount += 4;
 11724:         y = XEiJ.regRn[ea];
 11725:         x = XEiJ.regRn[qqq];
 11726:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11727:         XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 11728:       } else {  //ADDX.B -(Ar),-(Aq)
 11729:         XEiJ.mpuCycleCount += 18;
 11730:         y = XEiJ.busRbs (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 11731:         a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15];  //1qqq=aqq
 11732:         x = XEiJ.busRbs (a);
 11733:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11734:         XEiJ.busWb (a, z);
 11735:       }
 11736:       XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //ADDXはZをクリアすることはあるがセットすることはない
 11737:              ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11738:              (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addx_byte
 11739:     } else {  //ADD.B Dq,<ea>
 11740:       XEiJ.mpuCycleCount += 8;
 11741:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11742:       a = efaMltByte (ea);
 11743:       x = XEiJ.busRbs (a);
 11744:       z = x + y;
 11745:       XEiJ.busWb (a, z);
 11746:       XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 11747:              ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11748:              (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_byte
 11749:     }
 11750:   }  //irpAddToMemByte
 11751: 
 11752:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11753:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11754:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11755:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11756:   //ADDX.W Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_101_000_rrr
 11757:   //ADDX.W -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_101_001_rrr
 11758:   //ADD.W Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_101_mmm_rrr
 11759:   public static void irpAddToMemWord () throws M68kException {
 11760:     int ea = XEiJ.regOC & 63;
 11761:     int a, x, y, z;
 11762:     if (ea < XEiJ.EA_MM) {
 11763:       if (ea < XEiJ.EA_AR) {  //ADDX.W Dr,Dq
 11764:         int qqq = XEiJ.regOC >> 9 & 7;
 11765:         XEiJ.mpuCycleCount += 4;
 11766:         y = XEiJ.regRn[ea];
 11767:         x = XEiJ.regRn[qqq];
 11768:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11769:         XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11770:       } else {  //ADDX.W -(Ar),-(Aq)
 11771:         XEiJ.mpuCycleCount += 18;
 11772:         y = XEiJ.busRws (XEiJ.regRn[ea] -= 2);  //このr[ea]はアドレスレジスタ
 11773:         a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2;
 11774:         x = XEiJ.busRws (a);
 11775:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11776:         XEiJ.busWw (a, z);
 11777:       }
 11778:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //ADDXはZをクリアすることはあるがセットすることはない
 11779:              ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11780:              (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addx_word
 11781:     } else {  //ADD.W Dq,<ea>
 11782:       XEiJ.mpuCycleCount += 8;
 11783:       a = efaMltWord (ea);
 11784:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11785:       x = XEiJ.busRws (a);
 11786:       z = x + y;
 11787:       XEiJ.busWw (a, z);
 11788:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11789:              ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11790:              (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_word
 11791:     }
 11792:   }  //irpAddToMemWord
 11793: 
 11794:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11795:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11796:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11797:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11798:   //ADDX.L Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_110_000_rrr
 11799:   //ADDX.L -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_110_001_rrr
 11800:   //ADD.L Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_110_mmm_rrr
 11801:   public static void irpAddToMemLong () throws M68kException {
 11802:     int ea = XEiJ.regOC & 63;
 11803:     if (ea < XEiJ.EA_MM) {
 11804:       int x;
 11805:       int y;
 11806:       int z;
 11807:       if (ea < XEiJ.EA_AR) {  //ADDX.L Dr,Dq
 11808:         int qqq = XEiJ.regOC >> 9 & 7;
 11809:         XEiJ.mpuCycleCount += 8;
 11810:         XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) + (y = XEiJ.regRn[ea]) + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11811:       } else {  //ADDX.L -(Ar),-(Aq)
 11812:         XEiJ.mpuCycleCount += 30;
 11813:         y = XEiJ.busRls (XEiJ.regRn[ea] -= 4);  //このr[ea]はアドレスレジスタ
 11814:         int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4;
 11815:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y + (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
 11816:       }
 11817:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
 11818:              ((x ^ z) & (y ^ z)) >>> 31 << 1 |
 11819:              ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addx
 11820:     } else {  //ADD.L Dq,<ea>
 11821:       XEiJ.mpuCycleCount += 12;
 11822:       int a = efaMltLong (ea);
 11823:       int x;
 11824:       int y;
 11825:       int z;
 11826:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]));
 11827:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11828:              ((x ^ z) & (y ^ z)) >>> 31 << 1 |
 11829:              ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
 11830:     }
 11831:   }  //irpAddToMemLong
 11832: 
 11833:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11834:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11835:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11836:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11837:   //ADDA.L <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr
 11838:   //ADD.L <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq]
 11839:   public static void irpAddaLong () throws M68kException {
 11840:     int ea = XEiJ.regOC & 63;
 11841:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //Dr/Ar/#<data>のとき8+、それ以外は6+
 11842:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11843:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z;  //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可
 11844:     //ccrは変化しない
 11845:   }  //irpAddaLong
 11846: 
 11847:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11848:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11849:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11850:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11851:   //ASR.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_000_000_rrr
 11852:   //LSR.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_000_001_rrr
 11853:   //ROXR.B #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_000_010_rrr
 11854:   //ROR.B #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_000_011_rrr
 11855:   //ASR.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_000_100_rrr
 11856:   //LSR.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_000_101_rrr
 11857:   //ROXR.B Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_000_110_rrr
 11858:   //ROR.B Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_000_111_rrr
 11859:   //ASR.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_000_000_rrr [ASR.B #1,Dr]
 11860:   //LSR.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_000_001_rrr [LSR.B #1,Dr]
 11861:   //ROXR.B Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_000_010_rrr [ROXR.B #1,Dr]
 11862:   //ROR.B Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_000_011_rrr [ROR.B #1,Dr]
 11863:   //
 11864:   //ASR.B #<data>,Dr
 11865:   //ASR.B Dq,Dr
 11866:   //  算術右シフトバイト
 11867:   //       ........................アイウエオカキク XNZVC
 11868:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 11869:   //     1 ........................アアイウエオカキ クア*0ク Z=アイウエオカキ==0
 11870:   //     2 ........................アアアイウエオカ キア*0キ Z=アイウエオカ==0
 11871:   //     3 ........................アアアアイウエオ カア*0カ Z=アイウエオ==0
 11872:   //     4 ........................アアアアアイウエ オア*0オ Z=アイウエ==0
 11873:   //     5 ........................アアアアアアイウ エア*0エ Z=アイウ==0
 11874:   //     6 ........................アアアアアアアイ ウア*0ウ Z=アイ==0
 11875:   //     7 ........................アアアアアアアア イア*0イ Z=ア==0
 11876:   //     8 ........................アアアアアアアア アア*0ア Z=ア==0
 11877:   //  CCR
 11878:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 11879:   //    N  結果の最上位ビット
 11880:   //    Z  結果が0のときセット。他はクリア
 11881:   //    V  常にクリア
 11882:   //    C  countが0のときクリア。他は最後に押し出されたビット
 11883:   //
 11884:   //LSR.B #<data>,Dr
 11885:   //LSR.B Dq,Dr
 11886:   //  論理右シフトバイト
 11887:   //       ........................アイウエオカキク XNZVC
 11888:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 11889:   //     1 ........................0アイウエオカキ ク0*0ク Z=アイウエオカキ==0
 11890:   //     2 ........................00アイウエオカ キ0*0キ Z=アイウエオカ==0
 11891:   //     3 ........................000アイウエオ カ0*0カ Z=アイウエオ==0
 11892:   //     4 ........................0000アイウエ オ0*0オ Z=アイウエ==0
 11893:   //     5 ........................00000アイウ エ0*0エ Z=アイウ==0
 11894:   //     6 ........................000000アイ ウ0*0ウ Z=アイ==0
 11895:   //     7 ........................0000000ア イ0*0イ Z=ア==0
 11896:   //     8 ........................00000000 ア010ア
 11897:   //     9 ........................00000000 00100
 11898:   //  CCR
 11899:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 11900:   //    N  結果の最上位ビット
 11901:   //    Z  結果が0のときセット。他はクリア
 11902:   //    V  常にクリア
 11903:   //    C  countが0のときクリア。他は最後に押し出されたビット
 11904:   //
 11905:   //ROR.B #<data>,Dr
 11906:   //ROR.B Dq,Dr
 11907:   //  右ローテートバイト
 11908:   //       ........................アイウエオカキク XNZVC
 11909:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 11910:   //     1 ........................クアイウエオカキ Xク*0ク Z=アイウエオカキク==0
 11911:   //     :
 11912:   //     7 ........................イウエオカキクア Xイ*0イ Z=アイウエオカキク==0
 11913:   //     8 ........................アイウエオカキク Xア*0ア Z=アイウエオカキク==0
 11914:   //  CCR
 11915:   //    X  常に変化しない
 11916:   //    N  結果の最上位ビット
 11917:   //    Z  結果が0のときセット。他はクリア
 11918:   //    V  常にクリア
 11919:   //    C  countが0のときクリア。他は結果の最上位ビット
 11920:   //
 11921:   //ROXR.B #<data>,Dr
 11922:   //ROXR.B Dq,Dr
 11923:   //  拡張右ローテートバイト
 11924:   //       ........................アイウエオカキク XNZVC
 11925:   //     0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 11926:   //     1 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0
 11927:   //     2 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0
 11928:   //     3 ........................キクXアイウエオ カキ*0カ Z=アイウエオキクX==0
 11929:   //     4 ........................カキクXアイウエ オカ*0オ Z=アイウエカキクX==0
 11930:   //     5 ........................オカキクXアイウ エオ*0エ Z=アイウオカキクX==0
 11931:   //     6 ........................エオカキクXアイ ウエ*0ウ Z=アイエオカキクX==0
 11932:   //     7 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0
 11933:   //     8 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0
 11934:   //     9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 11935:   //  CCR
 11936:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 11937:   //    N  結果の最上位ビット
 11938:   //    Z  結果が0のときセット。他はクリア
 11939:   //    V  常にクリア
 11940:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 11941:   public static void irpXxrToRegByte () throws M68kException {
 11942:     int rrr;
 11943:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 11944:     int y;
 11945:     int z;
 11946:     int t;
 11947:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 11948:     case 0b000_000 >> 3:  //ASR.B #<data>,Dr
 11949:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11950:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> y) >> 1);
 11951:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11952:       break;
 11953:     case 0b001_000 >> 3:  //LSR.B #<data>,Dr
 11954:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11955:       XEiJ.regRn[rrr] = ~0xff & x | (z = (t = (0xff & x) >>> y) >>> 1);
 11956:       XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11957:       break;
 11958:     case 0b010_000 >> 3:  //ROXR.B #<data>,Dr
 11959:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11960:       z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1;
 11961:       if (y == 1 - 1) {  //y=data-1=1-1
 11962:         t = x;
 11963:       } else {  //y=data-1=2-1~8-1
 11964:         z = x << 9 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1;
 11965:       }
 11966:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 11967:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11968:       break;
 11969:     case 0b011_000 >> 3:  //ROR.B #<data>,Dr
 11970:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11971:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 7 - y | (0xff & x) >>> y + 1));
 11972:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 7 & 1;  //Xは変化しない。Cは結果の最上位ビット
 11973:       break;
 11974:     case 0b100_000 >> 3:  //ASR.B Dq,Dr
 11975:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 11976:       XEiJ.mpuCycleCount += 6 + (y << 1);
 11977:       if (y == 0) {  //y=data=0
 11978:         z = (byte) x;
 11979:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 11980:       } else {  //y=data=1~63
 11981:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> (y <= 8 ? y - 1 : 7)) >> 1);
 11982:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11983:       }
 11984:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 11985:       break;
 11986:     case 0b101_000 >> 3:  //LSR.B Dq,Dr
 11987:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 11988:       XEiJ.mpuCycleCount += 6 + (y << 1);
 11989:       if (y == 0) {  //y=data=0
 11990:         z = (byte) x;
 11991:         XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0);  //Xは変化しない。Cはクリア
 11992:       } else {  //y=data=1~63
 11993:         XEiJ.regRn[rrr] = ~0xff & x | (z = (t = y <= 8 ? (0xff & x) >>> y - 1 : 0) >>> 1);
 11994:         XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11995:       }
 11996:       break;
 11997:     case 0b110_000 >> 3:  //ROXR.B Dq,Dr
 11998:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 11999:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12000:       //y %= 9;
 12001:       y = (y & 7) - (y >> 3);  //y=data=-7~7
 12002:       y += y >> 3 & 9;  //y=data=0~8
 12003:       if (y == 0) {  //y=data=0
 12004:         z = (byte) x;
 12005:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12006:       } else {  //y=data=1~8
 12007:         z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1;
 12008:         if (y == 1) {  //y=data=1
 12009:           t = x;  //Cは最後に押し出されたビット
 12010:         } else {  //y=data=2~8
 12011:           z = x << 9 - y | (t = z >>> y - 2) >>> 1;
 12012:         }
 12013:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 12014:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12015:       }
 12016:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12017:       break;
 12018:     case 0b111_000 >> 3:  //ROR.B Dq,Dr
 12019:     default:
 12020:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12021:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12022:       if (y == 0) {
 12023:         z = (byte) x;
 12024:         t = 0;  //Cはクリア
 12025:       } else {
 12026:         y &= 7;  //y=data=0~7
 12027:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 8 - y | (0xff & x) >>> y));
 12028:         t = z >>> 7 & 1;  //Cは結果の最上位ビット
 12029:       }
 12030:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t;  //Xは変化しない
 12031:     }
 12032:   }  //irpXxrToRegByte
 12033: 
 12034:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12035:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12036:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12037:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12038:   //ASR.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_001_000_rrr
 12039:   //LSR.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_001_001_rrr
 12040:   //ROXR.W #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_001_010_rrr
 12041:   //ROR.W #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_001_011_rrr
 12042:   //ASR.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_001_100_rrr
 12043:   //LSR.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_001_101_rrr
 12044:   //ROXR.W Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_001_110_rrr
 12045:   //ROR.W Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_001_111_rrr
 12046:   //ASR.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_001_000_rrr [ASR.W #1,Dr]
 12047:   //LSR.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_001_001_rrr [LSR.W #1,Dr]
 12048:   //ROXR.W Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_001_010_rrr [ROXR.W #1,Dr]
 12049:   //ROR.W Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_001_011_rrr [ROR.W #1,Dr]
 12050:   //
 12051:   //ASR.W #<data>,Dr
 12052:   //ASR.W Dq,Dr
 12053:   //ASR.W <ea>
 12054:   //  算術右シフトワード
 12055:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12056:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12057:   //     1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0
 12058:   //     :
 12059:   //    15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0
 12060:   //    16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0
 12061:   //  CCR
 12062:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12063:   //    N  結果の最上位ビット
 12064:   //    Z  結果が0のときセット。他はクリア
 12065:   //    V  常にクリア
 12066:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12067:   //
 12068:   //LSR.W #<data>,Dr
 12069:   //LSR.W Dq,Dr
 12070:   //LSR.W <ea>
 12071:   //  論理右シフトワード
 12072:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12073:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12074:   //     1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0
 12075:   //     :
 12076:   //    15 ................000000000000000ア イ0*0イ Z=ア==0
 12077:   //    16 ................0000000000000000 ア010ア
 12078:   //    17 ................0000000000000000 00100
 12079:   //  CCR
 12080:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12081:   //    N  結果の最上位ビット
 12082:   //    Z  結果が0のときセット。他はクリア
 12083:   //    V  常にクリア
 12084:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12085:   //
 12086:   //ROR.W #<data>,Dr
 12087:   //ROR.W Dq,Dr
 12088:   //ROR.W <ea>
 12089:   //  右ローテートワード
 12090:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12091:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12092:   //     1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0
 12093:   //     :
 12094:   //    15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0
 12095:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0
 12096:   //  CCR
 12097:   //    X  常に変化しない
 12098:   //    N  結果の最上位ビット
 12099:   //    Z  結果が0のときセット。他はクリア
 12100:   //    V  常にクリア
 12101:   //    C  countが0のときクリア。他は結果の最上位ビット
 12102:   //
 12103:   //ROXR.W #<data>,Dr
 12104:   //ROXR.W Dq,Dr
 12105:   //ROXR.W <ea>
 12106:   //  拡張右ローテートワード
 12107:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12108:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12109:   //     1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 12110:   //     2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 12111:   //     :
 12112:   //    15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 12113:   //    16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 12114:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12115:   //  CCR
 12116:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12117:   //    N  結果の最上位ビット
 12118:   //    Z  結果が0のときセット。他はクリア
 12119:   //    V  常にクリア
 12120:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12121:   public static void irpXxrToRegWord () throws M68kException {
 12122:     int rrr;
 12123:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12124:     int y;
 12125:     int z;
 12126:     int t;
 12127:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12128:     case 0b000_000 >> 3:  //ASR.W #<data>,Dr
 12129:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12130:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> y) >> 1);
 12131:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12132:       break;
 12133:     case 0b001_000 >> 3:  //LSR.W #<data>,Dr
 12134:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12135:       XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = (char) x >>> y) >>> 1);
 12136:       XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12137:       break;
 12138:     case 0b010_000 >> 3:  //ROXR.W #<data>,Dr
 12139:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12140:       z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1;
 12141:       if (y == 1 - 1) {  //y=data-1=1-1
 12142:         t = x;
 12143:       } else {  //y=data-1=2-1~8-1
 12144:         z = x << 17 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1;
 12145:       }
 12146:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12147:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12148:       break;
 12149:     case 0b011_000 >> 3:  //ROR.W #<data>,Dr
 12150:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12151:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - 1 - y | (char) x >>> y + 1));
 12152:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 15 & 1;  //Xは変化しない。Cは結果の最上位ビット
 12153:       break;
 12154:     case 0b100_000 >> 3:  //ASR.W Dq,Dr
 12155:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12156:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12157:       if (y == 0) {  //y=data=0
 12158:         z = (short) x;
 12159:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12160:       } else {  //y=data=1~63
 12161:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> (y <= 16 ? y - 1 : 15)) >> 1);
 12162:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12163:       }
 12164:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12165:       break;
 12166:     case 0b101_000 >> 3:  //LSR.W Dq,Dr
 12167:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12168:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12169:       if (y == 0) {  //y=data=0
 12170:         z = (short) x;
 12171:         XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0);  //Xは変化しない。Cはクリア
 12172:       } else {  //y=data=1~63
 12173:         XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = y <= 16 ? (char) x >>> y - 1 : 0) >>> 1);
 12174:         XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12175:       }
 12176:       break;
 12177:     case 0b110_000 >> 3:  //ROXR.W Dq,Dr
 12178:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12179:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12180:       //y %= 17;
 12181:       y = (y & 15) - (y >> 4);  //y=data=-3~15
 12182:       y += y >> 4 & 17;  //y=data=0~16
 12183:       if (y == 0) {  //y=data=0
 12184:         z = (short) x;
 12185:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12186:       } else {  //y=data=1~16
 12187:         z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1;
 12188:         if (y == 1) {  //y=data=1
 12189:           t = x;  //Cは最後に押し出されたビット
 12190:         } else {  //y=data=2~16
 12191:           z = x << 17 - y | (t = z >>> y - 2) >>> 1;
 12192:         }
 12193:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12194:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12195:       }
 12196:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12197:       break;
 12198:     case 0b111_000 >> 3:  //ROR.W Dq,Dr
 12199:     default:
 12200:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12201:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12202:       if (y == 0) {
 12203:         z = (short) x;
 12204:         t = 0;  //Cはクリア
 12205:       } else {
 12206:         y &= 15;  //y=data=0~15
 12207:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - y | (char) x >>> y));
 12208:         t = z >>> 15 & 1;  //Cは結果の最上位ビット
 12209:       }
 12210:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t;  //Xは変化しない
 12211:     }
 12212:   }  //irpXxrToRegWord
 12213: 
 12214:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12215:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12216:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12217:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12218:   //ASR.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_010_000_rrr
 12219:   //LSR.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_010_001_rrr
 12220:   //ROXR.L #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_010_010_rrr
 12221:   //ROR.L #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_010_011_rrr
 12222:   //ASR.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_010_100_rrr
 12223:   //LSR.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_010_101_rrr
 12224:   //ROXR.L Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_010_110_rrr
 12225:   //ROR.L Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_010_111_rrr
 12226:   //ASR.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_010_000_rrr [ASR.L #1,Dr]
 12227:   //LSR.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_010_001_rrr [LSR.L #1,Dr]
 12228:   //ROXR.L Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_010_010_rrr [ROXR.L #1,Dr]
 12229:   //ROR.L Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_010_011_rrr [ROR.L #1,Dr]
 12230:   //
 12231:   //ASR.L #<data>,Dr
 12232:   //ASR.L Dq,Dr
 12233:   //  算術右シフトロング
 12234:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12235:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12236:   //     1 アアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0
 12237:   //     :
 12238:   //    31 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア イア*0イ Z=ア==0
 12239:   //    32 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア アア*0ア Z=ア==0
 12240:   //  CCR
 12241:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12242:   //    N  結果の最上位ビット
 12243:   //    Z  結果が0のときセット。他はクリア
 12244:   //    V  常にクリア
 12245:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12246:   //
 12247:   //LSR.L #<data>,Dr
 12248:   //LSR.L Dq,Dr
 12249:   //  論理右シフトロング
 12250:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12251:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12252:   //     1 0アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミ0*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0
 12253:   //     :
 12254:   //    31 0000000000000000000000000000000ア イ0*0イ Z=ア==0
 12255:   //    32 00000000000000000000000000000000 ア010ア
 12256:   //    33 00000000000000000000000000000000 00100
 12257:   //  CCR
 12258:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12259:   //    N  結果の最上位ビット
 12260:   //    Z  結果が0のときセット。他はクリア
 12261:   //    V  常にクリア
 12262:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12263:   //
 12264:   //ROR.L #<data>,Dr
 12265:   //ROR.L Dq,Dr
 12266:   //  右ローテートロング
 12267:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12268:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12269:   //     1 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12270:   //     :
 12271:   //    31 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0イ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12272:   //    32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12273:   //  CCR
 12274:   //    X  常に変化しない
 12275:   //    N  結果の最上位ビット
 12276:   //    Z  結果が0のときセット。他はクリア
 12277:   //    V  常にクリア
 12278:   //    C  countが0のときクリア。他は結果の最上位ビット
 12279:   //
 12280:   //ROXR.L #<data>,Dr
 12281:   //ROXR.L Dq,Dr
 12282:   //  拡張右ローテートロング
 12283:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12284:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12285:   //     1 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0
 12286:   //     2 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0
 12287:   //     :
 12288:   //    31 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12289:   //    32 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12290:   //    33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12291:   //  CCR
 12292:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12293:   //    N  結果の最上位ビット
 12294:   //    Z  結果が0のときセット。他はクリア
 12295:   //    V  常にクリア
 12296:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12297:   public static void irpXxrToRegLong () throws M68kException {
 12298:     int rrr;
 12299:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12300:     int y;
 12301:     int z;
 12302:     int t;
 12303:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12304:     case 0b000_000 >> 3:  //ASR.L #<data>,Dr
 12305:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12306:       XEiJ.regRn[rrr] = z = (t = x >> y) >> 1;
 12307:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12308:       break;
 12309:     case 0b001_000 >> 3:  //LSR.L #<data>,Dr
 12310:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12311:       XEiJ.regRn[rrr] = z = (t = x >>> y) >>> 1;
 12312:       XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12313:       break;
 12314:     case 0b010_000 >> 3:  //ROXR.L #<data>,Dr
 12315:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12316:       z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1;
 12317:       if (y == 1 - 1) {  //y=data-1=1-1
 12318:         t = x;
 12319:       } else {  //y=data-1=2-1~8-1
 12320:         z = x << -y | (t = z >>> y - (2 - 1)) >>> 1;  //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略
 12321:       }
 12322:       XEiJ.regRn[rrr] = z;
 12323:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12324:       break;
 12325:     case 0b011_000 >> 3:  //ROR.L #<data>,Dr
 12326:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12327:       XEiJ.regRn[rrr] = z = x << ~y | x >>> y + 1;  //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略
 12328:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 31;  //Xは変化しない。Cは結果の最上位ビット
 12329:       break;
 12330:     case 0b100_000 >> 3:  //ASR.L Dq,Dr
 12331:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12332:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12333:       if (y == 0) {  //y=data=0
 12334:         z = x;
 12335:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12336:       } else {  //y=data=1~63
 12337:         XEiJ.regRn[rrr] = z = (t = x >> (y <= 32 ? y - 1 : 31)) >> 1;
 12338:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12339:       }
 12340:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12341:       break;
 12342:     case 0b101_000 >> 3:  //LSR.L Dq,Dr
 12343:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12344:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12345:       if (y == 0) {  //y=data=0
 12346:         z = x;
 12347:         XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0);  //Xは変化しない。Cはクリア
 12348:       } else {  //y=data=1~63
 12349:         XEiJ.regRn[rrr] = z = (t = y <= 32 ? x >>> y - 1 : 0) >>> 1;
 12350:         XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12351:       }
 12352:       break;
 12353:     case 0b110_000 >> 3:  //ROXR.L Dq,Dr
 12354:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12355:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12356:       //y %= 33;
 12357:       y -= 32 - y >> 6 & 33;  //y=data=0~32
 12358:       if (y == 0) {  //y=data=0
 12359:         z = x;
 12360:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12361:       } else {  //y=data=1~32
 12362:         z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1;
 12363:         if (y == 1) {  //y=data=1
 12364:           t = x;  //Cは最後に押し出されたビット
 12365:         } else {  //y=data=2~32
 12366:           z = x << 33 - y | (t = z >>> y - 2) >>> 1;
 12367:         }
 12368:         XEiJ.regRn[rrr] = z;
 12369:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12370:       }
 12371:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12372:       break;
 12373:     case 0b111_000 >> 3:  //ROR.L Dq,Dr
 12374:     default:
 12375:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12376:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12377:       if (y == 0) {
 12378:         z = x;
 12379:         t = 0;  //Cはクリア
 12380:       } else {
 12381:         y &= 31;  //y=data=0~31
 12382:         XEiJ.regRn[rrr] = z = x << -y | x >>> y;  //Javaのシフト演算子は5ビットでマスクされるので32-yを-yに省略。y=32のときx|xになるが問題ない
 12383:         t = z >>> 31;  //Cは結果の最上位ビット
 12384:       }
 12385:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t;  //Xは変化しない
 12386:     }
 12387:   }  //irpXxrToRegLong
 12388: 
 12389:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12390:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12391:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12392:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12393:   //ASR.W <ea>                                      |-|012346|-|UUUUU|***0*|  M+-WXZ  |1110_000_011_mmm_rrr
 12394:   //
 12395:   //ASR.W #<data>,Dr
 12396:   //ASR.W Dq,Dr
 12397:   //ASR.W <ea>
 12398:   //  算術右シフトワード
 12399:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12400:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12401:   //     1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0
 12402:   //     :
 12403:   //    15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0
 12404:   //    16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0
 12405:   //  CCR
 12406:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12407:   //    N  結果の最上位ビット
 12408:   //    Z  結果が0のときセット。他はクリア
 12409:   //    V  常にクリア
 12410:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12411:   public static void irpAsrToMem () throws M68kException {
 12412:     XEiJ.mpuCycleCount += 8;
 12413:     int ea = XEiJ.regOC & 63;
 12414:     int a = efaMltWord (ea);
 12415:     int x = XEiJ.busRws (a);
 12416:     int z = x >> 1;
 12417:     XEiJ.busWw (a, z);
 12418:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 12419:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 12420:                    -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 12421:   }  //irpAsrToMem
 12422: 
 12423:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12424:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12425:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12426:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12427:   //ASL.B #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_100_000_rrr
 12428:   //LSL.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_100_001_rrr
 12429:   //ROXL.B #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_100_010_rrr
 12430:   //ROL.B #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_100_011_rrr
 12431:   //ASL.B Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_100_100_rrr
 12432:   //LSL.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_100_101_rrr
 12433:   //ROXL.B Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_100_110_rrr
 12434:   //ROL.B Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_100_111_rrr
 12435:   //ASL.B Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_100_000_rrr [ASL.B #1,Dr]
 12436:   //LSL.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_100_001_rrr [LSL.B #1,Dr]
 12437:   //ROXL.B Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_100_010_rrr [ROXL.B #1,Dr]
 12438:   //ROL.B Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_100_011_rrr [ROL.B #1,Dr]
 12439:   //
 12440:   //ASL.B #<data>,Dr
 12441:   //ASL.B Dq,Dr
 12442:   //  算術左シフトバイト
 12443:   //       ........................アイウエオカキク XNZVC
 12444:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 12445:   //     1 ........................イウエオカキク0 アイ**ア Z=イウエオカキク==0,V=アイ!=0/-1
 12446:   //     :
 12447:   //     7 ........................ク0000000 キク**キ Z=ク==0,V=アイウエオカキク!=0/-1
 12448:   //     8 ........................00000000 ク01*ク V=アイウエオカキク!=0
 12449:   //     9 ........................00000000 001*0 V=アイウエオカキク!=0
 12450:   //  CCR
 12451:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12452:   //    N  結果の最上位ビット
 12453:   //    Z  結果が0のときセット。他はクリア
 12454:   //    V  ASRで元に戻せないときセット。他はクリア
 12455:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12456:   //
 12457:   //LSL.B #<data>,Dr
 12458:   //LSL.B Dq,Dr
 12459:   //  論理左シフトバイト
 12460:   //       ........................アイウエオカキク XNZVC
 12461:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 12462:   //     1 ........................イウエオカキク0 アイ*0ア Z=イウエオカキク==0
 12463:   //     :
 12464:   //     7 ........................ク0000000 キク*0キ Z=ク==0
 12465:   //     8 ........................00000000 ク010ク
 12466:   //     9 ........................00000000 00100
 12467:   //  CCR
 12468:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12469:   //    N  結果の最上位ビット
 12470:   //    Z  結果が0のときセット。他はクリア
 12471:   //    V  常にクリア
 12472:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12473:   //
 12474:   //ROL.B #<data>,Dr
 12475:   //ROL.B Dq,Dr
 12476:   //  左ローテートバイト
 12477:   //       ........................アイウエオカキク XNZVC
 12478:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 12479:   //     1 ........................イウエオカキクア Xイ*0ア Z=アイウエオカキク==0
 12480:   //     :
 12481:   //     7 ........................クアイウエオカキ Xク*0キ Z=アイウエオカキク==0
 12482:   //     8 ........................アイウエオカキク Xア*0ク Z=アイウエオカキク==0
 12483:   //  CCR
 12484:   //    X  常に変化しない
 12485:   //    N  結果の最上位ビット
 12486:   //    Z  結果が0のときセット。他はクリア
 12487:   //    V  常にクリア
 12488:   //    C  countが0のときクリア。他は結果の最下位ビット
 12489:   //
 12490:   //ROXL.B #<data>,Dr
 12491:   //ROXL.B Dq,Dr
 12492:   //  拡張左ローテートバイト
 12493:   //       ........................アイウエオカキク XNZVC
 12494:   //     0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 12495:   //     1 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0
 12496:   //     2 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0
 12497:   //     :
 12498:   //     7 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0
 12499:   //     8 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0
 12500:   //     9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 12501:   //  CCR
 12502:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12503:   //    N  結果の最上位ビット
 12504:   //    Z  結果が0のときセット。他はクリア
 12505:   //    V  常にクリア
 12506:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12507:   public static void irpXxlToRegByte () throws M68kException {
 12508:     int rrr;
 12509:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12510:     int y;
 12511:     int z;
 12512:     int t;
 12513:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12514:     case 0b000_000 >> 3:  //ASL.B #<data>,Dr
 12515:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12516:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1));
 12517:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != (byte) x ? XEiJ.REG_CCR_V : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット
 12518:       break;
 12519:     case 0b001_000 >> 3:  //LSL.B #<data>,Dr
 12520:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12521:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1));
 12522:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12523:       break;
 12524:     case 0b010_000 >> 3:  //ROXL.B #<data>,Dr
 12525:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12526:       z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12527:       if (y == 1 - 1) {  //y=data-1=1-1
 12528:         t = x;
 12529:       } else {  //y=data-1=2-1~8-1
 12530:         z = (t = z << y - (2 - 1)) << 1 | (0xff & x) >>> 9 - 1 - y;
 12531:       }
 12532:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 12533:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12534:       break;
 12535:     case 0b011_000 >> 3:  //ROL.B #<data>,Dr
 12536:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12537:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y + 1 | (0xff & x) >>> 7 - y));
 12538:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1;  //Xは変化しない。Cは結果の最下位ビット
 12539:       break;
 12540:     case 0b100_000 >> 3:  //ASL.B Dq,Dr
 12541:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12542:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12543:       if (y <= 7) {  //y=data=0~7
 12544:         if (y == 0) {  //y=data=0
 12545:           z = (byte) x;
 12546:           t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。VとCはクリア
 12547:         } else {  //y=data=1~7
 12548:           XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y - 1) << 1));
 12549:           t = (z >> y != (byte) x ? XEiJ.REG_CCR_V : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット
 12550:         }
 12551:         XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12552:       } else {  //y=data=8~63
 12553:         XEiJ.regRn[rrr] = ~0xff & x;
 12554:         XEiJ.regCCR = XEiJ.REG_CCR_Z | ((byte) x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 8 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0);
 12555:       }
 12556:       break;
 12557:     case 0b101_000 >> 3:  //LSL.B Dq,Dr
 12558:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12559:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12560:       if (y == 0) {  //y=data=0
 12561:         z = (byte) x;
 12562:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12563:       } else {  //y=data=1~63
 12564:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = y <= 8 ? x << y - 1 : 0) << 1));
 12565:         t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12566:       }
 12567:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12568:       break;
 12569:     case 0b110_000 >> 3:  //ROXL.B Dq,Dr
 12570:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12571:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12572:       //y %= 9;
 12573:       y = (y & 7) - (y >> 3);  //y=data=-7~7
 12574:       y += y >> 3 & 9;  //y=data=0~8
 12575:       if (y == 0) {  //y=data=0
 12576:         z = (byte) x;
 12577:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12578:       } else {  //y=data=1~8
 12579:         z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12580:         if (y == 1) {  //y=data=1
 12581:           t = x;  //Cは最後に押し出されたビット
 12582:         } else {  //y=data=2~8
 12583:           z = (t = z << y - 2) << 1 | (0xff & x) >>> 9 - y;
 12584:         }
 12585:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 12586:         t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12587:       }
 12588:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12589:       break;
 12590:     case 0b111_000 >> 3:  //ROL.B Dq,Dr
 12591:     default:
 12592:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12593:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12594:       if (y == 0) {
 12595:         z = (byte) x;
 12596:         t = 0;  //Cはクリア
 12597:       } else {
 12598:         y &= 7;  //y=data=0~7
 12599:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y | (0xff & x) >>> 8 - y));
 12600:         t = z & 1;  //Cは結果の最下位ビット
 12601:       }
 12602:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t;  //Xは変化しない
 12603:     }
 12604:   }  //irpXxlToRegByte
 12605: 
 12606:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12607:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12608:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12609:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12610:   //ASL.W #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_101_000_rrr
 12611:   //LSL.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_101_001_rrr
 12612:   //ROXL.W #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_101_010_rrr
 12613:   //ROL.W #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_101_011_rrr
 12614:   //ASL.W Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_101_100_rrr
 12615:   //LSL.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_101_101_rrr
 12616:   //ROXL.W Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_101_110_rrr
 12617:   //ROL.W Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_101_111_rrr
 12618:   //ASL.W Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_101_000_rrr [ASL.W #1,Dr]
 12619:   //LSL.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_101_001_rrr [LSL.W #1,Dr]
 12620:   //ROXL.W Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_101_010_rrr [ROXL.W #1,Dr]
 12621:   //ROL.W Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_101_011_rrr [ROL.W #1,Dr]
 12622:   //
 12623:   //ASL.W #<data>,Dr
 12624:   //ASL.W Dq,Dr
 12625:   //ASL.W <ea>
 12626:   //  算術左シフトワード
 12627:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12628:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12629:   //     1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1
 12630:   //     :
 12631:   //    15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1
 12632:   //    16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0
 12633:   //    17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0
 12634:   //  CCR
 12635:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12636:   //    N  結果の最上位ビット
 12637:   //    Z  結果が0のときセット。他はクリア
 12638:   //    V  ASRで元に戻せないときセット。他はクリア
 12639:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12640:   //
 12641:   //LSL.W #<data>,Dr
 12642:   //LSL.W Dq,Dr
 12643:   //LSL.W <ea>
 12644:   //  論理左シフトワード
 12645:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12646:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12647:   //     1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0
 12648:   //     :
 12649:   //    15 ................タ000000000000000 ソタ*0ソ Z=タ==0
 12650:   //    16 ................0000000000000000 タ010タ
 12651:   //    17 ................0000000000000000 00100
 12652:   //  CCR
 12653:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12654:   //    N  結果の最上位ビット
 12655:   //    Z  結果が0のときセット。他はクリア
 12656:   //    V  常にクリア
 12657:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12658:   //
 12659:   //ROL.W #<data>,Dr
 12660:   //ROL.W Dq,Dr
 12661:   //ROL.W <ea>
 12662:   //  左ローテートワード
 12663:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12664:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12665:   //     1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0
 12666:   //     :
 12667:   //    15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0
 12668:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0
 12669:   //  CCR
 12670:   //    X  常に変化しない
 12671:   //    N  結果の最上位ビット
 12672:   //    Z  結果が0のときセット。他はクリア
 12673:   //    V  常にクリア
 12674:   //    C  countが0のときクリア。他は結果の最下位ビット
 12675:   //
 12676:   //ROXL.W #<data>,Dr
 12677:   //ROXL.W Dq,Dr
 12678:   //ROXL.W <ea>
 12679:   //  拡張左ローテートワード
 12680:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12681:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12682:   //     1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 12683:   //     2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 12684:   //     :
 12685:   //    15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 12686:   //    16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 12687:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12688:   //  CCR
 12689:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12690:   //    N  結果の最上位ビット
 12691:   //    Z  結果が0のときセット。他はクリア
 12692:   //    V  常にクリア
 12693:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12694:   public static void irpXxlToRegWord () throws M68kException {
 12695:     int rrr;
 12696:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12697:     int y;
 12698:     int z;
 12699:     int t;
 12700:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12701:     case 0b000_000 >> 3:  //ASL.W #<data>,Dr
 12702:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12703:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1));
 12704:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != (short) x ? XEiJ.REG_CCR_V : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット
 12705:       break;
 12706:     case 0b001_000 >> 3:  //LSL.W #<data>,Dr
 12707:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12708:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1));
 12709:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12710:       break;
 12711:     case 0b010_000 >> 3:  //ROXL.W #<data>,Dr
 12712:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12713:       z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12714:       if (y == 1 - 1) {  //y=data-1=1-1
 12715:         t = x;
 12716:       } else {  //y=data-1=2-1~8-1
 12717:         z = (t = z << y - (2 - 1)) << 1 | (char) x >>> 17 - 1 - y;
 12718:       }
 12719:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12720:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12721:       break;
 12722:     case 0b011_000 >> 3:  //ROL.W #<data>,Dr
 12723:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12724:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y + 1 | (char) x >>> 16 - 1 - y));
 12725:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1;  //Xは変化しない。Cは結果の最下位ビット
 12726:       break;
 12727:     case 0b100_000 >> 3:  //ASL.W Dq,Dr
 12728:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12729:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12730:       if (y <= 15) {  //y=data=0~15
 12731:         if (y == 0) {  //y=data=0
 12732:           z = (short) x;
 12733:           t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。VとCはクリア
 12734:         } else {  //y=data=1~15
 12735:           XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y - 1) << 1));
 12736:           t = (z >> y != (short) x ? XEiJ.REG_CCR_V : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット
 12737:         }
 12738:         XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12739:       } else {  //y=data=16~63
 12740:         XEiJ.regRn[rrr] = ~0xffff & x;
 12741:         XEiJ.regCCR = XEiJ.REG_CCR_Z | ((short) x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 16 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0);
 12742:       }
 12743:       break;
 12744:     case 0b101_000 >> 3:  //LSL.W Dq,Dr
 12745:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12746:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12747:       if (y == 0) {  //y=data=0
 12748:         z = (short) x;
 12749:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12750:       } else {  //y=data=1~63
 12751:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = y <= 16 ? x << y - 1 : 0) << 1));
 12752:         t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12753:       }
 12754:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12755:       break;
 12756:     case 0b110_000 >> 3:  //ROXL.W Dq,Dr
 12757:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12758:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12759:       //y %= 17;
 12760:       y = (y & 15) - (y >> 4);  //y=data=-3~15
 12761:       y += y >> 4 & 17;  //y=data=0~16
 12762:       if (y == 0) {  //y=data=0
 12763:         z = (short) x;
 12764:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12765:       } else {  //y=data=1~16
 12766:         z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12767:         if (y == 1) {  //y=data=1
 12768:           t = x;  //Cは最後に押し出されたビット
 12769:         } else {  //y=data=2~16
 12770:           z = (t = z << y - 2) << 1 | (char) x >>> 17 - y;
 12771:         }
 12772:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12773:         t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12774:       }
 12775:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12776:       break;
 12777:     case 0b111_000 >> 3:  //ROL.W Dq,Dr
 12778:     default:
 12779:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12780:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12781:       if (y == 0) {
 12782:         z = (short) x;
 12783:         t = 0;  //Cはクリア
 12784:       } else {
 12785:         y &= 15;  //y=data=0~15
 12786:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y | (char) x >>> 16 - y));
 12787:         t = z & 1;  //Cは結果の最下位ビット
 12788:       }
 12789:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t;  //Xは変化しない
 12790:     }
 12791:   }  //irpXxlToRegWord
 12792: 
 12793:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12794:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12795:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12796:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12797:   //ASL.L #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_110_000_rrr
 12798:   //LSL.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_110_001_rrr
 12799:   //ROXL.L #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_110_010_rrr
 12800:   //ROL.L #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_110_011_rrr
 12801:   //ASL.L Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_110_100_rrr
 12802:   //LSL.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_110_101_rrr
 12803:   //ROXL.L Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_110_110_rrr
 12804:   //ROL.L Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_110_111_rrr
 12805:   //ASL.L Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_110_000_rrr [ASL.L #1,Dr]
 12806:   //LSL.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_110_001_rrr [LSL.L #1,Dr]
 12807:   //ROXL.L Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_110_010_rrr [ROXL.L #1,Dr]
 12808:   //ROL.L Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_110_011_rrr [ROL.L #1,Dr]
 12809:   //
 12810:   //ASL.L #<data>,Dr
 12811:   //ASL.L Dq,Dr
 12812:   //  算術左シフトロング
 12813:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12814:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア**0 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12815:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ**ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0,V=アイ!=0/-1
 12816:   //     :
 12817:   //    31 ミ0000000000000000000000000000000 マミ**マ Z=ミ==0,V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0/-1
 12818:   //    32 00000000000000000000000000000000 ミ01*ミ V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0
 12819:   //    33 00000000000000000000000000000000 001*0 V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0
 12820:   //  CCR
 12821:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12822:   //    N  結果の最上位ビット
 12823:   //    Z  結果が0のときセット。他はクリア
 12824:   //    V  ASRで元に戻せないときセット。他はクリア
 12825:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12826:   //
 12827:   //LSL.L #<data>,Dr
 12828:   //LSL.L Dq,Dr
 12829:   //  論理左シフトロング
 12830:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12831:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12832:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12833:   //     :
 12834:   //    31 ミ0000000000000000000000000000000 マミ*0マ Z=ミ==0
 12835:   //    32 00000000000000000000000000000000 ミ010ミ
 12836:   //    33 00000000000000000000000000000000 00100
 12837:   //  CCR
 12838:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12839:   //    N  結果の最上位ビット
 12840:   //    Z  結果が0のときセット。他はクリア
 12841:   //    V  常にクリア
 12842:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12843:   //
 12844:   //ROL.L #<data>,Dr
 12845:   //ROL.L Dq,Dr
 12846:   //  左ローテートロング
 12847:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12848:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12849:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12850:   //     :
 12851:   //    31 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12852:   //    32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12853:   //  CCR
 12854:   //    X  常に変化しない
 12855:   //    N  結果の最上位ビット
 12856:   //    Z  結果が0のときセット。他はクリア
 12857:   //    V  常にクリア
 12858:   //    C  countが0のときクリア。他は結果の最下位ビット
 12859:   //
 12860:   //ROXL.L #<data>,Dr
 12861:   //ROXL.L Dq,Dr
 12862:   //  拡張左ローテートロング
 12863:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12864:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12865:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12866:   //     2 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12867:   //     :
 12868:   //    31 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0
 12869:   //    32 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0
 12870:   //    33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12871:   //  CCR
 12872:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12873:   //    N  結果の最上位ビット
 12874:   //    Z  結果が0のときセット。他はクリア
 12875:   //    V  常にクリア
 12876:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12877:   public static void irpXxlToRegLong () throws M68kException {
 12878:     int rrr;
 12879:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12880:     int y;
 12881:     int z;
 12882:     int t;
 12883:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12884:     case 0b000_000 >> 3:  //ASL.L #<data>,Dr
 12885:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12886:       XEiJ.regRn[rrr] = z = (t = x << y) << 1;
 12887:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット
 12888:       break;
 12889:     case 0b001_000 >> 3:  //LSL.L #<data>,Dr
 12890:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12891:       XEiJ.regRn[rrr] = z = (t = x << y) << 1;
 12892:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12893:       break;
 12894:     case 0b010_000 >> 3:  //ROXL.L #<data>,Dr
 12895:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12896:       z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12897:       if (y == 1 - 1) {  //y=data-1=1-1
 12898:         t = x;
 12899:       } else {  //y=data-1=2-1~8-1
 12900:         z = (t = z << y - (2 - 1)) << 1 | x >>> -y;  //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略
 12901:       }
 12902:       XEiJ.regRn[rrr] = z;
 12903:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12904:       break;
 12905:     case 0b011_000 >> 3:  //ROL.L #<data>,Dr
 12906:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12907:       XEiJ.regRn[rrr] = z = x << y + 1 | x >>> ~y;  //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略
 12908:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1;  //Xは変化しない。Cは結果の最下位ビット
 12909:       break;
 12910:     case 0b100_000 >> 3:  //ASL.L Dq,Dr
 12911:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12912:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12913:       if (y <= 31) {  //y=data=0~31
 12914:         if (y == 0) {  //y=data=0
 12915:           z = x;
 12916:           t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。VとCはクリア
 12917:         } else {  //y=data=1~31
 12918:           XEiJ.regRn[rrr] = z = (t = x << y - 1) << 1;
 12919:           t = (z >> y != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット
 12920:         }
 12921:         XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12922:       } else {  //y=data=32~63
 12923:         XEiJ.regRn[rrr] = 0;
 12924:         XEiJ.regCCR = XEiJ.REG_CCR_Z | (x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 32 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0);
 12925:       }
 12926:       break;
 12927:     case 0b101_000 >> 3:  //LSL.L Dq,Dr
 12928:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12929:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12930:       if (y == 0) {  //y=data=0
 12931:         z = x;
 12932:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12933:       } else {  //y=data=1~63
 12934:         XEiJ.regRn[rrr] = z = (t = y <= 32 ? x << y - 1 : 0) << 1;
 12935:         t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12936:       }
 12937:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12938:       break;
 12939:     case 0b110_000 >> 3:  //ROXL.L Dq,Dr
 12940:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12941:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12942:       //y %= 33;
 12943:       y -= 32 - y >> 6 & 33;  //y=data=0~32
 12944:       if (y == 0) {  //y=data=0
 12945:         z = x;
 12946:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12947:       } else {  //y=data=1~32
 12948:         z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12949:         if (y == 1) {  //y=data=1
 12950:           t = x;  //Cは最後に押し出されたビット
 12951:         } else {  //y=data=2~32
 12952:           z = (t = z << y - 2) << 1 | x >>> 33 - y;
 12953:         }
 12954:         XEiJ.regRn[rrr] = z;
 12955:         t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12956:       }
 12957:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12958:       break;
 12959:     case 0b111_000 >> 3:  //ROL.L Dq,Dr
 12960:     default:
 12961:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12962:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12963:       if (y == 0) {
 12964:         z = x;
 12965:         t = 0;  //Cはクリア
 12966:       } else {
 12967:         XEiJ.regRn[rrr] = z = x << y | x >>> -y;  //Javaのシフト演算子は5ビットでマスクされるのでy&31をyに、32-(y&31)を-yに省略。y=32のときx|xになるが問題ない
 12968:         t = z & 1;
 12969:       }
 12970:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t;  //Xは変化しない
 12971:     }
 12972:   }  //irpXxlToRegLong
 12973: 
 12974:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12975:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12976:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12977:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12978:   //ASL.W <ea>                                      |-|012346|-|UUUUU|*****|  M+-WXZ  |1110_000_111_mmm_rrr
 12979:   //
 12980:   //ASL.W #<data>,Dr
 12981:   //ASL.W Dq,Dr
 12982:   //ASL.W <ea>
 12983:   //  算術左シフトワード
 12984:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12985:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12986:   //     1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1
 12987:   //     :
 12988:   //    15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1
 12989:   //    16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0
 12990:   //    17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0
 12991:   //  CCR
 12992:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12993:   //    N  結果の最上位ビット
 12994:   //    Z  結果が0のときセット。他はクリア
 12995:   //    V  ASRで元に戻せないときセット。他はクリア
 12996:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12997:   public static void irpAslToMem () throws M68kException {
 12998:     XEiJ.mpuCycleCount += 8;
 12999:     int ea = XEiJ.regOC & 63;
 13000:     int a = efaMltWord (ea);
 13001:     int x = XEiJ.busRws (a);
 13002:     int z = (short) (x << 1);
 13003:     XEiJ.busWw (a, z);
 13004:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 13005:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13006:                    (x ^ z) >>> 31 << 1 |  //Vは最上位ビットが変化したときセット
 13007:                    x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13008:   }  //irpAslToMem
 13009: 
 13010:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13011:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13012:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13013:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13014:   //LSR.W <ea>                                      |-|012346|-|UUUUU|*0*0*|  M+-WXZ  |1110_001_011_mmm_rrr
 13015:   //
 13016:   //LSR.W #<data>,Dr
 13017:   //LSR.W Dq,Dr
 13018:   //LSR.W <ea>
 13019:   //  論理右シフトワード
 13020:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13021:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 13022:   //     1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0
 13023:   //     :
 13024:   //    15 ................000000000000000ア イ0*0イ Z=ア==0
 13025:   //    16 ................0000000000000000 ア010ア
 13026:   //    17 ................0000000000000000 00100
 13027:   //  CCR
 13028:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 13029:   //    N  結果の最上位ビット
 13030:   //    Z  結果が0のときセット。他はクリア
 13031:   //    V  常にクリア
 13032:   //    C  countが0のときクリア。他は最後に押し出されたビット
 13033:   public static void irpLsrToMem () throws M68kException {
 13034:     XEiJ.mpuCycleCount += 8;
 13035:     int ea = XEiJ.regOC & 63;
 13036:     int a = efaMltWord (ea);
 13037:     int x = XEiJ.busRwz (a);
 13038:     int z = x >>> 1;
 13039:     XEiJ.busWw (a, z);
 13040:     XEiJ.regCCR = ((z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13041:                    -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13042:   }  //irpLsrToMem
 13043: 
 13044:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13045:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13046:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13047:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13048:   //LSL.W <ea>                                      |-|012346|-|UUUUU|***0*|  M+-WXZ  |1110_001_111_mmm_rrr
 13049:   //
 13050:   //LSL.W #<data>,Dr
 13051:   //LSL.W Dq,Dr
 13052:   //LSL.W <ea>
 13053:   //  論理左シフトワード
 13054:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13055:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 13056:   //     1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0
 13057:   //     :
 13058:   //    15 ................タ000000000000000 ソタ*0ソ Z=タ==0
 13059:   //    16 ................0000000000000000 タ010タ
 13060:   //    17 ................0000000000000000 00100
 13061:   //  CCR
 13062:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 13063:   //    N  結果の最上位ビット
 13064:   //    Z  結果が0のときセット。他はクリア
 13065:   //    V  常にクリア
 13066:   //    C  countが0のときクリア。他は最後に押し出されたビット
 13067:   public static void irpLslToMem () throws M68kException {
 13068:     XEiJ.mpuCycleCount += 8;
 13069:     int ea = XEiJ.regOC & 63;
 13070:     int a = efaMltWord (ea);
 13071:     int x = XEiJ.busRws (a);
 13072:     int z = (short) (x << 1);
 13073:     XEiJ.busWw (a, z);
 13074:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 13075:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13076:                    x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13077:   }  //irpLslToMem
 13078: 
 13079:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13080:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13081:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13082:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13083:   //ROXR.W <ea>                                     |-|012346|-|*UUUU|***0*|  M+-WXZ  |1110_010_011_mmm_rrr
 13084:   //
 13085:   //ROXR.W #<data>,Dr
 13086:   //ROXR.W Dq,Dr
 13087:   //ROXR.W <ea>
 13088:   //  拡張右ローテートワード
 13089:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13090:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13091:   //     1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 13092:   //     2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 13093:   //     :
 13094:   //    15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 13095:   //    16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 13096:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13097:   //  CCR
 13098:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 13099:   //    N  結果の最上位ビット
 13100:   //    Z  結果が0のときセット。他はクリア
 13101:   //    V  常にクリア
 13102:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 13103:   public static void irpRoxrToMem () throws M68kException {
 13104:     XEiJ.mpuCycleCount += 8;
 13105:     int ea = XEiJ.regOC & 63;
 13106:     int a = efaMltWord (ea);
 13107:     int x = XEiJ.busRwz (a);
 13108:     int z = -(XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | x >>> 1;
 13109:     XEiJ.busWw (a, z);
 13110:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 13111:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13112:                    -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13113:   }  //irpRoxrToMem
 13114: 
 13115:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13116:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13117:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13118:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13119:   //ROXL.W <ea>                                     |-|012346|-|*UUUU|***0*|  M+-WXZ  |1110_010_111_mmm_rrr
 13120:   //
 13121:   //ROXL.W #<data>,Dr
 13122:   //ROXL.W Dq,Dr
 13123:   //ROXL.W <ea>
 13124:   //  拡張左ローテートワード
 13125:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13126:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13127:   //     1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 13128:   //     2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 13129:   //     :
 13130:   //    15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 13131:   //    16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 13132:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13133:   //  CCR
 13134:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 13135:   //    N  結果の最上位ビット
 13136:   //    Z  結果が0のときセット。他はクリア
 13137:   //    V  常にクリア
 13138:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 13139:   public static void irpRoxlToMem () throws M68kException {
 13140:     XEiJ.mpuCycleCount += 8;
 13141:     int ea = XEiJ.regOC & 63;
 13142:     int a = efaMltWord (ea);
 13143:     int x = XEiJ.busRws (a);
 13144:     int z = (short) (x << 1 | XEiJ.regCCR >> 4 & 1);
 13145:     XEiJ.busWw (a, z);
 13146:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 13147:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13148:                    x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13149:   }  //irpRoxlToMem
 13150: 
 13151:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13152:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13153:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13154:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13155:   //ROR.W <ea>                                      |-|012346|-|-UUUU|-**0*|  M+-WXZ  |1110_011_011_mmm_rrr
 13156:   //
 13157:   //ROR.W #<data>,Dr
 13158:   //ROR.W Dq,Dr
 13159:   //ROR.W <ea>
 13160:   //  右ローテートワード
 13161:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13162:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 13163:   //     1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0
 13164:   //     :
 13165:   //    15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0
 13166:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0
 13167:   //  CCR
 13168:   //    X  常に変化しない
 13169:   //    N  結果の最上位ビット
 13170:   //    Z  結果が0のときセット。他はクリア
 13171:   //    V  常にクリア
 13172:   //    C  countが0のときクリア。他は結果の最上位ビット
 13173:   public static void irpRorToMem () throws M68kException {
 13174:     XEiJ.mpuCycleCount += 8;
 13175:     int ea = XEiJ.regOC & 63;
 13176:     int a = efaMltWord (ea);
 13177:     int x = XEiJ.busRwz (a);
 13178:     int z = (short) (x << 15 | x >>> 1);
 13179:     XEiJ.busWw (a, z);
 13180:     XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 13181:                    (z < 0 ? XEiJ.REG_CCR_N : 0) |
 13182:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13183:                    z >>> 31);  //Cは結果の最上位ビット
 13184:   }  //irpRorToMem
 13185: 
 13186:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13187:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13188:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13189:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13190:   //ROL.W <ea>                                      |-|012346|-|-UUUU|-**0*|  M+-WXZ  |1110_011_111_mmm_rrr
 13191:   //
 13192:   //ROL.W #<data>,Dr
 13193:   //ROL.W Dq,Dr
 13194:   //ROL.W <ea>
 13195:   //  左ローテートワード
 13196:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13197:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 13198:   //     1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0
 13199:   //     :
 13200:   //    15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0
 13201:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0
 13202:   //  CCR
 13203:   //    X  常に変化しない
 13204:   //    N  結果の最上位ビット
 13205:   //    Z  結果が0のときセット。他はクリア
 13206:   //    V  常にクリア
 13207:   //    C  countが0のときクリア。他は結果の最下位ビット
 13208:   public static void irpRolToMem () throws M68kException {
 13209:     XEiJ.mpuCycleCount += 8;
 13210:     int ea = XEiJ.regOC & 63;
 13211:     int a = efaMltWord (ea);
 13212:     int x = XEiJ.busRwz (a);
 13213:     int z = (short) (x << 1 | x >>> 15);
 13214:     XEiJ.busWw (a, z);
 13215:     XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 13216:                    (z < 0 ? XEiJ.REG_CCR_N : 0) |
 13217:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13218:                    z & 1);  //Cは結果の最下位ビット
 13219:   }  //irpRolToMem
 13220: 
 13221:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13222:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13223:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13224:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13225:   //FPACK <data>                                    |A|012346|-|UUUUU|*****|          |1111_111_0dd_ddd_ddd [FLINE #<data>]
 13226:   public static void irpFpack () throws M68kException {
 13227:     if (!MainMemory.mmrFEfuncActivated) {
 13228:       irpFline ();
 13229:       return;
 13230:     }
 13231:     StringBuilder sb;
 13232:     int a0;
 13233:     if (FEFunction.FPK_DEBUG_TRACE) {
 13234:       sb = new StringBuilder ();
 13235:       String name = Disassembler.DIS_FPACK_NAME[XEiJ.regOC & 255];
 13236:       if (name.length () == 0) {
 13237:         XEiJ.fmtHex4 (sb.append ('$'), XEiJ.regOC);
 13238:       } else {
 13239:         sb.append (name);
 13240:       }
 13241:       sb.append ('\n');
 13242:       XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (sb.append ("  D0="), XEiJ.regRn[0]).append (" D1="), XEiJ.regRn[1]).append (" D2="), XEiJ.regRn[2]).append (" D3="), XEiJ.regRn[3]);
 13243:       a0 = XEiJ.regRn[8];
 13244:       MainMemory.mmrRstr (sb.append (" (A0)=\""), a0, MainMemory.mmrStrlen (a0, 20)).append ("\"\n");
 13245:     }
 13246:     XEiJ.mpuCycleCount += FEFunction.FPK_CLOCK;  //一律にFEFunction.FPK_CLOCKサイクルかかることにする
 13247:     switch (XEiJ.regOC & 255) {
 13248:     case 0x00: FEFunction.fpkLMUL (); break;
 13249:     case 0x01: FEFunction.fpkLDIV (); break;
 13250:     case 0x02: FEFunction.fpkLMOD (); break;
 13251:       //case 0x03: break;
 13252:     case 0x04: FEFunction.fpkUMUL (); break;
 13253:     case 0x05: FEFunction.fpkUDIV (); break;
 13254:     case 0x06: FEFunction.fpkUMOD (); break;
 13255:       //case 0x07: break;
 13256:     case 0x08: FEFunction.fpkIMUL (); break;
 13257:     case 0x09: FEFunction.fpkIDIV (); break;
 13258:       //case 0x0a: break;
 13259:       //case 0x0b: break;
 13260:     case 0x0c: FEFunction.fpkRANDOMIZE (); break;
 13261:     case 0x0d: FEFunction.fpkSRAND (); break;
 13262:     case 0x0e: FEFunction.fpkRAND (); break;
 13263:       //case 0x0f: break;
 13264:     case 0x10: FEFunction.fpkSTOL (); break;
 13265:     case 0x11: FEFunction.fpkLTOS (); break;
 13266:     case 0x12: FEFunction.fpkSTOH (); break;
 13267:     case 0x13: FEFunction.fpkHTOS (); break;
 13268:     case 0x14: FEFunction.fpkSTOO (); break;
 13269:     case 0x15: FEFunction.fpkOTOS (); break;
 13270:     case 0x16: FEFunction.fpkSTOB (); break;
 13271:     case 0x17: FEFunction.fpkBTOS (); break;
 13272:     case 0x18: FEFunction.fpkIUSING (); break;
 13273:       //case 0x19: break;
 13274:     case 0x1a: FEFunction.fpkLTOD (); break;
 13275:     case 0x1b: FEFunction.fpkDTOL (); break;
 13276:     case 0x1c: FEFunction.fpkLTOF (); break;
 13277:     case 0x1d: FEFunction.fpkFTOL (); break;
 13278:     case 0x1e: FEFunction.fpkFTOD (); break;
 13279:     case 0x1f: FEFunction.fpkDTOF (); break;
 13280:     case 0x20: FEFunction.fpkVAL (); break;
 13281:     case 0x21: FEFunction.fpkUSING (); break;
 13282:     case 0x22: FEFunction.fpkSTOD (); break;
 13283:     case 0x23: FEFunction.fpkDTOS (); break;
 13284:     case 0x24: FEFunction.fpkECVT (); break;
 13285:     case 0x25: FEFunction.fpkFCVT (); break;
 13286:     case 0x26: FEFunction.fpkGCVT (); break;
 13287:       //case 0x27: break;
 13288:     case 0x28: FEFunction.fpkDTST (); break;
 13289:     case 0x29: FEFunction.fpkDCMP (); break;
 13290:     case 0x2a: FEFunction.fpkDNEG (); break;
 13291:     case 0x2b: FEFunction.fpkDADD (); break;
 13292:     case 0x2c: FEFunction.fpkDSUB (); break;
 13293:     case 0x2d: FEFunction.fpkDMUL (); break;
 13294:     case 0x2e: FEFunction.fpkDDIV (); break;
 13295:     case 0x2f: FEFunction.fpkDMOD (); break;
 13296:     case 0x30: FEFunction.fpkDABS (); break;
 13297:     case 0x31: FEFunction.fpkDCEIL (); break;
 13298:     case 0x32: FEFunction.fpkDFIX (); break;
 13299:     case 0x33: FEFunction.fpkDFLOOR (); break;
 13300:     case 0x34: FEFunction.fpkDFRAC (); break;
 13301:     case 0x35: FEFunction.fpkDSGN (); break;
 13302:     case 0x36: FEFunction.fpkSIN (); break;
 13303:     case 0x37: FEFunction.fpkCOS (); break;
 13304:     case 0x38: FEFunction.fpkTAN (); break;
 13305:     case 0x39: FEFunction.fpkATAN (); break;
 13306:     case 0x3a: FEFunction.fpkLOG (); break;
 13307:     case 0x3b: FEFunction.fpkEXP (); break;
 13308:     case 0x3c: FEFunction.fpkSQR (); break;
 13309:     case 0x3d: FEFunction.fpkPI (); break;
 13310:     case 0x3e: FEFunction.fpkNPI (); break;
 13311:     case 0x3f: FEFunction.fpkPOWER (); break;
 13312:     case 0x40: FEFunction.fpkRND (); break;
 13313:     case 0x41: FEFunction.fpkSINH (); break;
 13314:     case 0x42: FEFunction.fpkCOSH (); break;
 13315:     case 0x43: FEFunction.fpkTANH (); break;
 13316:     case 0x44: FEFunction.fpkATANH (); break;
 13317:     case 0x45: FEFunction.fpkASIN (); break;
 13318:     case 0x46: FEFunction.fpkACOS (); break;
 13319:     case 0x47: FEFunction.fpkLOG10 (); break;
 13320:     case 0x48: FEFunction.fpkLOG2 (); break;
 13321:     case 0x49: FEFunction.fpkDFREXP (); break;
 13322:     case 0x4a: FEFunction.fpkDLDEXP (); break;
 13323:     case 0x4b: FEFunction.fpkDADDONE (); break;
 13324:     case 0x4c: FEFunction.fpkDSUBONE (); break;
 13325:     case 0x4d: FEFunction.fpkDDIVTWO (); break;
 13326:     case 0x4e: FEFunction.fpkDIEECNV (); break;
 13327:     case 0x4f: FEFunction.fpkIEEDCNV (); break;
 13328:     case 0x50: FEFunction.fpkFVAL (); break;
 13329:     case 0x51: FEFunction.fpkFUSING (); break;
 13330:     case 0x52: FEFunction.fpkSTOF (); break;
 13331:     case 0x53: FEFunction.fpkFTOS (); break;
 13332:     case 0x54: FEFunction.fpkFECVT (); break;
 13333:     case 0x55: FEFunction.fpkFFCVT (); break;
 13334:     case 0x56: FEFunction.fpkFGCVT (); break;
 13335:       //case 0x57: break;
 13336:     case 0x58: FEFunction.fpkFTST (); break;
 13337:     case 0x59: FEFunction.fpkFCMP (); break;
 13338:     case 0x5a: FEFunction.fpkFNEG (); break;
 13339:     case 0x5b: FEFunction.fpkFADD (); break;
 13340:     case 0x5c: FEFunction.fpkFSUB (); break;
 13341:     case 0x5d: FEFunction.fpkFMUL (); break;
 13342:     case 0x5e: FEFunction.fpkFDIV (); break;
 13343:     case 0x5f: FEFunction.fpkFMOD (); break;
 13344:     case 0x60: FEFunction.fpkFABS (); break;
 13345:     case 0x61: FEFunction.fpkFCEIL (); break;
 13346:     case 0x62: FEFunction.fpkFFIX (); break;
 13347:     case 0x63: FEFunction.fpkFFLOOR (); break;
 13348:     case 0x64: FEFunction.fpkFFRAC (); break;
 13349:     case 0x65: FEFunction.fpkFSGN (); break;
 13350:     case 0x66: FEFunction.fpkFSIN (); break;
 13351:     case 0x67: FEFunction.fpkFCOS (); break;
 13352:     case 0x68: FEFunction.fpkFTAN (); break;
 13353:     case 0x69: FEFunction.fpkFATAN (); break;
 13354:     case 0x6a: FEFunction.fpkFLOG (); break;
 13355:     case 0x6b: FEFunction.fpkFEXP (); break;
 13356:     case 0x6c: FEFunction.fpkFSQR (); break;
 13357:     case 0x6d: FEFunction.fpkFPI (); break;
 13358:     case 0x6e: FEFunction.fpkFNPI (); break;
 13359:     case 0x6f: FEFunction.fpkFPOWER (); break;
 13360:     case 0x70: FEFunction.fpkFRND (); break;
 13361:     case 0x71: FEFunction.fpkFSINH (); break;
 13362:     case 0x72: FEFunction.fpkFCOSH (); break;
 13363:     case 0x73: FEFunction.fpkFTANH (); break;
 13364:     case 0x74: FEFunction.fpkFATANH (); break;
 13365:     case 0x75: FEFunction.fpkFASIN (); break;
 13366:     case 0x76: FEFunction.fpkFACOS (); break;
 13367:     case 0x77: FEFunction.fpkFLOG10 (); break;
 13368:     case 0x78: FEFunction.fpkFLOG2 (); break;
 13369:     case 0x79: FEFunction.fpkFFREXP (); break;
 13370:     case 0x7a: FEFunction.fpkFLDEXP (); break;
 13371:     case 0x7b: FEFunction.fpkFADDONE (); break;
 13372:     case 0x7c: FEFunction.fpkFSUBONE (); break;
 13373:     case 0x7d: FEFunction.fpkFDIVTWO (); break;
 13374:     case 0x7e: FEFunction.fpkFIEECNV (); break;
 13375:     case 0x7f: FEFunction.fpkIEEFCNV (); break;
 13376:       //case 0x80: break;
 13377:       //case 0x81: break;
 13378:       //case 0x82: break;
 13379:       //case 0x83: break;
 13380:       //case 0x84: break;
 13381:       //case 0x85: break;
 13382:       //case 0x86: break;
 13383:       //case 0x87: break;
 13384:       //case 0x88: break;
 13385:       //case 0x89: break;
 13386:       //case 0x8a: break;
 13387:       //case 0x8b: break;
 13388:       //case 0x8c: break;
 13389:       //case 0x8d: break;
 13390:       //case 0x8e: break;
 13391:       //case 0x8f: break;
 13392:       //case 0x90: break;
 13393:       //case 0x91: break;
 13394:       //case 0x92: break;
 13395:       //case 0x93: break;
 13396:       //case 0x94: break;
 13397:       //case 0x95: break;
 13398:       //case 0x96: break;
 13399:       //case 0x97: break;
 13400:       //case 0x98: break;
 13401:       //case 0x99: break;
 13402:       //case 0x9a: break;
 13403:       //case 0x9b: break;
 13404:       //case 0x9c: break;
 13405:       //case 0x9d: break;
 13406:       //case 0x9e: break;
 13407:       //case 0x9f: break;
 13408:       //case 0xa0: break;
 13409:       //case 0xa1: break;
 13410:       //case 0xa2: break;
 13411:       //case 0xa3: break;
 13412:       //case 0xa4: break;
 13413:       //case 0xa5: break;
 13414:       //case 0xa6: break;
 13415:       //case 0xa7: break;
 13416:       //case 0xa8: break;
 13417:       //case 0xa9: break;
 13418:       //case 0xaa: break;
 13419:       //case 0xab: break;
 13420:       //case 0xac: break;
 13421:       //case 0xad: break;
 13422:       //case 0xae: break;
 13423:       //case 0xaf: break;
 13424:       //case 0xb0: break;
 13425:       //case 0xb1: break;
 13426:       //case 0xb2: break;
 13427:       //case 0xb3: break;
 13428:       //case 0xb4: break;
 13429:       //case 0xb5: break;
 13430:       //case 0xb6: break;
 13431:       //case 0xb7: break;
 13432:       //case 0xb8: break;
 13433:       //case 0xb9: break;
 13434:       //case 0xba: break;
 13435:       //case 0xbb: break;
 13436:       //case 0xbc: break;
 13437:       //case 0xbd: break;
 13438:       //case 0xbe: break;
 13439:       //case 0xbf: break;
 13440:       //case 0xc0: break;
 13441:       //case 0xc1: break;
 13442:       //case 0xc2: break;
 13443:       //case 0xc3: break;
 13444:       //case 0xc4: break;
 13445:       //case 0xc5: break;
 13446:       //case 0xc6: break;
 13447:       //case 0xc7: break;
 13448:       //case 0xc8: break;
 13449:       //case 0xc9: break;
 13450:       //case 0xca: break;
 13451:       //case 0xcb: break;
 13452:       //case 0xcc: break;
 13453:       //case 0xcd: break;
 13454:       //case 0xce: break;
 13455:       //case 0xcf: break;
 13456:       //case 0xd0: break;
 13457:       //case 0xd1: break;
 13458:       //case 0xd2: break;
 13459:       //case 0xd3: break;
 13460:       //case 0xd4: break;
 13461:       //case 0xd5: break;
 13462:       //case 0xd6: break;
 13463:       //case 0xd7: break;
 13464:       //case 0xd8: break;
 13465:       //case 0xd9: break;
 13466:       //case 0xda: break;
 13467:       //case 0xdb: break;
 13468:       //case 0xdc: break;
 13469:       //case 0xdd: break;
 13470:       //case 0xde: break;
 13471:       //case 0xdf: break;
 13472:     case 0xe0: FEFunction.fpkCLMUL (); break;
 13473:     case 0xe1: FEFunction.fpkCLDIV (); break;
 13474:     case 0xe2: FEFunction.fpkCLMOD (); break;
 13475:     case 0xe3: FEFunction.fpkCUMUL (); break;
 13476:     case 0xe4: FEFunction.fpkCUDIV (); break;
 13477:     case 0xe5: FEFunction.fpkCUMOD (); break;
 13478:     case 0xe6: FEFunction.fpkCLTOD (); break;
 13479:     case 0xe7: FEFunction.fpkCDTOL (); break;
 13480:     case 0xe8: FEFunction.fpkCLTOF (); break;
 13481:     case 0xe9: FEFunction.fpkCFTOL (); break;
 13482:     case 0xea: FEFunction.fpkCFTOD (); break;
 13483:     case 0xeb: FEFunction.fpkCDTOF (); break;
 13484:     case 0xec: FEFunction.fpkCDCMP (); break;
 13485:     case 0xed: FEFunction.fpkCDADD (); break;
 13486:     case 0xee: FEFunction.fpkCDSUB (); break;
 13487:     case 0xef: FEFunction.fpkCDMUL (); break;
 13488:     case 0xf0: FEFunction.fpkCDDIV (); break;
 13489:     case 0xf1: FEFunction.fpkCDMOD (); break;
 13490:     case 0xf2: FEFunction.fpkCFCMP (); break;
 13491:     case 0xf3: FEFunction.fpkCFADD (); break;
 13492:     case 0xf4: FEFunction.fpkCFSUB (); break;
 13493:     case 0xf5: FEFunction.fpkCFMUL (); break;
 13494:     case 0xf6: FEFunction.fpkCFDIV (); break;
 13495:     case 0xf7: FEFunction.fpkCFMOD (); break;
 13496:     case 0xf8: FEFunction.fpkCDTST (); break;
 13497:     case 0xf9: FEFunction.fpkCFTST (); break;
 13498:     case 0xfa: FEFunction.fpkCDINC (); break;
 13499:     case 0xfb: FEFunction.fpkCFINC (); break;
 13500:     case 0xfc: FEFunction.fpkCDDEC (); break;
 13501:     case 0xfd: FEFunction.fpkCFDEC (); break;
 13502:     case 0xfe: FEFunction.fpkFEVARG (); break;
 13503:     //case 0xff: FEFunction.fpkFEVECS (); break;  //FLOATn.Xに処理させる
 13504:     default:
 13505:       XEiJ.mpuCycleCount -= FEFunction.FPK_CLOCK;  //戻す
 13506:       irpFline ();
 13507:     }
 13508:     if (FEFunction.FPK_DEBUG_TRACE) {
 13509:       int i = sb.length ();
 13510:       XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (sb.append ("  D0="), XEiJ.regRn[0]).append (" D1="), XEiJ.regRn[1]).append (" D2="), XEiJ.regRn[2]).append (" D3="), XEiJ.regRn[3]);
 13511:       int l = MainMemory.mmrStrlen (a0, 20);
 13512:       sb.append (" (A0)=\"");
 13513:       i = sb.length () - i;
 13514:       MainMemory.mmrRstr (sb, a0, l).append ("\"\n");
 13515:       if (a0 <= XEiJ.regRn[8] && XEiJ.regRn[8] <= a0 + l) {
 13516:         for (i += sb.length () + XEiJ.regRn[8] - a0; sb.length () < i; ) {
 13517:           sb.append (' ');
 13518:         }
 13519:         sb.append ('^');
 13520:       }
 13521:       System.out.println (sb.toString ());
 13522:     }
 13523:   }  //irpFpack
 13524: 
 13525:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13526:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13527:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13528:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13529:   //DOS <data>                                      |A|012346|-|UUUUU|UUUUU|          |1111_111_1dd_ddd_ddd [FLINE #<data>]
 13530:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13531:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13532:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13533:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13534:   //FLINE #<data>                                   |-|012346|-|UUUUU|UUUUU|          |1111_ddd_ddd_ddd_ddd (line 1111 emulator)
 13535:   public static void irpFline () throws M68kException {
 13536:     XEiJ.mpuCycleCount += 34;
 13537:     if (XEiJ.MPU_INLINE_EXCEPTION) {
 13538:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
 13539:       int sp = XEiJ.regRn[15];
 13540:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
 13541:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 13542:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 13543:         XEiJ.mpuUSP = sp;  //USPを保存
 13544:         sp = XEiJ.mpuISP;  //SSPを復元
 13545:         if (DataBreakPoint.DBP_ON) {
 13546:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 13547:         } else {
 13548:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 13549:         }
 13550:         if (InstructionBreakPoint.IBP_ON) {
 13551:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 13552:         }
 13553:       }
 13554:       int vectorOffset = M68kException.M6E_LINE_1111_EMULATOR << 2;  //vector offset
 13555:       XEiJ.regRn[15] = sp -= 8;  //short format
 13556:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 13557:       XEiJ.busWl (sp + 2, XEiJ.regPC0);  //program counter
 13558:       XEiJ.busWw (sp, save_sr);  //status register
 13559:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 13560:     } else {
 13561:       irpException (M68kException.M6E_LINE_1111_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは命令の先頭
 13562:     }
 13563:   }  //irpFline
 13564: 
 13565:   //irpIllegal ()
 13566:   //  オペコードの上位10bitで分類されなかった未実装命令
 13567:   //  0x4afcのILLEGAL命令はここには来ない
 13568:   public static void irpIllegal () throws M68kException {
 13569:     if (true) {
 13570:       XEiJ.mpuCycleCount += 34;
 13571:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 13572:       throw M68kException.m6eSignal;
 13573:     }
 13574:   }  //irpIllegal
 13575: 
 13576:   //z = irpAbcd (x, y)
 13577:   //  ABCD
 13578:   public static int irpAbcd (int x, int y) {
 13579:     int c = XEiJ.regCCR >> 4;
 13580:     int t = (x & 0xff) + (y & 0xff) + c;  //仮の結果
 13581:     int z = t;  //結果
 13582:     if (0x0a <= (x & 0x0f) + (y & 0x0f) + c) {  //ハーフキャリー
 13583:       z += 0x10 - 0x0a;
 13584:     }
 13585:     //XとCはキャリーがあるときセット、さもなくばクリア
 13586:     if (0xa0 <= z) {  //キャリー
 13587:       z += 0x100 - 0xa0;
 13588:       XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C;
 13589:     } else {
 13590:       XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);
 13591:     }
 13592:     //Zは結果が0でないときクリア、さもなくば変化しない
 13593:     z &= 0xff;
 13594:     if (z != 0x00) {
 13595:       XEiJ.regCCR &= ~XEiJ.REG_CCR_Z;
 13596:     }
 13597:     if (true) {
 13598:       //000/030のときNは結果の最上位ビット
 13599:       if ((z & 0x80) != 0) {
 13600:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13601:       } else {
 13602:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13603:       }
 13604:       //000のときVは補正値の加算でオーバーフローしたときセット、さもなくばクリア
 13605:       int a = z - t;  //補正値
 13606:       if ((((t ^ z) & (a ^ z)) & 0x80) != 0) {
 13607:         XEiJ.regCCR |= XEiJ.REG_CCR_V;
 13608:       } else {
 13609:         XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13610:       }
 13611:     } else if (false) {
 13612:       //000/030のときNは結果の最上位ビット
 13613:       if ((z & 0x80) != 0) {
 13614:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13615:       } else {
 13616:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13617:       }
 13618:       //030のときVはクリア
 13619:       XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13620:     } else {
 13621:       //060のときNとVは変化しない
 13622:     }
 13623:     return z;
 13624:   }  //irpAbcd
 13625: 
 13626:   //z = irpSbcd (x, y)
 13627:   //  SBCD
 13628:   public static int irpSbcd (int x, int y) {
 13629:     int b = XEiJ.regCCR >> 4;
 13630:     int t = (x & 0xff) - (y & 0xff) - b;  //仮の結果
 13631:     int z = t;  //結果
 13632:     if ((x & 0x0f) - (y & 0x0f) - b < 0) {  //ハーフボロー
 13633:       z -= 0x10 - 0x0a;
 13634:     }
 13635:     //XとCはボローがあるときセット、さもなくばクリア
 13636:     if (z < 0) {  //ボロー
 13637:       if (t < 0) {
 13638:         z -= 0x100 - 0xa0;
 13639:       }
 13640:       XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C;
 13641:     } else {
 13642:       XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);
 13643:     }
 13644:     //Zは結果が0でないときクリア、さもなくば変化しない
 13645:     z &= 0xff;
 13646:     if (z != 0x00) {
 13647:       XEiJ.regCCR &= ~XEiJ.REG_CCR_Z;
 13648:     }
 13649:     if (true) {
 13650:       //000/030のときNは結果の最上位ビット
 13651:       if ((z & 0x80) != 0) {
 13652:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13653:       } else {
 13654:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13655:       }
 13656:       //000のときVは補正値の加算でオーバーフローしたときセット、さもなくばクリア
 13657:       int a = z - t;  //補正値
 13658:       if ((((t ^ z) & (a ^ z)) & 0x80) != 0) {
 13659:         XEiJ.regCCR |= XEiJ.REG_CCR_V;
 13660:       } else {
 13661:         XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13662:       }
 13663:     } else if (false) {
 13664:       //000/030のときNは結果の最上位ビット
 13665:       if ((z & 0x80) != 0) {
 13666:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13667:       } else {
 13668:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13669:       }
 13670:       //030のときVはクリア
 13671:       XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13672:     } else {
 13673:       //060のときNとVは変化しない
 13674:     }
 13675:     return z;
 13676:   }  //irpSbcd
 13677: 
 13678: 
 13679: 
 13680:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13681:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13682:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13683:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13684:   //HFSBOOT                                         |-|012346|-|-----|-----|          |0100_111_000_000_000
 13685:   //HFSINST                                         |-|012346|-|-----|-----|          |0100_111_000_000_001
 13686:   //HFSSTR                                          |-|012346|-|-----|-----|          |0100_111_000_000_010
 13687:   //HFSINT                                          |-|012346|-|-----|-----|          |0100_111_000_000_011
 13688:   //EMXNOP                                          |-|012346|-|-----|-----|          |0100_111_000_000_100
 13689:   //  エミュレータ拡張命令
 13690:   public static void irpEmx () throws M68kException {
 13691:     switch (XEiJ.regOC & 63) {
 13692:     case XEiJ.EMX_OPCODE_HFSBOOT & 63:
 13693:       XEiJ.mpuCycleCount += 40;
 13694:       if (HFS.hfsIPLBoot ()) {
 13695:         //JMP $6800.W
 13696:         irpSetPC (0x00006800);
 13697:       }
 13698:       break;
 13699:     case XEiJ.EMX_OPCODE_HFSINST & 63:
 13700:       XEiJ.mpuCycleCount += 40;
 13701:       HFS.hfsInstall ();
 13702:       break;
 13703:     case XEiJ.EMX_OPCODE_HFSSTR & 63:
 13704:       XEiJ.mpuCycleCount += 40;
 13705:       HFS.hfsStrategy ();
 13706:       break;
 13707:     case XEiJ.EMX_OPCODE_HFSINT & 63:
 13708:       XEiJ.mpuCycleCount += 40;
 13709:       //XEiJ.mpuClockTime += (int) (TMR_FREQ / 100000L);  //0.01ms
 13710:       if (HFS.hfsInterrupt ()) {
 13711:         //WAIT
 13712:         XEiJ.mpuTraceFlag = 0;  //トレース例外を発生させない
 13713:         XEiJ.regPC = XEiJ.regPC0;  //ループ
 13714:         XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000;  //4μs。10MHzのとき40clk
 13715:         XEiJ.mpuLastNano += 4000L;
 13716:       }
 13717:       break;
 13718:     case XEiJ.EMX_OPCODE_EMXNOP & 63:
 13719:       XEiJ.emxNop ();
 13720:       break;
 13721:     case XEiJ.EMX_OPCODE_EMXWAIT & 63:
 13722:       WaitInstruction.execute ();  //待機命令を実行する
 13723:       break;
 13724:     default:
 13725:       XEiJ.mpuCycleCount += 34;
 13726:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 13727:       throw M68kException.m6eSignal;
 13728:     }
 13729:   }  //irpEmx
 13730: 
 13731: 
 13732: 
 13733:   //irpSetPC (a)
 13734:   //  pcへデータを書き込む
 13735:   //  奇数のときはアドレスエラーが発生する
 13736:   public static void irpSetPC (int a) throws M68kException {
 13737:     if (XEiJ.TEST_BIT_0_SHIFT ? a << 31 - 0 < 0 : (a & 1) != 0) {
 13738:       M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
 13739:       M68kException.m6eAddress = a;
 13740:       M68kException.m6eDirection = XEiJ.MPU_WR_READ;
 13741:       M68kException.m6eSize = XEiJ.MPU_SS_LONG;
 13742:       throw M68kException.m6eSignal;
 13743:     }
 13744:     if (BranchLog.BLG_ON) {
 13745:       BranchLog.blgJump (a);  //分岐ログに分岐レコードを追加する
 13746:     } else {
 13747:       XEiJ.regPC = a;
 13748:     }
 13749:   }  //irpSetPC
 13750: 
 13751:   //irpSetSR (newSr)
 13752:   //  srへデータを書き込む
 13753:   //  ori to sr/andi to sr/eori to sr/move to sr/stop/rteで使用される
 13754:   //  スーパーバイザモードになっていることを確認してから呼び出すこと
 13755:   //  rteではr[15]が指すアドレスからsrとpcを取り出してr[15]を更新してから呼び出すこと
 13756:   //  スーパーバイザモード→ユーザモードのときは移行のための処理を行う
 13757:   //  新しい割り込みマスクレベルよりも高い割り込み処理の終了をデバイスに通知する
 13758:   public static void irpSetSR (int newSr) {
 13759:     XEiJ.regSRT1 = XEiJ.REG_SR_T1 & newSr;
 13760:     if ((XEiJ.regSRS = XEiJ.REG_SR_S & newSr) == 0) {  //スーパーバイザモード→ユーザモード
 13761:       XEiJ.mpuISP = XEiJ.regRn[15];  //XEiJ.mpuISPを保存
 13762:       XEiJ.regRn[15] = XEiJ.mpuUSP;  //XEiJ.mpuUSPを復元
 13763:       if (DataBreakPoint.DBP_ON) {
 13764:         DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpUserMap;  //ユーザメモリマップに切り替える
 13765:       } else {
 13766:         XEiJ.busMemoryMap = XEiJ.busUserMap;  //ユーザメモリマップに切り替える
 13767:       }
 13768:       if (InstructionBreakPoint.IBP_ON) {
 13769:         InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1UserMap;
 13770:       }
 13771:     }
 13772:     int t = (XEiJ.mpuIMR = 0x7f >> ((XEiJ.regSRI = XEiJ.REG_SR_I & newSr) >> 8)) & XEiJ.mpuISR;  //XEiJ.mpuISRで1→0とするビット
 13773:     if (t != 0) {  //終了する割り込みがあるとき
 13774:       XEiJ.mpuISR ^= t;
 13775:       //デバイスに割り込み処理の終了を通知する
 13776:       if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) {  //MFPのみ
 13777:         MC68901.mfpDone ();
 13778:       } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) {  //DMAのみ
 13779:         HD63450.dmaDone ();
 13780:       } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) {  //SCCのみ
 13781:         Z8530.sccDone ();
 13782:       } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) {  //IOIのみ
 13783:         IOInterrupt.ioiDone ();
 13784:       } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) {  //EB2のみ
 13785:         XEiJ.eb2Done ();
 13786:       } else {  //SYSのみまたは複数
 13787:         if (XEiJ.TEST_BIT_1_SHIFT ? t << 24 + XEiJ.MPU_MFP_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_MFP_INTERRUPT_MASK) != 0) {
 13788:           MC68901.mfpDone ();
 13789:         }
 13790:         if (t << 24 + XEiJ.MPU_DMA_INTERRUPT_LEVEL < 0) {  //(t & XEiJ.MPU_DMA_INTERRUPT_MASK) != 0
 13791:           HD63450.dmaDone ();
 13792:         }
 13793:         if (XEiJ.TEST_BIT_2_SHIFT ? t << 24 + XEiJ.MPU_SCC_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SCC_INTERRUPT_MASK) != 0) {
 13794:           Z8530.sccDone ();
 13795:         }
 13796:         if (t << 24 + XEiJ.MPU_IOI_INTERRUPT_LEVEL < 0) {  //(t & XEiJ.MPU_IOI_INTERRUPT_MASK) != 0
 13797:           IOInterrupt.ioiDone ();
 13798:         }
 13799:         if (t << 24 + XEiJ.MPU_EB2_INTERRUPT_LEVEL < 0) {  //(t & XEiJ.MPU_EB2_INTERRUPT_MASK) != 0
 13800:           XEiJ.eb2Done ();
 13801:         }
 13802:         if (XEiJ.TEST_BIT_0_SHIFT ? t << 24 + XEiJ.MPU_SYS_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SYS_INTERRUPT_MASK) != 0) {
 13803:           XEiJ.sysDone ();
 13804:         }
 13805:       }
 13806:     }
 13807:     XEiJ.mpuIMR |= ~XEiJ.mpuISR & XEiJ.MPU_SYS_INTERRUPT_MASK;  //割り込みマスクレベルが7のときレベル7割り込みの処理中でなければレベル7割り込みを許可する
 13808:     XEiJ.regCCR = XEiJ.REG_CCR_MASK & newSr;
 13809:   }  //irpSetSR
 13810: 
 13811:   //irpInterrupt (vectorNumber, level)
 13812:   //  割り込み処理を開始する
 13813:   public static void irpInterrupt (int vectorNumber, int level) throws M68kException {
 13814:     if (XEiJ.regOC == 0b0100_111_001_110_010) {  //最後に実行した命令はSTOP命令
 13815:       XEiJ.regPC = XEiJ.regPC0 + 4;  //次の命令に進む
 13816:     }
 13817:     XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * 44;
 13818:     int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
 13819:     XEiJ.regSRI = level << 8;  //割り込みマスクを要求されたレベルに変更する
 13820:     XEiJ.mpuIMR = 0x7f >> level;
 13821:     XEiJ.mpuISR |= 0x80 >> level;
 13822:     int sp = XEiJ.regRn[15];
 13823:     XEiJ.regSRT1 = 0;  //srのTビットを消す
 13824:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 13825:       XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 13826:       XEiJ.mpuUSP = sp;  //USPを保存
 13827:       sp = XEiJ.mpuISP;  //SSPを復元
 13828:       if (DataBreakPoint.DBP_ON) {
 13829:         DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 13830:       } else {
 13831:         XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 13832:       }
 13833:       if (InstructionBreakPoint.IBP_ON) {
 13834:         InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 13835:       }
 13836:     }
 13837:     int vectorOffset = vectorNumber << 2;  //vector offset
 13838:     XEiJ.regRn[15] = sp -= 8;  //short format
 13839:     XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 13840:     XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
 13841:     XEiJ.busWw (sp, save_sr);  //status register
 13842:     if (BranchLog.BLG_ON) {
 13843:       XEiJ.regPC0 = XEiJ.regPC;  //rteによる割り込み終了と同時に次の割り込みを受け付けたとき間でpc0を更新しないと2番目の分岐レコードの終了アドレスが1番目と同じになっておかしな分岐レコードができてしまう
 13844:     }
 13845:     irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 13846:   }  //irpInterrupt
 13847: 
 13848:   //irpException (vectorNumber, save_pc, save_sr)
 13849:   //  例外処理を開始する
 13850:   //  スタックへのプッシュ、ベクタの取り出し、ジャンプのいずれかでバスエラーまたはアドレスエラーが発生する場合がある
 13851:   public static void irpException (int vectorNumber, int save_pc, int save_sr) throws M68kException {
 13852:     int sp = XEiJ.regRn[15];
 13853:     XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
 13854:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 13855:       XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 13856:       XEiJ.mpuUSP = sp;  //USPを保存
 13857:       sp = XEiJ.mpuISP;  //SSPを復元
 13858:       if (DataBreakPoint.DBP_ON) {
 13859:         DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 13860:       } else {
 13861:         XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 13862:       }
 13863:       if (InstructionBreakPoint.IBP_ON) {
 13864:         InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 13865:       }
 13866:     }
 13867:     int vectorOffset = vectorNumber << 2;  //vector offset
 13868:     XEiJ.regRn[15] = sp -= 8;  //short format
 13869:     XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 13870:     XEiJ.busWl (sp + 2, save_pc);  //program counter
 13871:     XEiJ.busWw (sp, save_sr);  //status register
 13872:     irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 13873:   }  //irpException
 13874: 
 13875: 
 13876: 
 13877:   //a = efaAnyByte (ea)  //|  M+-WXZPI|
 13878:   //  任意のモードのバイトオペランドの実効アドレスを求める
 13879:   //  (A7)+と-(A7)はA7を奇偶に関わらず2変化させ、跨いだワードの上位バイト(アドレスの小さい方)を参照する
 13880:   //  #<data>はオペコードに続くワードの下位バイトを参照する。上位バイトは不定なので参照してはならない
 13881:   @SuppressWarnings ("fallthrough") public static int efaAnyByte (int ea) throws M68kException {
 13882:     int t, w;
 13883:     switch (ea) {
 13884:     case 0b010_000:  //(A0)
 13885:       if (XEiJ.EFA_SEPARATE_AR) {
 13886:         XEiJ.mpuCycleCount += 4;
 13887:         return XEiJ.regRn[ 8];
 13888:       }
 13889:       //fallthrough
 13890:     case 0b010_001:  //(A1)
 13891:       if (XEiJ.EFA_SEPARATE_AR) {
 13892:         XEiJ.mpuCycleCount += 4;
 13893:         return XEiJ.regRn[ 9];
 13894:       }
 13895:       //fallthrough
 13896:     case 0b010_010:  //(A2)
 13897:       if (XEiJ.EFA_SEPARATE_AR) {
 13898:         XEiJ.mpuCycleCount += 4;
 13899:         return XEiJ.regRn[10];
 13900:       }
 13901:       //fallthrough
 13902:     case 0b010_011:  //(A3)
 13903:       if (XEiJ.EFA_SEPARATE_AR) {
 13904:         XEiJ.mpuCycleCount += 4;
 13905:         return XEiJ.regRn[11];
 13906:       }
 13907:       //fallthrough
 13908:     case 0b010_100:  //(A4)
 13909:       if (XEiJ.EFA_SEPARATE_AR) {
 13910:         XEiJ.mpuCycleCount += 4;
 13911:         return XEiJ.regRn[12];
 13912:       }
 13913:       //fallthrough
 13914:     case 0b010_101:  //(A5)
 13915:       if (XEiJ.EFA_SEPARATE_AR) {
 13916:         XEiJ.mpuCycleCount += 4;
 13917:         return XEiJ.regRn[13];
 13918:       }
 13919:       //fallthrough
 13920:     case 0b010_110:  //(A6)
 13921:       if (XEiJ.EFA_SEPARATE_AR) {
 13922:         XEiJ.mpuCycleCount += 4;
 13923:         return XEiJ.regRn[14];
 13924:       }
 13925:       //fallthrough
 13926:     case 0b010_111:  //(A7)
 13927:       if (XEiJ.EFA_SEPARATE_AR) {
 13928:         XEiJ.mpuCycleCount += 4;
 13929:         return XEiJ.regRn[15];
 13930:       } else {
 13931:         XEiJ.mpuCycleCount += 4;
 13932:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 13933:       }
 13934:     case 0b011_000:  //(A0)+
 13935:       if (XEiJ.EFA_SEPARATE_AR) {
 13936:         XEiJ.mpuCycleCount += 4;
 13937:         return XEiJ.regRn[ 8]++;
 13938:       }
 13939:       //fallthrough
 13940:     case 0b011_001:  //(A1)+
 13941:       if (XEiJ.EFA_SEPARATE_AR) {
 13942:         XEiJ.mpuCycleCount += 4;
 13943:         return XEiJ.regRn[ 9]++;
 13944:       }
 13945:       //fallthrough
 13946:     case 0b011_010:  //(A2)+
 13947:       if (XEiJ.EFA_SEPARATE_AR) {
 13948:         XEiJ.mpuCycleCount += 4;
 13949:         return XEiJ.regRn[10]++;
 13950:       }
 13951:       //fallthrough
 13952:     case 0b011_011:  //(A3)+
 13953:       if (XEiJ.EFA_SEPARATE_AR) {
 13954:         XEiJ.mpuCycleCount += 4;
 13955:         return XEiJ.regRn[11]++;
 13956:       }
 13957:       //fallthrough
 13958:     case 0b011_100:  //(A4)+
 13959:       if (XEiJ.EFA_SEPARATE_AR) {
 13960:         XEiJ.mpuCycleCount += 4;
 13961:         return XEiJ.regRn[12]++;
 13962:       }
 13963:       //fallthrough
 13964:     case 0b011_101:  //(A5)+
 13965:       if (XEiJ.EFA_SEPARATE_AR) {
 13966:         XEiJ.mpuCycleCount += 4;
 13967:         return XEiJ.regRn[13]++;
 13968:       }
 13969:       //fallthrough
 13970:     case 0b011_110:  //(A6)+
 13971:       if (XEiJ.EFA_SEPARATE_AR) {
 13972:         XEiJ.mpuCycleCount += 4;
 13973:         return XEiJ.regRn[14]++;
 13974:       } else {
 13975:         XEiJ.mpuCycleCount += 4;
 13976:         return XEiJ.regRn[ea - (0b011_000 - 8)]++;
 13977:       }
 13978:     case 0b011_111:  //(A7)+
 13979:       XEiJ.mpuCycleCount += 4;
 13980:       return (XEiJ.regRn[15] += 2) - 2;
 13981:     case 0b100_000:  //-(A0)
 13982:       if (XEiJ.EFA_SEPARATE_AR) {
 13983:         XEiJ.mpuCycleCount += 6;
 13984:         return --XEiJ.regRn[ 8];
 13985:       }
 13986:       //fallthrough
 13987:     case 0b100_001:  //-(A1)
 13988:       if (XEiJ.EFA_SEPARATE_AR) {
 13989:         XEiJ.mpuCycleCount += 6;
 13990:         return --XEiJ.regRn[ 9];
 13991:       }
 13992:       //fallthrough
 13993:     case 0b100_010:  //-(A2)
 13994:       if (XEiJ.EFA_SEPARATE_AR) {
 13995:         XEiJ.mpuCycleCount += 6;
 13996:         return --XEiJ.regRn[10];
 13997:       }
 13998:       //fallthrough
 13999:     case 0b100_011:  //-(A3)
 14000:       if (XEiJ.EFA_SEPARATE_AR) {
 14001:         XEiJ.mpuCycleCount += 6;
 14002:         return --XEiJ.regRn[11];
 14003:       }
 14004:       //fallthrough
 14005:     case 0b100_100:  //-(A4)
 14006:       if (XEiJ.EFA_SEPARATE_AR) {
 14007:         XEiJ.mpuCycleCount += 6;
 14008:         return --XEiJ.regRn[12];
 14009:       }
 14010:       //fallthrough
 14011:     case 0b100_101:  //-(A5)
 14012:       if (XEiJ.EFA_SEPARATE_AR) {
 14013:         XEiJ.mpuCycleCount += 6;
 14014:         return --XEiJ.regRn[13];
 14015:       }
 14016:       //fallthrough
 14017:     case 0b100_110:  //-(A6)
 14018:       if (XEiJ.EFA_SEPARATE_AR) {
 14019:         XEiJ.mpuCycleCount += 6;
 14020:         return --XEiJ.regRn[14];
 14021:       } else {
 14022:         XEiJ.mpuCycleCount += 6;
 14023:         return --XEiJ.regRn[ea - (0b100_000 - 8)];
 14024:       }
 14025:     case 0b100_111:  //-(A7)
 14026:       XEiJ.mpuCycleCount += 6;
 14027:       return XEiJ.regRn[15] -= 2;
 14028:     case 0b101_000:  //(d16,A0)
 14029:     case 0b101_001:  //(d16,A1)
 14030:     case 0b101_010:  //(d16,A2)
 14031:     case 0b101_011:  //(d16,A3)
 14032:     case 0b101_100:  //(d16,A4)
 14033:     case 0b101_101:  //(d16,A5)
 14034:     case 0b101_110:  //(d16,A6)
 14035:     case 0b101_111:  //(d16,A7)
 14036:       XEiJ.mpuCycleCount += 8;
 14037:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14038:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14039:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14040:       } else {
 14041:         t = XEiJ.regPC;
 14042:         XEiJ.regPC = t + 2;
 14043:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14044:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14045:       }
 14046:     case 0b110_000:  //(d8,A0,Rn.wl)
 14047:     case 0b110_001:  //(d8,A1,Rn.wl)
 14048:     case 0b110_010:  //(d8,A2,Rn.wl)
 14049:     case 0b110_011:  //(d8,A3,Rn.wl)
 14050:     case 0b110_100:  //(d8,A4,Rn.wl)
 14051:     case 0b110_101:  //(d8,A5,Rn.wl)
 14052:     case 0b110_110:  //(d8,A6,Rn.wl)
 14053:     case 0b110_111:  //(d8,A7,Rn.wl)
 14054:       XEiJ.mpuCycleCount += 10;
 14055:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14056:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14057:       } else {
 14058:         w = XEiJ.regPC;
 14059:         XEiJ.regPC = w + 2;
 14060:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14061:       }
 14062:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14063:               + (byte) w  //バイトディスプレースメント
 14064:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14065:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14066:     case 0b111_000:  //(xxx).W
 14067:       XEiJ.mpuCycleCount += 8;
 14068:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14069:     case 0b111_001:  //(xxx).L
 14070:       XEiJ.mpuCycleCount += 12;
 14071:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14072:     case 0b111_010:  //(d16,PC)
 14073:       XEiJ.mpuCycleCount += 8;
 14074:       t = XEiJ.regPC;
 14075:       XEiJ.regPC = t + 2;
 14076:       return (t  //ベースレジスタ
 14077:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14078:     case 0b111_011:  //(d8,PC,Rn.wl)
 14079:       XEiJ.mpuCycleCount += 10;
 14080:       t = XEiJ.regPC;
 14081:       XEiJ.regPC = t + 2;
 14082:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14083:       return (t  //ベースレジスタ
 14084:               + (byte) w  //バイトディスプレースメント
 14085:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14086:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14087:     case 0b111_100:  //#<data>
 14088:       XEiJ.mpuCycleCount += 4;
 14089:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14090:         return (XEiJ.regPC += 2) - 1;  //下位バイト
 14091:       } else {
 14092:         t = XEiJ.regPC;
 14093:         XEiJ.regPC = t + 2;
 14094:         return t + 1;  //下位バイト
 14095:       }
 14096:     }  //switch
 14097:     XEiJ.mpuCycleCount += 34;
 14098:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14099:     throw M68kException.m6eSignal;
 14100:   }  //efaAnyByte
 14101: 
 14102:   //a = efaMemByte (ea)  //|  M+-WXZP |
 14103:   //  メモリモードのバイトオペランドの実効アドレスを求める
 14104:   //  efaAnyByteとの違いは#<data>がないこと
 14105:   @SuppressWarnings ("fallthrough") public static int efaMemByte (int ea) throws M68kException {
 14106:     int t, w;
 14107:     switch (ea) {
 14108:     case 0b010_000:  //(A0)
 14109:       if (XEiJ.EFA_SEPARATE_AR) {
 14110:         XEiJ.mpuCycleCount += 4;
 14111:         return XEiJ.regRn[ 8];
 14112:       }
 14113:       //fallthrough
 14114:     case 0b010_001:  //(A1)
 14115:       if (XEiJ.EFA_SEPARATE_AR) {
 14116:         XEiJ.mpuCycleCount += 4;
 14117:         return XEiJ.regRn[ 9];
 14118:       }
 14119:       //fallthrough
 14120:     case 0b010_010:  //(A2)
 14121:       if (XEiJ.EFA_SEPARATE_AR) {
 14122:         XEiJ.mpuCycleCount += 4;
 14123:         return XEiJ.regRn[10];
 14124:       }
 14125:       //fallthrough
 14126:     case 0b010_011:  //(A3)
 14127:       if (XEiJ.EFA_SEPARATE_AR) {
 14128:         XEiJ.mpuCycleCount += 4;
 14129:         return XEiJ.regRn[11];
 14130:       }
 14131:       //fallthrough
 14132:     case 0b010_100:  //(A4)
 14133:       if (XEiJ.EFA_SEPARATE_AR) {
 14134:         XEiJ.mpuCycleCount += 4;
 14135:         return XEiJ.regRn[12];
 14136:       }
 14137:       //fallthrough
 14138:     case 0b010_101:  //(A5)
 14139:       if (XEiJ.EFA_SEPARATE_AR) {
 14140:         XEiJ.mpuCycleCount += 4;
 14141:         return XEiJ.regRn[13];
 14142:       }
 14143:       //fallthrough
 14144:     case 0b010_110:  //(A6)
 14145:       if (XEiJ.EFA_SEPARATE_AR) {
 14146:         XEiJ.mpuCycleCount += 4;
 14147:         return XEiJ.regRn[14];
 14148:       }
 14149:       //fallthrough
 14150:     case 0b010_111:  //(A7)
 14151:       if (XEiJ.EFA_SEPARATE_AR) {
 14152:         XEiJ.mpuCycleCount += 4;
 14153:         return XEiJ.regRn[15];
 14154:       } else {
 14155:         XEiJ.mpuCycleCount += 4;
 14156:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14157:       }
 14158:     case 0b011_000:  //(A0)+
 14159:       if (XEiJ.EFA_SEPARATE_AR) {
 14160:         XEiJ.mpuCycleCount += 4;
 14161:         return XEiJ.regRn[ 8]++;
 14162:       }
 14163:       //fallthrough
 14164:     case 0b011_001:  //(A1)+
 14165:       if (XEiJ.EFA_SEPARATE_AR) {
 14166:         XEiJ.mpuCycleCount += 4;
 14167:         return XEiJ.regRn[ 9]++;
 14168:       }
 14169:       //fallthrough
 14170:     case 0b011_010:  //(A2)+
 14171:       if (XEiJ.EFA_SEPARATE_AR) {
 14172:         XEiJ.mpuCycleCount += 4;
 14173:         return XEiJ.regRn[10]++;
 14174:       }
 14175:       //fallthrough
 14176:     case 0b011_011:  //(A3)+
 14177:       if (XEiJ.EFA_SEPARATE_AR) {
 14178:         XEiJ.mpuCycleCount += 4;
 14179:         return XEiJ.regRn[11]++;
 14180:       }
 14181:       //fallthrough
 14182:     case 0b011_100:  //(A4)+
 14183:       if (XEiJ.EFA_SEPARATE_AR) {
 14184:         XEiJ.mpuCycleCount += 4;
 14185:         return XEiJ.regRn[12]++;
 14186:       }
 14187:       //fallthrough
 14188:     case 0b011_101:  //(A5)+
 14189:       if (XEiJ.EFA_SEPARATE_AR) {
 14190:         XEiJ.mpuCycleCount += 4;
 14191:         return XEiJ.regRn[13]++;
 14192:       }
 14193:       //fallthrough
 14194:     case 0b011_110:  //(A6)+
 14195:       if (XEiJ.EFA_SEPARATE_AR) {
 14196:         XEiJ.mpuCycleCount += 4;
 14197:         return XEiJ.regRn[14]++;
 14198:       } else {
 14199:         XEiJ.mpuCycleCount += 4;
 14200:         return XEiJ.regRn[ea - (0b011_000 - 8)]++;
 14201:       }
 14202:     case 0b011_111:  //(A7)+
 14203:       XEiJ.mpuCycleCount += 4;
 14204:       return (XEiJ.regRn[15] += 2) - 2;
 14205:     case 0b100_000:  //-(A0)
 14206:       if (XEiJ.EFA_SEPARATE_AR) {
 14207:         XEiJ.mpuCycleCount += 6;
 14208:         return --XEiJ.regRn[ 8];
 14209:       }
 14210:       //fallthrough
 14211:     case 0b100_001:  //-(A1)
 14212:       if (XEiJ.EFA_SEPARATE_AR) {
 14213:         XEiJ.mpuCycleCount += 6;
 14214:         return --XEiJ.regRn[ 9];
 14215:       }
 14216:       //fallthrough
 14217:     case 0b100_010:  //-(A2)
 14218:       if (XEiJ.EFA_SEPARATE_AR) {
 14219:         XEiJ.mpuCycleCount += 6;
 14220:         return --XEiJ.regRn[10];
 14221:       }
 14222:       //fallthrough
 14223:     case 0b100_011:  //-(A3)
 14224:       if (XEiJ.EFA_SEPARATE_AR) {
 14225:         XEiJ.mpuCycleCount += 6;
 14226:         return --XEiJ.regRn[11];
 14227:       }
 14228:       //fallthrough
 14229:     case 0b100_100:  //-(A4)
 14230:       if (XEiJ.EFA_SEPARATE_AR) {
 14231:         XEiJ.mpuCycleCount += 6;
 14232:         return --XEiJ.regRn[12];
 14233:       }
 14234:       //fallthrough
 14235:     case 0b100_101:  //-(A5)
 14236:       if (XEiJ.EFA_SEPARATE_AR) {
 14237:         XEiJ.mpuCycleCount += 6;
 14238:         return --XEiJ.regRn[13];
 14239:       }
 14240:       //fallthrough
 14241:     case 0b100_110:  //-(A6)
 14242:       if (XEiJ.EFA_SEPARATE_AR) {
 14243:         XEiJ.mpuCycleCount += 6;
 14244:         return --XEiJ.regRn[14];
 14245:       } else {
 14246:         XEiJ.mpuCycleCount += 6;
 14247:         return --XEiJ.regRn[ea - (0b100_000 - 8)];
 14248:       }
 14249:     case 0b100_111:  //-(A7)
 14250:       XEiJ.mpuCycleCount += 6;
 14251:       return XEiJ.regRn[15] -= 2;
 14252:     case 0b101_000:  //(d16,A0)
 14253:     case 0b101_001:  //(d16,A1)
 14254:     case 0b101_010:  //(d16,A2)
 14255:     case 0b101_011:  //(d16,A3)
 14256:     case 0b101_100:  //(d16,A4)
 14257:     case 0b101_101:  //(d16,A5)
 14258:     case 0b101_110:  //(d16,A6)
 14259:     case 0b101_111:  //(d16,A7)
 14260:       XEiJ.mpuCycleCount += 8;
 14261:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14262:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14263:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14264:       } else {
 14265:         t = XEiJ.regPC;
 14266:         XEiJ.regPC = t + 2;
 14267:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14268:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14269:       }
 14270:     case 0b110_000:  //(d8,A0,Rn.wl)
 14271:     case 0b110_001:  //(d8,A1,Rn.wl)
 14272:     case 0b110_010:  //(d8,A2,Rn.wl)
 14273:     case 0b110_011:  //(d8,A3,Rn.wl)
 14274:     case 0b110_100:  //(d8,A4,Rn.wl)
 14275:     case 0b110_101:  //(d8,A5,Rn.wl)
 14276:     case 0b110_110:  //(d8,A6,Rn.wl)
 14277:     case 0b110_111:  //(d8,A7,Rn.wl)
 14278:       XEiJ.mpuCycleCount += 10;
 14279:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14280:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14281:       } else {
 14282:         w = XEiJ.regPC;
 14283:         XEiJ.regPC = w + 2;
 14284:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14285:       }
 14286:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14287:               + (byte) w  //バイトディスプレースメント
 14288:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14289:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14290:     case 0b111_000:  //(xxx).W
 14291:       XEiJ.mpuCycleCount += 8;
 14292:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14293:     case 0b111_001:  //(xxx).L
 14294:       XEiJ.mpuCycleCount += 12;
 14295:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14296:     case 0b111_010:  //(d16,PC)
 14297:       XEiJ.mpuCycleCount += 8;
 14298:       t = XEiJ.regPC;
 14299:       XEiJ.regPC = t + 2;
 14300:       return (t  //ベースレジスタ
 14301:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14302:     case 0b111_011:  //(d8,PC,Rn.wl)
 14303:       XEiJ.mpuCycleCount += 10;
 14304:       t = XEiJ.regPC;
 14305:       XEiJ.regPC = t + 2;
 14306:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14307:       return (t  //ベースレジスタ
 14308:               + (byte) w  //バイトディスプレースメント
 14309:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14310:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14311:     }  //switch
 14312:     XEiJ.mpuCycleCount += 34;
 14313:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14314:     throw M68kException.m6eSignal;
 14315:   }  //efaMemByte
 14316: 
 14317:   //a = efaMltByte (ea)  //|  M+-WXZ  |
 14318:   //  メモリ可変モードのバイトオペランドの実効アドレスを求める
 14319:   //  efaMemByteとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 14320:   @SuppressWarnings ("fallthrough") public static int efaMltByte (int ea) throws M68kException {
 14321:     int t, w;
 14322:     switch (ea) {
 14323:     case 0b010_000:  //(A0)
 14324:       if (XEiJ.EFA_SEPARATE_AR) {
 14325:         XEiJ.mpuCycleCount += 4;
 14326:         return XEiJ.regRn[ 8];
 14327:       }
 14328:       //fallthrough
 14329:     case 0b010_001:  //(A1)
 14330:       if (XEiJ.EFA_SEPARATE_AR) {
 14331:         XEiJ.mpuCycleCount += 4;
 14332:         return XEiJ.regRn[ 9];
 14333:       }
 14334:       //fallthrough
 14335:     case 0b010_010:  //(A2)
 14336:       if (XEiJ.EFA_SEPARATE_AR) {
 14337:         XEiJ.mpuCycleCount += 4;
 14338:         return XEiJ.regRn[10];
 14339:       }
 14340:       //fallthrough
 14341:     case 0b010_011:  //(A3)
 14342:       if (XEiJ.EFA_SEPARATE_AR) {
 14343:         XEiJ.mpuCycleCount += 4;
 14344:         return XEiJ.regRn[11];
 14345:       }
 14346:       //fallthrough
 14347:     case 0b010_100:  //(A4)
 14348:       if (XEiJ.EFA_SEPARATE_AR) {
 14349:         XEiJ.mpuCycleCount += 4;
 14350:         return XEiJ.regRn[12];
 14351:       }
 14352:       //fallthrough
 14353:     case 0b010_101:  //(A5)
 14354:       if (XEiJ.EFA_SEPARATE_AR) {
 14355:         XEiJ.mpuCycleCount += 4;
 14356:         return XEiJ.regRn[13];
 14357:       }
 14358:       //fallthrough
 14359:     case 0b010_110:  //(A6)
 14360:       if (XEiJ.EFA_SEPARATE_AR) {
 14361:         XEiJ.mpuCycleCount += 4;
 14362:         return XEiJ.regRn[14];
 14363:       }
 14364:       //fallthrough
 14365:     case 0b010_111:  //(A7)
 14366:       if (XEiJ.EFA_SEPARATE_AR) {
 14367:         XEiJ.mpuCycleCount += 4;
 14368:         return XEiJ.regRn[15];
 14369:       } else {
 14370:         XEiJ.mpuCycleCount += 4;
 14371:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14372:       }
 14373:     case 0b011_000:  //(A0)+
 14374:       if (XEiJ.EFA_SEPARATE_AR) {
 14375:         XEiJ.mpuCycleCount += 4;
 14376:         return XEiJ.regRn[ 8]++;
 14377:       }
 14378:       //fallthrough
 14379:     case 0b011_001:  //(A1)+
 14380:       if (XEiJ.EFA_SEPARATE_AR) {
 14381:         XEiJ.mpuCycleCount += 4;
 14382:         return XEiJ.regRn[ 9]++;
 14383:       }
 14384:       //fallthrough
 14385:     case 0b011_010:  //(A2)+
 14386:       if (XEiJ.EFA_SEPARATE_AR) {
 14387:         XEiJ.mpuCycleCount += 4;
 14388:         return XEiJ.regRn[10]++;
 14389:       }
 14390:       //fallthrough
 14391:     case 0b011_011:  //(A3)+
 14392:       if (XEiJ.EFA_SEPARATE_AR) {
 14393:         XEiJ.mpuCycleCount += 4;
 14394:         return XEiJ.regRn[11]++;
 14395:       }
 14396:       //fallthrough
 14397:     case 0b011_100:  //(A4)+
 14398:       if (XEiJ.EFA_SEPARATE_AR) {
 14399:         XEiJ.mpuCycleCount += 4;
 14400:         return XEiJ.regRn[12]++;
 14401:       }
 14402:       //fallthrough
 14403:     case 0b011_101:  //(A5)+
 14404:       if (XEiJ.EFA_SEPARATE_AR) {
 14405:         XEiJ.mpuCycleCount += 4;
 14406:         return XEiJ.regRn[13]++;
 14407:       }
 14408:       //fallthrough
 14409:     case 0b011_110:  //(A6)+
 14410:       if (XEiJ.EFA_SEPARATE_AR) {
 14411:         XEiJ.mpuCycleCount += 4;
 14412:         return XEiJ.regRn[14]++;
 14413:       } else {
 14414:         XEiJ.mpuCycleCount += 4;
 14415:         return XEiJ.regRn[ea - (0b011_000 - 8)]++;
 14416:       }
 14417:     case 0b011_111:  //(A7)+
 14418:       XEiJ.mpuCycleCount += 4;
 14419:       return (XEiJ.regRn[15] += 2) - 2;
 14420:     case 0b100_000:  //-(A0)
 14421:       if (XEiJ.EFA_SEPARATE_AR) {
 14422:         XEiJ.mpuCycleCount += 6;
 14423:         return --XEiJ.regRn[ 8];
 14424:       }
 14425:       //fallthrough
 14426:     case 0b100_001:  //-(A1)
 14427:       if (XEiJ.EFA_SEPARATE_AR) {
 14428:         XEiJ.mpuCycleCount += 6;
 14429:         return --XEiJ.regRn[ 9];
 14430:       }
 14431:       //fallthrough
 14432:     case 0b100_010:  //-(A2)
 14433:       if (XEiJ.EFA_SEPARATE_AR) {
 14434:         XEiJ.mpuCycleCount += 6;
 14435:         return --XEiJ.regRn[10];
 14436:       }
 14437:       //fallthrough
 14438:     case 0b100_011:  //-(A3)
 14439:       if (XEiJ.EFA_SEPARATE_AR) {
 14440:         XEiJ.mpuCycleCount += 6;
 14441:         return --XEiJ.regRn[11];
 14442:       }
 14443:       //fallthrough
 14444:     case 0b100_100:  //-(A4)
 14445:       if (XEiJ.EFA_SEPARATE_AR) {
 14446:         XEiJ.mpuCycleCount += 6;
 14447:         return --XEiJ.regRn[12];
 14448:       }
 14449:       //fallthrough
 14450:     case 0b100_101:  //-(A5)
 14451:       if (XEiJ.EFA_SEPARATE_AR) {
 14452:         XEiJ.mpuCycleCount += 6;
 14453:         return --XEiJ.regRn[13];
 14454:       }
 14455:       //fallthrough
 14456:     case 0b100_110:  //-(A6)
 14457:       if (XEiJ.EFA_SEPARATE_AR) {
 14458:         XEiJ.mpuCycleCount += 6;
 14459:         return --XEiJ.regRn[14];
 14460:       } else {
 14461:         XEiJ.mpuCycleCount += 6;
 14462:         return --XEiJ.regRn[ea - (0b100_000 - 8)];
 14463:       }
 14464:     case 0b100_111:  //-(A7)
 14465:       XEiJ.mpuCycleCount += 6;
 14466:       return XEiJ.regRn[15] -= 2;
 14467:     case 0b101_000:  //(d16,A0)
 14468:     case 0b101_001:  //(d16,A1)
 14469:     case 0b101_010:  //(d16,A2)
 14470:     case 0b101_011:  //(d16,A3)
 14471:     case 0b101_100:  //(d16,A4)
 14472:     case 0b101_101:  //(d16,A5)
 14473:     case 0b101_110:  //(d16,A6)
 14474:     case 0b101_111:  //(d16,A7)
 14475:       XEiJ.mpuCycleCount += 8;
 14476:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14477:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14478:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14479:       } else {
 14480:         t = XEiJ.regPC;
 14481:         XEiJ.regPC = t + 2;
 14482:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14483:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14484:       }
 14485:     case 0b110_000:  //(d8,A0,Rn.wl)
 14486:     case 0b110_001:  //(d8,A1,Rn.wl)
 14487:     case 0b110_010:  //(d8,A2,Rn.wl)
 14488:     case 0b110_011:  //(d8,A3,Rn.wl)
 14489:     case 0b110_100:  //(d8,A4,Rn.wl)
 14490:     case 0b110_101:  //(d8,A5,Rn.wl)
 14491:     case 0b110_110:  //(d8,A6,Rn.wl)
 14492:     case 0b110_111:  //(d8,A7,Rn.wl)
 14493:       XEiJ.mpuCycleCount += 10;
 14494:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14495:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14496:       } else {
 14497:         w = XEiJ.regPC;
 14498:         XEiJ.regPC = w + 2;
 14499:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14500:       }
 14501:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14502:               + (byte) w  //バイトディスプレースメント
 14503:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14504:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14505:     case 0b111_000:  //(xxx).W
 14506:       XEiJ.mpuCycleCount += 8;
 14507:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14508:     case 0b111_001:  //(xxx).L
 14509:       XEiJ.mpuCycleCount += 12;
 14510:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14511:     }  //switch
 14512:     XEiJ.mpuCycleCount += 34;
 14513:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14514:     throw M68kException.m6eSignal;
 14515:   }  //efaMltByte
 14516: 
 14517:   //a = efaCntByte (ea)  //|  M  WXZP |
 14518:   //  制御モードのロングオペランドの実効アドレスを求める
 14519:   //  efaMemByteとの違いは(Ar)+と-(Ar)がないこと
 14520:   @SuppressWarnings ("fallthrough") public static int efaCntByte (int ea) throws M68kException {
 14521:     int t, w;
 14522:     switch (ea) {
 14523:     case 0b010_000:  //(A0)
 14524:       if (XEiJ.EFA_SEPARATE_AR) {
 14525:         XEiJ.mpuCycleCount += 4;
 14526:         return XEiJ.regRn[ 8];
 14527:       }
 14528:       //fallthrough
 14529:     case 0b010_001:  //(A1)
 14530:       if (XEiJ.EFA_SEPARATE_AR) {
 14531:         XEiJ.mpuCycleCount += 4;
 14532:         return XEiJ.regRn[ 9];
 14533:       }
 14534:       //fallthrough
 14535:     case 0b010_010:  //(A2)
 14536:       if (XEiJ.EFA_SEPARATE_AR) {
 14537:         XEiJ.mpuCycleCount += 4;
 14538:         return XEiJ.regRn[10];
 14539:       }
 14540:       //fallthrough
 14541:     case 0b010_011:  //(A3)
 14542:       if (XEiJ.EFA_SEPARATE_AR) {
 14543:         XEiJ.mpuCycleCount += 4;
 14544:         return XEiJ.regRn[11];
 14545:       }
 14546:       //fallthrough
 14547:     case 0b010_100:  //(A4)
 14548:       if (XEiJ.EFA_SEPARATE_AR) {
 14549:         XEiJ.mpuCycleCount += 4;
 14550:         return XEiJ.regRn[12];
 14551:       }
 14552:       //fallthrough
 14553:     case 0b010_101:  //(A5)
 14554:       if (XEiJ.EFA_SEPARATE_AR) {
 14555:         XEiJ.mpuCycleCount += 4;
 14556:         return XEiJ.regRn[13];
 14557:       }
 14558:       //fallthrough
 14559:     case 0b010_110:  //(A6)
 14560:       if (XEiJ.EFA_SEPARATE_AR) {
 14561:         XEiJ.mpuCycleCount += 4;
 14562:         return XEiJ.regRn[14];
 14563:       }
 14564:       //fallthrough
 14565:     case 0b010_111:  //(A7)
 14566:       if (XEiJ.EFA_SEPARATE_AR) {
 14567:         XEiJ.mpuCycleCount += 4;
 14568:         return XEiJ.regRn[15];
 14569:       } else {
 14570:         XEiJ.mpuCycleCount += 4;
 14571:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14572:       }
 14573:     case 0b101_000:  //(d16,A0)
 14574:     case 0b101_001:  //(d16,A1)
 14575:     case 0b101_010:  //(d16,A2)
 14576:     case 0b101_011:  //(d16,A3)
 14577:     case 0b101_100:  //(d16,A4)
 14578:     case 0b101_101:  //(d16,A5)
 14579:     case 0b101_110:  //(d16,A6)
 14580:     case 0b101_111:  //(d16,A7)
 14581:       XEiJ.mpuCycleCount += 8;
 14582:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14583:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14584:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14585:       } else {
 14586:         t = XEiJ.regPC;
 14587:         XEiJ.regPC = t + 2;
 14588:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14589:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14590:       }
 14591:     case 0b110_000:  //(d8,A0,Rn.wl)
 14592:     case 0b110_001:  //(d8,A1,Rn.wl)
 14593:     case 0b110_010:  //(d8,A2,Rn.wl)
 14594:     case 0b110_011:  //(d8,A3,Rn.wl)
 14595:     case 0b110_100:  //(d8,A4,Rn.wl)
 14596:     case 0b110_101:  //(d8,A5,Rn.wl)
 14597:     case 0b110_110:  //(d8,A6,Rn.wl)
 14598:     case 0b110_111:  //(d8,A7,Rn.wl)
 14599:       XEiJ.mpuCycleCount += 10;
 14600:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14601:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14602:       } else {
 14603:         w = XEiJ.regPC;
 14604:         XEiJ.regPC = w + 2;
 14605:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14606:       }
 14607:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14608:               + (byte) w  //バイトディスプレースメント
 14609:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14610:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14611:     case 0b111_000:  //(xxx).W
 14612:       XEiJ.mpuCycleCount += 8;
 14613:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14614:     case 0b111_001:  //(xxx).L
 14615:       XEiJ.mpuCycleCount += 12;
 14616:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14617:     case 0b111_010:  //(d16,PC)
 14618:       XEiJ.mpuCycleCount += 8;
 14619:       t = XEiJ.regPC;
 14620:       XEiJ.regPC = t + 2;
 14621:       return (t  //ベースレジスタ
 14622:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14623:     case 0b111_011:  //(d8,PC,Rn.wl)
 14624:       XEiJ.mpuCycleCount += 10;
 14625:       t = XEiJ.regPC;
 14626:       XEiJ.regPC = t + 2;
 14627:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14628:       return (t  //ベースレジスタ
 14629:               + (byte) w  //バイトディスプレースメント
 14630:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14631:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14632:     }  //switch
 14633:     XEiJ.mpuCycleCount += 34;
 14634:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14635:     throw M68kException.m6eSignal;
 14636:   }  //efaCntByte
 14637: 
 14638:   //a = efaAnyWord (ea)  //|  M+-WXZPI|
 14639:   //  任意のモードのワードオペランドの実効アドレスを求める
 14640:   //  efaAnyByteとの違いは(Ar)+と-(Ar)がArを2変化させることと、(A7)+と-(A7)と#<data>の特別な動作がないこと
 14641:   @SuppressWarnings ("fallthrough") public static int efaAnyWord (int ea) throws M68kException {
 14642:     int t, w;
 14643:     switch (ea) {
 14644:     case 0b010_000:  //(A0)
 14645:       if (XEiJ.EFA_SEPARATE_AR) {
 14646:         XEiJ.mpuCycleCount += 4;
 14647:         return XEiJ.regRn[ 8];
 14648:       }
 14649:       //fallthrough
 14650:     case 0b010_001:  //(A1)
 14651:       if (XEiJ.EFA_SEPARATE_AR) {
 14652:         XEiJ.mpuCycleCount += 4;
 14653:         return XEiJ.regRn[ 9];
 14654:       }
 14655:       //fallthrough
 14656:     case 0b010_010:  //(A2)
 14657:       if (XEiJ.EFA_SEPARATE_AR) {
 14658:         XEiJ.mpuCycleCount += 4;
 14659:         return XEiJ.regRn[10];
 14660:       }
 14661:       //fallthrough
 14662:     case 0b010_011:  //(A3)
 14663:       if (XEiJ.EFA_SEPARATE_AR) {
 14664:         XEiJ.mpuCycleCount += 4;
 14665:         return XEiJ.regRn[11];
 14666:       }
 14667:       //fallthrough
 14668:     case 0b010_100:  //(A4)
 14669:       if (XEiJ.EFA_SEPARATE_AR) {
 14670:         XEiJ.mpuCycleCount += 4;
 14671:         return XEiJ.regRn[12];
 14672:       }
 14673:       //fallthrough
 14674:     case 0b010_101:  //(A5)
 14675:       if (XEiJ.EFA_SEPARATE_AR) {
 14676:         XEiJ.mpuCycleCount += 4;
 14677:         return XEiJ.regRn[13];
 14678:       }
 14679:       //fallthrough
 14680:     case 0b010_110:  //(A6)
 14681:       if (XEiJ.EFA_SEPARATE_AR) {
 14682:         XEiJ.mpuCycleCount += 4;
 14683:         return XEiJ.regRn[14];
 14684:       }
 14685:       //fallthrough
 14686:     case 0b010_111:  //(A7)
 14687:       if (XEiJ.EFA_SEPARATE_AR) {
 14688:         XEiJ.mpuCycleCount += 4;
 14689:         return XEiJ.regRn[15];
 14690:       } else {
 14691:         XEiJ.mpuCycleCount += 4;
 14692:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14693:       }
 14694:     case 0b011_000:  //(A0)+
 14695:       if (XEiJ.EFA_SEPARATE_AR) {
 14696:         XEiJ.mpuCycleCount += 4;
 14697:         return (XEiJ.regRn[ 8] += 2) - 2;
 14698:       }
 14699:       //fallthrough
 14700:     case 0b011_001:  //(A1)+
 14701:       if (XEiJ.EFA_SEPARATE_AR) {
 14702:         XEiJ.mpuCycleCount += 4;
 14703:         return (XEiJ.regRn[ 9] += 2) - 2;
 14704:       }
 14705:       //fallthrough
 14706:     case 0b011_010:  //(A2)+
 14707:       if (XEiJ.EFA_SEPARATE_AR) {
 14708:         XEiJ.mpuCycleCount += 4;
 14709:         return (XEiJ.regRn[10] += 2) - 2;
 14710:       }
 14711:       //fallthrough
 14712:     case 0b011_011:  //(A3)+
 14713:       if (XEiJ.EFA_SEPARATE_AR) {
 14714:         XEiJ.mpuCycleCount += 4;
 14715:         return (XEiJ.regRn[11] += 2) - 2;
 14716:       }
 14717:       //fallthrough
 14718:     case 0b011_100:  //(A4)+
 14719:       if (XEiJ.EFA_SEPARATE_AR) {
 14720:         XEiJ.mpuCycleCount += 4;
 14721:         return (XEiJ.regRn[12] += 2) - 2;
 14722:       }
 14723:       //fallthrough
 14724:     case 0b011_101:  //(A5)+
 14725:       if (XEiJ.EFA_SEPARATE_AR) {
 14726:         XEiJ.mpuCycleCount += 4;
 14727:         return (XEiJ.regRn[13] += 2) - 2;
 14728:       }
 14729:       //fallthrough
 14730:     case 0b011_110:  //(A6)+
 14731:       if (XEiJ.EFA_SEPARATE_AR) {
 14732:         XEiJ.mpuCycleCount += 4;
 14733:         return (XEiJ.regRn[14] += 2) - 2;
 14734:       }
 14735:       //fallthrough
 14736:     case 0b011_111:  //(A7)+
 14737:       if (XEiJ.EFA_SEPARATE_AR) {
 14738:         XEiJ.mpuCycleCount += 4;
 14739:         return (XEiJ.regRn[15] += 2) - 2;
 14740:       } else {
 14741:         XEiJ.mpuCycleCount += 4;
 14742:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2;
 14743:       }
 14744:     case 0b100_000:  //-(A0)
 14745:       if (XEiJ.EFA_SEPARATE_AR) {
 14746:         XEiJ.mpuCycleCount += 6;
 14747:         return XEiJ.regRn[ 8] -= 2;
 14748:       }
 14749:       //fallthrough
 14750:     case 0b100_001:  //-(A1)
 14751:       if (XEiJ.EFA_SEPARATE_AR) {
 14752:         XEiJ.mpuCycleCount += 6;
 14753:         return XEiJ.regRn[ 9] -= 2;
 14754:       }
 14755:       //fallthrough
 14756:     case 0b100_010:  //-(A2)
 14757:       if (XEiJ.EFA_SEPARATE_AR) {
 14758:         XEiJ.mpuCycleCount += 6;
 14759:         return XEiJ.regRn[10] -= 2;
 14760:       }
 14761:       //fallthrough
 14762:     case 0b100_011:  //-(A3)
 14763:       if (XEiJ.EFA_SEPARATE_AR) {
 14764:         XEiJ.mpuCycleCount += 6;
 14765:         return XEiJ.regRn[11] -= 2;
 14766:       }
 14767:       //fallthrough
 14768:     case 0b100_100:  //-(A4)
 14769:       if (XEiJ.EFA_SEPARATE_AR) {
 14770:         XEiJ.mpuCycleCount += 6;
 14771:         return XEiJ.regRn[12] -= 2;
 14772:       }
 14773:       //fallthrough
 14774:     case 0b100_101:  //-(A5)
 14775:       if (XEiJ.EFA_SEPARATE_AR) {
 14776:         XEiJ.mpuCycleCount += 6;
 14777:         return XEiJ.regRn[13] -= 2;
 14778:       }
 14779:       //fallthrough
 14780:     case 0b100_110:  //-(A6)
 14781:       if (XEiJ.EFA_SEPARATE_AR) {
 14782:         XEiJ.mpuCycleCount += 6;
 14783:         return XEiJ.regRn[14] -= 2;
 14784:       }
 14785:       //fallthrough
 14786:     case 0b100_111:  //-(A7)
 14787:       if (XEiJ.EFA_SEPARATE_AR) {
 14788:         XEiJ.mpuCycleCount += 6;
 14789:         return XEiJ.regRn[15] -= 2;
 14790:       } else {
 14791:         XEiJ.mpuCycleCount += 6;
 14792:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2;
 14793:       }
 14794:     case 0b101_000:  //(d16,A0)
 14795:     case 0b101_001:  //(d16,A1)
 14796:     case 0b101_010:  //(d16,A2)
 14797:     case 0b101_011:  //(d16,A3)
 14798:     case 0b101_100:  //(d16,A4)
 14799:     case 0b101_101:  //(d16,A5)
 14800:     case 0b101_110:  //(d16,A6)
 14801:     case 0b101_111:  //(d16,A7)
 14802:       XEiJ.mpuCycleCount += 8;
 14803:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14804:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14805:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14806:       } else {
 14807:         t = XEiJ.regPC;
 14808:         XEiJ.regPC = t + 2;
 14809:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14810:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14811:       }
 14812:     case 0b110_000:  //(d8,A0,Rn.wl)
 14813:     case 0b110_001:  //(d8,A1,Rn.wl)
 14814:     case 0b110_010:  //(d8,A2,Rn.wl)
 14815:     case 0b110_011:  //(d8,A3,Rn.wl)
 14816:     case 0b110_100:  //(d8,A4,Rn.wl)
 14817:     case 0b110_101:  //(d8,A5,Rn.wl)
 14818:     case 0b110_110:  //(d8,A6,Rn.wl)
 14819:     case 0b110_111:  //(d8,A7,Rn.wl)
 14820:       XEiJ.mpuCycleCount += 10;
 14821:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14822:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14823:       } else {
 14824:         w = XEiJ.regPC;
 14825:         XEiJ.regPC = w + 2;
 14826:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14827:       }
 14828:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14829:               + (byte) w  //バイトディスプレースメント
 14830:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14831:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14832:     case 0b111_000:  //(xxx).W
 14833:       XEiJ.mpuCycleCount += 8;
 14834:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14835:     case 0b111_001:  //(xxx).L
 14836:       XEiJ.mpuCycleCount += 12;
 14837:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14838:     case 0b111_010:  //(d16,PC)
 14839:       XEiJ.mpuCycleCount += 8;
 14840:       t = XEiJ.regPC;
 14841:       XEiJ.regPC = t + 2;
 14842:       return (t  //ベースレジスタ
 14843:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14844:     case 0b111_011:  //(d8,PC,Rn.wl)
 14845:       XEiJ.mpuCycleCount += 10;
 14846:       t = XEiJ.regPC;
 14847:       XEiJ.regPC = t + 2;
 14848:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14849:       return (t  //ベースレジスタ
 14850:               + (byte) w  //バイトディスプレースメント
 14851:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14852:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14853:     case 0b111_100:  //#<data>
 14854:       XEiJ.mpuCycleCount += 4;
 14855:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14856:         return (XEiJ.regPC += 2) - 2;
 14857:       } else {
 14858:         t = XEiJ.regPC;
 14859:         XEiJ.regPC = t + 2;
 14860:         return t;
 14861:       }
 14862:     }  //switch
 14863:     XEiJ.mpuCycleCount += 34;
 14864:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14865:     throw M68kException.m6eSignal;
 14866:   }  //efaAnyWord
 14867: 
 14868:   //a = efaMemWord (ea)  //|  M+-WXZP |
 14869:   //  メモリモードのワードオペランドの実効アドレスを求める
 14870:   //  efaAnyWordとの違いは#<data>がないこと
 14871:   @SuppressWarnings ("fallthrough") public static int efaMemWord (int ea) throws M68kException {
 14872:     int t, w;
 14873:     switch (ea) {
 14874:     case 0b010_000:  //(A0)
 14875:       if (XEiJ.EFA_SEPARATE_AR) {
 14876:         XEiJ.mpuCycleCount += 4;
 14877:         return XEiJ.regRn[ 8];
 14878:       }
 14879:       //fallthrough
 14880:     case 0b010_001:  //(A1)
 14881:       if (XEiJ.EFA_SEPARATE_AR) {
 14882:         XEiJ.mpuCycleCount += 4;
 14883:         return XEiJ.regRn[ 9];
 14884:       }
 14885:       //fallthrough
 14886:     case 0b010_010:  //(A2)
 14887:       if (XEiJ.EFA_SEPARATE_AR) {
 14888:         XEiJ.mpuCycleCount += 4;
 14889:         return XEiJ.regRn[10];
 14890:       }
 14891:       //fallthrough
 14892:     case 0b010_011:  //(A3)
 14893:       if (XEiJ.EFA_SEPARATE_AR) {
 14894:         XEiJ.mpuCycleCount += 4;
 14895:         return XEiJ.regRn[11];
 14896:       }
 14897:       //fallthrough
 14898:     case 0b010_100:  //(A4)
 14899:       if (XEiJ.EFA_SEPARATE_AR) {
 14900:         XEiJ.mpuCycleCount += 4;
 14901:         return XEiJ.regRn[12];
 14902:       }
 14903:       //fallthrough
 14904:     case 0b010_101:  //(A5)
 14905:       if (XEiJ.EFA_SEPARATE_AR) {
 14906:         XEiJ.mpuCycleCount += 4;
 14907:         return XEiJ.regRn[13];
 14908:       }
 14909:       //fallthrough
 14910:     case 0b010_110:  //(A6)
 14911:       if (XEiJ.EFA_SEPARATE_AR) {
 14912:         XEiJ.mpuCycleCount += 4;
 14913:         return XEiJ.regRn[14];
 14914:       }
 14915:       //fallthrough
 14916:     case 0b010_111:  //(A7)
 14917:       if (XEiJ.EFA_SEPARATE_AR) {
 14918:         XEiJ.mpuCycleCount += 4;
 14919:         return XEiJ.regRn[15];
 14920:       } else {
 14921:         XEiJ.mpuCycleCount += 4;
 14922:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14923:       }
 14924:     case 0b011_000:  //(A0)+
 14925:       if (XEiJ.EFA_SEPARATE_AR) {
 14926:         XEiJ.mpuCycleCount += 4;
 14927:         return (XEiJ.regRn[ 8] += 2) - 2;
 14928:       }
 14929:       //fallthrough
 14930:     case 0b011_001:  //(A1)+
 14931:       if (XEiJ.EFA_SEPARATE_AR) {
 14932:         XEiJ.mpuCycleCount += 4;
 14933:         return (XEiJ.regRn[ 9] += 2) - 2;
 14934:       }
 14935:       //fallthrough
 14936:     case 0b011_010:  //(A2)+
 14937:       if (XEiJ.EFA_SEPARATE_AR) {
 14938:         XEiJ.mpuCycleCount += 4;
 14939:         return (XEiJ.regRn[10] += 2) - 2;
 14940:       }
 14941:       //fallthrough
 14942:     case 0b011_011:  //(A3)+
 14943:       if (XEiJ.EFA_SEPARATE_AR) {
 14944:         XEiJ.mpuCycleCount += 4;
 14945:         return (XEiJ.regRn[11] += 2) - 2;
 14946:       }
 14947:       //fallthrough
 14948:     case 0b011_100:  //(A4)+
 14949:       if (XEiJ.EFA_SEPARATE_AR) {
 14950:         XEiJ.mpuCycleCount += 4;
 14951:         return (XEiJ.regRn[12] += 2) - 2;
 14952:       }
 14953:       //fallthrough
 14954:     case 0b011_101:  //(A5)+
 14955:       if (XEiJ.EFA_SEPARATE_AR) {
 14956:         XEiJ.mpuCycleCount += 4;
 14957:         return (XEiJ.regRn[13] += 2) - 2;
 14958:       }
 14959:       //fallthrough
 14960:     case 0b011_110:  //(A6)+
 14961:       if (XEiJ.EFA_SEPARATE_AR) {
 14962:         XEiJ.mpuCycleCount += 4;
 14963:         return (XEiJ.regRn[14] += 2) - 2;
 14964:       }
 14965:       //fallthrough
 14966:     case 0b011_111:  //(A7)+
 14967:       if (XEiJ.EFA_SEPARATE_AR) {
 14968:         XEiJ.mpuCycleCount += 4;
 14969:         return (XEiJ.regRn[15] += 2) - 2;
 14970:       } else {
 14971:         XEiJ.mpuCycleCount += 4;
 14972:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2;
 14973:       }
 14974:     case 0b100_000:  //-(A0)
 14975:       if (XEiJ.EFA_SEPARATE_AR) {
 14976:         XEiJ.mpuCycleCount += 6;
 14977:         return XEiJ.regRn[ 8] -= 2;
 14978:       }
 14979:       //fallthrough
 14980:     case 0b100_001:  //-(A1)
 14981:       if (XEiJ.EFA_SEPARATE_AR) {
 14982:         XEiJ.mpuCycleCount += 6;
 14983:         return XEiJ.regRn[ 9] -= 2;
 14984:       }
 14985:       //fallthrough
 14986:     case 0b100_010:  //-(A2)
 14987:       if (XEiJ.EFA_SEPARATE_AR) {
 14988:         XEiJ.mpuCycleCount += 6;
 14989:         return XEiJ.regRn[10] -= 2;
 14990:       }
 14991:       //fallthrough
 14992:     case 0b100_011:  //-(A3)
 14993:       if (XEiJ.EFA_SEPARATE_AR) {
 14994:         XEiJ.mpuCycleCount += 6;
 14995:         return XEiJ.regRn[11] -= 2;
 14996:       }
 14997:       //fallthrough
 14998:     case 0b100_100:  //-(A4)
 14999:       if (XEiJ.EFA_SEPARATE_AR) {
 15000:         XEiJ.mpuCycleCount += 6;
 15001:         return XEiJ.regRn[12] -= 2;
 15002:       }
 15003:       //fallthrough
 15004:     case 0b100_101:  //-(A5)
 15005:       if (XEiJ.EFA_SEPARATE_AR) {
 15006:         XEiJ.mpuCycleCount += 6;
 15007:         return XEiJ.regRn[13] -= 2;
 15008:       }
 15009:       //fallthrough
 15010:     case 0b100_110:  //-(A6)
 15011:       if (XEiJ.EFA_SEPARATE_AR) {
 15012:         XEiJ.mpuCycleCount += 6;
 15013:         return XEiJ.regRn[14] -= 2;
 15014:       }
 15015:       //fallthrough
 15016:     case 0b100_111:  //-(A7)
 15017:       if (XEiJ.EFA_SEPARATE_AR) {
 15018:         XEiJ.mpuCycleCount += 6;
 15019:         return XEiJ.regRn[15] -= 2;
 15020:       } else {
 15021:         XEiJ.mpuCycleCount += 6;
 15022:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2;
 15023:       }
 15024:     case 0b101_000:  //(d16,A0)
 15025:     case 0b101_001:  //(d16,A1)
 15026:     case 0b101_010:  //(d16,A2)
 15027:     case 0b101_011:  //(d16,A3)
 15028:     case 0b101_100:  //(d16,A4)
 15029:     case 0b101_101:  //(d16,A5)
 15030:     case 0b101_110:  //(d16,A6)
 15031:     case 0b101_111:  //(d16,A7)
 15032:       XEiJ.mpuCycleCount += 8;
 15033:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15034:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15035:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15036:       } else {
 15037:         t = XEiJ.regPC;
 15038:         XEiJ.regPC = t + 2;
 15039:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15040:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15041:       }
 15042:     case 0b110_000:  //(d8,A0,Rn.wl)
 15043:     case 0b110_001:  //(d8,A1,Rn.wl)
 15044:     case 0b110_010:  //(d8,A2,Rn.wl)
 15045:     case 0b110_011:  //(d8,A3,Rn.wl)
 15046:     case 0b110_100:  //(d8,A4,Rn.wl)
 15047:     case 0b110_101:  //(d8,A5,Rn.wl)
 15048:     case 0b110_110:  //(d8,A6,Rn.wl)
 15049:     case 0b110_111:  //(d8,A7,Rn.wl)
 15050:       XEiJ.mpuCycleCount += 10;
 15051:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15052:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15053:       } else {
 15054:         w = XEiJ.regPC;
 15055:         XEiJ.regPC = w + 2;
 15056:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15057:       }
 15058:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15059:               + (byte) w  //バイトディスプレースメント
 15060:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15061:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15062:     case 0b111_000:  //(xxx).W
 15063:       XEiJ.mpuCycleCount += 8;
 15064:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15065:     case 0b111_001:  //(xxx).L
 15066:       XEiJ.mpuCycleCount += 12;
 15067:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15068:     case 0b111_010:  //(d16,PC)
 15069:       XEiJ.mpuCycleCount += 8;
 15070:       t = XEiJ.regPC;
 15071:       XEiJ.regPC = t + 2;
 15072:       return (t  //ベースレジスタ
 15073:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15074:     case 0b111_011:  //(d8,PC,Rn.wl)
 15075:       XEiJ.mpuCycleCount += 10;
 15076:       t = XEiJ.regPC;
 15077:       XEiJ.regPC = t + 2;
 15078:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15079:       return (t  //ベースレジスタ
 15080:               + (byte) w  //バイトディスプレースメント
 15081:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15082:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15083:     }  //switch
 15084:     XEiJ.mpuCycleCount += 34;
 15085:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15086:     throw M68kException.m6eSignal;
 15087:   }  //efaMemWord
 15088: 
 15089:   //a = efaMltWord (ea)  //|  M+-WXZ  |
 15090:   //  メモリ可変モードのワードオペランドの実効アドレスを求める
 15091:   //  efaMemWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 15092:   @SuppressWarnings ("fallthrough") public static int efaMltWord (int ea) throws M68kException {
 15093:     int t, w;
 15094:     switch (ea) {
 15095:     case 0b010_000:  //(A0)
 15096:       if (XEiJ.EFA_SEPARATE_AR) {
 15097:         XEiJ.mpuCycleCount += 4;
 15098:         return XEiJ.regRn[ 8];
 15099:       }
 15100:       //fallthrough
 15101:     case 0b010_001:  //(A1)
 15102:       if (XEiJ.EFA_SEPARATE_AR) {
 15103:         XEiJ.mpuCycleCount += 4;
 15104:         return XEiJ.regRn[ 9];
 15105:       }
 15106:       //fallthrough
 15107:     case 0b010_010:  //(A2)
 15108:       if (XEiJ.EFA_SEPARATE_AR) {
 15109:         XEiJ.mpuCycleCount += 4;
 15110:         return XEiJ.regRn[10];
 15111:       }
 15112:       //fallthrough
 15113:     case 0b010_011:  //(A3)
 15114:       if (XEiJ.EFA_SEPARATE_AR) {
 15115:         XEiJ.mpuCycleCount += 4;
 15116:         return XEiJ.regRn[11];
 15117:       }
 15118:       //fallthrough
 15119:     case 0b010_100:  //(A4)
 15120:       if (XEiJ.EFA_SEPARATE_AR) {
 15121:         XEiJ.mpuCycleCount += 4;
 15122:         return XEiJ.regRn[12];
 15123:       }
 15124:       //fallthrough
 15125:     case 0b010_101:  //(A5)
 15126:       if (XEiJ.EFA_SEPARATE_AR) {
 15127:         XEiJ.mpuCycleCount += 4;
 15128:         return XEiJ.regRn[13];
 15129:       }
 15130:       //fallthrough
 15131:     case 0b010_110:  //(A6)
 15132:       if (XEiJ.EFA_SEPARATE_AR) {
 15133:         XEiJ.mpuCycleCount += 4;
 15134:         return XEiJ.regRn[14];
 15135:       }
 15136:       //fallthrough
 15137:     case 0b010_111:  //(A7)
 15138:       if (XEiJ.EFA_SEPARATE_AR) {
 15139:         XEiJ.mpuCycleCount += 4;
 15140:         return XEiJ.regRn[15];
 15141:       } else {
 15142:         XEiJ.mpuCycleCount += 4;
 15143:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15144:       }
 15145:     case 0b011_000:  //(A0)+
 15146:       if (XEiJ.EFA_SEPARATE_AR) {
 15147:         XEiJ.mpuCycleCount += 4;
 15148:         return (XEiJ.regRn[ 8] += 2) - 2;
 15149:       }
 15150:       //fallthrough
 15151:     case 0b011_001:  //(A1)+
 15152:       if (XEiJ.EFA_SEPARATE_AR) {
 15153:         XEiJ.mpuCycleCount += 4;
 15154:         return (XEiJ.regRn[ 9] += 2) - 2;
 15155:       }
 15156:       //fallthrough
 15157:     case 0b011_010:  //(A2)+
 15158:       if (XEiJ.EFA_SEPARATE_AR) {
 15159:         XEiJ.mpuCycleCount += 4;
 15160:         return (XEiJ.regRn[10] += 2) - 2;
 15161:       }
 15162:       //fallthrough
 15163:     case 0b011_011:  //(A3)+
 15164:       if (XEiJ.EFA_SEPARATE_AR) {
 15165:         XEiJ.mpuCycleCount += 4;
 15166:         return (XEiJ.regRn[11] += 2) - 2;
 15167:       }
 15168:       //fallthrough
 15169:     case 0b011_100:  //(A4)+
 15170:       if (XEiJ.EFA_SEPARATE_AR) {
 15171:         XEiJ.mpuCycleCount += 4;
 15172:         return (XEiJ.regRn[12] += 2) - 2;
 15173:       }
 15174:       //fallthrough
 15175:     case 0b011_101:  //(A5)+
 15176:       if (XEiJ.EFA_SEPARATE_AR) {
 15177:         XEiJ.mpuCycleCount += 4;
 15178:         return (XEiJ.regRn[13] += 2) - 2;
 15179:       }
 15180:       //fallthrough
 15181:     case 0b011_110:  //(A6)+
 15182:       if (XEiJ.EFA_SEPARATE_AR) {
 15183:         XEiJ.mpuCycleCount += 4;
 15184:         return (XEiJ.regRn[14] += 2) - 2;
 15185:       }
 15186:       //fallthrough
 15187:     case 0b011_111:  //(A7)+
 15188:       if (XEiJ.EFA_SEPARATE_AR) {
 15189:         XEiJ.mpuCycleCount += 4;
 15190:         return (XEiJ.regRn[15] += 2) - 2;
 15191:       } else {
 15192:         XEiJ.mpuCycleCount += 4;
 15193:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2;
 15194:       }
 15195:     case 0b100_000:  //-(A0)
 15196:       if (XEiJ.EFA_SEPARATE_AR) {
 15197:         XEiJ.mpuCycleCount += 6;
 15198:         return XEiJ.regRn[ 8] -= 2;
 15199:       }
 15200:       //fallthrough
 15201:     case 0b100_001:  //-(A1)
 15202:       if (XEiJ.EFA_SEPARATE_AR) {
 15203:         XEiJ.mpuCycleCount += 6;
 15204:         return XEiJ.regRn[ 9] -= 2;
 15205:       }
 15206:       //fallthrough
 15207:     case 0b100_010:  //-(A2)
 15208:       if (XEiJ.EFA_SEPARATE_AR) {
 15209:         XEiJ.mpuCycleCount += 6;
 15210:         return XEiJ.regRn[10] -= 2;
 15211:       }
 15212:       //fallthrough
 15213:     case 0b100_011:  //-(A3)
 15214:       if (XEiJ.EFA_SEPARATE_AR) {
 15215:         XEiJ.mpuCycleCount += 6;
 15216:         return XEiJ.regRn[11] -= 2;
 15217:       }
 15218:       //fallthrough
 15219:     case 0b100_100:  //-(A4)
 15220:       if (XEiJ.EFA_SEPARATE_AR) {
 15221:         XEiJ.mpuCycleCount += 6;
 15222:         return XEiJ.regRn[12] -= 2;
 15223:       }
 15224:       //fallthrough
 15225:     case 0b100_101:  //-(A5)
 15226:       if (XEiJ.EFA_SEPARATE_AR) {
 15227:         XEiJ.mpuCycleCount += 6;
 15228:         return XEiJ.regRn[13] -= 2;
 15229:       }
 15230:       //fallthrough
 15231:     case 0b100_110:  //-(A6)
 15232:       if (XEiJ.EFA_SEPARATE_AR) {
 15233:         XEiJ.mpuCycleCount += 6;
 15234:         return XEiJ.regRn[14] -= 2;
 15235:       }
 15236:       //fallthrough
 15237:     case 0b100_111:  //-(A7)
 15238:       if (XEiJ.EFA_SEPARATE_AR) {
 15239:         XEiJ.mpuCycleCount += 6;
 15240:         return XEiJ.regRn[15] -= 2;
 15241:       } else {
 15242:         XEiJ.mpuCycleCount += 6;
 15243:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2;
 15244:       }
 15245:     case 0b101_000:  //(d16,A0)
 15246:     case 0b101_001:  //(d16,A1)
 15247:     case 0b101_010:  //(d16,A2)
 15248:     case 0b101_011:  //(d16,A3)
 15249:     case 0b101_100:  //(d16,A4)
 15250:     case 0b101_101:  //(d16,A5)
 15251:     case 0b101_110:  //(d16,A6)
 15252:     case 0b101_111:  //(d16,A7)
 15253:       XEiJ.mpuCycleCount += 8;
 15254:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15255:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15256:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15257:       } else {
 15258:         t = XEiJ.regPC;
 15259:         XEiJ.regPC = t + 2;
 15260:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15261:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15262:       }
 15263:     case 0b110_000:  //(d8,A0,Rn.wl)
 15264:     case 0b110_001:  //(d8,A1,Rn.wl)
 15265:     case 0b110_010:  //(d8,A2,Rn.wl)
 15266:     case 0b110_011:  //(d8,A3,Rn.wl)
 15267:     case 0b110_100:  //(d8,A4,Rn.wl)
 15268:     case 0b110_101:  //(d8,A5,Rn.wl)
 15269:     case 0b110_110:  //(d8,A6,Rn.wl)
 15270:     case 0b110_111:  //(d8,A7,Rn.wl)
 15271:       XEiJ.mpuCycleCount += 10;
 15272:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15273:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15274:       } else {
 15275:         w = XEiJ.regPC;
 15276:         XEiJ.regPC = w + 2;
 15277:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15278:       }
 15279:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15280:               + (byte) w  //バイトディスプレースメント
 15281:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15282:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15283:     case 0b111_000:  //(xxx).W
 15284:       XEiJ.mpuCycleCount += 8;
 15285:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15286:     case 0b111_001:  //(xxx).L
 15287:       XEiJ.mpuCycleCount += 12;
 15288:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15289:     }  //switch
 15290:     XEiJ.mpuCycleCount += 34;
 15291:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15292:     throw M68kException.m6eSignal;
 15293:   }  //efaMltWord
 15294: 
 15295:   //a = efaCntWord (ea)  //|  M  WXZP |
 15296:   //  制御モードのワードオペランドの実効アドレスを求める
 15297:   //  efaMemWordとの違いは(Ar)+と-(Ar)がないこと
 15298:   @SuppressWarnings ("fallthrough") public static int efaCntWord (int ea) throws M68kException {
 15299:     int t, w;
 15300:     switch (ea) {
 15301:     case 0b010_000:  //(A0)
 15302:       if (XEiJ.EFA_SEPARATE_AR) {
 15303:         XEiJ.mpuCycleCount += 4;
 15304:         return XEiJ.regRn[ 8];
 15305:       }
 15306:       //fallthrough
 15307:     case 0b010_001:  //(A1)
 15308:       if (XEiJ.EFA_SEPARATE_AR) {
 15309:         XEiJ.mpuCycleCount += 4;
 15310:         return XEiJ.regRn[ 9];
 15311:       }
 15312:       //fallthrough
 15313:     case 0b010_010:  //(A2)
 15314:       if (XEiJ.EFA_SEPARATE_AR) {
 15315:         XEiJ.mpuCycleCount += 4;
 15316:         return XEiJ.regRn[10];
 15317:       }
 15318:       //fallthrough
 15319:     case 0b010_011:  //(A3)
 15320:       if (XEiJ.EFA_SEPARATE_AR) {
 15321:         XEiJ.mpuCycleCount += 4;
 15322:         return XEiJ.regRn[11];
 15323:       }
 15324:       //fallthrough
 15325:     case 0b010_100:  //(A4)
 15326:       if (XEiJ.EFA_SEPARATE_AR) {
 15327:         XEiJ.mpuCycleCount += 4;
 15328:         return XEiJ.regRn[12];
 15329:       }
 15330:       //fallthrough
 15331:     case 0b010_101:  //(A5)
 15332:       if (XEiJ.EFA_SEPARATE_AR) {
 15333:         XEiJ.mpuCycleCount += 4;
 15334:         return XEiJ.regRn[13];
 15335:       }
 15336:       //fallthrough
 15337:     case 0b010_110:  //(A6)
 15338:       if (XEiJ.EFA_SEPARATE_AR) {
 15339:         XEiJ.mpuCycleCount += 4;
 15340:         return XEiJ.regRn[14];
 15341:       }
 15342:       //fallthrough
 15343:     case 0b010_111:  //(A7)
 15344:       if (XEiJ.EFA_SEPARATE_AR) {
 15345:         XEiJ.mpuCycleCount += 4;
 15346:         return XEiJ.regRn[15];
 15347:       } else {
 15348:         XEiJ.mpuCycleCount += 4;
 15349:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15350:       }
 15351:     case 0b101_000:  //(d16,A0)
 15352:     case 0b101_001:  //(d16,A1)
 15353:     case 0b101_010:  //(d16,A2)
 15354:     case 0b101_011:  //(d16,A3)
 15355:     case 0b101_100:  //(d16,A4)
 15356:     case 0b101_101:  //(d16,A5)
 15357:     case 0b101_110:  //(d16,A6)
 15358:     case 0b101_111:  //(d16,A7)
 15359:       XEiJ.mpuCycleCount += 8;
 15360:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15361:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15362:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15363:       } else {
 15364:         t = XEiJ.regPC;
 15365:         XEiJ.regPC = t + 2;
 15366:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15367:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15368:       }
 15369:     case 0b110_000:  //(d8,A0,Rn.wl)
 15370:     case 0b110_001:  //(d8,A1,Rn.wl)
 15371:     case 0b110_010:  //(d8,A2,Rn.wl)
 15372:     case 0b110_011:  //(d8,A3,Rn.wl)
 15373:     case 0b110_100:  //(d8,A4,Rn.wl)
 15374:     case 0b110_101:  //(d8,A5,Rn.wl)
 15375:     case 0b110_110:  //(d8,A6,Rn.wl)
 15376:     case 0b110_111:  //(d8,A7,Rn.wl)
 15377:       XEiJ.mpuCycleCount += 10;
 15378:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15379:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15380:       } else {
 15381:         w = XEiJ.regPC;
 15382:         XEiJ.regPC = w + 2;
 15383:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15384:       }
 15385:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15386:               + (byte) w  //バイトディスプレースメント
 15387:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15388:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15389:     case 0b111_000:  //(xxx).W
 15390:       XEiJ.mpuCycleCount += 8;
 15391:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15392:     case 0b111_001:  //(xxx).L
 15393:       XEiJ.mpuCycleCount += 12;
 15394:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15395:     case 0b111_010:  //(d16,PC)
 15396:       XEiJ.mpuCycleCount += 8;
 15397:       t = XEiJ.regPC;
 15398:       XEiJ.regPC = t + 2;
 15399:       return (t  //ベースレジスタ
 15400:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15401:     case 0b111_011:  //(d8,PC,Rn.wl)
 15402:       XEiJ.mpuCycleCount += 10;
 15403:       t = XEiJ.regPC;
 15404:       XEiJ.regPC = t + 2;
 15405:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15406:       return (t  //ベースレジスタ
 15407:               + (byte) w  //バイトディスプレースメント
 15408:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15409:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15410:     }  //switch
 15411:     XEiJ.mpuCycleCount += 34;
 15412:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15413:     throw M68kException.m6eSignal;
 15414:   }  //efaCntWord
 15415: 
 15416:   //a = efaCltWord (ea)  //|  M  WXZ  |
 15417:   //  制御可変モードのワードオペランドの実効アドレスを求める
 15418:   //  efaCntWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 15419:   @SuppressWarnings ("fallthrough") public static int efaCltWord (int ea) throws M68kException {
 15420:     int t, w;
 15421:     switch (ea) {
 15422:     case 0b010_000:  //(A0)
 15423:       if (XEiJ.EFA_SEPARATE_AR) {
 15424:         XEiJ.mpuCycleCount += 4;
 15425:         return XEiJ.regRn[ 8];
 15426:       }
 15427:       //fallthrough
 15428:     case 0b010_001:  //(A1)
 15429:       if (XEiJ.EFA_SEPARATE_AR) {
 15430:         XEiJ.mpuCycleCount += 4;
 15431:         return XEiJ.regRn[ 9];
 15432:       }
 15433:       //fallthrough
 15434:     case 0b010_010:  //(A2)
 15435:       if (XEiJ.EFA_SEPARATE_AR) {
 15436:         XEiJ.mpuCycleCount += 4;
 15437:         return XEiJ.regRn[10];
 15438:       }
 15439:       //fallthrough
 15440:     case 0b010_011:  //(A3)
 15441:       if (XEiJ.EFA_SEPARATE_AR) {
 15442:         XEiJ.mpuCycleCount += 4;
 15443:         return XEiJ.regRn[11];
 15444:       }
 15445:       //fallthrough
 15446:     case 0b010_100:  //(A4)
 15447:       if (XEiJ.EFA_SEPARATE_AR) {
 15448:         XEiJ.mpuCycleCount += 4;
 15449:         return XEiJ.regRn[12];
 15450:       }
 15451:       //fallthrough
 15452:     case 0b010_101:  //(A5)
 15453:       if (XEiJ.EFA_SEPARATE_AR) {
 15454:         XEiJ.mpuCycleCount += 4;
 15455:         return XEiJ.regRn[13];
 15456:       }
 15457:       //fallthrough
 15458:     case 0b010_110:  //(A6)
 15459:       if (XEiJ.EFA_SEPARATE_AR) {
 15460:         XEiJ.mpuCycleCount += 4;
 15461:         return XEiJ.regRn[14];
 15462:       }
 15463:       //fallthrough
 15464:     case 0b010_111:  //(A7)
 15465:       if (XEiJ.EFA_SEPARATE_AR) {
 15466:         XEiJ.mpuCycleCount += 4;
 15467:         return XEiJ.regRn[15];
 15468:       } else {
 15469:         XEiJ.mpuCycleCount += 4;
 15470:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15471:       }
 15472:     case 0b101_000:  //(d16,A0)
 15473:     case 0b101_001:  //(d16,A1)
 15474:     case 0b101_010:  //(d16,A2)
 15475:     case 0b101_011:  //(d16,A3)
 15476:     case 0b101_100:  //(d16,A4)
 15477:     case 0b101_101:  //(d16,A5)
 15478:     case 0b101_110:  //(d16,A6)
 15479:     case 0b101_111:  //(d16,A7)
 15480:       XEiJ.mpuCycleCount += 8;
 15481:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15482:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15483:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15484:       } else {
 15485:         t = XEiJ.regPC;
 15486:         XEiJ.regPC = t + 2;
 15487:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15488:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15489:       }
 15490:     case 0b110_000:  //(d8,A0,Rn.wl)
 15491:     case 0b110_001:  //(d8,A1,Rn.wl)
 15492:     case 0b110_010:  //(d8,A2,Rn.wl)
 15493:     case 0b110_011:  //(d8,A3,Rn.wl)
 15494:     case 0b110_100:  //(d8,A4,Rn.wl)
 15495:     case 0b110_101:  //(d8,A5,Rn.wl)
 15496:     case 0b110_110:  //(d8,A6,Rn.wl)
 15497:     case 0b110_111:  //(d8,A7,Rn.wl)
 15498:       XEiJ.mpuCycleCount += 10;
 15499:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15500:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15501:       } else {
 15502:         w = XEiJ.regPC;
 15503:         XEiJ.regPC = w + 2;
 15504:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15505:       }
 15506:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15507:               + (byte) w  //バイトディスプレースメント
 15508:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15509:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15510:     case 0b111_000:  //(xxx).W
 15511:       XEiJ.mpuCycleCount += 8;
 15512:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15513:     case 0b111_001:  //(xxx).L
 15514:       XEiJ.mpuCycleCount += 12;
 15515:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15516:     }  //switch
 15517:     XEiJ.mpuCycleCount += 34;
 15518:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15519:     throw M68kException.m6eSignal;
 15520:   }  //efaCltWord
 15521: 
 15522:   //a = efaAnyLong (ea)  //|  M+-WXZPI|
 15523:   //  任意のモードのロングオペランドの実効アドレスを求める
 15524:   //  efaAnyWordとの違いは(Ar)+と-(Ar)がArを4変化させることと、#<data>がPCを4変化させることと、
 15525:   //  オペランドのアクセスが1ワード増える分の4サイクルが追加されていること
 15526:   @SuppressWarnings ("fallthrough") public static int efaAnyLong (int ea) throws M68kException {
 15527:     int t, w;
 15528:     switch (ea) {
 15529:     case 0b010_000:  //(A0)
 15530:       if (XEiJ.EFA_SEPARATE_AR) {
 15531:         XEiJ.mpuCycleCount += 8;
 15532:         return XEiJ.regRn[ 8];
 15533:       }
 15534:       //fallthrough
 15535:     case 0b010_001:  //(A1)
 15536:       if (XEiJ.EFA_SEPARATE_AR) {
 15537:         XEiJ.mpuCycleCount += 8;
 15538:         return XEiJ.regRn[ 9];
 15539:       }
 15540:       //fallthrough
 15541:     case 0b010_010:  //(A2)
 15542:       if (XEiJ.EFA_SEPARATE_AR) {
 15543:         XEiJ.mpuCycleCount += 8;
 15544:         return XEiJ.regRn[10];
 15545:       }
 15546:       //fallthrough
 15547:     case 0b010_011:  //(A3)
 15548:       if (XEiJ.EFA_SEPARATE_AR) {
 15549:         XEiJ.mpuCycleCount += 8;
 15550:         return XEiJ.regRn[11];
 15551:       }
 15552:       //fallthrough
 15553:     case 0b010_100:  //(A4)
 15554:       if (XEiJ.EFA_SEPARATE_AR) {
 15555:         XEiJ.mpuCycleCount += 8;
 15556:         return XEiJ.regRn[12];
 15557:       }
 15558:       //fallthrough
 15559:     case 0b010_101:  //(A5)
 15560:       if (XEiJ.EFA_SEPARATE_AR) {
 15561:         XEiJ.mpuCycleCount += 8;
 15562:         return XEiJ.regRn[13];
 15563:       }
 15564:       //fallthrough
 15565:     case 0b010_110:  //(A6)
 15566:       if (XEiJ.EFA_SEPARATE_AR) {
 15567:         XEiJ.mpuCycleCount += 8;
 15568:         return XEiJ.regRn[14];
 15569:       }
 15570:       //fallthrough
 15571:     case 0b010_111:  //(A7)
 15572:       if (XEiJ.EFA_SEPARATE_AR) {
 15573:         XEiJ.mpuCycleCount += 8;
 15574:         return XEiJ.regRn[15];
 15575:       } else {
 15576:         XEiJ.mpuCycleCount += 8;
 15577:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15578:       }
 15579:     case 0b011_000:  //(A0)+
 15580:       if (XEiJ.EFA_SEPARATE_AR) {
 15581:         XEiJ.mpuCycleCount += 8;
 15582:         return (XEiJ.regRn[ 8] += 4) - 4;
 15583:       }
 15584:       //fallthrough
 15585:     case 0b011_001:  //(A1)+
 15586:       if (XEiJ.EFA_SEPARATE_AR) {
 15587:         XEiJ.mpuCycleCount += 8;
 15588:         return (XEiJ.regRn[ 9] += 4) - 4;
 15589:       }
 15590:       //fallthrough
 15591:     case 0b011_010:  //(A2)+
 15592:       if (XEiJ.EFA_SEPARATE_AR) {
 15593:         XEiJ.mpuCycleCount += 8;
 15594:         return (XEiJ.regRn[10] += 4) - 4;
 15595:       }
 15596:       //fallthrough
 15597:     case 0b011_011:  //(A3)+
 15598:       if (XEiJ.EFA_SEPARATE_AR) {
 15599:         XEiJ.mpuCycleCount += 8;
 15600:         return (XEiJ.regRn[11] += 4) - 4;
 15601:       }
 15602:       //fallthrough
 15603:     case 0b011_100:  //(A4)+
 15604:       if (XEiJ.EFA_SEPARATE_AR) {
 15605:         XEiJ.mpuCycleCount += 8;
 15606:         return (XEiJ.regRn[12] += 4) - 4;
 15607:       }
 15608:       //fallthrough
 15609:     case 0b011_101:  //(A5)+
 15610:       if (XEiJ.EFA_SEPARATE_AR) {
 15611:         XEiJ.mpuCycleCount += 8;
 15612:         return (XEiJ.regRn[13] += 4) - 4;
 15613:       }
 15614:       //fallthrough
 15615:     case 0b011_110:  //(A6)+
 15616:       if (XEiJ.EFA_SEPARATE_AR) {
 15617:         XEiJ.mpuCycleCount += 8;
 15618:         return (XEiJ.regRn[14] += 4) - 4;
 15619:       }
 15620:       //fallthrough
 15621:     case 0b011_111:  //(A7)+
 15622:       if (XEiJ.EFA_SEPARATE_AR) {
 15623:         XEiJ.mpuCycleCount += 8;
 15624:         return (XEiJ.regRn[15] += 4) - 4;
 15625:       } else {
 15626:         XEiJ.mpuCycleCount += 8;
 15627:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
 15628:       }
 15629:     case 0b100_000:  //-(A0)
 15630:       if (XEiJ.EFA_SEPARATE_AR) {
 15631:         XEiJ.mpuCycleCount += 10;
 15632:         return XEiJ.regRn[ 8] -= 4;
 15633:       }
 15634:       //fallthrough
 15635:     case 0b100_001:  //-(A1)
 15636:       if (XEiJ.EFA_SEPARATE_AR) {
 15637:         XEiJ.mpuCycleCount += 10;
 15638:         return XEiJ.regRn[ 9] -= 4;
 15639:       }
 15640:       //fallthrough
 15641:     case 0b100_010:  //-(A2)
 15642:       if (XEiJ.EFA_SEPARATE_AR) {
 15643:         XEiJ.mpuCycleCount += 10;
 15644:         return XEiJ.regRn[10] -= 4;
 15645:       }
 15646:       //fallthrough
 15647:     case 0b100_011:  //-(A3)
 15648:       if (XEiJ.EFA_SEPARATE_AR) {
 15649:         XEiJ.mpuCycleCount += 10;
 15650:         return XEiJ.regRn[11] -= 4;
 15651:       }
 15652:       //fallthrough
 15653:     case 0b100_100:  //-(A4)
 15654:       if (XEiJ.EFA_SEPARATE_AR) {
 15655:         XEiJ.mpuCycleCount += 10;
 15656:         return XEiJ.regRn[12] -= 4;
 15657:       }
 15658:       //fallthrough
 15659:     case 0b100_101:  //-(A5)
 15660:       if (XEiJ.EFA_SEPARATE_AR) {
 15661:         XEiJ.mpuCycleCount += 10;
 15662:         return XEiJ.regRn[13] -= 4;
 15663:       }
 15664:       //fallthrough
 15665:     case 0b100_110:  //-(A6)
 15666:       if (XEiJ.EFA_SEPARATE_AR) {
 15667:         XEiJ.mpuCycleCount += 10;
 15668:         return XEiJ.regRn[14] -= 4;
 15669:       }
 15670:       //fallthrough
 15671:     case 0b100_111:  //-(A7)
 15672:       if (XEiJ.EFA_SEPARATE_AR) {
 15673:         XEiJ.mpuCycleCount += 10;
 15674:         return XEiJ.regRn[15] -= 4;
 15675:       } else {
 15676:         XEiJ.mpuCycleCount += 10;
 15677:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
 15678:       }
 15679:     case 0b101_000:  //(d16,A0)
 15680:     case 0b101_001:  //(d16,A1)
 15681:     case 0b101_010:  //(d16,A2)
 15682:     case 0b101_011:  //(d16,A3)
 15683:     case 0b101_100:  //(d16,A4)
 15684:     case 0b101_101:  //(d16,A5)
 15685:     case 0b101_110:  //(d16,A6)
 15686:     case 0b101_111:  //(d16,A7)
 15687:       XEiJ.mpuCycleCount += 12;
 15688:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15689:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15690:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15691:       } else {
 15692:         t = XEiJ.regPC;
 15693:         XEiJ.regPC = t + 2;
 15694:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15695:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15696:       }
 15697:     case 0b110_000:  //(d8,A0,Rn.wl)
 15698:     case 0b110_001:  //(d8,A1,Rn.wl)
 15699:     case 0b110_010:  //(d8,A2,Rn.wl)
 15700:     case 0b110_011:  //(d8,A3,Rn.wl)
 15701:     case 0b110_100:  //(d8,A4,Rn.wl)
 15702:     case 0b110_101:  //(d8,A5,Rn.wl)
 15703:     case 0b110_110:  //(d8,A6,Rn.wl)
 15704:     case 0b110_111:  //(d8,A7,Rn.wl)
 15705:       XEiJ.mpuCycleCount += 14;
 15706:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15707:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15708:       } else {
 15709:         w = XEiJ.regPC;
 15710:         XEiJ.regPC = w + 2;
 15711:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15712:       }
 15713:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15714:               + (byte) w  //バイトディスプレースメント
 15715:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15716:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15717:     case 0b111_000:  //(xxx).W
 15718:       XEiJ.mpuCycleCount += 12;
 15719:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15720:     case 0b111_001:  //(xxx).L
 15721:       XEiJ.mpuCycleCount += 16;
 15722:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15723:     case 0b111_010:  //(d16,PC)
 15724:       XEiJ.mpuCycleCount += 12;
 15725:       t = XEiJ.regPC;
 15726:       XEiJ.regPC = t + 2;
 15727:       return (t  //ベースレジスタ
 15728:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15729:     case 0b111_011:  //(d8,PC,Rn.wl)
 15730:       XEiJ.mpuCycleCount += 14;
 15731:       t = XEiJ.regPC;
 15732:       XEiJ.regPC = t + 2;
 15733:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15734:       return (t  //ベースレジスタ
 15735:               + (byte) w  //バイトディスプレースメント
 15736:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15737:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15738:     case 0b111_100:  //#<data>
 15739:       XEiJ.mpuCycleCount += 8;
 15740:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15741:         return (XEiJ.regPC += 4) - 4;
 15742:       } else {
 15743:         t = XEiJ.regPC;
 15744:         XEiJ.regPC = t + 4;
 15745:         return t;
 15746:       }
 15747:     }  //switch
 15748:     XEiJ.mpuCycleCount += 34;
 15749:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15750:     throw M68kException.m6eSignal;
 15751:   }  //efaAnyLong
 15752: 
 15753:   //a = efaMemLong (ea)  //|  M+-WXZP |
 15754:   //  メモリモードのロングオペランドの実効アドレスを求める
 15755:   //  efaAnyLongとの違いは#<data>がないこと
 15756:   @SuppressWarnings ("fallthrough") public static int efaMemLong (int ea) throws M68kException {
 15757:     int t, w;
 15758:     switch (ea) {
 15759:     case 0b010_000:  //(A0)
 15760:       if (XEiJ.EFA_SEPARATE_AR) {
 15761:         XEiJ.mpuCycleCount += 8;
 15762:         return XEiJ.regRn[ 8];
 15763:       }
 15764:       //fallthrough
 15765:     case 0b010_001:  //(A1)
 15766:       if (XEiJ.EFA_SEPARATE_AR) {
 15767:         XEiJ.mpuCycleCount += 8;
 15768:         return XEiJ.regRn[ 9];
 15769:       }
 15770:       //fallthrough
 15771:     case 0b010_010:  //(A2)
 15772:       if (XEiJ.EFA_SEPARATE_AR) {
 15773:         XEiJ.mpuCycleCount += 8;
 15774:         return XEiJ.regRn[10];
 15775:       }
 15776:       //fallthrough
 15777:     case 0b010_011:  //(A3)
 15778:       if (XEiJ.EFA_SEPARATE_AR) {
 15779:         XEiJ.mpuCycleCount += 8;
 15780:         return XEiJ.regRn[11];
 15781:       }
 15782:       //fallthrough
 15783:     case 0b010_100:  //(A4)
 15784:       if (XEiJ.EFA_SEPARATE_AR) {
 15785:         XEiJ.mpuCycleCount += 8;
 15786:         return XEiJ.regRn[12];
 15787:       }
 15788:       //fallthrough
 15789:     case 0b010_101:  //(A5)
 15790:       if (XEiJ.EFA_SEPARATE_AR) {
 15791:         XEiJ.mpuCycleCount += 8;
 15792:         return XEiJ.regRn[13];
 15793:       }
 15794:       //fallthrough
 15795:     case 0b010_110:  //(A6)
 15796:       if (XEiJ.EFA_SEPARATE_AR) {
 15797:         XEiJ.mpuCycleCount += 8;
 15798:         return XEiJ.regRn[14];
 15799:       }
 15800:       //fallthrough
 15801:     case 0b010_111:  //(A7)
 15802:       if (XEiJ.EFA_SEPARATE_AR) {
 15803:         XEiJ.mpuCycleCount += 8;
 15804:         return XEiJ.regRn[15];
 15805:       } else {
 15806:         XEiJ.mpuCycleCount += 8;
 15807:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15808:       }
 15809:     case 0b011_000:  //(A0)+
 15810:       if (XEiJ.EFA_SEPARATE_AR) {
 15811:         XEiJ.mpuCycleCount += 8;
 15812:         return (XEiJ.regRn[ 8] += 4) - 4;
 15813:       }
 15814:       //fallthrough
 15815:     case 0b011_001:  //(A1)+
 15816:       if (XEiJ.EFA_SEPARATE_AR) {
 15817:         XEiJ.mpuCycleCount += 8;
 15818:         return (XEiJ.regRn[ 9] += 4) - 4;
 15819:       }
 15820:       //fallthrough
 15821:     case 0b011_010:  //(A2)+
 15822:       if (XEiJ.EFA_SEPARATE_AR) {
 15823:         XEiJ.mpuCycleCount += 8;
 15824:         return (XEiJ.regRn[10] += 4) - 4;
 15825:       }
 15826:       //fallthrough
 15827:     case 0b011_011:  //(A3)+
 15828:       if (XEiJ.EFA_SEPARATE_AR) {
 15829:         XEiJ.mpuCycleCount += 8;
 15830:         return (XEiJ.regRn[11] += 4) - 4;
 15831:       }
 15832:       //fallthrough
 15833:     case 0b011_100:  //(A4)+
 15834:       if (XEiJ.EFA_SEPARATE_AR) {
 15835:         XEiJ.mpuCycleCount += 8;
 15836:         return (XEiJ.regRn[12] += 4) - 4;
 15837:       }
 15838:       //fallthrough
 15839:     case 0b011_101:  //(A5)+
 15840:       if (XEiJ.EFA_SEPARATE_AR) {
 15841:         XEiJ.mpuCycleCount += 8;
 15842:         return (XEiJ.regRn[13] += 4) - 4;
 15843:       }
 15844:       //fallthrough
 15845:     case 0b011_110:  //(A6)+
 15846:       if (XEiJ.EFA_SEPARATE_AR) {
 15847:         XEiJ.mpuCycleCount += 8;
 15848:         return (XEiJ.regRn[14] += 4) - 4;
 15849:       }
 15850:       //fallthrough
 15851:     case 0b011_111:  //(A7)+
 15852:       if (XEiJ.EFA_SEPARATE_AR) {
 15853:         XEiJ.mpuCycleCount += 8;
 15854:         return (XEiJ.regRn[15] += 4) - 4;
 15855:       } else {
 15856:         XEiJ.mpuCycleCount += 8;
 15857:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
 15858:       }
 15859:     case 0b100_000:  //-(A0)
 15860:       if (XEiJ.EFA_SEPARATE_AR) {
 15861:         XEiJ.mpuCycleCount += 10;
 15862:         return XEiJ.regRn[ 8] -= 4;
 15863:       }
 15864:       //fallthrough
 15865:     case 0b100_001:  //-(A1)
 15866:       if (XEiJ.EFA_SEPARATE_AR) {
 15867:         XEiJ.mpuCycleCount += 10;
 15868:         return XEiJ.regRn[ 9] -= 4;
 15869:       }
 15870:       //fallthrough
 15871:     case 0b100_010:  //-(A2)
 15872:       if (XEiJ.EFA_SEPARATE_AR) {
 15873:         XEiJ.mpuCycleCount += 10;
 15874:         return XEiJ.regRn[10] -= 4;
 15875:       }
 15876:       //fallthrough
 15877:     case 0b100_011:  //-(A3)
 15878:       if (XEiJ.EFA_SEPARATE_AR) {
 15879:         XEiJ.mpuCycleCount += 10;
 15880:         return XEiJ.regRn[11] -= 4;
 15881:       }
 15882:       //fallthrough
 15883:     case 0b100_100:  //-(A4)
 15884:       if (XEiJ.EFA_SEPARATE_AR) {
 15885:         XEiJ.mpuCycleCount += 10;
 15886:         return XEiJ.regRn[12] -= 4;
 15887:       }
 15888:       //fallthrough
 15889:     case 0b100_101:  //-(A5)
 15890:       if (XEiJ.EFA_SEPARATE_AR) {
 15891:         XEiJ.mpuCycleCount += 10;
 15892:         return XEiJ.regRn[13] -= 4;
 15893:       }
 15894:       //fallthrough
 15895:     case 0b100_110:  //-(A6)
 15896:       if (XEiJ.EFA_SEPARATE_AR) {
 15897:         XEiJ.mpuCycleCount += 10;
 15898:         return XEiJ.regRn[14] -= 4;
 15899:       }
 15900:       //fallthrough
 15901:     case 0b100_111:  //-(A7)
 15902:       if (XEiJ.EFA_SEPARATE_AR) {
 15903:         XEiJ.mpuCycleCount += 10;
 15904:         return XEiJ.regRn[15] -= 4;
 15905:       } else {
 15906:         XEiJ.mpuCycleCount += 10;
 15907:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
 15908:       }
 15909:     case 0b101_000:  //(d16,A0)
 15910:     case 0b101_001:  //(d16,A1)
 15911:     case 0b101_010:  //(d16,A2)
 15912:     case 0b101_011:  //(d16,A3)
 15913:     case 0b101_100:  //(d16,A4)
 15914:     case 0b101_101:  //(d16,A5)
 15915:     case 0b101_110:  //(d16,A6)
 15916:     case 0b101_111:  //(d16,A7)
 15917:       XEiJ.mpuCycleCount += 12;
 15918:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15919:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15920:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15921:       } else {
 15922:         t = XEiJ.regPC;
 15923:         XEiJ.regPC = t + 2;
 15924:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15925:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15926:       }
 15927:     case 0b110_000:  //(d8,A0,Rn.wl)
 15928:     case 0b110_001:  //(d8,A1,Rn.wl)
 15929:     case 0b110_010:  //(d8,A2,Rn.wl)
 15930:     case 0b110_011:  //(d8,A3,Rn.wl)
 15931:     case 0b110_100:  //(d8,A4,Rn.wl)
 15932:     case 0b110_101:  //(d8,A5,Rn.wl)
 15933:     case 0b110_110:  //(d8,A6,Rn.wl)
 15934:     case 0b110_111:  //(d8,A7,Rn.wl)
 15935:       XEiJ.mpuCycleCount += 14;
 15936:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15937:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15938:       } else {
 15939:         w = XEiJ.regPC;
 15940:         XEiJ.regPC = w + 2;
 15941:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15942:       }
 15943:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15944:               + (byte) w  //バイトディスプレースメント
 15945:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15946:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15947:     case 0b111_000:  //(xxx).W
 15948:       XEiJ.mpuCycleCount += 12;
 15949:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15950:     case 0b111_001:  //(xxx).L
 15951:       XEiJ.mpuCycleCount += 16;
 15952:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15953:     case 0b111_010:  //(d16,PC)
 15954:       XEiJ.mpuCycleCount += 12;
 15955:       t = XEiJ.regPC;
 15956:       XEiJ.regPC = t + 2;
 15957:       return (t  //ベースレジスタ
 15958:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15959:     case 0b111_011:  //(d8,PC,Rn.wl)
 15960:       XEiJ.mpuCycleCount += 14;
 15961:       t = XEiJ.regPC;
 15962:       XEiJ.regPC = t + 2;
 15963:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15964:       return (t  //ベースレジスタ
 15965:               + (byte) w  //バイトディスプレースメント
 15966:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15967:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15968:     }  //switch
 15969:     XEiJ.mpuCycleCount += 34;
 15970:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15971:     throw M68kException.m6eSignal;
 15972:   }  //efaMemLong
 15973: 
 15974:   //a = efaMltLong (ea)  //|  M+-WXZ  |
 15975:   //  メモリ可変モードのロングオペランドの実効アドレスを求める
 15976:   //  efaMemLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 15977:   @SuppressWarnings ("fallthrough") public static int efaMltLong (int ea) throws M68kException {
 15978:     int t, w;
 15979:     switch (ea) {
 15980:     case 0b010_000:  //(A0)
 15981:       if (XEiJ.EFA_SEPARATE_AR) {
 15982:         XEiJ.mpuCycleCount += 8;
 15983:         return XEiJ.regRn[ 8];
 15984:       }
 15985:       //fallthrough
 15986:     case 0b010_001:  //(A1)
 15987:       if (XEiJ.EFA_SEPARATE_AR) {
 15988:         XEiJ.mpuCycleCount += 8;
 15989:         return XEiJ.regRn[ 9];
 15990:       }
 15991:       //fallthrough
 15992:     case 0b010_010:  //(A2)
 15993:       if (XEiJ.EFA_SEPARATE_AR) {
 15994:         XEiJ.mpuCycleCount += 8;
 15995:         return XEiJ.regRn[10];
 15996:       }
 15997:       //fallthrough
 15998:     case 0b010_011:  //(A3)
 15999:       if (XEiJ.EFA_SEPARATE_AR) {
 16000:         XEiJ.mpuCycleCount += 8;
 16001:         return XEiJ.regRn[11];
 16002:       }
 16003:       //fallthrough
 16004:     case 0b010_100:  //(A4)
 16005:       if (XEiJ.EFA_SEPARATE_AR) {
 16006:         XEiJ.mpuCycleCount += 8;
 16007:         return XEiJ.regRn[12];
 16008:       }
 16009:       //fallthrough
 16010:     case 0b010_101:  //(A5)
 16011:       if (XEiJ.EFA_SEPARATE_AR) {
 16012:         XEiJ.mpuCycleCount += 8;
 16013:         return XEiJ.regRn[13];
 16014:       }
 16015:       //fallthrough
 16016:     case 0b010_110:  //(A6)
 16017:       if (XEiJ.EFA_SEPARATE_AR) {
 16018:         XEiJ.mpuCycleCount += 8;
 16019:         return XEiJ.regRn[14];
 16020:       }
 16021:       //fallthrough
 16022:     case 0b010_111:  //(A7)
 16023:       if (XEiJ.EFA_SEPARATE_AR) {
 16024:         XEiJ.mpuCycleCount += 8;
 16025:         return XEiJ.regRn[15];
 16026:       } else {
 16027:         XEiJ.mpuCycleCount += 8;
 16028:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16029:       }
 16030:     case 0b011_000:  //(A0)+
 16031:       if (XEiJ.EFA_SEPARATE_AR) {
 16032:         XEiJ.mpuCycleCount += 8;
 16033:         return (XEiJ.regRn[ 8] += 4) - 4;
 16034:       }
 16035:       //fallthrough
 16036:     case 0b011_001:  //(A1)+
 16037:       if (XEiJ.EFA_SEPARATE_AR) {
 16038:         XEiJ.mpuCycleCount += 8;
 16039:         return (XEiJ.regRn[ 9] += 4) - 4;
 16040:       }
 16041:       //fallthrough
 16042:     case 0b011_010:  //(A2)+
 16043:       if (XEiJ.EFA_SEPARATE_AR) {
 16044:         XEiJ.mpuCycleCount += 8;
 16045:         return (XEiJ.regRn[10] += 4) - 4;
 16046:       }
 16047:       //fallthrough
 16048:     case 0b011_011:  //(A3)+
 16049:       if (XEiJ.EFA_SEPARATE_AR) {
 16050:         XEiJ.mpuCycleCount += 8;
 16051:         return (XEiJ.regRn[11] += 4) - 4;
 16052:       }
 16053:       //fallthrough
 16054:     case 0b011_100:  //(A4)+
 16055:       if (XEiJ.EFA_SEPARATE_AR) {
 16056:         XEiJ.mpuCycleCount += 8;
 16057:         return (XEiJ.regRn[12] += 4) - 4;
 16058:       }
 16059:       //fallthrough
 16060:     case 0b011_101:  //(A5)+
 16061:       if (XEiJ.EFA_SEPARATE_AR) {
 16062:         XEiJ.mpuCycleCount += 8;
 16063:         return (XEiJ.regRn[13] += 4) - 4;
 16064:       }
 16065:       //fallthrough
 16066:     case 0b011_110:  //(A6)+
 16067:       if (XEiJ.EFA_SEPARATE_AR) {
 16068:         XEiJ.mpuCycleCount += 8;
 16069:         return (XEiJ.regRn[14] += 4) - 4;
 16070:       }
 16071:       //fallthrough
 16072:     case 0b011_111:  //(A7)+
 16073:       if (XEiJ.EFA_SEPARATE_AR) {
 16074:         XEiJ.mpuCycleCount += 8;
 16075:         return (XEiJ.regRn[15] += 4) - 4;
 16076:       } else {
 16077:         XEiJ.mpuCycleCount += 8;
 16078:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
 16079:       }
 16080:     case 0b100_000:  //-(A0)
 16081:       if (XEiJ.EFA_SEPARATE_AR) {
 16082:         XEiJ.mpuCycleCount += 10;
 16083:         return XEiJ.regRn[ 8] -= 4;
 16084:       }
 16085:       //fallthrough
 16086:     case 0b100_001:  //-(A1)
 16087:       if (XEiJ.EFA_SEPARATE_AR) {
 16088:         XEiJ.mpuCycleCount += 10;
 16089:         return XEiJ.regRn[ 9] -= 4;
 16090:       }
 16091:       //fallthrough
 16092:     case 0b100_010:  //-(A2)
 16093:       if (XEiJ.EFA_SEPARATE_AR) {
 16094:         XEiJ.mpuCycleCount += 10;
 16095:         return XEiJ.regRn[10] -= 4;
 16096:       }
 16097:       //fallthrough
 16098:     case 0b100_011:  //-(A3)
 16099:       if (XEiJ.EFA_SEPARATE_AR) {
 16100:         XEiJ.mpuCycleCount += 10;
 16101:         return XEiJ.regRn[11] -= 4;
 16102:       }
 16103:       //fallthrough
 16104:     case 0b100_100:  //-(A4)
 16105:       if (XEiJ.EFA_SEPARATE_AR) {
 16106:         XEiJ.mpuCycleCount += 10;
 16107:         return XEiJ.regRn[12] -= 4;
 16108:       }
 16109:       //fallthrough
 16110:     case 0b100_101:  //-(A5)
 16111:       if (XEiJ.EFA_SEPARATE_AR) {
 16112:         XEiJ.mpuCycleCount += 10;
 16113:         return XEiJ.regRn[13] -= 4;
 16114:       }
 16115:       //fallthrough
 16116:     case 0b100_110:  //-(A6)
 16117:       if (XEiJ.EFA_SEPARATE_AR) {
 16118:         XEiJ.mpuCycleCount += 10;
 16119:         return XEiJ.regRn[14] -= 4;
 16120:       }
 16121:       //fallthrough
 16122:     case 0b100_111:  //-(A7)
 16123:       if (XEiJ.EFA_SEPARATE_AR) {
 16124:         XEiJ.mpuCycleCount += 10;
 16125:         return XEiJ.regRn[15] -= 4;
 16126:       } else {
 16127:         XEiJ.mpuCycleCount += 10;
 16128:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
 16129:       }
 16130:     case 0b101_000:  //(d16,A0)
 16131:     case 0b101_001:  //(d16,A1)
 16132:     case 0b101_010:  //(d16,A2)
 16133:     case 0b101_011:  //(d16,A3)
 16134:     case 0b101_100:  //(d16,A4)
 16135:     case 0b101_101:  //(d16,A5)
 16136:     case 0b101_110:  //(d16,A6)
 16137:     case 0b101_111:  //(d16,A7)
 16138:       XEiJ.mpuCycleCount += 12;
 16139:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16140:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16141:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16142:       } else {
 16143:         t = XEiJ.regPC;
 16144:         XEiJ.regPC = t + 2;
 16145:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16146:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16147:       }
 16148:     case 0b110_000:  //(d8,A0,Rn.wl)
 16149:     case 0b110_001:  //(d8,A1,Rn.wl)
 16150:     case 0b110_010:  //(d8,A2,Rn.wl)
 16151:     case 0b110_011:  //(d8,A3,Rn.wl)
 16152:     case 0b110_100:  //(d8,A4,Rn.wl)
 16153:     case 0b110_101:  //(d8,A5,Rn.wl)
 16154:     case 0b110_110:  //(d8,A6,Rn.wl)
 16155:     case 0b110_111:  //(d8,A7,Rn.wl)
 16156:       XEiJ.mpuCycleCount += 14;
 16157:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16158:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16159:       } else {
 16160:         w = XEiJ.regPC;
 16161:         XEiJ.regPC = w + 2;
 16162:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16163:       }
 16164:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16165:               + (byte) w  //バイトディスプレースメント
 16166:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16167:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16168:     case 0b111_000:  //(xxx).W
 16169:       XEiJ.mpuCycleCount += 12;
 16170:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16171:     case 0b111_001:  //(xxx).L
 16172:       XEiJ.mpuCycleCount += 16;
 16173:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16174:     }  //switch
 16175:     XEiJ.mpuCycleCount += 34;
 16176:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16177:     throw M68kException.m6eSignal;
 16178:   }  //efaMltLong
 16179: 
 16180:   //a = efaCntLong (ea)  //|  M  WXZP |
 16181:   //  制御モードのロングオペランドの実効アドレスを求める
 16182:   //  efaMemLongとの違いは(Ar)+と-(Ar)がないこと
 16183:   @SuppressWarnings ("fallthrough") public static int efaCntLong (int ea) throws M68kException {
 16184:     int t, w;
 16185:     switch (ea) {
 16186:     case 0b010_000:  //(A0)
 16187:       if (XEiJ.EFA_SEPARATE_AR) {
 16188:         XEiJ.mpuCycleCount += 8;
 16189:         return XEiJ.regRn[ 8];
 16190:       }
 16191:       //fallthrough
 16192:     case 0b010_001:  //(A1)
 16193:       if (XEiJ.EFA_SEPARATE_AR) {
 16194:         XEiJ.mpuCycleCount += 8;
 16195:         return XEiJ.regRn[ 9];
 16196:       }
 16197:       //fallthrough
 16198:     case 0b010_010:  //(A2)
 16199:       if (XEiJ.EFA_SEPARATE_AR) {
 16200:         XEiJ.mpuCycleCount += 8;
 16201:         return XEiJ.regRn[10];
 16202:       }
 16203:       //fallthrough
 16204:     case 0b010_011:  //(A3)
 16205:       if (XEiJ.EFA_SEPARATE_AR) {
 16206:         XEiJ.mpuCycleCount += 8;
 16207:         return XEiJ.regRn[11];
 16208:       }
 16209:       //fallthrough
 16210:     case 0b010_100:  //(A4)
 16211:       if (XEiJ.EFA_SEPARATE_AR) {
 16212:         XEiJ.mpuCycleCount += 8;
 16213:         return XEiJ.regRn[12];
 16214:       }
 16215:       //fallthrough
 16216:     case 0b010_101:  //(A5)
 16217:       if (XEiJ.EFA_SEPARATE_AR) {
 16218:         XEiJ.mpuCycleCount += 8;
 16219:         return XEiJ.regRn[13];
 16220:       }
 16221:       //fallthrough
 16222:     case 0b010_110:  //(A6)
 16223:       if (XEiJ.EFA_SEPARATE_AR) {
 16224:         XEiJ.mpuCycleCount += 8;
 16225:         return XEiJ.regRn[14];
 16226:       }
 16227:       //fallthrough
 16228:     case 0b010_111:  //(A7)
 16229:       if (XEiJ.EFA_SEPARATE_AR) {
 16230:         XEiJ.mpuCycleCount += 8;
 16231:         return XEiJ.regRn[15];
 16232:       } else {
 16233:         XEiJ.mpuCycleCount += 8;
 16234:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16235:       }
 16236:     case 0b101_000:  //(d16,A0)
 16237:     case 0b101_001:  //(d16,A1)
 16238:     case 0b101_010:  //(d16,A2)
 16239:     case 0b101_011:  //(d16,A3)
 16240:     case 0b101_100:  //(d16,A4)
 16241:     case 0b101_101:  //(d16,A5)
 16242:     case 0b101_110:  //(d16,A6)
 16243:     case 0b101_111:  //(d16,A7)
 16244:       XEiJ.mpuCycleCount += 12;
 16245:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16246:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16247:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16248:       } else {
 16249:         t = XEiJ.regPC;
 16250:         XEiJ.regPC = t + 2;
 16251:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16252:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16253:       }
 16254:     case 0b110_000:  //(d8,A0,Rn.wl)
 16255:     case 0b110_001:  //(d8,A1,Rn.wl)
 16256:     case 0b110_010:  //(d8,A2,Rn.wl)
 16257:     case 0b110_011:  //(d8,A3,Rn.wl)
 16258:     case 0b110_100:  //(d8,A4,Rn.wl)
 16259:     case 0b110_101:  //(d8,A5,Rn.wl)
 16260:     case 0b110_110:  //(d8,A6,Rn.wl)
 16261:     case 0b110_111:  //(d8,A7,Rn.wl)
 16262:       XEiJ.mpuCycleCount += 14;
 16263:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16264:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16265:       } else {
 16266:         w = XEiJ.regPC;
 16267:         XEiJ.regPC = w + 2;
 16268:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16269:       }
 16270:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16271:               + (byte) w  //バイトディスプレースメント
 16272:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16273:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16274:     case 0b111_000:  //(xxx).W
 16275:       XEiJ.mpuCycleCount += 12;
 16276:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16277:     case 0b111_001:  //(xxx).L
 16278:       XEiJ.mpuCycleCount += 16;
 16279:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16280:     case 0b111_010:  //(d16,PC)
 16281:       XEiJ.mpuCycleCount += 12;
 16282:       t = XEiJ.regPC;
 16283:       XEiJ.regPC = t + 2;
 16284:       return (t  //ベースレジスタ
 16285:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16286:     case 0b111_011:  //(d8,PC,Rn.wl)
 16287:       XEiJ.mpuCycleCount += 14;
 16288:       t = XEiJ.regPC;
 16289:       XEiJ.regPC = t + 2;
 16290:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 16291:       return (t  //ベースレジスタ
 16292:               + (byte) w  //バイトディスプレースメント
 16293:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16294:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16295:     }  //switch
 16296:     XEiJ.mpuCycleCount += 34;
 16297:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16298:     throw M68kException.m6eSignal;
 16299:   }  //efaCntLong
 16300: 
 16301:   //a = efaCltLong (ea)  //|  M  WXZ  |
 16302:   //  制御可変モードのワードオペランドの実効アドレスを求める
 16303:   //  efaCntLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 16304:   @SuppressWarnings ("fallthrough") public static int efaCltLong (int ea) throws M68kException {
 16305:     int t, w;
 16306:     switch (ea) {
 16307:     case 0b010_000:  //(A0)
 16308:       if (XEiJ.EFA_SEPARATE_AR) {
 16309:         XEiJ.mpuCycleCount += 8;
 16310:         return XEiJ.regRn[ 8];
 16311:       }
 16312:       //fallthrough
 16313:     case 0b010_001:  //(A1)
 16314:       if (XEiJ.EFA_SEPARATE_AR) {
 16315:         XEiJ.mpuCycleCount += 8;
 16316:         return XEiJ.regRn[ 9];
 16317:       }
 16318:       //fallthrough
 16319:     case 0b010_010:  //(A2)
 16320:       if (XEiJ.EFA_SEPARATE_AR) {
 16321:         XEiJ.mpuCycleCount += 8;
 16322:         return XEiJ.regRn[10];
 16323:       }
 16324:       //fallthrough
 16325:     case 0b010_011:  //(A3)
 16326:       if (XEiJ.EFA_SEPARATE_AR) {
 16327:         XEiJ.mpuCycleCount += 8;
 16328:         return XEiJ.regRn[11];
 16329:       }
 16330:       //fallthrough
 16331:     case 0b010_100:  //(A4)
 16332:       if (XEiJ.EFA_SEPARATE_AR) {
 16333:         XEiJ.mpuCycleCount += 8;
 16334:         return XEiJ.regRn[12];
 16335:       }
 16336:       //fallthrough
 16337:     case 0b010_101:  //(A5)
 16338:       if (XEiJ.EFA_SEPARATE_AR) {
 16339:         XEiJ.mpuCycleCount += 8;
 16340:         return XEiJ.regRn[13];
 16341:       }
 16342:       //fallthrough
 16343:     case 0b010_110:  //(A6)
 16344:       if (XEiJ.EFA_SEPARATE_AR) {
 16345:         XEiJ.mpuCycleCount += 8;
 16346:         return XEiJ.regRn[14];
 16347:       }
 16348:       //fallthrough
 16349:     case 0b010_111:  //(A7)
 16350:       if (XEiJ.EFA_SEPARATE_AR) {
 16351:         XEiJ.mpuCycleCount += 8;
 16352:         return XEiJ.regRn[15];
 16353:       } else {
 16354:         XEiJ.mpuCycleCount += 8;
 16355:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16356:       }
 16357:     case 0b101_000:  //(d16,A0)
 16358:     case 0b101_001:  //(d16,A1)
 16359:     case 0b101_010:  //(d16,A2)
 16360:     case 0b101_011:  //(d16,A3)
 16361:     case 0b101_100:  //(d16,A4)
 16362:     case 0b101_101:  //(d16,A5)
 16363:     case 0b101_110:  //(d16,A6)
 16364:     case 0b101_111:  //(d16,A7)
 16365:       XEiJ.mpuCycleCount += 12;
 16366:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16367:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16368:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16369:       } else {
 16370:         t = XEiJ.regPC;
 16371:         XEiJ.regPC = t + 2;
 16372:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16373:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16374:       }
 16375:     case 0b110_000:  //(d8,A0,Rn.wl)
 16376:     case 0b110_001:  //(d8,A1,Rn.wl)
 16377:     case 0b110_010:  //(d8,A2,Rn.wl)
 16378:     case 0b110_011:  //(d8,A3,Rn.wl)
 16379:     case 0b110_100:  //(d8,A4,Rn.wl)
 16380:     case 0b110_101:  //(d8,A5,Rn.wl)
 16381:     case 0b110_110:  //(d8,A6,Rn.wl)
 16382:     case 0b110_111:  //(d8,A7,Rn.wl)
 16383:       XEiJ.mpuCycleCount += 14;
 16384:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16385:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16386:       } else {
 16387:         w = XEiJ.regPC;
 16388:         XEiJ.regPC = w + 2;
 16389:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16390:       }
 16391:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16392:               + (byte) w  //バイトディスプレースメント
 16393:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16394:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16395:     case 0b111_000:  //(xxx).W
 16396:       XEiJ.mpuCycleCount += 12;
 16397:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16398:     case 0b111_001:  //(xxx).L
 16399:       XEiJ.mpuCycleCount += 16;
 16400:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16401:     }  //switch
 16402:     XEiJ.mpuCycleCount += 34;
 16403:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16404:     throw M68kException.m6eSignal;
 16405:   }  //efaCltLong
 16406: 
 16407:   //a = efaAnyQuad (ea)  //|  M+-WXZPI|
 16408:   //  任意のモードのクワッドオペランドの実効アドレスを求める
 16409:   //  efaAnyLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、
 16410:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 16411:   @SuppressWarnings ("fallthrough") public static int efaAnyQuad (int ea) throws M68kException {
 16412:     int t, w;
 16413:     switch (ea) {
 16414:     case 0b010_000:  //(A0)
 16415:       if (XEiJ.EFA_SEPARATE_AR) {
 16416:         XEiJ.mpuCycleCount += 16;
 16417:         return XEiJ.regRn[ 8];
 16418:       }
 16419:       //fallthrough
 16420:     case 0b010_001:  //(A1)
 16421:       if (XEiJ.EFA_SEPARATE_AR) {
 16422:         XEiJ.mpuCycleCount += 16;
 16423:         return XEiJ.regRn[ 9];
 16424:       }
 16425:       //fallthrough
 16426:     case 0b010_010:  //(A2)
 16427:       if (XEiJ.EFA_SEPARATE_AR) {
 16428:         XEiJ.mpuCycleCount += 16;
 16429:         return XEiJ.regRn[10];
 16430:       }
 16431:       //fallthrough
 16432:     case 0b010_011:  //(A3)
 16433:       if (XEiJ.EFA_SEPARATE_AR) {
 16434:         XEiJ.mpuCycleCount += 16;
 16435:         return XEiJ.regRn[11];
 16436:       }
 16437:       //fallthrough
 16438:     case 0b010_100:  //(A4)
 16439:       if (XEiJ.EFA_SEPARATE_AR) {
 16440:         XEiJ.mpuCycleCount += 16;
 16441:         return XEiJ.regRn[12];
 16442:       }
 16443:       //fallthrough
 16444:     case 0b010_101:  //(A5)
 16445:       if (XEiJ.EFA_SEPARATE_AR) {
 16446:         XEiJ.mpuCycleCount += 16;
 16447:         return XEiJ.regRn[13];
 16448:       }
 16449:       //fallthrough
 16450:     case 0b010_110:  //(A6)
 16451:       if (XEiJ.EFA_SEPARATE_AR) {
 16452:         XEiJ.mpuCycleCount += 16;
 16453:         return XEiJ.regRn[14];
 16454:       }
 16455:       //fallthrough
 16456:     case 0b010_111:  //(A7)
 16457:       if (XEiJ.EFA_SEPARATE_AR) {
 16458:         XEiJ.mpuCycleCount += 16;
 16459:         return XEiJ.regRn[15];
 16460:       } else {
 16461:         XEiJ.mpuCycleCount += 16;
 16462:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16463:       }
 16464:     case 0b011_000:  //(A0)+
 16465:       if (XEiJ.EFA_SEPARATE_AR) {
 16466:         XEiJ.mpuCycleCount += 16;
 16467:         return (XEiJ.regRn[ 8] += 8) - 8;
 16468:       }
 16469:       //fallthrough
 16470:     case 0b011_001:  //(A1)+
 16471:       if (XEiJ.EFA_SEPARATE_AR) {
 16472:         XEiJ.mpuCycleCount += 16;
 16473:         return (XEiJ.regRn[ 9] += 8) - 8;
 16474:       }
 16475:       //fallthrough
 16476:     case 0b011_010:  //(A2)+
 16477:       if (XEiJ.EFA_SEPARATE_AR) {
 16478:         XEiJ.mpuCycleCount += 16;
 16479:         return (XEiJ.regRn[10] += 8) - 8;
 16480:       }
 16481:       //fallthrough
 16482:     case 0b011_011:  //(A3)+
 16483:       if (XEiJ.EFA_SEPARATE_AR) {
 16484:         XEiJ.mpuCycleCount += 16;
 16485:         return (XEiJ.regRn[11] += 8) - 8;
 16486:       }
 16487:       //fallthrough
 16488:     case 0b011_100:  //(A4)+
 16489:       if (XEiJ.EFA_SEPARATE_AR) {
 16490:         XEiJ.mpuCycleCount += 16;
 16491:         return (XEiJ.regRn[12] += 8) - 8;
 16492:       }
 16493:       //fallthrough
 16494:     case 0b011_101:  //(A5)+
 16495:       if (XEiJ.EFA_SEPARATE_AR) {
 16496:         XEiJ.mpuCycleCount += 16;
 16497:         return (XEiJ.regRn[13] += 8) - 8;
 16498:       }
 16499:       //fallthrough
 16500:     case 0b011_110:  //(A6)+
 16501:       if (XEiJ.EFA_SEPARATE_AR) {
 16502:         XEiJ.mpuCycleCount += 16;
 16503:         return (XEiJ.regRn[14] += 8) - 8;
 16504:       }
 16505:       //fallthrough
 16506:     case 0b011_111:  //(A7)+
 16507:       if (XEiJ.EFA_SEPARATE_AR) {
 16508:         XEiJ.mpuCycleCount += 16;
 16509:         return (XEiJ.regRn[15] += 8) - 8;
 16510:       } else {
 16511:         XEiJ.mpuCycleCount += 16;
 16512:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8;
 16513:       }
 16514:     case 0b100_000:  //-(A0)
 16515:       if (XEiJ.EFA_SEPARATE_AR) {
 16516:         XEiJ.mpuCycleCount += 18;
 16517:         return XEiJ.regRn[ 8] -= 8;
 16518:       }
 16519:       //fallthrough
 16520:     case 0b100_001:  //-(A1)
 16521:       if (XEiJ.EFA_SEPARATE_AR) {
 16522:         XEiJ.mpuCycleCount += 18;
 16523:         return XEiJ.regRn[ 9] -= 8;
 16524:       }
 16525:       //fallthrough
 16526:     case 0b100_010:  //-(A2)
 16527:       if (XEiJ.EFA_SEPARATE_AR) {
 16528:         XEiJ.mpuCycleCount += 18;
 16529:         return XEiJ.regRn[10] -= 8;
 16530:       }
 16531:       //fallthrough
 16532:     case 0b100_011:  //-(A3)
 16533:       if (XEiJ.EFA_SEPARATE_AR) {
 16534:         XEiJ.mpuCycleCount += 18;
 16535:         return XEiJ.regRn[11] -= 8;
 16536:       }
 16537:       //fallthrough
 16538:     case 0b100_100:  //-(A4)
 16539:       if (XEiJ.EFA_SEPARATE_AR) {
 16540:         XEiJ.mpuCycleCount += 18;
 16541:         return XEiJ.regRn[12] -= 8;
 16542:       }
 16543:       //fallthrough
 16544:     case 0b100_101:  //-(A5)
 16545:       if (XEiJ.EFA_SEPARATE_AR) {
 16546:         XEiJ.mpuCycleCount += 18;
 16547:         return XEiJ.regRn[13] -= 8;
 16548:       }
 16549:       //fallthrough
 16550:     case 0b100_110:  //-(A6)
 16551:       if (XEiJ.EFA_SEPARATE_AR) {
 16552:         XEiJ.mpuCycleCount += 18;
 16553:         return XEiJ.regRn[14] -= 8;
 16554:       }
 16555:       //fallthrough
 16556:     case 0b100_111:  //-(A7)
 16557:       if (XEiJ.EFA_SEPARATE_AR) {
 16558:         XEiJ.mpuCycleCount += 18;
 16559:         return XEiJ.regRn[15] -= 8;
 16560:       } else {
 16561:         XEiJ.mpuCycleCount += 18;
 16562:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8;
 16563:       }
 16564:     case 0b101_000:  //(d16,A0)
 16565:     case 0b101_001:  //(d16,A1)
 16566:     case 0b101_010:  //(d16,A2)
 16567:     case 0b101_011:  //(d16,A3)
 16568:     case 0b101_100:  //(d16,A4)
 16569:     case 0b101_101:  //(d16,A5)
 16570:     case 0b101_110:  //(d16,A6)
 16571:     case 0b101_111:  //(d16,A7)
 16572:       XEiJ.mpuCycleCount += 20;
 16573:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16574:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16575:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16576:       } else {
 16577:         t = XEiJ.regPC;
 16578:         XEiJ.regPC = t + 2;
 16579:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16580:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16581:       }
 16582:     case 0b110_000:  //(d8,A0,Rn.wl)
 16583:     case 0b110_001:  //(d8,A1,Rn.wl)
 16584:     case 0b110_010:  //(d8,A2,Rn.wl)
 16585:     case 0b110_011:  //(d8,A3,Rn.wl)
 16586:     case 0b110_100:  //(d8,A4,Rn.wl)
 16587:     case 0b110_101:  //(d8,A5,Rn.wl)
 16588:     case 0b110_110:  //(d8,A6,Rn.wl)
 16589:     case 0b110_111:  //(d8,A7,Rn.wl)
 16590:       XEiJ.mpuCycleCount += 22;
 16591:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16592:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16593:       } else {
 16594:         w = XEiJ.regPC;
 16595:         XEiJ.regPC = w + 2;
 16596:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16597:       }
 16598:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16599:               + (byte) w  //バイトディスプレースメント
 16600:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16601:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16602:     case 0b111_000:  //(xxx).W
 16603:       XEiJ.mpuCycleCount += 20;
 16604:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16605:     case 0b111_001:  //(xxx).L
 16606:       XEiJ.mpuCycleCount += 24;
 16607:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16608:     case 0b111_010:  //(d16,PC)
 16609:       XEiJ.mpuCycleCount += 20;
 16610:       t = XEiJ.regPC;
 16611:       XEiJ.regPC = t + 2;
 16612:       return (t  //ベースレジスタ
 16613:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16614:     case 0b111_011:  //(d8,PC,Rn.wl)
 16615:       XEiJ.mpuCycleCount += 22;
 16616:       t = XEiJ.regPC;
 16617:       XEiJ.regPC = t + 2;
 16618:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 16619:       return (t  //ベースレジスタ
 16620:               + (byte) w  //バイトディスプレースメント
 16621:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16622:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16623:     case 0b111_100:  //#<data>
 16624:       XEiJ.mpuCycleCount += 16;
 16625:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16626:         return (XEiJ.regPC += 8) - 8;
 16627:       } else {
 16628:         t = XEiJ.regPC;
 16629:         XEiJ.regPC = t + 8;
 16630:         return t;
 16631:       }
 16632:     }  //switch
 16633:     XEiJ.mpuCycleCount += 34;
 16634:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16635:     throw M68kException.m6eSignal;
 16636:   }  //efaAnyQuad
 16637: 
 16638:   //a = efaMltQuad (ea)  //|  M+-WXZ  |
 16639:   //  メモリ可変モードのクワッドオペランドの実効アドレスを求める
 16640:   //  efaMltLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、
 16641:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 16642:   @SuppressWarnings ("fallthrough") public static int efaMltQuad (int ea) throws M68kException {
 16643:     int t, w;
 16644:     switch (ea) {
 16645:     case 0b010_000:  //(A0)
 16646:       if (XEiJ.EFA_SEPARATE_AR) {
 16647:         XEiJ.mpuCycleCount += 16;
 16648:         return XEiJ.regRn[ 8];
 16649:       }
 16650:       //fallthrough
 16651:     case 0b010_001:  //(A1)
 16652:       if (XEiJ.EFA_SEPARATE_AR) {
 16653:         XEiJ.mpuCycleCount += 16;
 16654:         return XEiJ.regRn[ 9];
 16655:       }
 16656:       //fallthrough
 16657:     case 0b010_010:  //(A2)
 16658:       if (XEiJ.EFA_SEPARATE_AR) {
 16659:         XEiJ.mpuCycleCount += 16;
 16660:         return XEiJ.regRn[10];
 16661:       }
 16662:       //fallthrough
 16663:     case 0b010_011:  //(A3)
 16664:       if (XEiJ.EFA_SEPARATE_AR) {
 16665:         XEiJ.mpuCycleCount += 16;
 16666:         return XEiJ.regRn[11];
 16667:       }
 16668:       //fallthrough
 16669:     case 0b010_100:  //(A4)
 16670:       if (XEiJ.EFA_SEPARATE_AR) {
 16671:         XEiJ.mpuCycleCount += 16;
 16672:         return XEiJ.regRn[12];
 16673:       }
 16674:       //fallthrough
 16675:     case 0b010_101:  //(A5)
 16676:       if (XEiJ.EFA_SEPARATE_AR) {
 16677:         XEiJ.mpuCycleCount += 16;
 16678:         return XEiJ.regRn[13];
 16679:       }
 16680:       //fallthrough
 16681:     case 0b010_110:  //(A6)
 16682:       if (XEiJ.EFA_SEPARATE_AR) {
 16683:         XEiJ.mpuCycleCount += 16;
 16684:         return XEiJ.regRn[14];
 16685:       }
 16686:       //fallthrough
 16687:     case 0b010_111:  //(A7)
 16688:       if (XEiJ.EFA_SEPARATE_AR) {
 16689:         XEiJ.mpuCycleCount += 16;
 16690:         return XEiJ.regRn[15];
 16691:       } else {
 16692:         XEiJ.mpuCycleCount += 16;
 16693:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16694:       }
 16695:     case 0b011_000:  //(A0)+
 16696:       if (XEiJ.EFA_SEPARATE_AR) {
 16697:         XEiJ.mpuCycleCount += 16;
 16698:         return (XEiJ.regRn[ 8] += 8) - 8;
 16699:       }
 16700:       //fallthrough
 16701:     case 0b011_001:  //(A1)+
 16702:       if (XEiJ.EFA_SEPARATE_AR) {
 16703:         XEiJ.mpuCycleCount += 16;
 16704:         return (XEiJ.regRn[ 9] += 8) - 8;
 16705:       }
 16706:       //fallthrough
 16707:     case 0b011_010:  //(A2)+
 16708:       if (XEiJ.EFA_SEPARATE_AR) {
 16709:         XEiJ.mpuCycleCount += 16;
 16710:         return (XEiJ.regRn[10] += 8) - 8;
 16711:       }
 16712:       //fallthrough
 16713:     case 0b011_011:  //(A3)+
 16714:       if (XEiJ.EFA_SEPARATE_AR) {
 16715:         XEiJ.mpuCycleCount += 16;
 16716:         return (XEiJ.regRn[11] += 8) - 8;
 16717:       }
 16718:       //fallthrough
 16719:     case 0b011_100:  //(A4)+
 16720:       if (XEiJ.EFA_SEPARATE_AR) {
 16721:         XEiJ.mpuCycleCount += 16;
 16722:         return (XEiJ.regRn[12] += 8) - 8;
 16723:       }
 16724:       //fallthrough
 16725:     case 0b011_101:  //(A5)+
 16726:       if (XEiJ.EFA_SEPARATE_AR) {
 16727:         XEiJ.mpuCycleCount += 16;
 16728:         return (XEiJ.regRn[13] += 8) - 8;
 16729:       }
 16730:       //fallthrough
 16731:     case 0b011_110:  //(A6)+
 16732:       if (XEiJ.EFA_SEPARATE_AR) {
 16733:         XEiJ.mpuCycleCount += 16;
 16734:         return (XEiJ.regRn[14] += 8) - 8;
 16735:       }
 16736:       //fallthrough
 16737:     case 0b011_111:  //(A7)+
 16738:       if (XEiJ.EFA_SEPARATE_AR) {
 16739:         XEiJ.mpuCycleCount += 16;
 16740:         return (XEiJ.regRn[15] += 8) - 8;
 16741:       } else {
 16742:         XEiJ.mpuCycleCount += 16;
 16743:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8;
 16744:       }
 16745:     case 0b100_000:  //-(A0)
 16746:       if (XEiJ.EFA_SEPARATE_AR) {
 16747:         XEiJ.mpuCycleCount += 18;
 16748:         return XEiJ.regRn[ 8] -= 8;
 16749:       }
 16750:       //fallthrough
 16751:     case 0b100_001:  //-(A1)
 16752:       if (XEiJ.EFA_SEPARATE_AR) {
 16753:         XEiJ.mpuCycleCount += 18;
 16754:         return XEiJ.regRn[ 9] -= 8;
 16755:       }
 16756:       //fallthrough
 16757:     case 0b100_010:  //-(A2)
 16758:       if (XEiJ.EFA_SEPARATE_AR) {
 16759:         XEiJ.mpuCycleCount += 18;
 16760:         return XEiJ.regRn[10] -= 8;
 16761:       }
 16762:       //fallthrough
 16763:     case 0b100_011:  //-(A3)
 16764:       if (XEiJ.EFA_SEPARATE_AR) {
 16765:         XEiJ.mpuCycleCount += 18;
 16766:         return XEiJ.regRn[11] -= 8;
 16767:       }
 16768:       //fallthrough
 16769:     case 0b100_100:  //-(A4)
 16770:       if (XEiJ.EFA_SEPARATE_AR) {
 16771:         XEiJ.mpuCycleCount += 18;
 16772:         return XEiJ.regRn[12] -= 8;
 16773:       }
 16774:       //fallthrough
 16775:     case 0b100_101:  //-(A5)
 16776:       if (XEiJ.EFA_SEPARATE_AR) {
 16777:         XEiJ.mpuCycleCount += 18;
 16778:         return XEiJ.regRn[13] -= 8;
 16779:       }
 16780:       //fallthrough
 16781:     case 0b100_110:  //-(A6)
 16782:       if (XEiJ.EFA_SEPARATE_AR) {
 16783:         XEiJ.mpuCycleCount += 18;
 16784:         return XEiJ.regRn[14] -= 8;
 16785:       }
 16786:       //fallthrough
 16787:     case 0b100_111:  //-(A7)
 16788:       if (XEiJ.EFA_SEPARATE_AR) {
 16789:         XEiJ.mpuCycleCount += 18;
 16790:         return XEiJ.regRn[15] -= 8;
 16791:       } else {
 16792:         XEiJ.mpuCycleCount += 18;
 16793:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8;
 16794:       }
 16795:     case 0b101_000:  //(d16,A0)
 16796:     case 0b101_001:  //(d16,A1)
 16797:     case 0b101_010:  //(d16,A2)
 16798:     case 0b101_011:  //(d16,A3)
 16799:     case 0b101_100:  //(d16,A4)
 16800:     case 0b101_101:  //(d16,A5)
 16801:     case 0b101_110:  //(d16,A6)
 16802:     case 0b101_111:  //(d16,A7)
 16803:       XEiJ.mpuCycleCount += 20;
 16804:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16805:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16806:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16807:       } else {
 16808:         t = XEiJ.regPC;
 16809:         XEiJ.regPC = t + 2;
 16810:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16811:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16812:       }
 16813:     case 0b110_000:  //(d8,A0,Rn.wl)
 16814:     case 0b110_001:  //(d8,A1,Rn.wl)
 16815:     case 0b110_010:  //(d8,A2,Rn.wl)
 16816:     case 0b110_011:  //(d8,A3,Rn.wl)
 16817:     case 0b110_100:  //(d8,A4,Rn.wl)
 16818:     case 0b110_101:  //(d8,A5,Rn.wl)
 16819:     case 0b110_110:  //(d8,A6,Rn.wl)
 16820:     case 0b110_111:  //(d8,A7,Rn.wl)
 16821:       XEiJ.mpuCycleCount += 22;
 16822:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16823:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16824:       } else {
 16825:         w = XEiJ.regPC;
 16826:         XEiJ.regPC = w + 2;
 16827:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16828:       }
 16829:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16830:               + (byte) w  //バイトディスプレースメント
 16831:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16832:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16833:     case 0b111_000:  //(xxx).W
 16834:       XEiJ.mpuCycleCount += 20;
 16835:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16836:     case 0b111_001:  //(xxx).L
 16837:       XEiJ.mpuCycleCount += 24;
 16838:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16839:     }  //switch
 16840:     XEiJ.mpuCycleCount += 34;
 16841:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16842:     throw M68kException.m6eSignal;
 16843:   }  //efaMltQuad
 16844: 
 16845:   //a = efaAnyExtd (ea)  //|  M+-WXZPI|
 16846:   //  任意のモードのエクステンデッドオペランドの実効アドレスを求める
 16847:   //  efaAnyQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、
 16848:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 16849:   @SuppressWarnings ("fallthrough") public static int efaAnyExtd (int ea) throws M68kException {
 16850:     int t, w;
 16851:     switch (ea) {
 16852:     case 0b010_000:  //(A0)
 16853:       if (XEiJ.EFA_SEPARATE_AR) {
 16854:         XEiJ.mpuCycleCount += 24;
 16855:         return XEiJ.regRn[ 8];
 16856:       }
 16857:       //fallthrough
 16858:     case 0b010_001:  //(A1)
 16859:       if (XEiJ.EFA_SEPARATE_AR) {
 16860:         XEiJ.mpuCycleCount += 24;
 16861:         return XEiJ.regRn[ 9];
 16862:       }
 16863:       //fallthrough
 16864:     case 0b010_010:  //(A2)
 16865:       if (XEiJ.EFA_SEPARATE_AR) {
 16866:         XEiJ.mpuCycleCount += 24;
 16867:         return XEiJ.regRn[10];
 16868:       }
 16869:       //fallthrough
 16870:     case 0b010_011:  //(A3)
 16871:       if (XEiJ.EFA_SEPARATE_AR) {
 16872:         XEiJ.mpuCycleCount += 24;
 16873:         return XEiJ.regRn[11];
 16874:       }
 16875:       //fallthrough
 16876:     case 0b010_100:  //(A4)
 16877:       if (XEiJ.EFA_SEPARATE_AR) {
 16878:         XEiJ.mpuCycleCount += 24;
 16879:         return XEiJ.regRn[12];
 16880:       }
 16881:       //fallthrough
 16882:     case 0b010_101:  //(A5)
 16883:       if (XEiJ.EFA_SEPARATE_AR) {
 16884:         XEiJ.mpuCycleCount += 24;
 16885:         return XEiJ.regRn[13];
 16886:       }
 16887:       //fallthrough
 16888:     case 0b010_110:  //(A6)
 16889:       if (XEiJ.EFA_SEPARATE_AR) {
 16890:         XEiJ.mpuCycleCount += 24;
 16891:         return XEiJ.regRn[14];
 16892:       }
 16893:       //fallthrough
 16894:     case 0b010_111:  //(A7)
 16895:       if (XEiJ.EFA_SEPARATE_AR) {
 16896:         XEiJ.mpuCycleCount += 24;
 16897:         return XEiJ.regRn[15];
 16898:       } else {
 16899:         XEiJ.mpuCycleCount += 24;
 16900:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16901:       }
 16902:     case 0b011_000:  //(A0)+
 16903:       if (XEiJ.EFA_SEPARATE_AR) {
 16904:         XEiJ.mpuCycleCount += 24;
 16905:         return (XEiJ.regRn[ 8] += 12) - 12;
 16906:       }
 16907:       //fallthrough
 16908:     case 0b011_001:  //(A1)+
 16909:       if (XEiJ.EFA_SEPARATE_AR) {
 16910:         XEiJ.mpuCycleCount += 24;
 16911:         return (XEiJ.regRn[ 9] += 12) - 12;
 16912:       }
 16913:       //fallthrough
 16914:     case 0b011_010:  //(A2)+
 16915:       if (XEiJ.EFA_SEPARATE_AR) {
 16916:         XEiJ.mpuCycleCount += 24;
 16917:         return (XEiJ.regRn[10] += 12) - 12;
 16918:       }
 16919:       //fallthrough
 16920:     case 0b011_011:  //(A3)+
 16921:       if (XEiJ.EFA_SEPARATE_AR) {
 16922:         XEiJ.mpuCycleCount += 24;
 16923:         return (XEiJ.regRn[11] += 12) - 12;
 16924:       }
 16925:       //fallthrough
 16926:     case 0b011_100:  //(A4)+
 16927:       if (XEiJ.EFA_SEPARATE_AR) {
 16928:         XEiJ.mpuCycleCount += 24;
 16929:         return (XEiJ.regRn[12] += 12) - 12;
 16930:       }
 16931:       //fallthrough
 16932:     case 0b011_101:  //(A5)+
 16933:       if (XEiJ.EFA_SEPARATE_AR) {
 16934:         XEiJ.mpuCycleCount += 24;
 16935:         return (XEiJ.regRn[13] += 12) - 12;
 16936:       }
 16937:       //fallthrough
 16938:     case 0b011_110:  //(A6)+
 16939:       if (XEiJ.EFA_SEPARATE_AR) {
 16940:         XEiJ.mpuCycleCount += 24;
 16941:         return (XEiJ.regRn[14] += 12) - 12;
 16942:       }
 16943:       //fallthrough
 16944:     case 0b011_111:  //(A7)+
 16945:       if (XEiJ.EFA_SEPARATE_AR) {
 16946:         XEiJ.mpuCycleCount += 24;
 16947:         return (XEiJ.regRn[15] += 12) - 12;
 16948:       } else {
 16949:         XEiJ.mpuCycleCount += 24;
 16950:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12;
 16951:       }
 16952:     case 0b100_000:  //-(A0)
 16953:       if (XEiJ.EFA_SEPARATE_AR) {
 16954:         XEiJ.mpuCycleCount += 26;
 16955:         return XEiJ.regRn[ 8] -= 12;
 16956:       }
 16957:       //fallthrough
 16958:     case 0b100_001:  //-(A1)
 16959:       if (XEiJ.EFA_SEPARATE_AR) {
 16960:         XEiJ.mpuCycleCount += 26;
 16961:         return XEiJ.regRn[ 9] -= 12;
 16962:       }
 16963:       //fallthrough
 16964:     case 0b100_010:  //-(A2)
 16965:       if (XEiJ.EFA_SEPARATE_AR) {
 16966:         XEiJ.mpuCycleCount += 26;
 16967:         return XEiJ.regRn[10] -= 12;
 16968:       }
 16969:       //fallthrough
 16970:     case 0b100_011:  //-(A3)
 16971:       if (XEiJ.EFA_SEPARATE_AR) {
 16972:         XEiJ.mpuCycleCount += 26;
 16973:         return XEiJ.regRn[11] -= 12;
 16974:       }
 16975:       //fallthrough
 16976:     case 0b100_100:  //-(A4)
 16977:       if (XEiJ.EFA_SEPARATE_AR) {
 16978:         XEiJ.mpuCycleCount += 26;
 16979:         return XEiJ.regRn[12] -= 12;
 16980:       }
 16981:       //fallthrough
 16982:     case 0b100_101:  //-(A5)
 16983:       if (XEiJ.EFA_SEPARATE_AR) {
 16984:         XEiJ.mpuCycleCount += 26;
 16985:         return XEiJ.regRn[13] -= 12;
 16986:       }
 16987:       //fallthrough
 16988:     case 0b100_110:  //-(A6)
 16989:       if (XEiJ.EFA_SEPARATE_AR) {
 16990:         XEiJ.mpuCycleCount += 26;
 16991:         return XEiJ.regRn[14] -= 12;
 16992:       }
 16993:       //fallthrough
 16994:     case 0b100_111:  //-(A7)
 16995:       if (XEiJ.EFA_SEPARATE_AR) {
 16996:         XEiJ.mpuCycleCount += 26;
 16997:         return XEiJ.regRn[15] -= 12;
 16998:       } else {
 16999:         XEiJ.mpuCycleCount += 26;
 17000:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12;
 17001:       }
 17002:     case 0b101_000:  //(d16,A0)
 17003:     case 0b101_001:  //(d16,A1)
 17004:     case 0b101_010:  //(d16,A2)
 17005:     case 0b101_011:  //(d16,A3)
 17006:     case 0b101_100:  //(d16,A4)
 17007:     case 0b101_101:  //(d16,A5)
 17008:     case 0b101_110:  //(d16,A6)
 17009:     case 0b101_111:  //(d16,A7)
 17010:       XEiJ.mpuCycleCount += 28;
 17011:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17012:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17013:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 17014:       } else {
 17015:         t = XEiJ.regPC;
 17016:         XEiJ.regPC = t + 2;
 17017:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17018:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17019:       }
 17020:     case 0b110_000:  //(d8,A0,Rn.wl)
 17021:     case 0b110_001:  //(d8,A1,Rn.wl)
 17022:     case 0b110_010:  //(d8,A2,Rn.wl)
 17023:     case 0b110_011:  //(d8,A3,Rn.wl)
 17024:     case 0b110_100:  //(d8,A4,Rn.wl)
 17025:     case 0b110_101:  //(d8,A5,Rn.wl)
 17026:     case 0b110_110:  //(d8,A6,Rn.wl)
 17027:     case 0b110_111:  //(d8,A7,Rn.wl)
 17028:       XEiJ.mpuCycleCount += 30;
 17029:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17030:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 17031:       } else {
 17032:         w = XEiJ.regPC;
 17033:         XEiJ.regPC = w + 2;
 17034:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 17035:       }
 17036:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 17037:               + (byte) w  //バイトディスプレースメント
 17038:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17039:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17040:     case 0b111_000:  //(xxx).W
 17041:       XEiJ.mpuCycleCount += 28;
 17042:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 17043:     case 0b111_001:  //(xxx).L
 17044:       XEiJ.mpuCycleCount += 32;
 17045:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 17046:     case 0b111_010:  //(d16,PC)
 17047:       XEiJ.mpuCycleCount += 28;
 17048:       t = XEiJ.regPC;
 17049:       XEiJ.regPC = t + 2;
 17050:       return (t  //ベースレジスタ
 17051:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17052:     case 0b111_011:  //(d8,PC,Rn.wl)
 17053:       XEiJ.mpuCycleCount += 30;
 17054:       t = XEiJ.regPC;
 17055:       XEiJ.regPC = t + 2;
 17056:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 17057:       return (t  //ベースレジスタ
 17058:               + (byte) w  //バイトディスプレースメント
 17059:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17060:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17061:     case 0b111_100:  //#<data>
 17062:       XEiJ.mpuCycleCount += 24;
 17063:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17064:         return (XEiJ.regPC += 12) - 12;
 17065:       } else {
 17066:         t = XEiJ.regPC;
 17067:         XEiJ.regPC = t + 12;
 17068:         return t;
 17069:       }
 17070:     }  //switch
 17071:     XEiJ.mpuCycleCount += 34;
 17072:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17073:     throw M68kException.m6eSignal;
 17074:   }  //efaAnyExtd
 17075: 
 17076:   //a = efaMltExtd (ea)  //|  M+-WXZ  |
 17077:   //  メモリ可変モードのエクステンデッドオペランドの実効アドレスを求める
 17078:   //  efaMltQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、
 17079:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 17080:   @SuppressWarnings ("fallthrough") public static int efaMltExtd (int ea) throws M68kException {
 17081:     int t, w;
 17082:     switch (ea) {
 17083:     case 0b010_000:  //(A0)
 17084:       if (XEiJ.EFA_SEPARATE_AR) {
 17085:         XEiJ.mpuCycleCount += 24;
 17086:         return XEiJ.regRn[ 8];
 17087:       }
 17088:       //fallthrough
 17089:     case 0b010_001:  //(A1)
 17090:       if (XEiJ.EFA_SEPARATE_AR) {
 17091:         XEiJ.mpuCycleCount += 24;
 17092:         return XEiJ.regRn[ 9];
 17093:       }
 17094:       //fallthrough
 17095:     case 0b010_010:  //(A2)
 17096:       if (XEiJ.EFA_SEPARATE_AR) {
 17097:         XEiJ.mpuCycleCount += 24;
 17098:         return XEiJ.regRn[10];
 17099:       }
 17100:       //fallthrough
 17101:     case 0b010_011:  //(A3)
 17102:       if (XEiJ.EFA_SEPARATE_AR) {
 17103:         XEiJ.mpuCycleCount += 24;
 17104:         return XEiJ.regRn[11];
 17105:       }
 17106:       //fallthrough
 17107:     case 0b010_100:  //(A4)
 17108:       if (XEiJ.EFA_SEPARATE_AR) {
 17109:         XEiJ.mpuCycleCount += 24;
 17110:         return XEiJ.regRn[12];
 17111:       }
 17112:       //fallthrough
 17113:     case 0b010_101:  //(A5)
 17114:       if (XEiJ.EFA_SEPARATE_AR) {
 17115:         XEiJ.mpuCycleCount += 24;
 17116:         return XEiJ.regRn[13];
 17117:       }
 17118:       //fallthrough
 17119:     case 0b010_110:  //(A6)
 17120:       if (XEiJ.EFA_SEPARATE_AR) {
 17121:         XEiJ.mpuCycleCount += 24;
 17122:         return XEiJ.regRn[14];
 17123:       }
 17124:       //fallthrough
 17125:     case 0b010_111:  //(A7)
 17126:       if (XEiJ.EFA_SEPARATE_AR) {
 17127:         XEiJ.mpuCycleCount += 24;
 17128:         return XEiJ.regRn[15];
 17129:       } else {
 17130:         XEiJ.mpuCycleCount += 24;
 17131:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 17132:       }
 17133:     case 0b011_000:  //(A0)+
 17134:       if (XEiJ.EFA_SEPARATE_AR) {
 17135:         XEiJ.mpuCycleCount += 24;
 17136:         return (XEiJ.regRn[ 8] += 12) - 12;
 17137:       }
 17138:       //fallthrough
 17139:     case 0b011_001:  //(A1)+
 17140:       if (XEiJ.EFA_SEPARATE_AR) {
 17141:         XEiJ.mpuCycleCount += 24;
 17142:         return (XEiJ.regRn[ 9] += 12) - 12;
 17143:       }
 17144:       //fallthrough
 17145:     case 0b011_010:  //(A2)+
 17146:       if (XEiJ.EFA_SEPARATE_AR) {
 17147:         XEiJ.mpuCycleCount += 24;
 17148:         return (XEiJ.regRn[10] += 12) - 12;
 17149:       }
 17150:       //fallthrough
 17151:     case 0b011_011:  //(A3)+
 17152:       if (XEiJ.EFA_SEPARATE_AR) {
 17153:         XEiJ.mpuCycleCount += 24;
 17154:         return (XEiJ.regRn[11] += 12) - 12;
 17155:       }
 17156:       //fallthrough
 17157:     case 0b011_100:  //(A4)+
 17158:       if (XEiJ.EFA_SEPARATE_AR) {
 17159:         XEiJ.mpuCycleCount += 24;
 17160:         return (XEiJ.regRn[12] += 12) - 12;
 17161:       }
 17162:       //fallthrough
 17163:     case 0b011_101:  //(A5)+
 17164:       if (XEiJ.EFA_SEPARATE_AR) {
 17165:         XEiJ.mpuCycleCount += 24;
 17166:         return (XEiJ.regRn[13] += 12) - 12;
 17167:       }
 17168:       //fallthrough
 17169:     case 0b011_110:  //(A6)+
 17170:       if (XEiJ.EFA_SEPARATE_AR) {
 17171:         XEiJ.mpuCycleCount += 24;
 17172:         return (XEiJ.regRn[14] += 12) - 12;
 17173:       }
 17174:       //fallthrough
 17175:     case 0b011_111:  //(A7)+
 17176:       if (XEiJ.EFA_SEPARATE_AR) {
 17177:         XEiJ.mpuCycleCount += 24;
 17178:         return (XEiJ.regRn[15] += 12) - 12;
 17179:       } else {
 17180:         XEiJ.mpuCycleCount += 24;
 17181:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12;
 17182:       }
 17183:     case 0b100_000:  //-(A0)
 17184:     case 0b100_001:  //-(A1)
 17185:     case 0b100_010:  //-(A2)
 17186:     case 0b100_011:  //-(A3)
 17187:     case 0b100_100:  //-(A4)
 17188:     case 0b100_101:  //-(A5)
 17189:     case 0b100_110:  //-(A6)
 17190:     case 0b100_111:  //-(A7)
 17191:       XEiJ.mpuCycleCount += 26;
 17192:       return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12;
 17193:     case 0b101_000:  //(d16,A0)
 17194:     case 0b101_001:  //(d16,A1)
 17195:     case 0b101_010:  //(d16,A2)
 17196:     case 0b101_011:  //(d16,A3)
 17197:     case 0b101_100:  //(d16,A4)
 17198:     case 0b101_101:  //(d16,A5)
 17199:     case 0b101_110:  //(d16,A6)
 17200:     case 0b101_111:  //(d16,A7)
 17201:       XEiJ.mpuCycleCount += 28;
 17202:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17203:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17204:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 17205:       } else {
 17206:         t = XEiJ.regPC;
 17207:         XEiJ.regPC = t + 2;
 17208:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17209:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17210:       }
 17211:     case 0b110_000:  //(d8,A0,Rn.wl)
 17212:     case 0b110_001:  //(d8,A1,Rn.wl)
 17213:     case 0b110_010:  //(d8,A2,Rn.wl)
 17214:     case 0b110_011:  //(d8,A3,Rn.wl)
 17215:     case 0b110_100:  //(d8,A4,Rn.wl)
 17216:     case 0b110_101:  //(d8,A5,Rn.wl)
 17217:     case 0b110_110:  //(d8,A6,Rn.wl)
 17218:     case 0b110_111:  //(d8,A7,Rn.wl)
 17219:       XEiJ.mpuCycleCount += 30;
 17220:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17221:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 17222:       } else {
 17223:         w = XEiJ.regPC;
 17224:         XEiJ.regPC = w + 2;
 17225:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 17226:       }
 17227:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 17228:               + (byte) w  //バイトディスプレースメント
 17229:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17230:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17231:     case 0b111_000:  //(xxx).W
 17232:       XEiJ.mpuCycleCount += 28;
 17233:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 17234:     case 0b111_001:  //(xxx).L
 17235:       XEiJ.mpuCycleCount += 32;
 17236:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 17237:     }  //switch
 17238:     XEiJ.mpuCycleCount += 34;
 17239:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17240:     throw M68kException.m6eSignal;
 17241:   }  //efaMltExtd
 17242: 
 17243:   //a = efaLeaPea (ea)  //|  M  WXZP |
 17244:   //  LEA命令とPEA命令のオペランドの実効アドレスを求める
 17245:   //  efaCntWordとの違いはサイクル数のみ
 17246:   //  LEA命令のベースサイクル数4を含んでいるのでLEA命令ではベースサイクル数を加えなくてよい
 17247:   //  PEA命令のベースサイクル数は12-4=8
 17248:   @SuppressWarnings ("fallthrough") public static int efaLeaPea (int ea) throws M68kException {
 17249:     int t, w;
 17250:     switch (ea) {
 17251:     case 0b010_000:  //(A0)
 17252:       if (XEiJ.EFA_SEPARATE_AR) {
 17253:         XEiJ.mpuCycleCount += 4;
 17254:         return XEiJ.regRn[ 8];
 17255:       }
 17256:       //fallthrough
 17257:     case 0b010_001:  //(A1)
 17258:       if (XEiJ.EFA_SEPARATE_AR) {
 17259:         XEiJ.mpuCycleCount += 4;
 17260:         return XEiJ.regRn[ 9];
 17261:       }
 17262:       //fallthrough
 17263:     case 0b010_010:  //(A2)
 17264:       if (XEiJ.EFA_SEPARATE_AR) {
 17265:         XEiJ.mpuCycleCount += 4;
 17266:         return XEiJ.regRn[10];
 17267:       }
 17268:       //fallthrough
 17269:     case 0b010_011:  //(A3)
 17270:       if (XEiJ.EFA_SEPARATE_AR) {
 17271:         XEiJ.mpuCycleCount += 4;
 17272:         return XEiJ.regRn[11];
 17273:       }
 17274:       //fallthrough
 17275:     case 0b010_100:  //(A4)
 17276:       if (XEiJ.EFA_SEPARATE_AR) {
 17277:         XEiJ.mpuCycleCount += 4;
 17278:         return XEiJ.regRn[12];
 17279:       }
 17280:       //fallthrough
 17281:     case 0b010_101:  //(A5)
 17282:       if (XEiJ.EFA_SEPARATE_AR) {
 17283:         XEiJ.mpuCycleCount += 4;
 17284:         return XEiJ.regRn[13];
 17285:       }
 17286:       //fallthrough
 17287:     case 0b010_110:  //(A6)
 17288:       if (XEiJ.EFA_SEPARATE_AR) {
 17289:         XEiJ.mpuCycleCount += 4;
 17290:         return XEiJ.regRn[14];
 17291:       }
 17292:       //fallthrough
 17293:     case 0b010_111:  //(A7)
 17294:       if (XEiJ.EFA_SEPARATE_AR) {
 17295:         XEiJ.mpuCycleCount += 4;
 17296:         return XEiJ.regRn[15];
 17297:       } else {
 17298:         XEiJ.mpuCycleCount += 4;
 17299:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 17300:       }
 17301:     case 0b101_000:  //(d16,A0)
 17302:     case 0b101_001:  //(d16,A1)
 17303:     case 0b101_010:  //(d16,A2)
 17304:     case 0b101_011:  //(d16,A3)
 17305:     case 0b101_100:  //(d16,A4)
 17306:     case 0b101_101:  //(d16,A5)
 17307:     case 0b101_110:  //(d16,A6)
 17308:     case 0b101_111:  //(d16,A7)
 17309:       XEiJ.mpuCycleCount += 8;
 17310:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17311:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17312:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 17313:       } else {
 17314:         t = XEiJ.regPC;
 17315:         XEiJ.regPC = t + 2;
 17316:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17317:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17318:       }
 17319:     case 0b110_000:  //(d8,A0,Rn.wl)
 17320:     case 0b110_001:  //(d8,A1,Rn.wl)
 17321:     case 0b110_010:  //(d8,A2,Rn.wl)
 17322:     case 0b110_011:  //(d8,A3,Rn.wl)
 17323:     case 0b110_100:  //(d8,A4,Rn.wl)
 17324:     case 0b110_101:  //(d8,A5,Rn.wl)
 17325:     case 0b110_110:  //(d8,A6,Rn.wl)
 17326:     case 0b110_111:  //(d8,A7,Rn.wl)
 17327:       XEiJ.mpuCycleCount += 12;
 17328:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17329:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 17330:       } else {
 17331:         w = XEiJ.regPC;
 17332:         XEiJ.regPC = w + 2;
 17333:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 17334:       }
 17335:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 17336:               + (byte) w  //バイトディスプレースメント
 17337:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17338:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17339:     case 0b111_000:  //(xxx).W
 17340:       XEiJ.mpuCycleCount += 8;
 17341:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 17342:     case 0b111_001:  //(xxx).L
 17343:       XEiJ.mpuCycleCount += 12;
 17344:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 17345:     case 0b111_010:  //(d16,PC)
 17346:       XEiJ.mpuCycleCount += 8;
 17347:       t = XEiJ.regPC;
 17348:       XEiJ.regPC = t + 2;
 17349:       return (t  //ベースレジスタ
 17350:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17351:     case 0b111_011:  //(d8,PC,Rn.wl)
 17352:       XEiJ.mpuCycleCount += 12;
 17353:       t = XEiJ.regPC;
 17354:       XEiJ.regPC = t + 2;
 17355:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 17356:       return (t  //ベースレジスタ
 17357:               + (byte) w  //バイトディスプレースメント
 17358:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17359:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17360:     }  //switch
 17361:     XEiJ.mpuCycleCount += 34;
 17362:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17363:     throw M68kException.m6eSignal;
 17364:   }  //efaLeaPea
 17365: 
 17366:   //a = efaJmpJsr (ea)  //|  M  WXZP |
 17367:   //  JMP命令とJSR命令のオペランドの実効アドレスを求める
 17368:   //  efaCntWordとの違いはサイクル数のみ
 17369:   //  JMP命令のベースサイクル数8を含んでいるのでJMP命令ではベースサイクル数を加えなくてよい
 17370:   //  JSR命令のベースサイクル数は16-8=8
 17371:   @SuppressWarnings ("fallthrough") public static int efaJmpJsr (int ea) throws M68kException {
 17372:     int t, w;
 17373:     switch (ea) {
 17374:     case 0b010_000:  //(A0)
 17375:       if (XEiJ.EFA_SEPARATE_AR) {
 17376:         XEiJ.mpuCycleCount += 8;
 17377:         return XEiJ.regRn[ 8];
 17378:       }
 17379:       //fallthrough
 17380:     case 0b010_001:  //(A1)
 17381:       if (XEiJ.EFA_SEPARATE_AR) {
 17382:         XEiJ.mpuCycleCount += 8;
 17383:         return XEiJ.regRn[ 9];
 17384:       }
 17385:       //fallthrough
 17386:     case 0b010_010:  //(A2)
 17387:       if (XEiJ.EFA_SEPARATE_AR) {
 17388:         XEiJ.mpuCycleCount += 8;
 17389:         return XEiJ.regRn[10];
 17390:       }
 17391:       //fallthrough
 17392:     case 0b010_011:  //(A3)
 17393:       if (XEiJ.EFA_SEPARATE_AR) {
 17394:         XEiJ.mpuCycleCount += 8;
 17395:         return XEiJ.regRn[11];
 17396:       }
 17397:       //fallthrough
 17398:     case 0b010_100:  //(A4)
 17399:       if (XEiJ.EFA_SEPARATE_AR) {
 17400:         XEiJ.mpuCycleCount += 8;
 17401:         return XEiJ.regRn[12];
 17402:       }
 17403:       //fallthrough
 17404:     case 0b010_101:  //(A5)
 17405:       if (XEiJ.EFA_SEPARATE_AR) {
 17406:         XEiJ.mpuCycleCount += 8;
 17407:         return XEiJ.regRn[13];
 17408:       }
 17409:       //fallthrough
 17410:     case 0b010_110:  //(A6)
 17411:       if (XEiJ.EFA_SEPARATE_AR) {
 17412:         XEiJ.mpuCycleCount += 8;
 17413:         return XEiJ.regRn[14];
 17414:       }
 17415:       //fallthrough
 17416:     case 0b010_111:  //(A7)
 17417:       if (XEiJ.EFA_SEPARATE_AR) {
 17418:         XEiJ.mpuCycleCount += 8;
 17419:         return XEiJ.regRn[15];
 17420:       } else {
 17421:         XEiJ.mpuCycleCount += 8;
 17422:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 17423:       }
 17424:     case 0b101_000:  //(d16,A0)
 17425:     case 0b101_001:  //(d16,A1)
 17426:     case 0b101_010:  //(d16,A2)
 17427:     case 0b101_011:  //(d16,A3)
 17428:     case 0b101_100:  //(d16,A4)
 17429:     case 0b101_101:  //(d16,A5)
 17430:     case 0b101_110:  //(d16,A6)
 17431:     case 0b101_111:  //(d16,A7)
 17432:       XEiJ.mpuCycleCount += 10;
 17433:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17434:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17435:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 17436:       } else {
 17437:         t = XEiJ.regPC;
 17438:         XEiJ.regPC = t + 2;
 17439:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17440:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17441:       }
 17442:     case 0b110_000:  //(d8,A0,Rn.wl)
 17443:     case 0b110_001:  //(d8,A1,Rn.wl)
 17444:     case 0b110_010:  //(d8,A2,Rn.wl)
 17445:     case 0b110_011:  //(d8,A3,Rn.wl)
 17446:     case 0b110_100:  //(d8,A4,Rn.wl)
 17447:     case 0b110_101:  //(d8,A5,Rn.wl)
 17448:     case 0b110_110:  //(d8,A6,Rn.wl)
 17449:     case 0b110_111:  //(d8,A7,Rn.wl)
 17450:       XEiJ.mpuCycleCount += 14;
 17451:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17452:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 17453:       } else {
 17454:         w = XEiJ.regPC;
 17455:         XEiJ.regPC = w + 2;
 17456:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 17457:       }
 17458:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 17459:               + (byte) w  //バイトディスプレースメント
 17460:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17461:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17462:     case 0b111_000:  //(xxx).W
 17463:       XEiJ.mpuCycleCount += 10;
 17464:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 17465:     case 0b111_001:  //(xxx).L
 17466:       XEiJ.mpuCycleCount += 12;
 17467:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 17468:     case 0b111_010:  //(d16,PC)
 17469:       XEiJ.mpuCycleCount += 10;
 17470:       t = XEiJ.regPC;
 17471:       XEiJ.regPC = t + 2;
 17472:       return (t  //ベースレジスタ
 17473:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17474:     case 0b111_011:  //(d8,PC,Rn.wl)
 17475:       XEiJ.mpuCycleCount += 14;
 17476:       t = XEiJ.regPC;
 17477:       XEiJ.regPC = t + 2;
 17478:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 17479:       return (t  //ベースレジスタ
 17480:               + (byte) w  //バイトディスプレースメント
 17481:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17482:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17483:     }  //switch
 17484:     XEiJ.mpuCycleCount += 34;
 17485:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17486:     throw M68kException.m6eSignal;
 17487:   }  //efaJmpJsr
 17488: 
 17489: 
 17490: 
 17491: }  //class MC68010
 17492: 
 17493: 
 17494: