MC68010.java
     1: //========================================================================================
     2: //  MC68000.java
     3: //    en:MC68010 core
     4: //    ja:MC68010コア
     5: //  Copyright (C) 2003-2023 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 < 0) {  //命令ブレークポイントによる停止
  3968:           XEiJ.regPC = XEiJ.regPC0;
  3969:           XEiJ.mpuStop1 (null);  //"Instruction Break Point"
  3970:           break errorLoop;
  3971:         }
  3972:         XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount;
  3973:         //例外処理
  3974:         //  ここで処理するのはベクタ番号が2~31の例外に限る。TRAP #n命令はインライン展開する
  3975:         //  使用頻度が高いと思われる例外はインライン展開するのでここには来ない
  3976:         //    例外処理をインライン展開する場合はMC68000とMC68030のコードを分けなければならずコードが冗長になる
  3977:         //    使用頻度が低いと思われる例外はインライン展開しない
  3978:         //  セーブされるpcは以下の例外は命令の先頭、これ以外は次の命令
  3979:         //     2  BUS_ERROR
  3980:         //     3  ADDRESS_ERROR
  3981:         //     4  ILLEGAL_INSTRUCTION
  3982:         //     8  PRIVILEGE_VIOLATION
  3983:         //    10  LINE_1010_EMULATOR
  3984:         //    11  LINE_1111_EMULATOR
  3985:         //                                      fedcba9876543210fedcba9876543210
  3986:         //if ((1 << M68kException.m6eNumber & 0b00000000000000000000110100011100) != 0) {
  3987:         //    0123456789abcdef0123456789abcdef
  3988:         if (0b00111000101100000000000000000000 << M68kException.m6eNumber < 0) {
  3989:           XEiJ.regPC = XEiJ.regPC0;  //セーブされるpcは命令の先頭
  3990:         }
  3991:         try {
  3992:           int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  3993:           int sp = XEiJ.regRn[15];
  3994:           XEiJ.regSRT1 = 0;  //srのTビットを消す
  3995:           if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  3996:             XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
  3997:             XEiJ.mpuUSP = sp;  //USPを保存
  3998:             sp = XEiJ.mpuISP;  //SSPを復元
  3999:             if (DataBreakPoint.DBP_ON) {
  4000:               DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
  4001:             } else {
  4002:               XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
  4003:             }
  4004:             if (InstructionBreakPoint.IBP_ON) {
  4005:               InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
  4006:             }
  4007:           }
  4008:           int vectorOffset = M68kException.m6eNumber << 2;  //vector offset
  4009:           if (M68kException.m6eNumber <= M68kException.M6E_ADDRESS_ERROR) {  //バスエラーまたはアドレスエラー
  4010:             //ホストファイルシステムのデバイスコマンドを強制終了させる
  4011:             HFS.hfsState = HFS.HFS_STATE_IDLE;
  4012:             XEiJ.mpuClockTime += 50 * XEiJ.mpuModifiedUnit;
  4013:             //long format stack frame (bus error/address error)
  4014:             //    $0000   .w      status register
  4015:             //    $0002   .l      program counter
  4016:             //    $0006   .w      format and vector offset. $8008=bus error, $800C=address error
  4017:             //    $0008   .w      special status word
  4018:             //    $000A   .l      fault address
  4019:             //    $000E   .w      unused, reserved
  4020:             //    $0010   .w      data output buffer
  4021:             //    $0012   .w      unused, reserved
  4022:             //    $0014   .w      data input buffer
  4023:             //    $0016   .w      unused, reserved
  4024:             //    $0018   .w      instruction input buffer
  4025:             //    $001A   .w[16]  internal information, 16 words
  4026:             //    29 words, 58 bytes
  4027:             //special status word
  4028:             //    bit15   RR      Rerun flag; 0=processor rerun (default), 1=software rerun
  4029:             //    bit14   *       These bits are reserved for future use by Motorola and will be zero when written by the MC68010.
  4030:             //    bit13   IF      Instruction fetch to the instruction input buffer
  4031:             //    bit12   DF      Data fetch to the data input buffer
  4032:             //    bit11   RM      Read-modify-write cycle
  4033:             //    bit10   HB      High-byte transfer from the data output buffer or to the data input buffer
  4034:             //    bit9    BY      Byte-transfer flag; HB selects the high or low byte of the transfer register.
  4035:             //                    If BY is clear, the transfer is word.
  4036:             //    bit8    RW      Read/write flag; 0=write, 1=read
  4037:             //    bit7-3  *
  4038:             //    bit2-0  FC2-FC0 The function code used during the faulted access
  4039:             XEiJ.regRn[15] = sp -= 58;  //long format
  4040:             XEiJ.busWl (sp + 10, M68kException.m6eAddress);  //fault address
  4041:             XEiJ.busWw (sp + 8,
  4042:                         (M68kException.m6eSize == XEiJ.MPU_SS_BYTE ? 0x0200 : 0x0000) |  //BY
  4043:                         (M68kException.m6eDirection == XEiJ.MPU_WR_READ ? 0x0100 : 0x0000)  //RW
  4044:                         //!!! 他のフラグをセットしていない
  4045:                         );  //special status word
  4046:             XEiJ.busWw (sp + 6, 0x8000 | vectorOffset);  //format and vector offset
  4047:             XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  4048:             XEiJ.busWw (sp, save_sr);  //status register
  4049:           } else {
  4050:             //short format stack frame
  4051:             //    $0000   .w      status register
  4052:             //    $0002   .l      program counter
  4053:             //    $0006   .w      format and vector offset
  4054:             //    4 words, 8 bytes
  4055:             XEiJ.regRn[15] = sp -= 8;  //short format
  4056:             XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
  4057:             XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  4058:             XEiJ.busWw (sp, save_sr);  //status register
  4059:           }
  4060:           irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
  4061:           if (XEiJ.dbgStopOnError) {  //エラーで停止する場合
  4062:             if (XEiJ.dbgDoStopOnError ()) {
  4063:               break errorLoop;
  4064:             }
  4065:           }
  4066:         } catch (M68kException ee) {  //ダブルバスフォルト
  4067:           XEiJ.dbgDoubleBusFault ();
  4068:           break errorLoop;
  4069:         }
  4070:       }  //catch M68kException
  4071:     }  //例外ループ
  4072: 
  4073:     //  通常
  4074:     //    pc0  最後に実行した命令
  4075:     //    pc  次に実行する命令
  4076:     //  バスエラー、アドレスエラー、不当命令、特権違反で停止したとき
  4077:     //    pc0  エラーを発生させた命令
  4078:     //    pc  例外処理ルーチンの先頭
  4079:     //  ダブルバスフォルトで停止したとき
  4080:     //    pc0  エラーを発生させた命令
  4081:     //    pc  エラーを発生させた命令
  4082:     //  命令ブレークポイントで停止したとき
  4083:     //    pc0  命令ブレークポイントが設定された、次に実行する命令
  4084:     //    pc  命令ブレークポイントが設定された、次に実行する命令
  4085:     //  データブレークポイントで停止したとき
  4086:     //    pc0  データを書き換えた、最後に実行した命令
  4087:     //    pc  次に実行する命令
  4088: 
  4089:     //分岐ログに停止レコードを記録する
  4090:     if (BranchLog.BLG_ON) {
  4091:       //BranchLog.blgStop ();
  4092:       int i = (char) BranchLog.blgNewestRecord << BranchLog.BLG_RECORD_SHIFT;
  4093:       BranchLog.blgArray[i] = BranchLog.blgHead | BranchLog.blgSuper;
  4094:       BranchLog.blgArray[i + 1] = XEiJ.regPC;  //次に実行する命令
  4095:     }
  4096: 
  4097:   }  //mpuCore()
  4098: 
  4099: 
  4100: 
  4101:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4102:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4103:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4104:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4105:   //ORI.B #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_000_mmm_rrr-{data}
  4106:   //OR.B #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_000_mmm_rrr-{data}  [ORI.B #<data>,<ea>]
  4107:   //ORI.B #<data>,CCR                               |-|012346|-|*****|*****|          |0000_000_000_111_100-{data}
  4108:   public static void irpOriByte () throws M68kException {
  4109:     int ea = XEiJ.regOC & 63;
  4110:     int z;
  4111:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4112:       z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4113:     } else {
  4114:       z = XEiJ.regPC;
  4115:       XEiJ.regPC = z + 2;
  4116:       z = XEiJ.busRbs (z + 1);  //pcbs
  4117:     }
  4118:     if (ea < XEiJ.EA_AR) {  //ORI.B #<data>,Dr
  4119:       if (XEiJ.DBG_ORI_BYTE_ZERO_D0) {
  4120:         if (z == 0 && ea == 0 && XEiJ.dbgOriByteZeroD0) {  //ORI.B #$00,D0
  4121:           XEiJ.mpuCycleCount += 34;
  4122:           M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4123:           throw M68kException.m6eSignal;
  4124:         }
  4125:       }
  4126:       XEiJ.mpuCycleCount += 8;
  4127:       z = XEiJ.regRn[ea] |= 255 & z;  //0拡張してからOR
  4128:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4129:     } else if (ea == XEiJ.EA_IM) {  //ORI.B #<data>,CCR
  4130:       XEiJ.mpuCycleCount += 20;
  4131:       XEiJ.regCCR |= XEiJ.REG_CCR_MASK & z;
  4132:     } else {  //ORI.B #<data>,<mem>
  4133:       XEiJ.mpuCycleCount += 12;
  4134:       int a = efaMltByte (ea);
  4135:       XEiJ.busWb (a, z |= XEiJ.busRbs (a));
  4136:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4137:     }
  4138:   }  //irpOriByte
  4139: 
  4140:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4141:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4142:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4143:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4144:   //ORI.W #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_001_mmm_rrr-{data}
  4145:   //OR.W #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_001_mmm_rrr-{data}  [ORI.W #<data>,<ea>]
  4146:   //ORI.W #<data>,SR                                |-|012346|P|*****|*****|          |0000_000_001_111_100-{data}
  4147:   public static void irpOriWord () throws M68kException {
  4148:     int ea = XEiJ.regOC & 63;
  4149:     if (ea < XEiJ.EA_AR) {  //ORI.W #<data>,Dr
  4150:       int z;
  4151:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4152:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4153:       } else {
  4154:         z = XEiJ.regPC;
  4155:         XEiJ.regPC = z + 2;
  4156:         z = XEiJ.busRwse (z);  //pcws
  4157:       }
  4158:       XEiJ.mpuCycleCount += 8;
  4159:       z = XEiJ.regRn[ea] |= (char) z;  //0拡張してからOR
  4160:       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
  4161:     } else if (ea == XEiJ.EA_IM) {  //ORI.W #<data>,SR
  4162:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  4163:         XEiJ.mpuCycleCount += 34;
  4164:         M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  4165:         throw M68kException.m6eSignal;
  4166:       }
  4167:       //以下はスーパーバイザモード
  4168:       XEiJ.mpuCycleCount += 20;
  4169:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4170:         irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  4171:       } else {
  4172:         int t = XEiJ.regPC;
  4173:         XEiJ.regPC = t + 2;
  4174:         irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse (t));  //pcws。特権違反チェックが先
  4175:       }
  4176:     } else {  //ORI.W #<data>,<mem>
  4177:       int z;
  4178:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4179:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4180:       } else {
  4181:         z = XEiJ.regPC;
  4182:         XEiJ.regPC = z + 2;
  4183:         z = XEiJ.busRwse (z);  //pcws
  4184:       }
  4185:       XEiJ.mpuCycleCount += 12;
  4186:       int a = efaMltWord (ea);
  4187:       XEiJ.busWw (a, z |= XEiJ.busRws (a));
  4188:       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
  4189:     }
  4190:   }  //irpOriWord
  4191: 
  4192:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4193:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4194:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4195:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4196:   //ORI.L #<data>,<ea>                              |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_000_010_mmm_rrr-{data}
  4197:   //OR.L #<data>,<ea>                               |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_000_010_mmm_rrr-{data}  [ORI.L #<data>,<ea>]
  4198:   public static void irpOriLong () throws M68kException {
  4199:     int ea = XEiJ.regOC & 63;
  4200:     int y;
  4201:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4202:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4203:     } else {
  4204:       y = XEiJ.regPC;
  4205:       XEiJ.regPC = y + 4;
  4206:       y = XEiJ.busRlse (y);  //pcls
  4207:     }
  4208:     int z;
  4209:     if (ea < XEiJ.EA_AR) {  //ORI.L #<data>,Dr
  4210:       XEiJ.mpuCycleCount += 16;
  4211:       z = XEiJ.regRn[ea] |= y;
  4212:     } else {  //ORI.L #<data>,<mem>
  4213:       XEiJ.mpuCycleCount += 20;
  4214:       int a = efaMltLong (ea);
  4215:       XEiJ.busWl (a, z = XEiJ.busRls (a) | y);
  4216:     }
  4217:     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
  4218:   }  //irpOriLong
  4219: 
  4220:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4221:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4222:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4223:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4224:   //BITREV.L Dr                                     |-|------|-|-----|-----|D         |0000_000_011_000_rrr (ISA_C)
  4225:   //
  4226:   //BITREV.L Dr
  4227:   //  Drのビットの並びを逆順にする。CCRは変化しない
  4228:   public static void irpCmp2Chk2Byte () throws M68kException {
  4229:     int ea = XEiJ.regOC & 63;
  4230:     if (ea < XEiJ.EA_AR) {  //BITREV.L Dr
  4231:       XEiJ.mpuCycleCount += 4;
  4232:       if (XEiJ.IRP_BITREV_REVERSE) {  //2.83ns  0x0f801f3c
  4233:         XEiJ.regRn[ea] = Integer.reverse (XEiJ.regRn[ea]);
  4234:       } else if (XEiJ.IRP_BITREV_SHIFT) {  //2.57ns  0x0f801f3c
  4235:         int x = XEiJ.regRn[ea];
  4236:         x = x << 16 | x >>> 16;
  4237:         x = x << 8 & 0xff00ff00 | x >>> 8 & 0x00ff00ff;
  4238:         x = x << 4 & 0xf0f0f0f0 | x >>> 4 & 0x0f0f0f0f;
  4239:         x = x << 2 & 0xcccccccc | x >>> 2 & 0x33333333;
  4240:         XEiJ.regRn[ea] = x << 1 & 0xaaaaaaaa | x >>> 1 & 0x55555555;
  4241:       } else if (XEiJ.IRP_BITREV_TABLE) {  //1.57ns  0x0f801f3c
  4242:         int x = XEiJ.regRn[ea];
  4243:         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];
  4244:       }
  4245:     } else {  //CMP2/CHK2.B <ea>,Rn
  4246:       //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない
  4247:       XEiJ.mpuCycleCount += 34;
  4248:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4249:       throw M68kException.m6eSignal;
  4250:     }
  4251:   }  //irpCmp2Chk2Byte
  4252: 
  4253:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4254:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4255:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4256:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4257:   //BTST.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_100_000_rrr
  4258:   //MOVEP.W (d16,Ar),Dq                             |-|01234S|-|-----|-----|          |0000_qqq_100_001_rrr-{data}
  4259:   //BTST.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZPI|0000_qqq_100_mmm_rrr
  4260:   public static void irpBtstReg () throws M68kException {
  4261:     int ea = XEiJ.regOC & 63;
  4262:     int qqq = XEiJ.regOC >> 9;  //qqq
  4263:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.W (d16,Ar),Dq
  4264:       XEiJ.mpuCycleCount += 16;
  4265:       int a;
  4266:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4267:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4268:       } else {
  4269:         a = XEiJ.regPC;
  4270:         XEiJ.regPC = a + 2;
  4271:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4272:       }
  4273:       XEiJ.regRn[qqq] = ~0xffff & XEiJ.regRn[qqq] | XEiJ.busRbz (a) << 8 | XEiJ.busRbz (a + 2);  //Javaは評価順序が保証されている
  4274:     } else {  //BTST.L Dq,Dr/<ea>
  4275:       int y = XEiJ.regRn[qqq];
  4276:       if (ea < XEiJ.EA_AR) {  //BTST.L Dq,Dr
  4277:         XEiJ.mpuCycleCount += 6;
  4278:         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を省略
  4279:       } else {  //BTST.B Dq,<ea>
  4280:         XEiJ.mpuCycleCount += 4;
  4281:         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
  4282:       }
  4283:     }
  4284:   }  //irpBtstReg
  4285: 
  4286:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4287:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4288:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4289:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4290:   //BCHG.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_101_000_rrr
  4291:   //MOVEP.L (d16,Ar),Dq                             |-|01234S|-|-----|-----|          |0000_qqq_101_001_rrr-{data}
  4292:   //BCHG.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_101_mmm_rrr
  4293:   public static void irpBchgReg () throws M68kException {
  4294:     int ea = XEiJ.regOC & 63;
  4295:     int qqq = XEiJ.regOC >> 9;  //qqq
  4296:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.L (d16,Ar),Dq
  4297:       XEiJ.mpuCycleCount += 24;
  4298:       int a;
  4299:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4300:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4301:       } else {
  4302:         a = XEiJ.regPC;
  4303:         XEiJ.regPC = a + 2;
  4304:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4305:       }
  4306:       XEiJ.regRn[qqq] = XEiJ.busRbs (a) << 24 | XEiJ.busRbz (a + 2) << 16 | XEiJ.busRbz (a + 4) << 8 | XEiJ.busRbz (a + 6);  //Javaは評価順序が保証されている
  4307:     } else {  //BCHG.L Dq,Dr/<ea>
  4308:       int x;
  4309:       int y = XEiJ.regRn[qqq];
  4310:       if (ea < XEiJ.EA_AR) {  //BCHG.L Dq,Dr
  4311:         XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4312:         XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8;  //(0xffff&y)!=0
  4313:       } else {  //BCHG.B Dq,<ea>
  4314:         XEiJ.mpuCycleCount += 8;
  4315:         int a = efaMltByte (ea);
  4316:         XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7)));
  4317:       }
  4318:       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
  4319:     }
  4320:   }  //irpBchgReg
  4321: 
  4322:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4323:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4324:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4325:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4326:   //BCLR.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_110_000_rrr
  4327:   //MOVEP.W Dq,(d16,Ar)                             |-|01234S|-|-----|-----|          |0000_qqq_110_001_rrr-{data}
  4328:   //BCLR.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_110_mmm_rrr
  4329:   public static void irpBclrReg () throws M68kException {
  4330:     int ea = XEiJ.regOC & 63;
  4331:     int y = XEiJ.regRn[XEiJ.regOC >> 9];  //qqq
  4332:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.W Dq,(d16,Ar)
  4333:       XEiJ.mpuCycleCount += 16;
  4334:       int a;
  4335:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4336:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4337:       } else {
  4338:         a = XEiJ.regPC;
  4339:         XEiJ.regPC = a + 2;
  4340:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4341:       }
  4342:       XEiJ.busWb (a, y >> 8);
  4343:       XEiJ.busWb (a + 2, y);
  4344:     } else {  //BCLR.L Dq,Dr/<ea>
  4345:       int x;
  4346:       if (ea < XEiJ.EA_AR) {  //BCLR.L Dq,Dr
  4347:         XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4348:         XEiJ.mpuCycleCount += (char) y != 0 ? 8 : 10;  //(0xffff&y)!=0
  4349:       } else {  //BCLR.B Dq,<ea>
  4350:         XEiJ.mpuCycleCount += 8;
  4351:         int a = efaMltByte (ea);
  4352:         XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7)));
  4353:       }
  4354:       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
  4355:     }
  4356:   }  //irpBclrReg
  4357: 
  4358:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4359:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4360:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4361:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4362:   //BSET.L Dq,Dr                                    |-|012346|-|--U--|--*--|D         |0000_qqq_111_000_rrr
  4363:   //MOVEP.L Dq,(d16,Ar)                             |-|01234S|-|-----|-----|          |0000_qqq_111_001_rrr-{data}
  4364:   //BSET.B Dq,<ea>                                  |-|012346|-|--U--|--*--|  M+-WXZ  |0000_qqq_111_mmm_rrr
  4365:   public static void irpBsetReg () throws M68kException {
  4366:     int ea = XEiJ.regOC & 63;
  4367:     int y = XEiJ.regRn[XEiJ.regOC >> 9];  //qqq
  4368:     if (ea >> 3 == XEiJ.MMM_AR) {  //MOVEP.L Dq,(d16,Ar)
  4369:       XEiJ.mpuCycleCount += 24;
  4370:       int a;
  4371:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4372:         a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws。このr[ea]はアドレスレジスタ
  4373:       } else {
  4374:         a = XEiJ.regPC;
  4375:         XEiJ.regPC = a + 2;
  4376:         a = XEiJ.regRn[ea] + XEiJ.busRwse (a);  //pcws。このr[ea]はアドレスレジスタ
  4377:       }
  4378:       XEiJ.busWb (a, y >> 24);
  4379:       XEiJ.busWb (a + 2, y >> 16);
  4380:       XEiJ.busWb (a + 4, y >> 8);
  4381:       XEiJ.busWb (a + 6, y);
  4382:     } else {  //BSET.L Dq,Dr/<ea>
  4383:       int x;
  4384:       if (ea < XEiJ.EA_AR) {  //BSET.L Dq,Dr
  4385:         XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4386:         XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8;  //(0xffff&y)!=0
  4387:       } else {  //BSET.B Dq,<ea>
  4388:         XEiJ.mpuCycleCount += 8;
  4389:         int a = efaMltByte (ea);
  4390:         XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7)));
  4391:       }
  4392:       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
  4393:     }
  4394:   }  //irpBsetReg
  4395: 
  4396:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4397:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4398:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4399:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4400:   //ANDI.B #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_000_mmm_rrr-{data}
  4401:   //AND.B #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_000_mmm_rrr-{data}  [ANDI.B #<data>,<ea>]
  4402:   //ANDI.B #<data>,CCR                              |-|012346|-|*****|*****|          |0000_001_000_111_100-{data}
  4403:   public static void irpAndiByte () throws M68kException {
  4404:     int ea = XEiJ.regOC & 63;
  4405:     int z;
  4406:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4407:       z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4408:     } else {
  4409:       z = XEiJ.regPC;
  4410:       XEiJ.regPC = z + 2;
  4411:       z = XEiJ.busRbs (z + 1);  //pcbs
  4412:     }
  4413:     if (ea < XEiJ.EA_AR) {  //ANDI.B #<data>,Dr
  4414:       XEiJ.mpuCycleCount += 8;
  4415:       z = XEiJ.regRn[ea] &= ~255 | z;  //1拡張してからAND
  4416:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4417:     } else if (ea == XEiJ.EA_IM) {  //ANDI.B #<data>,CCR
  4418:       XEiJ.mpuCycleCount += 20;
  4419:       XEiJ.regCCR &= z;
  4420:     } else {  //ANDI.B #<data>,<mem>
  4421:       XEiJ.mpuCycleCount += 12;
  4422:       int a = efaMltByte (ea);
  4423:       XEiJ.busWb (a, z &= XEiJ.busRbs (a));
  4424:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4425:     }
  4426:   }  //irpAndiByte
  4427: 
  4428:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4429:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4430:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4431:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4432:   //ANDI.W #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_001_mmm_rrr-{data}
  4433:   //AND.W #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_001_mmm_rrr-{data}  [ANDI.W #<data>,<ea>]
  4434:   //ANDI.W #<data>,SR                               |-|012346|P|*****|*****|          |0000_001_001_111_100-{data}
  4435:   public static void irpAndiWord () throws M68kException {
  4436:     int ea = XEiJ.regOC & 63;
  4437:     if (ea < XEiJ.EA_AR) {  //ANDI.W #<data>,Dr
  4438:       int z;
  4439:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4440:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4441:       } else {
  4442:         z = XEiJ.regPC;
  4443:         XEiJ.regPC = z + 2;
  4444:         z = XEiJ.busRwse (z);  //pcws
  4445:       }
  4446:       XEiJ.mpuCycleCount += 8;
  4447:       z = XEiJ.regRn[ea] &= ~65535 | z;  //1拡張してからAND
  4448:       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
  4449:     } else if (ea == XEiJ.EA_IM) {  //ANDI.W #<data>,SR
  4450:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  4451:         XEiJ.mpuCycleCount += 34;
  4452:         M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  4453:         throw M68kException.m6eSignal;
  4454:       }
  4455:       //以下はスーパーバイザモード
  4456:       XEiJ.mpuCycleCount += 20;
  4457:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4458:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  4459:       } else {
  4460:         int t = XEiJ.regPC;
  4461:         XEiJ.regPC = t + 2;
  4462:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse (t));  //pcws。特権違反チェックが先
  4463:       }
  4464:     } else {  //ANDI.W #<data>,<mem>
  4465:       int z;
  4466:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4467:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4468:       } else {
  4469:         z = XEiJ.regPC;
  4470:         XEiJ.regPC = z + 2;
  4471:         z = XEiJ.busRwse (z);  //pcws
  4472:       }
  4473:       XEiJ.mpuCycleCount += 12;
  4474:       int a = efaMltWord (ea);
  4475:       XEiJ.busWw (a, z &= XEiJ.busRws (a));
  4476:       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
  4477:     }
  4478:   }  //irpAndiWord
  4479: 
  4480:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4481:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4482:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4483:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4484:   //ANDI.L #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_001_010_mmm_rrr-{data}
  4485:   //AND.L #<data>,<ea>                              |A|012346|-|-UUUU|-**00|  M+-WXZ  |0000_001_010_mmm_rrr-{data}  [ANDI.L #<data>,<ea>]
  4486:   public static void irpAndiLong () throws M68kException {
  4487:     int ea = XEiJ.regOC & 63;
  4488:     int y;
  4489:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4490:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4491:     } else {
  4492:       y = XEiJ.regPC;
  4493:       XEiJ.regPC = y + 4;
  4494:       y = XEiJ.busRlse (y);  //pcls
  4495:     }
  4496:     int z;
  4497:     if (ea < XEiJ.EA_AR) {  //ANDI.L #<data>,Dr
  4498:       XEiJ.mpuCycleCount += 16;
  4499:       z = XEiJ.regRn[ea] &= y;
  4500:     } else {  //ANDI.L #<data>,<mem>
  4501:       XEiJ.mpuCycleCount += 20;
  4502:       int a = efaMltLong (ea);
  4503:       XEiJ.busWl (a, z = XEiJ.busRls (a) & y);
  4504:     }
  4505:     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
  4506:   }  //irpAndiLong
  4507: 
  4508:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4509:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4510:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4511:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4512:   //BYTEREV.L Dr                                    |-|------|-|-----|-----|D         |0000_001_011_000_rrr (ISA_C)
  4513:   //
  4514:   //BYTEREV.L Dr
  4515:   //  Drのバイトの並びを逆順にする。CCRは変化しない
  4516:   public static void irpCmp2Chk2Word () throws M68kException {
  4517:     int ea = XEiJ.regOC & 63;
  4518:     if (ea < XEiJ.EA_AR) {  //BYTEREV.L Dr
  4519:       XEiJ.mpuCycleCount += 4;
  4520:       if (true) {  //0.10ns-0.18ns  0x782750ec
  4521:         XEiJ.regRn[ea] = Integer.reverseBytes (XEiJ.regRn[ea]);
  4522:       } else {  //1.06ns  0x782750ec
  4523:         int x = XEiJ.regRn[ea];
  4524:         XEiJ.regRn[ea] = x << 24 | x << 8 & 0x00ff0000 | x >>> 8 & 0x0000ff00 | x >>> 24;
  4525:       }
  4526:     } else {  //CMP2/CHK2.W <ea>,Rn
  4527:       //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない
  4528:       XEiJ.mpuCycleCount += 34;
  4529:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4530:       throw M68kException.m6eSignal;
  4531:     }
  4532:   }  //irpCmp2Chk2Word
  4533: 
  4534:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4535:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4536:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4537:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4538:   //SUBI.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_000_mmm_rrr-{data}
  4539:   //SUB.B #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_000_mmm_rrr-{data}  [SUBI.B #<data>,<ea>]
  4540:   public static void irpSubiByte () throws M68kException {
  4541:     int ea = XEiJ.regOC & 63;
  4542:     int x;
  4543:     int y;
  4544:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4545:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4546:     } else {
  4547:       y = XEiJ.regPC;
  4548:       XEiJ.regPC = y + 2;
  4549:       y = XEiJ.busRbs (y + 1);  //pcbs
  4550:     }
  4551:     int z;
  4552:     if (ea < XEiJ.EA_AR) {  //SUBI.B #<data>,Dr
  4553:       XEiJ.mpuCycleCount += 8;
  4554:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y);
  4555:     } else {  //SUBI.B #<data>,<mem>
  4556:       XEiJ.mpuCycleCount += 12;
  4557:       int a = efaMltByte (ea);
  4558:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y));
  4559:     }
  4560:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4561:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  4562:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
  4563:   }  //irpSubiByte
  4564: 
  4565:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4566:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4567:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4568:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4569:   //SUBI.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_001_mmm_rrr-{data}
  4570:   //SUB.W #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_001_mmm_rrr-{data}  [SUBI.W #<data>,<ea>]
  4571:   public static void irpSubiWord () throws M68kException {
  4572:     int ea = XEiJ.regOC & 63;
  4573:     int x;
  4574:     int y;
  4575:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4576:       y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4577:     } else {
  4578:       y = XEiJ.regPC;
  4579:       XEiJ.regPC = y + 2;
  4580:       y = XEiJ.busRwse (y);  //pcws
  4581:     }
  4582:     int z;
  4583:     if (ea < XEiJ.EA_AR) {  //SUBI.W #<data>,Dr
  4584:       XEiJ.mpuCycleCount += 8;
  4585:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y));
  4586:     } else {  //SUBI.W #<data>,<mem>
  4587:       XEiJ.mpuCycleCount += 12;
  4588:       int a = efaMltWord (ea);
  4589:       XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y));
  4590:     }
  4591:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4592:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  4593:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
  4594:   }  //irpSubiWord
  4595: 
  4596:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4597:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4598:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4599:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4600:   //SUBI.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_010_010_mmm_rrr-{data}
  4601:   //SUB.L #<data>,<ea>                              |A|012346|-|UUUUU|*****|  M+-WXZ  |0000_010_010_mmm_rrr-{data}  [SUBI.L #<data>,<ea>]
  4602:   public static void irpSubiLong () throws M68kException {
  4603:     int ea = XEiJ.regOC & 63;
  4604:     int x;
  4605:     int y;
  4606:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4607:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4608:     } else {
  4609:       y = XEiJ.regPC;
  4610:       XEiJ.regPC = y + 4;
  4611:       y = XEiJ.busRlse (y);  //pcls
  4612:     }
  4613:     int z;
  4614:     if (ea < XEiJ.EA_AR) {  //SUBI.L #<data>,Dr
  4615:       XEiJ.mpuCycleCount += 16;
  4616:       XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y;
  4617:     } else {  //SUBI.L #<data>,<mem>
  4618:       XEiJ.mpuCycleCount += 20;
  4619:       int a = efaMltLong (ea);
  4620:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y);
  4621:     }
  4622:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4623:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  4624:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
  4625:   }  //irpSubiLong
  4626: 
  4627:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4628:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4629:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4630:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4631:   //FF1.L Dr                                        |-|------|-|-UUUU|-**00|D         |0000_010_011_000_rrr (ISA_C)
  4632:   //
  4633:   //FF1.L Dr
  4634:   //  Drの最上位の1のbit31からのオフセットをDrに格納する
  4635:   //  Drが0のときは32になる
  4636:   public static void irpCmp2Chk2Long () throws M68kException {
  4637:     int ea = XEiJ.regOC & 63;
  4638:     if (ea < XEiJ.EA_AR) {  //FF1.L Dr
  4639:       XEiJ.mpuCycleCount += 4;
  4640:       int z = XEiJ.regRn[ea];
  4641:       if (true) {
  4642:         XEiJ.regRn[ea] = Integer.numberOfLeadingZeros (z);
  4643:       } else {
  4644:         if (z == 0) {
  4645:           XEiJ.regRn[ea] = 32;
  4646:         } else {
  4647:           int k = -(z >>> 16) >> 16 & 16;
  4648:           k += -(z >>> k + 8) >> 8 & 8;
  4649:           k += -(z >>> k + 4) >> 4 & 4;
  4650:           //     bit3  1  1  1  1  1  1  1  1  0  0  0  0  0  0  0  0
  4651:           //     bit2  1  1  1  1  0  0  0  0  1  1  1  1  0  0  0  0
  4652:           //     bit1  1  1  0  0  1  1  0  0  1  1  0  0  1  1  0  0
  4653:           //     bit0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0
  4654:           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だけが使用される
  4655:         }
  4656:       }
  4657:       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
  4658:     } else {  //CMP2/CHK2.L <ea>,Rn
  4659:       //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない
  4660:       XEiJ.mpuCycleCount += 34;
  4661:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  4662:       throw M68kException.m6eSignal;
  4663:     }
  4664:   }  //irpCmp2Chk2Long
  4665: 
  4666:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4667:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4668:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4669:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4670:   //ADDI.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_000_mmm_rrr-{data}
  4671:   public static void irpAddiByte () throws M68kException {
  4672:     int ea = XEiJ.regOC & 63;
  4673:     int x;
  4674:     int y;
  4675:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4676:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4677:     } else {
  4678:       y = XEiJ.regPC;
  4679:       XEiJ.regPC = y + 2;
  4680:       y = XEiJ.busRbs (y + 1);  //pcbs
  4681:     }
  4682:     int z;
  4683:     if (ea < XEiJ.EA_AR) {  //ADDI.B #<data>,Dr
  4684:       XEiJ.mpuCycleCount += 8;
  4685:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y);
  4686:     } else {  //ADDI.B #<data>,<mem>
  4687:       XEiJ.mpuCycleCount += 12;
  4688:       int a = efaMltByte (ea);
  4689:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y));
  4690:     }
  4691:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4692:            ((x ^ z) & (y ^ z)) >>> 31 << 1 |
  4693:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
  4694:   }  //irpAddiByte
  4695: 
  4696:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4697:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4698:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4699:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4700:   //ADDI.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_001_mmm_rrr-{data}
  4701:   public static void irpAddiWord () throws M68kException {
  4702:     int ea = XEiJ.regOC & 63;
  4703:     int x;
  4704:     int y;
  4705:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4706:       y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4707:     } else {
  4708:       y = XEiJ.regPC;
  4709:       XEiJ.regPC = y + 2;
  4710:       y = XEiJ.busRwse (y);  //pcws
  4711:     }
  4712:     int z;
  4713:     if (ea < XEiJ.EA_AR) {  //ADDI.W #<data>,Dr
  4714:       XEiJ.mpuCycleCount += 8;
  4715:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y));
  4716:     } else {  //ADDI.W #<data>,<mem>
  4717:       XEiJ.mpuCycleCount += 12;
  4718:       int a = efaMltWord (ea);
  4719:       XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y));
  4720:     }
  4721:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4722:            ((x ^ z) & (y ^ z)) >>> 31 << 1 |
  4723:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
  4724:   }  //irpAddiWord
  4725: 
  4726:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4727:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4728:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4729:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4730:   //ADDI.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0000_011_010_mmm_rrr-{data}
  4731:   public static void irpAddiLong () throws M68kException {
  4732:     int ea = XEiJ.regOC & 63;
  4733:     int x;
  4734:     int y;
  4735:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4736:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4737:     } else {
  4738:       y = XEiJ.regPC;
  4739:       XEiJ.regPC = y + 4;
  4740:       y = XEiJ.busRlse (y);  //pcls
  4741:     }
  4742:     int z;
  4743:     if (ea < XEiJ.EA_AR) {  //ADDI.L #<data>,Dr
  4744:       XEiJ.mpuCycleCount += 16;
  4745:       XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y;
  4746:     } else {  //ADDI.L #<data>,<mem>
  4747:       XEiJ.mpuCycleCount += 20;
  4748:       int a = efaMltLong (ea);
  4749:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y);
  4750:     }
  4751:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  4752:            ((x ^ z) & (y ^ z)) >>> 31 << 1 |
  4753:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
  4754:   }  //irpAddiLong
  4755: 
  4756:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4757:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4758:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4759:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4760:   //BTST.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_000_000_rrr-{data}
  4761:   //BTST.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZP |0000_100_000_mmm_rrr-{data}
  4762:   public static void irpBtstImm () throws M68kException {
  4763:     int ea = XEiJ.regOC & 63;
  4764:     int y;
  4765:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4766:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4767:     } else {
  4768:       y = XEiJ.regPC;
  4769:       XEiJ.regPC = y + 2;
  4770:       y = XEiJ.busRbs (y + 1);  //pcbs
  4771:     }
  4772:     if (ea < XEiJ.EA_AR) {  //BTST.L #<data>,Dr
  4773:       XEiJ.mpuCycleCount += 10;
  4774:       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を省略
  4775:     } else {  //BTST.B #<data>,<ea>
  4776:       XEiJ.mpuCycleCount += 8;
  4777:       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
  4778:     }
  4779:   }  //irpBtstImm
  4780: 
  4781:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4782:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4783:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4784:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4785:   //BCHG.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_001_000_rrr-{data}
  4786:   //BCHG.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_001_mmm_rrr-{data}
  4787:   public static void irpBchgImm () throws M68kException {
  4788:     int ea = XEiJ.regOC & 63;
  4789:     int x;
  4790:     int y;
  4791:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4792:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4793:     } else {
  4794:       y = XEiJ.regPC;
  4795:       XEiJ.regPC = y + 2;
  4796:       y = XEiJ.busRbs (y + 1);  //pcbs
  4797:     }
  4798:     if (ea < XEiJ.EA_AR) {  //BCHG.L #<data>,Dr
  4799:       XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4800:       XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12;  //(0xffff&y)!=0
  4801:     } else {  //BCHG.B #<data>,<ea>
  4802:       XEiJ.mpuCycleCount += 12;
  4803:       int a = efaMltByte (ea);
  4804:       XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7)));
  4805:     }
  4806:     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
  4807:   }  //irpBchgImm
  4808: 
  4809:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4810:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4811:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4812:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4813:   //BCLR.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_010_000_rrr-{data}
  4814:   //BCLR.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_010_mmm_rrr-{data}
  4815:   public static void irpBclrImm () throws M68kException {
  4816:     int ea = XEiJ.regOC & 63;
  4817:     int x;
  4818:     int y;
  4819:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4820:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4821:     } else {
  4822:       y = XEiJ.regPC;
  4823:       XEiJ.regPC = y + 2;
  4824:       y = XEiJ.busRbs (y + 1);  //pcbs
  4825:     }
  4826:     if (ea < XEiJ.EA_AR) {  //BCLR.L #<data>,Dr
  4827:       XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4828:       XEiJ.mpuCycleCount += (char) y != 0 ? 12 : 14;  //(0xffff&y)!=0
  4829:     } else {  //BCLR.B #<data>,<ea>
  4830:       XEiJ.mpuCycleCount += 12;
  4831:       int a = efaMltByte (ea);
  4832:       XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7)));
  4833:     }
  4834:     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
  4835:   }  //irpBclrImm
  4836: 
  4837:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4838:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4839:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4840:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4841:   //BSET.L #<data>,Dr                               |-|012346|-|--U--|--*--|D         |0000_100_011_000_rrr-{data}
  4842:   //BSET.B #<data>,<ea>                             |-|012346|-|--U--|--*--|  M+-WXZ  |0000_100_011_mmm_rrr-{data}
  4843:   public static void irpBsetImm () throws M68kException {
  4844:     int ea = XEiJ.regOC & 63;
  4845:     int x;
  4846:     int y;
  4847:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4848:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4849:     } else {
  4850:       y = XEiJ.regPC;
  4851:       XEiJ.regPC = y + 2;
  4852:       y = XEiJ.busRbs (y + 1);  //pcbs
  4853:     }
  4854:     if (ea < XEiJ.EA_AR) {  //BSET.L #<data>,Dr
  4855:       XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y);  //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略
  4856:       XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12;  //(0xffff&y)!=0
  4857:     } else {  //BSET.B #<data>,<ea>
  4858:       XEiJ.mpuCycleCount += 12;
  4859:       int a = efaMltByte (ea);
  4860:       XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7)));
  4861:     }
  4862:     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
  4863:   }  //irpBsetImm
  4864: 
  4865:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4866:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4867:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4868:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4869:   //EORI.B #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_000_mmm_rrr-{data}
  4870:   //EOR.B #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_000_mmm_rrr-{data}  [EORI.B #<data>,<ea>]
  4871:   //EORI.B #<data>,CCR                              |-|012346|-|*****|*****|          |0000_101_000_111_100-{data}
  4872:   public static void irpEoriByte () throws M68kException {
  4873:     int ea = XEiJ.regOC & 63;
  4874:     int z;
  4875:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4876:       z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4877:     } else {
  4878:       z = XEiJ.regPC;
  4879:       XEiJ.regPC = z + 2;
  4880:       z = XEiJ.busRbs (z + 1);  //pcbs
  4881:     }
  4882:     if (ea < XEiJ.EA_AR) {  //EORI.B #<data>,Dr
  4883:       XEiJ.mpuCycleCount += 8;
  4884:       z = XEiJ.regRn[ea] ^= 255 & z;  //0拡張してからEOR
  4885:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4886:     } else if (ea == XEiJ.EA_IM) {  //EORI.B #<data>,CCR
  4887:       XEiJ.mpuCycleCount += 20;
  4888:       XEiJ.regCCR ^= XEiJ.REG_CCR_MASK & z;
  4889:     } else {  //EORI.B #<data>,<mem>
  4890:       XEiJ.mpuCycleCount += 12;
  4891:       int a = efaMltByte (ea);
  4892:       XEiJ.busWb (a, z ^= XEiJ.busRbs (a));
  4893:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  4894:     }
  4895:   }  //irpEoriByte
  4896: 
  4897:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4898:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4899:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4900:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4901:   //EORI.W #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_001_mmm_rrr-{data}
  4902:   //EOR.W #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_001_mmm_rrr-{data}  [EORI.W #<data>,<ea>]
  4903:   //EORI.W #<data>,SR                               |-|012346|P|*****|*****|          |0000_101_001_111_100-{data}
  4904:   public static void irpEoriWord () throws M68kException {
  4905:     int ea = XEiJ.regOC & 63;
  4906:     if (ea < XEiJ.EA_AR) {  //EORI.W #<data>,Dr
  4907:       int z;
  4908:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4909:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4910:       } else {
  4911:         z = XEiJ.regPC;
  4912:         XEiJ.regPC = z + 2;
  4913:         z = XEiJ.busRwse (z);  //pcws
  4914:       }
  4915:       XEiJ.mpuCycleCount += 8;
  4916:       z = XEiJ.regRn[ea] ^= (char) z;  //0拡張してからEOR
  4917:       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
  4918:     } else if (ea == XEiJ.EA_IM) {  //EORI.W #<data>,SR
  4919:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  4920:         XEiJ.mpuCycleCount += 34;
  4921:         M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  4922:         throw M68kException.m6eSignal;
  4923:       }
  4924:       //以下はスーパーバイザモード
  4925:       XEiJ.mpuCycleCount += 20;
  4926:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4927:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  4928:       } else {
  4929:         int t = XEiJ.regPC;
  4930:         XEiJ.regPC = t + 2;
  4931:         irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse (t));  //pcws。特権違反チェックが先
  4932:       }
  4933:     } else {  //EORI.W #<data>,<mem>
  4934:       int z;
  4935:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4936:         z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  4937:       } else {
  4938:         z = XEiJ.regPC;
  4939:         XEiJ.regPC = z + 2;
  4940:         z = XEiJ.busRwse (z);  //pcws
  4941:       }
  4942:       XEiJ.mpuCycleCount += 12;
  4943:       int a = efaMltWord (ea);
  4944:       XEiJ.busWw (a, z ^= XEiJ.busRws (a));
  4945:       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
  4946:     }
  4947:   }  //irpEoriWord
  4948: 
  4949:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4950:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4951:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4952:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4953:   //EORI.L #<data>,<ea>                             |-|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_010_mmm_rrr-{data}
  4954:   //EOR.L #<data>,<ea>                              |A|012346|-|-UUUU|-**00|D M+-WXZ  |0000_101_010_mmm_rrr-{data}  [EORI.L #<data>,<ea>]
  4955:   public static void irpEoriLong () throws M68kException {
  4956:     int ea = XEiJ.regOC & 63;
  4957:     int y;
  4958:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4959:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  4960:     } else {
  4961:       y = XEiJ.regPC;
  4962:       XEiJ.regPC = y + 4;
  4963:       y = XEiJ.busRlse (y);  //pcls
  4964:     }
  4965:     int z;
  4966:     if (ea < XEiJ.EA_AR) {  //EORI.L #<data>,Dr
  4967:       XEiJ.mpuCycleCount += 16;
  4968:       z = XEiJ.regRn[ea] ^= y;
  4969:     } else {  //EORI.L #<data>,<mem>
  4970:       XEiJ.mpuCycleCount += 20;
  4971:       int a = efaMltLong (ea);
  4972:       XEiJ.busWl (a, z = XEiJ.busRls (a) ^ y);
  4973:     }
  4974:     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
  4975:   }  //irpEoriLong
  4976: 
  4977:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4978:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  4979:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  4980:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  4981:   //CMPI.B #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_000_mmm_rrr-{data}
  4982:   //CMP.B #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_000_mmm_rrr-{data}  [CMPI.B #<data>,<ea>]
  4983:   public static void irpCmpiByte () throws M68kException {
  4984:     XEiJ.mpuCycleCount += 8;
  4985:     int ea = XEiJ.regOC & 63;
  4986:     int x;
  4987:     int y;
  4988:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  4989:       y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1);  //pcbs
  4990:     } else {
  4991:       y = XEiJ.regPC;
  4992:       XEiJ.regPC = y + 2;
  4993:       y = XEiJ.busRbs (y + 1);  //pcbs
  4994:     }
  4995:     int z = (byte) ((x = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea))) - y);  //アドレッシングモードに注意
  4996:     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) |
  4997:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  4998:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
  4999:   }  //irpCmpiByte
  5000: 
  5001:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5002:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5003:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5004:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5005:   //CMPI.W #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_001_mmm_rrr-{data}
  5006:   //CMP.W #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_001_mmm_rrr-{data}  [CMPI.W #<data>,<ea>]
  5007:   public static void irpCmpiWord () throws M68kException {
  5008:     XEiJ.mpuCycleCount += 8;
  5009:     int ea = XEiJ.regOC & 63;
  5010:     int x;
  5011:     int y;
  5012:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5013:       y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  5014:     } else {
  5015:       y = XEiJ.regPC;
  5016:       XEiJ.regPC = y + 2;
  5017:       y = XEiJ.busRwse (y);  //pcws
  5018:     }
  5019:     int z = (short) ((x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea))) - y);  //アドレッシングモードに注意
  5020:     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) |
  5021:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  5022:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
  5023:   }  //irpCmpiWord
  5024: 
  5025:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5026:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5027:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5028:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5029:   //CMPI.L #<data>,<ea>                             |-|01----|-|-UUUU|-****|D M+-WXZ  |0000_110_010_mmm_rrr-{data}
  5030:   //CMP.L #<data>,<ea>                              |A|01----|-|-UUUU|-****|  M+-WXZ  |0000_110_010_mmm_rrr-{data}  [CMPI.L #<data>,<ea>]
  5031:   public static void irpCmpiLong () throws M68kException {
  5032:     int ea = XEiJ.regOC & 63;
  5033:     int x;
  5034:     int y;
  5035:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5036:       y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
  5037:     } else {
  5038:       y = XEiJ.regPC;
  5039:       XEiJ.regPC = y + 4;
  5040:       y = XEiJ.busRlse (y);  //pcls
  5041:     }
  5042:     int z;
  5043:     if (ea < XEiJ.EA_AR) {  //CMPI.L #<data>,Dr
  5044:       XEiJ.mpuCycleCount += 14;
  5045:       z = (x = XEiJ.regRn[ea]) - y;
  5046:     } else {  //CMPI.L #<data>,<mem>
  5047:       XEiJ.mpuCycleCount += 12;
  5048:       z = (x = XEiJ.busRls (efaMltLong (ea))) - y;  //アドレッシングモードに注意
  5049:     }
  5050:     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) |
  5051:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  5052:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
  5053:   }  //irpCmpiLong
  5054: 
  5055:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5056:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5057:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5058:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5059:   //MOVES.B <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_000_mmm_rrr-rnnn000000000000
  5060:   //MOVES.B Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_000_mmm_rrr-rnnn100000000000
  5061:   //
  5062:   //MOVES.B <ea>,Rn
  5063:   //  MOVES.B <ea>,DnはDnの最下位バイトだけ更新する
  5064:   //  MOVES.B <ea>,Anはバイトデータをロングに符号拡張してAnの全体を更新する
  5065:   //  SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、
  5066:   //  SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5067:   //
  5068:   //MOVES.B Rn,<ea>
  5069:   //  DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、
  5070:   //  DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5071:   public static void irpMovesByte () throws M68kException {
  5072:     int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz
  5073:     if (w << -11 != 0) {
  5074:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  5075:       throw M68kException.m6eSignal;
  5076:     }
  5077:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5078:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5079:       throw M68kException.m6eSignal;
  5080:     }
  5081:     //以下はスーパーバイザモード
  5082:     XEiJ.mpuCycleCount += 4;
  5083:     int a = efaMltByte (XEiJ.regOC & 63);
  5084:     int n = w >>> 12;  //n
  5085:     if (w << 31 - 11 >= 0) {  //MOVES.B <ea>,Rn。リード
  5086:       MemoryMappedDevice[] mm;
  5087:       if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) {  //ユーザモード
  5088:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5089:       } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) {  //スーパーバイザモード
  5090:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5091:       } else {  //CPU空間などは不可
  5092:         M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_READ;
  5093:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5094:         M68kException.m6eAddress = a;
  5095:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5096:         M68kException.m6eSize = XEiJ.MPU_SS_BYTE;
  5097:         throw M68kException.m6eSignal;
  5098:       }
  5099:       if (n < 8) {  //MOVES.B <ea>,Dn
  5100:         XEiJ.regRn[n] = XEiJ.regRn[n] & ~255 | mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbz (a);
  5101:       } else {  //MOVES.B <ea>,An
  5102:         XEiJ.regRn[n] = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbs (a);
  5103:       }
  5104:     } else {  //MOVES.B Rn,<ea>。ライト
  5105:       MemoryMappedDevice[] mm;
  5106:       if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) {  //ユーザモード
  5107:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5108:       } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) {  //スーパーバイザモード
  5109:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5110:       } else {  //CPU空間などは不可
  5111:         M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_WRITE;
  5112:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5113:         M68kException.m6eAddress = a;
  5114:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5115:         M68kException.m6eSize = XEiJ.MPU_SS_BYTE;
  5116:         throw M68kException.m6eSignal;
  5117:       }
  5118:       mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWb (a, XEiJ.regRn[n]);
  5119:     }
  5120:   }  //irpMovesByte
  5121: 
  5122:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5123:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5124:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5125:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5126:   //MOVES.W <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_001_mmm_rrr-rnnn000000000000
  5127:   //MOVES.W Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_001_mmm_rrr-rnnn100000000000
  5128:   //
  5129:   //MOVES.W <ea>,Rn
  5130:   //  MOVES.W <ea>,DnはDnの下位ワードだけ更新する
  5131:   //  MOVES.W <ea>,Anはワードデータをロングに符号拡張してAnの全体を更新する
  5132:   //  SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、
  5133:   //  SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5134:   //
  5135:   //MOVES.W Rn,<ea>
  5136:   //  DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、
  5137:   //  DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5138:   public static void irpMovesWord () throws M68kException {
  5139:     int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz
  5140:     if (w << -11 != 0) {
  5141:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  5142:       throw M68kException.m6eSignal;
  5143:     }
  5144:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5145:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5146:       throw M68kException.m6eSignal;
  5147:     }
  5148:     //以下はスーパーバイザモード
  5149:     XEiJ.mpuCycleCount += 4;
  5150:     int a = efaMltWord (XEiJ.regOC & 63);
  5151:     int n = w >>> 12;  //n
  5152:     if (w << 31 - 11 >= 0) {  //MOVES.W <ea>,Rn。リード
  5153:       MemoryMappedDevice[] mm;
  5154:       if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) {  //ユーザモード
  5155:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5156:       } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) {  //スーパーバイザモード
  5157:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5158:       } else {  //CPU空間などは不可
  5159:         M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_READ;
  5160:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5161:         M68kException.m6eAddress = a;
  5162:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5163:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5164:         throw M68kException.m6eSignal;
  5165:       }
  5166:       int z;
  5167:       if ((a & 1) == 0) {  //偶数
  5168:         z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a);
  5169:       } else {  //奇数
  5170:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5171:         M68kException.m6eAddress = a;
  5172:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5173:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5174:         throw M68kException.m6eSignal;
  5175:       }
  5176:       if (n < 8) {  //MOVES.W <ea>,Dn
  5177:         XEiJ.regRn[n] = XEiJ.regRn[n] & ~65535 | z;
  5178:       } else {  //MOVES.W <ea>,An
  5179:         XEiJ.regRn[n] = (short) z;
  5180:       }
  5181:     } else {  //MOVES.W Rn,<ea>。ライト
  5182:       MemoryMappedDevice[] mm;
  5183:       if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) {  //ユーザモード
  5184:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5185:       } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) {  //スーパーバイザモード
  5186:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5187:       } else {  //CPU空間などは不可
  5188:         M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_WRITE;
  5189:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5190:         M68kException.m6eAddress = a;
  5191:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5192:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5193:         throw M68kException.m6eSignal;
  5194:       }
  5195:       int z = XEiJ.regRn[n];
  5196:       if ((a & 1) == 0) {  //偶数
  5197:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z);
  5198:       } else {  //奇数
  5199:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5200:         M68kException.m6eAddress = a;
  5201:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5202:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  5203:         throw M68kException.m6eSignal;
  5204:       }
  5205:     }
  5206:   }  //irpMovesWord
  5207: 
  5208:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5209:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5210:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5211:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5212:   //MOVES.L <ea>,Rn                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_010_mmm_rrr-rnnn000000000000
  5213:   //MOVES.L Rn,<ea>                                 |-|-12346|P|-----|-----|  M+-WXZ  |0000_111_010_mmm_rrr-rnnn100000000000
  5214:   //
  5215:   //MOVES.L <ea>,Rn
  5216:   //  SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、
  5217:   //  SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5218:   //
  5219:   //MOVES.L Rn,<ea>
  5220:   //  DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、
  5221:   //  DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる
  5222:   public static void irpMovesLong () throws M68kException {
  5223:     int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz
  5224:     if (w << -11 != 0) {
  5225:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  5226:       throw M68kException.m6eSignal;
  5227:     }
  5228:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5229:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5230:       throw M68kException.m6eSignal;
  5231:     }
  5232:     //以下はスーパーバイザモード
  5233:     XEiJ.mpuCycleCount += 4;
  5234:     int a = efaMltLong (XEiJ.regOC & 63);
  5235:     int n = w >>> 12;  //n
  5236:     if (w << 31 - 11 >= 0) {  //MOVES.L <ea>,Rn。リード
  5237:       MemoryMappedDevice[] mm;
  5238:       if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) {  //ユーザモード
  5239:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5240:       } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) {  //スーパーバイザモード
  5241:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5242:       } else {  //CPU空間などは不可
  5243:         M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_READ;
  5244:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5245:         M68kException.m6eAddress = a;
  5246:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5247:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5248:         throw M68kException.m6eSignal;
  5249:       }
  5250:       int z;
  5251:       if ((a & 3) == 0) {  //4の倍数
  5252:         z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRls (a);
  5253:       } else if ((a & 1) == 0) {  //4の倍数+2
  5254:         z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRws (a) << 16;
  5255:         a += 2;
  5256:         z |= mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a);
  5257:       } else {  //奇数
  5258:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5259:         M68kException.m6eAddress = a;
  5260:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  5261:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5262:         throw M68kException.m6eSignal;
  5263:       }
  5264:       XEiJ.regRn[n] = z;
  5265:     } else {  //MOVES.L Rn,<ea>。ライト
  5266:       MemoryMappedDevice[] mm;
  5267:       if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) {  //ユーザモード
  5268:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap;
  5269:       } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) {  //スーパーバイザモード
  5270:         mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap;
  5271:       } else {  //CPU空間などは不可
  5272:         M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_WRITE;
  5273:         M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT;
  5274:         M68kException.m6eAddress = a;
  5275:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5276:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5277:         throw M68kException.m6eSignal;
  5278:       }
  5279:       int z = XEiJ.regRn[n];
  5280:       if ((a & 3) == 0) {  //4の倍数
  5281:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWl (a, z);
  5282:       } else if ((a & 1) == 0) {  //4の倍数+2
  5283:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z >> 16);
  5284:         a += 2;
  5285:         mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z);
  5286:       } else {  //奇数
  5287:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  5288:         M68kException.m6eAddress = a;
  5289:         M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  5290:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  5291:         throw M68kException.m6eSignal;
  5292:       }
  5293:     }
  5294:   }  //irpMovesLong
  5295: 
  5296:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5297:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5298:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5299:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5300:   //MOVE.B <ea>,Dq                                  |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr
  5301:   public static void irpMoveToDRByte () throws M68kException {
  5302:     XEiJ.mpuCycleCount += 4;
  5303:     int ea = XEiJ.regOC & 63;
  5304:     int qqq = XEiJ.regOC >> 9 & 7;
  5305:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
  5306:     XEiJ.regRn[qqq] = ~255 & XEiJ.regRn[qqq] | 255 & z;
  5307:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5308:   }  //irpMoveToDRByte
  5309: 
  5310:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5311:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5312:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5313:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5314:   //MOVE.B <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr
  5315:   public static void irpMoveToMMByte () throws M68kException {
  5316:     XEiJ.mpuCycleCount += 8;
  5317:     int ea = XEiJ.regOC & 63;
  5318:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5319:     XEiJ.busWb (XEiJ.regRn[XEiJ.regOC >> 9], z);  //1qqq=aqq
  5320:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5321:   }  //irpMoveToMMByte
  5322: 
  5323:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5324:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5325:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5326:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5327:   //MOVE.B <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr
  5328:   public static void irpMoveToMPByte () throws M68kException {
  5329:     XEiJ.mpuCycleCount += 8;
  5330:     int ea = XEiJ.regOC & 63;
  5331:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5332:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5333:     XEiJ.busWb (aqq < 15 ? XEiJ.regRn[aqq]++ : (XEiJ.regRn[15] += 2) - 2, z);
  5334:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5335:   }  //irpMoveToMPByte
  5336: 
  5337:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5338:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5339:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5340:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5341:   //MOVE.B <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr
  5342:   public static void irpMoveToMNByte () throws M68kException {
  5343:     XEiJ.mpuCycleCount += 8;
  5344:     int ea = XEiJ.regOC & 63;
  5345:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5346:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5347:     XEiJ.busWb (aqq < 15 ? --XEiJ.regRn[aqq] : (XEiJ.regRn[15] -= 2), z);
  5348:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5349:   }  //irpMoveToMNByte
  5350: 
  5351:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5352:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5353:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5354:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5355:   //MOVE.B <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr
  5356:   public static void irpMoveToMWByte () throws M68kException {
  5357:     XEiJ.mpuCycleCount += 12;
  5358:     int ea = XEiJ.regOC & 63;
  5359:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5360:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5361:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5362:       XEiJ.busWb (XEiJ.regRn[aqq]  //ベースレジスタ
  5363:           + XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws。ワードディスプレースメント
  5364:           z);
  5365:     } else {
  5366:       int t = XEiJ.regPC;
  5367:       XEiJ.regPC = t + 2;
  5368:       XEiJ.busWb (XEiJ.regRn[aqq]  //ベースレジスタ
  5369:           + XEiJ.busRwse (t),  //pcws。ワードディスプレースメント
  5370:           z);
  5371:     }
  5372:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5373:   }  //irpMoveToMWByte
  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>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr
  5380:   public static void irpMoveToMXByte () throws M68kException {
  5381:     XEiJ.mpuCycleCount += 14;
  5382:     int ea = XEiJ.regOC & 63;
  5383:     int aqq = XEiJ.regOC >> 9;  //1qqq=aqq
  5384:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));  //ここでAqが変化する可能性があることに注意
  5385:     int w;
  5386:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5387:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  5388:     } else {
  5389:       w = XEiJ.regPC;
  5390:       XEiJ.regPC = w + 2;
  5391:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  5392:     }
  5393:     XEiJ.busWb (XEiJ.regRn[aqq]  //ベースレジスタ
  5394:         + (byte) w  //バイトディスプレースメント
  5395:         + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
  5396:            XEiJ.regRn[w >> 12]),  //ロングインデックス
  5397:         z);
  5398:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5399:   }  //irpMoveToMXByte
  5400: 
  5401:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5402:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5403:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5404:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5405:   //MOVE.B <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr
  5406:   public static void irpMoveToZWByte () throws M68kException {
  5407:     XEiJ.mpuCycleCount += 12;
  5408:     int ea = XEiJ.regOC & 63;
  5409:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
  5410:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5411:       XEiJ.busWb (XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws
  5412:           z);
  5413:     } else {
  5414:       int t = XEiJ.regPC;
  5415:       XEiJ.regPC = t + 2;
  5416:       XEiJ.busWb (XEiJ.busRwse (t),  //pcws
  5417:           z);
  5418:     }
  5419:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5420:   }  //irpMoveToZWByte
  5421: 
  5422:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5423:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5424:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5425:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5426:   //MOVE.B <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr
  5427:   public static void irpMoveToZLByte () throws M68kException {
  5428:     XEiJ.mpuCycleCount += 16;
  5429:     int ea = XEiJ.regOC & 63;
  5430:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
  5431:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5432:       XEiJ.busWb (XEiJ.busRlse ((XEiJ.regPC += 4) - 4),  //pcls
  5433:           z);
  5434:     } else {
  5435:       int t = XEiJ.regPC;
  5436:       XEiJ.regPC = t + 4;
  5437:       XEiJ.busWb (XEiJ.busRlse (t),  //pcls
  5438:           z);
  5439:     }
  5440:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  5441:   }  //irpMoveToZLByte
  5442: 
  5443:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5444:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5445:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5446:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5447:   //MOVE.L <ea>,Dq                                  |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr
  5448:   public static void irpMoveToDRLong () throws M68kException {
  5449:     XEiJ.mpuCycleCount += 4;
  5450:     int ea = XEiJ.regOC & 63;
  5451:     int z;
  5452:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5453:     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
  5454:   }  //irpMoveToDRLong
  5455: 
  5456:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5457:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5458:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5459:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5460:   //MOVEA.L <ea>,Aq                                 |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr
  5461:   //MOVE.L <ea>,Aq                                  |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq]
  5462:   public static void irpMoveaLong () throws M68kException {
  5463:     XEiJ.mpuCycleCount += 4;
  5464:     int ea = XEiJ.regOC & 63;
  5465:     XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意
  5466:   }  //irpMoveaLong
  5467: 
  5468:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5469:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5470:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5471:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5472:   //MOVE.L <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr
  5473:   public static void irpMoveToMMLong () throws M68kException {
  5474:     XEiJ.mpuCycleCount += 12;
  5475:     int ea = XEiJ.regOC & 63;
  5476:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5477:     XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)], z);
  5478:     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
  5479:   }  //irpMoveToMMLong
  5480: 
  5481:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5482:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5483:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5484:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5485:   //MOVE.L <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr
  5486:   public static void irpMoveToMPLong () throws M68kException {
  5487:     XEiJ.mpuCycleCount += 12;
  5488:     int ea = XEiJ.regOC & 63;
  5489:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5490:     XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] += 4) - 4, z);
  5491:     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
  5492:   }  //irpMoveToMPLong
  5493: 
  5494:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5495:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5496:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5497:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5498:   //MOVE.L <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr
  5499:   public static void irpMoveToMNLong () throws M68kException {
  5500:     XEiJ.mpuCycleCount += 12;
  5501:     int ea = XEiJ.regOC & 63;
  5502:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5503:     XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] -= 4), z);
  5504:     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
  5505:   }  //irpMoveToMNLong
  5506: 
  5507:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5508:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5509:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5510:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5511:   //MOVE.L <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr
  5512:   public static void irpMoveToMWLong () throws M68kException {
  5513:     XEiJ.mpuCycleCount += 16;
  5514:     int ea = XEiJ.regOC & 63;
  5515:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5516:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5517:       XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)]  //ベースレジスタ
  5518:           + XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws。ワードディスプレースメント
  5519:           z);
  5520:     } else {
  5521:       int t = XEiJ.regPC;
  5522:       XEiJ.regPC = t + 2;
  5523:       XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)]  //ベースレジスタ
  5524:           + XEiJ.busRwse (t),  //pcws。ワードディスプレースメント
  5525:           z);
  5526:     }
  5527:     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
  5528:   }  //irpMoveToMWLong
  5529: 
  5530:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5531:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5532:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5533:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5534:   //MOVE.L <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr
  5535:   public static void irpMoveToMXLong () throws M68kException {
  5536:     XEiJ.mpuCycleCount += 18;
  5537:     int ea = XEiJ.regOC & 63;
  5538:     int aqq = (XEiJ.regOC >> 9) - (16 - 8);
  5539:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5540:     int w;
  5541:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5542:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  5543:     } else {
  5544:       w = XEiJ.regPC;
  5545:       XEiJ.regPC = w + 2;
  5546:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  5547:     }
  5548:     XEiJ.busWl (XEiJ.regRn[aqq]  //ベースレジスタ
  5549:         + (byte) w  //バイトディスプレースメント
  5550:         + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
  5551:            XEiJ.regRn[w >> 12]),  //ロングインデックス
  5552:         z);
  5553:     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
  5554:   }  //irpMoveToMXLong
  5555: 
  5556:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5557:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5558:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5559:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5560:   //MOVE.L <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr
  5561:   public static void irpMoveToZWLong () throws M68kException {
  5562:     XEiJ.mpuCycleCount += 16;
  5563:     int ea = XEiJ.regOC & 63;
  5564:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5565:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5566:       XEiJ.busWl (XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws
  5567:           z);
  5568:     } else {
  5569:       int t = XEiJ.regPC;
  5570:       XEiJ.regPC = t + 2;
  5571:       XEiJ.busWl (XEiJ.busRwse (t),  //pcws
  5572:           z);
  5573:     }
  5574:     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
  5575:   }  //irpMoveToZWLong
  5576: 
  5577:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5578:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5579:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5580:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5581:   //MOVE.L <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr
  5582:   public static void irpMoveToZLLong () throws M68kException {
  5583:     XEiJ.mpuCycleCount += 20;
  5584:     int ea = XEiJ.regOC & 63;
  5585:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5586:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5587:       XEiJ.busWl (XEiJ.busRlse ((XEiJ.regPC += 4) - 4),  //pcls
  5588:           z);
  5589:     } else {
  5590:       int t = XEiJ.regPC;
  5591:       XEiJ.regPC = t + 4;
  5592:       XEiJ.busWl (XEiJ.busRlse (t),  //pcls
  5593:           z);
  5594:     }
  5595:     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
  5596:   }  //irpMoveToZLLong
  5597: 
  5598:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5599:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5600:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5601:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5602:   //MOVE.W <ea>,Dq                                  |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr
  5603:   public static void irpMoveToDRWord () throws M68kException {
  5604:     XEiJ.mpuCycleCount += 4;
  5605:     int ea = XEiJ.regOC & 63;
  5606:     int qqq = XEiJ.regOC >> 9 & 7;
  5607:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5608:     XEiJ.regRn[qqq] = ~65535 & XEiJ.regRn[qqq] | (char) z;
  5609:     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
  5610:   }  //irpMoveToDRWord
  5611: 
  5612:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5613:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5614:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5615:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5616:   //MOVEA.W <ea>,Aq                                 |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr
  5617:   //MOVE.W <ea>,Aq                                  |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq]
  5618:   //
  5619:   //MOVEA.W <ea>,Aq
  5620:   //  ワードデータをロングに符号拡張してAqの全体を更新する
  5621:   public static void irpMoveaWord () throws M68kException {
  5622:     XEiJ.mpuCycleCount += 4;
  5623:     int ea = XEiJ.regOC & 63;
  5624:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //符号拡張して32bit全部書き換える。このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意
  5625:   }  //irpMoveaWord
  5626: 
  5627:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5628:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5629:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5630:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5631:   //MOVE.W <ea>,(Aq)                                |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr
  5632:   public static void irpMoveToMMWord () throws M68kException {
  5633:     XEiJ.mpuCycleCount += 8;
  5634:     int ea = XEiJ.regOC & 63;
  5635:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5636:     XEiJ.busWw (XEiJ.regRn[XEiJ.regOC >> 9 & 15], z);
  5637:     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
  5638:   }  //irpMoveToMMWord
  5639: 
  5640:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5641:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5642:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5643:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5644:   //MOVE.W <ea>,(Aq)+                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr
  5645:   public static void irpMoveToMPWord () throws M68kException {
  5646:     XEiJ.mpuCycleCount += 8;
  5647:     int ea = XEiJ.regOC & 63;
  5648:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5649:     XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2, z);
  5650:     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
  5651:   }  //irpMoveToMPWord
  5652: 
  5653:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5654:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5655:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5656:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5657:   //MOVE.W <ea>,-(Aq)                               |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr
  5658:   public static void irpMoveToMNWord () throws M68kException {
  5659:     XEiJ.mpuCycleCount += 8;
  5660:     int ea = XEiJ.regOC & 63;
  5661:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5662:     XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2), z);
  5663:     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
  5664:   }  //irpMoveToMNWord
  5665: 
  5666:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5667:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5668:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5669:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5670:   //MOVE.W <ea>,(d16,Aq)                            |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr
  5671:   public static void irpMoveToMWWord () throws M68kException {
  5672:     XEiJ.mpuCycleCount += 12;
  5673:     int ea = XEiJ.regOC & 63;
  5674:     int aqq = XEiJ.regOC >> 9 & 15;
  5675:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5676:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5677:       XEiJ.busWw (XEiJ.regRn[aqq]  //ベースレジスタ
  5678:           + XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws。ワードディスプレースメント
  5679:           z);
  5680:     } else {
  5681:       int t = XEiJ.regPC;
  5682:       XEiJ.regPC = t + 2;
  5683:       XEiJ.busWw (XEiJ.regRn[aqq]  //ベースレジスタ
  5684:           + XEiJ.busRwse (t),  //pcws。ワードディスプレースメント
  5685:           z);
  5686:     }
  5687:     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
  5688:   }  //irpMoveToMWWord
  5689: 
  5690:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5691:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5692:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5693:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5694:   //MOVE.W <ea>,(d8,Aq,Rn.wl)                       |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr
  5695:   public static void irpMoveToMXWord () throws M68kException {
  5696:     XEiJ.mpuCycleCount += 14;
  5697:     int ea = XEiJ.regOC & 63;
  5698:     int aqq = XEiJ.regOC >> 9 & 15;
  5699:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
  5700:     int w;
  5701:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5702:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  5703:     } else {
  5704:       w = XEiJ.regPC;
  5705:       XEiJ.regPC = w + 2;
  5706:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  5707:     }
  5708:     XEiJ.busWw (XEiJ.regRn[aqq]  //ベースレジスタ
  5709:         + (byte) w  //バイトディスプレースメント
  5710:         + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
  5711:            XEiJ.regRn[w >> 12]),  //ロングインデックス
  5712:         z);
  5713:     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
  5714:   }  //irpMoveToMXWord
  5715: 
  5716:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5717:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5718:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5719:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5720:   //MOVE.W <ea>,(xxx).W                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr
  5721:   public static void irpMoveToZWWord () throws M68kException {
  5722:     XEiJ.mpuCycleCount += 12;
  5723:     int ea = XEiJ.regOC & 63;
  5724:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5725:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5726:       XEiJ.busWw (XEiJ.busRwse ((XEiJ.regPC += 2) - 2),  //pcws
  5727:           z);
  5728:     } else {
  5729:       int t = XEiJ.regPC;
  5730:       XEiJ.regPC = t + 2;
  5731:       XEiJ.busWw (XEiJ.busRwse (t),  //pcws
  5732:           z);
  5733:     }
  5734:     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
  5735:   }  //irpMoveToZWWord
  5736: 
  5737:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5738:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5739:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5740:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5741:   //MOVE.W <ea>,(xxx).L                             |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr
  5742:   public static void irpMoveToZLWord () throws M68kException {
  5743:     XEiJ.mpuCycleCount += 16;
  5744:     int ea = XEiJ.regOC & 63;
  5745:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
  5746:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  5747:       XEiJ.busWw (XEiJ.busRlse ((XEiJ.regPC += 4) - 4),  //pcls
  5748:           z);
  5749:     } else {
  5750:       int t = XEiJ.regPC;
  5751:       XEiJ.regPC = t + 4;
  5752:       XEiJ.busWw (XEiJ.busRlse (t),  //pcls
  5753:           z);
  5754:     }
  5755:     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
  5756:   }  //irpMoveToZLWord
  5757: 
  5758:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5759:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5760:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5761:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5762:   //NEGX.B <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_000_mmm_rrr
  5763:   public static void irpNegxByte () throws M68kException {
  5764:     int ea = XEiJ.regOC & 63;
  5765:     int y;
  5766:     int z;
  5767:     if (ea < XEiJ.EA_AR) {  //NEGX.B Dr
  5768:       XEiJ.mpuCycleCount += 4;
  5769:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y) - (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
  5770:     } else {  //NEGX.B <mem>
  5771:       XEiJ.mpuCycleCount += 8;
  5772:       int a = efaMltByte (ea);
  5773:       XEiJ.busWb (a, z = (byte) (-(y = XEiJ.busRbs (a)) - (XEiJ.regCCR >> 4)));  //Xの左側はすべて0なのでCCR_X&を省略
  5774:     }
  5775:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
  5776:            (y & z) >>> 31 << 1 |
  5777:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_negx
  5778:   }  //irpNegxByte
  5779: 
  5780:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5781:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5782:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5783:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5784:   //NEGX.W <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_001_mmm_rrr
  5785:   public static void irpNegxWord () throws M68kException {
  5786:     int ea = XEiJ.regOC & 63;
  5787:     int y;
  5788:     int z;
  5789:     if (ea < XEiJ.EA_AR) {  //NEGX.W Dr
  5790:       XEiJ.mpuCycleCount += 4;
  5791:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) (-(y = (short) y) - (XEiJ.regCCR >> 4)));  //Xの左側はすべて0なのでCCR_X&を省略
  5792:     } else {  //NEGX.W <mem>
  5793:       XEiJ.mpuCycleCount += 8;
  5794:       int a = efaMltWord (ea);
  5795:       XEiJ.busWw (a, z = (short) (-(y = XEiJ.busRws (a)) - (XEiJ.regCCR >> 4)));  //Xの左側はすべて0なのでCCR_X&を省略
  5796:     }
  5797:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
  5798:            (y & z) >>> 31 << 1 |
  5799:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_negx
  5800:   }  //irpNegxWord
  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:   //NEGX.L <ea>                                     |-|012346|-|*UUUU|*****|D M+-WXZ  |0100_000_010_mmm_rrr
  5807:   public static void irpNegxLong () throws M68kException {
  5808:     int ea = XEiJ.regOC & 63;
  5809:     int y;
  5810:     int z;
  5811:     if (ea < XEiJ.EA_AR) {  //NEGX.L Dr
  5812:       XEiJ.mpuCycleCount += 6;
  5813:       XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
  5814:     } else {  //NEGX.L <mem>
  5815:       XEiJ.mpuCycleCount += 12;
  5816:       int a = efaMltLong (ea);
  5817:       XEiJ.busWl (a, z = -(y = XEiJ.busRls (a)) - (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
  5818:     }
  5819:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
  5820:            (y & z) >>> 31 << 1 |
  5821:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_negx
  5822:   }  //irpNegxLong
  5823: 
  5824:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5825:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5826:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5827:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5828:   //MOVE.W SR,<ea>                                  |-|-12346|P|*****|-----|D M+-WXZ  |0100_000_011_mmm_rrr
  5829:   public static void irpMoveFromSR () throws M68kException {
  5830:     //MC68010以上では特権命令
  5831:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  5832:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  5833:       throw M68kException.m6eSignal;
  5834:     }
  5835:     //以下はスーパーバイザモード
  5836:     int ea = XEiJ.regOC & 63;
  5837:     if (ea < XEiJ.EA_AR) {  //MOVE.W SR,Dr
  5838:       XEiJ.mpuCycleCount += 6;
  5839:       XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  5840:     } else {  //MOVE.W SR,<mem>
  5841:       //! 軽量化。MOVE from SRによる直後の命令のイミディエイトオペランドの自己書き換えが直後に反映されてしまう
  5842:       //  MC68000でFEファンクションコールやSXコールのようなCCRを変化させる例外処理ルーチンの出口を次のように書くと、
  5843:       //  自己書き換えが直後に反映されずイミディエイトオペランドの領域がバッファになって前回の結果を返すことになるので期待通りに動作しない
  5844:       //              move.w  sr,@f+2
  5845:       //      @@:     move.b  #0,(1,sp)
  5846:       //              rte
  5847:       //  これが期待通りに動作してしまったらMC68000を正しくエミュレートできていないということになる
  5848:       //  https://stdkmd.net/bbs/page2.htm#comment134
  5849:       XEiJ.mpuCycleCount += 8;
  5850:       int a = efaMltWord (ea);
  5851:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  5852:         //! 軽量化。MC68000では書き込む前にリードが入るが省略する
  5853:       } else {
  5854:         XEiJ.busRws (a);
  5855:       }
  5856:       XEiJ.busWw (a, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);
  5857:     }
  5858:   }  //irpMoveFromSR
  5859: 
  5860:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5861:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5862:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5863:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5864:   //CHK.W <ea>,Dq                                   |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr
  5865:   public static void irpChkWord () throws M68kException {
  5866:     XEiJ.mpuCycleCount += 10;
  5867:     int ea = XEiJ.regOC & 63;
  5868:     int x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));
  5869:     int y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7];
  5870:     int z = (short) (x - y);
  5871:     XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |
  5872:                    (y < 0 ? XEiJ.REG_CCR_N : 0) |
  5873:                    (y == 0 ? XEiJ.REG_CCR_Z : 0) |
  5874:                    ((x ^ y) & (x ^ z)) >>> 31 << 1 |
  5875:                    (x & (y ^ z) ^ (y | z)) >>> 31);
  5876:     if (y < 0 || x < y) {
  5877:       XEiJ.mpuCycleCount += 38 - 10;
  5878:       M68kException.m6eNumber = M68kException.M6E_CHK_INSTRUCTION;
  5879:       throw M68kException.m6eSignal;
  5880:     }
  5881:   }  //irpChkWord
  5882: 
  5883:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5884:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5885:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5886:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5887:   //LEA.L <ea>,Aq                                   |-|012346|-|-----|-----|  M  WXZP |0100_qqq_111_mmm_rrr
  5888:   public static void irpLea () throws M68kException {
  5889:     //XEiJ.mpuCycleCount += 4 - 4;
  5890:     XEiJ.regRn[(XEiJ.regOC >> 9) - (32 - 8)] = efaLeaPea (XEiJ.regOC & 63);
  5891:   }  //irpLea
  5892: 
  5893:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5894:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5895:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5896:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5897:   //CLR.B <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_000_mmm_rrr (68000 and 68008 read before clear)
  5898:   public static void irpClrByte () throws M68kException {
  5899:     int ea = XEiJ.regOC & 63;
  5900:     if (ea < XEiJ.EA_AR) {  //CLR.B Dr
  5901:       XEiJ.mpuCycleCount += 4;
  5902:       XEiJ.regRn[ea] &= ~0xff;
  5903:     } else {  //CLR.B <mem>
  5904:       //MC68010はリードしない
  5905:       XEiJ.mpuCycleCount += 8;
  5906:       XEiJ.busWb (efaMltByte (ea), 0);
  5907:     }
  5908:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z;  //ccr_clr
  5909:   }  //irpClrByte
  5910: 
  5911:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5912:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5913:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5914:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5915:   //CLR.W <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_001_mmm_rrr (68000 and 68008 read before clear)
  5916:   public static void irpClrWord () throws M68kException {
  5917:     int ea = XEiJ.regOC & 63;
  5918:     if (ea < XEiJ.EA_AR) {  //CLR.W Dr
  5919:       XEiJ.mpuCycleCount += 4;
  5920:       XEiJ.regRn[ea] &= ~0xffff;
  5921:     } else {  //CLR.W <mem>
  5922:       //MC68010はリードしない
  5923:       XEiJ.mpuCycleCount += 8;
  5924:       XEiJ.busWw (efaMltWord (ea), 0);
  5925:     }
  5926:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z;  //ccr_clr
  5927:   }  //irpClrWord
  5928: 
  5929:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5930:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5931:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5932:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5933:   //CLR.L <ea>                                      |-|012346|-|-UUUU|-0100|D M+-WXZ  |0100_001_010_mmm_rrr (68000 and 68008 read before clear)
  5934:   public static void irpClrLong () throws M68kException {
  5935:     int ea = XEiJ.regOC & 63;
  5936:     if (ea < XEiJ.EA_AR) {  //CLR.L Dr
  5937:       XEiJ.mpuCycleCount += 6;
  5938:       XEiJ.regRn[ea] = 0;
  5939:     } else {  //CLR.L <mem>
  5940:       //MC68010はリードしない
  5941:       XEiJ.mpuCycleCount += 12;
  5942:       XEiJ.busWl (efaMltLong (ea), 0);
  5943:     }
  5944:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z;  //ccr_clr
  5945:   }  //irpClrLong
  5946: 
  5947:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5948:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5949:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5950:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5951:   //MOVE.W CCR,<ea>                                 |-|-12346|-|*****|-----|D M+-WXZ  |0100_001_011_mmm_rrr
  5952:   public static void irpMoveFromCCR () throws M68kException {
  5953:     int ea = XEiJ.regOC & 63;
  5954:     if (ea < XEiJ.EA_AR) {  //MOVE.W CCR,Dr
  5955:       XEiJ.mpuCycleCount += 4;
  5956:       XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regCCR;
  5957:     } else {  //MOVE.W CCR,<mem>
  5958:       XEiJ.mpuCycleCount += 8;
  5959:       XEiJ.busWw (efaMltWord (ea), XEiJ.regCCR);
  5960:     }
  5961:   }  //irpMoveFromCCR
  5962: 
  5963:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5964:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5965:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5966:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5967:   //NEG.B <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_000_mmm_rrr
  5968:   public static void irpNegByte () throws M68kException {
  5969:     int ea = XEiJ.regOC & 63;
  5970:     int y;
  5971:     int z;
  5972:     if (ea < XEiJ.EA_AR) {  //NEG.B Dr
  5973:       XEiJ.mpuCycleCount += 4;
  5974:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y));
  5975:     } else {  //NEG.B <mem>
  5976:       XEiJ.mpuCycleCount += 8;
  5977:       int a = efaMltByte (ea);
  5978:       XEiJ.busWb (a, z = (byte) -(y = XEiJ.busRbs (a)));
  5979:     }
  5980:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  5981:            (y & z) >>> 31 << 1 |
  5982:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_neg
  5983:   }  //irpNegByte
  5984: 
  5985:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5986:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  5987:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  5988:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  5989:   //NEG.W <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_001_mmm_rrr
  5990:   public static void irpNegWord () throws M68kException {
  5991:     int ea = XEiJ.regOC & 63;
  5992:     int y;
  5993:     int z;
  5994:     if (ea < XEiJ.EA_AR) {  //NEG.W Dr
  5995:       XEiJ.mpuCycleCount += 4;
  5996:       z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) -(y = (short) y));
  5997:     } else {  //NEG.W <mem>
  5998:       XEiJ.mpuCycleCount += 8;
  5999:       int a = efaMltWord (ea);
  6000:       XEiJ.busWw (a, z = (short) -(y = XEiJ.busRws (a)));
  6001:     }
  6002:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  6003:            (y & z) >>> 31 << 1 |
  6004:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_neg
  6005:   }  //irpNegWord
  6006: 
  6007:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6008:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6009:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6010:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6011:   //NEG.L <ea>                                      |-|012346|-|UUUUU|*****|D M+-WXZ  |0100_010_010_mmm_rrr
  6012:   public static void irpNegLong () throws M68kException {
  6013:     int ea = XEiJ.regOC & 63;
  6014:     int y;
  6015:     int z;
  6016:     if (ea < XEiJ.EA_AR) {  //NEG.L Dr
  6017:       XEiJ.mpuCycleCount += 6;
  6018:       XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]);
  6019:     } else {  //NEG.L <mem>
  6020:       XEiJ.mpuCycleCount += 12;
  6021:       int a = efaMltLong (ea);
  6022:       XEiJ.busWl (a, z = -(y = XEiJ.busRls (a)));
  6023:     }
  6024:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  6025:            (y & z) >>> 31 << 1 |
  6026:            (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_neg
  6027:   }  //irpNegLong
  6028: 
  6029:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6030:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6031:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6032:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6033:   //MOVE.W <ea>,CCR                                 |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr
  6034:   public static void irpMoveToCCR () throws M68kException {
  6035:     XEiJ.mpuCycleCount += 12;
  6036:     int ea = XEiJ.regOC & 63;
  6037:     XEiJ.regCCR = XEiJ.REG_CCR_MASK & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)));
  6038:   }  //irpMoveToCCR
  6039: 
  6040:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6041:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6042:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6043:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6044:   //NOT.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_000_mmm_rrr
  6045:   public static void irpNotByte () throws M68kException {
  6046:     int ea = XEiJ.regOC & 63;
  6047:     int z;
  6048:     if (ea < XEiJ.EA_AR) {  //NOT.B Dr
  6049:       XEiJ.mpuCycleCount += 4;
  6050:       z = XEiJ.regRn[ea] ^= 255;  //0拡張してからEOR
  6051:     } else {  //NOT.B <mem>
  6052:       XEiJ.mpuCycleCount += 8;
  6053:       int a = efaMltByte (ea);
  6054:       XEiJ.busWb (a, z = ~XEiJ.busRbs (a));
  6055:     }
  6056:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  6057:   }  //irpNotByte
  6058: 
  6059:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6060:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6061:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6062:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6063:   //NOT.W <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_001_mmm_rrr
  6064:   public static void irpNotWord () throws M68kException {
  6065:     int ea = XEiJ.regOC & 63;
  6066:     int z;
  6067:     if (ea < XEiJ.EA_AR) {  //NOT.W Dr
  6068:       XEiJ.mpuCycleCount += 4;
  6069:       z = XEiJ.regRn[ea] ^= 65535;  //0拡張してからEOR
  6070:     } else {  //NOT.W <mem>
  6071:       XEiJ.mpuCycleCount += 8;
  6072:       int a = efaMltWord (ea);
  6073:       XEiJ.busWw (a, z = ~XEiJ.busRws (a));
  6074:     }
  6075:     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
  6076:   }  //irpNotWord
  6077: 
  6078:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6079:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6080:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6081:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6082:   //NOT.L <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_011_010_mmm_rrr
  6083:   public static void irpNotLong () throws M68kException {
  6084:     int ea = XEiJ.regOC & 63;
  6085:     int z;
  6086:     if (ea < XEiJ.EA_AR) {  //NOT.L Dr
  6087:       XEiJ.mpuCycleCount += 6;
  6088:       z = XEiJ.regRn[ea] ^= 0xffffffff;
  6089:     } else {  //NOT.L <mem>
  6090:       XEiJ.mpuCycleCount += 12;
  6091:       int a = efaMltLong (ea);
  6092:       XEiJ.busWl (a, z = ~XEiJ.busRls (a));
  6093:     }
  6094:     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
  6095:   }  //irpNotLong
  6096: 
  6097:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6098:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6099:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6100:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6101:   //MOVE.W <ea>,SR                                  |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr
  6102:   public static void irpMoveToSR () throws M68kException {
  6103:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  6104:       XEiJ.mpuCycleCount += 34;
  6105:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  6106:       throw M68kException.m6eSignal;
  6107:     }
  6108:     //以下はスーパーバイザモード
  6109:     XEiJ.mpuCycleCount += 12;
  6110:     int ea = XEiJ.regOC & 63;
  6111:     irpSetSR (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)));  //特権違反チェックが先
  6112:   }  //irpMoveToSR
  6113: 
  6114:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6115:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6116:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6117:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6118:   //NBCD.B <ea>                                     |-|012346|-|UUUUU|*U*U*|D M+-WXZ  |0100_100_000_mmm_rrr
  6119:   public static void irpNbcd () throws M68kException {
  6120:     int ea = XEiJ.regOC & 63;
  6121:     if (ea < XEiJ.EA_AR) {  //NBCD.B Dr
  6122:       XEiJ.mpuCycleCount += 6;
  6123:       XEiJ.regRn[ea] = ~0xff & XEiJ.regRn[ea] | irpSbcd (0, XEiJ.regRn[ea]);
  6124:     } else {  //NBCD.B <mem>
  6125:       XEiJ.mpuCycleCount += 8;
  6126:       int a = efaMltByte (ea);
  6127:       XEiJ.busWb (a, irpSbcd (0, XEiJ.busRbs (a)));
  6128:     }
  6129:   }  //irpNbcd
  6130: 
  6131:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6132:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6133:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6134:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6135:   //SWAP.W Dr                                       |-|012346|-|-UUUU|-**00|D         |0100_100_001_000_rrr
  6136:   //BKPT #<data>                                    |-|-12346|-|-----|-----|          |0100_100_001_001_ddd
  6137:   //PEA.L <ea>                                      |-|012346|-|-----|-----|  M  WXZP |0100_100_001_mmm_rrr
  6138:   public static void irpPea () throws M68kException {
  6139:     int ea = XEiJ.regOC & 63;
  6140:     if (ea < XEiJ.EA_AR) {  //SWAP.W Dr
  6141:       XEiJ.mpuCycleCount += 4;
  6142:       int x;
  6143:       int z;
  6144:       XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) << 16 | x >>> 16;
  6145:       //上位ワードと下位ワードを入れ替えた後のDrをロングでテストする
  6146:       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
  6147:     } else {  //PEA.L <ea>
  6148:       XEiJ.mpuCycleCount += 12 - 4;
  6149:       int a = efaLeaPea (ea);  //BKPT #<data>はここでillegal instructionになる
  6150:       XEiJ.busWl (XEiJ.regRn[15] -= 4, a);  //pushl。評価順序に注意。wl(r[15]-=4,eaz_leapea(ea))は不可
  6151:     }
  6152:   }  //irpPea
  6153: 
  6154:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6155:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6156:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6157:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6158:   //EXT.W Dr                                        |-|012346|-|-UUUU|-**00|D         |0100_100_010_000_rrr
  6159:   //MOVEM.W <list>,<ea>                             |-|012346|-|-----|-----|  M -WXZ  |0100_100_010_mmm_rrr-llllllllllllllll
  6160:   public static void irpMovemToMemWord () throws M68kException {
  6161:     int ea = XEiJ.regOC & 63;
  6162:     if (ea < XEiJ.EA_AR) {  //EXT.W Dr
  6163:       XEiJ.mpuCycleCount += 4;
  6164:       int z;
  6165:       XEiJ.regRn[ea] = ~0xffff & (z = XEiJ.regRn[ea]) | (char) (z = (byte) z);
  6166:       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
  6167:     } else {  //MOVEM.W <list>,<ea>
  6168:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  6169:       XEiJ.regPC += 2;
  6170:       if (ea >> 3 == XEiJ.MMM_MN) {  //-(Ar)
  6171:         //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む
  6172:         //転送するレジスタが0個のときArは変化しない
  6173:         int arr = ea - (XEiJ.EA_MN - 8);
  6174:         int a = XEiJ.regRn[arr];
  6175:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  6176:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  6177:           M68kException.m6eAddress = a;
  6178:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  6179:           M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  6180:           throw M68kException.m6eSignal;
  6181:         }
  6182:         int t = a;
  6183:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  6184:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 2 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  6185:             2 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) {  //16個転送してもページを跨がない
  6186:           a &= XEiJ.BUS_MOTHER_MASK;
  6187:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6188:             if ((l & 0x0001) != 0) {
  6189:               a -= 2;
  6190:               int x = XEiJ.regRn[15];
  6191:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6192:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6193:             }
  6194:             if ((l & 0x0002) != 0) {
  6195:               a -= 2;
  6196:               int x = XEiJ.regRn[14];
  6197:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6198:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6199:             }
  6200:             if ((l & 0x0004) != 0) {
  6201:               a -= 2;
  6202:               int x = XEiJ.regRn[13];
  6203:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6204:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6205:             }
  6206:             if ((l & 0x0008) != 0) {
  6207:               a -= 2;
  6208:               int x = XEiJ.regRn[12];
  6209:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6210:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6211:             }
  6212:             if ((l & 0x0010) != 0) {
  6213:               a -= 2;
  6214:               int x = XEiJ.regRn[11];
  6215:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6216:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6217:             }
  6218:             if ((l & 0x0020) != 0) {
  6219:               a -= 2;
  6220:               int x = XEiJ.regRn[10];
  6221:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6222:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6223:             }
  6224:             if ((l & 0x0040) != 0) {
  6225:               a -= 2;
  6226:               int x = XEiJ.regRn[ 9];
  6227:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6228:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6229:             }
  6230:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6231:               a -= 2;
  6232:               int x = XEiJ.regRn[ 8];
  6233:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6234:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6235:             }
  6236:             if ((l & 0x0100) != 0) {
  6237:               a -= 2;
  6238:               int x = XEiJ.regRn[ 7];
  6239:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6240:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6241:             }
  6242:             if ((l & 0x0200) != 0) {
  6243:               a -= 2;
  6244:               int x = XEiJ.regRn[ 6];
  6245:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6246:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6247:             }
  6248:             if ((l & 0x0400) != 0) {
  6249:               a -= 2;
  6250:               int x = XEiJ.regRn[ 5];
  6251:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6252:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6253:             }
  6254:             if ((l & 0x0800) != 0) {
  6255:               a -= 2;
  6256:               int x = XEiJ.regRn[ 4];
  6257:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6258:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6259:             }
  6260:             if ((l & 0x1000) != 0) {
  6261:               a -= 2;
  6262:               int x = XEiJ.regRn[ 3];
  6263:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6264:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6265:             }
  6266:             if ((l & 0x2000) != 0) {
  6267:               a -= 2;
  6268:               int x = XEiJ.regRn[ 2];
  6269:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6270:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6271:             }
  6272:             if ((l & 0x4000) != 0) {
  6273:               a -= 2;
  6274:               int x = XEiJ.regRn[ 1];
  6275:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6276:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6277:             }
  6278:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6279:               a -= 2;
  6280:               int x = XEiJ.regRn[ 0];
  6281:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6282:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6283:             }
  6284:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6285:             for (int i = 15; i >= 0; i--) {
  6286:               if ((l & 0x8000 >>> i) != 0) {
  6287:                 a -= 2;
  6288:                 int x = XEiJ.regRn[i];
  6289:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6290:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6291:               }
  6292:             }
  6293:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6294:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6295:             for (int i = 15; l != 0; i--, l <<= 1) {
  6296:               if (l < 0) {
  6297:                 a -= 2;
  6298:                 int x = XEiJ.regRn[i];
  6299:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6300:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6301:               }
  6302:             }
  6303:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6304:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6305:               if ((l & 1) != 0) {
  6306:                 a -= 2;
  6307:                 int x = XEiJ.regRn[i];
  6308:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6309:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6310:               }
  6311:             }
  6312:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6313:             for (int i = 15; l != 0; ) {
  6314:               int k = Integer.numberOfTrailingZeros (l);
  6315:               a -= 2;
  6316:               int x = XEiJ.regRn[i -= k];
  6317:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6318:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6319:               l = l >>> k & ~1;
  6320:             }
  6321:           }
  6322:           a = t - (short) (t - a);
  6323:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  6324:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6325:             if ((l & 0x0001) != 0) {
  6326:               XEiJ.busWwe (a -= 2, XEiJ.regRn[15]);
  6327:             }
  6328:             if ((l & 0x0002) != 0) {
  6329:               XEiJ.busWwe (a -= 2, XEiJ.regRn[14]);
  6330:             }
  6331:             if ((l & 0x0004) != 0) {
  6332:               XEiJ.busWwe (a -= 2, XEiJ.regRn[13]);
  6333:             }
  6334:             if ((l & 0x0008) != 0) {
  6335:               XEiJ.busWwe (a -= 2, XEiJ.regRn[12]);
  6336:             }
  6337:             if ((l & 0x0010) != 0) {
  6338:               XEiJ.busWwe (a -= 2, XEiJ.regRn[11]);
  6339:             }
  6340:             if ((l & 0x0020) != 0) {
  6341:               XEiJ.busWwe (a -= 2, XEiJ.regRn[10]);
  6342:             }
  6343:             if ((l & 0x0040) != 0) {
  6344:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 9]);
  6345:             }
  6346:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6347:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 8]);
  6348:             }
  6349:             if ((l & 0x0100) != 0) {
  6350:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 7]);
  6351:             }
  6352:             if ((l & 0x0200) != 0) {
  6353:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 6]);
  6354:             }
  6355:             if ((l & 0x0400) != 0) {
  6356:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 5]);
  6357:             }
  6358:             if ((l & 0x0800) != 0) {
  6359:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 4]);
  6360:             }
  6361:             if ((l & 0x1000) != 0) {
  6362:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 3]);
  6363:             }
  6364:             if ((l & 0x2000) != 0) {
  6365:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 2]);
  6366:             }
  6367:             if ((l & 0x4000) != 0) {
  6368:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 1]);
  6369:             }
  6370:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6371:               XEiJ.busWwe (a -= 2, XEiJ.regRn[ 0]);
  6372:             }
  6373:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6374:             for (int i = 15; i >= 0; i--) {
  6375:               if ((l & 0x8000 >>> i) != 0) {
  6376:                 XEiJ.busWwe (a -= 2, XEiJ.regRn[i]);
  6377:               }
  6378:             }
  6379:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6380:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6381:             for (int i = 15; l != 0; i--, l <<= 1) {
  6382:               if (l < 0) {
  6383:                 XEiJ.busWwe (a -= 2, XEiJ.regRn[i]);
  6384:               }
  6385:             }
  6386:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6387:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6388:               if ((l & 1) != 0) {
  6389:                 XEiJ.busWwe (a -= 2, XEiJ.regRn[i]);
  6390:               }
  6391:             }
  6392:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6393:             for (int i = 15; l != 0; ) {
  6394:               int k = Integer.numberOfTrailingZeros (l);
  6395:               XEiJ.busWwe (a -= 2, XEiJ.regRn[i -= k]);
  6396:               l = l >>> k & ~1;
  6397:             }
  6398:           }
  6399:         }
  6400:         XEiJ.regRn[arr] = a;
  6401:         XEiJ.mpuCycleCount += 8 + (t - a << 1);  //2バイト/個→4サイクル/個
  6402:       } else {  //-(Ar)以外
  6403:         int a = efaCltWord (ea);
  6404:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  6405:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  6406:           M68kException.m6eAddress = a;
  6407:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  6408:           M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  6409:           throw M68kException.m6eSignal;
  6410:         }
  6411:         int t = a;
  6412:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  6413:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  6414:             (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) {  //16個転送してもページを跨がない
  6415:           a &= XEiJ.BUS_MOTHER_MASK;
  6416:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6417:             if ((l & 0x0001) != 0) {
  6418:               int x = XEiJ.regRn[ 0];
  6419:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6420:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6421:               a += 2;
  6422:             }
  6423:             if ((l & 0x0002) != 0) {
  6424:               int x = XEiJ.regRn[ 1];
  6425:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6426:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6427:               a += 2;
  6428:             }
  6429:             if ((l & 0x0004) != 0) {
  6430:               int x = XEiJ.regRn[ 2];
  6431:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6432:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6433:               a += 2;
  6434:             }
  6435:             if ((l & 0x0008) != 0) {
  6436:               int x = XEiJ.regRn[ 3];
  6437:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6438:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6439:               a += 2;
  6440:             }
  6441:             if ((l & 0x0010) != 0) {
  6442:               int x = XEiJ.regRn[ 4];
  6443:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6444:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6445:               a += 2;
  6446:             }
  6447:             if ((l & 0x0020) != 0) {
  6448:               int x = XEiJ.regRn[ 5];
  6449:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6450:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6451:               a += 2;
  6452:             }
  6453:             if ((l & 0x0040) != 0) {
  6454:               int x = XEiJ.regRn[ 6];
  6455:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6456:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6457:               a += 2;
  6458:             }
  6459:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6460:               int x = XEiJ.regRn[ 7];
  6461:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6462:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6463:               a += 2;
  6464:             }
  6465:             if ((l & 0x0100) != 0) {
  6466:               int x = XEiJ.regRn[ 8];
  6467:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6468:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6469:               a += 2;
  6470:             }
  6471:             if ((l & 0x0200) != 0) {
  6472:               int x = XEiJ.regRn[ 9];
  6473:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6474:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6475:               a += 2;
  6476:             }
  6477:             if ((l & 0x0400) != 0) {
  6478:               int x = XEiJ.regRn[10];
  6479:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6480:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6481:               a += 2;
  6482:             }
  6483:             if ((l & 0x0800) != 0) {
  6484:               int x = XEiJ.regRn[11];
  6485:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6486:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6487:               a += 2;
  6488:             }
  6489:             if ((l & 0x1000) != 0) {
  6490:               int x = XEiJ.regRn[12];
  6491:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6492:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6493:               a += 2;
  6494:             }
  6495:             if ((l & 0x2000) != 0) {
  6496:               int x = XEiJ.regRn[13];
  6497:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6498:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6499:               a += 2;
  6500:             }
  6501:             if ((l & 0x4000) != 0) {
  6502:               int x = XEiJ.regRn[14];
  6503:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6504:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6505:               a += 2;
  6506:             }
  6507:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6508:               int x = XEiJ.regRn[15];
  6509:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6510:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6511:               a += 2;
  6512:             }
  6513:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6514:             for (int i = 0; i <= 15; i++) {
  6515:               if ((l & 0x0001 << i) != 0) {
  6516:                 int x = XEiJ.regRn[i];
  6517:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6518:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6519:                 a += 2;
  6520:               }
  6521:             }
  6522:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6523:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6524:             for (int i = 0; l != 0; i++, l <<= 1) {
  6525:               if (l < 0) {
  6526:                 int x = XEiJ.regRn[i];
  6527:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6528:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6529:                 a += 2;
  6530:               }
  6531:             }
  6532:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6533:             for (int i = 0; l != 0; i++, l >>>= 1) {
  6534:               if ((l & 1) != 0) {
  6535:                 int x = XEiJ.regRn[i];
  6536:                 MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6537:                 MainMemory.mmrM8[a + 1] = (byte)  x;
  6538:                 a += 2;
  6539:               }
  6540:             }
  6541:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6542:             for (int i = 0; l != 0; ) {
  6543:               int k = Integer.numberOfTrailingZeros (l);
  6544:               int x = XEiJ.regRn[i += k];
  6545:               MainMemory.mmrM8[a    ] = (byte) (x >> 8);
  6546:               MainMemory.mmrM8[a + 1] = (byte)  x;
  6547:               a += 2;
  6548:               l = l >>> k & ~1;
  6549:             }
  6550:           }
  6551:           a = t + (short) (a - t);
  6552:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  6553:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6554:             if ((l & 0x0001) != 0) {
  6555:               XEiJ.busWwe (a, XEiJ.regRn[ 0]);
  6556:               a += 2;
  6557:             }
  6558:             if ((l & 0x0002) != 0) {
  6559:               XEiJ.busWwe (a, XEiJ.regRn[ 1]);
  6560:               a += 2;
  6561:             }
  6562:             if ((l & 0x0004) != 0) {
  6563:               XEiJ.busWwe (a, XEiJ.regRn[ 2]);
  6564:               a += 2;
  6565:             }
  6566:             if ((l & 0x0008) != 0) {
  6567:               XEiJ.busWwe (a, XEiJ.regRn[ 3]);
  6568:               a += 2;
  6569:             }
  6570:             if ((l & 0x0010) != 0) {
  6571:               XEiJ.busWwe (a, XEiJ.regRn[ 4]);
  6572:               a += 2;
  6573:             }
  6574:             if ((l & 0x0020) != 0) {
  6575:               XEiJ.busWwe (a, XEiJ.regRn[ 5]);
  6576:               a += 2;
  6577:             }
  6578:             if ((l & 0x0040) != 0) {
  6579:               XEiJ.busWwe (a, XEiJ.regRn[ 6]);
  6580:               a += 2;
  6581:             }
  6582:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6583:               XEiJ.busWwe (a, XEiJ.regRn[ 7]);
  6584:               a += 2;
  6585:             }
  6586:             if ((l & 0x0100) != 0) {
  6587:               XEiJ.busWwe (a, XEiJ.regRn[ 8]);
  6588:               a += 2;
  6589:             }
  6590:             if ((l & 0x0200) != 0) {
  6591:               XEiJ.busWwe (a, XEiJ.regRn[ 9]);
  6592:               a += 2;
  6593:             }
  6594:             if ((l & 0x0400) != 0) {
  6595:               XEiJ.busWwe (a, XEiJ.regRn[10]);
  6596:               a += 2;
  6597:             }
  6598:             if ((l & 0x0800) != 0) {
  6599:               XEiJ.busWwe (a, XEiJ.regRn[11]);
  6600:               a += 2;
  6601:             }
  6602:             if ((l & 0x1000) != 0) {
  6603:               XEiJ.busWwe (a, XEiJ.regRn[12]);
  6604:               a += 2;
  6605:             }
  6606:             if ((l & 0x2000) != 0) {
  6607:               XEiJ.busWwe (a, XEiJ.regRn[13]);
  6608:               a += 2;
  6609:             }
  6610:             if ((l & 0x4000) != 0) {
  6611:               XEiJ.busWwe (a, XEiJ.regRn[14]);
  6612:               a += 2;
  6613:             }
  6614:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6615:               XEiJ.busWwe (a, XEiJ.regRn[15]);
  6616:               a += 2;
  6617:             }
  6618:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6619:             for (int i = 0; i <= 15; i++) {
  6620:               if ((l & 0x0001 << i) != 0) {
  6621:                 XEiJ.busWwe (a, XEiJ.regRn[i]);
  6622:                 a += 2;
  6623:               }
  6624:             }
  6625:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6626:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6627:             for (int i = 0; l != 0; i++, l <<= 1) {
  6628:               if (l < 0) {
  6629:                 XEiJ.busWwe (a, XEiJ.regRn[i]);
  6630:                 a += 2;
  6631:               }
  6632:             }
  6633:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6634:             for (int i = 0; l != 0; i++, l >>>= 1) {
  6635:               if ((l & 1) != 0) {
  6636:                 XEiJ.busWwe (a, XEiJ.regRn[i]);
  6637:                 a += 2;
  6638:               }
  6639:             }
  6640:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6641:             for (int i = 0; l != 0; ) {
  6642:               int k = Integer.numberOfTrailingZeros (l);
  6643:               XEiJ.busWwe (a, XEiJ.regRn[i += k]);
  6644:               a += 2;
  6645:               l = l >>> k & ~1;
  6646:             }
  6647:           }
  6648:         }
  6649:         XEiJ.mpuCycleCount += 4 + (a - t << 1);  //2バイト/個→4サイクル/個
  6650:       }
  6651:     }
  6652:   }  //irpMovemToMemWord
  6653: 
  6654:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6655:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  6656:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  6657:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  6658:   //EXT.L Dr                                        |-|012346|-|-UUUU|-**00|D         |0100_100_011_000_rrr
  6659:   //MOVEM.L <list>,<ea>                             |-|012346|-|-----|-----|  M -WXZ  |0100_100_011_mmm_rrr-llllllllllllllll
  6660:   public static void irpMovemToMemLong () throws M68kException {
  6661:     int ea = XEiJ.regOC & 63;
  6662:     if (ea < XEiJ.EA_AR) {  //EXT.L Dr
  6663:       XEiJ.mpuCycleCount += 4;
  6664:       int z;
  6665:       XEiJ.regRn[ea] = z = (short) XEiJ.regRn[ea];
  6666:       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
  6667:     } else {  //MOVEM.L <list>,<ea>
  6668:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  6669:       XEiJ.regPC += 2;
  6670:       if (ea >> 3 == XEiJ.MMM_MN) {  //-(Ar)
  6671:         //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む
  6672:         //転送するレジスタが0個のときArは変化しない
  6673:         int arr = ea - (XEiJ.EA_MN - 8);
  6674:         int a = XEiJ.regRn[arr];
  6675:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  6676:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  6677:           M68kException.m6eAddress = a;
  6678:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  6679:           M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  6680:           throw M68kException.m6eSignal;
  6681:         }
  6682:         int t = a;
  6683:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  6684:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 4 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  6685:             4 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) {  //16個転送してもページを跨がない
  6686:           a &= XEiJ.BUS_MOTHER_MASK;
  6687:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6688:             if ((l & 0x0001) != 0) {
  6689:               a -= 4;
  6690:               int x = XEiJ.regRn[15];
  6691:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6692:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6693:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6694:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6695:             }
  6696:             if ((l & 0x0002) != 0) {
  6697:               a -= 4;
  6698:               int x = XEiJ.regRn[14];
  6699:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6700:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6701:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6702:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6703:             }
  6704:             if ((l & 0x0004) != 0) {
  6705:               a -= 4;
  6706:               int x = XEiJ.regRn[13];
  6707:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6708:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6709:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6710:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6711:             }
  6712:             if ((l & 0x0008) != 0) {
  6713:               a -= 4;
  6714:               int x = XEiJ.regRn[12];
  6715:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6716:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6717:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6718:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6719:             }
  6720:             if ((l & 0x0010) != 0) {
  6721:               a -= 4;
  6722:               int x = XEiJ.regRn[11];
  6723:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6724:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6725:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6726:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6727:             }
  6728:             if ((l & 0x0020) != 0) {
  6729:               a -= 4;
  6730:               int x = XEiJ.regRn[10];
  6731:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6732:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6733:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6734:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6735:             }
  6736:             if ((l & 0x0040) != 0) {
  6737:               a -= 4;
  6738:               int x = XEiJ.regRn[ 9];
  6739:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6740:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6741:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6742:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6743:             }
  6744:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6745:               a -= 4;
  6746:               int x = XEiJ.regRn[ 8];
  6747:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6748:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6749:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6750:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6751:             }
  6752:             if ((l & 0x0100) != 0) {
  6753:               a -= 4;
  6754:               int x = XEiJ.regRn[ 7];
  6755:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6756:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6757:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6758:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6759:             }
  6760:             if ((l & 0x0200) != 0) {
  6761:               a -= 4;
  6762:               int x = XEiJ.regRn[ 6];
  6763:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6764:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6765:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6766:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6767:             }
  6768:             if ((l & 0x0400) != 0) {
  6769:               a -= 4;
  6770:               int x = XEiJ.regRn[ 5];
  6771:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6772:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6773:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6774:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6775:             }
  6776:             if ((l & 0x0800) != 0) {
  6777:               a -= 4;
  6778:               int x = XEiJ.regRn[ 4];
  6779:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6780:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6781:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6782:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6783:             }
  6784:             if ((l & 0x1000) != 0) {
  6785:               a -= 4;
  6786:               int x = XEiJ.regRn[ 3];
  6787:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6788:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6789:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6790:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6791:             }
  6792:             if ((l & 0x2000) != 0) {
  6793:               a -= 4;
  6794:               int x = XEiJ.regRn[ 2];
  6795:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6796:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6797:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6798:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6799:             }
  6800:             if ((l & 0x4000) != 0) {
  6801:               a -= 4;
  6802:               int x = XEiJ.regRn[ 1];
  6803:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6804:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6805:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6806:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6807:             }
  6808:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6809:               a -= 4;
  6810:               int x = XEiJ.regRn[ 0];
  6811:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6812:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6813:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6814:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6815:             }
  6816:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6817:             for (int i = 15; i >= 0; i--) {
  6818:               if ((l & 0x8000 >>> i) != 0) {
  6819:                 a -= 4;
  6820:                 int x = XEiJ.regRn[i];
  6821:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6822:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6823:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6824:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  6825:               }
  6826:             }
  6827:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6828:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6829:             for (int i = 15; l != 0; i--, l <<= 1) {
  6830:               if (l < 0) {
  6831:                 a -= 4;
  6832:                 int x = XEiJ.regRn[i];
  6833:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6834:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6835:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6836:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  6837:               }
  6838:             }
  6839:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6840:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6841:               if ((l & 1) != 0) {
  6842:                 a -= 4;
  6843:                 int x = XEiJ.regRn[i];
  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:             }
  6850:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6851:             for (int i = 15; l != 0; ) {
  6852:               int k = Integer.numberOfTrailingZeros (l);
  6853:               a -= 4;
  6854:               int x = XEiJ.regRn[i -= k];
  6855:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6856:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6857:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6858:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6859:               l = l >>> k & ~1;
  6860:             }
  6861:           }
  6862:           a = t - (short) (t - a);
  6863:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  6864:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6865:             if ((l & 0x0001) != 0) {
  6866:               XEiJ.busWle (a -= 4, XEiJ.regRn[15]);
  6867:             }
  6868:             if ((l & 0x0002) != 0) {
  6869:               XEiJ.busWle (a -= 4, XEiJ.regRn[14]);
  6870:             }
  6871:             if ((l & 0x0004) != 0) {
  6872:               XEiJ.busWle (a -= 4, XEiJ.regRn[13]);
  6873:             }
  6874:             if ((l & 0x0008) != 0) {
  6875:               XEiJ.busWle (a -= 4, XEiJ.regRn[12]);
  6876:             }
  6877:             if ((l & 0x0010) != 0) {
  6878:               XEiJ.busWle (a -= 4, XEiJ.regRn[11]);
  6879:             }
  6880:             if ((l & 0x0020) != 0) {
  6881:               XEiJ.busWle (a -= 4, XEiJ.regRn[10]);
  6882:             }
  6883:             if ((l & 0x0040) != 0) {
  6884:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 9]);
  6885:             }
  6886:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  6887:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 8]);
  6888:             }
  6889:             if ((l & 0x0100) != 0) {
  6890:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 7]);
  6891:             }
  6892:             if ((l & 0x0200) != 0) {
  6893:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 6]);
  6894:             }
  6895:             if ((l & 0x0400) != 0) {
  6896:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 5]);
  6897:             }
  6898:             if ((l & 0x0800) != 0) {
  6899:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 4]);
  6900:             }
  6901:             if ((l & 0x1000) != 0) {
  6902:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 3]);
  6903:             }
  6904:             if ((l & 0x2000) != 0) {
  6905:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 2]);
  6906:             }
  6907:             if ((l & 0x4000) != 0) {
  6908:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 1]);
  6909:             }
  6910:             if ((short) l < 0) {  //(l & 0x8000) != 0
  6911:               XEiJ.busWle (a -= 4, XEiJ.regRn[ 0]);
  6912:             }
  6913:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  6914:             for (int i = 15; i >= 0; i--) {
  6915:               if ((l & 0x8000 >>> i) != 0) {
  6916:                 XEiJ.busWle (a -= 4, XEiJ.regRn[i]);
  6917:               }
  6918:             }
  6919:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  6920:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  6921:             for (int i = 15; l != 0; i--, l <<= 1) {
  6922:               if (l < 0) {
  6923:                 XEiJ.busWle (a -= 4, XEiJ.regRn[i]);
  6924:               }
  6925:             }
  6926:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  6927:             for (int i = 15; l != 0; i--, l >>>= 1) {
  6928:               if ((l & 1) != 0) {
  6929:                 XEiJ.busWle (a -= 4, XEiJ.regRn[i]);
  6930:               }
  6931:             }
  6932:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  6933:             for (int i = 15; l != 0; ) {
  6934:               int k = Integer.numberOfTrailingZeros (l);
  6935:               XEiJ.busWle (a -= 4, XEiJ.regRn[i -= k]);
  6936:               l = l >>> k & ~1;
  6937:             }
  6938:           }
  6939:         }
  6940:         XEiJ.regRn[arr] = a;
  6941:         XEiJ.mpuCycleCount += 8 + (t - a << 1);  //4バイト/個→8サイクル/個
  6942:       } else {  //-(Ar)以外
  6943:         int a = efaCltLong (ea);
  6944:         if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  6945:           M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  6946:           M68kException.m6eAddress = a;
  6947:           M68kException.m6eDirection = XEiJ.MPU_WR_WRITE;
  6948:           M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  6949:           throw M68kException.m6eSignal;
  6950:         }
  6951:         int t = a;
  6952:         if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  6953:             (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  6954:             (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) {  //16個転送してもページを跨がない
  6955:           a &= XEiJ.BUS_MOTHER_MASK;
  6956:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  6957:             if ((l & 0x0001) != 0) {
  6958:               int x = XEiJ.regRn[ 0];
  6959:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6960:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6961:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6962:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6963:               a += 4;
  6964:             }
  6965:             if ((l & 0x0002) != 0) {
  6966:               int x = XEiJ.regRn[ 1];
  6967:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6968:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6969:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6970:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6971:               a += 4;
  6972:             }
  6973:             if ((l & 0x0004) != 0) {
  6974:               int x = XEiJ.regRn[ 2];
  6975:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6976:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6977:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6978:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6979:               a += 4;
  6980:             }
  6981:             if ((l & 0x0008) != 0) {
  6982:               int x = XEiJ.regRn[ 3];
  6983:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6984:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6985:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6986:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6987:               a += 4;
  6988:             }
  6989:             if ((l & 0x0010) != 0) {
  6990:               int x = XEiJ.regRn[ 4];
  6991:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  6992:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  6993:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  6994:               MainMemory.mmrM8[a + 3] = (byte)  x;
  6995:               a += 4;
  6996:             }
  6997:             if ((l & 0x0020) != 0) {
  6998:               int x = XEiJ.regRn[ 5];
  6999:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7000:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7001:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7002:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7003:               a += 4;
  7004:             }
  7005:             if ((l & 0x0040) != 0) {
  7006:               int x = XEiJ.regRn[ 6];
  7007:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7008:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7009:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7010:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7011:               a += 4;
  7012:             }
  7013:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  7014:               int x = XEiJ.regRn[ 7];
  7015:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7016:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7017:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7018:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7019:               a += 4;
  7020:             }
  7021:             if ((l & 0x0100) != 0) {
  7022:               int x = XEiJ.regRn[ 8];
  7023:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7024:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7025:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7026:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7027:               a += 4;
  7028:             }
  7029:             if ((l & 0x0200) != 0) {
  7030:               int x = XEiJ.regRn[ 9];
  7031:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7032:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7033:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7034:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7035:               a += 4;
  7036:             }
  7037:             if ((l & 0x0400) != 0) {
  7038:               int x = XEiJ.regRn[10];
  7039:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7040:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7041:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7042:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7043:               a += 4;
  7044:             }
  7045:             if ((l & 0x0800) != 0) {
  7046:               int x = XEiJ.regRn[11];
  7047:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7048:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7049:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7050:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7051:               a += 4;
  7052:             }
  7053:             if ((l & 0x1000) != 0) {
  7054:               int x = XEiJ.regRn[12];
  7055:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7056:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7057:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7058:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7059:               a += 4;
  7060:             }
  7061:             if ((l & 0x2000) != 0) {
  7062:               int x = XEiJ.regRn[13];
  7063:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7064:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7065:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7066:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7067:               a += 4;
  7068:             }
  7069:             if ((l & 0x4000) != 0) {
  7070:               int x = XEiJ.regRn[14];
  7071:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7072:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7073:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7074:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7075:               a += 4;
  7076:             }
  7077:             if ((short) l < 0) {  //(l & 0x8000) != 0
  7078:               int x = XEiJ.regRn[15];
  7079:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7080:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7081:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7082:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7083:               a += 4;
  7084:             }
  7085:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7086:             for (int i = 0; i <= 15; i++) {
  7087:               if ((l & 0x0001 << i) != 0) {
  7088:                 int x = XEiJ.regRn[i];
  7089:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7090:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7091:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7092:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  7093:                 a += 4;
  7094:               }
  7095:             }
  7096:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7097:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7098:             for (int i = 0; l != 0; i++, l <<= 1) {
  7099:               if (l < 0) {
  7100:                 int x = XEiJ.regRn[i];
  7101:                 MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7102:                 MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7103:                 MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7104:                 MainMemory.mmrM8[a + 3] = (byte)  x;
  7105:                 a += 4;
  7106:               }
  7107:             }
  7108:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7109:             for (int i = 0; l != 0; i++, l >>>= 1) {
  7110:               if ((l & 1) != 0) {
  7111:                 int x = XEiJ.regRn[i];
  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:             }
  7119:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7120:             for (int i = 0; l != 0; ) {
  7121:               int k = Integer.numberOfTrailingZeros (l);
  7122:               int x = XEiJ.regRn[i += k];
  7123:               MainMemory.mmrM8[a    ] = (byte) (x >> 24);
  7124:               MainMemory.mmrM8[a + 1] = (byte) (x >> 16);
  7125:               MainMemory.mmrM8[a + 2] = (byte) (x >>  8);
  7126:               MainMemory.mmrM8[a + 3] = (byte)  x;
  7127:               a += 4;
  7128:               l = l >>> k & ~1;
  7129:             }
  7130:           }
  7131:           a = t + (short) (a - t);
  7132:         } else {  //メインメモリでないかページを跨ぐ可能性がある
  7133:           if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7134:             if ((l & 0x0001) != 0) {
  7135:               XEiJ.busWle (a, XEiJ.regRn[ 0]);
  7136:               a += 4;
  7137:             }
  7138:             if ((l & 0x0002) != 0) {
  7139:               XEiJ.busWle (a, XEiJ.regRn[ 1]);
  7140:               a += 4;
  7141:             }
  7142:             if ((l & 0x0004) != 0) {
  7143:               XEiJ.busWle (a, XEiJ.regRn[ 2]);
  7144:               a += 4;
  7145:             }
  7146:             if ((l & 0x0008) != 0) {
  7147:               XEiJ.busWle (a, XEiJ.regRn[ 3]);
  7148:               a += 4;
  7149:             }
  7150:             if ((l & 0x0010) != 0) {
  7151:               XEiJ.busWle (a, XEiJ.regRn[ 4]);
  7152:               a += 4;
  7153:             }
  7154:             if ((l & 0x0020) != 0) {
  7155:               XEiJ.busWle (a, XEiJ.regRn[ 5]);
  7156:               a += 4;
  7157:             }
  7158:             if ((l & 0x0040) != 0) {
  7159:               XEiJ.busWle (a, XEiJ.regRn[ 6]);
  7160:               a += 4;
  7161:             }
  7162:             if ((byte) l < 0) {  //(l & 0x0080) != 0
  7163:               XEiJ.busWle (a, XEiJ.regRn[ 7]);
  7164:               a += 4;
  7165:             }
  7166:             if ((l & 0x0100) != 0) {
  7167:               XEiJ.busWle (a, XEiJ.regRn[ 8]);
  7168:               a += 4;
  7169:             }
  7170:             if ((l & 0x0200) != 0) {
  7171:               XEiJ.busWle (a, XEiJ.regRn[ 9]);
  7172:               a += 4;
  7173:             }
  7174:             if ((l & 0x0400) != 0) {
  7175:               XEiJ.busWle (a, XEiJ.regRn[10]);
  7176:               a += 4;
  7177:             }
  7178:             if ((l & 0x0800) != 0) {
  7179:               XEiJ.busWle (a, XEiJ.regRn[11]);
  7180:               a += 4;
  7181:             }
  7182:             if ((l & 0x1000) != 0) {
  7183:               XEiJ.busWle (a, XEiJ.regRn[12]);
  7184:               a += 4;
  7185:             }
  7186:             if ((l & 0x2000) != 0) {
  7187:               XEiJ.busWle (a, XEiJ.regRn[13]);
  7188:               a += 4;
  7189:             }
  7190:             if ((l & 0x4000) != 0) {
  7191:               XEiJ.busWle (a, XEiJ.regRn[14]);
  7192:               a += 4;
  7193:             }
  7194:             if ((short) l < 0) {  //(l & 0x8000) != 0
  7195:               XEiJ.busWle (a, XEiJ.regRn[15]);
  7196:               a += 4;
  7197:             }
  7198:           } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7199:             for (int i = 0; i <= 15; i++) {
  7200:               if ((l & 0x0001 << i) != 0) {
  7201:                 XEiJ.busWle (a, XEiJ.regRn[i]);
  7202:                 a += 4;
  7203:               }
  7204:             }
  7205:           } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7206:             l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7207:             for (int i = 0; l != 0; i++, l <<= 1) {
  7208:               if (l < 0) {
  7209:                 XEiJ.busWle (a, XEiJ.regRn[i]);
  7210:                 a += 4;
  7211:               }
  7212:             }
  7213:           } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7214:             for (int i = 0; l != 0; i++, l >>>= 1) {
  7215:               if ((l & 1) != 0) {
  7216:                 XEiJ.busWle (a, XEiJ.regRn[i]);
  7217:                 a += 4;
  7218:               }
  7219:             }
  7220:           } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7221:             for (int i = 0; l != 0; ) {
  7222:               int k = Integer.numberOfTrailingZeros (l);
  7223:               XEiJ.busWle (a, XEiJ.regRn[i += k]);
  7224:               a += 4;
  7225:               l = l >>> k & ~1;
  7226:             }
  7227:           }
  7228:         }
  7229:         XEiJ.mpuCycleCount += 0 + (a - t << 1);  //4バイト/個→8サイクル/個
  7230:       }
  7231:     }
  7232:   }  //irpMovemToMemLong
  7233: 
  7234:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7235:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7236:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7237:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7238:   //TST.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_000_mmm_rrr
  7239:   public static void irpTstByte () throws M68kException {
  7240:     XEiJ.mpuCycleCount += 4;
  7241:     int ea = XEiJ.regOC & 63;
  7242:     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。アドレッシングモードに注意
  7243:   }  //irpTstByte
  7244: 
  7245:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7246:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7247:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7248:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7249:   //TST.W <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_001_mmm_rrr
  7250:   public static void irpTstWord () throws M68kException {
  7251:     XEiJ.mpuCycleCount += 4;
  7252:     int ea = XEiJ.regOC & 63;
  7253:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea));  //アドレッシングモードに注意
  7254:     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
  7255:   }  //irpTstWord
  7256: 
  7257:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7258:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7259:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7260:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7261:   //TST.L <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_010_mmm_rrr
  7262:   public static void irpTstLong () throws M68kException {
  7263:     XEiJ.mpuCycleCount += 4;
  7264:     int ea = XEiJ.regOC & 63;
  7265:     int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRls (efaMltLong (ea));  //アドレッシングモードに注意
  7266:     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
  7267:   }  //irpTstLong
  7268: 
  7269:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7270:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7271:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7272:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7273:   //TAS.B <ea>                                      |-|012346|-|-UUUU|-**00|D M+-WXZ  |0100_101_011_mmm_rrr
  7274:   //ILLEGAL                                         |-|012346|-|-----|-----|          |0100_101_011_111_100
  7275:   public static void irpTas () throws M68kException {
  7276:     int ea = XEiJ.regOC & 63;
  7277:     int z;
  7278:     if (ea < XEiJ.EA_AR) {  //TAS.B Dr
  7279:       XEiJ.mpuCycleCount += 4;
  7280:       XEiJ.regRn[ea] = 0x80 | (z = XEiJ.regRn[ea]);
  7281:     } else if (ea == XEiJ.EA_IM) {  //ILLEGAL
  7282:       XEiJ.mpuCycleCount += 34;
  7283:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  7284:       throw M68kException.m6eSignal;
  7285:     } else {  //TAS.B <mem>
  7286:       XEiJ.mpuCycleCount += 10;
  7287:       int a = efaMltByte (ea);
  7288:       XEiJ.busWb (a, 0x80 | (z = XEiJ.busRbs (a)));
  7289:     }
  7290:     XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
  7291:   }  //irpTas
  7292: 
  7293:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7294:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7295:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7296:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7297:   //SATS.L Dr                                       |-|------|-|-UUUU|-**00|D         |0100_110_010_000_rrr (ISA_B)
  7298:   //MOVEM.W <ea>,<list>                             |-|012346|-|-----|-----|  M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll
  7299:   //
  7300:   //SATS.L Dr
  7301:   //  VがセットされていたらDrを符号が逆で絶対値が最大の値にする(直前のDrに対する演算を飽和演算にする)
  7302:   public static void irpMovemToRegWord () throws M68kException {
  7303:     int ea = XEiJ.regOC & 63;
  7304:     if (ea < XEiJ.EA_AR) {  //SATS.L Dr
  7305:       XEiJ.mpuCycleCount += 4;
  7306:       int z = XEiJ.regRn[ea];
  7307:       if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 < 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) != 0) {  //Vがセットされているとき
  7308:         XEiJ.regRn[ea] = z = z >> 31 ^ 0x80000000;  //符号が逆で絶対値が最大の値にする
  7309:       }
  7310:       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
  7311:     } else {  //MOVEM.W <ea>,<list>
  7312:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  7313:       XEiJ.regPC += 2;
  7314:       int arr, a;
  7315:       if (ea >> 3 == XEiJ.MMM_MP) {  //(Ar)+
  7316:         XEiJ.mpuCycleCount += 12;
  7317:         arr = ea - (XEiJ.EA_MP - 8);
  7318:         a = XEiJ.regRn[arr];
  7319:       } else {  //(Ar)+以外
  7320:         XEiJ.mpuCycleCount += 8;
  7321:         arr = 16;
  7322:         a = efaCntWord (ea);
  7323:       }
  7324:       if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  7325:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  7326:         M68kException.m6eAddress = a;
  7327:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  7328:         M68kException.m6eSize = XEiJ.MPU_SS_WORD;
  7329:         throw M68kException.m6eSignal;
  7330:       }
  7331:       int t = a;
  7332:       if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  7333:           (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  7334:           (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) {  //16個転送してもページを跨がない
  7335:         a &= XEiJ.BUS_MOTHER_MASK;
  7336:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7337:           if ((l & 0x0001) != 0) {
  7338:             XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7339:             a += 2;
  7340:           }
  7341:           if ((l & 0x0002) != 0) {
  7342:             XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7343:             a += 2;
  7344:           }
  7345:           if ((l & 0x0004) != 0) {
  7346:             XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7347:             a += 2;
  7348:           }
  7349:           if ((l & 0x0008) != 0) {
  7350:             XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7351:             a += 2;
  7352:           }
  7353:           if ((l & 0x0010) != 0) {
  7354:             XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7355:             a += 2;
  7356:           }
  7357:           if ((l & 0x0020) != 0) {
  7358:             XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7359:             a += 2;
  7360:           }
  7361:           if ((l & 0x0040) != 0) {
  7362:             XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7363:             a += 2;
  7364:           }
  7365:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7366:             XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //データレジスタも符号拡張して32bit全部書き換える
  7367:             a += 2;
  7368:           }
  7369:           if ((l & 0x0100) != 0) {
  7370:             XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7371:             a += 2;
  7372:           }
  7373:           if ((l & 0x0200) != 0) {
  7374:             XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7375:             a += 2;
  7376:           }
  7377:           if ((l & 0x0400) != 0) {
  7378:             XEiJ.regRn[10] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7379:             a += 2;
  7380:           }
  7381:           if ((l & 0x0800) != 0) {
  7382:             XEiJ.regRn[11] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7383:             a += 2;
  7384:           }
  7385:           if ((l & 0x1000) != 0) {
  7386:             XEiJ.regRn[12] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7387:             a += 2;
  7388:           }
  7389:           if ((l & 0x2000) != 0) {
  7390:             XEiJ.regRn[13] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7391:             a += 2;
  7392:           }
  7393:           if ((l & 0x4000) != 0) {
  7394:             XEiJ.regRn[14] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7395:             a += 2;
  7396:           }
  7397:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7398:             XEiJ.regRn[15] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //符号拡張して32bit全部書き換える
  7399:             a += 2;
  7400:           }
  7401:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7402:           for (int i = 0; i <= 15; i++) {
  7403:             if ((l & 0x0001 << i) != 0) {
  7404:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7405:               a += 2;
  7406:             }
  7407:           }
  7408:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7409:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7410:           for (int i = 0; l != 0; i++, l <<= 1) {
  7411:             if (l < 0) {
  7412:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7413:               a += 2;
  7414:             }
  7415:           }
  7416:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7417:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7418:             if ((l & 1) != 0) {
  7419:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7420:               a += 2;
  7421:             }
  7422:           }
  7423:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7424:           for (int i = 0; l != 0; ) {
  7425:             int k = Integer.numberOfTrailingZeros (l);
  7426:             XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255;  //(データレジスタも)符号拡張して32bit全部書き換える
  7427:             a += 2;
  7428:             l = l >>> k & ~1;
  7429:           }
  7430:         }
  7431:         a = t + (short) (a - t);
  7432:       } else {  //メインメモリでないかページを跨ぐ可能性がある
  7433:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7434:           if ((l & 0x0001) != 0) {
  7435:             XEiJ.regRn[ 0] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7436:             a += 2;
  7437:           }
  7438:           if ((l & 0x0002) != 0) {
  7439:             XEiJ.regRn[ 1] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7440:             a += 2;
  7441:           }
  7442:           if ((l & 0x0004) != 0) {
  7443:             XEiJ.regRn[ 2] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7444:             a += 2;
  7445:           }
  7446:           if ((l & 0x0008) != 0) {
  7447:             XEiJ.regRn[ 3] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7448:             a += 2;
  7449:           }
  7450:           if ((l & 0x0010) != 0) {
  7451:             XEiJ.regRn[ 4] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7452:             a += 2;
  7453:           }
  7454:           if ((l & 0x0020) != 0) {
  7455:             XEiJ.regRn[ 5] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7456:             a += 2;
  7457:           }
  7458:           if ((l & 0x0040) != 0) {
  7459:             XEiJ.regRn[ 6] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7460:             a += 2;
  7461:           }
  7462:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7463:             XEiJ.regRn[ 7] = XEiJ.busRwse (a);  //データレジスタも符号拡張して32bit全部書き換える
  7464:             a += 2;
  7465:           }
  7466:           if ((l & 0x0100) != 0) {
  7467:             XEiJ.regRn[ 8] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7468:             a += 2;
  7469:           }
  7470:           if ((l & 0x0200) != 0) {
  7471:             XEiJ.regRn[ 9] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7472:             a += 2;
  7473:           }
  7474:           if ((l & 0x0400) != 0) {
  7475:             XEiJ.regRn[10] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7476:             a += 2;
  7477:           }
  7478:           if ((l & 0x0800) != 0) {
  7479:             XEiJ.regRn[11] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7480:             a += 2;
  7481:           }
  7482:           if ((l & 0x1000) != 0) {
  7483:             XEiJ.regRn[12] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7484:             a += 2;
  7485:           }
  7486:           if ((l & 0x2000) != 0) {
  7487:             XEiJ.regRn[13] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7488:             a += 2;
  7489:           }
  7490:           if ((l & 0x4000) != 0) {
  7491:             XEiJ.regRn[14] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7492:             a += 2;
  7493:           }
  7494:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7495:             XEiJ.regRn[15] = XEiJ.busRwse (a);  //符号拡張して32bit全部書き換える
  7496:             a += 2;
  7497:           }
  7498:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7499:           for (int i = 0; i <= 15; i++) {
  7500:             if ((l & 0x0001 << i) != 0) {
  7501:               XEiJ.regRn[i] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7502:               a += 2;
  7503:             }
  7504:           }
  7505:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7506:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7507:           for (int i = 0; l != 0; i++, l <<= 1) {
  7508:             if (l < 0) {
  7509:               XEiJ.regRn[i] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7510:               a += 2;
  7511:             }
  7512:           }
  7513:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7514:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7515:             if ((l & 1) != 0) {
  7516:               XEiJ.regRn[i] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7517:               a += 2;
  7518:             }
  7519:           }
  7520:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7521:           for (int i = 0; l != 0; ) {
  7522:             int k = Integer.numberOfTrailingZeros (l);
  7523:             XEiJ.regRn[i += k] = XEiJ.busRwse (a);  //(データレジスタも)符号拡張して32bit全部書き換える
  7524:             a += 2;
  7525:             l = l >>> k & ~1;
  7526:           }
  7527:         }
  7528:       }
  7529:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  7530:         //! 軽量化。MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするが省略する
  7531:         //  MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する
  7532:         //  RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、
  7533:         //  12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因
  7534:       } else {
  7535:         XEiJ.busRws (a);
  7536:       }
  7537:       //MOVEM.W (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする
  7538:       XEiJ.regRn[arr] = a;
  7539:       XEiJ.mpuCycleCount += a - t << 1;  //2バイト/個→4サイクル/個
  7540:     }
  7541:   }  //irpMovemToRegWord
  7542: 
  7543:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7544:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7545:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7546:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7547:   //MOVEM.L <ea>,<list>                             |-|012346|-|-----|-----|  M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll
  7548:   public static void irpMovemToRegLong () throws M68kException {
  7549:     int ea = XEiJ.regOC & 63;
  7550:     {
  7551:       int l = XEiJ.busRwze (XEiJ.regPC);  //pcwze。レジスタリスト。ゼロ拡張
  7552:       XEiJ.regPC += 2;
  7553:       int arr, a;
  7554:       if (ea >> 3 == XEiJ.MMM_MP) {  //(Ar)+
  7555:         XEiJ.mpuCycleCount += 8;
  7556:         arr = ea - (XEiJ.EA_MP - 8);
  7557:         a = XEiJ.regRn[arr];
  7558:       } else {  //(Ar)+以外
  7559:         XEiJ.mpuCycleCount += 4;
  7560:         arr = 16;
  7561:         a = efaCntLong (ea);
  7562:       }
  7563:       if ((a & 1) != 0 && l != 0) {  //奇数アドレスで1ワード以上転送する
  7564:         M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
  7565:         M68kException.m6eAddress = a;
  7566:         M68kException.m6eDirection = XEiJ.MPU_WR_READ;
  7567:         M68kException.m6eSize = XEiJ.MPU_SS_LONG;
  7568:         throw M68kException.m6eSignal;
  7569:       }
  7570:       int t = a;
  7571:       if (XEiJ.IRP_MOVEM_MAINMEMORY &&  //000のときMOVEMでメインメモリを特別扱いにする
  7572:           (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR &&  //メインメモリ
  7573:           (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) {  //16個転送してもページを跨がない
  7574:         a &= XEiJ.BUS_MOTHER_MASK;
  7575:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7576:           if ((l & 0x0001) != 0) {
  7577:             XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7578:             a += 4;
  7579:           }
  7580:           if ((l & 0x0002) != 0) {
  7581:             XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7582:             a += 4;
  7583:           }
  7584:           if ((l & 0x0004) != 0) {
  7585:             XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7586:             a += 4;
  7587:           }
  7588:           if ((l & 0x0008) != 0) {
  7589:             XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7590:             a += 4;
  7591:           }
  7592:           if ((l & 0x0010) != 0) {
  7593:             XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7594:             a += 4;
  7595:           }
  7596:           if ((l & 0x0020) != 0) {
  7597:             XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7598:             a += 4;
  7599:           }
  7600:           if ((l & 0x0040) != 0) {
  7601:             XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7602:             a += 4;
  7603:           }
  7604:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7605:             XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7606:             a += 4;
  7607:           }
  7608:           if ((l & 0x0100) != 0) {
  7609:             XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7610:             a += 4;
  7611:           }
  7612:           if ((l & 0x0200) != 0) {
  7613:             XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7614:             a += 4;
  7615:           }
  7616:           if ((l & 0x0400) != 0) {
  7617:             XEiJ.regRn[10] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7618:             a += 4;
  7619:           }
  7620:           if ((l & 0x0800) != 0) {
  7621:             XEiJ.regRn[11] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7622:             a += 4;
  7623:           }
  7624:           if ((l & 0x1000) != 0) {
  7625:             XEiJ.regRn[12] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7626:             a += 4;
  7627:           }
  7628:           if ((l & 0x2000) != 0) {
  7629:             XEiJ.regRn[13] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7630:             a += 4;
  7631:           }
  7632:           if ((l & 0x4000) != 0) {
  7633:             XEiJ.regRn[14] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7634:             a += 4;
  7635:           }
  7636:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7637:             XEiJ.regRn[15] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7638:             a += 4;
  7639:           }
  7640:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7641:           for (int i = 0; i <= 15; i++) {
  7642:             if ((l & 0x0001 << i) != 0) {
  7643:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7644:               a += 4;
  7645:             }
  7646:           }
  7647:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7648:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7649:           for (int i = 0; l != 0; i++, l <<= 1) {
  7650:             if (l < 0) {
  7651:               XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255);
  7652:               a += 4;
  7653:             }
  7654:           }
  7655:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7656:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7657:             if ((l & 1) != 0) {
  7658:               XEiJ.regRn[i] = 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:           }
  7662:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7663:           for (int i = 0; l != 0; ) {
  7664:             int k = Integer.numberOfTrailingZeros (l);
  7665:             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);
  7666:             a += 4;
  7667:             l = l >>> k & ~1;
  7668:           }
  7669:         }
  7670:         a = t + (short) (a - t);
  7671:       } else {  //メインメモリでないかページを跨ぐ可能性がある
  7672:         if (XEiJ.IRP_MOVEM_EXPAND) {  //16回展開する
  7673:           if ((l & 0x0001) != 0) {
  7674:             XEiJ.regRn[ 0] = XEiJ.busRlse (a);
  7675:             a += 4;
  7676:           }
  7677:           if ((l & 0x0002) != 0) {
  7678:             XEiJ.regRn[ 1] = XEiJ.busRlse (a);
  7679:             a += 4;
  7680:           }
  7681:           if ((l & 0x0004) != 0) {
  7682:             XEiJ.regRn[ 2] = XEiJ.busRlse (a);
  7683:             a += 4;
  7684:           }
  7685:           if ((l & 0x0008) != 0) {
  7686:             XEiJ.regRn[ 3] = XEiJ.busRlse (a);
  7687:             a += 4;
  7688:           }
  7689:           if ((l & 0x0010) != 0) {
  7690:             XEiJ.regRn[ 4] = XEiJ.busRlse (a);
  7691:             a += 4;
  7692:           }
  7693:           if ((l & 0x0020) != 0) {
  7694:             XEiJ.regRn[ 5] = XEiJ.busRlse (a);
  7695:             a += 4;
  7696:           }
  7697:           if ((l & 0x0040) != 0) {
  7698:             XEiJ.regRn[ 6] = XEiJ.busRlse (a);
  7699:             a += 4;
  7700:           }
  7701:           if ((byte) l < 0) {  //(l & 0x0080) != 0
  7702:             XEiJ.regRn[ 7] = XEiJ.busRlse (a);
  7703:             a += 4;
  7704:           }
  7705:           if ((l & 0x0100) != 0) {
  7706:             XEiJ.regRn[ 8] = XEiJ.busRlse (a);
  7707:             a += 4;
  7708:           }
  7709:           if ((l & 0x0200) != 0) {
  7710:             XEiJ.regRn[ 9] = XEiJ.busRlse (a);
  7711:             a += 4;
  7712:           }
  7713:           if ((l & 0x0400) != 0) {
  7714:             XEiJ.regRn[10] = XEiJ.busRlse (a);
  7715:             a += 4;
  7716:           }
  7717:           if ((l & 0x0800) != 0) {
  7718:             XEiJ.regRn[11] = XEiJ.busRlse (a);
  7719:             a += 4;
  7720:           }
  7721:           if ((l & 0x1000) != 0) {
  7722:             XEiJ.regRn[12] = XEiJ.busRlse (a);
  7723:             a += 4;
  7724:           }
  7725:           if ((l & 0x2000) != 0) {
  7726:             XEiJ.regRn[13] = XEiJ.busRlse (a);
  7727:             a += 4;
  7728:           }
  7729:           if ((l & 0x4000) != 0) {
  7730:             XEiJ.regRn[14] = XEiJ.busRlse (a);
  7731:             a += 4;
  7732:           }
  7733:           if ((short) l < 0) {  //(l & 0x8000) != 0
  7734:             XEiJ.regRn[15] = XEiJ.busRlse (a);
  7735:             a += 4;
  7736:           }
  7737:         } else if (XEiJ.IRP_MOVEM_LOOP) {  //16回ループする。コンパイラが展開する
  7738:           for (int i = 0; i <= 15; i++) {
  7739:             if ((l & 0x0001 << i) != 0) {
  7740:               XEiJ.regRn[i] = XEiJ.busRlse (a);
  7741:               a += 4;
  7742:             }
  7743:           }
  7744:         } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) {  //0になるまで左にシフトする
  7745:           l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21];  //Integer.reverse(l)
  7746:           for (int i = 0; l != 0; i++, l <<= 1) {
  7747:             if (l < 0) {
  7748:               XEiJ.regRn[i] = XEiJ.busRlse (a);
  7749:               a += 4;
  7750:             }
  7751:           }
  7752:         } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) {  //0になるまで右にシフトする
  7753:           for (int i = 0; l != 0; i++, l >>>= 1) {
  7754:             if ((l & 1) != 0) {
  7755:               XEiJ.regRn[i] = XEiJ.busRlse (a);
  7756:               a += 4;
  7757:             }
  7758:           }
  7759:         } else if (XEiJ.IRP_MOVEM_ZEROS) {  //Integer.numberOfTrailingZerosを使う
  7760:           for (int i = 0; l != 0; ) {
  7761:             int k = Integer.numberOfTrailingZeros (l);
  7762:             XEiJ.regRn[i += k] = XEiJ.busRlse (a);
  7763:             a += 4;
  7764:             l = l >>> k & ~1;
  7765:           }
  7766:         }
  7767:       }
  7768:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  7769:         //! 軽量化。MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするが省略する
  7770:         //  MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する
  7771:         //  RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、
  7772:         //  12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因
  7773:       } else {
  7774:         XEiJ.busRws (a);
  7775:       }
  7776:       //MOVEM.L (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする
  7777:       XEiJ.regRn[arr] = a;  //XEiJ.regRn[arr]は破壊されているのでXEiJ.regRn[arr]+=a-=tは不可
  7778:       XEiJ.mpuCycleCount += a - t << 1;  //4バイト/個→8サイクル/個
  7779:     }
  7780:   }  //irpMovemToRegLong
  7781: 
  7782:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7783:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7784:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7785:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7786:   //TRAP #<vector>                                  |-|012346|-|-----|-----|          |0100_111_001_00v_vvv
  7787:   public static void irpTrap () throws M68kException {
  7788:     XEiJ.mpuCycleCount += 34;
  7789:     if (XEiJ.MPU_INLINE_EXCEPTION) {
  7790:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  7791:       int sp = XEiJ.regRn[15];
  7792:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
  7793:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7794:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
  7795:         XEiJ.mpuUSP = sp;  //USPを保存
  7796:         sp = XEiJ.mpuISP;  //SSPを復元
  7797:         if (DataBreakPoint.DBP_ON) {
  7798:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
  7799:         } else {
  7800:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
  7801:         }
  7802:         if (InstructionBreakPoint.IBP_ON) {
  7803:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
  7804:         }
  7805:       }
  7806:       int vectorOffset = XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR) << 2;  //vector offset
  7807:       XEiJ.regRn[15] = sp -= 8;  //short format
  7808:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
  7809:       XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  7810:       XEiJ.busWw (sp, save_sr);  //status register
  7811:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
  7812:     } else {
  7813:       irpException (XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR), XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは次の命令
  7814:     }
  7815:   }  //irpTrap
  7816:   public static void irpTrap15 () throws M68kException {
  7817:     if ((XEiJ.regRn[0] & 255) == 0x8e) {  //IOCS _BOOTINF
  7818:       MainMemory.mmrCheckHuman ();
  7819:     }
  7820:     XEiJ.mpuCycleCount += 34;
  7821:     if (XEiJ.MPU_INLINE_EXCEPTION) {
  7822:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
  7823:       int sp = XEiJ.regRn[15];
  7824:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
  7825:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7826:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
  7827:         XEiJ.mpuUSP = sp;  //USPを保存
  7828:         sp = XEiJ.mpuISP;  //SSPを復元
  7829:         if (DataBreakPoint.DBP_ON) {
  7830:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
  7831:         } else {
  7832:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
  7833:         }
  7834:         if (InstructionBreakPoint.IBP_ON) {
  7835:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
  7836:         }
  7837:       }
  7838:       int vectorOffset = M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR << 2;  //vector offset
  7839:       XEiJ.regRn[15] = sp -= 8;  //short format
  7840:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
  7841:       XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
  7842:       XEiJ.busWw (sp, save_sr);  //status register
  7843:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
  7844:     } else {
  7845:       irpException (M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは次の命令
  7846:     }
  7847:   }  //irpTrap15
  7848: 
  7849:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7850:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7851:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7852:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7853:   //LINK.W Ar,#<data>                               |-|012346|-|-----|-----|          |0100_111_001_010_rrr-{data}
  7854:   //
  7855:   //LINK.W Ar,#<data>
  7856:   //  PEA.L (Ar);MOVEA.L A7,Ar;ADDA.W #<data>,A7と同じ
  7857:   //  LINK.W A7,#<data>はA7をデクリメントする前の値がプッシュされ、A7に#<data>が加算される
  7858:   public static void irpLinkWord () throws M68kException {
  7859:     XEiJ.mpuCycleCount += 16;
  7860:     int arr = XEiJ.regOC - (0b0100_111_001_010_000 - 8);
  7861:     //評価順序に注意
  7862:     //  wl(r[15]-=4,r[8+rrr])は不可
  7863:     int sp = XEiJ.regRn[15] - 4;
  7864:     XEiJ.busWl (sp, XEiJ.regRn[arr]);  //pushl
  7865:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  7866:       XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  7867:     } else {
  7868:       int t = XEiJ.regPC;
  7869:       XEiJ.regPC = t + 2;
  7870:       XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse (t);  //pcws
  7871:     }
  7872:   }  //irpLinkWord
  7873: 
  7874:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7875:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7876:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7877:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7878:   //UNLK Ar                                         |-|012346|-|-----|-----|          |0100_111_001_011_rrr
  7879:   //
  7880:   //UNLK Ar
  7881:   //  MOVEA.L Ar,A7;MOVEA.L (A7)+,Arと同じ
  7882:   //  UNLK A7はMOVEA.L A7,A7;MOVEA.L (A7)+,A7すなわちMOVEA.L (A7),A7と同じ
  7883:   //  ソースオペランドのポストインクリメントはデスティネーションオペランドが評価される前に完了しているとみなされる
  7884:   //    例えばMOVE.L (A0)+,(A0)+はMOVE.L (A0),(4,A0);ADDQ.L #8,A0と同じ
  7885:   //    MOVEA.L (A0)+,A0はポストインクリメントされたA0が(A0)から読み出された値で上書きされるのでMOVEA.L (A0),A0と同じ
  7886:   //  M68000PRMにUNLK Anの動作はAn→SP;(SP)→An;SP+4→SPだと書かれているがこれはn=7の場合に当てはまらない
  7887:   //  余談だが68040の初期のマスクセットはUNLK A7を実行すると固まるらしい
  7888:   public static void irpUnlk () throws M68kException {
  7889:     XEiJ.mpuCycleCount += 12;
  7890:     int arr = XEiJ.regOC - (0b0100_111_001_011_000 - 8);
  7891:     //評価順序に注意
  7892:     int sp = XEiJ.regRn[arr];
  7893:     XEiJ.regRn[15] = sp + 4;
  7894:     XEiJ.regRn[arr] = XEiJ.busRls (sp);  //popls
  7895:   }  //irpUnlk
  7896: 
  7897:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7898:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7899:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7900:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7901:   //MOVE.L Ar,USP                                   |-|012346|P|-----|-----|          |0100_111_001_100_rrr
  7902:   public static void irpMoveToUsp () throws M68kException {
  7903:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7904:       XEiJ.mpuCycleCount += 34;
  7905:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  7906:       throw M68kException.m6eSignal;
  7907:     }
  7908:     //以下はスーパーバイザモード
  7909:     XEiJ.mpuCycleCount += 4;
  7910:     XEiJ.mpuUSP = XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_100_000 - 8)];
  7911:   }  //irpMoveToUsp
  7912: 
  7913:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7914:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7915:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7916:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7917:   //MOVE.L USP,Ar                                   |-|012346|P|-----|-----|          |0100_111_001_101_rrr
  7918:   public static void irpMoveFromUsp () throws M68kException {
  7919:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7920:       XEiJ.mpuCycleCount += 34;
  7921:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  7922:       throw M68kException.m6eSignal;
  7923:     }
  7924:     //以下はスーパーバイザモード
  7925:     XEiJ.mpuCycleCount += 4;
  7926:     XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_101_000 - 8)] = XEiJ.mpuUSP;
  7927:   }  //irpMoveFromUsp
  7928: 
  7929:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7930:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7931:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7932:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7933:   //RESET                                           |-|012346|P|-----|-----|          |0100_111_001_110_000
  7934:   public static void irpReset () throws M68kException {
  7935:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7936:       XEiJ.mpuCycleCount += 34;
  7937:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  7938:       throw M68kException.m6eSignal;
  7939:     }
  7940:     //以下はスーパーバイザモード
  7941:     XEiJ.mpuCycleCount += 132;
  7942:     XEiJ.irpReset ();
  7943:   }  //irpReset
  7944: 
  7945:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7946:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7947:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7948:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7949:   //NOP                                             |-|012346|-|-----|-----|          |0100_111_001_110_001
  7950:   public static void irpNop () throws M68kException {
  7951:     XEiJ.mpuCycleCount += 4;
  7952:     //何もしない
  7953:   }  //irpNop
  7954: 
  7955:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7956:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7957:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7958:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7959:   //STOP #<data>                                    |-|012346|P|UUUUU|*****|          |0100_111_001_110_010-{data}
  7960:   //
  7961:   //STOP #<data>
  7962:   //    1. #<data>をsrに設定する
  7963:   //    2. pcを進める
  7964:   //    3. 以下のいずれかの条件が成立するまで停止する
  7965:   //      3a. トレース
  7966:   //      3b. マスクされているレベルよりも高い割り込み要求
  7967:   //      3c. リセット
  7968:   //  コアと一緒にデバイスを止めるわけにいかないので、ここでは条件が成立するまで同じ命令を繰り返すループ命令として実装する
  7969:   public static void irpStop () throws M68kException {
  7970:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7971:       XEiJ.mpuCycleCount += 34;
  7972:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  7973:       throw M68kException.m6eSignal;
  7974:     }
  7975:     //以下はスーパーバイザモード
  7976:     XEiJ.mpuCycleCount += 4;
  7977:     irpSetSR (XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。特権違反チェックが先
  7978:     if (XEiJ.mpuTraceFlag == 0) {  //トレースまたはマスクされているレベルよりも高い割り込み要求がない
  7979:       XEiJ.regPC = XEiJ.regPC0;  //ループ
  7980:       //任意の負荷率を100%に設定しているときSTOP命令が軽すぎると動作周波数が大きくなりすぎて割り込みがかかったとき次に進めなくなる
  7981:       //負荷率の計算にSTOP命令で止まっていた時間を含めないことにする
  7982:       XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000;  //4μs。10MHzのとき40clk
  7983:       XEiJ.mpuLastNano += 4000L;
  7984:     }
  7985:   }  //irpStop
  7986: 
  7987:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7988:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  7989:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  7990:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  7991:   //RTE                                             |-|012346|P|UUUUU|*****|          |0100_111_001_110_011
  7992:   public static void irpRte () throws M68kException {
  7993:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  7994:       XEiJ.mpuCycleCount += 34;
  7995:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  7996:       throw M68kException.m6eSignal;
  7997:     }
  7998:     //以下はスーパーバイザモード
  7999:     XEiJ.mpuCycleCount += 20;
  8000:     int sp = XEiJ.regRn[15];
  8001:     int format = XEiJ.busRws (sp + 6) >>> 12;
  8002:     int frameSize;
  8003:     if (format == 0x0) {  //010,020,030,040,060
  8004:       frameSize = 8;
  8005:     } else if (format == 0x8) {  //010
  8006:       frameSize = 58;
  8007:     } else {
  8008:       M68kException.m6eNumber = M68kException.M6E_FORMAT_ERROR;
  8009:       throw M68kException.m6eSignal;
  8010:     }
  8011:     XEiJ.regRn[15] = sp + frameSize;
  8012:     int newSR = XEiJ.busRwz (sp);  //popwz。ここでバスエラーが生じる可能性がある
  8013:     int newPC = XEiJ.busRls (sp + 2);  //popls
  8014:     //irpSetSRでモードが切り替わる場合があるのでその前にr[15]を更新しておくこと
  8015:     irpSetSR (newSR);  //ここでユーザモードに戻る場合がある。特権違反チェックが先
  8016:     irpSetPC (newPC);  //分岐ログが新しいsrを使う。順序に注意
  8017:   }  //irpRte
  8018: 
  8019:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8020:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8021:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8022:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8023:   //RTD #<data>                                     |-|-12346|-|-----|-----|          |0100_111_001_110_100-{data}
  8024:   public static void irpRtd () throws M68kException {
  8025:     XEiJ.mpuCycleCount += 20;
  8026:     int sp = XEiJ.regRn[15];
  8027:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  8028:       XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
  8029:     } else {
  8030:       int t = XEiJ.regPC;
  8031:       XEiJ.regPC = t + 2;
  8032:       XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse (t);  //pcws
  8033:     }
  8034:     irpSetPC (XEiJ.busRls (sp));  //popls
  8035:   }  //irpRtd
  8036: 
  8037:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8038:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8039:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8040:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8041:   //RTS                                             |-|012346|-|-----|-----|          |0100_111_001_110_101
  8042:   public static void irpRts () throws M68kException {
  8043:     XEiJ.mpuCycleCount += 16;
  8044:     int sp = XEiJ.regRn[15];
  8045:     XEiJ.regRn[15] = sp + 4;
  8046:     irpSetPC (XEiJ.busRls (sp));  //popls
  8047:   }  //irpRts
  8048: 
  8049:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8050:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8051:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8052:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8053:   //TRAPV                                           |-|012346|-|---*-|-----|          |0100_111_001_110_110
  8054:   public static void irpTrapv () throws M68kException {
  8055:     if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 >= 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) == 0) {  //通過
  8056:       XEiJ.mpuCycleCount += 4;
  8057:     } else {
  8058:       XEiJ.mpuCycleCount += 34;
  8059:       M68kException.m6eNumber = M68kException.M6E_TRAPV_INSTRUCTION;
  8060:       throw M68kException.m6eSignal;
  8061:     }
  8062:   }  //irpTrapv
  8063: 
  8064:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8065:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8066:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8067:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8068:   //RTR                                             |-|012346|-|UUUUU|*****|          |0100_111_001_110_111
  8069:   public static void irpRtr () throws M68kException {
  8070:     XEiJ.mpuCycleCount += 20;
  8071:     int sp = XEiJ.regRn[15];
  8072:     XEiJ.regRn[15] = sp + 6;
  8073:     XEiJ.regCCR = XEiJ.REG_CCR_MASK & XEiJ.busRwz (sp);  //popwz
  8074:     irpSetPC (XEiJ.busRlse (sp + 2));  //popls。ccrを読めたのだからspは奇数ではない
  8075:   }  //irpRtr
  8076: 
  8077:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8078:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8079:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8080:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8081:   //MOVEC.L Rc,Rn                                   |-|-12346|P|-----|-----|          |0100_111_001_111_010-rnnncccccccccccc
  8082:   public static void irpMovecFromControl () throws M68kException {
  8083:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  8084:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  8085:       throw M68kException.m6eSignal;
  8086:     }
  8087:     //以下はスーパーバイザモード
  8088:     XEiJ.mpuCycleCount += 10;
  8089:     int w;
  8090:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  8091:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  8092:     } else {
  8093:       w = XEiJ.regPC;
  8094:       XEiJ.regPC = w + 2;
  8095:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  8096:     }
  8097:     switch (w & 0x0fff) {
  8098:     case 0x000:  //SFC
  8099:       XEiJ.regRn[w >> 12] = XEiJ.mpuSFC;
  8100:       break;
  8101:     case 0x001:  //DFC
  8102:       XEiJ.regRn[w >> 12] = XEiJ.mpuDFC;
  8103:       break;
  8104:     case 0x801:  //VBR
  8105:       XEiJ.regRn[w >> 12] = XEiJ.mpuVBR;
  8106:       break;
  8107:     default:
  8108:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  8109:       throw M68kException.m6eSignal;
  8110:     }
  8111:   }  //irpMovecFromControl
  8112: 
  8113:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8114:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8115:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8116:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8117:   //MOVEC.L Rn,Rc                                   |-|-12346|P|-----|-----|          |0100_111_001_111_011-rnnncccccccccccc
  8118:   public static void irpMovecToControl () throws M68kException {
  8119:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
  8120:       M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION;
  8121:       throw M68kException.m6eSignal;
  8122:     }
  8123:     //以下はスーパーバイザモード
  8124:     XEiJ.mpuCycleCount += 12;
  8125:     int w;
  8126:     if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
  8127:       w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
  8128:     } else {
  8129:       w = XEiJ.regPC;
  8130:       XEiJ.regPC = w + 2;
  8131:       w = XEiJ.busRwze (w);  //pcwz。拡張ワード
  8132:     }
  8133:     int d = XEiJ.regRn[w >> 12];
  8134:     switch (w & 0x0fff) {
  8135:     case 0x000:  //SFC
  8136:       XEiJ.mpuSFC = d & 0x00000007;
  8137:       break;
  8138:     case 0x001:  //DFC
  8139:       XEiJ.mpuDFC = d & 0x00000007;
  8140:       break;
  8141:     case 0x801:  //VBR
  8142:       XEiJ.mpuVBR = d & -4;  //4の倍数でないと困る
  8143:       break;
  8144:     default:
  8145:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
  8146:       throw M68kException.m6eSignal;
  8147:     }
  8148:   }  //irpMovecToControl
  8149: 
  8150:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8151:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8152:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8153:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8154:   //JSR <ea>                                        |-|012346|-|-----|-----|  M  WXZP |0100_111_010_mmm_rrr
  8155:   //JBSR.L <label>                                  |A|012346|-|-----|-----|          |0100_111_010_111_001-{address}       [JSR <label>]
  8156:   public static void irpJsr () throws M68kException {
  8157:     XEiJ.mpuCycleCount += 16 - 8;
  8158:     int a = efaJmpJsr (XEiJ.regOC & 63);  //プッシュする前に実効アドレスを計算する
  8159:     XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC);  //pushl
  8160:     irpSetPC (a);
  8161:   }  //irpJsr
  8162: 
  8163:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8164:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8165:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8166:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8167:   //JMP <ea>                                        |-|012346|-|-----|-----|  M  WXZP |0100_111_011_mmm_rrr
  8168:   //JBRA.L <label>                                  |A|012346|-|-----|-----|          |0100_111_011_111_001-{address}       [JMP <label>]
  8169:   public static void irpJmp () throws M68kException {
  8170:     //XEiJ.mpuCycleCount += 8 - 8;
  8171:     irpSetPC (efaJmpJsr (XEiJ.regOC & 63));
  8172:   }  //irpJmp
  8173: 
  8174:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8175:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8176:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8177:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8178:   //ADDQ.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_000_mmm_rrr
  8179:   //INC.B <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>]
  8180:   public static void irpAddqByte () throws M68kException {
  8181:     int ea = XEiJ.regOC & 63;
  8182:     int x;
  8183:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8184:     int z;
  8185:     if (ea < XEiJ.EA_AR) {  //ADDQ.B #<data>,Dr
  8186:       XEiJ.mpuCycleCount += 4;
  8187:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y);
  8188:     } else {  //ADDQ.B #<data>,<mem>
  8189:       XEiJ.mpuCycleCount += 8;
  8190:       int a = efaMltByte (ea);
  8191:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y));
  8192:     }
  8193:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8194:            (~x & z) >>> 31 << 1 |
  8195:            (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addq
  8196:   }  //irpAddqByte
  8197: 
  8198:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8199:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8200:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8201:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8202:   //ADDQ.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_001_mmm_rrr
  8203:   //ADDQ.W #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_001_001_rrr
  8204:   //INC.W <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>]
  8205:   //INC.W Ar                                        |A|012346|-|-----|-----| A        |0101_001_001_001_rrr [ADDQ.W #1,Ar]
  8206:   //
  8207:   //ADDQ.W #<data>,Ar
  8208:   //  ソースを符号拡張してロングで加算する
  8209:   public static void irpAddqWord () throws M68kException {
  8210:     int ea = XEiJ.regOC & 63;
  8211:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8212:     if (ea >> 3 == XEiJ.MMM_AR) {  //ADDQ.W #<data>,Ar
  8213:       XEiJ.mpuCycleCount += 8;  //MC68000 User's Manualに4と書いてあるのは8の間違い
  8214:       XEiJ.regRn[ea] += y;  //ロングで計算する。このr[ea]はアドレスレジスタ
  8215:       //ccrは操作しない
  8216:     } else {
  8217:       int x;
  8218:       int z;
  8219:       if (ea < XEiJ.EA_AR) {  //ADDQ.W #<data>,Dr
  8220:         XEiJ.mpuCycleCount += 4;
  8221:         z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y));
  8222:       } else {  //ADDQ.W #<data>,<mem>
  8223:         XEiJ.mpuCycleCount += 8;
  8224:         int a = efaMltWord (ea);
  8225:         XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y));
  8226:       }
  8227:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8228:              (~x & z) >>> 31 << 1 |
  8229:              (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addq
  8230:     }
  8231:   }  //irpAddqWord
  8232: 
  8233:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8234:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8235:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8236:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8237:   //ADDQ.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_010_mmm_rrr
  8238:   //ADDQ.L #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_010_001_rrr
  8239:   //INC.L <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>]
  8240:   //INC.L Ar                                        |A|012346|-|-----|-----| A        |0101_001_010_001_rrr [ADDQ.L #1,Ar]
  8241:   public static void irpAddqLong () throws M68kException {
  8242:     int ea = XEiJ.regOC & 63;
  8243:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8244:     if (ea >> 3 == XEiJ.MMM_AR) {  //ADDQ.L #<data>,Ar
  8245:       XEiJ.mpuCycleCount += 8;
  8246:       XEiJ.regRn[ea] += y;  //このr[ea]はアドレスレジスタ
  8247:       //ccrは操作しない
  8248:     } else {
  8249:       int x;
  8250:       int z;
  8251:       if (ea < XEiJ.EA_AR) {  //ADDQ.L #<data>,Dr
  8252:         XEiJ.mpuCycleCount += 8;
  8253:         XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y;
  8254:       } else {  //ADDQ.L #<data>,<mem>
  8255:         XEiJ.mpuCycleCount += 12;
  8256:         int a = efaMltLong (ea);
  8257:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y);
  8258:       }
  8259:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8260:              (~x & z) >>> 31 << 1 |
  8261:              (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addq
  8262:     }
  8263:   }  //irpAddqLong
  8264: 
  8265:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8266:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8267:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8268:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8269:   //ST.B <ea>                                       |-|012346|-|-----|-----|D M+-WXZ  |0101_000_011_mmm_rrr
  8270:   //SNF.B <ea>                                      |A|012346|-|-----|-----|D M+-WXZ  |0101_000_011_mmm_rrr [ST.B <ea>]
  8271:   //DBT.W Dr,<label>                                |-|012346|-|-----|-----|          |0101_000_011_001_rrr-{offset}
  8272:   //DBNF.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_011_001_rrr-{offset}        [DBT.W Dr,<label>]
  8273:   public static void irpSt () throws M68kException {
  8274:     int ea = XEiJ.regOC & 63;
  8275:     //DBT.W Dr,<label>よりもST.B Drを優先する
  8276:     if (ea < XEiJ.EA_AR) {  //ST.B Dr
  8277:       XEiJ.mpuCycleCount += 6;
  8278:       XEiJ.regRn[ea] |= 0xff;
  8279:     } else if (ea < XEiJ.EA_MM) {  //DBT.W Dr,<label>
  8280:       //条件が成立しているので通過
  8281:       XEiJ.mpuCycleCount += 12;
  8282:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8283:         //リードを省略する
  8284:       } else {
  8285:         XEiJ.busRws (XEiJ.regPC);
  8286:       }
  8287:       XEiJ.regPC += 2;
  8288:     } else {  //ST.B <mem>
  8289:       XEiJ.mpuCycleCount += 8;
  8290:       XEiJ.busWb (efaMltByte (ea), 0xff);
  8291:     }
  8292:   }  //irpSt
  8293: 
  8294:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8295:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8296:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8297:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8298:   //SUBQ.B #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_100_mmm_rrr
  8299:   //DEC.B <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>]
  8300:   public static void irpSubqByte () throws M68kException {
  8301:     int ea = XEiJ.regOC & 63;
  8302:     int x;
  8303:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8304:     int z;
  8305:     if (ea < XEiJ.EA_AR) {  //SUBQ.B #<data>,Dr
  8306:       XEiJ.mpuCycleCount += 4;
  8307:       z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y);
  8308:     } else {  //SUBQ.B #<data>,<mem>
  8309:       XEiJ.mpuCycleCount += 8;
  8310:       int a = efaMltByte (ea);
  8311:       XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y));
  8312:     }
  8313:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8314:            (x & ~z) >>> 31 << 1 |
  8315:            (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subq
  8316:   }  //irpSubqByte
  8317: 
  8318:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8319:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8320:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8321:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8322:   //SUBQ.W #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_101_mmm_rrr
  8323:   //SUBQ.W #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_101_001_rrr
  8324:   //DEC.W <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>]
  8325:   //DEC.W Ar                                        |A|012346|-|-----|-----| A        |0101_001_101_001_rrr [SUBQ.W #1,Ar]
  8326:   //
  8327:   //SUBQ.W #<data>,Ar
  8328:   //  ソースを符号拡張してロングで減算する
  8329:   public static void irpSubqWord () throws M68kException {
  8330:     int ea = XEiJ.regOC & 63;
  8331:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8332:     if (ea >> 3 == XEiJ.MMM_AR) {  //SUBQ.W #<data>,Ar
  8333:       XEiJ.mpuCycleCount += 8;
  8334:       XEiJ.regRn[ea] -= y;  //ロングで計算する。このr[ea]はアドレスレジスタ
  8335:       //ccrは操作しない
  8336:     } else {
  8337:       int x;
  8338:       int z;
  8339:       if (ea < XEiJ.EA_AR) {  //SUBQ.W #<data>,Dr
  8340:         XEiJ.mpuCycleCount += 4;
  8341:         z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y));
  8342:       } else {  //SUBQ.W #<data>,<mem>
  8343:         XEiJ.mpuCycleCount += 8;
  8344:         int a = efaMltWord (ea);
  8345:         XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y));
  8346:       }
  8347:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8348:              (x & ~z) >>> 31 << 1 |
  8349:              (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subq
  8350:     }
  8351:   }  //irpSubqWord
  8352: 
  8353:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8354:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8355:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8356:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8357:   //SUBQ.L #<data>,<ea>                             |-|012346|-|UUUUU|*****|D M+-WXZ  |0101_qqq_110_mmm_rrr
  8358:   //SUBQ.L #<data>,Ar                               |-|012346|-|-----|-----| A        |0101_qqq_110_001_rrr
  8359:   //DEC.L <ea>                                      |A|012346|-|UUUUU|*****|D M+-WXZ  |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>]
  8360:   //DEC.L Ar                                        |A|012346|-|-----|-----| A        |0101_001_110_001_rrr [SUBQ.L #1,Ar]
  8361:   public static void irpSubqLong () throws M68kException {
  8362:     int ea = XEiJ.regOC & 63;
  8363:     int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1;  //qqq==0?8:qqq
  8364:     if (ea >> 3 == XEiJ.MMM_AR) {  //SUBQ.L #<data>,Ar
  8365:       XEiJ.mpuCycleCount += 8;
  8366:       XEiJ.regRn[ea] -= y;  //このr[ea]はアドレスレジスタ
  8367:       //ccrは操作しない
  8368:     } else {
  8369:       int x;
  8370:       int z;
  8371:       if (ea < XEiJ.EA_AR) {  //SUBQ.L #<data>,Dr
  8372:         XEiJ.mpuCycleCount += 8;
  8373:         XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y;
  8374:       } else {  //SUBQ.L #<data>,<mem>
  8375:         XEiJ.mpuCycleCount += 12;
  8376:         int a = efaMltLong (ea);
  8377:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y);
  8378:       }
  8379:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
  8380:              (x & ~z) >>> 31 << 1 |
  8381:              (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subq
  8382:     }
  8383:   }  //irpSubqLong
  8384: 
  8385:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8386:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8387:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8388:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8389:   //SF.B <ea>                                       |-|012346|-|-----|-----|D M+-WXZ  |0101_000_111_mmm_rrr
  8390:   //SNT.B <ea>                                      |A|012346|-|-----|-----|D M+-WXZ  |0101_000_111_mmm_rrr [SF.B <ea>]
  8391:   //DBF.W Dr,<label>                                |-|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}
  8392:   //DBNT.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}        [DBF.W Dr,<label>]
  8393:   //DBRA.W Dr,<label>                               |A|012346|-|-----|-----|          |0101_000_111_001_rrr-{offset}        [DBF.W Dr,<label>]
  8394:   public static void irpSf () throws M68kException {
  8395:     int ea = XEiJ.regOC & 63;
  8396:     //DBRA.W Dr,<label>よりもSF.B Drを優先する
  8397:     if (ea < XEiJ.EA_AR) {  //SF.B Dr
  8398:       XEiJ.mpuCycleCount += 4;
  8399:       XEiJ.regRn[ea] &= ~0xff;
  8400:     } else if (ea < XEiJ.EA_MM) {  //DBRA.W Dr,<label>
  8401:       //条件が成立していないのでデクリメント
  8402:       int rrr = XEiJ.regOC & 7;
  8403:       int t = XEiJ.regRn[rrr];
  8404:       if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8405:         XEiJ.mpuCycleCount += 14;
  8406:         XEiJ.regRn[rrr] = t + 65535;
  8407:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8408:           //リードを省略する
  8409:         } else {
  8410:           XEiJ.busRws (XEiJ.regPC);
  8411:         }
  8412:         XEiJ.regPC += 2;
  8413:       } else {  //Drの下位16bitが0でないのでジャンプ
  8414:         XEiJ.mpuCycleCount += 10;
  8415:         XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8416:         irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8417:       }
  8418:     } else {  //SF.B <mem>
  8419:       XEiJ.mpuCycleCount += 8;
  8420:       XEiJ.busWb (efaMltByte (ea), 0x00);
  8421:     }
  8422:   }  //irpSf
  8423: 
  8424:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8425:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8426:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8427:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8428:   //SHI.B <ea>                                      |-|012346|-|--*-*|-----|D M+-WXZ  |0101_001_011_mmm_rrr
  8429:   //SNLS.B <ea>                                     |A|012346|-|--*-*|-----|D M+-WXZ  |0101_001_011_mmm_rrr [SHI.B <ea>]
  8430:   //DBHI.W Dr,<label>                               |-|012346|-|--*-*|-----|          |0101_001_011_001_rrr-{offset}
  8431:   //DBNLS.W Dr,<label>                              |A|012346|-|--*-*|-----|          |0101_001_011_001_rrr-{offset}        [DBHI.W Dr,<label>]
  8432:   public static void irpShi () throws M68kException {
  8433:     int ea = XEiJ.regOC & 63;
  8434:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBHI.W Dr,<label>
  8435:       if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {
  8436:         //条件が成立しているので通過
  8437:         XEiJ.mpuCycleCount += 12;
  8438:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8439:           //リードを省略する
  8440:         } else {
  8441:           XEiJ.busRws (XEiJ.regPC);
  8442:         }
  8443:         XEiJ.regPC += 2;
  8444:       } else {
  8445:         //条件が成立していないのでデクリメント
  8446:         int rrr = XEiJ.regOC & 7;
  8447:         int t = XEiJ.regRn[rrr];
  8448:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8449:           XEiJ.mpuCycleCount += 14;
  8450:           XEiJ.regRn[rrr] = t + 65535;
  8451:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8452:             //リードを省略する
  8453:           } else {
  8454:             XEiJ.busRws (XEiJ.regPC);
  8455:           }
  8456:           XEiJ.regPC += 2;
  8457:         } else {  //Drの下位16bitが0でないのでジャンプ
  8458:           XEiJ.mpuCycleCount += 10;
  8459:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8460:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8461:         }
  8462:       }
  8463:     } else if (ea < XEiJ.EA_AR) {  //SHI.B Dr
  8464:       if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {  //セット
  8465:         XEiJ.mpuCycleCount += 6;
  8466:         XEiJ.regRn[ea] |= 0xff;
  8467:       } else {  //クリア
  8468:         XEiJ.mpuCycleCount += 4;
  8469:         XEiJ.regRn[ea] &= ~0xff;
  8470:       }
  8471:     } else {  //SHI.B <mem>
  8472:       XEiJ.mpuCycleCount += 8;
  8473:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HI << XEiJ.regCCR >> 31);
  8474:     }
  8475:   }  //irpShi
  8476: 
  8477:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8478:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8479:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8480:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8481:   //SLS.B <ea>                                      |-|012346|-|--*-*|-----|D M+-WXZ  |0101_001_111_mmm_rrr
  8482:   //SNHI.B <ea>                                     |A|012346|-|--*-*|-----|D M+-WXZ  |0101_001_111_mmm_rrr [SLS.B <ea>]
  8483:   //DBLS.W Dr,<label>                               |-|012346|-|--*-*|-----|          |0101_001_111_001_rrr-{offset}
  8484:   //DBNHI.W Dr,<label>                              |A|012346|-|--*-*|-----|          |0101_001_111_001_rrr-{offset}        [DBLS.W Dr,<label>]
  8485:   public static void irpSls () throws M68kException {
  8486:     int ea = XEiJ.regOC & 63;
  8487:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLS.W Dr,<label>
  8488:       if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {
  8489:         //条件が成立しているので通過
  8490:         XEiJ.mpuCycleCount += 12;
  8491:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8492:           //リードを省略する
  8493:         } else {
  8494:           XEiJ.busRws (XEiJ.regPC);
  8495:         }
  8496:         XEiJ.regPC += 2;
  8497:       } else {
  8498:         //条件が成立していないのでデクリメント
  8499:         int rrr = XEiJ.regOC & 7;
  8500:         int t = XEiJ.regRn[rrr];
  8501:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8502:           XEiJ.mpuCycleCount += 14;
  8503:           XEiJ.regRn[rrr] = t + 65535;
  8504:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8505:             //リードを省略する
  8506:           } else {
  8507:             XEiJ.busRws (XEiJ.regPC);
  8508:           }
  8509:           XEiJ.regPC += 2;
  8510:         } else {  //Drの下位16bitが0でないのでジャンプ
  8511:           XEiJ.mpuCycleCount += 10;
  8512:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8513:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8514:         }
  8515:       }
  8516:     } else if (ea < XEiJ.EA_AR) {  //SLS.B Dr
  8517:       if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {  //セット
  8518:         XEiJ.mpuCycleCount += 6;
  8519:         XEiJ.regRn[ea] |= 0xff;
  8520:       } else {  //クリア
  8521:         XEiJ.mpuCycleCount += 4;
  8522:         XEiJ.regRn[ea] &= ~0xff;
  8523:       }
  8524:     } else {  //SLS.B <mem>
  8525:       XEiJ.mpuCycleCount += 8;
  8526:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LS << XEiJ.regCCR >> 31);
  8527:     }
  8528:   }  //irpSls
  8529: 
  8530:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8531:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8532:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8533:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8534:   //SCC.B <ea>                                      |-|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr
  8535:   //SHS.B <ea>                                      |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  8536:   //SNCS.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  8537:   //SNLO.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_011_mmm_rrr [SCC.B <ea>]
  8538:   //DBCC.W Dr,<label>                               |-|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}
  8539:   //DBHS.W Dr,<label>                               |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  8540:   //DBNCS.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  8541:   //DBNLO.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_011_001_rrr-{offset}        [DBCC.W Dr,<label>]
  8542:   public static void irpShs () throws M68kException {
  8543:     int ea = XEiJ.regOC & 63;
  8544:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBHS.W Dr,<label>
  8545:       if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {
  8546:         //条件が成立しているので通過
  8547:         XEiJ.mpuCycleCount += 12;
  8548:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8549:           //リードを省略する
  8550:         } else {
  8551:           XEiJ.busRws (XEiJ.regPC);
  8552:         }
  8553:         XEiJ.regPC += 2;
  8554:       } else {
  8555:         //条件が成立していないのでデクリメント
  8556:         int rrr = XEiJ.regOC & 7;
  8557:         int t = XEiJ.regRn[rrr];
  8558:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8559:           XEiJ.mpuCycleCount += 14;
  8560:           XEiJ.regRn[rrr] = t + 65535;
  8561:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8562:             //リードを省略する
  8563:           } else {
  8564:             XEiJ.busRws (XEiJ.regPC);
  8565:           }
  8566:           XEiJ.regPC += 2;
  8567:         } else {  //Drの下位16bitが0でないのでジャンプ
  8568:           XEiJ.mpuCycleCount += 10;
  8569:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8570:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8571:         }
  8572:       }
  8573:     } else if (ea < XEiJ.EA_AR) {  //SHS.B Dr
  8574:       if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {  //セット
  8575:         XEiJ.mpuCycleCount += 6;
  8576:         XEiJ.regRn[ea] |= 0xff;
  8577:       } else {  //クリア
  8578:         XEiJ.mpuCycleCount += 4;
  8579:         XEiJ.regRn[ea] &= ~0xff;
  8580:       }
  8581:     } else {  //SHS.B <mem>
  8582:       XEiJ.mpuCycleCount += 8;
  8583:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HS << XEiJ.regCCR >> 31);
  8584:     }
  8585:   }  //irpShs
  8586: 
  8587:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8588:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8589:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8590:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8591:   //SCS.B <ea>                                      |-|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr
  8592:   //SLO.B <ea>                                      |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  8593:   //SNCC.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  8594:   //SNHS.B <ea>                                     |A|012346|-|----*|-----|D M+-WXZ  |0101_010_111_mmm_rrr [SCS.B <ea>]
  8595:   //DBCS.W Dr,<label>                               |-|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}
  8596:   //DBLO.W Dr,<label>                               |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  8597:   //DBNCC.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  8598:   //DBNHS.W Dr,<label>                              |A|012346|-|----*|-----|          |0101_010_111_001_rrr-{offset}        [DBCS.W Dr,<label>]
  8599:   public static void irpSlo () throws M68kException {
  8600:     int ea = XEiJ.regOC & 63;
  8601:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLO.W Dr,<label>
  8602:       if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {
  8603:         //条件が成立しているので通過
  8604:         XEiJ.mpuCycleCount += 12;
  8605:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8606:           //リードを省略する
  8607:         } else {
  8608:           XEiJ.busRws (XEiJ.regPC);
  8609:         }
  8610:         XEiJ.regPC += 2;
  8611:       } else {
  8612:         //条件が成立していないのでデクリメント
  8613:         int rrr = XEiJ.regOC & 7;
  8614:         int t = XEiJ.regRn[rrr];
  8615:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8616:           XEiJ.mpuCycleCount += 14;
  8617:           XEiJ.regRn[rrr] = t + 65535;
  8618:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8619:             //リードを省略する
  8620:           } else {
  8621:             XEiJ.busRws (XEiJ.regPC);
  8622:           }
  8623:           XEiJ.regPC += 2;
  8624:         } else {  //Drの下位16bitが0でないのでジャンプ
  8625:           XEiJ.mpuCycleCount += 10;
  8626:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8627:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8628:         }
  8629:       }
  8630:     } else if (ea < XEiJ.EA_AR) {  //SLO.B Dr
  8631:       if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {  //セット
  8632:         XEiJ.mpuCycleCount += 6;
  8633:         XEiJ.regRn[ea] |= 0xff;
  8634:       } else {  //クリア
  8635:         XEiJ.mpuCycleCount += 4;
  8636:         XEiJ.regRn[ea] &= ~0xff;
  8637:       }
  8638:     } else {  //SLO.B <mem>
  8639:       XEiJ.mpuCycleCount += 8;
  8640:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LO << XEiJ.regCCR >> 31);
  8641:     }
  8642:   }  //irpSlo
  8643: 
  8644:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8645:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8646:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8647:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8648:   //SNE.B <ea>                                      |-|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr
  8649:   //SNEQ.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  8650:   //SNZ.B <ea>                                      |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  8651:   //SNZE.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_011_mmm_rrr [SNE.B <ea>]
  8652:   //DBNE.W Dr,<label>                               |-|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}
  8653:   //DBNEQ.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  8654:   //DBNZ.W Dr,<label>                               |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  8655:   //DBNZE.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_011_001_rrr-{offset}        [DBNE.W Dr,<label>]
  8656:   public static void irpSne () throws M68kException {
  8657:     int ea = XEiJ.regOC & 63;
  8658:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBNE.W Dr,<label>
  8659:       if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {
  8660:         //条件が成立しているので通過
  8661:         XEiJ.mpuCycleCount += 12;
  8662:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8663:           //リードを省略する
  8664:         } else {
  8665:           XEiJ.busRws (XEiJ.regPC);
  8666:         }
  8667:         XEiJ.regPC += 2;
  8668:       } else {
  8669:         //条件が成立していないのでデクリメント
  8670:         int rrr = XEiJ.regOC & 7;
  8671:         int t = XEiJ.regRn[rrr];
  8672:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8673:           XEiJ.mpuCycleCount += 14;
  8674:           XEiJ.regRn[rrr] = t + 65535;
  8675:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8676:             //リードを省略する
  8677:           } else {
  8678:             XEiJ.busRws (XEiJ.regPC);
  8679:           }
  8680:           XEiJ.regPC += 2;
  8681:         } else {  //Drの下位16bitが0でないのでジャンプ
  8682:           XEiJ.mpuCycleCount += 10;
  8683:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8684:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8685:         }
  8686:       }
  8687:     } else if (ea < XEiJ.EA_AR) {  //SNE.B Dr
  8688:       if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {  //セット
  8689:         XEiJ.mpuCycleCount += 6;
  8690:         XEiJ.regRn[ea] |= 0xff;
  8691:       } else {  //クリア
  8692:         XEiJ.mpuCycleCount += 4;
  8693:         XEiJ.regRn[ea] &= ~0xff;
  8694:       }
  8695:     } else {  //SNE.B <mem>
  8696:       XEiJ.mpuCycleCount += 8;
  8697:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_NE << XEiJ.regCCR >> 31);
  8698:     }
  8699:   }  //irpSne
  8700: 
  8701:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8702:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8703:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8704:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8705:   //SEQ.B <ea>                                      |-|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr
  8706:   //SNNE.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  8707:   //SNNZ.B <ea>                                     |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  8708:   //SZE.B <ea>                                      |A|012346|-|--*--|-----|D M+-WXZ  |0101_011_111_mmm_rrr [SEQ.B <ea>]
  8709:   //DBEQ.W Dr,<label>                               |-|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}
  8710:   //DBNNE.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  8711:   //DBNNZ.W Dr,<label>                              |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  8712:   //DBZE.W Dr,<label>                               |A|012346|-|--*--|-----|          |0101_011_111_001_rrr-{offset}        [DBEQ.W Dr,<label>]
  8713:   public static void irpSeq () throws M68kException {
  8714:     int ea = XEiJ.regOC & 63;
  8715:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBEQ.W Dr,<label>
  8716:       if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {
  8717:         //条件が成立しているので通過
  8718:         XEiJ.mpuCycleCount += 12;
  8719:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8720:           //リードを省略する
  8721:         } else {
  8722:           XEiJ.busRws (XEiJ.regPC);
  8723:         }
  8724:         XEiJ.regPC += 2;
  8725:       } else {
  8726:         //条件が成立していないのでデクリメント
  8727:         int rrr = XEiJ.regOC & 7;
  8728:         int t = XEiJ.regRn[rrr];
  8729:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8730:           XEiJ.mpuCycleCount += 14;
  8731:           XEiJ.regRn[rrr] = t + 65535;
  8732:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8733:             //リードを省略する
  8734:           } else {
  8735:             XEiJ.busRws (XEiJ.regPC);
  8736:           }
  8737:           XEiJ.regPC += 2;
  8738:         } else {  //Drの下位16bitが0でないのでジャンプ
  8739:           XEiJ.mpuCycleCount += 10;
  8740:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8741:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8742:         }
  8743:       }
  8744:     } else if (ea < XEiJ.EA_AR) {  //SEQ.B Dr
  8745:       if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {  //セット
  8746:         XEiJ.mpuCycleCount += 6;
  8747:         XEiJ.regRn[ea] |= 0xff;
  8748:       } else {  //クリア
  8749:         XEiJ.mpuCycleCount += 4;
  8750:         XEiJ.regRn[ea] &= ~0xff;
  8751:       }
  8752:     } else {  //SEQ.B <mem>
  8753:       XEiJ.mpuCycleCount += 8;
  8754:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_EQ << XEiJ.regCCR >> 31);
  8755:     }
  8756:   }  //irpSeq
  8757: 
  8758:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8759:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8760:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8761:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8762:   //SVC.B <ea>                                      |-|012346|-|---*-|-----|D M+-WXZ  |0101_100_011_mmm_rrr
  8763:   //SNVS.B <ea>                                     |A|012346|-|---*-|-----|D M+-WXZ  |0101_100_011_mmm_rrr [SVC.B <ea>]
  8764:   //DBVC.W Dr,<label>                               |-|012346|-|---*-|-----|          |0101_100_011_001_rrr-{offset}
  8765:   //DBNVS.W Dr,<label>                              |A|012346|-|---*-|-----|          |0101_100_011_001_rrr-{offset}        [DBVC.W Dr,<label>]
  8766:   public static void irpSvc () throws M68kException {
  8767:     int ea = XEiJ.regOC & 63;
  8768:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBVC.W Dr,<label>
  8769:       if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {
  8770:         //条件が成立しているので通過
  8771:         XEiJ.mpuCycleCount += 12;
  8772:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8773:           //リードを省略する
  8774:         } else {
  8775:           XEiJ.busRws (XEiJ.regPC);
  8776:         }
  8777:         XEiJ.regPC += 2;
  8778:       } else {
  8779:         //条件が成立していないのでデクリメント
  8780:         int rrr = XEiJ.regOC & 7;
  8781:         int t = XEiJ.regRn[rrr];
  8782:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8783:           XEiJ.mpuCycleCount += 14;
  8784:           XEiJ.regRn[rrr] = t + 65535;
  8785:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8786:             //リードを省略する
  8787:           } else {
  8788:             XEiJ.busRws (XEiJ.regPC);
  8789:           }
  8790:           XEiJ.regPC += 2;
  8791:         } else {  //Drの下位16bitが0でないのでジャンプ
  8792:           XEiJ.mpuCycleCount += 10;
  8793:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8794:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8795:         }
  8796:       }
  8797:     } else if (ea < XEiJ.EA_AR) {  //SVC.B Dr
  8798:       if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {  //セット
  8799:         XEiJ.mpuCycleCount += 6;
  8800:         XEiJ.regRn[ea] |= 0xff;
  8801:       } else {  //クリア
  8802:         XEiJ.mpuCycleCount += 4;
  8803:         XEiJ.regRn[ea] &= ~0xff;
  8804:       }
  8805:     } else {  //SVC.B <mem>
  8806:       XEiJ.mpuCycleCount += 8;
  8807:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VC << XEiJ.regCCR >> 31);
  8808:     }
  8809:   }  //irpSvc
  8810: 
  8811:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8812:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8813:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8814:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8815:   //SVS.B <ea>                                      |-|012346|-|---*-|-----|D M+-WXZ  |0101_100_111_mmm_rrr
  8816:   //SNVC.B <ea>                                     |A|012346|-|---*-|-----|D M+-WXZ  |0101_100_111_mmm_rrr [SVS.B <ea>]
  8817:   //DBVS.W Dr,<label>                               |-|012346|-|---*-|-----|          |0101_100_111_001_rrr-{offset}
  8818:   //DBNVC.W Dr,<label>                              |A|012346|-|---*-|-----|          |0101_100_111_001_rrr-{offset}        [DBVS.W Dr,<label>]
  8819:   public static void irpSvs () throws M68kException {
  8820:     int ea = XEiJ.regOC & 63;
  8821:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBVS.W Dr,<label>
  8822:       if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {
  8823:         //条件が成立しているので通過
  8824:         XEiJ.mpuCycleCount += 12;
  8825:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8826:           //リードを省略する
  8827:         } else {
  8828:           XEiJ.busRws (XEiJ.regPC);
  8829:         }
  8830:         XEiJ.regPC += 2;
  8831:       } else {
  8832:         //条件が成立していないのでデクリメント
  8833:         int rrr = XEiJ.regOC & 7;
  8834:         int t = XEiJ.regRn[rrr];
  8835:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8836:           XEiJ.mpuCycleCount += 14;
  8837:           XEiJ.regRn[rrr] = t + 65535;
  8838:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8839:             //リードを省略する
  8840:           } else {
  8841:             XEiJ.busRws (XEiJ.regPC);
  8842:           }
  8843:           XEiJ.regPC += 2;
  8844:         } else {  //Drの下位16bitが0でないのでジャンプ
  8845:           XEiJ.mpuCycleCount += 10;
  8846:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8847:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8848:         }
  8849:       }
  8850:     } else if (ea < XEiJ.EA_AR) {  //SVS.B Dr
  8851:       if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {  //セット
  8852:         XEiJ.mpuCycleCount += 6;
  8853:         XEiJ.regRn[ea] |= 0xff;
  8854:       } else {  //クリア
  8855:         XEiJ.mpuCycleCount += 4;
  8856:         XEiJ.regRn[ea] &= ~0xff;
  8857:       }
  8858:     } else {  //SVS.B <mem>
  8859:       XEiJ.mpuCycleCount += 8;
  8860:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VS << XEiJ.regCCR >> 31);
  8861:     }
  8862:   }  //irpSvs
  8863: 
  8864:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8865:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8866:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8867:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8868:   //SPL.B <ea>                                      |-|012346|-|-*---|-----|D M+-WXZ  |0101_101_011_mmm_rrr
  8869:   //SNMI.B <ea>                                     |A|012346|-|-*---|-----|D M+-WXZ  |0101_101_011_mmm_rrr [SPL.B <ea>]
  8870:   //DBPL.W Dr,<label>                               |-|012346|-|-*---|-----|          |0101_101_011_001_rrr-{offset}
  8871:   //DBNMI.W Dr,<label>                              |A|012346|-|-*---|-----|          |0101_101_011_001_rrr-{offset}        [DBPL.W Dr,<label>]
  8872:   public static void irpSpl () throws M68kException {
  8873:     int ea = XEiJ.regOC & 63;
  8874:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBPL.W Dr,<label>
  8875:       if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {
  8876:         //条件が成立しているので通過
  8877:         XEiJ.mpuCycleCount += 12;
  8878:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8879:           //リードを省略する
  8880:         } else {
  8881:           XEiJ.busRws (XEiJ.regPC);
  8882:         }
  8883:         XEiJ.regPC += 2;
  8884:       } else {
  8885:         //条件が成立していないのでデクリメント
  8886:         int rrr = XEiJ.regOC & 7;
  8887:         int t = XEiJ.regRn[rrr];
  8888:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8889:           XEiJ.mpuCycleCount += 14;
  8890:           XEiJ.regRn[rrr] = t + 65535;
  8891:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8892:             //リードを省略する
  8893:           } else {
  8894:             XEiJ.busRws (XEiJ.regPC);
  8895:           }
  8896:           XEiJ.regPC += 2;
  8897:         } else {  //Drの下位16bitが0でないのでジャンプ
  8898:           XEiJ.mpuCycleCount += 10;
  8899:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8900:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8901:         }
  8902:       }
  8903:     } else if (ea < XEiJ.EA_AR) {  //SPL.B Dr
  8904:       if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {  //セット
  8905:         XEiJ.mpuCycleCount += 6;
  8906:         XEiJ.regRn[ea] |= 0xff;
  8907:       } else {  //クリア
  8908:         XEiJ.mpuCycleCount += 4;
  8909:         XEiJ.regRn[ea] &= ~0xff;
  8910:       }
  8911:     } else {  //SPL.B <mem>
  8912:       XEiJ.mpuCycleCount += 8;
  8913:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_PL << XEiJ.regCCR >> 31);
  8914:     }
  8915:   }  //irpSpl
  8916: 
  8917:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8918:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8919:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8920:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8921:   //SMI.B <ea>                                      |-|012346|-|-*---|-----|D M+-WXZ  |0101_101_111_mmm_rrr
  8922:   //SNPL.B <ea>                                     |A|012346|-|-*---|-----|D M+-WXZ  |0101_101_111_mmm_rrr [SMI.B <ea>]
  8923:   //DBMI.W Dr,<label>                               |-|012346|-|-*---|-----|          |0101_101_111_001_rrr-{offset}
  8924:   //DBNPL.W Dr,<label>                              |A|012346|-|-*---|-----|          |0101_101_111_001_rrr-{offset}        [DBMI.W Dr,<label>]
  8925:   public static void irpSmi () throws M68kException {
  8926:     int ea = XEiJ.regOC & 63;
  8927:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBMI.W Dr,<label>
  8928:       if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {
  8929:         //条件が成立しているので通過
  8930:         XEiJ.mpuCycleCount += 12;
  8931:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8932:           //リードを省略する
  8933:         } else {
  8934:           XEiJ.busRws (XEiJ.regPC);
  8935:         }
  8936:         XEiJ.regPC += 2;
  8937:       } else {
  8938:         //条件が成立していないのでデクリメント
  8939:         int rrr = XEiJ.regOC & 7;
  8940:         int t = XEiJ.regRn[rrr];
  8941:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8942:           XEiJ.mpuCycleCount += 14;
  8943:           XEiJ.regRn[rrr] = t + 65535;
  8944:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8945:             //リードを省略する
  8946:           } else {
  8947:             XEiJ.busRws (XEiJ.regPC);
  8948:           }
  8949:           XEiJ.regPC += 2;
  8950:         } else {  //Drの下位16bitが0でないのでジャンプ
  8951:           XEiJ.mpuCycleCount += 10;
  8952:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  8953:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  8954:         }
  8955:       }
  8956:     } else if (ea < XEiJ.EA_AR) {  //SMI.B Dr
  8957:       if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {  //セット
  8958:         XEiJ.mpuCycleCount += 6;
  8959:         XEiJ.regRn[ea] |= 0xff;
  8960:       } else {  //クリア
  8961:         XEiJ.mpuCycleCount += 4;
  8962:         XEiJ.regRn[ea] &= ~0xff;
  8963:       }
  8964:     } else {  //SMI.B <mem>
  8965:       XEiJ.mpuCycleCount += 8;
  8966:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_MI << XEiJ.regCCR >> 31);
  8967:     }
  8968:   }  //irpSmi
  8969: 
  8970:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8971:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  8972:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  8973:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  8974:   //SGE.B <ea>                                      |-|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_011_mmm_rrr
  8975:   //SNLT.B <ea>                                     |A|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_011_mmm_rrr [SGE.B <ea>]
  8976:   //DBGE.W Dr,<label>                               |-|012346|-|-*-*-|-----|          |0101_110_011_001_rrr-{offset}
  8977:   //DBNLT.W Dr,<label>                              |A|012346|-|-*-*-|-----|          |0101_110_011_001_rrr-{offset}        [DBGE.W Dr,<label>]
  8978:   public static void irpSge () throws M68kException {
  8979:     int ea = XEiJ.regOC & 63;
  8980:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBGE.W Dr,<label>
  8981:       if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {
  8982:         //条件が成立しているので通過
  8983:         XEiJ.mpuCycleCount += 12;
  8984:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8985:           //リードを省略する
  8986:         } else {
  8987:           XEiJ.busRws (XEiJ.regPC);
  8988:         }
  8989:         XEiJ.regPC += 2;
  8990:       } else {
  8991:         //条件が成立していないのでデクリメント
  8992:         int rrr = XEiJ.regOC & 7;
  8993:         int t = XEiJ.regRn[rrr];
  8994:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  8995:           XEiJ.mpuCycleCount += 14;
  8996:           XEiJ.regRn[rrr] = t + 65535;
  8997:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  8998:             //リードを省略する
  8999:           } else {
  9000:             XEiJ.busRws (XEiJ.regPC);
  9001:           }
  9002:           XEiJ.regPC += 2;
  9003:         } else {  //Drの下位16bitが0でないのでジャンプ
  9004:           XEiJ.mpuCycleCount += 10;
  9005:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9006:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9007:         }
  9008:       }
  9009:     } else if (ea < XEiJ.EA_AR) {  //SGE.B Dr
  9010:       if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {  //セット
  9011:         XEiJ.mpuCycleCount += 6;
  9012:         XEiJ.regRn[ea] |= 0xff;
  9013:       } else {  //クリア
  9014:         XEiJ.mpuCycleCount += 4;
  9015:         XEiJ.regRn[ea] &= ~0xff;
  9016:       }
  9017:     } else {  //SGE.B <mem>
  9018:       XEiJ.mpuCycleCount += 8;
  9019:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GE << XEiJ.regCCR >> 31);
  9020:     }
  9021:   }  //irpSge
  9022: 
  9023:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9024:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9025:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9026:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9027:   //SLT.B <ea>                                      |-|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_111_mmm_rrr
  9028:   //SNGE.B <ea>                                     |A|012346|-|-*-*-|-----|D M+-WXZ  |0101_110_111_mmm_rrr [SLT.B <ea>]
  9029:   //DBLT.W Dr,<label>                               |-|012346|-|-*-*-|-----|          |0101_110_111_001_rrr-{offset}
  9030:   //DBNGE.W Dr,<label>                              |A|012346|-|-*-*-|-----|          |0101_110_111_001_rrr-{offset}        [DBLT.W Dr,<label>]
  9031:   public static void irpSlt () throws M68kException {
  9032:     int ea = XEiJ.regOC & 63;
  9033:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLT.W Dr,<label>
  9034:       if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {
  9035:         //条件が成立しているので通過
  9036:         XEiJ.mpuCycleCount += 12;
  9037:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9038:           //リードを省略する
  9039:         } else {
  9040:           XEiJ.busRws (XEiJ.regPC);
  9041:         }
  9042:         XEiJ.regPC += 2;
  9043:       } else {
  9044:         //条件が成立していないのでデクリメント
  9045:         int rrr = XEiJ.regOC & 7;
  9046:         int t = XEiJ.regRn[rrr];
  9047:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9048:           XEiJ.mpuCycleCount += 14;
  9049:           XEiJ.regRn[rrr] = t + 65535;
  9050:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9051:             //リードを省略する
  9052:           } else {
  9053:             XEiJ.busRws (XEiJ.regPC);
  9054:           }
  9055:           XEiJ.regPC += 2;
  9056:         } else {  //Drの下位16bitが0でないのでジャンプ
  9057:           XEiJ.mpuCycleCount += 10;
  9058:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9059:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9060:         }
  9061:       }
  9062:     } else if (ea < XEiJ.EA_AR) {  //SLT.B Dr
  9063:       if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {  //セット
  9064:         XEiJ.mpuCycleCount += 6;
  9065:         XEiJ.regRn[ea] |= 0xff;
  9066:       } else {  //クリア
  9067:         XEiJ.mpuCycleCount += 4;
  9068:         XEiJ.regRn[ea] &= ~0xff;
  9069:       }
  9070:     } else {  //SLT.B <mem>
  9071:       XEiJ.mpuCycleCount += 8;
  9072:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LT << XEiJ.regCCR >> 31);
  9073:     }
  9074:   }  //irpSlt
  9075: 
  9076:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9077:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9078:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9079:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9080:   //SGT.B <ea>                                      |-|012346|-|-***-|-----|D M+-WXZ  |0101_111_011_mmm_rrr
  9081:   //SNLE.B <ea>                                     |A|012346|-|-***-|-----|D M+-WXZ  |0101_111_011_mmm_rrr [SGT.B <ea>]
  9082:   //DBGT.W Dr,<label>                               |-|012346|-|-***-|-----|          |0101_111_011_001_rrr-{offset}
  9083:   //DBNLE.W Dr,<label>                              |A|012346|-|-***-|-----|          |0101_111_011_001_rrr-{offset}        [DBGT.W Dr,<label>]
  9084:   public static void irpSgt () throws M68kException {
  9085:     int ea = XEiJ.regOC & 63;
  9086:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBGT.W Dr,<label>
  9087:       if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {
  9088:         //条件が成立しているので通過
  9089:         XEiJ.mpuCycleCount += 12;
  9090:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9091:           //リードを省略する
  9092:         } else {
  9093:           XEiJ.busRws (XEiJ.regPC);
  9094:         }
  9095:         XEiJ.regPC += 2;
  9096:       } else {
  9097:         //条件が成立していないのでデクリメント
  9098:         int rrr = XEiJ.regOC & 7;
  9099:         int t = XEiJ.regRn[rrr];
  9100:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9101:           XEiJ.mpuCycleCount += 14;
  9102:           XEiJ.regRn[rrr] = t + 65535;
  9103:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9104:             //リードを省略する
  9105:           } else {
  9106:             XEiJ.busRws (XEiJ.regPC);
  9107:           }
  9108:           XEiJ.regPC += 2;
  9109:         } else {  //Drの下位16bitが0でないのでジャンプ
  9110:           XEiJ.mpuCycleCount += 10;
  9111:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9112:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9113:         }
  9114:       }
  9115:     } else if (ea < XEiJ.EA_AR) {  //SGT.B Dr
  9116:       if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {  //セット
  9117:         XEiJ.mpuCycleCount += 6;
  9118:         XEiJ.regRn[ea] |= 0xff;
  9119:       } else {  //クリア
  9120:         XEiJ.mpuCycleCount += 4;
  9121:         XEiJ.regRn[ea] &= ~0xff;
  9122:       }
  9123:     } else {  //SGT.B <mem>
  9124:       XEiJ.mpuCycleCount += 8;
  9125:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GT << XEiJ.regCCR >> 31);
  9126:     }
  9127:   }  //irpSgt
  9128: 
  9129:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9130:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9131:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9132:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9133:   //SLE.B <ea>                                      |-|012346|-|-***-|-----|D M+-WXZ  |0101_111_111_mmm_rrr
  9134:   //SNGT.B <ea>                                     |A|012346|-|-***-|-----|D M+-WXZ  |0101_111_111_mmm_rrr [SLE.B <ea>]
  9135:   //DBLE.W Dr,<label>                               |-|012346|-|-***-|-----|          |0101_111_111_001_rrr-{offset}
  9136:   //DBNGT.W Dr,<label>                              |A|012346|-|-***-|-----|          |0101_111_111_001_rrr-{offset}        [DBLE.W Dr,<label>]
  9137:   public static void irpSle () throws M68kException {
  9138:     int ea = XEiJ.regOC & 63;
  9139:     if (ea >> 3 == XEiJ.MMM_AR) {  //DBLE.W Dr,<label>
  9140:       if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {
  9141:         //条件が成立しているので通過
  9142:         XEiJ.mpuCycleCount += 12;
  9143:         if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9144:           //リードを省略する
  9145:         } else {
  9146:           XEiJ.busRws (XEiJ.regPC);
  9147:         }
  9148:         XEiJ.regPC += 2;
  9149:       } else {
  9150:         //条件が成立していないのでデクリメント
  9151:         int rrr = XEiJ.regOC & 7;
  9152:         int t = XEiJ.regRn[rrr];
  9153:         if ((short) t == 0) {  //Drの下位16bitが0なので通過
  9154:           XEiJ.mpuCycleCount += 14;
  9155:           XEiJ.regRn[rrr] = t + 65535;
  9156:           if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9157:             //リードを省略する
  9158:           } else {
  9159:             XEiJ.busRws (XEiJ.regPC);
  9160:           }
  9161:           XEiJ.regPC += 2;
  9162:         } else {  //Drの下位16bitが0でないのでジャンプ
  9163:           XEiJ.mpuCycleCount += 10;
  9164:           XEiJ.regRn[rrr] = t - 1;  //下位16bitが0でないので上位16bitは変化しない
  9165:           irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC));  //pc==pc0+2
  9166:         }
  9167:       }
  9168:     } else if (ea < XEiJ.EA_AR) {  //SLE.B Dr
  9169:       if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {  //セット
  9170:         XEiJ.mpuCycleCount += 6;
  9171:         XEiJ.regRn[ea] |= 0xff;
  9172:       } else {  //クリア
  9173:         XEiJ.mpuCycleCount += 4;
  9174:         XEiJ.regRn[ea] &= ~0xff;
  9175:       }
  9176:     } else {  //SLE.B <mem>
  9177:       XEiJ.mpuCycleCount += 8;
  9178:       XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LE << XEiJ.regCCR >> 31);
  9179:     }
  9180:   }  //irpSle
  9181: 
  9182:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9183:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9184:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9185:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9186:   //BRA.W <label>                                   |-|012346|-|-----|-----|          |0110_000_000_000_000-{offset}
  9187:   //JBRA.W <label>                                  |A|012346|-|-----|-----|          |0110_000_000_000_000-{offset}        [BRA.W <label>]
  9188:   //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_000_sss_sss (s is not equal to 0)
  9189:   //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_000_sss_sss (s is not equal to 0)   [BRA.S <label>]
  9190:   public static void irpBrasw () throws M68kException {
  9191:     XEiJ.mpuCycleCount += 10;
  9192:     int t = XEiJ.regPC;  //pc0+2
  9193:     int s = (byte) XEiJ.regOC;  //オフセット
  9194:     if (s == 0) {  //BRA.W
  9195:       XEiJ.regPC = t + 2;
  9196:       s = XEiJ.busRwse (t);  //pcws
  9197:     } else {  //BRA.S
  9198:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9199:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9200:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9201:         //! 軽量化。リードを省略する
  9202:       } else {
  9203:         XEiJ.busRwse (t);  //pcws
  9204:       }
  9205:     }
  9206:     irpSetPC (t + s);  //pc0+2+オフセット
  9207:   }  //irpBrasw
  9208: 
  9209:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9210:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9211:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9212:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9213:   //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_001_sss_sss
  9214:   //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_001_sss_sss [BRA.S <label>]
  9215:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9216:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9217:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9218:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9219:   //BRA.S <label>                                   |-|012346|-|-----|-----|          |0110_000_010_sss_sss
  9220:   //JBRA.S <label>                                  |A|012346|-|-----|-----|          |0110_000_010_sss_sss [BRA.S <label>]
  9221:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9222:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9223:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9224:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9225:   //BRA.S <label>                                   |-|01----|-|-----|-----|          |0110_000_011_sss_sss
  9226:   //JBRA.S <label>                                  |A|01----|-|-----|-----|          |0110_000_011_sss_sss [BRA.S <label>]
  9227:   public static void irpBras () throws M68kException {
  9228:     XEiJ.mpuCycleCount += 10;
  9229:     int t = XEiJ.regPC;  //pc0+2
  9230:     int s = (byte) XEiJ.regOC;  //オフセット
  9231:     //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9232:     //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9233:     if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9234:       //! 軽量化。リードを省略する
  9235:     } else {
  9236:       XEiJ.busRwse (t);  //pcws
  9237:     }
  9238:     irpSetPC (t + s);  //pc0+2+オフセット
  9239:   }  //irpBras
  9240: 
  9241:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9242:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9243:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9244:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9245:   //BSR.W <label>                                   |-|012346|-|-----|-----|          |0110_000_100_000_000-{offset}
  9246:   //JBSR.W <label>                                  |A|012346|-|-----|-----|          |0110_000_100_000_000-{offset}        [BSR.W <label>]
  9247:   //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_100_sss_sss (s is not equal to 0)
  9248:   //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_100_sss_sss (s is not equal to 0)   [BSR.S <label>]
  9249:   public static void irpBsrsw () throws M68kException {
  9250:     XEiJ.mpuCycleCount += 18;
  9251:     int t = XEiJ.regPC;  //pc0+2
  9252:     int s = (byte) XEiJ.regOC;  //オフセット
  9253:     if (s == 0) {  //BSR.W
  9254:       XEiJ.regPC = t + 2;
  9255:       s = XEiJ.busRwse (t);  //pcws
  9256:     } else {  //BSR.S
  9257:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9258:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9259:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9260:         //! 軽量化。リードを省略する
  9261:       } else {
  9262:         XEiJ.busRwse (t);  //pcws
  9263:       }
  9264:     }
  9265:     XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC);  //pushl
  9266:     irpSetPC (t + s);  //pc0+2+オフセット
  9267:   }  //irpBsrsw
  9268: 
  9269:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9270:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9271:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9272:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9273:   //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_101_sss_sss
  9274:   //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_101_sss_sss [BSR.S <label>]
  9275:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9276:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9277:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9278:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9279:   //BSR.S <label>                                   |-|012346|-|-----|-----|          |0110_000_110_sss_sss
  9280:   //JBSR.S <label>                                  |A|012346|-|-----|-----|          |0110_000_110_sss_sss [BSR.S <label>]
  9281:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9282:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9283:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9284:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9285:   //BSR.S <label>                                   |-|01----|-|-----|-----|          |0110_000_111_sss_sss
  9286:   //JBSR.S <label>                                  |A|01----|-|-----|-----|          |0110_000_111_sss_sss [BSR.S <label>]
  9287:   public static void irpBsrs () throws M68kException {
  9288:     XEiJ.mpuCycleCount += 18;
  9289:     int t = XEiJ.regPC;  //pc0+2
  9290:     int s = (byte) XEiJ.regOC;  //オフセット
  9291:     //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9292:     //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9293:     if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9294:       //! 軽量化。リードを省略する
  9295:     } else {
  9296:       XEiJ.busRwse (t);  //pcws
  9297:     }
  9298:     XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC);  //pushl
  9299:     irpSetPC (t + s);  //pc0+2+オフセット
  9300:   }  //irpBsrs
  9301: 
  9302:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9303:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9304:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9305:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9306:   //BHI.W <label>                                   |-|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}
  9307:   //BNLS.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  9308:   //JBHI.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  9309:   //JBNLS.W <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_000_000-{offset}        [BHI.W <label>]
  9310:   //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)
  9311:   //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  9312:   //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  9313:   //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_sss_sss (s is not equal to 0)   [BHI.S <label>]
  9314:   //JBLS.L <label>                                  |A|012346|-|--*-*|-----|          |0110_001_000_000_110-0100111011111001-{address}      [BHI.S (*)+8;JMP <label>]
  9315:   //JBNHI.L <label>                                 |A|012346|-|--*-*|-----|          |0110_001_000_000_110-0100111011111001-{address}      [BHI.S (*)+8;JMP <label>]
  9316:   public static void irpBhisw () throws M68kException {
  9317:     if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9318:       XEiJ.mpuCycleCount += 10;
  9319:       int t = XEiJ.regPC;  //pc0+2
  9320:       int s = (byte) XEiJ.regOC;  //オフセット
  9321:       if (s == 0) {  //Bcc.Wでジャンプ
  9322:         XEiJ.regPC = t + 2;
  9323:         s = XEiJ.busRwse (t);  //pcws
  9324:       } else {  //Bcc.Sでジャンプ
  9325:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9326:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9327:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9328:           //! 軽量化。リードを省略する
  9329:         } else {
  9330:           XEiJ.busRwse (t);  //pcws
  9331:         }
  9332:       }
  9333:       irpSetPC (t + s);  //pc0+2+オフセット
  9334:     } else if (XEiJ.regOC == 0x6200) {  //Bcc.Wで通過
  9335:       XEiJ.mpuCycleCount += 12;
  9336:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9337:         //リードを省略する
  9338:       } else {
  9339:         XEiJ.busRws (XEiJ.regPC);
  9340:       }
  9341:       XEiJ.regPC += 2;
  9342:     } else {  //Bcc.Sで通過
  9343:       XEiJ.mpuCycleCount += 8;
  9344:     }
  9345:   }  //irpBhisw
  9346: 
  9347:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9348:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9349:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9350:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9351:   //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_001_sss_sss
  9352:   //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  9353:   //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  9354:   //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_001_sss_sss [BHI.S <label>]
  9355:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9356:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9357:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9358:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9359:   //BHI.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_010_sss_sss
  9360:   //BNLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  9361:   //JBHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  9362:   //JBNLS.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_010_sss_sss [BHI.S <label>]
  9363:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9364:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9365:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9366:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9367:   //BHI.S <label>                                   |-|01----|-|--*-*|-----|          |0110_001_011_sss_sss
  9368:   //BNLS.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  9369:   //JBHI.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  9370:   //JBNLS.S <label>                                 |A|01----|-|--*-*|-----|          |0110_001_011_sss_sss [BHI.S <label>]
  9371:   public static void irpBhis () throws M68kException {
  9372:     if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) {  //Bcc.Sでジャンプ
  9373:       XEiJ.mpuCycleCount += 10;
  9374:       int t = XEiJ.regPC;  //pc0+2
  9375:       int s = (byte) XEiJ.regOC;  //オフセット
  9376:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9377:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9378:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9379:         //! 軽量化。リードを省略する
  9380:       } else {
  9381:         XEiJ.busRwse (t);  //pcws
  9382:       }
  9383:       irpSetPC (t + s);  //pc0+2+オフセット
  9384:     } else {  //Bcc.Sで通過
  9385:       XEiJ.mpuCycleCount += 8;
  9386:     }
  9387:   }  //irpBhis
  9388: 
  9389:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9390:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9391:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9392:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9393:   //BLS.W <label>                                   |-|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}
  9394:   //BNHI.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  9395:   //JBLS.W <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  9396:   //JBNHI.W <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_000_000-{offset}        [BLS.W <label>]
  9397:   //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)
  9398:   //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  9399:   //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  9400:   //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_sss_sss (s is not equal to 0)   [BLS.S <label>]
  9401:   //JBHI.L <label>                                  |A|012346|-|--*-*|-----|          |0110_001_100_000_110-0100111011111001-{address}      [BLS.S (*)+8;JMP <label>]
  9402:   //JBNLS.L <label>                                 |A|012346|-|--*-*|-----|          |0110_001_100_000_110-0100111011111001-{address}      [BLS.S (*)+8;JMP <label>]
  9403:   public static void irpBlssw () throws M68kException {
  9404:     if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9405:       XEiJ.mpuCycleCount += 10;
  9406:       int t = XEiJ.regPC;  //pc0+2
  9407:       int s = (byte) XEiJ.regOC;  //オフセット
  9408:       if (s == 0) {  //Bcc.Wでジャンプ
  9409:         XEiJ.regPC = t + 2;
  9410:         s = XEiJ.busRwse (t);  //pcws
  9411:       } else {  //Bcc.Sでジャンプ
  9412:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9413:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9414:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9415:           //! 軽量化。リードを省略する
  9416:         } else {
  9417:           XEiJ.busRwse (t);  //pcws
  9418:         }
  9419:       }
  9420:       irpSetPC (t + s);  //pc0+2+オフセット
  9421:     } else if (XEiJ.regOC == 0x6300) {  //Bcc.Wで通過
  9422:       XEiJ.mpuCycleCount += 12;
  9423:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9424:         //リードを省略する
  9425:       } else {
  9426:         XEiJ.busRws (XEiJ.regPC);
  9427:       }
  9428:       XEiJ.regPC += 2;
  9429:     } else {  //Bcc.Sで通過
  9430:       XEiJ.mpuCycleCount += 8;
  9431:     }
  9432:   }  //irpBlssw
  9433: 
  9434:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9435:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9436:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9437:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9438:   //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_101_sss_sss
  9439:   //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  9440:   //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  9441:   //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_101_sss_sss [BLS.S <label>]
  9442:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9443:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9444:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9445:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9446:   //BLS.S <label>                                   |-|012346|-|--*-*|-----|          |0110_001_110_sss_sss
  9447:   //BNHI.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  9448:   //JBLS.S <label>                                  |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  9449:   //JBNHI.S <label>                                 |A|012346|-|--*-*|-----|          |0110_001_110_sss_sss [BLS.S <label>]
  9450:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9451:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9452:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9453:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9454:   //BLS.S <label>                                   |-|01----|-|--*-*|-----|          |0110_001_111_sss_sss
  9455:   //BNHI.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  9456:   //JBLS.S <label>                                  |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  9457:   //JBNHI.S <label>                                 |A|01----|-|--*-*|-----|          |0110_001_111_sss_sss [BLS.S <label>]
  9458:   public static void irpBlss () throws M68kException {
  9459:     if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) {  //Bcc.Sでジャンプ
  9460:       XEiJ.mpuCycleCount += 10;
  9461:       int t = XEiJ.regPC;  //pc0+2
  9462:       int s = (byte) XEiJ.regOC;  //オフセット
  9463:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9464:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9465:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9466:         //! 軽量化。リードを省略する
  9467:       } else {
  9468:         XEiJ.busRwse (t);  //pcws
  9469:       }
  9470:       irpSetPC (t + s);  //pc0+2+オフセット
  9471:     } else {  //Bcc.Sで通過
  9472:       XEiJ.mpuCycleCount += 8;
  9473:     }
  9474:   }  //irpBlss
  9475: 
  9476:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9477:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9478:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9479:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9480:   //BCC.W <label>                                   |-|012346|-|----*|-----|          |0110_010_000_000_000-{offset}
  9481:   //BHS.W <label>                                   |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9482:   //BNCS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9483:   //BNLO.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9484:   //JBCC.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9485:   //JBHS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9486:   //JBNCS.W <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9487:   //JBNLO.W <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_000-{offset}        [BCC.W <label>]
  9488:   //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)
  9489:   //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9490:   //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9491:   //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9492:   //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9493:   //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9494:   //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9495:   //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_000_sss_sss (s is not equal to 0)   [BCC.S <label>]
  9496:   //JBCS.L <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9497:   //JBLO.L <label>                                  |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9498:   //JBNCC.L <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9499:   //JBNHS.L <label>                                 |A|012346|-|----*|-----|          |0110_010_000_000_110-0100111011111001-{address}      [BCC.S (*)+8;JMP <label>]
  9500:   public static void irpBhssw () throws M68kException {
  9501:     if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9502:       XEiJ.mpuCycleCount += 10;
  9503:       int t = XEiJ.regPC;  //pc0+2
  9504:       int s = (byte) XEiJ.regOC;  //オフセット
  9505:       if (s == 0) {  //Bcc.Wでジャンプ
  9506:         XEiJ.regPC = t + 2;
  9507:         s = XEiJ.busRwse (t);  //pcws
  9508:       } else {  //Bcc.Sでジャンプ
  9509:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9510:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9511:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9512:           //! 軽量化。リードを省略する
  9513:         } else {
  9514:           XEiJ.busRwse (t);  //pcws
  9515:         }
  9516:       }
  9517:       irpSetPC (t + s);  //pc0+2+オフセット
  9518:     } else if (XEiJ.regOC == 0x6400) {  //Bcc.Wで通過
  9519:       XEiJ.mpuCycleCount += 12;
  9520:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9521:         //リードを省略する
  9522:       } else {
  9523:         XEiJ.busRws (XEiJ.regPC);
  9524:       }
  9525:       XEiJ.regPC += 2;
  9526:     } else {  //Bcc.Sで通過
  9527:       XEiJ.mpuCycleCount += 8;
  9528:     }
  9529:   }  //irpBhssw
  9530: 
  9531:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9532:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9533:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9534:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9535:   //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_001_sss_sss
  9536:   //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9537:   //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9538:   //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9539:   //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9540:   //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9541:   //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9542:   //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_001_sss_sss [BCC.S <label>]
  9543:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9544:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9545:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9546:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9547:   //BCC.S <label>                                   |-|012346|-|----*|-----|          |0110_010_010_sss_sss
  9548:   //BHS.S <label>                                   |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9549:   //BNCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9550:   //BNLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9551:   //JBCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9552:   //JBHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9553:   //JBNCS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9554:   //JBNLO.S <label>                                 |A|012346|-|----*|-----|          |0110_010_010_sss_sss [BCC.S <label>]
  9555:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9556:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9557:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9558:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9559:   //BCC.S <label>                                   |-|01----|-|----*|-----|          |0110_010_011_sss_sss
  9560:   //BHS.S <label>                                   |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9561:   //BNCS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9562:   //BNLO.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9563:   //JBCC.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9564:   //JBHS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9565:   //JBNCS.S <label>                                 |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9566:   //JBNLO.S <label>                                 |A|01----|-|----*|-----|          |0110_010_011_sss_sss [BCC.S <label>]
  9567:   public static void irpBhss () throws M68kException {
  9568:     if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) {  //Bcc.Sでジャンプ
  9569:       XEiJ.mpuCycleCount += 10;
  9570:       int t = XEiJ.regPC;  //pc0+2
  9571:       int s = (byte) XEiJ.regOC;  //オフセット
  9572:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9573:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9574:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9575:         //! 軽量化。リードを省略する
  9576:       } else {
  9577:         XEiJ.busRwse (t);  //pcws
  9578:       }
  9579:       irpSetPC (t + s);  //pc0+2+オフセット
  9580:     } else {  //Bcc.Sで通過
  9581:       XEiJ.mpuCycleCount += 8;
  9582:     }
  9583:   }  //irpBhss
  9584: 
  9585:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9586:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9587:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9588:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9589:   //BCS.W <label>                                   |-|012346|-|----*|-----|          |0110_010_100_000_000-{offset}
  9590:   //BLO.W <label>                                   |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9591:   //BNCC.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9592:   //BNHS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9593:   //JBCS.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9594:   //JBLO.W <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9595:   //JBNCC.W <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9596:   //JBNHS.W <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_000-{offset}        [BCS.W <label>]
  9597:   //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)
  9598:   //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9599:   //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9600:   //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9601:   //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9602:   //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9603:   //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9604:   //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_100_sss_sss (s is not equal to 0)   [BCS.S <label>]
  9605:   //JBCC.L <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9606:   //JBHS.L <label>                                  |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9607:   //JBNCS.L <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9608:   //JBNLO.L <label>                                 |A|012346|-|----*|-----|          |0110_010_100_000_110-0100111011111001-{address}      [BCS.S (*)+8;JMP <label>]
  9609:   public static void irpBlosw () throws M68kException {
  9610:     if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9611:       XEiJ.mpuCycleCount += 10;
  9612:       int t = XEiJ.regPC;  //pc0+2
  9613:       int s = (byte) XEiJ.regOC;  //オフセット
  9614:       if (s == 0) {  //Bcc.Wでジャンプ
  9615:         XEiJ.regPC = t + 2;
  9616:         s = XEiJ.busRwse (t);  //pcws
  9617:       } else {  //Bcc.Sでジャンプ
  9618:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9619:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9620:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9621:           //! 軽量化。リードを省略する
  9622:         } else {
  9623:           XEiJ.busRwse (t);  //pcws
  9624:         }
  9625:       }
  9626:       irpSetPC (t + s);  //pc0+2+オフセット
  9627:     } else if (XEiJ.regOC == 0x6500) {  //Bcc.Wで通過
  9628:       XEiJ.mpuCycleCount += 12;
  9629:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9630:         //リードを省略する
  9631:       } else {
  9632:         XEiJ.busRws (XEiJ.regPC);
  9633:       }
  9634:       XEiJ.regPC += 2;
  9635:     } else {  //Bcc.Sで通過
  9636:       XEiJ.mpuCycleCount += 8;
  9637:     }
  9638:   }  //irpBlosw
  9639: 
  9640:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9641:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9642:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9643:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9644:   //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_101_sss_sss
  9645:   //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9646:   //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9647:   //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9648:   //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9649:   //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9650:   //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9651:   //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_101_sss_sss [BCS.S <label>]
  9652:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9653:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9654:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9655:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9656:   //BCS.S <label>                                   |-|012346|-|----*|-----|          |0110_010_110_sss_sss
  9657:   //BLO.S <label>                                   |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9658:   //BNCC.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9659:   //BNHS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9660:   //JBCS.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9661:   //JBLO.S <label>                                  |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9662:   //JBNCC.S <label>                                 |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9663:   //JBNHS.S <label>                                 |A|012346|-|----*|-----|          |0110_010_110_sss_sss [BCS.S <label>]
  9664:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9665:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9666:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9667:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9668:   //BCS.S <label>                                   |-|01----|-|----*|-----|          |0110_010_111_sss_sss
  9669:   //BLO.S <label>                                   |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9670:   //BNCC.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9671:   //BNHS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9672:   //JBCS.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9673:   //JBLO.S <label>                                  |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9674:   //JBNCC.S <label>                                 |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9675:   //JBNHS.S <label>                                 |A|01----|-|----*|-----|          |0110_010_111_sss_sss [BCS.S <label>]
  9676:   public static void irpBlos () throws M68kException {
  9677:     if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9678:       XEiJ.mpuCycleCount += 10;
  9679:       int t = XEiJ.regPC;  //pc0+2
  9680:       int s = (byte) XEiJ.regOC;  //オフセット
  9681:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9682:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9683:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9684:         //! 軽量化。リードを省略する
  9685:       } else {
  9686:         XEiJ.busRwse (t);  //pcws
  9687:       }
  9688:       irpSetPC (t + s);  //pc0+2+オフセット
  9689:     } else {  //Bcc.Sで通過
  9690:       XEiJ.mpuCycleCount += 8;
  9691:     }
  9692:   }  //irpBlos
  9693: 
  9694:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9695:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9696:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9697:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9698:   //BNE.W <label>                                   |-|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}
  9699:   //BNEQ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9700:   //BNZ.W <label>                                   |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9701:   //BNZE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9702:   //JBNE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9703:   //JBNEQ.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9704:   //JBNZ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9705:   //JBNZE.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_000-{offset}        [BNE.W <label>]
  9706:   //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)
  9707:   //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9708:   //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9709:   //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9710:   //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9711:   //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9712:   //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9713:   //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_sss_sss (s is not equal to 0)   [BNE.S <label>]
  9714:   //JBEQ.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9715:   //JBNEQ.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9716:   //JBNNE.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9717:   //JBNNZ.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9718:   //JBNZ.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9719:   //JBNZE.L <label>                                 |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9720:   //JBZE.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_000_000_110-0100111011111001-{address}      [BNE.S (*)+8;JMP <label>]
  9721:   public static void irpBnesw () throws M68kException {
  9722:     if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9723:       XEiJ.mpuCycleCount += 10;
  9724:       int t = XEiJ.regPC;  //pc0+2
  9725:       int s = (byte) XEiJ.regOC;  //オフセット
  9726:       if (s == 0) {  //Bcc.Wでジャンプ
  9727:         XEiJ.regPC = t + 2;
  9728:         s = XEiJ.busRwse (t);  //pcws
  9729:       } else {  //Bcc.Sでジャンプ
  9730:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9731:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9732:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9733:           //! 軽量化。リードを省略する
  9734:         } else {
  9735:           XEiJ.busRwse (t);  //pcws
  9736:         }
  9737:       }
  9738:       irpSetPC (t + s);  //pc0+2+オフセット
  9739:     } else if (XEiJ.regOC == 0x6600) {  //Bcc.Wで通過
  9740:       XEiJ.mpuCycleCount += 12;
  9741:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9742:         //リードを省略する
  9743:       } else {
  9744:         XEiJ.busRws (XEiJ.regPC);
  9745:       }
  9746:       XEiJ.regPC += 2;
  9747:     } else {  //Bcc.Sで通過
  9748:       XEiJ.mpuCycleCount += 8;
  9749:     }
  9750:   }  //irpBnesw
  9751: 
  9752:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9753:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9754:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9755:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9756:   //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_001_sss_sss
  9757:   //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9758:   //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9759:   //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9760:   //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9761:   //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9762:   //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9763:   //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_001_sss_sss [BNE.S <label>]
  9764:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9765:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9766:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9767:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9768:   //BNE.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_010_sss_sss
  9769:   //BNEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9770:   //BNZ.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9771:   //BNZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9772:   //JBNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9773:   //JBNEQ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9774:   //JBNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9775:   //JBNZE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_010_sss_sss [BNE.S <label>]
  9776:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9777:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9778:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9779:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9780:   //BNE.S <label>                                   |-|01----|-|--*--|-----|          |0110_011_011_sss_sss
  9781:   //BNEQ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9782:   //BNZ.S <label>                                   |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9783:   //BNZE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9784:   //JBNE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9785:   //JBNEQ.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9786:   //JBNZ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9787:   //JBNZE.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_011_sss_sss [BNE.S <label>]
  9788:   public static void irpBnes () throws M68kException {
  9789:     if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9790:       XEiJ.mpuCycleCount += 10;
  9791:       int t = XEiJ.regPC;  //pc0+2
  9792:       int s = (byte) XEiJ.regOC;  //オフセット
  9793:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9794:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9795:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9796:         //! 軽量化。リードを省略する
  9797:       } else {
  9798:         XEiJ.busRwse (t);  //pcws
  9799:       }
  9800:       irpSetPC (t + s);  //pc0+2+オフセット
  9801:     } else {  //Bcc.Sで通過
  9802:       XEiJ.mpuCycleCount += 8;
  9803:     }
  9804:   }  //irpBnes
  9805: 
  9806:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9807:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9808:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9809:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9810:   //BEQ.W <label>                                   |-|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}
  9811:   //BNNE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9812:   //BNNZ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9813:   //BZE.W <label>                                   |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9814:   //JBEQ.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9815:   //JBNNE.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9816:   //JBNNZ.W <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9817:   //JBZE.W <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_000-{offset}        [BEQ.W <label>]
  9818:   //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)
  9819:   //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9820:   //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9821:   //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9822:   //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9823:   //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9824:   //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9825:   //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_sss_sss (s is not equal to 0)   [BEQ.S <label>]
  9826:   //JBNE.L <label>                                  |A|012346|-|--*--|-----|          |0110_011_100_000_110-0100111011111001-{address}      [BEQ.S (*)+8;JMP <label>]
  9827:   public static void irpBeqsw () throws M68kException {
  9828:     if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9829:       XEiJ.mpuCycleCount += 10;
  9830:       int t = XEiJ.regPC;  //pc0+2
  9831:       int s = (byte) XEiJ.regOC;  //オフセット
  9832:       if (s == 0) {  //Bcc.Wでジャンプ
  9833:         XEiJ.regPC = t + 2;
  9834:         s = XEiJ.busRwse (t);  //pcws
  9835:       } else {  //Bcc.Sでジャンプ
  9836:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9837:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9838:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9839:           //! 軽量化。リードを省略する
  9840:         } else {
  9841:           XEiJ.busRwse (t);  //pcws
  9842:         }
  9843:       }
  9844:       irpSetPC (t + s);  //pc0+2+オフセット
  9845:     } else if (XEiJ.regOC == 0x6700) {  //Bcc.Wで通過
  9846:       XEiJ.mpuCycleCount += 12;
  9847:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9848:         //リードを省略する
  9849:       } else {
  9850:         XEiJ.busRws (XEiJ.regPC);
  9851:       }
  9852:       XEiJ.regPC += 2;
  9853:     } else {  //Bcc.Sで通過
  9854:       XEiJ.mpuCycleCount += 8;
  9855:     }
  9856:   }  //irpBeqsw
  9857: 
  9858:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9859:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9860:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9861:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9862:   //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_101_sss_sss
  9863:   //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9864:   //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9865:   //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9866:   //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9867:   //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9868:   //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9869:   //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_101_sss_sss [BEQ.S <label>]
  9870:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9871:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9872:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9873:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9874:   //BEQ.S <label>                                   |-|012346|-|--*--|-----|          |0110_011_110_sss_sss
  9875:   //BNNE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9876:   //BNNZ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9877:   //BZE.S <label>                                   |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9878:   //JBEQ.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9879:   //JBNNE.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9880:   //JBNNZ.S <label>                                 |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9881:   //JBZE.S <label>                                  |A|012346|-|--*--|-----|          |0110_011_110_sss_sss [BEQ.S <label>]
  9882:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9883:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9884:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9885:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9886:   //BEQ.S <label>                                   |-|01----|-|--*--|-----|          |0110_011_111_sss_sss
  9887:   //BNNE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9888:   //BNNZ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9889:   //BZE.S <label>                                   |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9890:   //JBEQ.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9891:   //JBNNE.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9892:   //JBNNZ.S <label>                                 |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9893:   //JBZE.S <label>                                  |A|01----|-|--*--|-----|          |0110_011_111_sss_sss [BEQ.S <label>]
  9894:   public static void irpBeqs () throws M68kException {
  9895:     if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9896:       XEiJ.mpuCycleCount += 10;
  9897:       int t = XEiJ.regPC;  //pc0+2
  9898:       int s = (byte) XEiJ.regOC;  //オフセット
  9899:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9900:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9901:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9902:         //! 軽量化。リードを省略する
  9903:       } else {
  9904:         XEiJ.busRwse (t);  //pcws
  9905:       }
  9906:       irpSetPC (t + s);  //pc0+2+オフセット
  9907:     } else {  //Bcc.Sで通過
  9908:       XEiJ.mpuCycleCount += 8;
  9909:     }
  9910:   }  //irpBeqs
  9911: 
  9912:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9913:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9914:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9915:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9916:   //BVC.W <label>                                   |-|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}
  9917:   //BNVS.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  9918:   //JBNVS.W <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  9919:   //JBVC.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_000-{offset}        [BVC.W <label>]
  9920:   //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)
  9921:   //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  9922:   //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  9923:   //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_sss_sss (s is not equal to 0)   [BVC.S <label>]
  9924:   //JBNVC.L <label>                                 |A|012346|-|---*-|-----|          |0110_100_000_000_110-0100111011111001-{address}      [BVC.S (*)+8;JMP <label>]
  9925:   //JBVS.L <label>                                  |A|012346|-|---*-|-----|          |0110_100_000_000_110-0100111011111001-{address}      [BVC.S (*)+8;JMP <label>]
  9926:   public static void irpBvcsw () throws M68kException {
  9927:     if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9928:       XEiJ.mpuCycleCount += 10;
  9929:       int t = XEiJ.regPC;  //pc0+2
  9930:       int s = (byte) XEiJ.regOC;  //オフセット
  9931:       if (s == 0) {  //Bcc.Wでジャンプ
  9932:         XEiJ.regPC = t + 2;
  9933:         s = XEiJ.busRwse (t);  //pcws
  9934:       } else {  //Bcc.Sでジャンプ
  9935:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9936:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9937:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9938:           //! 軽量化。リードを省略する
  9939:         } else {
  9940:           XEiJ.busRwse (t);  //pcws
  9941:         }
  9942:       }
  9943:       irpSetPC (t + s);  //pc0+2+オフセット
  9944:     } else if (XEiJ.regOC == 0x6800) {  //Bcc.Wで通過
  9945:       XEiJ.mpuCycleCount += 12;
  9946:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
  9947:         //リードを省略する
  9948:       } else {
  9949:         XEiJ.busRws (XEiJ.regPC);
  9950:       }
  9951:       XEiJ.regPC += 2;
  9952:     } else {  //Bcc.Sで通過
  9953:       XEiJ.mpuCycleCount += 8;
  9954:     }
  9955:   }  //irpBvcsw
  9956: 
  9957:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9958:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9959:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9960:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9961:   //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_001_sss_sss
  9962:   //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
  9963:   //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
  9964:   //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_001_sss_sss [BVC.S <label>]
  9965:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9966:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9967:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9968:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9969:   //BVC.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_010_sss_sss
  9970:   //BNVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
  9971:   //JBNVS.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
  9972:   //JBVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_010_sss_sss [BVC.S <label>]
  9973:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9974:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
  9975:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
  9976:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
  9977:   //BVC.S <label>                                   |-|01----|-|---*-|-----|          |0110_100_011_sss_sss
  9978:   //BNVS.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
  9979:   //JBNVS.S <label>                                 |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
  9980:   //JBVC.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_011_sss_sss [BVC.S <label>]
  9981:   public static void irpBvcs () throws M68kException {
  9982:     if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) {  //Bccでジャンプ
  9983:       XEiJ.mpuCycleCount += 10;
  9984:       int t = XEiJ.regPC;  //pc0+2
  9985:       int s = (byte) XEiJ.regOC;  //オフセット
  9986:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
  9987:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
  9988:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
  9989:         //! 軽量化。リードを省略する
  9990:       } else {
  9991:         XEiJ.busRwse (t);  //pcws
  9992:       }
  9993:       irpSetPC (t + s);  //pc0+2+オフセット
  9994:     } else {  //Bcc.Sで通過
  9995:       XEiJ.mpuCycleCount += 8;
  9996:     }
  9997:   }  //irpBvcs
  9998: 
  9999:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10000:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10001:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10002:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10003:   //BVS.W <label>                                   |-|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}
 10004:   //BNVC.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
 10005:   //JBNVC.W <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
 10006:   //JBVS.W <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_000-{offset}        [BVS.W <label>]
 10007:   //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)
 10008:   //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
 10009:   //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
 10010:   //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_sss_sss (s is not equal to 0)   [BVS.S <label>]
 10011:   //JBNVS.L <label>                                 |A|012346|-|---*-|-----|          |0110_100_100_000_110-0100111011111001-{address}      [BVS.S (*)+8;JMP <label>]
 10012:   //JBVC.L <label>                                  |A|012346|-|---*-|-----|          |0110_100_100_000_110-0100111011111001-{address}      [BVS.S (*)+8;JMP <label>]
 10013:   public static void irpBvssw () throws M68kException {
 10014:     if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10015:       XEiJ.mpuCycleCount += 10;
 10016:       int t = XEiJ.regPC;  //pc0+2
 10017:       int s = (byte) XEiJ.regOC;  //オフセット
 10018:       if (s == 0) {  //Bcc.Wでジャンプ
 10019:         XEiJ.regPC = t + 2;
 10020:         s = XEiJ.busRwse (t);  //pcws
 10021:       } else {  //Bcc.Sでジャンプ
 10022:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10023:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10024:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10025:           //! 軽量化。リードを省略する
 10026:         } else {
 10027:           XEiJ.busRwse (t);  //pcws
 10028:         }
 10029:       }
 10030:       irpSetPC (t + s);  //pc0+2+オフセット
 10031:     } else if (XEiJ.regOC == 0x6900) {  //Bcc.Wで通過
 10032:       XEiJ.mpuCycleCount += 12;
 10033:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10034:         //リードを省略する
 10035:       } else {
 10036:         XEiJ.busRws (XEiJ.regPC);
 10037:       }
 10038:       XEiJ.regPC += 2;
 10039:     } else {  //Bcc.Sで通過
 10040:       XEiJ.mpuCycleCount += 8;
 10041:     }
 10042:   }  //irpBvssw
 10043: 
 10044:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10045:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10046:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10047:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10048:   //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_101_sss_sss
 10049:   //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
 10050:   //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
 10051:   //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_101_sss_sss [BVS.S <label>]
 10052:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10053:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10054:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10055:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10056:   //BVS.S <label>                                   |-|012346|-|---*-|-----|          |0110_100_110_sss_sss
 10057:   //BNVC.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
 10058:   //JBNVC.S <label>                                 |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
 10059:   //JBVS.S <label>                                  |A|012346|-|---*-|-----|          |0110_100_110_sss_sss [BVS.S <label>]
 10060:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10061:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10062:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10063:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10064:   //BVS.S <label>                                   |-|01----|-|---*-|-----|          |0110_100_111_sss_sss
 10065:   //BNVC.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
 10066:   //JBNVC.S <label>                                 |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
 10067:   //JBVS.S <label>                                  |A|01----|-|---*-|-----|          |0110_100_111_sss_sss [BVS.S <label>]
 10068:   public static void irpBvss () throws M68kException {
 10069:     if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10070:       XEiJ.mpuCycleCount += 10;
 10071:       int t = XEiJ.regPC;  //pc0+2
 10072:       int s = (byte) XEiJ.regOC;  //オフセット
 10073:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10074:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10075:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10076:         //! 軽量化。リードを省略する
 10077:       } else {
 10078:         XEiJ.busRwse (t);  //pcws
 10079:       }
 10080:       irpSetPC (t + s);  //pc0+2+オフセット
 10081:     } else {  //Bcc.Sで通過
 10082:       XEiJ.mpuCycleCount += 8;
 10083:     }
 10084:   }  //irpBvss
 10085: 
 10086:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10087:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10088:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10089:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10090:   //BPL.W <label>                                   |-|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}
 10091:   //BNMI.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
 10092:   //JBNMI.W <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
 10093:   //JBPL.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_000-{offset}        [BPL.W <label>]
 10094:   //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)
 10095:   //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
 10096:   //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
 10097:   //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_sss_sss (s is not equal to 0)   [BPL.S <label>]
 10098:   //JBMI.L <label>                                  |A|012346|-|-*---|-----|          |0110_101_000_000_110-0100111011111001-{address}      [BPL.S (*)+8;JMP <label>]
 10099:   //JBNPL.L <label>                                 |A|012346|-|-*---|-----|          |0110_101_000_000_110-0100111011111001-{address}      [BPL.S (*)+8;JMP <label>]
 10100:   public static void irpBplsw () throws M68kException {
 10101:     if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10102:       XEiJ.mpuCycleCount += 10;
 10103:       int t = XEiJ.regPC;  //pc0+2
 10104:       int s = (byte) XEiJ.regOC;  //オフセット
 10105:       if (s == 0) {  //Bcc.Wでジャンプ
 10106:         XEiJ.regPC = t + 2;
 10107:         s = XEiJ.busRwse (t);  //pcws
 10108:       } else {  //Bcc.Sでジャンプ
 10109:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10110:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10111:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10112:           //! 軽量化。リードを省略する
 10113:         } else {
 10114:           XEiJ.busRwse (t);  //pcws
 10115:         }
 10116:       }
 10117:       irpSetPC (t + s);  //pc0+2+オフセット
 10118:     } else if (XEiJ.regOC == 0x6a00) {  //Bcc.Wで通過
 10119:       XEiJ.mpuCycleCount += 12;
 10120:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10121:         //リードを省略する
 10122:       } else {
 10123:         XEiJ.busRws (XEiJ.regPC);
 10124:       }
 10125:       XEiJ.regPC += 2;
 10126:     } else {  //Bcc.Sで通過
 10127:       XEiJ.mpuCycleCount += 8;
 10128:     }
 10129:   }  //irpBplsw
 10130: 
 10131:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10132:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10133:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10134:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10135:   //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_001_sss_sss
 10136:   //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
 10137:   //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
 10138:   //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_001_sss_sss [BPL.S <label>]
 10139:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10140:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10141:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10142:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10143:   //BPL.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_010_sss_sss
 10144:   //BNMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
 10145:   //JBNMI.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
 10146:   //JBPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_010_sss_sss [BPL.S <label>]
 10147:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10148:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10149:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10150:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10151:   //BPL.S <label>                                   |-|01----|-|-*---|-----|          |0110_101_011_sss_sss
 10152:   //BNMI.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
 10153:   //JBNMI.S <label>                                 |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
 10154:   //JBPL.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_011_sss_sss [BPL.S <label>]
 10155:   public static void irpBpls () throws M68kException {
 10156:     if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10157:       XEiJ.mpuCycleCount += 10;
 10158:       int t = XEiJ.regPC;  //pc0+2
 10159:       int s = (byte) XEiJ.regOC;  //オフセット
 10160:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10161:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10162:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10163:         //! 軽量化。リードを省略する
 10164:       } else {
 10165:         XEiJ.busRwse (t);  //pcws
 10166:       }
 10167:       irpSetPC (t + s);  //pc0+2+オフセット
 10168:     } else {  //Bcc.Sで通過
 10169:       XEiJ.mpuCycleCount += 8;
 10170:     }
 10171:   }  //irpBpls
 10172: 
 10173:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10174:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10175:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10176:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10177:   //BMI.W <label>                                   |-|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}
 10178:   //BNPL.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
 10179:   //JBMI.W <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
 10180:   //JBNPL.W <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_000_000-{offset}        [BMI.W <label>]
 10181:   //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)
 10182:   //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
 10183:   //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
 10184:   //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_sss_sss (s is not equal to 0)   [BMI.S <label>]
 10185:   //JBNMI.L <label>                                 |A|012346|-|-*---|-----|          |0110_101_100_000_110-0100111011111001-{address}      [BMI.S (*)+8;JMP <label>]
 10186:   //JBPL.L <label>                                  |A|012346|-|-*---|-----|          |0110_101_100_000_110-0100111011111001-{address}      [BMI.S (*)+8;JMP <label>]
 10187:   public static void irpBmisw () throws M68kException {
 10188:     if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10189:       XEiJ.mpuCycleCount += 10;
 10190:       int t = XEiJ.regPC;  //pc0+2
 10191:       int s = (byte) XEiJ.regOC;  //オフセット
 10192:       if (s == 0) {  //Bcc.Wでジャンプ
 10193:         XEiJ.regPC = t + 2;
 10194:         s = XEiJ.busRwse (t);  //pcws
 10195:       } else {  //Bcc.Sでジャンプ
 10196:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10197:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10198:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10199:           //! 軽量化。リードを省略する
 10200:         } else {
 10201:           XEiJ.busRwse (t);  //pcws
 10202:         }
 10203:       }
 10204:       irpSetPC (t + s);  //pc0+2+オフセット
 10205:     } else if (XEiJ.regOC == 0x6b00) {  //Bcc.Wで通過
 10206:       XEiJ.mpuCycleCount += 12;
 10207:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10208:         //リードを省略する
 10209:       } else {
 10210:         XEiJ.busRws (XEiJ.regPC);
 10211:       }
 10212:       XEiJ.regPC += 2;
 10213:     } else {  //Bcc.Sで通過
 10214:       XEiJ.mpuCycleCount += 8;
 10215:     }
 10216:   }  //irpBmisw
 10217: 
 10218:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10219:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10220:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10221:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10222:   //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_101_sss_sss
 10223:   //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
 10224:   //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
 10225:   //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_101_sss_sss [BMI.S <label>]
 10226:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10227:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10228:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10229:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10230:   //BMI.S <label>                                   |-|012346|-|-*---|-----|          |0110_101_110_sss_sss
 10231:   //BNPL.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
 10232:   //JBMI.S <label>                                  |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
 10233:   //JBNPL.S <label>                                 |A|012346|-|-*---|-----|          |0110_101_110_sss_sss [BMI.S <label>]
 10234:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10235:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10236:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10237:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10238:   //BMI.S <label>                                   |-|01----|-|-*---|-----|          |0110_101_111_sss_sss
 10239:   //BNPL.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
 10240:   //JBMI.S <label>                                  |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
 10241:   //JBNPL.S <label>                                 |A|01----|-|-*---|-----|          |0110_101_111_sss_sss [BMI.S <label>]
 10242:   public static void irpBmis () throws M68kException {
 10243:     if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10244:       XEiJ.mpuCycleCount += 10;
 10245:       int t = XEiJ.regPC;  //pc0+2
 10246:       int s = (byte) XEiJ.regOC;  //オフセット
 10247:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10248:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10249:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10250:         //! 軽量化。リードを省略する
 10251:       } else {
 10252:         XEiJ.busRwse (t);  //pcws
 10253:       }
 10254:       irpSetPC (t + s);  //pc0+2+オフセット
 10255:     } else {  //Bcc.Sで通過
 10256:       XEiJ.mpuCycleCount += 8;
 10257:     }
 10258:   }  //irpBmis
 10259: 
 10260:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10261:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10262:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10263:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10264:   //BGE.W <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}
 10265:   //BNLT.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
 10266:   //JBGE.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
 10267:   //JBNLT.W <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_000_000-{offset}        [BGE.W <label>]
 10268:   //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)
 10269:   //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
 10270:   //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
 10271:   //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_sss_sss (s is not equal to 0)   [BGE.S <label>]
 10272:   //JBLT.L <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_000_000_110-0100111011111001-{address}      [BGE.S (*)+8;JMP <label>]
 10273:   //JBNGE.L <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_000_000_110-0100111011111001-{address}      [BGE.S (*)+8;JMP <label>]
 10274:   public static void irpBgesw () throws M68kException {
 10275:     if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10276:       XEiJ.mpuCycleCount += 10;
 10277:       int t = XEiJ.regPC;  //pc0+2
 10278:       int s = (byte) XEiJ.regOC;  //オフセット
 10279:       if (s == 0) {  //Bcc.Wでジャンプ
 10280:         XEiJ.regPC = t + 2;
 10281:         s = XEiJ.busRwse (t);  //pcws
 10282:       } else {  //Bcc.Sでジャンプ
 10283:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10284:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10285:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10286:           //! 軽量化。リードを省略する
 10287:         } else {
 10288:           XEiJ.busRwse (t);  //pcws
 10289:         }
 10290:       }
 10291:       irpSetPC (t + s);  //pc0+2+オフセット
 10292:     } else if (XEiJ.regOC == 0x6c00) {  //Bcc.Wで通過
 10293:       XEiJ.mpuCycleCount += 12;
 10294:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10295:         //リードを省略する
 10296:       } else {
 10297:         XEiJ.busRws (XEiJ.regPC);
 10298:       }
 10299:       XEiJ.regPC += 2;
 10300:     } else {  //Bcc.Sで通過
 10301:       XEiJ.mpuCycleCount += 8;
 10302:     }
 10303:   }  //irpBgesw
 10304: 
 10305:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10306:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10307:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10308:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10309:   //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_001_sss_sss
 10310:   //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
 10311:   //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
 10312:   //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_001_sss_sss [BGE.S <label>]
 10313:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10314:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10315:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10316:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10317:   //BGE.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_010_sss_sss
 10318:   //BNLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
 10319:   //JBGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
 10320:   //JBNLT.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_010_sss_sss [BGE.S <label>]
 10321:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10322:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10323:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10324:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10325:   //BGE.S <label>                                   |-|01----|-|-*-*-|-----|          |0110_110_011_sss_sss
 10326:   //BNLT.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
 10327:   //JBGE.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
 10328:   //JBNLT.S <label>                                 |A|01----|-|-*-*-|-----|          |0110_110_011_sss_sss [BGE.S <label>]
 10329:   public static void irpBges () throws M68kException {
 10330:     if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10331:       XEiJ.mpuCycleCount += 10;
 10332:       int t = XEiJ.regPC;  //pc0+2
 10333:       int s = (byte) XEiJ.regOC;  //オフセット
 10334:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10335:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10336:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10337:         //! 軽量化。リードを省略する
 10338:       } else {
 10339:         XEiJ.busRwse (t);  //pcws
 10340:       }
 10341:       irpSetPC (t + s);  //pc0+2+オフセット
 10342:     } else {  //Bcc.Sで通過
 10343:       XEiJ.mpuCycleCount += 8;
 10344:     }
 10345:   }  //irpBges
 10346: 
 10347:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10348:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10349:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10350:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10351:   //BLT.W <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}
 10352:   //BNGE.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
 10353:   //JBLT.W <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
 10354:   //JBNGE.W <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_000_000-{offset}        [BLT.W <label>]
 10355:   //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)
 10356:   //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
 10357:   //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
 10358:   //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_sss_sss (s is not equal to 0)   [BLT.S <label>]
 10359:   //JBGE.L <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_100_000_110-0100111011111001-{address}      [BLT.S (*)+8;JMP <label>]
 10360:   //JBNLT.L <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_100_000_110-0100111011111001-{address}      [BLT.S (*)+8;JMP <label>]
 10361:   public static void irpBltsw () throws M68kException {
 10362:     if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10363:       XEiJ.mpuCycleCount += 10;
 10364:       int t = XEiJ.regPC;  //pc0+2
 10365:       int s = (byte) XEiJ.regOC;  //オフセット
 10366:       if (s == 0) {  //Bcc.Wでジャンプ
 10367:         XEiJ.regPC = t + 2;
 10368:         s = XEiJ.busRwse (t);  //pcws
 10369:       } else {  //Bcc.Sでジャンプ
 10370:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10371:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10372:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10373:           //! 軽量化。リードを省略する
 10374:         } else {
 10375:           XEiJ.busRwse (t);  //pcws
 10376:         }
 10377:       }
 10378:       irpSetPC (t + s);  //pc0+2+オフセット
 10379:     } else if (XEiJ.regOC == 0x6d00) {  //Bcc.Wで通過
 10380:       XEiJ.mpuCycleCount += 12;
 10381:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10382:         //リードを省略する
 10383:       } else {
 10384:         XEiJ.busRws (XEiJ.regPC);
 10385:       }
 10386:       XEiJ.regPC += 2;
 10387:     } else {  //Bcc.Sで通過
 10388:       XEiJ.mpuCycleCount += 8;
 10389:     }
 10390:   }  //irpBltsw
 10391: 
 10392:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10393:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10394:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10395:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10396:   //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_101_sss_sss
 10397:   //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
 10398:   //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
 10399:   //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_101_sss_sss [BLT.S <label>]
 10400:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10401:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10402:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10403:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10404:   //BLT.S <label>                                   |-|012346|-|-*-*-|-----|          |0110_110_110_sss_sss
 10405:   //BNGE.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
 10406:   //JBLT.S <label>                                  |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
 10407:   //JBNGE.S <label>                                 |A|012346|-|-*-*-|-----|          |0110_110_110_sss_sss [BLT.S <label>]
 10408:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10409:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10410:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10411:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10412:   //BLT.S <label>                                   |-|01----|-|-*-*-|-----|          |0110_110_111_sss_sss
 10413:   //BNGE.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
 10414:   //JBLT.S <label>                                  |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
 10415:   //JBNGE.S <label>                                 |A|01----|-|-*-*-|-----|          |0110_110_111_sss_sss [BLT.S <label>]
 10416:   public static void irpBlts () throws M68kException {
 10417:     if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10418:       XEiJ.mpuCycleCount += 10;
 10419:       int t = XEiJ.regPC;  //pc0+2
 10420:       int s = (byte) XEiJ.regOC;  //オフセット
 10421:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10422:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10423:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10424:         //! 軽量化。リードを省略する
 10425:       } else {
 10426:         XEiJ.busRwse (t);  //pcws
 10427:       }
 10428:       irpSetPC (t + s);  //pc0+2+オフセット
 10429:     } else {  //Bcc.Sで通過
 10430:       XEiJ.mpuCycleCount += 8;
 10431:     }
 10432:   }  //irpBlts
 10433: 
 10434:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10435:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10436:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10437:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10438:   //BGT.W <label>                                   |-|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}
 10439:   //BNLE.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
 10440:   //JBGT.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
 10441:   //JBNLE.W <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_000_000-{offset}        [BGT.W <label>]
 10442:   //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)
 10443:   //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
 10444:   //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
 10445:   //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_sss_sss (s is not equal to 0)   [BGT.S <label>]
 10446:   //JBLE.L <label>                                  |A|012346|-|-***-|-----|          |0110_111_000_000_110-0100111011111001-{address}      [BGT.S (*)+8;JMP <label>]
 10447:   //JBNGT.L <label>                                 |A|012346|-|-***-|-----|          |0110_111_000_000_110-0100111011111001-{address}      [BGT.S (*)+8;JMP <label>]
 10448:   public static void irpBgtsw () throws M68kException {
 10449:     if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10450:       XEiJ.mpuCycleCount += 10;
 10451:       int t = XEiJ.regPC;  //pc0+2
 10452:       int s = (byte) XEiJ.regOC;  //オフセット
 10453:       if (s == 0) {  //Bcc.Wでジャンプ
 10454:         XEiJ.regPC = t + 2;
 10455:         s = XEiJ.busRwse (t);  //pcws
 10456:       } else {  //Bcc.Sでジャンプ
 10457:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10458:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10459:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10460:           //! 軽量化。リードを省略する
 10461:         } else {
 10462:           XEiJ.busRwse (t);  //pcws
 10463:         }
 10464:       }
 10465:       irpSetPC (t + s);  //pc0+2+オフセット
 10466:     } else if (XEiJ.regOC == 0x6e00) {  //Bcc.Wで通過
 10467:       XEiJ.mpuCycleCount += 12;
 10468:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10469:         //リードを省略する
 10470:       } else {
 10471:         XEiJ.busRws (XEiJ.regPC);
 10472:       }
 10473:       XEiJ.regPC += 2;
 10474:     } else {  //Bcc.Sで通過
 10475:       XEiJ.mpuCycleCount += 8;
 10476:     }
 10477:   }  //irpBgtsw
 10478: 
 10479:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10480:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10481:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10482:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10483:   //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_001_sss_sss
 10484:   //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
 10485:   //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
 10486:   //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_001_sss_sss [BGT.S <label>]
 10487:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10488:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10489:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10490:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10491:   //BGT.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_010_sss_sss
 10492:   //BNLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
 10493:   //JBGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
 10494:   //JBNLE.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_010_sss_sss [BGT.S <label>]
 10495:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10496:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10497:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10498:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10499:   //BGT.S <label>                                   |-|01----|-|-***-|-----|          |0110_111_011_sss_sss
 10500:   //BNLE.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
 10501:   //JBGT.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
 10502:   //JBNLE.S <label>                                 |A|01----|-|-***-|-----|          |0110_111_011_sss_sss [BGT.S <label>]
 10503:   public static void irpBgts () throws M68kException {
 10504:     if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10505:       XEiJ.mpuCycleCount += 10;
 10506:       int t = XEiJ.regPC;  //pc0+2
 10507:       int s = (byte) XEiJ.regOC;  //オフセット
 10508:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10509:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10510:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10511:         //! 軽量化。リードを省略する
 10512:       } else {
 10513:         XEiJ.busRwse (t);  //pcws
 10514:       }
 10515:       irpSetPC (t + s);  //pc0+2+オフセット
 10516:     } else {  //Bcc.Sで通過
 10517:       XEiJ.mpuCycleCount += 8;
 10518:     }
 10519:   }  //irpBgts
 10520: 
 10521:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10522:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10523:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10524:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10525:   //BLE.W <label>                                   |-|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}
 10526:   //BNGT.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
 10527:   //JBLE.W <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
 10528:   //JBNGT.W <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_000_000-{offset}        [BLE.W <label>]
 10529:   //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)
 10530:   //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
 10531:   //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
 10532:   //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_sss_sss (s is not equal to 0)   [BLE.S <label>]
 10533:   //JBGT.L <label>                                  |A|012346|-|-***-|-----|          |0110_111_100_000_110-0100111011111001-{address}      [BLE.S (*)+8;JMP <label>]
 10534:   //JBNLE.L <label>                                 |A|012346|-|-***-|-----|          |0110_111_100_000_110-0100111011111001-{address}      [BLE.S (*)+8;JMP <label>]
 10535:   public static void irpBlesw () throws M68kException {
 10536:     if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10537:       XEiJ.mpuCycleCount += 10;
 10538:       int t = XEiJ.regPC;  //pc0+2
 10539:       int s = (byte) XEiJ.regOC;  //オフセット
 10540:       if (s == 0) {  //Bcc.Wでジャンプ
 10541:         XEiJ.regPC = t + 2;
 10542:         s = XEiJ.busRwse (t);  //pcws
 10543:       } else {  //Bcc.Sでジャンプ
 10544:         //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10545:         //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10546:         if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10547:           //! 軽量化。リードを省略する
 10548:         } else {
 10549:           XEiJ.busRwse (t);  //pcws
 10550:         }
 10551:       }
 10552:       irpSetPC (t + s);  //pc0+2+オフセット
 10553:     } else if (XEiJ.regOC == 0x6f00) {  //Bcc.Wで通過
 10554:       XEiJ.mpuCycleCount += 12;
 10555:       if (XEiJ.MPU_OMIT_OFFSET_READ) {
 10556:         //リードを省略する
 10557:       } else {
 10558:         XEiJ.busRws (XEiJ.regPC);
 10559:       }
 10560:       XEiJ.regPC += 2;
 10561:     } else {  //Bcc.Sで通過
 10562:       XEiJ.mpuCycleCount += 8;
 10563:     }
 10564:   }  //irpBlesw
 10565: 
 10566:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10567:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10568:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10569:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10570:   //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_101_sss_sss
 10571:   //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
 10572:   //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
 10573:   //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_101_sss_sss [BLE.S <label>]
 10574:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10575:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10576:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10577:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10578:   //BLE.S <label>                                   |-|012346|-|-***-|-----|          |0110_111_110_sss_sss
 10579:   //BNGT.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
 10580:   //JBLE.S <label>                                  |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
 10581:   //JBNGT.S <label>                                 |A|012346|-|-***-|-----|          |0110_111_110_sss_sss [BLE.S <label>]
 10582:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10583:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10584:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10585:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10586:   //BLE.S <label>                                   |-|01----|-|-***-|-----|          |0110_111_111_sss_sss
 10587:   //BNGT.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
 10588:   //JBLE.S <label>                                  |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
 10589:   //JBNGT.S <label>                                 |A|01----|-|-***-|-----|          |0110_111_111_sss_sss [BLE.S <label>]
 10590:   public static void irpBles () throws M68kException {
 10591:     if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) {  //Bccでジャンプ
 10592:       XEiJ.mpuCycleCount += 10;
 10593:       int t = XEiJ.regPC;  //pc0+2
 10594:       int s = (byte) XEiJ.regOC;  //オフセット
 10595:       //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする
 10596:       //  2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る
 10597:       if (XEiJ.MPU_OMIT_EXTRA_READ) {
 10598:         //! 軽量化。リードを省略する
 10599:       } else {
 10600:         XEiJ.busRwse (t);  //pcws
 10601:       }
 10602:       irpSetPC (t + s);  //pc0+2+オフセット
 10603:     } else {  //Bcc.Sで通過
 10604:       XEiJ.mpuCycleCount += 8;
 10605:     }
 10606:   }  //irpBles
 10607: 
 10608:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10609:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10610:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10611:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10612:   //IOCS <name>                                     |A|012346|-|UUUUU|UUUUU|          |0111_000_0dd_ddd_ddd-0100111001001111        [MOVEQ.L #<data>,D0;TRAP #15]
 10613:   //MOVEQ.L #<data>,Dq                              |-|012346|-|-UUUU|-**00|          |0111_qqq_0dd_ddd_ddd
 10614:   public static void irpMoveq () throws M68kException {
 10615:     XEiJ.mpuCycleCount += 4;
 10616:     int z;
 10617:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = (byte) XEiJ.regOC;
 10618:     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
 10619:   }  //irpMoveq
 10620: 
 10621:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10622:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10623:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10624:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10625:   //MVS.B <ea>,Dq                                   |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B)
 10626:   //
 10627:   //MVS.B <ea>,Dq
 10628:   //  バイトデータをロングに符号拡張してDqの全体を更新する
 10629:   public static void irpMvsByte () throws M68kException {
 10630:     XEiJ.mpuCycleCount += 4;
 10631:     int ea = XEiJ.regOC & 63;
 10632:     int z;
 10633:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
 10634:     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
 10635:   }  //irpMvsByte
 10636: 
 10637:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10638:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10639:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10640:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10641:   //MVS.W <ea>,Dq                                   |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B)
 10642:   //
 10643:   //MVS.W <ea>,Dq
 10644:   //  ワードデータをロングに符号拡張してDqの全体を更新する
 10645:   public static void irpMvsWord () throws M68kException {
 10646:     XEiJ.mpuCycleCount += 4;
 10647:     int ea = XEiJ.regOC & 63;
 10648:     int z;
 10649:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));
 10650:     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
 10651:   }  //irpMvsWord
 10652: 
 10653:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10654:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10655:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10656:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10657:   //MVZ.B <ea>,Dq                                   |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B)
 10658:   //
 10659:   //MVZ.B <ea>,Dq
 10660:   //  バイトデータをロングにゼロ拡張してDqの全体を更新する
 10661:   public static void irpMvzByte () throws M68kException {
 10662:     XEiJ.mpuCycleCount += 4;
 10663:     int ea = XEiJ.regOC & 63;
 10664:     int z;
 10665:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? 0xff & XEiJ.regRn[ea] : XEiJ.busRbz (efaAnyByte (ea));
 10666:     XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0);
 10667:   }  //irpMvzByte
 10668: 
 10669:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10670:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10671:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10672:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10673:   //MVZ.W <ea>,Dq                                   |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B)
 10674:   //
 10675:   //MVZ.W <ea>,Dq
 10676:   //  ワードデータをロングにゼロ拡張してDqの全体を更新する
 10677:   public static void irpMvzWord () throws M68kException {
 10678:     XEiJ.mpuCycleCount += 4;
 10679:     int ea = XEiJ.regOC & 63;
 10680:     int z;
 10681:     XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea));
 10682:     XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0);
 10683:   }  //irpMvzWord
 10684: 
 10685:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10686:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10687:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10688:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10689:   //OR.B <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr
 10690:   public static void irpOrToRegByte () throws M68kException {
 10691:     XEiJ.mpuCycleCount += 4;
 10692:     int ea = XEiJ.regOC & 63;
 10693:     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
 10694:   }  //irpOrToRegByte
 10695: 
 10696:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10697:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10698:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10699:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10700:   //OR.W <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr
 10701:   public static void irpOrToRegWord () throws M68kException {
 10702:     XEiJ.mpuCycleCount += 4;
 10703:     int ea = XEiJ.regOC & 63;
 10704:     int z = (short) (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)));  //0拡張してからOR
 10705:     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
 10706:   }  //irpOrToRegWord
 10707: 
 10708:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10709:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10710:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10711:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10712:   //OR.L <ea>,Dq                                    |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr
 10713:   public static void irpOrToRegLong () throws M68kException {
 10714:     int ea = XEiJ.regOC & 63;
 10715:     int qqq = XEiJ.regOC >> 9 & 7;
 10716:     int z;
 10717:     if (ea < XEiJ.EA_AR) {  //OR.L Dr,Dq
 10718:       XEiJ.mpuCycleCount += 8;
 10719:       XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.regRn[ea];
 10720:     } else {  //OR.L <mem>,Dq
 10721:       XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 10722:       XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.busRls (efaAnyLong (ea));
 10723:     }
 10724:     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
 10725:   }  //irpOrToRegLong
 10726: 
 10727:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10728:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10729:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10730:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10731:   //DIVU.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr
 10732:   //
 10733:   //DIVU.W <ea>,Dq
 10734:   //  M68000PRMでDIVU.Wのオーバーフローの条件が16bit符号あり整数と書かれているのは16bit符号なし整数の間違い
 10735:   public static void irpDivuWord () throws M68kException {
 10736:     //  X  変化しない
 10737:     //  N  ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア
 10738:     //  Z  ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア
 10739:     //  V  ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア
 10740:     //  C  常にクリア
 10741:     int ea = XEiJ.regOC & 63;
 10742:     int qqq = XEiJ.regOC >> 9 & 7;
 10743:     int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea));  //除数
 10744:     int x = XEiJ.regRn[qqq];  //被除数
 10745:     XEiJ.mpuCycleCount += irpDivuCyclesModified (x, y);
 10746:     if (y == 0) {  //ゼロ除算
 10747:       //Dqは変化しない
 10748:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10749:                      (x < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは被除数が負のときセット、さもなくばクリア
 10750:                      (x >> 16 == 0 ? XEiJ.REG_CCR_Z : 0) |  //Zは被除数が$0000xxxxのときセット、さもなくばクリア
 10751:                      XEiJ.REG_CCR_V  //Vは常にセット
 10752:                      );  //Cは常にクリア
 10753:       M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO;
 10754:       throw M68kException.m6eSignal;
 10755:     }
 10756:     //無理にintで符号なし除算をやろうとするよりもdoubleにキャストしてから割ったほうが速い
 10757:     //  intの除算をdoubleの除算器で行うプロセッサならばなおさら
 10758:     //被除数を符号なし32ビットとみなすためlongを経由してdoubleに変換する
 10759:     //doubleからlongやintへのキャストは小数点以下が切り捨てられ、オーバーフローは表現できる絶対値最大の値になる
 10760:     //doubleから直接intに戻しているので0xffffffff/0x0001=0xffffffffが絶対値最大の0x7fffffffになってしまうが、
 10761:     //DIVU.Wではオーバーフローになることに変わりはないのでよいことにする
 10762:     //  符号なし32ビットの0xffffffffにしたいときは戻すときもlongを経由すればよい
 10763:     int z = (int) ((double) ((long) x & 0xffffffffL) / (double) y);  //商
 10764:     if (z >>> 16 != 0) {  //オーバーフローあり
 10765:       //Dqは変化しない
 10766:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10767:                      (x < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは被除数が負のときセット、さもなくばクリア
 10768:                      //Zは常にクリア
 10769:                      XEiJ.REG_CCR_V  //Vは常にセット
 10770:                      );  //Cは常にクリア
 10771:     } else {  //オーバーフローなし
 10772:       XEiJ.regRn[qqq] = x - y * z << 16 | z;  //余り<<16|商
 10773:       z = (short) z;
 10774:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10775:                      (z < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは商が負のときセット、さもなくばクリア
 10776:                      (z == 0 ? XEiJ.REG_CCR_Z : 0)  //Zは商が0のときセット、さもなくばクリア
 10777:                      //Vは常にクリア
 10778:                      );  //Cは常にクリア
 10779:     }  //if オーバーフローあり/オーバーフローなし
 10780:   }  //irpDivuWord
 10781: 
 10782:   //DIVUの実行時間
 10783:   //  以下に実効アドレスの時間を加える
 10784:   //    ゼロ除算のとき38
 10785:   //    オーバーフローのとき10
 10786:   //    正常終了のとき76+
 10787:   //      商のビット15~1について
 10788:   //        被除数のビット16が1で商が1のとき0
 10789:   //        被除数のビット16が0で商が1のとき2
 10790:   //        被除数のビット16が0で商が0のとき4
 10791:   //  補足
 10792:   //    商のビット0を計算に含めると最大140になりマニュアルと一致する
 10793:   //  参考
 10794:   //    https://www.atari-forum.com/viewtopic.php?t=6484
 10795:   public static int irpDivuCyclesModified (int x, int y) {
 10796:     y &= 0xffff;  //ゼロ拡張
 10797:     if (y == 0) {  //ゼロ除算
 10798:       return 38;
 10799:     }
 10800:     int r = x >>> 16;  //余り。符号なし右シフト
 10801:     if (y <= r) {  //オーバーフロー
 10802:       return 10;
 10803:     }
 10804:     int c = 76;
 10805:     for (int i = 15; 0 < i; i--) {  //ビット0を含まない
 10806:       r = r << 1 | ((x >> i) & 1);
 10807:       if (0x10000 <= r) {  //被除数のビット16が1で商が1
 10808:         r -= y;
 10809:       } else if (y <= r) {  //被除数のビット16が0で商が1
 10810:         r -= y;
 10811:         c += 2;
 10812:       } else {  //被除数のビット16が0で商が0
 10813:         c += 4;
 10814:       }
 10815:     }
 10816:     return c;
 10817:   }
 10818: 
 10819:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10820:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10821:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10822:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10823:   //SBCD.B Dr,Dq                                    |-|012346|-|UUUUU|*U*U*|          |1000_qqq_100_000_rrr
 10824:   //SBCD.B -(Ar),-(Aq)                              |-|012346|-|UUUUU|*U*U*|          |1000_qqq_100_001_rrr
 10825:   //OR.B Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_100_mmm_rrr
 10826:   public static void irpOrToMemByte () throws M68kException {
 10827:     int ea = XEiJ.regOC & 63;
 10828:     if (ea >= XEiJ.EA_MM) {  //OR.B Dq,<ea>
 10829:       XEiJ.mpuCycleCount += 8;
 10830:       int a = efaMltByte (ea);
 10831:       int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRbs (a);
 10832:       XEiJ.busWb (a, z);
 10833:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
 10834:     } else if (ea < XEiJ.EA_AR) {  //SBCD.B Dr,Dq
 10835:       int qqq = XEiJ.regOC >> 9 & 7;
 10836:       XEiJ.mpuCycleCount += 6;
 10837:       int x;
 10838:       XEiJ.regRn[qqq] = ~0xff & (x = XEiJ.regRn[qqq]) | irpSbcd (x, XEiJ.regRn[ea]);
 10839:     } else {  //SBCD.B -(Ar),-(Aq)
 10840:       XEiJ.mpuCycleCount += 18;
 10841:       int y = XEiJ.busRbz (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 10842:       int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (64 - 8)];
 10843:       XEiJ.busWb (a, irpSbcd (XEiJ.busRbz (a), y));
 10844:     }
 10845:   }  //irpOrToMemByte
 10846: 
 10847:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10848:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10849:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10850:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10851:   //OR.W Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_101_mmm_rrr
 10852:   public static void irpOrToMemWord () throws M68kException {
 10853:     XEiJ.mpuCycleCount += 8;
 10854:     int ea = XEiJ.regOC & 63;
 10855:     int a = efaMltWord (ea);
 10856:     int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRws (a);
 10857:     XEiJ.busWw (a, z);
 10858:     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
 10859:   }  //irpOrToMemWord
 10860: 
 10861:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10862:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10863:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10864:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10865:   //OR.L Dq,<ea>                                    |-|012346|-|-UUUU|-**00|  M+-WXZ  |1000_qqq_110_mmm_rrr
 10866:   public static void irpOrToMemLong () throws M68kException {
 10867:     XEiJ.mpuCycleCount += 12;
 10868:     int ea = XEiJ.regOC & 63;
 10869:     int a = efaMltLong (ea);
 10870:     int z;
 10871:     XEiJ.busWl (a, z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRls (a));
 10872:     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
 10873:   }  //irpOrToMemLong
 10874: 
 10875:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10876:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10877:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10878:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10879:   //DIVS.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr
 10880:   //
 10881:   //DIVS.W <ea>,Dq
 10882:   //  DIVSの余りの符号は被除数と一致
 10883:   //  M68000PRMでDIVS.Wのアドレッシングモードがデータ可変と書かれているのはデータの間違い
 10884:   public static void irpDivsWord () throws M68kException {
 10885:     //  X  変化しない
 10886:     //  N  ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア
 10887:     //  Z  ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア
 10888:     //  V  ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア
 10889:     //  C  常にクリア
 10890:     //divsの余りの符号は被除数と一致
 10891:     //Javaの除算演算子の挙動
 10892:     //   10 /  3 ==  3   10 %  3 ==  1   10 =  3 *  3 +  1
 10893:     //   10 / -3 == -3   10 % -3 ==  1   10 = -3 * -3 +  1
 10894:     //  -10 /  3 == -3  -10 %  3 == -1  -10 =  3 * -3 + -1
 10895:     //  -10 / -3 ==  3  -10 % -3 == -1  -10 = -3 *  3 + -1
 10896:     int ea = XEiJ.regOC & 63;
 10897:     int qqq = XEiJ.regOC >> 9 & 7;
 10898:     int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //除数
 10899:     int x = XEiJ.regRn[qqq];  //被除数
 10900:     XEiJ.mpuCycleCount += irpDivsCycles (x, y);
 10901:     if (y == 0) {  //ゼロ除算
 10902:       //Dqは変化しない
 10903:       //!!! MC68030はゼロ除算のときオペランド以外の要因でZとVが変化する。その要因がわからないとZとVを正確に再現することができない
 10904:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10905:                      //Nは常にクリア
 10906:                      XEiJ.REG_CCR_Z |  //Zは常にセット
 10907:                      (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のときセット、さもなくば変化しない
 10908:                      );  //Cは常にクリア
 10909:       M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO;
 10910:       throw M68kException.m6eSignal;
 10911:     }
 10912:     int z = x / y;  //商
 10913:     if ((short) z != z) {  //オーバーフローあり
 10914:       //Dqは変化しない
 10915:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10916:                      (x == 0x80000000 || (z & 0xffff0080) == 0x00000080 || (z & 0xffff0080) == 0xffff0080 ? XEiJ.REG_CCR_N : 0) |  //Nは被除数が$80000000または商が$0000xxyyまたは$ffffxxyyでyyが負のときセット、さもなくばクリア
 10917:                      (z == 0x00008000 || (((z & 0xffff00ff) == 0x00000000 || (z & 0xffff00ff) == 0xffff0000) && (z & 0x0000ff00) != 0) ? XEiJ.REG_CCR_Z : 0) |  //Zは商が$00008000または商が$0000xxyyまたは$ffffxxyyでxxが0でなくてyyが0のときセット、さもなくばクリア
 10918:                      XEiJ.REG_CCR_V  //Vは常にセット
 10919:                      );  //Cは常にクリア
 10920:     } else {  //オーバーフローなし
 10921:       XEiJ.regRn[qqq] = x - y * z << 16 | (char) z;  //Dqは余り<<16|商&$ffff
 10922:       XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 10923:                      (z < 0 ? XEiJ.REG_CCR_N : 0) |  //Nは商が負のときセット、さもなくばクリア
 10924:                      (z == 0 ? XEiJ.REG_CCR_Z : 0)  //Zは商が0のときセット、さもなくばクリア
 10925:                      //Vは常にクリア
 10926:                      );  //Cは常にクリア
 10927:     }  //if オーバーフローあり/オーバーフローなし
 10928:   }  //irpDivsWord
 10929: 
 10930:   //DIVSの実行時間
 10931:   //  以下に実効アドレスの時間を加える
 10932:   //    ゼロ除算のとき38
 10933:   //    符号なしオーバーフローのとき
 10934:   //      被除数が正のとき16
 10935:   //      被除数が負のとき18
 10936:   //    正常終了または符号ありオーバーフローのとき
 10937:   //      被除数が正で除数が正のとき120+
 10938:   //      被除数が正で除数が負のとき122+
 10939:   //      被除数が負で除数が正のとき126+
 10940:   //      被除数が負で除数が負のとき124+
 10941:   //        符号なし商のビット15~1について
 10942:   //          符号なし商が1のとき0
 10943:   //          符号なし商が0のとき2
 10944:   //  補足
 10945:   //    符号なし商のビット0を計算に含めると最大158になりマニュアルと一致する
 10946:   //  参考
 10947:   //    https://www.atari-forum.com/viewtopic.php?t=6484
 10948:   public static int irpDivsCycles (int x, int y) {
 10949:     y = (short) y;  //符号拡張
 10950:     if (y == 0) {  //ゼロ除算
 10951:       return 38;
 10952:     }
 10953:     //符号あり除算だと0x80000000/0xffffffffが0x00000000になる環境があるので
 10954:     //符号なし除算を用いる。JavaはInteger.divideUnsigned
 10955:     //符号なし商に0x80000000が含まれることに注意
 10956:     int q = Integer.divideUnsigned ((x < 0 ? -x : x), (y < 0 ? -y : y));
 10957:     if ((q & 0xffff0000) != 0) {  //符号なしオーバーフロー。0xffff<qは不可
 10958:       return x < 0 ? 18 : 16;
 10959:     }
 10960:     int t = ~q;
 10961:     t = (t & 0x5554) + ((t >> 1) & 0x5555);  //0x5554に注意。ビット0を含まない
 10962:     t = (t & 0x3333) + ((t >> 2) & 0x3333);
 10963:     t = (t & 0x0F0F) + ((t >> 4) & 0x0F0F);
 10964:     t = (t & 0x00FF) + ((t >> 8) & 0x00FF);
 10965:     return (x < 0 ? y < 0 ? 124 : 126 : y < 0 ? 122 : 120) + (t << 1);
 10966:   }
 10967: 
 10968:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10969:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10970:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10971:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10972:   //SUB.B <ea>,Dq                                   |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr
 10973:   public static void irpSubToRegByte () throws M68kException {
 10974:     XEiJ.mpuCycleCount += 4;
 10975:     int ea = XEiJ.regOC & 63;
 10976:     int qqq = XEiJ.regOC >> 9 & 7;
 10977:     int x, y, z;
 10978:     y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
 10979:     x = XEiJ.regRn[qqq];
 10980:     z = x - y;
 10981:     XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 10982:     XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 10983:            ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V |
 10984:            (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_byte
 10985:   }  //irpSubToRegByte
 10986: 
 10987:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10988:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 10989:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 10990:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 10991:   //SUB.W <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr
 10992:   public static void irpSubToRegWord () throws M68kException {
 10993:     XEiJ.mpuCycleCount += 4;
 10994:     int ea = XEiJ.regOC & 63;
 10995:     int qqq = XEiJ.regOC >> 9 & 7;
 10996:     int x, y, z;
 10997:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 10998:     x = XEiJ.regRn[qqq];
 10999:     z = x - y;
 11000:     XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11001:     XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11002:            ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11003:            (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_word
 11004:   }  //irpSubToRegWord
 11005: 
 11006:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11007:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11008:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11009:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11010:   //SUB.L <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr
 11011:   public static void irpSubToRegLong () throws M68kException {
 11012:     int ea = XEiJ.regOC & 63;
 11013:     int qqq = XEiJ.regOC >> 9 & 7;
 11014:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 11015:     int x, y, z;
 11016:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11017:     x = XEiJ.regRn[qqq];
 11018:     z = x - y;
 11019:     XEiJ.regRn[qqq] = z;
 11020:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11021:            ((x ^ y) & (x ^ z)) >> 30 & XEiJ.REG_CCR_V |
 11022:            (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
 11023:   }  //irpSubToRegLong
 11024: 
 11025:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11026:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11027:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11028:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11029:   //SUBA.W <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr
 11030:   //SUB.W <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq]
 11031:   //CLR.W Ar                                        |A|012346|-|-----|-----| A        |1001_rrr_011_001_rrr [SUBA.W Ar,Ar]
 11032:   //
 11033:   //SUBA.W <ea>,Aq
 11034:   //  ソースを符号拡張してロングで減算する
 11035:   public static void irpSubaWord () throws M68kException {
 11036:     XEiJ.mpuCycleCount += 8;
 11037:     int ea = XEiJ.regOC & 63;
 11038:     int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11039:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z;  //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可
 11040:     //ccrは変化しない
 11041:   }  //irpSubaWord
 11042: 
 11043:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11044:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11045:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11046:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11047:   //SUBX.B Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_100_000_rrr
 11048:   //SUBX.B -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_100_001_rrr
 11049:   //SUB.B Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_100_mmm_rrr
 11050:   public static void irpSubToMemByte () throws M68kException {
 11051:     int ea = XEiJ.regOC & 63;
 11052:     int a, x, y, z;
 11053:     if (ea < XEiJ.EA_MM) {
 11054:       if (ea < XEiJ.EA_AR) {  //SUBX.B Dr,Dq
 11055:         int qqq = XEiJ.regOC >> 9 & 7;
 11056:         XEiJ.mpuCycleCount += 4;
 11057:         y = XEiJ.regRn[ea];
 11058:         x = XEiJ.regRn[qqq];
 11059:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11060:         XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 11061:       } else {  //SUBX.B -(Ar),-(Aq)
 11062:         XEiJ.mpuCycleCount += 18;
 11063:         y = XEiJ.busRbs (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 11064:         a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15];  //1qqq=aqq
 11065:         x = XEiJ.busRbs (a);
 11066:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11067:         XEiJ.busWb (a, z);
 11068:       }
 11069:       XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //SUBXはZをクリアすることはあるがセットすることはない
 11070:              ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11071:              (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subx_byte
 11072:     } else {  //SUB.B Dq,<ea>
 11073:       XEiJ.mpuCycleCount += 8;
 11074:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11075:       a = efaMltByte (ea);
 11076:       x = XEiJ.busRbs (a);
 11077:       z = x - y;
 11078:       XEiJ.busWb (a, z);
 11079:       XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 11080:              ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11081:              (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_byte
 11082:     }
 11083:   }  //irpSubToMemByte
 11084: 
 11085:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11086:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11087:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11088:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11089:   //SUBX.W Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_101_000_rrr
 11090:   //SUBX.W -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_101_001_rrr
 11091:   //SUB.W Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_101_mmm_rrr
 11092:   public static void irpSubToMemWord () throws M68kException {
 11093:     int ea = XEiJ.regOC & 63;
 11094:     int a, x, y, z;
 11095:     if (ea < XEiJ.EA_MM) {
 11096:       if (ea < XEiJ.EA_AR) {  //SUBX.W Dr,Dq
 11097:         int qqq = XEiJ.regOC >> 9 & 7;
 11098:         XEiJ.mpuCycleCount += 4;
 11099:         y = XEiJ.regRn[ea];
 11100:         x = XEiJ.regRn[qqq];
 11101:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11102:         XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11103:       } else {  //SUBX.W -(Ar),-(Aq)
 11104:         XEiJ.mpuCycleCount += 18;
 11105:         y = XEiJ.busRws (XEiJ.regRn[ea] -= 2);  //このr[ea]はアドレスレジスタ
 11106:         a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2;
 11107:         x = XEiJ.busRws (a);
 11108:         z = x - y - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11109:         XEiJ.busWw (a, z);
 11110:       }
 11111:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //ADDXはZをクリアすることはあるがセットすることはない
 11112:              ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11113:              (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subx_word
 11114:     } else {  //SUB.W Dq,<ea>
 11115:       XEiJ.mpuCycleCount += 8;
 11116:       y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11117:       a = efaMltWord (ea);
 11118:       x = XEiJ.busRws (a);
 11119:       z = x - y;
 11120:       XEiJ.busWw (a, z);
 11121:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11122:              ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11123:              (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub_word
 11124:     }
 11125:   }  //irpSubToMemWord
 11126: 
 11127:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11128:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11129:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11130:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11131:   //SUBX.L Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1001_qqq_110_000_rrr
 11132:   //SUBX.L -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1001_qqq_110_001_rrr
 11133:   //SUB.L Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1001_qqq_110_mmm_rrr
 11134:   public static void irpSubToMemLong () throws M68kException {
 11135:     int ea = XEiJ.regOC & 63;
 11136:     if (ea < XEiJ.EA_MM) {
 11137:       int x;
 11138:       int y;
 11139:       int z;
 11140:       if (ea < XEiJ.EA_AR) {  //SUBX.L Dr,Dq
 11141:         int qqq = XEiJ.regOC >> 9 & 7;
 11142:         XEiJ.mpuCycleCount += 8;
 11143:         XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) - (y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11144:       } else {  //SUBX.L -(Ar),-(Aq)
 11145:         XEiJ.mpuCycleCount += 30;
 11146:         y = XEiJ.busRls (XEiJ.regRn[ea] -= 4);  //このr[ea]はアドレスレジスタ
 11147:         int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4;
 11148:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y - (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
 11149:       }
 11150:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
 11151:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11152:              (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_subx
 11153:     } else {  //SUB.L Dq,<ea>
 11154:       XEiJ.mpuCycleCount += 12;
 11155:       int a = efaMltLong (ea);
 11156:       int x;
 11157:       int y;
 11158:       int z;
 11159:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]));
 11160:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11161:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11162:              (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_sub
 11163:     }
 11164:   }  //irpSubToMemLong
 11165: 
 11166:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11167:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11168:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11169:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11170:   //SUBA.L <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr
 11171:   //SUB.L <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq]
 11172:   //CLR.L Ar                                        |A|012346|-|-----|-----| A        |1001_rrr_111_001_rrr [SUBA.L Ar,Ar]
 11173:   public static void irpSubaLong () throws M68kException {
 11174:     int ea = XEiJ.regOC & 63;
 11175:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //Dr/Ar/#<data>のとき8+、それ以外は6+
 11176:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11177:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z;  //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可
 11178:     //ccrは変化しない
 11179:   }  //irpSubaLong
 11180: 
 11181:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11182:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11183:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11184:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11185:   //SXCALL <name>                                   |A|012346|-|UUUUU|*****|          |1010_0dd_ddd_ddd_ddd [ALINE #<data>]
 11186:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11187:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11188:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11189:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11190:   //ALINE #<data>                                   |-|012346|-|UUUUU|*****|          |1010_ddd_ddd_ddd_ddd (line 1010 emulator)
 11191:   public static void irpAline () throws M68kException {
 11192:     XEiJ.mpuCycleCount += 34;
 11193:     if (XEiJ.MPU_INLINE_EXCEPTION) {
 11194:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
 11195:       int sp = XEiJ.regRn[15];
 11196:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
 11197:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 11198:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 11199:         XEiJ.mpuUSP = sp;  //USPを保存
 11200:         sp = XEiJ.mpuISP;  //SSPを復元
 11201:         if (DataBreakPoint.DBP_ON) {
 11202:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 11203:         } else {
 11204:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 11205:         }
 11206:         if (InstructionBreakPoint.IBP_ON) {
 11207:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 11208:         }
 11209:       }
 11210:       int vectorOffset = M68kException.M6E_LINE_1010_EMULATOR << 2;  //vector offset
 11211:       XEiJ.regRn[15] = sp -= 8;  //short format
 11212:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 11213:       XEiJ.busWl (sp + 2, XEiJ.regPC0);  //program counter
 11214:       XEiJ.busWw (sp, save_sr);  //status register
 11215:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 11216:     } else {
 11217:       irpException (M68kException.M6E_LINE_1010_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは命令の先頭
 11218:     }
 11219:   }  //irpAline
 11220: 
 11221:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11222:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11223:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11224:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11225:   //CMP.B <ea>,Dq                                   |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr
 11226:   public static void irpCmpByte () throws M68kException {
 11227:     XEiJ.mpuCycleCount += 4;
 11228:     int ea = XEiJ.regOC & 63;
 11229:     int x;
 11230:     int y;
 11231:     int z = (byte) ((x = (byte) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))));
 11232:     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) |
 11233:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11234:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11235:   }  //irpCmpByte
 11236: 
 11237:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11238:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11239:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11240:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11241:   //CMP.W <ea>,Dq                                   |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr
 11242:   public static void irpCmpWord () throws M68kException {
 11243:     XEiJ.mpuCycleCount += 4;
 11244:     int ea = XEiJ.regOC & 63;
 11245:     int x;
 11246:     int y;
 11247:     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]はデータレジスタまたはアドレスレジスタ
 11248:     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) |
 11249:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11250:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11251:   }  //irpCmpWord
 11252: 
 11253:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11254:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11255:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11256:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11257:   //CMP.L <ea>,Dq                                   |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr
 11258:   public static void irpCmpLong () throws M68kException {
 11259:     XEiJ.mpuCycleCount += 6;
 11260:     int ea = XEiJ.regOC & 63;
 11261:     int x;
 11262:     int y;
 11263:     int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11264:     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) |
 11265:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11266:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11267:   }  //irpCmpLong
 11268: 
 11269:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11270:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11271:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11272:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11273:   //CMPA.W <ea>,Aq                                  |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr
 11274:   //CMP.W <ea>,Aq                                   |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq]
 11275:   //
 11276:   //CMPA.W <ea>,Aq
 11277:   //  ソースを符号拡張してロングで比較する
 11278:   public static void irpCmpaWord () throws M68kException {
 11279:     XEiJ.mpuCycleCount += 6;
 11280:     int ea = XEiJ.regOC & 63;
 11281:     //ソースを符号拡張してからロングで比較する
 11282:     int y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11283:     int x;
 11284:     int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y;
 11285:     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) |
 11286:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11287:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11288:   }  //irpCmpaWord
 11289: 
 11290:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11291:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11292:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11293:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11294:   //EOR.B Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_100_mmm_rrr
 11295:   //CMPM.B (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_100_001_rrr
 11296:   public static void irpEorByte () throws M68kException {
 11297:     int ea = XEiJ.regOC & 63;
 11298:     if (ea >> 3 == XEiJ.MMM_AR) {  //CMPM.B (Ar)+,(Aq)+
 11299:       XEiJ.mpuCycleCount += 12;
 11300:       int y = XEiJ.busRbs (XEiJ.regRn[ea]++);  //このr[ea]はアドレスレジスタ
 11301:       int x;
 11302:       int z = (byte) ((x = XEiJ.busRbs (XEiJ.regRn[XEiJ.regOC >> 9 & 15]++)) - y);
 11303:       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) |
 11304:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11305:              (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11306:     } else {
 11307:       int qqq = XEiJ.regOC >> 9 & 7;
 11308:       int z;
 11309:       if (ea < XEiJ.EA_AR) {  //EOR.B Dq,Dr
 11310:         XEiJ.mpuCycleCount += 4;
 11311:         z = XEiJ.regRn[ea] ^= 255 & XEiJ.regRn[qqq];  //0拡張してからEOR
 11312:       } else {  //EOR.B Dq,<mem>
 11313:         XEiJ.mpuCycleCount += 8;
 11314:         int a = efaMltByte (ea);
 11315:         XEiJ.busWb (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRbs (a));
 11316:       }
 11317:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
 11318:     }
 11319:   }  //irpEorByte
 11320: 
 11321:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11322:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11323:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11324:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11325:   //EOR.W Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_101_mmm_rrr
 11326:   //CMPM.W (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_101_001_rrr
 11327:   public static void irpEorWord () throws M68kException {
 11328:     int ea = XEiJ.regOC & 63;
 11329:     int rrr = XEiJ.regOC & 7;
 11330:     int mmm = ea >> 3;
 11331:     if (mmm == XEiJ.MMM_AR) {  //CMPM.W (Ar)+,(Aq)+
 11332:       XEiJ.mpuCycleCount += 12;
 11333:       int y = XEiJ.busRws ((XEiJ.regRn[ea] += 2) - 2);  //このr[ea]はアドレスレジスタ
 11334:       int x;
 11335:       int z = (short) ((x = XEiJ.busRws ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2)) - y);
 11336:       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) |
 11337:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11338:              (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11339:     } else {
 11340:       int qqq = XEiJ.regOC >> 9 & 7;
 11341:       int z;
 11342:       if (ea < XEiJ.EA_AR) {  //EOR.W Dq,Dr
 11343:         XEiJ.mpuCycleCount += 4;
 11344:         z = XEiJ.regRn[rrr] ^= (char) XEiJ.regRn[qqq];  //0拡張してからEOR
 11345:       } else {  //EOR.W Dq,<mem>
 11346:         XEiJ.mpuCycleCount += 8;
 11347:         int a = efaMltWord (ea);
 11348:         XEiJ.busWw (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRws (a));
 11349:       }
 11350:       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
 11351:     }
 11352:   }  //irpEorWord
 11353: 
 11354:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11355:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11356:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11357:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11358:   //EOR.L Dq,<ea>                                   |-|012346|-|-UUUU|-**00|D M+-WXZ  |1011_qqq_110_mmm_rrr
 11359:   //CMPM.L (Ar)+,(Aq)+                              |-|012346|-|-UUUU|-****|          |1011_qqq_110_001_rrr
 11360:   public static void irpEorLong () throws M68kException {
 11361:     int ea = XEiJ.regOC & 63;
 11362:     if (ea >> 3 == XEiJ.MMM_AR) {  //CMPM.L (Ar)+,(Aq)+
 11363:       XEiJ.mpuCycleCount += 20;
 11364:       int y = XEiJ.busRls ((XEiJ.regRn[ea] += 4) - 4);  //このr[ea]はアドレスレジスタ
 11365:       int x;
 11366:       int z = (x = XEiJ.busRls ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 4) - 4)) - y;
 11367:       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) |
 11368:              ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11369:              (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11370:     } else {
 11371:       int qqq = XEiJ.regOC >> 9 & 7;
 11372:       int z;
 11373:       if (ea < XEiJ.EA_AR) {  //EOR.L Dq,Dr
 11374:         XEiJ.mpuCycleCount += 8;
 11375:         XEiJ.regRn[ea] = z = XEiJ.regRn[ea] ^ XEiJ.regRn[qqq];
 11376:       } else {  //EOR.L Dq,<mem>
 11377:         XEiJ.mpuCycleCount += 12;
 11378:         int a = efaMltLong (ea);
 11379:         XEiJ.busWl (a, z = XEiJ.busRls (a) ^ XEiJ.regRn[qqq]);
 11380:       }
 11381:       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
 11382:     }
 11383:   }  //irpEorLong
 11384: 
 11385:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11386:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11387:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11388:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11389:   //CMPA.L <ea>,Aq                                  |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr
 11390:   //CMP.L <ea>,Aq                                   |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq]
 11391:   public static void irpCmpaLong () throws M68kException {
 11392:     XEiJ.mpuCycleCount += 6;
 11393:     int ea = XEiJ.regOC & 63;
 11394:     int y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11395:     int x;
 11396:     int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y;
 11397:     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) |
 11398:            ((x ^ y) & (x ^ z)) >>> 31 << 1 |
 11399:            (x & (y ^ z) ^ (y | z)) >>> 31);  //ccr_cmp
 11400:   }  //irpCmpaLong
 11401: 
 11402:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11403:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11404:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11405:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11406:   //AND.B <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr
 11407:   public static void irpAndToRegByte () throws M68kException {
 11408:     XEiJ.mpuCycleCount += 4;
 11409:     int ea = XEiJ.regOC & 63;
 11410:     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
 11411:   }  //irpAndToRegByte
 11412: 
 11413:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11414:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11415:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11416:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11417:   //AND.W <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr
 11418:   public static void irpAndToRegWord () throws M68kException {
 11419:     XEiJ.mpuCycleCount += 4;
 11420:     int ea = XEiJ.regOC & 63;
 11421:     int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~65535 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)));  //1拡張してからAND
 11422:     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
 11423:   }  //irpAndToRegWord
 11424: 
 11425:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11426:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11427:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11428:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11429:   //AND.L <ea>,Dq                                   |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr
 11430:   public static void irpAndToRegLong () throws M68kException {
 11431:     int ea = XEiJ.regOC & 63;
 11432:     int qqq = XEiJ.regOC >> 9 & 7;
 11433:     int z;
 11434:     if (ea < XEiJ.EA_AR) {  //AND.L Dr,Dq
 11435:       XEiJ.mpuCycleCount += 8;
 11436:       z = XEiJ.regRn[qqq] &= XEiJ.regRn[ea];
 11437:     } else {  //AND.L <mem>,Dq
 11438:       XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 11439:       z = XEiJ.regRn[qqq] &= XEiJ.busRls (efaAnyLong (ea));
 11440:     }
 11441:     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
 11442:   }  //irpAndToRegLong
 11443: 
 11444:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11445:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11446:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11447:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11448:   //MULU.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr
 11449:   public static void irpMuluWord () throws M68kException {
 11450:     int ea = XEiJ.regOC & 63;
 11451:     int qqq = XEiJ.regOC >> 9 & 7;
 11452:     int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea));
 11453:     //muluの所要サイクル数は38+2n
 11454:     //nはソースに含まれる1の数
 11455:     int s = y & 0x5555;
 11456:     s += y - s >> 1;
 11457:     int t = s & 0x3333;
 11458:     t += s - t >> 2;
 11459:     t += t >> 4;
 11460:     XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1);  //38+2n
 11461:     //XEiJ.mpuCycleCount += 38 + (Integer.bitCount (y) << 1);  //少し遅くなる
 11462:     int z;
 11463:     XEiJ.regRn[qqq] = z = (char) XEiJ.regRn[qqq] * y;  //積の下位32ビット。オーバーフローは無視
 11464:     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
 11465:   }  //irpMuluWord
 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:   //ABCD.B Dr,Dq                                    |-|012346|-|UUUUU|*U*U*|          |1100_qqq_100_000_rrr
 11472:   //ABCD.B -(Ar),-(Aq)                              |-|012346|-|UUUUU|*U*U*|          |1100_qqq_100_001_rrr
 11473:   //AND.B Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_100_mmm_rrr
 11474:   public static void irpAndToMemByte () throws M68kException {
 11475:     int ea = XEiJ.regOC & 63;
 11476:     if (ea >= XEiJ.EA_MM) {  //AND.B Dq,<ea>
 11477:       XEiJ.mpuCycleCount += 8;
 11478:       int a = efaMltByte (ea);
 11479:       int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRbs (a);
 11480:       XEiJ.busWb (a, z);
 11481:       XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z];  //ccr_tst_byte
 11482:     } else if (ea < XEiJ.EA_AR) {  //ABCD.B Dr,Dq
 11483:       int qqq = XEiJ.regOC >> 9 & 7;
 11484:       XEiJ.mpuCycleCount += 6;
 11485:       XEiJ.regRn[qqq] = ~0xff & XEiJ.regRn[qqq] | irpAbcd (XEiJ.regRn[qqq], XEiJ.regRn[ea]);
 11486:     } else {  //ABCD.B -(Ar),-(Aq)
 11487:       XEiJ.mpuCycleCount += 18;
 11488:       int y = XEiJ.busRbz (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 11489:       int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (96 - 8)];
 11490:       XEiJ.busWb (a, irpAbcd (XEiJ.busRbz (a), y));
 11491:     }
 11492:   }  //irpAndToMemByte
 11493: 
 11494:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11495:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11496:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11497:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11498:   //EXG.L Dq,Dr                                     |-|012346|-|-----|-----|          |1100_qqq_101_000_rrr
 11499:   //EXG.L Aq,Ar                                     |-|012346|-|-----|-----|          |1100_qqq_101_001_rrr
 11500:   //AND.W Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_101_mmm_rrr
 11501:   public static void irpAndToMemWord () throws M68kException {
 11502:     int ea = XEiJ.regOC & 63;
 11503:     if (ea < XEiJ.EA_MM) {  //EXG
 11504:       XEiJ.mpuCycleCount += 6;
 11505:       if (ea < XEiJ.EA_AR) {  //EXG.L Dq,Dr
 11506:         int qqq = XEiJ.regOC >> 9 & 7;
 11507:         int t = XEiJ.regRn[qqq];
 11508:         XEiJ.regRn[qqq] = XEiJ.regRn[ea];
 11509:         XEiJ.regRn[ea] = t;
 11510:       } else {  //EXG.L Aq,Ar
 11511:         int aqq = (XEiJ.regOC >> 9) - (96 - 8);
 11512:         int t = XEiJ.regRn[aqq];
 11513:         XEiJ.regRn[aqq] = XEiJ.regRn[ea];  //このr[ea]アドレスレジスタ
 11514:         XEiJ.regRn[ea] = t;  //このr[ea]はアドレスレジスタ
 11515:       }
 11516:     } else {  //AND.W Dq,<ea>
 11517:       XEiJ.mpuCycleCount += 8;
 11518:       int a = efaMltWord (ea);
 11519:       int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRws (a);
 11520:       XEiJ.busWw (a, z);
 11521:       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
 11522:     }
 11523:   }  //irpAndToMemWord
 11524: 
 11525:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11526:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11527:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11528:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11529:   //EXG.L Dq,Ar                                     |-|012346|-|-----|-----|          |1100_qqq_110_001_rrr
 11530:   //AND.L Dq,<ea>                                   |-|012346|-|-UUUU|-**00|  M+-WXZ  |1100_qqq_110_mmm_rrr
 11531:   public static void irpAndToMemLong () throws M68kException {
 11532:     int ea = XEiJ.regOC & 63;
 11533:     int qqq = XEiJ.regOC >> 9 & 7;
 11534:     if (ea >> 3 == XEiJ.MMM_AR) {  //EXG.L Dq,Ar
 11535:       XEiJ.mpuCycleCount += 6;
 11536:       int t = XEiJ.regRn[qqq];
 11537:       XEiJ.regRn[qqq] = XEiJ.regRn[ea];  //このr[ea]はアドレスレジスタ
 11538:       XEiJ.regRn[ea] = t;  //このr[ea]はアドレスレジスタ
 11539:     } else {  //AND.L Dq,<ea>
 11540:       XEiJ.mpuCycleCount += 12;
 11541:       int a = efaMltLong (ea);
 11542:       int z;
 11543:       XEiJ.busWl (a, z = XEiJ.busRls (a) & XEiJ.regRn[qqq]);
 11544:       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
 11545:     }
 11546:   }  //irpAndToMemLong
 11547: 
 11548:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11549:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11550:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11551:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11552:   //MULS.W <ea>,Dq                                  |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr
 11553:   public static void irpMulsWord () throws M68kException {
 11554:     int ea = XEiJ.regOC & 63;
 11555:     int qqq = XEiJ.regOC >> 9 & 7;
 11556:     int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));
 11557:     int t = y << 1 ^ y;  //右側が1である0と右側が0または末尾である1は1、それ以外は0。ソースは符号拡張されているので上位16ビットはすべて0
 11558:     //mulsの所要サイクル数は38+2n
 11559:     //nはソースの末尾に0を付け加えた17ビットに含まれる10または01の数
 11560:     int s = t & 0x5555;
 11561:     s += t - s >> 1;
 11562:     t = s & 0x3333;
 11563:     t += s - t >> 2;
 11564:     t += t >> 4;
 11565:     XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1);  //38+2n
 11566:     int z;
 11567:     XEiJ.regRn[qqq] = z = (short) XEiJ.regRn[qqq] * y;  //積の下位32ビット。オーバーフローは無視
 11568:     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
 11569:   }  //irpMulsWord
 11570: 
 11571:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11572:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11573:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11574:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11575:   //ADD.B <ea>,Dq                                   |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr
 11576:   public static void irpAddToRegByte () throws M68kException {
 11577:     XEiJ.mpuCycleCount += 4;
 11578:     int ea = XEiJ.regOC & 63;
 11579:     int qqq = XEiJ.regOC >> 9 & 7;
 11580:     int x, y, z;
 11581:     y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea));
 11582:     x = XEiJ.regRn[qqq];
 11583:     z = x + y;
 11584:     XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 11585:     XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 11586:            ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11587:            (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_byte
 11588:   }  //irpAddToRegByte
 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:   //ADD.W <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr
 11595:   public static void irpAddToRegWord () throws M68kException {
 11596:     XEiJ.mpuCycleCount += 4;
 11597:     int ea = XEiJ.regOC & 63;
 11598:     int qqq = XEiJ.regOC >> 9 & 7;
 11599:     int x, y, z;
 11600:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11601:     x = XEiJ.regRn[qqq];
 11602:     z = x + y;
 11603:     XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11604:     XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11605:            ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11606:            (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_word
 11607:   }  //irpAddToRegWord
 11608: 
 11609:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11610:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11611:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11612:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11613:   //ADD.L <ea>,Dq                                   |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr
 11614:   public static void irpAddToRegLong () throws M68kException {
 11615:     int ea = XEiJ.regOC & 63;
 11616:     int qqq = XEiJ.regOC >> 9 & 7;
 11617:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //ソースが#<data>のとき2増やす
 11618:     int x, y, z;
 11619:     y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ
 11620:     x = XEiJ.regRn[qqq];
 11621:     z = x + y;
 11622:     XEiJ.regRn[qqq] = z;
 11623:     XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11624:            ((x ^ z) & (y ^ z)) >> 30 & XEiJ.REG_CCR_V |
 11625:            ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
 11626:   }  //irpAddToRegLong
 11627: 
 11628:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11629:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11630:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11631:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11632:   //ADDA.W <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr
 11633:   //ADD.W <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq]
 11634:   //
 11635:   //ADDA.W <ea>,Aq
 11636:   //  ソースを符号拡張してロングで加算する
 11637:   public static void irpAddaWord () throws M68kException {
 11638:     XEiJ.mpuCycleCount += 8;
 11639:     int ea = XEiJ.regOC & 63;
 11640:     int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11641:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z;  //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可
 11642:     //ccrは変化しない
 11643:   }  //irpAddaWord
 11644: 
 11645:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11646:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11647:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11648:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11649:   //ADDX.B Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_100_000_rrr
 11650:   //ADDX.B -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_100_001_rrr
 11651:   //ADD.B Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_100_mmm_rrr
 11652:   public static void irpAddToMemByte () throws M68kException {
 11653:     int ea = XEiJ.regOC & 63;
 11654:     int a, x, y, z;
 11655:     if (ea < XEiJ.EA_MM) {
 11656:       if (ea < XEiJ.EA_AR) {  //ADDX.B Dr,Dq
 11657:         int qqq = XEiJ.regOC >> 9 & 7;
 11658:         XEiJ.mpuCycleCount += 4;
 11659:         y = XEiJ.regRn[ea];
 11660:         x = XEiJ.regRn[qqq];
 11661:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11662:         XEiJ.regRn[qqq] = ~255 & x | 255 & z;
 11663:       } else {  //ADDX.B -(Ar),-(Aq)
 11664:         XEiJ.mpuCycleCount += 18;
 11665:         y = XEiJ.busRbs (--XEiJ.regRn[ea]);  //このr[ea]はアドレスレジスタ
 11666:         a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15];  //1qqq=aqq
 11667:         x = XEiJ.busRbs (a);
 11668:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11669:         XEiJ.busWb (a, z);
 11670:       }
 11671:       XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //ADDXはZをクリアすることはあるがセットすることはない
 11672:              ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11673:              (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addx_byte
 11674:     } else {  //ADD.B Dq,<ea>
 11675:       XEiJ.mpuCycleCount += 8;
 11676:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11677:       a = efaMltByte (ea);
 11678:       x = XEiJ.busRbs (a);
 11679:       z = x + y;
 11680:       XEiJ.busWb (a, z);
 11681:       XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] |
 11682:              ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V |
 11683:              (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_byte
 11684:     }
 11685:   }  //irpAddToMemByte
 11686: 
 11687:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11688:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11689:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11690:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11691:   //ADDX.W Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_101_000_rrr
 11692:   //ADDX.W -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_101_001_rrr
 11693:   //ADD.W Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_101_mmm_rrr
 11694:   public static void irpAddToMemWord () throws M68kException {
 11695:     int ea = XEiJ.regOC & 63;
 11696:     int a, x, y, z;
 11697:     if (ea < XEiJ.EA_MM) {
 11698:       if (ea < XEiJ.EA_AR) {  //ADDX.W Dr,Dq
 11699:         int qqq = XEiJ.regOC >> 9 & 7;
 11700:         XEiJ.mpuCycleCount += 4;
 11701:         y = XEiJ.regRn[ea];
 11702:         x = XEiJ.regRn[qqq];
 11703:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11704:         XEiJ.regRn[qqq] = ~65535 & x | (char) z;
 11705:       } else {  //ADDX.W -(Ar),-(Aq)
 11706:         XEiJ.mpuCycleCount += 18;
 11707:         y = XEiJ.busRws (XEiJ.regRn[ea] -= 2);  //このr[ea]はアドレスレジスタ
 11708:         a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2;
 11709:         x = XEiJ.busRws (a);
 11710:         z = x + y + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11711:         XEiJ.busWw (a, z);
 11712:       }
 11713:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z |  //ADDXはZをクリアすることはあるがセットすることはない
 11714:              ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11715:              (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addx_word
 11716:     } else {  //ADD.W Dq,<ea>
 11717:       XEiJ.mpuCycleCount += 8;
 11718:       a = efaMltWord (ea);
 11719:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7];
 11720:       x = XEiJ.busRws (a);
 11721:       z = x + y;
 11722:       XEiJ.busWw (a, z);
 11723:       XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z |
 11724:              ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V |
 11725:              (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add_word
 11726:     }
 11727:   }  //irpAddToMemWord
 11728: 
 11729:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11730:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11731:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11732:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11733:   //ADDX.L Dr,Dq                                    |-|012346|-|*UUUU|*****|          |1101_qqq_110_000_rrr
 11734:   //ADDX.L -(Ar),-(Aq)                              |-|012346|-|*UUUU|*****|          |1101_qqq_110_001_rrr
 11735:   //ADD.L Dq,<ea>                                   |-|012346|-|UUUUU|*****|  M+-WXZ  |1101_qqq_110_mmm_rrr
 11736:   public static void irpAddToMemLong () throws M68kException {
 11737:     int ea = XEiJ.regOC & 63;
 11738:     if (ea < XEiJ.EA_MM) {
 11739:       int x;
 11740:       int y;
 11741:       int z;
 11742:       if (ea < XEiJ.EA_AR) {  //ADDX.L Dr,Dq
 11743:         int qqq = XEiJ.regOC >> 9 & 7;
 11744:         XEiJ.mpuCycleCount += 8;
 11745:         XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) + (y = XEiJ.regRn[ea]) + (XEiJ.regCCR >> 4);  //Xの左側はすべて0なのでCCR_X&を省略
 11746:       } else {  //ADDX.L -(Ar),-(Aq)
 11747:         XEiJ.mpuCycleCount += 30;
 11748:         y = XEiJ.busRls (XEiJ.regRn[ea] -= 4);  //このr[ea]はアドレスレジスタ
 11749:         int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4;
 11750:         XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y + (XEiJ.regCCR >> 4));  //Xの左側はすべて0なのでCCR_X&を省略
 11751:       }
 11752:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) |
 11753:              ((x ^ z) & (y ^ z)) >>> 31 << 1 |
 11754:              ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_addx
 11755:     } else {  //ADD.L Dq,<ea>
 11756:       XEiJ.mpuCycleCount += 12;
 11757:       int a = efaMltLong (ea);
 11758:       int x;
 11759:       int y;
 11760:       int z;
 11761:       XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]));
 11762:       XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 11763:              ((x ^ z) & (y ^ z)) >>> 31 << 1 |
 11764:              ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //ccr_add
 11765:     }
 11766:   }  //irpAddToMemLong
 11767: 
 11768:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11769:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11770:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11771:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11772:   //ADDA.L <ea>,Aq                                  |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr
 11773:   //ADD.L <ea>,Aq                                   |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq]
 11774:   public static void irpAddaLong () throws M68kException {
 11775:     int ea = XEiJ.regOC & 63;
 11776:     XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6;  //Dr/Ar/#<data>のとき8+、それ以外は6+
 11777:     int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea));  //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意
 11778:     XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z;  //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可
 11779:     //ccrは変化しない
 11780:   }  //irpAddaLong
 11781: 
 11782:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11783:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11784:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11785:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11786:   //ASR.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_000_000_rrr
 11787:   //LSR.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_000_001_rrr
 11788:   //ROXR.B #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_000_010_rrr
 11789:   //ROR.B #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_000_011_rrr
 11790:   //ASR.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_000_100_rrr
 11791:   //LSR.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_000_101_rrr
 11792:   //ROXR.B Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_000_110_rrr
 11793:   //ROR.B Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_000_111_rrr
 11794:   //ASR.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_000_000_rrr [ASR.B #1,Dr]
 11795:   //LSR.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_000_001_rrr [LSR.B #1,Dr]
 11796:   //ROXR.B Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_000_010_rrr [ROXR.B #1,Dr]
 11797:   //ROR.B Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_000_011_rrr [ROR.B #1,Dr]
 11798:   //
 11799:   //ASR.B #<data>,Dr
 11800:   //ASR.B Dq,Dr
 11801:   //  算術右シフトバイト
 11802:   //       ........................アイウエオカキク XNZVC
 11803:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 11804:   //     1 ........................アアイウエオカキ クア*0ク Z=アイウエオカキ==0
 11805:   //     2 ........................アアアイウエオカ キア*0キ Z=アイウエオカ==0
 11806:   //     3 ........................アアアアイウエオ カア*0カ Z=アイウエオ==0
 11807:   //     4 ........................アアアアアイウエ オア*0オ Z=アイウエ==0
 11808:   //     5 ........................アアアアアアイウ エア*0エ Z=アイウ==0
 11809:   //     6 ........................アアアアアアアイ ウア*0ウ Z=アイ==0
 11810:   //     7 ........................アアアアアアアア イア*0イ Z=ア==0
 11811:   //     8 ........................アアアアアアアア アア*0ア Z=ア==0
 11812:   //  CCR
 11813:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 11814:   //    N  結果の最上位ビット
 11815:   //    Z  結果が0のときセット。他はクリア
 11816:   //    V  常にクリア
 11817:   //    C  countが0のときクリア。他は最後に押し出されたビット
 11818:   //
 11819:   //LSR.B #<data>,Dr
 11820:   //LSR.B Dq,Dr
 11821:   //  論理右シフトバイト
 11822:   //       ........................アイウエオカキク XNZVC
 11823:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 11824:   //     1 ........................0アイウエオカキ ク0*0ク Z=アイウエオカキ==0
 11825:   //     2 ........................00アイウエオカ キ0*0キ Z=アイウエオカ==0
 11826:   //     3 ........................000アイウエオ カ0*0カ Z=アイウエオ==0
 11827:   //     4 ........................0000アイウエ オ0*0オ Z=アイウエ==0
 11828:   //     5 ........................00000アイウ エ0*0エ Z=アイウ==0
 11829:   //     6 ........................000000アイ ウ0*0ウ Z=アイ==0
 11830:   //     7 ........................0000000ア イ0*0イ Z=ア==0
 11831:   //     8 ........................00000000 ア010ア
 11832:   //     9 ........................00000000 00100
 11833:   //  CCR
 11834:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 11835:   //    N  結果の最上位ビット
 11836:   //    Z  結果が0のときセット。他はクリア
 11837:   //    V  常にクリア
 11838:   //    C  countが0のときクリア。他は最後に押し出されたビット
 11839:   //
 11840:   //ROR.B #<data>,Dr
 11841:   //ROR.B Dq,Dr
 11842:   //  右ローテートバイト
 11843:   //       ........................アイウエオカキク XNZVC
 11844:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 11845:   //     1 ........................クアイウエオカキ Xク*0ク Z=アイウエオカキク==0
 11846:   //     :
 11847:   //     7 ........................イウエオカキクア Xイ*0イ Z=アイウエオカキク==0
 11848:   //     8 ........................アイウエオカキク Xア*0ア Z=アイウエオカキク==0
 11849:   //  CCR
 11850:   //    X  常に変化しない
 11851:   //    N  結果の最上位ビット
 11852:   //    Z  結果が0のときセット。他はクリア
 11853:   //    V  常にクリア
 11854:   //    C  countが0のときクリア。他は結果の最上位ビット
 11855:   //
 11856:   //ROXR.B #<data>,Dr
 11857:   //ROXR.B Dq,Dr
 11858:   //  拡張右ローテートバイト
 11859:   //       ........................アイウエオカキク XNZVC
 11860:   //     0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 11861:   //     1 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0
 11862:   //     2 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0
 11863:   //     3 ........................キクXアイウエオ カキ*0カ Z=アイウエオキクX==0
 11864:   //     4 ........................カキクXアイウエ オカ*0オ Z=アイウエカキクX==0
 11865:   //     5 ........................オカキクXアイウ エオ*0エ Z=アイウオカキクX==0
 11866:   //     6 ........................エオカキクXアイ ウエ*0ウ Z=アイエオカキクX==0
 11867:   //     7 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0
 11868:   //     8 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0
 11869:   //     9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 11870:   //  CCR
 11871:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 11872:   //    N  結果の最上位ビット
 11873:   //    Z  結果が0のときセット。他はクリア
 11874:   //    V  常にクリア
 11875:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 11876:   public static void irpXxrToRegByte () throws M68kException {
 11877:     int rrr;
 11878:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 11879:     int y;
 11880:     int z;
 11881:     int t;
 11882:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 11883:     case 0b000_000 >> 3:  //ASR.B #<data>,Dr
 11884:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11885:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> y) >> 1);
 11886:       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は最後に押し出されたビット
 11887:       break;
 11888:     case 0b001_000 >> 3:  //LSR.B #<data>,Dr
 11889:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11890:       XEiJ.regRn[rrr] = ~0xff & x | (z = (t = (0xff & x) >>> y) >>> 1);
 11891:       XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11892:       break;
 11893:     case 0b010_000 >> 3:  //ROXR.B #<data>,Dr
 11894:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11895:       z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1;
 11896:       if (y == 1 - 1) {  //y=data-1=1-1
 11897:         t = x;
 11898:       } else {  //y=data-1=2-1~8-1
 11899:         z = x << 9 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1;
 11900:       }
 11901:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 11902:       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は最後に押し出されたビット
 11903:       break;
 11904:     case 0b011_000 >> 3:  //ROR.B #<data>,Dr
 11905:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 11906:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 7 - y | (0xff & x) >>> y + 1));
 11907:       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は結果の最上位ビット
 11908:       break;
 11909:     case 0b100_000 >> 3:  //ASR.B Dq,Dr
 11910:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 11911:       XEiJ.mpuCycleCount += 6 + (y << 1);
 11912:       if (y == 0) {  //y=data=0
 11913:         z = (byte) x;
 11914:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 11915:       } else {  //y=data=1~63
 11916:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> (y <= 8 ? y - 1 : 7)) >> 1);
 11917:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11918:       }
 11919:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 11920:       break;
 11921:     case 0b101_000 >> 3:  //LSR.B Dq,Dr
 11922:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 11923:       XEiJ.mpuCycleCount += 6 + (y << 1);
 11924:       if (y == 0) {  //y=data=0
 11925:         z = (byte) x;
 11926:         XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0);  //Xは変化しない。Cはクリア
 11927:       } else {  //y=data=1~63
 11928:         XEiJ.regRn[rrr] = ~0xff & x | (z = (t = y <= 8 ? (0xff & x) >>> y - 1 : 0) >>> 1);
 11929:         XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11930:       }
 11931:       break;
 11932:     case 0b110_000 >> 3:  //ROXR.B Dq,Dr
 11933:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 11934:       XEiJ.mpuCycleCount += 6 + (y << 1);
 11935:       //y %= 9;
 11936:       y = (y & 7) - (y >> 3);  //y=data=-7~7
 11937:       y += y >> 3 & 9;  //y=data=0~8
 11938:       if (y == 0) {  //y=data=0
 11939:         z = (byte) x;
 11940:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 11941:       } else {  //y=data=1~8
 11942:         z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1;
 11943:         if (y == 1) {  //y=data=1
 11944:           t = x;  //Cは最後に押し出されたビット
 11945:         } else {  //y=data=2~8
 11946:           z = x << 9 - y | (t = z >>> y - 2) >>> 1;
 11947:         }
 11948:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 11949:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 11950:       }
 11951:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 11952:       break;
 11953:     case 0b111_000 >> 3:  //ROR.B Dq,Dr
 11954:     default:
 11955:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 11956:       XEiJ.mpuCycleCount += 6 + (y << 1);
 11957:       if (y == 0) {
 11958:         z = (byte) x;
 11959:         t = 0;  //Cはクリア
 11960:       } else {
 11961:         y &= 7;  //y=data=0~7
 11962:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 8 - y | (0xff & x) >>> y));
 11963:         t = z >>> 7 & 1;  //Cは結果の最上位ビット
 11964:       }
 11965:       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は変化しない
 11966:     }
 11967:   }  //irpXxrToRegByte
 11968: 
 11969:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11970:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 11971:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 11972:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 11973:   //ASR.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_001_000_rrr
 11974:   //LSR.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_001_001_rrr
 11975:   //ROXR.W #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_001_010_rrr
 11976:   //ROR.W #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_001_011_rrr
 11977:   //ASR.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_001_100_rrr
 11978:   //LSR.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_001_101_rrr
 11979:   //ROXR.W Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_001_110_rrr
 11980:   //ROR.W Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_001_111_rrr
 11981:   //ASR.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_001_000_rrr [ASR.W #1,Dr]
 11982:   //LSR.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_001_001_rrr [LSR.W #1,Dr]
 11983:   //ROXR.W Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_001_010_rrr [ROXR.W #1,Dr]
 11984:   //ROR.W Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_001_011_rrr [ROR.W #1,Dr]
 11985:   //
 11986:   //ASR.W #<data>,Dr
 11987:   //ASR.W Dq,Dr
 11988:   //ASR.W <ea>
 11989:   //  算術右シフトワード
 11990:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 11991:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 11992:   //     1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0
 11993:   //     :
 11994:   //    15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0
 11995:   //    16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0
 11996:   //  CCR
 11997:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 11998:   //    N  結果の最上位ビット
 11999:   //    Z  結果が0のときセット。他はクリア
 12000:   //    V  常にクリア
 12001:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12002:   //
 12003:   //LSR.W #<data>,Dr
 12004:   //LSR.W Dq,Dr
 12005:   //LSR.W <ea>
 12006:   //  論理右シフトワード
 12007:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12008:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12009:   //     1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0
 12010:   //     :
 12011:   //    15 ................000000000000000ア イ0*0イ Z=ア==0
 12012:   //    16 ................0000000000000000 ア010ア
 12013:   //    17 ................0000000000000000 00100
 12014:   //  CCR
 12015:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12016:   //    N  結果の最上位ビット
 12017:   //    Z  結果が0のときセット。他はクリア
 12018:   //    V  常にクリア
 12019:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12020:   //
 12021:   //ROR.W #<data>,Dr
 12022:   //ROR.W Dq,Dr
 12023:   //ROR.W <ea>
 12024:   //  右ローテートワード
 12025:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12026:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12027:   //     1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0
 12028:   //     :
 12029:   //    15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0
 12030:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0
 12031:   //  CCR
 12032:   //    X  常に変化しない
 12033:   //    N  結果の最上位ビット
 12034:   //    Z  結果が0のときセット。他はクリア
 12035:   //    V  常にクリア
 12036:   //    C  countが0のときクリア。他は結果の最上位ビット
 12037:   //
 12038:   //ROXR.W #<data>,Dr
 12039:   //ROXR.W Dq,Dr
 12040:   //ROXR.W <ea>
 12041:   //  拡張右ローテートワード
 12042:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12043:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12044:   //     1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 12045:   //     2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 12046:   //     :
 12047:   //    15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 12048:   //    16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 12049:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12050:   //  CCR
 12051:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12052:   //    N  結果の最上位ビット
 12053:   //    Z  結果が0のときセット。他はクリア
 12054:   //    V  常にクリア
 12055:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12056:   public static void irpXxrToRegWord () throws M68kException {
 12057:     int rrr;
 12058:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12059:     int y;
 12060:     int z;
 12061:     int t;
 12062:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12063:     case 0b000_000 >> 3:  //ASR.W #<data>,Dr
 12064:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12065:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> y) >> 1);
 12066:       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は最後に押し出されたビット
 12067:       break;
 12068:     case 0b001_000 >> 3:  //LSR.W #<data>,Dr
 12069:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12070:       XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = (char) x >>> y) >>> 1);
 12071:       XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12072:       break;
 12073:     case 0b010_000 >> 3:  //ROXR.W #<data>,Dr
 12074:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12075:       z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1;
 12076:       if (y == 1 - 1) {  //y=data-1=1-1
 12077:         t = x;
 12078:       } else {  //y=data-1=2-1~8-1
 12079:         z = x << 17 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1;
 12080:       }
 12081:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12082:       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は最後に押し出されたビット
 12083:       break;
 12084:     case 0b011_000 >> 3:  //ROR.W #<data>,Dr
 12085:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12086:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - 1 - y | (char) x >>> y + 1));
 12087:       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は結果の最上位ビット
 12088:       break;
 12089:     case 0b100_000 >> 3:  //ASR.W Dq,Dr
 12090:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12091:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12092:       if (y == 0) {  //y=data=0
 12093:         z = (short) x;
 12094:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12095:       } else {  //y=data=1~63
 12096:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> (y <= 16 ? y - 1 : 15)) >> 1);
 12097:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12098:       }
 12099:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12100:       break;
 12101:     case 0b101_000 >> 3:  //LSR.W Dq,Dr
 12102:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12103:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12104:       if (y == 0) {  //y=data=0
 12105:         z = (short) x;
 12106:         XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0);  //Xは変化しない。Cはクリア
 12107:       } else {  //y=data=1~63
 12108:         XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = y <= 16 ? (char) x >>> y - 1 : 0) >>> 1);
 12109:         XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12110:       }
 12111:       break;
 12112:     case 0b110_000 >> 3:  //ROXR.W Dq,Dr
 12113:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12114:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12115:       //y %= 17;
 12116:       y = (y & 15) - (y >> 4);  //y=data=-3~15
 12117:       y += y >> 4 & 17;  //y=data=0~16
 12118:       if (y == 0) {  //y=data=0
 12119:         z = (short) x;
 12120:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12121:       } else {  //y=data=1~16
 12122:         z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1;
 12123:         if (y == 1) {  //y=data=1
 12124:           t = x;  //Cは最後に押し出されたビット
 12125:         } else {  //y=data=2~16
 12126:           z = x << 17 - y | (t = z >>> y - 2) >>> 1;
 12127:         }
 12128:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12129:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12130:       }
 12131:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12132:       break;
 12133:     case 0b111_000 >> 3:  //ROR.W Dq,Dr
 12134:     default:
 12135:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12136:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12137:       if (y == 0) {
 12138:         z = (short) x;
 12139:         t = 0;  //Cはクリア
 12140:       } else {
 12141:         y &= 15;  //y=data=0~15
 12142:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - y | (char) x >>> y));
 12143:         t = z >>> 15 & 1;  //Cは結果の最上位ビット
 12144:       }
 12145:       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は変化しない
 12146:     }
 12147:   }  //irpXxrToRegWord
 12148: 
 12149:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12150:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12151:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12152:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12153:   //ASR.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_010_000_rrr
 12154:   //LSR.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_010_001_rrr
 12155:   //ROXR.L #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_010_010_rrr
 12156:   //ROR.L #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_010_011_rrr
 12157:   //ASR.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_010_100_rrr
 12158:   //LSR.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_010_101_rrr
 12159:   //ROXR.L Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_010_110_rrr
 12160:   //ROR.L Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_010_111_rrr
 12161:   //ASR.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_010_000_rrr [ASR.L #1,Dr]
 12162:   //LSR.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_010_001_rrr [LSR.L #1,Dr]
 12163:   //ROXR.L Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_010_010_rrr [ROXR.L #1,Dr]
 12164:   //ROR.L Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_010_011_rrr [ROR.L #1,Dr]
 12165:   //
 12166:   //ASR.L #<data>,Dr
 12167:   //ASR.L Dq,Dr
 12168:   //  算術右シフトロング
 12169:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12170:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12171:   //     1 アアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0
 12172:   //     :
 12173:   //    31 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア イア*0イ Z=ア==0
 12174:   //    32 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア アア*0ア Z=ア==0
 12175:   //  CCR
 12176:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12177:   //    N  結果の最上位ビット
 12178:   //    Z  結果が0のときセット。他はクリア
 12179:   //    V  常にクリア
 12180:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12181:   //
 12182:   //LSR.L #<data>,Dr
 12183:   //LSR.L Dq,Dr
 12184:   //  論理右シフトロング
 12185:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12186:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12187:   //     1 0アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミ0*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0
 12188:   //     :
 12189:   //    31 0000000000000000000000000000000ア イ0*0イ Z=ア==0
 12190:   //    32 00000000000000000000000000000000 ア010ア
 12191:   //    33 00000000000000000000000000000000 00100
 12192:   //  CCR
 12193:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12194:   //    N  結果の最上位ビット
 12195:   //    Z  結果が0のときセット。他はクリア
 12196:   //    V  常にクリア
 12197:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12198:   //
 12199:   //ROR.L #<data>,Dr
 12200:   //ROR.L Dq,Dr
 12201:   //  右ローテートロング
 12202:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12203:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12204:   //     1 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12205:   //     :
 12206:   //    31 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0イ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12207:   //    32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12208:   //  CCR
 12209:   //    X  常に変化しない
 12210:   //    N  結果の最上位ビット
 12211:   //    Z  結果が0のときセット。他はクリア
 12212:   //    V  常にクリア
 12213:   //    C  countが0のときクリア。他は結果の最上位ビット
 12214:   //
 12215:   //ROXR.L #<data>,Dr
 12216:   //ROXR.L Dq,Dr
 12217:   //  拡張右ローテートロング
 12218:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12219:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12220:   //     1 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0
 12221:   //     2 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0
 12222:   //     :
 12223:   //    31 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12224:   //    32 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12225:   //    33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12226:   //  CCR
 12227:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12228:   //    N  結果の最上位ビット
 12229:   //    Z  結果が0のときセット。他はクリア
 12230:   //    V  常にクリア
 12231:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12232:   public static void irpXxrToRegLong () throws M68kException {
 12233:     int rrr;
 12234:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12235:     int y;
 12236:     int z;
 12237:     int t;
 12238:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12239:     case 0b000_000 >> 3:  //ASR.L #<data>,Dr
 12240:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12241:       XEiJ.regRn[rrr] = z = (t = x >> y) >> 1;
 12242:       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は最後に押し出されたビット
 12243:       break;
 12244:     case 0b001_000 >> 3:  //LSR.L #<data>,Dr
 12245:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12246:       XEiJ.regRn[rrr] = z = (t = x >>> y) >>> 1;
 12247:       XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12248:       break;
 12249:     case 0b010_000 >> 3:  //ROXR.L #<data>,Dr
 12250:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12251:       z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1;
 12252:       if (y == 1 - 1) {  //y=data-1=1-1
 12253:         t = x;
 12254:       } else {  //y=data-1=2-1~8-1
 12255:         z = x << -y | (t = z >>> y - (2 - 1)) >>> 1;  //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略
 12256:       }
 12257:       XEiJ.regRn[rrr] = z;
 12258:       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は最後に押し出されたビット
 12259:       break;
 12260:     case 0b011_000 >> 3:  //ROR.L #<data>,Dr
 12261:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12262:       XEiJ.regRn[rrr] = z = x << ~y | x >>> y + 1;  //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略
 12263:       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は結果の最上位ビット
 12264:       break;
 12265:     case 0b100_000 >> 3:  //ASR.L Dq,Dr
 12266:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12267:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12268:       if (y == 0) {  //y=data=0
 12269:         z = x;
 12270:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12271:       } else {  //y=data=1~63
 12272:         XEiJ.regRn[rrr] = z = (t = x >> (y <= 32 ? y - 1 : 31)) >> 1;
 12273:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12274:       }
 12275:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12276:       break;
 12277:     case 0b101_000 >> 3:  //LSR.L Dq,Dr
 12278:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12279:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12280:       if (y == 0) {  //y=data=0
 12281:         z = x;
 12282:         XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0);  //Xは変化しない。Cはクリア
 12283:       } else {  //y=data=1~63
 12284:         XEiJ.regRn[rrr] = z = (t = y <= 32 ? x >>> y - 1 : 0) >>> 1;
 12285:         XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12286:       }
 12287:       break;
 12288:     case 0b110_000 >> 3:  //ROXR.L Dq,Dr
 12289:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12290:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12291:       //y %= 33;
 12292:       y -= 32 - y >> 6 & 33;  //y=data=0~32
 12293:       if (y == 0) {  //y=data=0
 12294:         z = x;
 12295:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12296:       } else {  //y=data=1~32
 12297:         z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1;
 12298:         if (y == 1) {  //y=data=1
 12299:           t = x;  //Cは最後に押し出されたビット
 12300:         } else {  //y=data=2~32
 12301:           z = x << 33 - y | (t = z >>> y - 2) >>> 1;
 12302:         }
 12303:         XEiJ.regRn[rrr] = z;
 12304:         t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12305:       }
 12306:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12307:       break;
 12308:     case 0b111_000 >> 3:  //ROR.L Dq,Dr
 12309:     default:
 12310:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12311:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12312:       if (y == 0) {
 12313:         z = x;
 12314:         t = 0;  //Cはクリア
 12315:       } else {
 12316:         y &= 31;  //y=data=0~31
 12317:         XEiJ.regRn[rrr] = z = x << -y | x >>> y;  //Javaのシフト演算子は5ビットでマスクされるので32-yを-yに省略。y=32のときx|xになるが問題ない
 12318:         t = z >>> 31;  //Cは結果の最上位ビット
 12319:       }
 12320:       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は変化しない
 12321:     }
 12322:   }  //irpXxrToRegLong
 12323: 
 12324:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12325:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12326:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12327:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12328:   //ASR.W <ea>                                      |-|012346|-|UUUUU|***0*|  M+-WXZ  |1110_000_011_mmm_rrr
 12329:   //
 12330:   //ASR.W #<data>,Dr
 12331:   //ASR.W Dq,Dr
 12332:   //ASR.W <ea>
 12333:   //  算術右シフトワード
 12334:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12335:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12336:   //     1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0
 12337:   //     :
 12338:   //    15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0
 12339:   //    16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0
 12340:   //  CCR
 12341:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12342:   //    N  結果の最上位ビット
 12343:   //    Z  結果が0のときセット。他はクリア
 12344:   //    V  常にクリア
 12345:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12346:   public static void irpAsrToMem () throws M68kException {
 12347:     XEiJ.mpuCycleCount += 8;
 12348:     int ea = XEiJ.regOC & 63;
 12349:     int a = efaMltWord (ea);
 12350:     int x = XEiJ.busRws (a);
 12351:     int z = x >> 1;
 12352:     XEiJ.busWw (a, z);
 12353:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 12354:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 12355:                    -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 12356:   }  //irpAsrToMem
 12357: 
 12358:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12359:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12360:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12361:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12362:   //ASL.B #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_100_000_rrr
 12363:   //LSL.B #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_100_001_rrr
 12364:   //ROXL.B #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_100_010_rrr
 12365:   //ROL.B #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_100_011_rrr
 12366:   //ASL.B Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_100_100_rrr
 12367:   //LSL.B Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_100_101_rrr
 12368:   //ROXL.B Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_100_110_rrr
 12369:   //ROL.B Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_100_111_rrr
 12370:   //ASL.B Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_100_000_rrr [ASL.B #1,Dr]
 12371:   //LSL.B Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_100_001_rrr [LSL.B #1,Dr]
 12372:   //ROXL.B Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_100_010_rrr [ROXL.B #1,Dr]
 12373:   //ROL.B Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_100_011_rrr [ROL.B #1,Dr]
 12374:   //
 12375:   //ASL.B #<data>,Dr
 12376:   //ASL.B Dq,Dr
 12377:   //  算術左シフトバイト
 12378:   //       ........................アイウエオカキク XNZVC
 12379:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 12380:   //     1 ........................イウエオカキク0 アイ**ア Z=イウエオカキク==0,V=アイ!=0/-1
 12381:   //     :
 12382:   //     7 ........................ク0000000 キク**キ Z=ク==0,V=アイウエオカキク!=0/-1
 12383:   //     8 ........................00000000 ク01*ク V=アイウエオカキク!=0
 12384:   //     9 ........................00000000 001*0 V=アイウエオカキク!=0
 12385:   //  CCR
 12386:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12387:   //    N  結果の最上位ビット
 12388:   //    Z  結果が0のときセット。他はクリア
 12389:   //    V  ASRで元に戻せないときセット。他はクリア
 12390:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12391:   //
 12392:   //LSL.B #<data>,Dr
 12393:   //LSL.B Dq,Dr
 12394:   //  論理左シフトバイト
 12395:   //       ........................アイウエオカキク XNZVC
 12396:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 12397:   //     1 ........................イウエオカキク0 アイ*0ア Z=イウエオカキク==0
 12398:   //     :
 12399:   //     7 ........................ク0000000 キク*0キ Z=ク==0
 12400:   //     8 ........................00000000 ク010ク
 12401:   //     9 ........................00000000 00100
 12402:   //  CCR
 12403:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12404:   //    N  結果の最上位ビット
 12405:   //    Z  結果が0のときセット。他はクリア
 12406:   //    V  常にクリア
 12407:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12408:   //
 12409:   //ROL.B #<data>,Dr
 12410:   //ROL.B Dq,Dr
 12411:   //  左ローテートバイト
 12412:   //       ........................アイウエオカキク XNZVC
 12413:   //     0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0
 12414:   //     1 ........................イウエオカキクア Xイ*0ア Z=アイウエオカキク==0
 12415:   //     :
 12416:   //     7 ........................クアイウエオカキ Xク*0キ Z=アイウエオカキク==0
 12417:   //     8 ........................アイウエオカキク Xア*0ク Z=アイウエオカキク==0
 12418:   //  CCR
 12419:   //    X  常に変化しない
 12420:   //    N  結果の最上位ビット
 12421:   //    Z  結果が0のときセット。他はクリア
 12422:   //    V  常にクリア
 12423:   //    C  countが0のときクリア。他は結果の最下位ビット
 12424:   //
 12425:   //ROXL.B #<data>,Dr
 12426:   //ROXL.B Dq,Dr
 12427:   //  拡張左ローテートバイト
 12428:   //       ........................アイウエオカキク XNZVC
 12429:   //     0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 12430:   //     1 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0
 12431:   //     2 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0
 12432:   //     :
 12433:   //     7 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0
 12434:   //     8 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0
 12435:   //     9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0
 12436:   //  CCR
 12437:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12438:   //    N  結果の最上位ビット
 12439:   //    Z  結果が0のときセット。他はクリア
 12440:   //    V  常にクリア
 12441:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12442:   public static void irpXxlToRegByte () throws M68kException {
 12443:     int rrr;
 12444:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12445:     int y;
 12446:     int z;
 12447:     int t;
 12448:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12449:     case 0b000_000 >> 3:  //ASL.B #<data>,Dr
 12450:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12451:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1));
 12452:       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は最後に押し出されたビット
 12453:       break;
 12454:     case 0b001_000 >> 3:  //LSL.B #<data>,Dr
 12455:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12456:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1));
 12457:       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は最後に押し出されたビット
 12458:       break;
 12459:     case 0b010_000 >> 3:  //ROXL.B #<data>,Dr
 12460:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12461:       z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12462:       if (y == 1 - 1) {  //y=data-1=1-1
 12463:         t = x;
 12464:       } else {  //y=data-1=2-1~8-1
 12465:         z = (t = z << y - (2 - 1)) << 1 | (0xff & x) >>> 9 - 1 - y;
 12466:       }
 12467:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 12468:       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は最後に押し出されたビット
 12469:       break;
 12470:     case 0b011_000 >> 3:  //ROL.B #<data>,Dr
 12471:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12472:       XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y + 1 | (0xff & x) >>> 7 - y));
 12473:       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は結果の最下位ビット
 12474:       break;
 12475:     case 0b100_000 >> 3:  //ASL.B Dq,Dr
 12476:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12477:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12478:       if (y <= 7) {  //y=data=0~7
 12479:         if (y == 0) {  //y=data=0
 12480:           z = (byte) x;
 12481:           t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。VとCはクリア
 12482:         } else {  //y=data=1~7
 12483:           XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y - 1) << 1));
 12484:           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は最後に押し出されたビット
 12485:         }
 12486:         XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12487:       } else {  //y=data=8~63
 12488:         XEiJ.regRn[rrr] = ~0xff & x;
 12489:         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);
 12490:       }
 12491:       break;
 12492:     case 0b101_000 >> 3:  //LSL.B Dq,Dr
 12493:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12494:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12495:       if (y == 0) {  //y=data=0
 12496:         z = (byte) x;
 12497:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12498:       } else {  //y=data=1~63
 12499:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = y <= 8 ? x << y - 1 : 0) << 1));
 12500:         t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12501:       }
 12502:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12503:       break;
 12504:     case 0b110_000 >> 3:  //ROXL.B Dq,Dr
 12505:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12506:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12507:       //y %= 9;
 12508:       y = (y & 7) - (y >> 3);  //y=data=-7~7
 12509:       y += y >> 3 & 9;  //y=data=0~8
 12510:       if (y == 0) {  //y=data=0
 12511:         z = (byte) x;
 12512:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12513:       } else {  //y=data=1~8
 12514:         z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12515:         if (y == 1) {  //y=data=1
 12516:           t = x;  //Cは最後に押し出されたビット
 12517:         } else {  //y=data=2~8
 12518:           z = (t = z << y - 2) << 1 | (0xff & x) >>> 9 - y;
 12519:         }
 12520:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z);
 12521:         t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12522:       }
 12523:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12524:       break;
 12525:     case 0b111_000 >> 3:  //ROL.B Dq,Dr
 12526:     default:
 12527:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12528:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12529:       if (y == 0) {
 12530:         z = (byte) x;
 12531:         t = 0;  //Cはクリア
 12532:       } else {
 12533:         y &= 7;  //y=data=0~7
 12534:         XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y | (0xff & x) >>> 8 - y));
 12535:         t = z & 1;  //Cは結果の最下位ビット
 12536:       }
 12537:       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は変化しない
 12538:     }
 12539:   }  //irpXxlToRegByte
 12540: 
 12541:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12542:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12543:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12544:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12545:   //ASL.W #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_101_000_rrr
 12546:   //LSL.W #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_101_001_rrr
 12547:   //ROXL.W #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_101_010_rrr
 12548:   //ROL.W #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_101_011_rrr
 12549:   //ASL.W Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_101_100_rrr
 12550:   //LSL.W Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_101_101_rrr
 12551:   //ROXL.W Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_101_110_rrr
 12552:   //ROL.W Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_101_111_rrr
 12553:   //ASL.W Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_101_000_rrr [ASL.W #1,Dr]
 12554:   //LSL.W Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_101_001_rrr [LSL.W #1,Dr]
 12555:   //ROXL.W Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_101_010_rrr [ROXL.W #1,Dr]
 12556:   //ROL.W Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_101_011_rrr [ROL.W #1,Dr]
 12557:   //
 12558:   //ASL.W #<data>,Dr
 12559:   //ASL.W Dq,Dr
 12560:   //ASL.W <ea>
 12561:   //  算術左シフトワード
 12562:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12563:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12564:   //     1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1
 12565:   //     :
 12566:   //    15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1
 12567:   //    16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0
 12568:   //    17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0
 12569:   //  CCR
 12570:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12571:   //    N  結果の最上位ビット
 12572:   //    Z  結果が0のときセット。他はクリア
 12573:   //    V  ASRで元に戻せないときセット。他はクリア
 12574:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12575:   //
 12576:   //LSL.W #<data>,Dr
 12577:   //LSL.W Dq,Dr
 12578:   //LSL.W <ea>
 12579:   //  論理左シフトワード
 12580:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12581:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12582:   //     1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0
 12583:   //     :
 12584:   //    15 ................タ000000000000000 ソタ*0ソ Z=タ==0
 12585:   //    16 ................0000000000000000 タ010タ
 12586:   //    17 ................0000000000000000 00100
 12587:   //  CCR
 12588:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12589:   //    N  結果の最上位ビット
 12590:   //    Z  結果が0のときセット。他はクリア
 12591:   //    V  常にクリア
 12592:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12593:   //
 12594:   //ROL.W #<data>,Dr
 12595:   //ROL.W Dq,Dr
 12596:   //ROL.W <ea>
 12597:   //  左ローテートワード
 12598:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12599:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12600:   //     1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0
 12601:   //     :
 12602:   //    15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0
 12603:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0
 12604:   //  CCR
 12605:   //    X  常に変化しない
 12606:   //    N  結果の最上位ビット
 12607:   //    Z  結果が0のときセット。他はクリア
 12608:   //    V  常にクリア
 12609:   //    C  countが0のときクリア。他は結果の最下位ビット
 12610:   //
 12611:   //ROXL.W #<data>,Dr
 12612:   //ROXL.W Dq,Dr
 12613:   //ROXL.W <ea>
 12614:   //  拡張左ローテートワード
 12615:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12616:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12617:   //     1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 12618:   //     2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 12619:   //     :
 12620:   //    15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 12621:   //    16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 12622:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 12623:   //  CCR
 12624:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12625:   //    N  結果の最上位ビット
 12626:   //    Z  結果が0のときセット。他はクリア
 12627:   //    V  常にクリア
 12628:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12629:   public static void irpXxlToRegWord () throws M68kException {
 12630:     int rrr;
 12631:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12632:     int y;
 12633:     int z;
 12634:     int t;
 12635:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12636:     case 0b000_000 >> 3:  //ASL.W #<data>,Dr
 12637:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12638:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1));
 12639:       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は最後に押し出されたビット
 12640:       break;
 12641:     case 0b001_000 >> 3:  //LSL.W #<data>,Dr
 12642:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12643:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1));
 12644:       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は最後に押し出されたビット
 12645:       break;
 12646:     case 0b010_000 >> 3:  //ROXL.W #<data>,Dr
 12647:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12648:       z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12649:       if (y == 1 - 1) {  //y=data-1=1-1
 12650:         t = x;
 12651:       } else {  //y=data-1=2-1~8-1
 12652:         z = (t = z << y - (2 - 1)) << 1 | (char) x >>> 17 - 1 - y;
 12653:       }
 12654:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12655:       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は最後に押し出されたビット
 12656:       break;
 12657:     case 0b011_000 >> 3:  //ROL.W #<data>,Dr
 12658:       XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12659:       XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y + 1 | (char) x >>> 16 - 1 - y));
 12660:       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は結果の最下位ビット
 12661:       break;
 12662:     case 0b100_000 >> 3:  //ASL.W Dq,Dr
 12663:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12664:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12665:       if (y <= 15) {  //y=data=0~15
 12666:         if (y == 0) {  //y=data=0
 12667:           z = (short) x;
 12668:           t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。VとCはクリア
 12669:         } else {  //y=data=1~15
 12670:           XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y - 1) << 1));
 12671:           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は最後に押し出されたビット
 12672:         }
 12673:         XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12674:       } else {  //y=data=16~63
 12675:         XEiJ.regRn[rrr] = ~0xffff & x;
 12676:         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);
 12677:       }
 12678:       break;
 12679:     case 0b101_000 >> 3:  //LSL.W Dq,Dr
 12680:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12681:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12682:       if (y == 0) {  //y=data=0
 12683:         z = (short) x;
 12684:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12685:       } else {  //y=data=1~63
 12686:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = y <= 16 ? x << y - 1 : 0) << 1));
 12687:         t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12688:       }
 12689:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12690:       break;
 12691:     case 0b110_000 >> 3:  //ROXL.W Dq,Dr
 12692:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12693:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12694:       //y %= 17;
 12695:       y = (y & 15) - (y >> 4);  //y=data=-3~15
 12696:       y += y >> 4 & 17;  //y=data=0~16
 12697:       if (y == 0) {  //y=data=0
 12698:         z = (short) x;
 12699:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12700:       } else {  //y=data=1~16
 12701:         z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12702:         if (y == 1) {  //y=data=1
 12703:           t = x;  //Cは最後に押し出されたビット
 12704:         } else {  //y=data=2~16
 12705:           z = (t = z << y - 2) << 1 | (char) x >>> 17 - y;
 12706:         }
 12707:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z);
 12708:         t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12709:       }
 12710:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12711:       break;
 12712:     case 0b111_000 >> 3:  //ROL.W Dq,Dr
 12713:     default:
 12714:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12715:       XEiJ.mpuCycleCount += 6 + (y << 1);
 12716:       if (y == 0) {
 12717:         z = (short) x;
 12718:         t = 0;  //Cはクリア
 12719:       } else {
 12720:         y &= 15;  //y=data=0~15
 12721:         XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y | (char) x >>> 16 - y));
 12722:         t = z & 1;  //Cは結果の最下位ビット
 12723:       }
 12724:       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は変化しない
 12725:     }
 12726:   }  //irpXxlToRegWord
 12727: 
 12728:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12729:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12730:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12731:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12732:   //ASL.L #<data>,Dr                                |-|012346|-|UUUUU|*****|          |1110_qqq_110_000_rrr
 12733:   //LSL.L #<data>,Dr                                |-|012346|-|UUUUU|***0*|          |1110_qqq_110_001_rrr
 12734:   //ROXL.L #<data>,Dr                               |-|012346|-|*UUUU|***0*|          |1110_qqq_110_010_rrr
 12735:   //ROL.L #<data>,Dr                                |-|012346|-|-UUUU|-**0*|          |1110_qqq_110_011_rrr
 12736:   //ASL.L Dq,Dr                                     |-|012346|-|UUUUU|*****|          |1110_qqq_110_100_rrr
 12737:   //LSL.L Dq,Dr                                     |-|012346|-|UUUUU|***0*|          |1110_qqq_110_101_rrr
 12738:   //ROXL.L Dq,Dr                                    |-|012346|-|*UUUU|***0*|          |1110_qqq_110_110_rrr
 12739:   //ROL.L Dq,Dr                                     |-|012346|-|-UUUU|-**0*|          |1110_qqq_110_111_rrr
 12740:   //ASL.L Dr                                        |A|012346|-|UUUUU|*****|          |1110_001_110_000_rrr [ASL.L #1,Dr]
 12741:   //LSL.L Dr                                        |A|012346|-|UUUUU|***0*|          |1110_001_110_001_rrr [LSL.L #1,Dr]
 12742:   //ROXL.L Dr                                       |A|012346|-|*UUUU|***0*|          |1110_001_110_010_rrr [ROXL.L #1,Dr]
 12743:   //ROL.L Dr                                        |A|012346|-|-UUUU|-**0*|          |1110_001_110_011_rrr [ROL.L #1,Dr]
 12744:   //
 12745:   //ASL.L #<data>,Dr
 12746:   //ASL.L Dq,Dr
 12747:   //  算術左シフトロング
 12748:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12749:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア**0 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12750:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ**ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0,V=アイ!=0/-1
 12751:   //     :
 12752:   //    31 ミ0000000000000000000000000000000 マミ**マ Z=ミ==0,V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0/-1
 12753:   //    32 00000000000000000000000000000000 ミ01*ミ V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0
 12754:   //    33 00000000000000000000000000000000 001*0 V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0
 12755:   //  CCR
 12756:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12757:   //    N  結果の最上位ビット
 12758:   //    Z  結果が0のときセット。他はクリア
 12759:   //    V  ASRで元に戻せないときセット。他はクリア
 12760:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12761:   //
 12762:   //LSL.L #<data>,Dr
 12763:   //LSL.L Dq,Dr
 12764:   //  論理左シフトロング
 12765:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12766:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12767:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12768:   //     :
 12769:   //    31 ミ0000000000000000000000000000000 マミ*0マ Z=ミ==0
 12770:   //    32 00000000000000000000000000000000 ミ010ミ
 12771:   //    33 00000000000000000000000000000000 00100
 12772:   //  CCR
 12773:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12774:   //    N  結果の最上位ビット
 12775:   //    Z  結果が0のときセット。他はクリア
 12776:   //    V  常にクリア
 12777:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12778:   //
 12779:   //ROL.L #<data>,Dr
 12780:   //ROL.L Dq,Dr
 12781:   //  左ローテートロング
 12782:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12783:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12784:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12785:   //     :
 12786:   //    31 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12787:   //    32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12788:   //  CCR
 12789:   //    X  常に変化しない
 12790:   //    N  結果の最上位ビット
 12791:   //    Z  結果が0のときセット。他はクリア
 12792:   //    V  常にクリア
 12793:   //    C  countが0のときクリア。他は結果の最下位ビット
 12794:   //
 12795:   //ROXL.L #<data>,Dr
 12796:   //ROXL.L Dq,Dr
 12797:   //  拡張左ローテートロング
 12798:   //       アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC
 12799:   //     0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12800:   //     1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12801:   //     2 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0
 12802:   //     :
 12803:   //    31 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0
 12804:   //    32 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0
 12805:   //    33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0
 12806:   //  CCR
 12807:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12808:   //    N  結果の最上位ビット
 12809:   //    Z  結果が0のときセット。他はクリア
 12810:   //    V  常にクリア
 12811:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 12812:   public static void irpXxlToRegLong () throws M68kException {
 12813:     int rrr;
 12814:     int x = XEiJ.regRn[rrr = XEiJ.regOC & 7];
 12815:     int y;
 12816:     int z;
 12817:     int t;
 12818:     switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) {
 12819:     case 0b000_000 >> 3:  //ASL.L #<data>,Dr
 12820:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12821:       XEiJ.regRn[rrr] = z = (t = x << y) << 1;
 12822:       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は最後に押し出されたビット
 12823:       break;
 12824:     case 0b001_000 >> 3:  //LSL.L #<data>,Dr
 12825:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12826:       XEiJ.regRn[rrr] = z = (t = x << y) << 1;
 12827:       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は最後に押し出されたビット
 12828:       break;
 12829:     case 0b010_000 >> 3:  //ROXL.L #<data>,Dr
 12830:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12831:       z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12832:       if (y == 1 - 1) {  //y=data-1=1-1
 12833:         t = x;
 12834:       } else {  //y=data-1=2-1~8-1
 12835:         z = (t = z << y - (2 - 1)) << 1 | x >>> -y;  //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略
 12836:       }
 12837:       XEiJ.regRn[rrr] = z;
 12838:       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は最後に押し出されたビット
 12839:       break;
 12840:     case 0b011_000 >> 3:  //ROL.L #<data>,Dr
 12841:       XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1);  //y=data-1=1-1~8-1
 12842:       XEiJ.regRn[rrr] = z = x << y + 1 | x >>> ~y;  //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略
 12843:       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は結果の最下位ビット
 12844:       break;
 12845:     case 0b100_000 >> 3:  //ASL.L Dq,Dr
 12846:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12847:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12848:       if (y <= 31) {  //y=data=0~31
 12849:         if (y == 0) {  //y=data=0
 12850:           z = x;
 12851:           t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。VとCはクリア
 12852:         } else {  //y=data=1~31
 12853:           XEiJ.regRn[rrr] = z = (t = x << y - 1) << 1;
 12854:           t = (z >> y != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット
 12855:         }
 12856:         XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12857:       } else {  //y=data=32~63
 12858:         XEiJ.regRn[rrr] = 0;
 12859:         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);
 12860:       }
 12861:       break;
 12862:     case 0b101_000 >> 3:  //LSL.L Dq,Dr
 12863:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12864:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12865:       if (y == 0) {  //y=data=0
 12866:         z = x;
 12867:         t = XEiJ.regCCR & XEiJ.REG_CCR_X;  //Xは変化しない。Cはクリア
 12868:       } else {  //y=data=1~63
 12869:         XEiJ.regRn[rrr] = z = (t = y <= 32 ? x << y - 1 : 0) << 1;
 12870:         t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12871:       }
 12872:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12873:       break;
 12874:     case 0b110_000 >> 3:  //ROXL.L Dq,Dr
 12875:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12876:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12877:       //y %= 33;
 12878:       y -= 32 - y >> 6 & 33;  //y=data=0~32
 12879:       if (y == 0) {  //y=data=0
 12880:         z = x;
 12881:         t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //Xは変化しない。CはXのコピー
 12882:       } else {  //y=data=1~32
 12883:         z = x << 1 | XEiJ.regCCR >> 4 & 1;
 12884:         if (y == 1) {  //y=data=1
 12885:           t = x;  //Cは最後に押し出されたビット
 12886:         } else {  //y=data=2~32
 12887:           z = (t = z << y - 2) << 1 | x >>> 33 - y;
 12888:         }
 12889:         XEiJ.regRn[rrr] = z;
 12890:         t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);  //XとCは最後に押し出されたビット
 12891:       }
 12892:       XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t;
 12893:       break;
 12894:     case 0b111_000 >> 3:  //ROL.L Dq,Dr
 12895:     default:
 12896:       y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63;  //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意
 12897:       XEiJ.mpuCycleCount += 8 + (y << 1);
 12898:       if (y == 0) {
 12899:         z = x;
 12900:         t = 0;  //Cはクリア
 12901:       } else {
 12902:         XEiJ.regRn[rrr] = z = x << y | x >>> -y;  //Javaのシフト演算子は5ビットでマスクされるのでy&31をyに、32-(y&31)を-yに省略。y=32のときx|xになるが問題ない
 12903:         t = z & 1;
 12904:       }
 12905:       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は変化しない
 12906:     }
 12907:   }  //irpXxlToRegLong
 12908: 
 12909:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12910:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12911:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12912:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12913:   //ASL.W <ea>                                      |-|012346|-|UUUUU|*****|  M+-WXZ  |1110_000_111_mmm_rrr
 12914:   //
 12915:   //ASL.W #<data>,Dr
 12916:   //ASL.W Dq,Dr
 12917:   //ASL.W <ea>
 12918:   //  算術左シフトワード
 12919:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12920:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12921:   //     1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1
 12922:   //     :
 12923:   //    15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1
 12924:   //    16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0
 12925:   //    17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0
 12926:   //  CCR
 12927:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12928:   //    N  結果の最上位ビット
 12929:   //    Z  結果が0のときセット。他はクリア
 12930:   //    V  ASRで元に戻せないときセット。他はクリア
 12931:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12932:   public static void irpAslToMem () throws M68kException {
 12933:     XEiJ.mpuCycleCount += 8;
 12934:     int ea = XEiJ.regOC & 63;
 12935:     int a = efaMltWord (ea);
 12936:     int x = XEiJ.busRws (a);
 12937:     int z = (short) (x << 1);
 12938:     XEiJ.busWw (a, z);
 12939:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 12940:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 12941:                    (x ^ z) >>> 31 << 1 |  //Vは最上位ビットが変化したときセット
 12942:                    x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 12943:   }  //irpAslToMem
 12944: 
 12945:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12946:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12947:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12948:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12949:   //LSR.W <ea>                                      |-|012346|-|UUUUU|*0*0*|  M+-WXZ  |1110_001_011_mmm_rrr
 12950:   //
 12951:   //LSR.W #<data>,Dr
 12952:   //LSR.W Dq,Dr
 12953:   //LSR.W <ea>
 12954:   //  論理右シフトワード
 12955:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12956:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12957:   //     1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0
 12958:   //     :
 12959:   //    15 ................000000000000000ア イ0*0イ Z=ア==0
 12960:   //    16 ................0000000000000000 ア010ア
 12961:   //    17 ................0000000000000000 00100
 12962:   //  CCR
 12963:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12964:   //    N  結果の最上位ビット
 12965:   //    Z  結果が0のときセット。他はクリア
 12966:   //    V  常にクリア
 12967:   //    C  countが0のときクリア。他は最後に押し出されたビット
 12968:   public static void irpLsrToMem () throws M68kException {
 12969:     XEiJ.mpuCycleCount += 8;
 12970:     int ea = XEiJ.regOC & 63;
 12971:     int a = efaMltWord (ea);
 12972:     int x = XEiJ.busRwz (a);
 12973:     int z = x >>> 1;
 12974:     XEiJ.busWw (a, z);
 12975:     XEiJ.regCCR = ((z == 0 ? XEiJ.REG_CCR_Z : 0) |
 12976:                    -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 12977:   }  //irpLsrToMem
 12978: 
 12979:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12980:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 12981:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 12982:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 12983:   //LSL.W <ea>                                      |-|012346|-|UUUUU|***0*|  M+-WXZ  |1110_001_111_mmm_rrr
 12984:   //
 12985:   //LSL.W #<data>,Dr
 12986:   //LSL.W Dq,Dr
 12987:   //LSL.W <ea>
 12988:   //  論理左シフトワード
 12989:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 12990:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 12991:   //     1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0
 12992:   //     :
 12993:   //    15 ................タ000000000000000 ソタ*0ソ Z=タ==0
 12994:   //    16 ................0000000000000000 タ010タ
 12995:   //    17 ................0000000000000000 00100
 12996:   //  CCR
 12997:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 12998:   //    N  結果の最上位ビット
 12999:   //    Z  結果が0のときセット。他はクリア
 13000:   //    V  常にクリア
 13001:   //    C  countが0のときクリア。他は最後に押し出されたビット
 13002:   public static void irpLslToMem () throws M68kException {
 13003:     XEiJ.mpuCycleCount += 8;
 13004:     int ea = XEiJ.regOC & 63;
 13005:     int a = efaMltWord (ea);
 13006:     int x = XEiJ.busRws (a);
 13007:     int z = (short) (x << 1);
 13008:     XEiJ.busWw (a, z);
 13009:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 13010:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13011:                    x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13012:   }  //irpLslToMem
 13013: 
 13014:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13015:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13016:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13017:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13018:   //ROXR.W <ea>                                     |-|012346|-|*UUUU|***0*|  M+-WXZ  |1110_010_011_mmm_rrr
 13019:   //
 13020:   //ROXR.W #<data>,Dr
 13021:   //ROXR.W Dq,Dr
 13022:   //ROXR.W <ea>
 13023:   //  拡張右ローテートワード
 13024:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13025:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13026:   //     1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 13027:   //     2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 13028:   //     :
 13029:   //    15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 13030:   //    16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 13031:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13032:   //  CCR
 13033:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 13034:   //    N  結果の最上位ビット
 13035:   //    Z  結果が0のときセット。他はクリア
 13036:   //    V  常にクリア
 13037:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 13038:   public static void irpRoxrToMem () throws M68kException {
 13039:     XEiJ.mpuCycleCount += 8;
 13040:     int ea = XEiJ.regOC & 63;
 13041:     int a = efaMltWord (ea);
 13042:     int x = XEiJ.busRwz (a);
 13043:     int z = -(XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | x >>> 1;
 13044:     XEiJ.busWw (a, z);
 13045:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 13046:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13047:                    -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13048:   }  //irpRoxrToMem
 13049: 
 13050:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13051:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13052:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13053:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13054:   //ROXL.W <ea>                                     |-|012346|-|*UUUU|***0*|  M+-WXZ  |1110_010_111_mmm_rrr
 13055:   //
 13056:   //ROXL.W #<data>,Dr
 13057:   //ROXL.W Dq,Dr
 13058:   //ROXL.W <ea>
 13059:   //  拡張左ローテートワード
 13060:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13061:   //     0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13062:   //     1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0
 13063:   //     2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0
 13064:   //     :
 13065:   //    15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0
 13066:   //    16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0
 13067:   //    17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0
 13068:   //  CCR
 13069:   //    X  countが0のとき変化しない。他は最後に押し出されたビット
 13070:   //    N  結果の最上位ビット
 13071:   //    Z  結果が0のときセット。他はクリア
 13072:   //    V  常にクリア
 13073:   //    C  countが0のときXのコピー。他は最後に押し出されたビット
 13074:   public static void irpRoxlToMem () throws M68kException {
 13075:     XEiJ.mpuCycleCount += 8;
 13076:     int ea = XEiJ.regOC & 63;
 13077:     int a = efaMltWord (ea);
 13078:     int x = XEiJ.busRws (a);
 13079:     int z = (short) (x << 1 | XEiJ.regCCR >> 4 & 1);
 13080:     XEiJ.busWw (a, z);
 13081:     XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) |
 13082:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13083:                    x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C));  //XとCは最後に押し出されたビット
 13084:   }  //irpRoxlToMem
 13085: 
 13086:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13087:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13088:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13089:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13090:   //ROR.W <ea>                                      |-|012346|-|-UUUU|-**0*|  M+-WXZ  |1110_011_011_mmm_rrr
 13091:   //
 13092:   //ROR.W #<data>,Dr
 13093:   //ROR.W Dq,Dr
 13094:   //ROR.W <ea>
 13095:   //  右ローテートワード
 13096:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13097:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 13098:   //     1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0
 13099:   //     :
 13100:   //    15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0
 13101:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0
 13102:   //  CCR
 13103:   //    X  常に変化しない
 13104:   //    N  結果の最上位ビット
 13105:   //    Z  結果が0のときセット。他はクリア
 13106:   //    V  常にクリア
 13107:   //    C  countが0のときクリア。他は結果の最上位ビット
 13108:   public static void irpRorToMem () throws M68kException {
 13109:     XEiJ.mpuCycleCount += 8;
 13110:     int ea = XEiJ.regOC & 63;
 13111:     int a = efaMltWord (ea);
 13112:     int x = XEiJ.busRwz (a);
 13113:     int z = (short) (x << 15 | x >>> 1);
 13114:     XEiJ.busWw (a, z);
 13115:     XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 13116:                    (z < 0 ? XEiJ.REG_CCR_N : 0) |
 13117:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13118:                    z >>> 31);  //Cは結果の最上位ビット
 13119:   }  //irpRorToMem
 13120: 
 13121:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13122:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13123:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13124:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13125:   //ROL.W <ea>                                      |-|012346|-|-UUUU|-**0*|  M+-WXZ  |1110_011_111_mmm_rrr
 13126:   //
 13127:   //ROL.W #<data>,Dr
 13128:   //ROL.W Dq,Dr
 13129:   //ROL.W <ea>
 13130:   //  左ローテートワード
 13131:   //       ................アイウエオカキクケコサシスセソタ XNZVC
 13132:   //     0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0
 13133:   //     1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0
 13134:   //     :
 13135:   //    15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0
 13136:   //    16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0
 13137:   //  CCR
 13138:   //    X  常に変化しない
 13139:   //    N  結果の最上位ビット
 13140:   //    Z  結果が0のときセット。他はクリア
 13141:   //    V  常にクリア
 13142:   //    C  countが0のときクリア。他は結果の最下位ビット
 13143:   public static void irpRolToMem () throws M68kException {
 13144:     XEiJ.mpuCycleCount += 8;
 13145:     int ea = XEiJ.regOC & 63;
 13146:     int a = efaMltWord (ea);
 13147:     int x = XEiJ.busRwz (a);
 13148:     int z = (short) (x << 1 | x >>> 15);
 13149:     XEiJ.busWw (a, z);
 13150:     XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X |  //Xは変化しない
 13151:                    (z < 0 ? XEiJ.REG_CCR_N : 0) |
 13152:                    (z == 0 ? XEiJ.REG_CCR_Z : 0) |
 13153:                    z & 1);  //Cは結果の最下位ビット
 13154:   }  //irpRolToMem
 13155: 
 13156:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13157:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13158:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13159:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13160:   //FPACK <data>                                    |A|012346|-|UUUUU|*****|          |1111_111_0dd_ddd_ddd [FLINE #<data>]
 13161:   public static void irpFpack () throws M68kException {
 13162:     if (!MainMemory.mmrFEfuncActivated) {
 13163:       irpFline ();
 13164:       return;
 13165:     }
 13166:     StringBuilder sb;
 13167:     int a0;
 13168:     if (FEFunction.FPK_DEBUG_TRACE) {
 13169:       sb = new StringBuilder ();
 13170:       String name = Disassembler.DIS_FPACK_NAME[XEiJ.regOC & 255];
 13171:       if (name.length () == 0) {
 13172:         XEiJ.fmtHex4 (sb.append ('$'), XEiJ.regOC);
 13173:       } else {
 13174:         sb.append (name);
 13175:       }
 13176:       sb.append ('\n');
 13177:       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]);
 13178:       a0 = XEiJ.regRn[8];
 13179:       MainMemory.mmrRstr (sb.append (" (A0)=\""), a0, MainMemory.mmrStrlen (a0, 20)).append ("\"\n");
 13180:     }
 13181:     XEiJ.mpuCycleCount += FEFunction.FPK_CLOCK;  //一律にFEFunction.FPK_CLOCKサイクルかかることにする
 13182:     switch (XEiJ.regOC & 255) {
 13183:     case 0x00: FEFunction.fpkLMUL (); break;
 13184:     case 0x01: FEFunction.fpkLDIV (); break;
 13185:     case 0x02: FEFunction.fpkLMOD (); break;
 13186:       //case 0x03: break;
 13187:     case 0x04: FEFunction.fpkUMUL (); break;
 13188:     case 0x05: FEFunction.fpkUDIV (); break;
 13189:     case 0x06: FEFunction.fpkUMOD (); break;
 13190:       //case 0x07: break;
 13191:     case 0x08: FEFunction.fpkIMUL (); break;
 13192:     case 0x09: FEFunction.fpkIDIV (); break;
 13193:       //case 0x0a: break;
 13194:       //case 0x0b: break;
 13195:     case 0x0c: FEFunction.fpkRANDOMIZE (); break;
 13196:     case 0x0d: FEFunction.fpkSRAND (); break;
 13197:     case 0x0e: FEFunction.fpkRAND (); break;
 13198:       //case 0x0f: break;
 13199:     case 0x10: FEFunction.fpkSTOL (); break;
 13200:     case 0x11: FEFunction.fpkLTOS (); break;
 13201:     case 0x12: FEFunction.fpkSTOH (); break;
 13202:     case 0x13: FEFunction.fpkHTOS (); break;
 13203:     case 0x14: FEFunction.fpkSTOO (); break;
 13204:     case 0x15: FEFunction.fpkOTOS (); break;
 13205:     case 0x16: FEFunction.fpkSTOB (); break;
 13206:     case 0x17: FEFunction.fpkBTOS (); break;
 13207:     case 0x18: FEFunction.fpkIUSING (); break;
 13208:       //case 0x19: break;
 13209:     case 0x1a: FEFunction.fpkLTOD (); break;
 13210:     case 0x1b: FEFunction.fpkDTOL (); break;
 13211:     case 0x1c: FEFunction.fpkLTOF (); break;
 13212:     case 0x1d: FEFunction.fpkFTOL (); break;
 13213:     case 0x1e: FEFunction.fpkFTOD (); break;
 13214:     case 0x1f: FEFunction.fpkDTOF (); break;
 13215:     case 0x20: FEFunction.fpkVAL (); break;
 13216:     case 0x21: FEFunction.fpkUSING (); break;
 13217:     case 0x22: FEFunction.fpkSTOD (); break;
 13218:     case 0x23: FEFunction.fpkDTOS (); break;
 13219:     case 0x24: FEFunction.fpkECVT (); break;
 13220:     case 0x25: FEFunction.fpkFCVT (); break;
 13221:     case 0x26: FEFunction.fpkGCVT (); break;
 13222:       //case 0x27: break;
 13223:     case 0x28: FEFunction.fpkDTST (); break;
 13224:     case 0x29: FEFunction.fpkDCMP (); break;
 13225:     case 0x2a: FEFunction.fpkDNEG (); break;
 13226:     case 0x2b: FEFunction.fpkDADD (); break;
 13227:     case 0x2c: FEFunction.fpkDSUB (); break;
 13228:     case 0x2d: FEFunction.fpkDMUL (); break;
 13229:     case 0x2e: FEFunction.fpkDDIV (); break;
 13230:     case 0x2f: FEFunction.fpkDMOD (); break;
 13231:     case 0x30: FEFunction.fpkDABS (); break;
 13232:     case 0x31: FEFunction.fpkDCEIL (); break;
 13233:     case 0x32: FEFunction.fpkDFIX (); break;
 13234:     case 0x33: FEFunction.fpkDFLOOR (); break;
 13235:     case 0x34: FEFunction.fpkDFRAC (); break;
 13236:     case 0x35: FEFunction.fpkDSGN (); break;
 13237:     case 0x36: FEFunction.fpkSIN (); break;
 13238:     case 0x37: FEFunction.fpkCOS (); break;
 13239:     case 0x38: FEFunction.fpkTAN (); break;
 13240:     case 0x39: FEFunction.fpkATAN (); break;
 13241:     case 0x3a: FEFunction.fpkLOG (); break;
 13242:     case 0x3b: FEFunction.fpkEXP (); break;
 13243:     case 0x3c: FEFunction.fpkSQR (); break;
 13244:     case 0x3d: FEFunction.fpkPI (); break;
 13245:     case 0x3e: FEFunction.fpkNPI (); break;
 13246:     case 0x3f: FEFunction.fpkPOWER (); break;
 13247:     case 0x40: FEFunction.fpkRND (); break;
 13248:     case 0x41: FEFunction.fpkSINH (); break;
 13249:     case 0x42: FEFunction.fpkCOSH (); break;
 13250:     case 0x43: FEFunction.fpkTANH (); break;
 13251:     case 0x44: FEFunction.fpkATANH (); break;
 13252:     case 0x45: FEFunction.fpkASIN (); break;
 13253:     case 0x46: FEFunction.fpkACOS (); break;
 13254:     case 0x47: FEFunction.fpkLOG10 (); break;
 13255:     case 0x48: FEFunction.fpkLOG2 (); break;
 13256:     case 0x49: FEFunction.fpkDFREXP (); break;
 13257:     case 0x4a: FEFunction.fpkDLDEXP (); break;
 13258:     case 0x4b: FEFunction.fpkDADDONE (); break;
 13259:     case 0x4c: FEFunction.fpkDSUBONE (); break;
 13260:     case 0x4d: FEFunction.fpkDDIVTWO (); break;
 13261:     case 0x4e: FEFunction.fpkDIEECNV (); break;
 13262:     case 0x4f: FEFunction.fpkIEEDCNV (); break;
 13263:     case 0x50: FEFunction.fpkFVAL (); break;
 13264:     case 0x51: FEFunction.fpkFUSING (); break;
 13265:     case 0x52: FEFunction.fpkSTOF (); break;
 13266:     case 0x53: FEFunction.fpkFTOS (); break;
 13267:     case 0x54: FEFunction.fpkFECVT (); break;
 13268:     case 0x55: FEFunction.fpkFFCVT (); break;
 13269:     case 0x56: FEFunction.fpkFGCVT (); break;
 13270:       //case 0x57: break;
 13271:     case 0x58: FEFunction.fpkFTST (); break;
 13272:     case 0x59: FEFunction.fpkFCMP (); break;
 13273:     case 0x5a: FEFunction.fpkFNEG (); break;
 13274:     case 0x5b: FEFunction.fpkFADD (); break;
 13275:     case 0x5c: FEFunction.fpkFSUB (); break;
 13276:     case 0x5d: FEFunction.fpkFMUL (); break;
 13277:     case 0x5e: FEFunction.fpkFDIV (); break;
 13278:     case 0x5f: FEFunction.fpkFMOD (); break;
 13279:     case 0x60: FEFunction.fpkFABS (); break;
 13280:     case 0x61: FEFunction.fpkFCEIL (); break;
 13281:     case 0x62: FEFunction.fpkFFIX (); break;
 13282:     case 0x63: FEFunction.fpkFFLOOR (); break;
 13283:     case 0x64: FEFunction.fpkFFRAC (); break;
 13284:     case 0x65: FEFunction.fpkFSGN (); break;
 13285:     case 0x66: FEFunction.fpkFSIN (); break;
 13286:     case 0x67: FEFunction.fpkFCOS (); break;
 13287:     case 0x68: FEFunction.fpkFTAN (); break;
 13288:     case 0x69: FEFunction.fpkFATAN (); break;
 13289:     case 0x6a: FEFunction.fpkFLOG (); break;
 13290:     case 0x6b: FEFunction.fpkFEXP (); break;
 13291:     case 0x6c: FEFunction.fpkFSQR (); break;
 13292:     case 0x6d: FEFunction.fpkFPI (); break;
 13293:     case 0x6e: FEFunction.fpkFNPI (); break;
 13294:     case 0x6f: FEFunction.fpkFPOWER (); break;
 13295:     case 0x70: FEFunction.fpkFRND (); break;
 13296:     case 0x71: FEFunction.fpkFSINH (); break;
 13297:     case 0x72: FEFunction.fpkFCOSH (); break;
 13298:     case 0x73: FEFunction.fpkFTANH (); break;
 13299:     case 0x74: FEFunction.fpkFATANH (); break;
 13300:     case 0x75: FEFunction.fpkFASIN (); break;
 13301:     case 0x76: FEFunction.fpkFACOS (); break;
 13302:     case 0x77: FEFunction.fpkFLOG10 (); break;
 13303:     case 0x78: FEFunction.fpkFLOG2 (); break;
 13304:     case 0x79: FEFunction.fpkFFREXP (); break;
 13305:     case 0x7a: FEFunction.fpkFLDEXP (); break;
 13306:     case 0x7b: FEFunction.fpkFADDONE (); break;
 13307:     case 0x7c: FEFunction.fpkFSUBONE (); break;
 13308:     case 0x7d: FEFunction.fpkFDIVTWO (); break;
 13309:     case 0x7e: FEFunction.fpkFIEECNV (); break;
 13310:     case 0x7f: FEFunction.fpkIEEFCNV (); break;
 13311:       //case 0x80: break;
 13312:       //case 0x81: break;
 13313:       //case 0x82: break;
 13314:       //case 0x83: break;
 13315:       //case 0x84: break;
 13316:       //case 0x85: break;
 13317:       //case 0x86: break;
 13318:       //case 0x87: break;
 13319:       //case 0x88: break;
 13320:       //case 0x89: break;
 13321:       //case 0x8a: break;
 13322:       //case 0x8b: break;
 13323:       //case 0x8c: break;
 13324:       //case 0x8d: break;
 13325:       //case 0x8e: break;
 13326:       //case 0x8f: break;
 13327:       //case 0x90: break;
 13328:       //case 0x91: break;
 13329:       //case 0x92: break;
 13330:       //case 0x93: break;
 13331:       //case 0x94: break;
 13332:       //case 0x95: break;
 13333:       //case 0x96: break;
 13334:       //case 0x97: break;
 13335:       //case 0x98: break;
 13336:       //case 0x99: break;
 13337:       //case 0x9a: break;
 13338:       //case 0x9b: break;
 13339:       //case 0x9c: break;
 13340:       //case 0x9d: break;
 13341:       //case 0x9e: break;
 13342:       //case 0x9f: break;
 13343:       //case 0xa0: break;
 13344:       //case 0xa1: break;
 13345:       //case 0xa2: break;
 13346:       //case 0xa3: break;
 13347:       //case 0xa4: break;
 13348:       //case 0xa5: break;
 13349:       //case 0xa6: break;
 13350:       //case 0xa7: break;
 13351:       //case 0xa8: break;
 13352:       //case 0xa9: break;
 13353:       //case 0xaa: break;
 13354:       //case 0xab: break;
 13355:       //case 0xac: break;
 13356:       //case 0xad: break;
 13357:       //case 0xae: break;
 13358:       //case 0xaf: break;
 13359:       //case 0xb0: break;
 13360:       //case 0xb1: break;
 13361:       //case 0xb2: break;
 13362:       //case 0xb3: break;
 13363:       //case 0xb4: break;
 13364:       //case 0xb5: break;
 13365:       //case 0xb6: break;
 13366:       //case 0xb7: break;
 13367:       //case 0xb8: break;
 13368:       //case 0xb9: break;
 13369:       //case 0xba: break;
 13370:       //case 0xbb: break;
 13371:       //case 0xbc: break;
 13372:       //case 0xbd: break;
 13373:       //case 0xbe: break;
 13374:       //case 0xbf: break;
 13375:       //case 0xc0: break;
 13376:       //case 0xc1: break;
 13377:       //case 0xc2: break;
 13378:       //case 0xc3: break;
 13379:       //case 0xc4: break;
 13380:       //case 0xc5: break;
 13381:       //case 0xc6: break;
 13382:       //case 0xc7: break;
 13383:       //case 0xc8: break;
 13384:       //case 0xc9: break;
 13385:       //case 0xca: break;
 13386:       //case 0xcb: break;
 13387:       //case 0xcc: break;
 13388:       //case 0xcd: break;
 13389:       //case 0xce: break;
 13390:       //case 0xcf: break;
 13391:       //case 0xd0: break;
 13392:       //case 0xd1: break;
 13393:       //case 0xd2: break;
 13394:       //case 0xd3: break;
 13395:       //case 0xd4: break;
 13396:       //case 0xd5: break;
 13397:       //case 0xd6: break;
 13398:       //case 0xd7: break;
 13399:       //case 0xd8: break;
 13400:       //case 0xd9: break;
 13401:       //case 0xda: break;
 13402:       //case 0xdb: break;
 13403:       //case 0xdc: break;
 13404:       //case 0xdd: break;
 13405:       //case 0xde: break;
 13406:       //case 0xdf: break;
 13407:     case 0xe0: FEFunction.fpkCLMUL (); break;
 13408:     case 0xe1: FEFunction.fpkCLDIV (); break;
 13409:     case 0xe2: FEFunction.fpkCLMOD (); break;
 13410:     case 0xe3: FEFunction.fpkCUMUL (); break;
 13411:     case 0xe4: FEFunction.fpkCUDIV (); break;
 13412:     case 0xe5: FEFunction.fpkCUMOD (); break;
 13413:     case 0xe6: FEFunction.fpkCLTOD (); break;
 13414:     case 0xe7: FEFunction.fpkCDTOL (); break;
 13415:     case 0xe8: FEFunction.fpkCLTOF (); break;
 13416:     case 0xe9: FEFunction.fpkCFTOL (); break;
 13417:     case 0xea: FEFunction.fpkCFTOD (); break;
 13418:     case 0xeb: FEFunction.fpkCDTOF (); break;
 13419:     case 0xec: FEFunction.fpkCDCMP (); break;
 13420:     case 0xed: FEFunction.fpkCDADD (); break;
 13421:     case 0xee: FEFunction.fpkCDSUB (); break;
 13422:     case 0xef: FEFunction.fpkCDMUL (); break;
 13423:     case 0xf0: FEFunction.fpkCDDIV (); break;
 13424:     case 0xf1: FEFunction.fpkCDMOD (); break;
 13425:     case 0xf2: FEFunction.fpkCFCMP (); break;
 13426:     case 0xf3: FEFunction.fpkCFADD (); break;
 13427:     case 0xf4: FEFunction.fpkCFSUB (); break;
 13428:     case 0xf5: FEFunction.fpkCFMUL (); break;
 13429:     case 0xf6: FEFunction.fpkCFDIV (); break;
 13430:     case 0xf7: FEFunction.fpkCFMOD (); break;
 13431:     case 0xf8: FEFunction.fpkCDTST (); break;
 13432:     case 0xf9: FEFunction.fpkCFTST (); break;
 13433:     case 0xfa: FEFunction.fpkCDINC (); break;
 13434:     case 0xfb: FEFunction.fpkCFINC (); break;
 13435:     case 0xfc: FEFunction.fpkCDDEC (); break;
 13436:     case 0xfd: FEFunction.fpkCFDEC (); break;
 13437:     case 0xfe: FEFunction.fpkFEVARG (); break;
 13438:     //case 0xff: FEFunction.fpkFEVECS (); break;  //FLOATn.Xに処理させる
 13439:     default:
 13440:       XEiJ.mpuCycleCount -= FEFunction.FPK_CLOCK;  //戻す
 13441:       irpFline ();
 13442:     }
 13443:     if (FEFunction.FPK_DEBUG_TRACE) {
 13444:       int i = sb.length ();
 13445:       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]);
 13446:       int l = MainMemory.mmrStrlen (a0, 20);
 13447:       sb.append (" (A0)=\"");
 13448:       i = sb.length () - i;
 13449:       MainMemory.mmrRstr (sb, a0, l).append ("\"\n");
 13450:       if (a0 <= XEiJ.regRn[8] && XEiJ.regRn[8] <= a0 + l) {
 13451:         for (i += sb.length () + XEiJ.regRn[8] - a0; sb.length () < i; ) {
 13452:           sb.append (' ');
 13453:         }
 13454:         sb.append ('^');
 13455:       }
 13456:       System.out.println (sb.toString ());
 13457:     }
 13458:   }  //irpFpack
 13459: 
 13460:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13461:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13462:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13463:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13464:   //DOS <data>                                      |A|012346|-|UUUUU|UUUUU|          |1111_111_1dd_ddd_ddd [FLINE #<data>]
 13465:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13466:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13467:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13468:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13469:   //FLINE #<data>                                   |-|012346|-|UUUUU|UUUUU|          |1111_ddd_ddd_ddd_ddd (line 1111 emulator)
 13470:   public static void irpFline () throws M68kException {
 13471:     XEiJ.mpuCycleCount += 34;
 13472:     if (XEiJ.MPU_INLINE_EXCEPTION) {
 13473:       int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
 13474:       int sp = XEiJ.regRn[15];
 13475:       XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
 13476:       if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 13477:         XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 13478:         XEiJ.mpuUSP = sp;  //USPを保存
 13479:         sp = XEiJ.mpuISP;  //SSPを復元
 13480:         if (DataBreakPoint.DBP_ON) {
 13481:           DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 13482:         } else {
 13483:           XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 13484:         }
 13485:         if (InstructionBreakPoint.IBP_ON) {
 13486:           InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 13487:         }
 13488:       }
 13489:       int vectorOffset = M68kException.M6E_LINE_1111_EMULATOR << 2;  //vector offset
 13490:       XEiJ.regRn[15] = sp -= 8;  //short format
 13491:       XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 13492:       XEiJ.busWl (sp + 2, XEiJ.regPC0);  //program counter
 13493:       XEiJ.busWw (sp, save_sr);  //status register
 13494:       irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 13495:     } else {
 13496:       irpException (M68kException.M6E_LINE_1111_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR);  //pcは命令の先頭
 13497:     }
 13498:   }  //irpFline
 13499: 
 13500:   //irpIllegal ()
 13501:   //  オペコードの上位10bitで分類されなかった未実装命令
 13502:   //  0x4afcのILLEGAL命令はここには来ない
 13503:   public static void irpIllegal () throws M68kException {
 13504:     if (true) {
 13505:       XEiJ.mpuCycleCount += 34;
 13506:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 13507:       throw M68kException.m6eSignal;
 13508:     }
 13509:   }  //irpIllegal
 13510: 
 13511:   //z = irpAbcd (x, y)
 13512:   //  ABCD
 13513:   public static int irpAbcd (int x, int y) {
 13514:     int c = XEiJ.regCCR >> 4;
 13515:     int t = (x & 0xff) + (y & 0xff) + c;  //仮の結果
 13516:     int z = t;  //結果
 13517:     if (0x0a <= (x & 0x0f) + (y & 0x0f) + c) {  //ハーフキャリー
 13518:       z += 0x10 - 0x0a;
 13519:     }
 13520:     //XとCはキャリーがあるときセット、さもなくばクリア
 13521:     if (0xa0 <= z) {  //キャリー
 13522:       z += 0x100 - 0xa0;
 13523:       XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C;
 13524:     } else {
 13525:       XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);
 13526:     }
 13527:     //Zは結果が0でないときクリア、さもなくば変化しない
 13528:     z &= 0xff;
 13529:     if (z != 0x00) {
 13530:       XEiJ.regCCR &= ~XEiJ.REG_CCR_Z;
 13531:     }
 13532:     if (true) {
 13533:       //000/030のときNは結果の最上位ビット
 13534:       if ((z & 0x80) != 0) {
 13535:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13536:       } else {
 13537:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13538:       }
 13539:       //000のときVは補正値の加算でオーバーフローしたときセット、さもなくばクリア
 13540:       int a = z - t;  //補正値
 13541:       if ((((t ^ z) & (a ^ z)) & 0x80) != 0) {
 13542:         XEiJ.regCCR |= XEiJ.REG_CCR_V;
 13543:       } else {
 13544:         XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13545:       }
 13546:     } else if (false) {
 13547:       //000/030のときNは結果の最上位ビット
 13548:       if ((z & 0x80) != 0) {
 13549:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13550:       } else {
 13551:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13552:       }
 13553:       //030のときVはクリア
 13554:       XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13555:     } else {
 13556:       //060のときNとVは変化しない
 13557:     }
 13558:     return z;
 13559:   }  //irpAbcd
 13560: 
 13561:   //z = irpSbcd (x, y)
 13562:   //  SBCD
 13563:   public static int irpSbcd (int x, int y) {
 13564:     int b = XEiJ.regCCR >> 4;
 13565:     int t = (x & 0xff) - (y & 0xff) - b;  //仮の結果
 13566:     int z = t;  //結果
 13567:     if ((x & 0x0f) - (y & 0x0f) - b < 0) {  //ハーフボロー
 13568:       z -= 0x10 - 0x0a;
 13569:     }
 13570:     //XとCはボローがあるときセット、さもなくばクリア
 13571:     if (z < 0) {  //ボロー
 13572:       if (t < 0) {
 13573:         z -= 0x100 - 0xa0;
 13574:       }
 13575:       XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C;
 13576:     } else {
 13577:       XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C);
 13578:     }
 13579:     //Zは結果が0でないときクリア、さもなくば変化しない
 13580:     z &= 0xff;
 13581:     if (z != 0x00) {
 13582:       XEiJ.regCCR &= ~XEiJ.REG_CCR_Z;
 13583:     }
 13584:     if (true) {
 13585:       //000/030のときNは結果の最上位ビット
 13586:       if ((z & 0x80) != 0) {
 13587:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13588:       } else {
 13589:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13590:       }
 13591:       //000のときVは補正値の減算でオーバーフローしたときセット、さもなくばクリア
 13592:       int a = t - z;  //補正値
 13593:       if ((((t & (a ^ z)) ^ (a | z)) & 0x80) != 0) {
 13594:         XEiJ.regCCR |= XEiJ.REG_CCR_V;
 13595:       } else {
 13596:         XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13597:       }
 13598:     } else if (false) {
 13599:       //000/030のときNは結果の最上位ビット
 13600:       if ((z & 0x80) != 0) {
 13601:         XEiJ.regCCR |= XEiJ.REG_CCR_N;
 13602:       } else {
 13603:         XEiJ.regCCR &= ~XEiJ.REG_CCR_N;
 13604:       }
 13605:       //030のときVはクリア
 13606:       XEiJ.regCCR &= ~XEiJ.REG_CCR_V;
 13607:     } else {
 13608:       //060のときNとVは変化しない
 13609:     }
 13610:     return z;
 13611:   }  //irpSbcd
 13612: 
 13613: 
 13614: 
 13615:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13616:   //                                                | |  MPU | |CCin |CCout|addressing|     1st opcode         2nd opcode
 13617:   //                           A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb
 13618:   //------------------------------------------------+-+------+-+-----+-----+----------+-------------------------------------
 13619:   //HFSBOOT                                         |-|012346|-|-----|-----|          |0100_111_000_000_000
 13620:   //HFSINST                                         |-|012346|-|-----|-----|          |0100_111_000_000_001
 13621:   //HFSSTR                                          |-|012346|-|-----|-----|          |0100_111_000_000_010
 13622:   //HFSINT                                          |-|012346|-|-----|-----|          |0100_111_000_000_011
 13623:   //EMXNOP                                          |-|012346|-|-----|-----|          |0100_111_000_000_100
 13624:   //  エミュレータ拡張命令
 13625:   public static void irpEmx () throws M68kException {
 13626:     switch (XEiJ.regOC & 63) {
 13627:     case XEiJ.EMX_OPCODE_HFSBOOT & 63:
 13628:       XEiJ.mpuCycleCount += 40;
 13629:       if (HFS.hfsIPLBoot ()) {
 13630:         //JMP $6800.W
 13631:         irpSetPC (0x00006800);
 13632:       }
 13633:       break;
 13634:     case XEiJ.EMX_OPCODE_HFSINST & 63:
 13635:       XEiJ.mpuCycleCount += 40;
 13636:       HFS.hfsInstall ();
 13637:       break;
 13638:     case XEiJ.EMX_OPCODE_HFSSTR & 63:
 13639:       XEiJ.mpuCycleCount += 40;
 13640:       HFS.hfsStrategy ();
 13641:       break;
 13642:     case XEiJ.EMX_OPCODE_HFSINT & 63:
 13643:       XEiJ.mpuCycleCount += 40;
 13644:       //XEiJ.mpuClockTime += (int) (TMR_FREQ / 100000L);  //0.01ms
 13645:       if (HFS.hfsInterrupt ()) {
 13646:         //WAIT
 13647:         XEiJ.mpuTraceFlag = 0;  //トレース例外を発生させない
 13648:         XEiJ.regPC = XEiJ.regPC0;  //ループ
 13649:         XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000;  //4μs。10MHzのとき40clk
 13650:         XEiJ.mpuLastNano += 4000L;
 13651:       }
 13652:       break;
 13653:     case XEiJ.EMX_OPCODE_EMXNOP & 63:
 13654:       XEiJ.emxNop ();
 13655:       break;
 13656:     default:
 13657:       XEiJ.mpuCycleCount += 34;
 13658:       M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 13659:       throw M68kException.m6eSignal;
 13660:     }
 13661:   }  //irpEmx
 13662: 
 13663: 
 13664: 
 13665:   //irpSetPC (a)
 13666:   //  pcへデータを書き込む
 13667:   //  奇数のときはアドレスエラーが発生する
 13668:   public static void irpSetPC (int a) throws M68kException {
 13669:     if (XEiJ.TEST_BIT_0_SHIFT ? a << 31 - 0 < 0 : (a & 1) != 0) {
 13670:       M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR;
 13671:       M68kException.m6eAddress = a;
 13672:       M68kException.m6eDirection = XEiJ.MPU_WR_READ;
 13673:       M68kException.m6eSize = XEiJ.MPU_SS_LONG;
 13674:       throw M68kException.m6eSignal;
 13675:     }
 13676:     if (BranchLog.BLG_ON) {
 13677:       //BranchLog.blgJump (a);  //分岐ログに分岐レコードを追加する
 13678:       if (BranchLog.blgPrevHeadSuper != (BranchLog.blgHead | BranchLog.blgSuper) || BranchLog.blgPrevTail != XEiJ.regPC0) {  //前回のレコードと異なるとき
 13679:         int i = (char) BranchLog.blgNewestRecord++ << BranchLog.BLG_RECORD_SHIFT;
 13680:         BranchLog.blgArray[i] = BranchLog.blgPrevHeadSuper = BranchLog.blgHead | BranchLog.blgSuper;
 13681:         BranchLog.blgArray[i + 1] = BranchLog.blgPrevTail = XEiJ.regPC0;
 13682:       }
 13683:       BranchLog.blgHead = XEiJ.regPC = a;
 13684:       BranchLog.blgSuper = XEiJ.regSRS >>> 13;
 13685:     } else {
 13686:       XEiJ.regPC = a;
 13687:     }
 13688:   }  //irpSetPC
 13689: 
 13690:   //irpSetSR (newSr)
 13691:   //  srへデータを書き込む
 13692:   //  ori to sr/andi to sr/eori to sr/move to sr/stop/rteで使用される
 13693:   //  スーパーバイザモードになっていることを確認してから呼び出すこと
 13694:   //  rteではr[15]が指すアドレスからsrとpcを取り出してr[15]を更新してから呼び出すこと
 13695:   //  スーパーバイザモード→ユーザモードのときは移行のための処理を行う
 13696:   //  新しい割り込みマスクレベルよりも高い割り込み処理の終了をデバイスに通知する
 13697:   public static void irpSetSR (int newSr) {
 13698:     XEiJ.regSRT1 = XEiJ.REG_SR_T1 & newSr;
 13699:     if ((XEiJ.regSRS = XEiJ.REG_SR_S & newSr) == 0) {  //スーパーバイザモード→ユーザモード
 13700:       XEiJ.mpuISP = XEiJ.regRn[15];  //XEiJ.mpuISPを保存
 13701:       XEiJ.regRn[15] = XEiJ.mpuUSP;  //XEiJ.mpuUSPを復元
 13702:       if (DataBreakPoint.DBP_ON) {
 13703:         DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpUserMap;  //ユーザメモリマップに切り替える
 13704:       } else {
 13705:         XEiJ.busMemoryMap = XEiJ.busUserMap;  //ユーザメモリマップに切り替える
 13706:       }
 13707:       if (InstructionBreakPoint.IBP_ON) {
 13708:         InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1UserMap;
 13709:       }
 13710:     }
 13711:     int t = (XEiJ.mpuIMR = 0x7f >> ((XEiJ.regSRI = XEiJ.REG_SR_I & newSr) >> 8)) & XEiJ.mpuISR;  //XEiJ.mpuISRで1→0とするビット
 13712:     if (t != 0) {  //終了する割り込みがあるとき
 13713:       XEiJ.mpuISR ^= t;
 13714:       //デバイスに割り込み処理の終了を通知する
 13715:       if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) {  //MFPのみ
 13716:         MC68901.mfpDone ();
 13717:       } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) {  //DMAのみ
 13718:         HD63450.dmaDone ();
 13719:       } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) {  //SCCのみ
 13720:         Z8530.sccDone ();
 13721:       } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) {  //IOIのみ
 13722:         IOInterrupt.ioiDone ();
 13723:       } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) {  //EB2のみ
 13724:         XEiJ.eb2Done ();
 13725:       } else {  //SYSのみまたは複数
 13726:         if (XEiJ.TEST_BIT_1_SHIFT ? t << 24 + XEiJ.MPU_MFP_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_MFP_INTERRUPT_MASK) != 0) {
 13727:           MC68901.mfpDone ();
 13728:         }
 13729:         if (t << 24 + XEiJ.MPU_DMA_INTERRUPT_LEVEL < 0) {  //(t & XEiJ.MPU_DMA_INTERRUPT_MASK) != 0
 13730:           HD63450.dmaDone ();
 13731:         }
 13732:         if (XEiJ.TEST_BIT_2_SHIFT ? t << 24 + XEiJ.MPU_SCC_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SCC_INTERRUPT_MASK) != 0) {
 13733:           Z8530.sccDone ();
 13734:         }
 13735:         if (t << 24 + XEiJ.MPU_IOI_INTERRUPT_LEVEL < 0) {  //(t & XEiJ.MPU_IOI_INTERRUPT_MASK) != 0
 13736:           IOInterrupt.ioiDone ();
 13737:         }
 13738:         if (t << 24 + XEiJ.MPU_EB2_INTERRUPT_LEVEL < 0) {  //(t & XEiJ.MPU_EB2_INTERRUPT_MASK) != 0
 13739:           XEiJ.eb2Done ();
 13740:         }
 13741:         if (XEiJ.TEST_BIT_0_SHIFT ? t << 24 + XEiJ.MPU_SYS_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SYS_INTERRUPT_MASK) != 0) {
 13742:           XEiJ.sysDone ();
 13743:         }
 13744:       }
 13745:     }
 13746:     XEiJ.mpuIMR |= ~XEiJ.mpuISR & XEiJ.MPU_SYS_INTERRUPT_MASK;  //割り込みマスクレベルが7のときレベル7割り込みの処理中でなければレベル7割り込みを許可する
 13747:     XEiJ.regCCR = XEiJ.REG_CCR_MASK & newSr;
 13748:   }  //irpSetSR
 13749: 
 13750:   //irpInterrupt (vectorNumber, level)
 13751:   //  割り込み処理を開始する
 13752:   public static void irpInterrupt (int vectorNumber, int level) throws M68kException {
 13753:     if (XEiJ.regOC == 0b0100_111_001_110_010) {  //最後に実行した命令はSTOP命令
 13754:       XEiJ.regPC = XEiJ.regPC0 + 4;  //次の命令に進む
 13755:     }
 13756:     XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * 44;
 13757:     int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR;
 13758:     XEiJ.regSRI = level << 8;  //割り込みマスクを要求されたレベルに変更する
 13759:     XEiJ.mpuIMR = 0x7f >> level;
 13760:     XEiJ.mpuISR |= 0x80 >> level;
 13761:     int sp = XEiJ.regRn[15];
 13762:     XEiJ.regSRT1 = 0;  //srのTビットを消す
 13763:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 13764:       XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 13765:       XEiJ.mpuUSP = sp;  //USPを保存
 13766:       sp = XEiJ.mpuISP;  //SSPを復元
 13767:       if (DataBreakPoint.DBP_ON) {
 13768:         DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 13769:       } else {
 13770:         XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 13771:       }
 13772:       if (InstructionBreakPoint.IBP_ON) {
 13773:         InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 13774:       }
 13775:     }
 13776:     int vectorOffset = vectorNumber << 2;  //vector offset
 13777:     XEiJ.regRn[15] = sp -= 8;  //short format
 13778:     XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 13779:     XEiJ.busWl (sp + 2, XEiJ.regPC);  //program counter
 13780:     XEiJ.busWw (sp, save_sr);  //status register
 13781:     if (BranchLog.BLG_ON) {
 13782:       XEiJ.regPC0 = XEiJ.regPC;  //rteによる割り込み終了と同時に次の割り込みを受け付けたとき間でpc0を更新しないと2番目の分岐レコードの終了アドレスが1番目と同じになっておかしな分岐レコードができてしまう
 13783:     }
 13784:     irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 13785:   }  //irpInterrupt
 13786: 
 13787:   //irpException (vectorNumber, save_pc, save_sr)
 13788:   //  例外処理を開始する
 13789:   //  スタックへのプッシュ、ベクタの取り出し、ジャンプのいずれかでバスエラーまたはアドレスエラーが発生する場合がある
 13790:   public static void irpException (int vectorNumber, int save_pc, int save_sr) throws M68kException {
 13791:     int sp = XEiJ.regRn[15];
 13792:     XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0;  //srのTビットを消す
 13793:     if (XEiJ.regSRS == 0) {  //ユーザモードのとき
 13794:       XEiJ.regSRS = XEiJ.REG_SR_S;  //スーパーバイザモードへ移行する
 13795:       XEiJ.mpuUSP = sp;  //USPを保存
 13796:       sp = XEiJ.mpuISP;  //SSPを復元
 13797:       if (DataBreakPoint.DBP_ON) {
 13798:         DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap;  //スーパーバイザメモリマップに切り替える
 13799:       } else {
 13800:         XEiJ.busMemoryMap = XEiJ.busSuperMap;  //スーパーバイザメモリマップに切り替える
 13801:       }
 13802:       if (InstructionBreakPoint.IBP_ON) {
 13803:         InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
 13804:       }
 13805:     }
 13806:     int vectorOffset = vectorNumber << 2;  //vector offset
 13807:     XEiJ.regRn[15] = sp -= 8;  //short format
 13808:     XEiJ.busWw (sp + 6, 0x0000 | vectorOffset);  //format and vector offset
 13809:     XEiJ.busWl (sp + 2, save_pc);  //program counter
 13810:     XEiJ.busWw (sp, save_sr);  //status register
 13811:     irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset));  //例外ベクタを取り出してジャンプする
 13812:   }  //irpException
 13813: 
 13814: 
 13815: 
 13816:   //a = efaAnyByte (ea)  //|  M+-WXZPI|
 13817:   //  任意のモードのバイトオペランドの実効アドレスを求める
 13818:   //  (A7)+と-(A7)はA7を奇偶に関わらず2変化させ、跨いだワードの上位バイト(アドレスの小さい方)を参照する
 13819:   //  #<data>はオペコードに続くワードの下位バイトを参照する。上位バイトは不定なので参照してはならない
 13820:   @SuppressWarnings ("fallthrough") public static int efaAnyByte (int ea) throws M68kException {
 13821:     int t, w;
 13822:     switch (ea) {
 13823:     case 0b010_000:  //(A0)
 13824:       if (XEiJ.EFA_SEPARATE_AR) {
 13825:         XEiJ.mpuCycleCount += 4;
 13826:         return XEiJ.regRn[ 8];
 13827:       }
 13828:       //fallthrough
 13829:     case 0b010_001:  //(A1)
 13830:       if (XEiJ.EFA_SEPARATE_AR) {
 13831:         XEiJ.mpuCycleCount += 4;
 13832:         return XEiJ.regRn[ 9];
 13833:       }
 13834:       //fallthrough
 13835:     case 0b010_010:  //(A2)
 13836:       if (XEiJ.EFA_SEPARATE_AR) {
 13837:         XEiJ.mpuCycleCount += 4;
 13838:         return XEiJ.regRn[10];
 13839:       }
 13840:       //fallthrough
 13841:     case 0b010_011:  //(A3)
 13842:       if (XEiJ.EFA_SEPARATE_AR) {
 13843:         XEiJ.mpuCycleCount += 4;
 13844:         return XEiJ.regRn[11];
 13845:       }
 13846:       //fallthrough
 13847:     case 0b010_100:  //(A4)
 13848:       if (XEiJ.EFA_SEPARATE_AR) {
 13849:         XEiJ.mpuCycleCount += 4;
 13850:         return XEiJ.regRn[12];
 13851:       }
 13852:       //fallthrough
 13853:     case 0b010_101:  //(A5)
 13854:       if (XEiJ.EFA_SEPARATE_AR) {
 13855:         XEiJ.mpuCycleCount += 4;
 13856:         return XEiJ.regRn[13];
 13857:       }
 13858:       //fallthrough
 13859:     case 0b010_110:  //(A6)
 13860:       if (XEiJ.EFA_SEPARATE_AR) {
 13861:         XEiJ.mpuCycleCount += 4;
 13862:         return XEiJ.regRn[14];
 13863:       }
 13864:       //fallthrough
 13865:     case 0b010_111:  //(A7)
 13866:       if (XEiJ.EFA_SEPARATE_AR) {
 13867:         XEiJ.mpuCycleCount += 4;
 13868:         return XEiJ.regRn[15];
 13869:       } else {
 13870:         XEiJ.mpuCycleCount += 4;
 13871:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 13872:       }
 13873:     case 0b011_000:  //(A0)+
 13874:       if (XEiJ.EFA_SEPARATE_AR) {
 13875:         XEiJ.mpuCycleCount += 4;
 13876:         return XEiJ.regRn[ 8]++;
 13877:       }
 13878:       //fallthrough
 13879:     case 0b011_001:  //(A1)+
 13880:       if (XEiJ.EFA_SEPARATE_AR) {
 13881:         XEiJ.mpuCycleCount += 4;
 13882:         return XEiJ.regRn[ 9]++;
 13883:       }
 13884:       //fallthrough
 13885:     case 0b011_010:  //(A2)+
 13886:       if (XEiJ.EFA_SEPARATE_AR) {
 13887:         XEiJ.mpuCycleCount += 4;
 13888:         return XEiJ.regRn[10]++;
 13889:       }
 13890:       //fallthrough
 13891:     case 0b011_011:  //(A3)+
 13892:       if (XEiJ.EFA_SEPARATE_AR) {
 13893:         XEiJ.mpuCycleCount += 4;
 13894:         return XEiJ.regRn[11]++;
 13895:       }
 13896:       //fallthrough
 13897:     case 0b011_100:  //(A4)+
 13898:       if (XEiJ.EFA_SEPARATE_AR) {
 13899:         XEiJ.mpuCycleCount += 4;
 13900:         return XEiJ.regRn[12]++;
 13901:       }
 13902:       //fallthrough
 13903:     case 0b011_101:  //(A5)+
 13904:       if (XEiJ.EFA_SEPARATE_AR) {
 13905:         XEiJ.mpuCycleCount += 4;
 13906:         return XEiJ.regRn[13]++;
 13907:       }
 13908:       //fallthrough
 13909:     case 0b011_110:  //(A6)+
 13910:       if (XEiJ.EFA_SEPARATE_AR) {
 13911:         XEiJ.mpuCycleCount += 4;
 13912:         return XEiJ.regRn[14]++;
 13913:       } else {
 13914:         XEiJ.mpuCycleCount += 4;
 13915:         return XEiJ.regRn[ea - (0b011_000 - 8)]++;
 13916:       }
 13917:     case 0b011_111:  //(A7)+
 13918:       XEiJ.mpuCycleCount += 4;
 13919:       return (XEiJ.regRn[15] += 2) - 2;
 13920:     case 0b100_000:  //-(A0)
 13921:       if (XEiJ.EFA_SEPARATE_AR) {
 13922:         XEiJ.mpuCycleCount += 6;
 13923:         return --XEiJ.regRn[ 8];
 13924:       }
 13925:       //fallthrough
 13926:     case 0b100_001:  //-(A1)
 13927:       if (XEiJ.EFA_SEPARATE_AR) {
 13928:         XEiJ.mpuCycleCount += 6;
 13929:         return --XEiJ.regRn[ 9];
 13930:       }
 13931:       //fallthrough
 13932:     case 0b100_010:  //-(A2)
 13933:       if (XEiJ.EFA_SEPARATE_AR) {
 13934:         XEiJ.mpuCycleCount += 6;
 13935:         return --XEiJ.regRn[10];
 13936:       }
 13937:       //fallthrough
 13938:     case 0b100_011:  //-(A3)
 13939:       if (XEiJ.EFA_SEPARATE_AR) {
 13940:         XEiJ.mpuCycleCount += 6;
 13941:         return --XEiJ.regRn[11];
 13942:       }
 13943:       //fallthrough
 13944:     case 0b100_100:  //-(A4)
 13945:       if (XEiJ.EFA_SEPARATE_AR) {
 13946:         XEiJ.mpuCycleCount += 6;
 13947:         return --XEiJ.regRn[12];
 13948:       }
 13949:       //fallthrough
 13950:     case 0b100_101:  //-(A5)
 13951:       if (XEiJ.EFA_SEPARATE_AR) {
 13952:         XEiJ.mpuCycleCount += 6;
 13953:         return --XEiJ.regRn[13];
 13954:       }
 13955:       //fallthrough
 13956:     case 0b100_110:  //-(A6)
 13957:       if (XEiJ.EFA_SEPARATE_AR) {
 13958:         XEiJ.mpuCycleCount += 6;
 13959:         return --XEiJ.regRn[14];
 13960:       } else {
 13961:         XEiJ.mpuCycleCount += 6;
 13962:         return --XEiJ.regRn[ea - (0b100_000 - 8)];
 13963:       }
 13964:     case 0b100_111:  //-(A7)
 13965:       XEiJ.mpuCycleCount += 6;
 13966:       return XEiJ.regRn[15] -= 2;
 13967:     case 0b101_000:  //(d16,A0)
 13968:     case 0b101_001:  //(d16,A1)
 13969:     case 0b101_010:  //(d16,A2)
 13970:     case 0b101_011:  //(d16,A3)
 13971:     case 0b101_100:  //(d16,A4)
 13972:     case 0b101_101:  //(d16,A5)
 13973:     case 0b101_110:  //(d16,A6)
 13974:     case 0b101_111:  //(d16,A7)
 13975:       XEiJ.mpuCycleCount += 8;
 13976:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 13977:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 13978:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 13979:       } else {
 13980:         t = XEiJ.regPC;
 13981:         XEiJ.regPC = t + 2;
 13982:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 13983:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 13984:       }
 13985:     case 0b110_000:  //(d8,A0,Rn.wl)
 13986:     case 0b110_001:  //(d8,A1,Rn.wl)
 13987:     case 0b110_010:  //(d8,A2,Rn.wl)
 13988:     case 0b110_011:  //(d8,A3,Rn.wl)
 13989:     case 0b110_100:  //(d8,A4,Rn.wl)
 13990:     case 0b110_101:  //(d8,A5,Rn.wl)
 13991:     case 0b110_110:  //(d8,A6,Rn.wl)
 13992:     case 0b110_111:  //(d8,A7,Rn.wl)
 13993:       XEiJ.mpuCycleCount += 10;
 13994:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 13995:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 13996:       } else {
 13997:         w = XEiJ.regPC;
 13998:         XEiJ.regPC = w + 2;
 13999:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14000:       }
 14001:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14002:               + (byte) w  //バイトディスプレースメント
 14003:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14004:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14005:     case 0b111_000:  //(xxx).W
 14006:       XEiJ.mpuCycleCount += 8;
 14007:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14008:     case 0b111_001:  //(xxx).L
 14009:       XEiJ.mpuCycleCount += 12;
 14010:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14011:     case 0b111_010:  //(d16,PC)
 14012:       XEiJ.mpuCycleCount += 8;
 14013:       t = XEiJ.regPC;
 14014:       XEiJ.regPC = t + 2;
 14015:       return (t  //ベースレジスタ
 14016:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14017:     case 0b111_011:  //(d8,PC,Rn.wl)
 14018:       XEiJ.mpuCycleCount += 10;
 14019:       t = XEiJ.regPC;
 14020:       XEiJ.regPC = t + 2;
 14021:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14022:       return (t  //ベースレジスタ
 14023:               + (byte) w  //バイトディスプレースメント
 14024:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14025:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14026:     case 0b111_100:  //#<data>
 14027:       XEiJ.mpuCycleCount += 4;
 14028:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14029:         return (XEiJ.regPC += 2) - 1;  //下位バイト
 14030:       } else {
 14031:         t = XEiJ.regPC;
 14032:         XEiJ.regPC = t + 2;
 14033:         return t + 1;  //下位バイト
 14034:       }
 14035:     }  //switch
 14036:     XEiJ.mpuCycleCount += 34;
 14037:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14038:     throw M68kException.m6eSignal;
 14039:   }  //efaAnyByte
 14040: 
 14041:   //a = efaMemByte (ea)  //|  M+-WXZP |
 14042:   //  メモリモードのバイトオペランドの実効アドレスを求める
 14043:   //  efaAnyByteとの違いは#<data>がないこと
 14044:   @SuppressWarnings ("fallthrough") public static int efaMemByte (int ea) throws M68kException {
 14045:     int t, w;
 14046:     switch (ea) {
 14047:     case 0b010_000:  //(A0)
 14048:       if (XEiJ.EFA_SEPARATE_AR) {
 14049:         XEiJ.mpuCycleCount += 4;
 14050:         return XEiJ.regRn[ 8];
 14051:       }
 14052:       //fallthrough
 14053:     case 0b010_001:  //(A1)
 14054:       if (XEiJ.EFA_SEPARATE_AR) {
 14055:         XEiJ.mpuCycleCount += 4;
 14056:         return XEiJ.regRn[ 9];
 14057:       }
 14058:       //fallthrough
 14059:     case 0b010_010:  //(A2)
 14060:       if (XEiJ.EFA_SEPARATE_AR) {
 14061:         XEiJ.mpuCycleCount += 4;
 14062:         return XEiJ.regRn[10];
 14063:       }
 14064:       //fallthrough
 14065:     case 0b010_011:  //(A3)
 14066:       if (XEiJ.EFA_SEPARATE_AR) {
 14067:         XEiJ.mpuCycleCount += 4;
 14068:         return XEiJ.regRn[11];
 14069:       }
 14070:       //fallthrough
 14071:     case 0b010_100:  //(A4)
 14072:       if (XEiJ.EFA_SEPARATE_AR) {
 14073:         XEiJ.mpuCycleCount += 4;
 14074:         return XEiJ.regRn[12];
 14075:       }
 14076:       //fallthrough
 14077:     case 0b010_101:  //(A5)
 14078:       if (XEiJ.EFA_SEPARATE_AR) {
 14079:         XEiJ.mpuCycleCount += 4;
 14080:         return XEiJ.regRn[13];
 14081:       }
 14082:       //fallthrough
 14083:     case 0b010_110:  //(A6)
 14084:       if (XEiJ.EFA_SEPARATE_AR) {
 14085:         XEiJ.mpuCycleCount += 4;
 14086:         return XEiJ.regRn[14];
 14087:       }
 14088:       //fallthrough
 14089:     case 0b010_111:  //(A7)
 14090:       if (XEiJ.EFA_SEPARATE_AR) {
 14091:         XEiJ.mpuCycleCount += 4;
 14092:         return XEiJ.regRn[15];
 14093:       } else {
 14094:         XEiJ.mpuCycleCount += 4;
 14095:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14096:       }
 14097:     case 0b011_000:  //(A0)+
 14098:       if (XEiJ.EFA_SEPARATE_AR) {
 14099:         XEiJ.mpuCycleCount += 4;
 14100:         return XEiJ.regRn[ 8]++;
 14101:       }
 14102:       //fallthrough
 14103:     case 0b011_001:  //(A1)+
 14104:       if (XEiJ.EFA_SEPARATE_AR) {
 14105:         XEiJ.mpuCycleCount += 4;
 14106:         return XEiJ.regRn[ 9]++;
 14107:       }
 14108:       //fallthrough
 14109:     case 0b011_010:  //(A2)+
 14110:       if (XEiJ.EFA_SEPARATE_AR) {
 14111:         XEiJ.mpuCycleCount += 4;
 14112:         return XEiJ.regRn[10]++;
 14113:       }
 14114:       //fallthrough
 14115:     case 0b011_011:  //(A3)+
 14116:       if (XEiJ.EFA_SEPARATE_AR) {
 14117:         XEiJ.mpuCycleCount += 4;
 14118:         return XEiJ.regRn[11]++;
 14119:       }
 14120:       //fallthrough
 14121:     case 0b011_100:  //(A4)+
 14122:       if (XEiJ.EFA_SEPARATE_AR) {
 14123:         XEiJ.mpuCycleCount += 4;
 14124:         return XEiJ.regRn[12]++;
 14125:       }
 14126:       //fallthrough
 14127:     case 0b011_101:  //(A5)+
 14128:       if (XEiJ.EFA_SEPARATE_AR) {
 14129:         XEiJ.mpuCycleCount += 4;
 14130:         return XEiJ.regRn[13]++;
 14131:       }
 14132:       //fallthrough
 14133:     case 0b011_110:  //(A6)+
 14134:       if (XEiJ.EFA_SEPARATE_AR) {
 14135:         XEiJ.mpuCycleCount += 4;
 14136:         return XEiJ.regRn[14]++;
 14137:       } else {
 14138:         XEiJ.mpuCycleCount += 4;
 14139:         return XEiJ.regRn[ea - (0b011_000 - 8)]++;
 14140:       }
 14141:     case 0b011_111:  //(A7)+
 14142:       XEiJ.mpuCycleCount += 4;
 14143:       return (XEiJ.regRn[15] += 2) - 2;
 14144:     case 0b100_000:  //-(A0)
 14145:       if (XEiJ.EFA_SEPARATE_AR) {
 14146:         XEiJ.mpuCycleCount += 6;
 14147:         return --XEiJ.regRn[ 8];
 14148:       }
 14149:       //fallthrough
 14150:     case 0b100_001:  //-(A1)
 14151:       if (XEiJ.EFA_SEPARATE_AR) {
 14152:         XEiJ.mpuCycleCount += 6;
 14153:         return --XEiJ.regRn[ 9];
 14154:       }
 14155:       //fallthrough
 14156:     case 0b100_010:  //-(A2)
 14157:       if (XEiJ.EFA_SEPARATE_AR) {
 14158:         XEiJ.mpuCycleCount += 6;
 14159:         return --XEiJ.regRn[10];
 14160:       }
 14161:       //fallthrough
 14162:     case 0b100_011:  //-(A3)
 14163:       if (XEiJ.EFA_SEPARATE_AR) {
 14164:         XEiJ.mpuCycleCount += 6;
 14165:         return --XEiJ.regRn[11];
 14166:       }
 14167:       //fallthrough
 14168:     case 0b100_100:  //-(A4)
 14169:       if (XEiJ.EFA_SEPARATE_AR) {
 14170:         XEiJ.mpuCycleCount += 6;
 14171:         return --XEiJ.regRn[12];
 14172:       }
 14173:       //fallthrough
 14174:     case 0b100_101:  //-(A5)
 14175:       if (XEiJ.EFA_SEPARATE_AR) {
 14176:         XEiJ.mpuCycleCount += 6;
 14177:         return --XEiJ.regRn[13];
 14178:       }
 14179:       //fallthrough
 14180:     case 0b100_110:  //-(A6)
 14181:       if (XEiJ.EFA_SEPARATE_AR) {
 14182:         XEiJ.mpuCycleCount += 6;
 14183:         return --XEiJ.regRn[14];
 14184:       } else {
 14185:         XEiJ.mpuCycleCount += 6;
 14186:         return --XEiJ.regRn[ea - (0b100_000 - 8)];
 14187:       }
 14188:     case 0b100_111:  //-(A7)
 14189:       XEiJ.mpuCycleCount += 6;
 14190:       return XEiJ.regRn[15] -= 2;
 14191:     case 0b101_000:  //(d16,A0)
 14192:     case 0b101_001:  //(d16,A1)
 14193:     case 0b101_010:  //(d16,A2)
 14194:     case 0b101_011:  //(d16,A3)
 14195:     case 0b101_100:  //(d16,A4)
 14196:     case 0b101_101:  //(d16,A5)
 14197:     case 0b101_110:  //(d16,A6)
 14198:     case 0b101_111:  //(d16,A7)
 14199:       XEiJ.mpuCycleCount += 8;
 14200:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14201:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14202:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14203:       } else {
 14204:         t = XEiJ.regPC;
 14205:         XEiJ.regPC = t + 2;
 14206:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14207:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14208:       }
 14209:     case 0b110_000:  //(d8,A0,Rn.wl)
 14210:     case 0b110_001:  //(d8,A1,Rn.wl)
 14211:     case 0b110_010:  //(d8,A2,Rn.wl)
 14212:     case 0b110_011:  //(d8,A3,Rn.wl)
 14213:     case 0b110_100:  //(d8,A4,Rn.wl)
 14214:     case 0b110_101:  //(d8,A5,Rn.wl)
 14215:     case 0b110_110:  //(d8,A6,Rn.wl)
 14216:     case 0b110_111:  //(d8,A7,Rn.wl)
 14217:       XEiJ.mpuCycleCount += 10;
 14218:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14219:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14220:       } else {
 14221:         w = XEiJ.regPC;
 14222:         XEiJ.regPC = w + 2;
 14223:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14224:       }
 14225:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14226:               + (byte) w  //バイトディスプレースメント
 14227:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14228:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14229:     case 0b111_000:  //(xxx).W
 14230:       XEiJ.mpuCycleCount += 8;
 14231:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14232:     case 0b111_001:  //(xxx).L
 14233:       XEiJ.mpuCycleCount += 12;
 14234:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14235:     case 0b111_010:  //(d16,PC)
 14236:       XEiJ.mpuCycleCount += 8;
 14237:       t = XEiJ.regPC;
 14238:       XEiJ.regPC = t + 2;
 14239:       return (t  //ベースレジスタ
 14240:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14241:     case 0b111_011:  //(d8,PC,Rn.wl)
 14242:       XEiJ.mpuCycleCount += 10;
 14243:       t = XEiJ.regPC;
 14244:       XEiJ.regPC = t + 2;
 14245:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14246:       return (t  //ベースレジスタ
 14247:               + (byte) w  //バイトディスプレースメント
 14248:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14249:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14250:     }  //switch
 14251:     XEiJ.mpuCycleCount += 34;
 14252:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14253:     throw M68kException.m6eSignal;
 14254:   }  //efaMemByte
 14255: 
 14256:   //a = efaMltByte (ea)  //|  M+-WXZ  |
 14257:   //  メモリ可変モードのバイトオペランドの実効アドレスを求める
 14258:   //  efaMemByteとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 14259:   @SuppressWarnings ("fallthrough") public static int efaMltByte (int ea) throws M68kException {
 14260:     int t, w;
 14261:     switch (ea) {
 14262:     case 0b010_000:  //(A0)
 14263:       if (XEiJ.EFA_SEPARATE_AR) {
 14264:         XEiJ.mpuCycleCount += 4;
 14265:         return XEiJ.regRn[ 8];
 14266:       }
 14267:       //fallthrough
 14268:     case 0b010_001:  //(A1)
 14269:       if (XEiJ.EFA_SEPARATE_AR) {
 14270:         XEiJ.mpuCycleCount += 4;
 14271:         return XEiJ.regRn[ 9];
 14272:       }
 14273:       //fallthrough
 14274:     case 0b010_010:  //(A2)
 14275:       if (XEiJ.EFA_SEPARATE_AR) {
 14276:         XEiJ.mpuCycleCount += 4;
 14277:         return XEiJ.regRn[10];
 14278:       }
 14279:       //fallthrough
 14280:     case 0b010_011:  //(A3)
 14281:       if (XEiJ.EFA_SEPARATE_AR) {
 14282:         XEiJ.mpuCycleCount += 4;
 14283:         return XEiJ.regRn[11];
 14284:       }
 14285:       //fallthrough
 14286:     case 0b010_100:  //(A4)
 14287:       if (XEiJ.EFA_SEPARATE_AR) {
 14288:         XEiJ.mpuCycleCount += 4;
 14289:         return XEiJ.regRn[12];
 14290:       }
 14291:       //fallthrough
 14292:     case 0b010_101:  //(A5)
 14293:       if (XEiJ.EFA_SEPARATE_AR) {
 14294:         XEiJ.mpuCycleCount += 4;
 14295:         return XEiJ.regRn[13];
 14296:       }
 14297:       //fallthrough
 14298:     case 0b010_110:  //(A6)
 14299:       if (XEiJ.EFA_SEPARATE_AR) {
 14300:         XEiJ.mpuCycleCount += 4;
 14301:         return XEiJ.regRn[14];
 14302:       }
 14303:       //fallthrough
 14304:     case 0b010_111:  //(A7)
 14305:       if (XEiJ.EFA_SEPARATE_AR) {
 14306:         XEiJ.mpuCycleCount += 4;
 14307:         return XEiJ.regRn[15];
 14308:       } else {
 14309:         XEiJ.mpuCycleCount += 4;
 14310:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14311:       }
 14312:     case 0b011_000:  //(A0)+
 14313:       if (XEiJ.EFA_SEPARATE_AR) {
 14314:         XEiJ.mpuCycleCount += 4;
 14315:         return XEiJ.regRn[ 8]++;
 14316:       }
 14317:       //fallthrough
 14318:     case 0b011_001:  //(A1)+
 14319:       if (XEiJ.EFA_SEPARATE_AR) {
 14320:         XEiJ.mpuCycleCount += 4;
 14321:         return XEiJ.regRn[ 9]++;
 14322:       }
 14323:       //fallthrough
 14324:     case 0b011_010:  //(A2)+
 14325:       if (XEiJ.EFA_SEPARATE_AR) {
 14326:         XEiJ.mpuCycleCount += 4;
 14327:         return XEiJ.regRn[10]++;
 14328:       }
 14329:       //fallthrough
 14330:     case 0b011_011:  //(A3)+
 14331:       if (XEiJ.EFA_SEPARATE_AR) {
 14332:         XEiJ.mpuCycleCount += 4;
 14333:         return XEiJ.regRn[11]++;
 14334:       }
 14335:       //fallthrough
 14336:     case 0b011_100:  //(A4)+
 14337:       if (XEiJ.EFA_SEPARATE_AR) {
 14338:         XEiJ.mpuCycleCount += 4;
 14339:         return XEiJ.regRn[12]++;
 14340:       }
 14341:       //fallthrough
 14342:     case 0b011_101:  //(A5)+
 14343:       if (XEiJ.EFA_SEPARATE_AR) {
 14344:         XEiJ.mpuCycleCount += 4;
 14345:         return XEiJ.regRn[13]++;
 14346:       }
 14347:       //fallthrough
 14348:     case 0b011_110:  //(A6)+
 14349:       if (XEiJ.EFA_SEPARATE_AR) {
 14350:         XEiJ.mpuCycleCount += 4;
 14351:         return XEiJ.regRn[14]++;
 14352:       } else {
 14353:         XEiJ.mpuCycleCount += 4;
 14354:         return XEiJ.regRn[ea - (0b011_000 - 8)]++;
 14355:       }
 14356:     case 0b011_111:  //(A7)+
 14357:       XEiJ.mpuCycleCount += 4;
 14358:       return (XEiJ.regRn[15] += 2) - 2;
 14359:     case 0b100_000:  //-(A0)
 14360:       if (XEiJ.EFA_SEPARATE_AR) {
 14361:         XEiJ.mpuCycleCount += 6;
 14362:         return --XEiJ.regRn[ 8];
 14363:       }
 14364:       //fallthrough
 14365:     case 0b100_001:  //-(A1)
 14366:       if (XEiJ.EFA_SEPARATE_AR) {
 14367:         XEiJ.mpuCycleCount += 6;
 14368:         return --XEiJ.regRn[ 9];
 14369:       }
 14370:       //fallthrough
 14371:     case 0b100_010:  //-(A2)
 14372:       if (XEiJ.EFA_SEPARATE_AR) {
 14373:         XEiJ.mpuCycleCount += 6;
 14374:         return --XEiJ.regRn[10];
 14375:       }
 14376:       //fallthrough
 14377:     case 0b100_011:  //-(A3)
 14378:       if (XEiJ.EFA_SEPARATE_AR) {
 14379:         XEiJ.mpuCycleCount += 6;
 14380:         return --XEiJ.regRn[11];
 14381:       }
 14382:       //fallthrough
 14383:     case 0b100_100:  //-(A4)
 14384:       if (XEiJ.EFA_SEPARATE_AR) {
 14385:         XEiJ.mpuCycleCount += 6;
 14386:         return --XEiJ.regRn[12];
 14387:       }
 14388:       //fallthrough
 14389:     case 0b100_101:  //-(A5)
 14390:       if (XEiJ.EFA_SEPARATE_AR) {
 14391:         XEiJ.mpuCycleCount += 6;
 14392:         return --XEiJ.regRn[13];
 14393:       }
 14394:       //fallthrough
 14395:     case 0b100_110:  //-(A6)
 14396:       if (XEiJ.EFA_SEPARATE_AR) {
 14397:         XEiJ.mpuCycleCount += 6;
 14398:         return --XEiJ.regRn[14];
 14399:       } else {
 14400:         XEiJ.mpuCycleCount += 6;
 14401:         return --XEiJ.regRn[ea - (0b100_000 - 8)];
 14402:       }
 14403:     case 0b100_111:  //-(A7)
 14404:       XEiJ.mpuCycleCount += 6;
 14405:       return XEiJ.regRn[15] -= 2;
 14406:     case 0b101_000:  //(d16,A0)
 14407:     case 0b101_001:  //(d16,A1)
 14408:     case 0b101_010:  //(d16,A2)
 14409:     case 0b101_011:  //(d16,A3)
 14410:     case 0b101_100:  //(d16,A4)
 14411:     case 0b101_101:  //(d16,A5)
 14412:     case 0b101_110:  //(d16,A6)
 14413:     case 0b101_111:  //(d16,A7)
 14414:       XEiJ.mpuCycleCount += 8;
 14415:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14416:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14417:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14418:       } else {
 14419:         t = XEiJ.regPC;
 14420:         XEiJ.regPC = t + 2;
 14421:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14422:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14423:       }
 14424:     case 0b110_000:  //(d8,A0,Rn.wl)
 14425:     case 0b110_001:  //(d8,A1,Rn.wl)
 14426:     case 0b110_010:  //(d8,A2,Rn.wl)
 14427:     case 0b110_011:  //(d8,A3,Rn.wl)
 14428:     case 0b110_100:  //(d8,A4,Rn.wl)
 14429:     case 0b110_101:  //(d8,A5,Rn.wl)
 14430:     case 0b110_110:  //(d8,A6,Rn.wl)
 14431:     case 0b110_111:  //(d8,A7,Rn.wl)
 14432:       XEiJ.mpuCycleCount += 10;
 14433:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14434:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14435:       } else {
 14436:         w = XEiJ.regPC;
 14437:         XEiJ.regPC = w + 2;
 14438:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14439:       }
 14440:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14441:               + (byte) w  //バイトディスプレースメント
 14442:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14443:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14444:     case 0b111_000:  //(xxx).W
 14445:       XEiJ.mpuCycleCount += 8;
 14446:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14447:     case 0b111_001:  //(xxx).L
 14448:       XEiJ.mpuCycleCount += 12;
 14449:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14450:     }  //switch
 14451:     XEiJ.mpuCycleCount += 34;
 14452:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14453:     throw M68kException.m6eSignal;
 14454:   }  //efaMltByte
 14455: 
 14456:   //a = efaCntByte (ea)  //|  M  WXZP |
 14457:   //  制御モードのロングオペランドの実効アドレスを求める
 14458:   //  efaMemByteとの違いは(Ar)+と-(Ar)がないこと
 14459:   @SuppressWarnings ("fallthrough") public static int efaCntByte (int ea) throws M68kException {
 14460:     int t, w;
 14461:     switch (ea) {
 14462:     case 0b010_000:  //(A0)
 14463:       if (XEiJ.EFA_SEPARATE_AR) {
 14464:         XEiJ.mpuCycleCount += 4;
 14465:         return XEiJ.regRn[ 8];
 14466:       }
 14467:       //fallthrough
 14468:     case 0b010_001:  //(A1)
 14469:       if (XEiJ.EFA_SEPARATE_AR) {
 14470:         XEiJ.mpuCycleCount += 4;
 14471:         return XEiJ.regRn[ 9];
 14472:       }
 14473:       //fallthrough
 14474:     case 0b010_010:  //(A2)
 14475:       if (XEiJ.EFA_SEPARATE_AR) {
 14476:         XEiJ.mpuCycleCount += 4;
 14477:         return XEiJ.regRn[10];
 14478:       }
 14479:       //fallthrough
 14480:     case 0b010_011:  //(A3)
 14481:       if (XEiJ.EFA_SEPARATE_AR) {
 14482:         XEiJ.mpuCycleCount += 4;
 14483:         return XEiJ.regRn[11];
 14484:       }
 14485:       //fallthrough
 14486:     case 0b010_100:  //(A4)
 14487:       if (XEiJ.EFA_SEPARATE_AR) {
 14488:         XEiJ.mpuCycleCount += 4;
 14489:         return XEiJ.regRn[12];
 14490:       }
 14491:       //fallthrough
 14492:     case 0b010_101:  //(A5)
 14493:       if (XEiJ.EFA_SEPARATE_AR) {
 14494:         XEiJ.mpuCycleCount += 4;
 14495:         return XEiJ.regRn[13];
 14496:       }
 14497:       //fallthrough
 14498:     case 0b010_110:  //(A6)
 14499:       if (XEiJ.EFA_SEPARATE_AR) {
 14500:         XEiJ.mpuCycleCount += 4;
 14501:         return XEiJ.regRn[14];
 14502:       }
 14503:       //fallthrough
 14504:     case 0b010_111:  //(A7)
 14505:       if (XEiJ.EFA_SEPARATE_AR) {
 14506:         XEiJ.mpuCycleCount += 4;
 14507:         return XEiJ.regRn[15];
 14508:       } else {
 14509:         XEiJ.mpuCycleCount += 4;
 14510:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14511:       }
 14512:     case 0b101_000:  //(d16,A0)
 14513:     case 0b101_001:  //(d16,A1)
 14514:     case 0b101_010:  //(d16,A2)
 14515:     case 0b101_011:  //(d16,A3)
 14516:     case 0b101_100:  //(d16,A4)
 14517:     case 0b101_101:  //(d16,A5)
 14518:     case 0b101_110:  //(d16,A6)
 14519:     case 0b101_111:  //(d16,A7)
 14520:       XEiJ.mpuCycleCount += 8;
 14521:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14522:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14523:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14524:       } else {
 14525:         t = XEiJ.regPC;
 14526:         XEiJ.regPC = t + 2;
 14527:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14528:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14529:       }
 14530:     case 0b110_000:  //(d8,A0,Rn.wl)
 14531:     case 0b110_001:  //(d8,A1,Rn.wl)
 14532:     case 0b110_010:  //(d8,A2,Rn.wl)
 14533:     case 0b110_011:  //(d8,A3,Rn.wl)
 14534:     case 0b110_100:  //(d8,A4,Rn.wl)
 14535:     case 0b110_101:  //(d8,A5,Rn.wl)
 14536:     case 0b110_110:  //(d8,A6,Rn.wl)
 14537:     case 0b110_111:  //(d8,A7,Rn.wl)
 14538:       XEiJ.mpuCycleCount += 10;
 14539:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14540:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14541:       } else {
 14542:         w = XEiJ.regPC;
 14543:         XEiJ.regPC = w + 2;
 14544:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14545:       }
 14546:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14547:               + (byte) w  //バイトディスプレースメント
 14548:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14549:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14550:     case 0b111_000:  //(xxx).W
 14551:       XEiJ.mpuCycleCount += 8;
 14552:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14553:     case 0b111_001:  //(xxx).L
 14554:       XEiJ.mpuCycleCount += 12;
 14555:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14556:     case 0b111_010:  //(d16,PC)
 14557:       XEiJ.mpuCycleCount += 8;
 14558:       t = XEiJ.regPC;
 14559:       XEiJ.regPC = t + 2;
 14560:       return (t  //ベースレジスタ
 14561:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14562:     case 0b111_011:  //(d8,PC,Rn.wl)
 14563:       XEiJ.mpuCycleCount += 10;
 14564:       t = XEiJ.regPC;
 14565:       XEiJ.regPC = t + 2;
 14566:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14567:       return (t  //ベースレジスタ
 14568:               + (byte) w  //バイトディスプレースメント
 14569:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14570:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14571:     }  //switch
 14572:     XEiJ.mpuCycleCount += 34;
 14573:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14574:     throw M68kException.m6eSignal;
 14575:   }  //efaCntByte
 14576: 
 14577:   //a = efaAnyWord (ea)  //|  M+-WXZPI|
 14578:   //  任意のモードのワードオペランドの実効アドレスを求める
 14579:   //  efaAnyByteとの違いは(Ar)+と-(Ar)がArを2変化させることと、(A7)+と-(A7)と#<data>の特別な動作がないこと
 14580:   @SuppressWarnings ("fallthrough") public static int efaAnyWord (int ea) throws M68kException {
 14581:     int t, w;
 14582:     switch (ea) {
 14583:     case 0b010_000:  //(A0)
 14584:       if (XEiJ.EFA_SEPARATE_AR) {
 14585:         XEiJ.mpuCycleCount += 4;
 14586:         return XEiJ.regRn[ 8];
 14587:       }
 14588:       //fallthrough
 14589:     case 0b010_001:  //(A1)
 14590:       if (XEiJ.EFA_SEPARATE_AR) {
 14591:         XEiJ.mpuCycleCount += 4;
 14592:         return XEiJ.regRn[ 9];
 14593:       }
 14594:       //fallthrough
 14595:     case 0b010_010:  //(A2)
 14596:       if (XEiJ.EFA_SEPARATE_AR) {
 14597:         XEiJ.mpuCycleCount += 4;
 14598:         return XEiJ.regRn[10];
 14599:       }
 14600:       //fallthrough
 14601:     case 0b010_011:  //(A3)
 14602:       if (XEiJ.EFA_SEPARATE_AR) {
 14603:         XEiJ.mpuCycleCount += 4;
 14604:         return XEiJ.regRn[11];
 14605:       }
 14606:       //fallthrough
 14607:     case 0b010_100:  //(A4)
 14608:       if (XEiJ.EFA_SEPARATE_AR) {
 14609:         XEiJ.mpuCycleCount += 4;
 14610:         return XEiJ.regRn[12];
 14611:       }
 14612:       //fallthrough
 14613:     case 0b010_101:  //(A5)
 14614:       if (XEiJ.EFA_SEPARATE_AR) {
 14615:         XEiJ.mpuCycleCount += 4;
 14616:         return XEiJ.regRn[13];
 14617:       }
 14618:       //fallthrough
 14619:     case 0b010_110:  //(A6)
 14620:       if (XEiJ.EFA_SEPARATE_AR) {
 14621:         XEiJ.mpuCycleCount += 4;
 14622:         return XEiJ.regRn[14];
 14623:       }
 14624:       //fallthrough
 14625:     case 0b010_111:  //(A7)
 14626:       if (XEiJ.EFA_SEPARATE_AR) {
 14627:         XEiJ.mpuCycleCount += 4;
 14628:         return XEiJ.regRn[15];
 14629:       } else {
 14630:         XEiJ.mpuCycleCount += 4;
 14631:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14632:       }
 14633:     case 0b011_000:  //(A0)+
 14634:       if (XEiJ.EFA_SEPARATE_AR) {
 14635:         XEiJ.mpuCycleCount += 4;
 14636:         return (XEiJ.regRn[ 8] += 2) - 2;
 14637:       }
 14638:       //fallthrough
 14639:     case 0b011_001:  //(A1)+
 14640:       if (XEiJ.EFA_SEPARATE_AR) {
 14641:         XEiJ.mpuCycleCount += 4;
 14642:         return (XEiJ.regRn[ 9] += 2) - 2;
 14643:       }
 14644:       //fallthrough
 14645:     case 0b011_010:  //(A2)+
 14646:       if (XEiJ.EFA_SEPARATE_AR) {
 14647:         XEiJ.mpuCycleCount += 4;
 14648:         return (XEiJ.regRn[10] += 2) - 2;
 14649:       }
 14650:       //fallthrough
 14651:     case 0b011_011:  //(A3)+
 14652:       if (XEiJ.EFA_SEPARATE_AR) {
 14653:         XEiJ.mpuCycleCount += 4;
 14654:         return (XEiJ.regRn[11] += 2) - 2;
 14655:       }
 14656:       //fallthrough
 14657:     case 0b011_100:  //(A4)+
 14658:       if (XEiJ.EFA_SEPARATE_AR) {
 14659:         XEiJ.mpuCycleCount += 4;
 14660:         return (XEiJ.regRn[12] += 2) - 2;
 14661:       }
 14662:       //fallthrough
 14663:     case 0b011_101:  //(A5)+
 14664:       if (XEiJ.EFA_SEPARATE_AR) {
 14665:         XEiJ.mpuCycleCount += 4;
 14666:         return (XEiJ.regRn[13] += 2) - 2;
 14667:       }
 14668:       //fallthrough
 14669:     case 0b011_110:  //(A6)+
 14670:       if (XEiJ.EFA_SEPARATE_AR) {
 14671:         XEiJ.mpuCycleCount += 4;
 14672:         return (XEiJ.regRn[14] += 2) - 2;
 14673:       }
 14674:       //fallthrough
 14675:     case 0b011_111:  //(A7)+
 14676:       if (XEiJ.EFA_SEPARATE_AR) {
 14677:         XEiJ.mpuCycleCount += 4;
 14678:         return (XEiJ.regRn[15] += 2) - 2;
 14679:       } else {
 14680:         XEiJ.mpuCycleCount += 4;
 14681:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2;
 14682:       }
 14683:     case 0b100_000:  //-(A0)
 14684:       if (XEiJ.EFA_SEPARATE_AR) {
 14685:         XEiJ.mpuCycleCount += 6;
 14686:         return XEiJ.regRn[ 8] -= 2;
 14687:       }
 14688:       //fallthrough
 14689:     case 0b100_001:  //-(A1)
 14690:       if (XEiJ.EFA_SEPARATE_AR) {
 14691:         XEiJ.mpuCycleCount += 6;
 14692:         return XEiJ.regRn[ 9] -= 2;
 14693:       }
 14694:       //fallthrough
 14695:     case 0b100_010:  //-(A2)
 14696:       if (XEiJ.EFA_SEPARATE_AR) {
 14697:         XEiJ.mpuCycleCount += 6;
 14698:         return XEiJ.regRn[10] -= 2;
 14699:       }
 14700:       //fallthrough
 14701:     case 0b100_011:  //-(A3)
 14702:       if (XEiJ.EFA_SEPARATE_AR) {
 14703:         XEiJ.mpuCycleCount += 6;
 14704:         return XEiJ.regRn[11] -= 2;
 14705:       }
 14706:       //fallthrough
 14707:     case 0b100_100:  //-(A4)
 14708:       if (XEiJ.EFA_SEPARATE_AR) {
 14709:         XEiJ.mpuCycleCount += 6;
 14710:         return XEiJ.regRn[12] -= 2;
 14711:       }
 14712:       //fallthrough
 14713:     case 0b100_101:  //-(A5)
 14714:       if (XEiJ.EFA_SEPARATE_AR) {
 14715:         XEiJ.mpuCycleCount += 6;
 14716:         return XEiJ.regRn[13] -= 2;
 14717:       }
 14718:       //fallthrough
 14719:     case 0b100_110:  //-(A6)
 14720:       if (XEiJ.EFA_SEPARATE_AR) {
 14721:         XEiJ.mpuCycleCount += 6;
 14722:         return XEiJ.regRn[14] -= 2;
 14723:       }
 14724:       //fallthrough
 14725:     case 0b100_111:  //-(A7)
 14726:       if (XEiJ.EFA_SEPARATE_AR) {
 14727:         XEiJ.mpuCycleCount += 6;
 14728:         return XEiJ.regRn[15] -= 2;
 14729:       } else {
 14730:         XEiJ.mpuCycleCount += 6;
 14731:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2;
 14732:       }
 14733:     case 0b101_000:  //(d16,A0)
 14734:     case 0b101_001:  //(d16,A1)
 14735:     case 0b101_010:  //(d16,A2)
 14736:     case 0b101_011:  //(d16,A3)
 14737:     case 0b101_100:  //(d16,A4)
 14738:     case 0b101_101:  //(d16,A5)
 14739:     case 0b101_110:  //(d16,A6)
 14740:     case 0b101_111:  //(d16,A7)
 14741:       XEiJ.mpuCycleCount += 8;
 14742:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14743:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14744:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14745:       } else {
 14746:         t = XEiJ.regPC;
 14747:         XEiJ.regPC = t + 2;
 14748:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14749:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14750:       }
 14751:     case 0b110_000:  //(d8,A0,Rn.wl)
 14752:     case 0b110_001:  //(d8,A1,Rn.wl)
 14753:     case 0b110_010:  //(d8,A2,Rn.wl)
 14754:     case 0b110_011:  //(d8,A3,Rn.wl)
 14755:     case 0b110_100:  //(d8,A4,Rn.wl)
 14756:     case 0b110_101:  //(d8,A5,Rn.wl)
 14757:     case 0b110_110:  //(d8,A6,Rn.wl)
 14758:     case 0b110_111:  //(d8,A7,Rn.wl)
 14759:       XEiJ.mpuCycleCount += 10;
 14760:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14761:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14762:       } else {
 14763:         w = XEiJ.regPC;
 14764:         XEiJ.regPC = w + 2;
 14765:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14766:       }
 14767:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14768:               + (byte) w  //バイトディスプレースメント
 14769:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14770:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14771:     case 0b111_000:  //(xxx).W
 14772:       XEiJ.mpuCycleCount += 8;
 14773:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 14774:     case 0b111_001:  //(xxx).L
 14775:       XEiJ.mpuCycleCount += 12;
 14776:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 14777:     case 0b111_010:  //(d16,PC)
 14778:       XEiJ.mpuCycleCount += 8;
 14779:       t = XEiJ.regPC;
 14780:       XEiJ.regPC = t + 2;
 14781:       return (t  //ベースレジスタ
 14782:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14783:     case 0b111_011:  //(d8,PC,Rn.wl)
 14784:       XEiJ.mpuCycleCount += 10;
 14785:       t = XEiJ.regPC;
 14786:       XEiJ.regPC = t + 2;
 14787:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 14788:       return (t  //ベースレジスタ
 14789:               + (byte) w  //バイトディスプレースメント
 14790:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 14791:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 14792:     case 0b111_100:  //#<data>
 14793:       XEiJ.mpuCycleCount += 4;
 14794:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14795:         return (XEiJ.regPC += 2) - 2;
 14796:       } else {
 14797:         t = XEiJ.regPC;
 14798:         XEiJ.regPC = t + 2;
 14799:         return t;
 14800:       }
 14801:     }  //switch
 14802:     XEiJ.mpuCycleCount += 34;
 14803:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 14804:     throw M68kException.m6eSignal;
 14805:   }  //efaAnyWord
 14806: 
 14807:   //a = efaMemWord (ea)  //|  M+-WXZP |
 14808:   //  メモリモードのワードオペランドの実効アドレスを求める
 14809:   //  efaAnyWordとの違いは#<data>がないこと
 14810:   @SuppressWarnings ("fallthrough") public static int efaMemWord (int ea) throws M68kException {
 14811:     int t, w;
 14812:     switch (ea) {
 14813:     case 0b010_000:  //(A0)
 14814:       if (XEiJ.EFA_SEPARATE_AR) {
 14815:         XEiJ.mpuCycleCount += 4;
 14816:         return XEiJ.regRn[ 8];
 14817:       }
 14818:       //fallthrough
 14819:     case 0b010_001:  //(A1)
 14820:       if (XEiJ.EFA_SEPARATE_AR) {
 14821:         XEiJ.mpuCycleCount += 4;
 14822:         return XEiJ.regRn[ 9];
 14823:       }
 14824:       //fallthrough
 14825:     case 0b010_010:  //(A2)
 14826:       if (XEiJ.EFA_SEPARATE_AR) {
 14827:         XEiJ.mpuCycleCount += 4;
 14828:         return XEiJ.regRn[10];
 14829:       }
 14830:       //fallthrough
 14831:     case 0b010_011:  //(A3)
 14832:       if (XEiJ.EFA_SEPARATE_AR) {
 14833:         XEiJ.mpuCycleCount += 4;
 14834:         return XEiJ.regRn[11];
 14835:       }
 14836:       //fallthrough
 14837:     case 0b010_100:  //(A4)
 14838:       if (XEiJ.EFA_SEPARATE_AR) {
 14839:         XEiJ.mpuCycleCount += 4;
 14840:         return XEiJ.regRn[12];
 14841:       }
 14842:       //fallthrough
 14843:     case 0b010_101:  //(A5)
 14844:       if (XEiJ.EFA_SEPARATE_AR) {
 14845:         XEiJ.mpuCycleCount += 4;
 14846:         return XEiJ.regRn[13];
 14847:       }
 14848:       //fallthrough
 14849:     case 0b010_110:  //(A6)
 14850:       if (XEiJ.EFA_SEPARATE_AR) {
 14851:         XEiJ.mpuCycleCount += 4;
 14852:         return XEiJ.regRn[14];
 14853:       }
 14854:       //fallthrough
 14855:     case 0b010_111:  //(A7)
 14856:       if (XEiJ.EFA_SEPARATE_AR) {
 14857:         XEiJ.mpuCycleCount += 4;
 14858:         return XEiJ.regRn[15];
 14859:       } else {
 14860:         XEiJ.mpuCycleCount += 4;
 14861:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 14862:       }
 14863:     case 0b011_000:  //(A0)+
 14864:       if (XEiJ.EFA_SEPARATE_AR) {
 14865:         XEiJ.mpuCycleCount += 4;
 14866:         return (XEiJ.regRn[ 8] += 2) - 2;
 14867:       }
 14868:       //fallthrough
 14869:     case 0b011_001:  //(A1)+
 14870:       if (XEiJ.EFA_SEPARATE_AR) {
 14871:         XEiJ.mpuCycleCount += 4;
 14872:         return (XEiJ.regRn[ 9] += 2) - 2;
 14873:       }
 14874:       //fallthrough
 14875:     case 0b011_010:  //(A2)+
 14876:       if (XEiJ.EFA_SEPARATE_AR) {
 14877:         XEiJ.mpuCycleCount += 4;
 14878:         return (XEiJ.regRn[10] += 2) - 2;
 14879:       }
 14880:       //fallthrough
 14881:     case 0b011_011:  //(A3)+
 14882:       if (XEiJ.EFA_SEPARATE_AR) {
 14883:         XEiJ.mpuCycleCount += 4;
 14884:         return (XEiJ.regRn[11] += 2) - 2;
 14885:       }
 14886:       //fallthrough
 14887:     case 0b011_100:  //(A4)+
 14888:       if (XEiJ.EFA_SEPARATE_AR) {
 14889:         XEiJ.mpuCycleCount += 4;
 14890:         return (XEiJ.regRn[12] += 2) - 2;
 14891:       }
 14892:       //fallthrough
 14893:     case 0b011_101:  //(A5)+
 14894:       if (XEiJ.EFA_SEPARATE_AR) {
 14895:         XEiJ.mpuCycleCount += 4;
 14896:         return (XEiJ.regRn[13] += 2) - 2;
 14897:       }
 14898:       //fallthrough
 14899:     case 0b011_110:  //(A6)+
 14900:       if (XEiJ.EFA_SEPARATE_AR) {
 14901:         XEiJ.mpuCycleCount += 4;
 14902:         return (XEiJ.regRn[14] += 2) - 2;
 14903:       }
 14904:       //fallthrough
 14905:     case 0b011_111:  //(A7)+
 14906:       if (XEiJ.EFA_SEPARATE_AR) {
 14907:         XEiJ.mpuCycleCount += 4;
 14908:         return (XEiJ.regRn[15] += 2) - 2;
 14909:       } else {
 14910:         XEiJ.mpuCycleCount += 4;
 14911:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2;
 14912:       }
 14913:     case 0b100_000:  //-(A0)
 14914:       if (XEiJ.EFA_SEPARATE_AR) {
 14915:         XEiJ.mpuCycleCount += 6;
 14916:         return XEiJ.regRn[ 8] -= 2;
 14917:       }
 14918:       //fallthrough
 14919:     case 0b100_001:  //-(A1)
 14920:       if (XEiJ.EFA_SEPARATE_AR) {
 14921:         XEiJ.mpuCycleCount += 6;
 14922:         return XEiJ.regRn[ 9] -= 2;
 14923:       }
 14924:       //fallthrough
 14925:     case 0b100_010:  //-(A2)
 14926:       if (XEiJ.EFA_SEPARATE_AR) {
 14927:         XEiJ.mpuCycleCount += 6;
 14928:         return XEiJ.regRn[10] -= 2;
 14929:       }
 14930:       //fallthrough
 14931:     case 0b100_011:  //-(A3)
 14932:       if (XEiJ.EFA_SEPARATE_AR) {
 14933:         XEiJ.mpuCycleCount += 6;
 14934:         return XEiJ.regRn[11] -= 2;
 14935:       }
 14936:       //fallthrough
 14937:     case 0b100_100:  //-(A4)
 14938:       if (XEiJ.EFA_SEPARATE_AR) {
 14939:         XEiJ.mpuCycleCount += 6;
 14940:         return XEiJ.regRn[12] -= 2;
 14941:       }
 14942:       //fallthrough
 14943:     case 0b100_101:  //-(A5)
 14944:       if (XEiJ.EFA_SEPARATE_AR) {
 14945:         XEiJ.mpuCycleCount += 6;
 14946:         return XEiJ.regRn[13] -= 2;
 14947:       }
 14948:       //fallthrough
 14949:     case 0b100_110:  //-(A6)
 14950:       if (XEiJ.EFA_SEPARATE_AR) {
 14951:         XEiJ.mpuCycleCount += 6;
 14952:         return XEiJ.regRn[14] -= 2;
 14953:       }
 14954:       //fallthrough
 14955:     case 0b100_111:  //-(A7)
 14956:       if (XEiJ.EFA_SEPARATE_AR) {
 14957:         XEiJ.mpuCycleCount += 6;
 14958:         return XEiJ.regRn[15] -= 2;
 14959:       } else {
 14960:         XEiJ.mpuCycleCount += 6;
 14961:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2;
 14962:       }
 14963:     case 0b101_000:  //(d16,A0)
 14964:     case 0b101_001:  //(d16,A1)
 14965:     case 0b101_010:  //(d16,A2)
 14966:     case 0b101_011:  //(d16,A3)
 14967:     case 0b101_100:  //(d16,A4)
 14968:     case 0b101_101:  //(d16,A5)
 14969:     case 0b101_110:  //(d16,A6)
 14970:     case 0b101_111:  //(d16,A7)
 14971:       XEiJ.mpuCycleCount += 8;
 14972:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14973:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14974:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 14975:       } else {
 14976:         t = XEiJ.regPC;
 14977:         XEiJ.regPC = t + 2;
 14978:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 14979:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 14980:       }
 14981:     case 0b110_000:  //(d8,A0,Rn.wl)
 14982:     case 0b110_001:  //(d8,A1,Rn.wl)
 14983:     case 0b110_010:  //(d8,A2,Rn.wl)
 14984:     case 0b110_011:  //(d8,A3,Rn.wl)
 14985:     case 0b110_100:  //(d8,A4,Rn.wl)
 14986:     case 0b110_101:  //(d8,A5,Rn.wl)
 14987:     case 0b110_110:  //(d8,A6,Rn.wl)
 14988:     case 0b110_111:  //(d8,A7,Rn.wl)
 14989:       XEiJ.mpuCycleCount += 10;
 14990:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 14991:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 14992:       } else {
 14993:         w = XEiJ.regPC;
 14994:         XEiJ.regPC = w + 2;
 14995:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 14996:       }
 14997:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 14998:               + (byte) w  //バイトディスプレースメント
 14999:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15000:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15001:     case 0b111_000:  //(xxx).W
 15002:       XEiJ.mpuCycleCount += 8;
 15003:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15004:     case 0b111_001:  //(xxx).L
 15005:       XEiJ.mpuCycleCount += 12;
 15006:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15007:     case 0b111_010:  //(d16,PC)
 15008:       XEiJ.mpuCycleCount += 8;
 15009:       t = XEiJ.regPC;
 15010:       XEiJ.regPC = t + 2;
 15011:       return (t  //ベースレジスタ
 15012:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15013:     case 0b111_011:  //(d8,PC,Rn.wl)
 15014:       XEiJ.mpuCycleCount += 10;
 15015:       t = XEiJ.regPC;
 15016:       XEiJ.regPC = t + 2;
 15017:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15018:       return (t  //ベースレジスタ
 15019:               + (byte) w  //バイトディスプレースメント
 15020:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15021:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15022:     }  //switch
 15023:     XEiJ.mpuCycleCount += 34;
 15024:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15025:     throw M68kException.m6eSignal;
 15026:   }  //efaMemWord
 15027: 
 15028:   //a = efaMltWord (ea)  //|  M+-WXZ  |
 15029:   //  メモリ可変モードのワードオペランドの実効アドレスを求める
 15030:   //  efaMemWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 15031:   @SuppressWarnings ("fallthrough") public static int efaMltWord (int ea) throws M68kException {
 15032:     int t, w;
 15033:     switch (ea) {
 15034:     case 0b010_000:  //(A0)
 15035:       if (XEiJ.EFA_SEPARATE_AR) {
 15036:         XEiJ.mpuCycleCount += 4;
 15037:         return XEiJ.regRn[ 8];
 15038:       }
 15039:       //fallthrough
 15040:     case 0b010_001:  //(A1)
 15041:       if (XEiJ.EFA_SEPARATE_AR) {
 15042:         XEiJ.mpuCycleCount += 4;
 15043:         return XEiJ.regRn[ 9];
 15044:       }
 15045:       //fallthrough
 15046:     case 0b010_010:  //(A2)
 15047:       if (XEiJ.EFA_SEPARATE_AR) {
 15048:         XEiJ.mpuCycleCount += 4;
 15049:         return XEiJ.regRn[10];
 15050:       }
 15051:       //fallthrough
 15052:     case 0b010_011:  //(A3)
 15053:       if (XEiJ.EFA_SEPARATE_AR) {
 15054:         XEiJ.mpuCycleCount += 4;
 15055:         return XEiJ.regRn[11];
 15056:       }
 15057:       //fallthrough
 15058:     case 0b010_100:  //(A4)
 15059:       if (XEiJ.EFA_SEPARATE_AR) {
 15060:         XEiJ.mpuCycleCount += 4;
 15061:         return XEiJ.regRn[12];
 15062:       }
 15063:       //fallthrough
 15064:     case 0b010_101:  //(A5)
 15065:       if (XEiJ.EFA_SEPARATE_AR) {
 15066:         XEiJ.mpuCycleCount += 4;
 15067:         return XEiJ.regRn[13];
 15068:       }
 15069:       //fallthrough
 15070:     case 0b010_110:  //(A6)
 15071:       if (XEiJ.EFA_SEPARATE_AR) {
 15072:         XEiJ.mpuCycleCount += 4;
 15073:         return XEiJ.regRn[14];
 15074:       }
 15075:       //fallthrough
 15076:     case 0b010_111:  //(A7)
 15077:       if (XEiJ.EFA_SEPARATE_AR) {
 15078:         XEiJ.mpuCycleCount += 4;
 15079:         return XEiJ.regRn[15];
 15080:       } else {
 15081:         XEiJ.mpuCycleCount += 4;
 15082:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15083:       }
 15084:     case 0b011_000:  //(A0)+
 15085:       if (XEiJ.EFA_SEPARATE_AR) {
 15086:         XEiJ.mpuCycleCount += 4;
 15087:         return (XEiJ.regRn[ 8] += 2) - 2;
 15088:       }
 15089:       //fallthrough
 15090:     case 0b011_001:  //(A1)+
 15091:       if (XEiJ.EFA_SEPARATE_AR) {
 15092:         XEiJ.mpuCycleCount += 4;
 15093:         return (XEiJ.regRn[ 9] += 2) - 2;
 15094:       }
 15095:       //fallthrough
 15096:     case 0b011_010:  //(A2)+
 15097:       if (XEiJ.EFA_SEPARATE_AR) {
 15098:         XEiJ.mpuCycleCount += 4;
 15099:         return (XEiJ.regRn[10] += 2) - 2;
 15100:       }
 15101:       //fallthrough
 15102:     case 0b011_011:  //(A3)+
 15103:       if (XEiJ.EFA_SEPARATE_AR) {
 15104:         XEiJ.mpuCycleCount += 4;
 15105:         return (XEiJ.regRn[11] += 2) - 2;
 15106:       }
 15107:       //fallthrough
 15108:     case 0b011_100:  //(A4)+
 15109:       if (XEiJ.EFA_SEPARATE_AR) {
 15110:         XEiJ.mpuCycleCount += 4;
 15111:         return (XEiJ.regRn[12] += 2) - 2;
 15112:       }
 15113:       //fallthrough
 15114:     case 0b011_101:  //(A5)+
 15115:       if (XEiJ.EFA_SEPARATE_AR) {
 15116:         XEiJ.mpuCycleCount += 4;
 15117:         return (XEiJ.regRn[13] += 2) - 2;
 15118:       }
 15119:       //fallthrough
 15120:     case 0b011_110:  //(A6)+
 15121:       if (XEiJ.EFA_SEPARATE_AR) {
 15122:         XEiJ.mpuCycleCount += 4;
 15123:         return (XEiJ.regRn[14] += 2) - 2;
 15124:       }
 15125:       //fallthrough
 15126:     case 0b011_111:  //(A7)+
 15127:       if (XEiJ.EFA_SEPARATE_AR) {
 15128:         XEiJ.mpuCycleCount += 4;
 15129:         return (XEiJ.regRn[15] += 2) - 2;
 15130:       } else {
 15131:         XEiJ.mpuCycleCount += 4;
 15132:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2;
 15133:       }
 15134:     case 0b100_000:  //-(A0)
 15135:       if (XEiJ.EFA_SEPARATE_AR) {
 15136:         XEiJ.mpuCycleCount += 6;
 15137:         return XEiJ.regRn[ 8] -= 2;
 15138:       }
 15139:       //fallthrough
 15140:     case 0b100_001:  //-(A1)
 15141:       if (XEiJ.EFA_SEPARATE_AR) {
 15142:         XEiJ.mpuCycleCount += 6;
 15143:         return XEiJ.regRn[ 9] -= 2;
 15144:       }
 15145:       //fallthrough
 15146:     case 0b100_010:  //-(A2)
 15147:       if (XEiJ.EFA_SEPARATE_AR) {
 15148:         XEiJ.mpuCycleCount += 6;
 15149:         return XEiJ.regRn[10] -= 2;
 15150:       }
 15151:       //fallthrough
 15152:     case 0b100_011:  //-(A3)
 15153:       if (XEiJ.EFA_SEPARATE_AR) {
 15154:         XEiJ.mpuCycleCount += 6;
 15155:         return XEiJ.regRn[11] -= 2;
 15156:       }
 15157:       //fallthrough
 15158:     case 0b100_100:  //-(A4)
 15159:       if (XEiJ.EFA_SEPARATE_AR) {
 15160:         XEiJ.mpuCycleCount += 6;
 15161:         return XEiJ.regRn[12] -= 2;
 15162:       }
 15163:       //fallthrough
 15164:     case 0b100_101:  //-(A5)
 15165:       if (XEiJ.EFA_SEPARATE_AR) {
 15166:         XEiJ.mpuCycleCount += 6;
 15167:         return XEiJ.regRn[13] -= 2;
 15168:       }
 15169:       //fallthrough
 15170:     case 0b100_110:  //-(A6)
 15171:       if (XEiJ.EFA_SEPARATE_AR) {
 15172:         XEiJ.mpuCycleCount += 6;
 15173:         return XEiJ.regRn[14] -= 2;
 15174:       }
 15175:       //fallthrough
 15176:     case 0b100_111:  //-(A7)
 15177:       if (XEiJ.EFA_SEPARATE_AR) {
 15178:         XEiJ.mpuCycleCount += 6;
 15179:         return XEiJ.regRn[15] -= 2;
 15180:       } else {
 15181:         XEiJ.mpuCycleCount += 6;
 15182:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2;
 15183:       }
 15184:     case 0b101_000:  //(d16,A0)
 15185:     case 0b101_001:  //(d16,A1)
 15186:     case 0b101_010:  //(d16,A2)
 15187:     case 0b101_011:  //(d16,A3)
 15188:     case 0b101_100:  //(d16,A4)
 15189:     case 0b101_101:  //(d16,A5)
 15190:     case 0b101_110:  //(d16,A6)
 15191:     case 0b101_111:  //(d16,A7)
 15192:       XEiJ.mpuCycleCount += 8;
 15193:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15194:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15195:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15196:       } else {
 15197:         t = XEiJ.regPC;
 15198:         XEiJ.regPC = t + 2;
 15199:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15200:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15201:       }
 15202:     case 0b110_000:  //(d8,A0,Rn.wl)
 15203:     case 0b110_001:  //(d8,A1,Rn.wl)
 15204:     case 0b110_010:  //(d8,A2,Rn.wl)
 15205:     case 0b110_011:  //(d8,A3,Rn.wl)
 15206:     case 0b110_100:  //(d8,A4,Rn.wl)
 15207:     case 0b110_101:  //(d8,A5,Rn.wl)
 15208:     case 0b110_110:  //(d8,A6,Rn.wl)
 15209:     case 0b110_111:  //(d8,A7,Rn.wl)
 15210:       XEiJ.mpuCycleCount += 10;
 15211:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15212:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15213:       } else {
 15214:         w = XEiJ.regPC;
 15215:         XEiJ.regPC = w + 2;
 15216:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15217:       }
 15218:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15219:               + (byte) w  //バイトディスプレースメント
 15220:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15221:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15222:     case 0b111_000:  //(xxx).W
 15223:       XEiJ.mpuCycleCount += 8;
 15224:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15225:     case 0b111_001:  //(xxx).L
 15226:       XEiJ.mpuCycleCount += 12;
 15227:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15228:     }  //switch
 15229:     XEiJ.mpuCycleCount += 34;
 15230:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15231:     throw M68kException.m6eSignal;
 15232:   }  //efaMltWord
 15233: 
 15234:   //a = efaCntWord (ea)  //|  M  WXZP |
 15235:   //  制御モードのワードオペランドの実効アドレスを求める
 15236:   //  efaMemWordとの違いは(Ar)+と-(Ar)がないこと
 15237:   @SuppressWarnings ("fallthrough") public static int efaCntWord (int ea) throws M68kException {
 15238:     int t, w;
 15239:     switch (ea) {
 15240:     case 0b010_000:  //(A0)
 15241:       if (XEiJ.EFA_SEPARATE_AR) {
 15242:         XEiJ.mpuCycleCount += 4;
 15243:         return XEiJ.regRn[ 8];
 15244:       }
 15245:       //fallthrough
 15246:     case 0b010_001:  //(A1)
 15247:       if (XEiJ.EFA_SEPARATE_AR) {
 15248:         XEiJ.mpuCycleCount += 4;
 15249:         return XEiJ.regRn[ 9];
 15250:       }
 15251:       //fallthrough
 15252:     case 0b010_010:  //(A2)
 15253:       if (XEiJ.EFA_SEPARATE_AR) {
 15254:         XEiJ.mpuCycleCount += 4;
 15255:         return XEiJ.regRn[10];
 15256:       }
 15257:       //fallthrough
 15258:     case 0b010_011:  //(A3)
 15259:       if (XEiJ.EFA_SEPARATE_AR) {
 15260:         XEiJ.mpuCycleCount += 4;
 15261:         return XEiJ.regRn[11];
 15262:       }
 15263:       //fallthrough
 15264:     case 0b010_100:  //(A4)
 15265:       if (XEiJ.EFA_SEPARATE_AR) {
 15266:         XEiJ.mpuCycleCount += 4;
 15267:         return XEiJ.regRn[12];
 15268:       }
 15269:       //fallthrough
 15270:     case 0b010_101:  //(A5)
 15271:       if (XEiJ.EFA_SEPARATE_AR) {
 15272:         XEiJ.mpuCycleCount += 4;
 15273:         return XEiJ.regRn[13];
 15274:       }
 15275:       //fallthrough
 15276:     case 0b010_110:  //(A6)
 15277:       if (XEiJ.EFA_SEPARATE_AR) {
 15278:         XEiJ.mpuCycleCount += 4;
 15279:         return XEiJ.regRn[14];
 15280:       }
 15281:       //fallthrough
 15282:     case 0b010_111:  //(A7)
 15283:       if (XEiJ.EFA_SEPARATE_AR) {
 15284:         XEiJ.mpuCycleCount += 4;
 15285:         return XEiJ.regRn[15];
 15286:       } else {
 15287:         XEiJ.mpuCycleCount += 4;
 15288:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15289:       }
 15290:     case 0b101_000:  //(d16,A0)
 15291:     case 0b101_001:  //(d16,A1)
 15292:     case 0b101_010:  //(d16,A2)
 15293:     case 0b101_011:  //(d16,A3)
 15294:     case 0b101_100:  //(d16,A4)
 15295:     case 0b101_101:  //(d16,A5)
 15296:     case 0b101_110:  //(d16,A6)
 15297:     case 0b101_111:  //(d16,A7)
 15298:       XEiJ.mpuCycleCount += 8;
 15299:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15300:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15301:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15302:       } else {
 15303:         t = XEiJ.regPC;
 15304:         XEiJ.regPC = t + 2;
 15305:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15306:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15307:       }
 15308:     case 0b110_000:  //(d8,A0,Rn.wl)
 15309:     case 0b110_001:  //(d8,A1,Rn.wl)
 15310:     case 0b110_010:  //(d8,A2,Rn.wl)
 15311:     case 0b110_011:  //(d8,A3,Rn.wl)
 15312:     case 0b110_100:  //(d8,A4,Rn.wl)
 15313:     case 0b110_101:  //(d8,A5,Rn.wl)
 15314:     case 0b110_110:  //(d8,A6,Rn.wl)
 15315:     case 0b110_111:  //(d8,A7,Rn.wl)
 15316:       XEiJ.mpuCycleCount += 10;
 15317:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15318:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15319:       } else {
 15320:         w = XEiJ.regPC;
 15321:         XEiJ.regPC = w + 2;
 15322:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15323:       }
 15324:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15325:               + (byte) w  //バイトディスプレースメント
 15326:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15327:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15328:     case 0b111_000:  //(xxx).W
 15329:       XEiJ.mpuCycleCount += 8;
 15330:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15331:     case 0b111_001:  //(xxx).L
 15332:       XEiJ.mpuCycleCount += 12;
 15333:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15334:     case 0b111_010:  //(d16,PC)
 15335:       XEiJ.mpuCycleCount += 8;
 15336:       t = XEiJ.regPC;
 15337:       XEiJ.regPC = t + 2;
 15338:       return (t  //ベースレジスタ
 15339:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15340:     case 0b111_011:  //(d8,PC,Rn.wl)
 15341:       XEiJ.mpuCycleCount += 10;
 15342:       t = XEiJ.regPC;
 15343:       XEiJ.regPC = t + 2;
 15344:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15345:       return (t  //ベースレジスタ
 15346:               + (byte) w  //バイトディスプレースメント
 15347:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15348:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15349:     }  //switch
 15350:     XEiJ.mpuCycleCount += 34;
 15351:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15352:     throw M68kException.m6eSignal;
 15353:   }  //efaCntWord
 15354: 
 15355:   //a = efaCltWord (ea)  //|  M  WXZ  |
 15356:   //  制御可変モードのワードオペランドの実効アドレスを求める
 15357:   //  efaCntWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 15358:   @SuppressWarnings ("fallthrough") public static int efaCltWord (int ea) throws M68kException {
 15359:     int t, w;
 15360:     switch (ea) {
 15361:     case 0b010_000:  //(A0)
 15362:       if (XEiJ.EFA_SEPARATE_AR) {
 15363:         XEiJ.mpuCycleCount += 4;
 15364:         return XEiJ.regRn[ 8];
 15365:       }
 15366:       //fallthrough
 15367:     case 0b010_001:  //(A1)
 15368:       if (XEiJ.EFA_SEPARATE_AR) {
 15369:         XEiJ.mpuCycleCount += 4;
 15370:         return XEiJ.regRn[ 9];
 15371:       }
 15372:       //fallthrough
 15373:     case 0b010_010:  //(A2)
 15374:       if (XEiJ.EFA_SEPARATE_AR) {
 15375:         XEiJ.mpuCycleCount += 4;
 15376:         return XEiJ.regRn[10];
 15377:       }
 15378:       //fallthrough
 15379:     case 0b010_011:  //(A3)
 15380:       if (XEiJ.EFA_SEPARATE_AR) {
 15381:         XEiJ.mpuCycleCount += 4;
 15382:         return XEiJ.regRn[11];
 15383:       }
 15384:       //fallthrough
 15385:     case 0b010_100:  //(A4)
 15386:       if (XEiJ.EFA_SEPARATE_AR) {
 15387:         XEiJ.mpuCycleCount += 4;
 15388:         return XEiJ.regRn[12];
 15389:       }
 15390:       //fallthrough
 15391:     case 0b010_101:  //(A5)
 15392:       if (XEiJ.EFA_SEPARATE_AR) {
 15393:         XEiJ.mpuCycleCount += 4;
 15394:         return XEiJ.regRn[13];
 15395:       }
 15396:       //fallthrough
 15397:     case 0b010_110:  //(A6)
 15398:       if (XEiJ.EFA_SEPARATE_AR) {
 15399:         XEiJ.mpuCycleCount += 4;
 15400:         return XEiJ.regRn[14];
 15401:       }
 15402:       //fallthrough
 15403:     case 0b010_111:  //(A7)
 15404:       if (XEiJ.EFA_SEPARATE_AR) {
 15405:         XEiJ.mpuCycleCount += 4;
 15406:         return XEiJ.regRn[15];
 15407:       } else {
 15408:         XEiJ.mpuCycleCount += 4;
 15409:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15410:       }
 15411:     case 0b101_000:  //(d16,A0)
 15412:     case 0b101_001:  //(d16,A1)
 15413:     case 0b101_010:  //(d16,A2)
 15414:     case 0b101_011:  //(d16,A3)
 15415:     case 0b101_100:  //(d16,A4)
 15416:     case 0b101_101:  //(d16,A5)
 15417:     case 0b101_110:  //(d16,A6)
 15418:     case 0b101_111:  //(d16,A7)
 15419:       XEiJ.mpuCycleCount += 8;
 15420:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15421:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15422:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15423:       } else {
 15424:         t = XEiJ.regPC;
 15425:         XEiJ.regPC = t + 2;
 15426:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15427:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15428:       }
 15429:     case 0b110_000:  //(d8,A0,Rn.wl)
 15430:     case 0b110_001:  //(d8,A1,Rn.wl)
 15431:     case 0b110_010:  //(d8,A2,Rn.wl)
 15432:     case 0b110_011:  //(d8,A3,Rn.wl)
 15433:     case 0b110_100:  //(d8,A4,Rn.wl)
 15434:     case 0b110_101:  //(d8,A5,Rn.wl)
 15435:     case 0b110_110:  //(d8,A6,Rn.wl)
 15436:     case 0b110_111:  //(d8,A7,Rn.wl)
 15437:       XEiJ.mpuCycleCount += 10;
 15438:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15439:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15440:       } else {
 15441:         w = XEiJ.regPC;
 15442:         XEiJ.regPC = w + 2;
 15443:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15444:       }
 15445:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15446:               + (byte) w  //バイトディスプレースメント
 15447:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15448:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15449:     case 0b111_000:  //(xxx).W
 15450:       XEiJ.mpuCycleCount += 8;
 15451:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15452:     case 0b111_001:  //(xxx).L
 15453:       XEiJ.mpuCycleCount += 12;
 15454:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15455:     }  //switch
 15456:     XEiJ.mpuCycleCount += 34;
 15457:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15458:     throw M68kException.m6eSignal;
 15459:   }  //efaCltWord
 15460: 
 15461:   //a = efaAnyLong (ea)  //|  M+-WXZPI|
 15462:   //  任意のモードのロングオペランドの実効アドレスを求める
 15463:   //  efaAnyWordとの違いは(Ar)+と-(Ar)がArを4変化させることと、#<data>がPCを4変化させることと、
 15464:   //  オペランドのアクセスが1ワード増える分の4サイクルが追加されていること
 15465:   @SuppressWarnings ("fallthrough") public static int efaAnyLong (int ea) throws M68kException {
 15466:     int t, w;
 15467:     switch (ea) {
 15468:     case 0b010_000:  //(A0)
 15469:       if (XEiJ.EFA_SEPARATE_AR) {
 15470:         XEiJ.mpuCycleCount += 8;
 15471:         return XEiJ.regRn[ 8];
 15472:       }
 15473:       //fallthrough
 15474:     case 0b010_001:  //(A1)
 15475:       if (XEiJ.EFA_SEPARATE_AR) {
 15476:         XEiJ.mpuCycleCount += 8;
 15477:         return XEiJ.regRn[ 9];
 15478:       }
 15479:       //fallthrough
 15480:     case 0b010_010:  //(A2)
 15481:       if (XEiJ.EFA_SEPARATE_AR) {
 15482:         XEiJ.mpuCycleCount += 8;
 15483:         return XEiJ.regRn[10];
 15484:       }
 15485:       //fallthrough
 15486:     case 0b010_011:  //(A3)
 15487:       if (XEiJ.EFA_SEPARATE_AR) {
 15488:         XEiJ.mpuCycleCount += 8;
 15489:         return XEiJ.regRn[11];
 15490:       }
 15491:       //fallthrough
 15492:     case 0b010_100:  //(A4)
 15493:       if (XEiJ.EFA_SEPARATE_AR) {
 15494:         XEiJ.mpuCycleCount += 8;
 15495:         return XEiJ.regRn[12];
 15496:       }
 15497:       //fallthrough
 15498:     case 0b010_101:  //(A5)
 15499:       if (XEiJ.EFA_SEPARATE_AR) {
 15500:         XEiJ.mpuCycleCount += 8;
 15501:         return XEiJ.regRn[13];
 15502:       }
 15503:       //fallthrough
 15504:     case 0b010_110:  //(A6)
 15505:       if (XEiJ.EFA_SEPARATE_AR) {
 15506:         XEiJ.mpuCycleCount += 8;
 15507:         return XEiJ.regRn[14];
 15508:       }
 15509:       //fallthrough
 15510:     case 0b010_111:  //(A7)
 15511:       if (XEiJ.EFA_SEPARATE_AR) {
 15512:         XEiJ.mpuCycleCount += 8;
 15513:         return XEiJ.regRn[15];
 15514:       } else {
 15515:         XEiJ.mpuCycleCount += 8;
 15516:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15517:       }
 15518:     case 0b011_000:  //(A0)+
 15519:       if (XEiJ.EFA_SEPARATE_AR) {
 15520:         XEiJ.mpuCycleCount += 8;
 15521:         return (XEiJ.regRn[ 8] += 4) - 4;
 15522:       }
 15523:       //fallthrough
 15524:     case 0b011_001:  //(A1)+
 15525:       if (XEiJ.EFA_SEPARATE_AR) {
 15526:         XEiJ.mpuCycleCount += 8;
 15527:         return (XEiJ.regRn[ 9] += 4) - 4;
 15528:       }
 15529:       //fallthrough
 15530:     case 0b011_010:  //(A2)+
 15531:       if (XEiJ.EFA_SEPARATE_AR) {
 15532:         XEiJ.mpuCycleCount += 8;
 15533:         return (XEiJ.regRn[10] += 4) - 4;
 15534:       }
 15535:       //fallthrough
 15536:     case 0b011_011:  //(A3)+
 15537:       if (XEiJ.EFA_SEPARATE_AR) {
 15538:         XEiJ.mpuCycleCount += 8;
 15539:         return (XEiJ.regRn[11] += 4) - 4;
 15540:       }
 15541:       //fallthrough
 15542:     case 0b011_100:  //(A4)+
 15543:       if (XEiJ.EFA_SEPARATE_AR) {
 15544:         XEiJ.mpuCycleCount += 8;
 15545:         return (XEiJ.regRn[12] += 4) - 4;
 15546:       }
 15547:       //fallthrough
 15548:     case 0b011_101:  //(A5)+
 15549:       if (XEiJ.EFA_SEPARATE_AR) {
 15550:         XEiJ.mpuCycleCount += 8;
 15551:         return (XEiJ.regRn[13] += 4) - 4;
 15552:       }
 15553:       //fallthrough
 15554:     case 0b011_110:  //(A6)+
 15555:       if (XEiJ.EFA_SEPARATE_AR) {
 15556:         XEiJ.mpuCycleCount += 8;
 15557:         return (XEiJ.regRn[14] += 4) - 4;
 15558:       }
 15559:       //fallthrough
 15560:     case 0b011_111:  //(A7)+
 15561:       if (XEiJ.EFA_SEPARATE_AR) {
 15562:         XEiJ.mpuCycleCount += 8;
 15563:         return (XEiJ.regRn[15] += 4) - 4;
 15564:       } else {
 15565:         XEiJ.mpuCycleCount += 8;
 15566:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
 15567:       }
 15568:     case 0b100_000:  //-(A0)
 15569:       if (XEiJ.EFA_SEPARATE_AR) {
 15570:         XEiJ.mpuCycleCount += 10;
 15571:         return XEiJ.regRn[ 8] -= 4;
 15572:       }
 15573:       //fallthrough
 15574:     case 0b100_001:  //-(A1)
 15575:       if (XEiJ.EFA_SEPARATE_AR) {
 15576:         XEiJ.mpuCycleCount += 10;
 15577:         return XEiJ.regRn[ 9] -= 4;
 15578:       }
 15579:       //fallthrough
 15580:     case 0b100_010:  //-(A2)
 15581:       if (XEiJ.EFA_SEPARATE_AR) {
 15582:         XEiJ.mpuCycleCount += 10;
 15583:         return XEiJ.regRn[10] -= 4;
 15584:       }
 15585:       //fallthrough
 15586:     case 0b100_011:  //-(A3)
 15587:       if (XEiJ.EFA_SEPARATE_AR) {
 15588:         XEiJ.mpuCycleCount += 10;
 15589:         return XEiJ.regRn[11] -= 4;
 15590:       }
 15591:       //fallthrough
 15592:     case 0b100_100:  //-(A4)
 15593:       if (XEiJ.EFA_SEPARATE_AR) {
 15594:         XEiJ.mpuCycleCount += 10;
 15595:         return XEiJ.regRn[12] -= 4;
 15596:       }
 15597:       //fallthrough
 15598:     case 0b100_101:  //-(A5)
 15599:       if (XEiJ.EFA_SEPARATE_AR) {
 15600:         XEiJ.mpuCycleCount += 10;
 15601:         return XEiJ.regRn[13] -= 4;
 15602:       }
 15603:       //fallthrough
 15604:     case 0b100_110:  //-(A6)
 15605:       if (XEiJ.EFA_SEPARATE_AR) {
 15606:         XEiJ.mpuCycleCount += 10;
 15607:         return XEiJ.regRn[14] -= 4;
 15608:       }
 15609:       //fallthrough
 15610:     case 0b100_111:  //-(A7)
 15611:       if (XEiJ.EFA_SEPARATE_AR) {
 15612:         XEiJ.mpuCycleCount += 10;
 15613:         return XEiJ.regRn[15] -= 4;
 15614:       } else {
 15615:         XEiJ.mpuCycleCount += 10;
 15616:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
 15617:       }
 15618:     case 0b101_000:  //(d16,A0)
 15619:     case 0b101_001:  //(d16,A1)
 15620:     case 0b101_010:  //(d16,A2)
 15621:     case 0b101_011:  //(d16,A3)
 15622:     case 0b101_100:  //(d16,A4)
 15623:     case 0b101_101:  //(d16,A5)
 15624:     case 0b101_110:  //(d16,A6)
 15625:     case 0b101_111:  //(d16,A7)
 15626:       XEiJ.mpuCycleCount += 12;
 15627:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15628:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15629:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15630:       } else {
 15631:         t = XEiJ.regPC;
 15632:         XEiJ.regPC = t + 2;
 15633:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15634:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15635:       }
 15636:     case 0b110_000:  //(d8,A0,Rn.wl)
 15637:     case 0b110_001:  //(d8,A1,Rn.wl)
 15638:     case 0b110_010:  //(d8,A2,Rn.wl)
 15639:     case 0b110_011:  //(d8,A3,Rn.wl)
 15640:     case 0b110_100:  //(d8,A4,Rn.wl)
 15641:     case 0b110_101:  //(d8,A5,Rn.wl)
 15642:     case 0b110_110:  //(d8,A6,Rn.wl)
 15643:     case 0b110_111:  //(d8,A7,Rn.wl)
 15644:       XEiJ.mpuCycleCount += 14;
 15645:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15646:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15647:       } else {
 15648:         w = XEiJ.regPC;
 15649:         XEiJ.regPC = w + 2;
 15650:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15651:       }
 15652:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15653:               + (byte) w  //バイトディスプレースメント
 15654:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15655:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15656:     case 0b111_000:  //(xxx).W
 15657:       XEiJ.mpuCycleCount += 12;
 15658:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15659:     case 0b111_001:  //(xxx).L
 15660:       XEiJ.mpuCycleCount += 16;
 15661:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15662:     case 0b111_010:  //(d16,PC)
 15663:       XEiJ.mpuCycleCount += 12;
 15664:       t = XEiJ.regPC;
 15665:       XEiJ.regPC = t + 2;
 15666:       return (t  //ベースレジスタ
 15667:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15668:     case 0b111_011:  //(d8,PC,Rn.wl)
 15669:       XEiJ.mpuCycleCount += 14;
 15670:       t = XEiJ.regPC;
 15671:       XEiJ.regPC = t + 2;
 15672:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15673:       return (t  //ベースレジスタ
 15674:               + (byte) w  //バイトディスプレースメント
 15675:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15676:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15677:     case 0b111_100:  //#<data>
 15678:       XEiJ.mpuCycleCount += 8;
 15679:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15680:         return (XEiJ.regPC += 4) - 4;
 15681:       } else {
 15682:         t = XEiJ.regPC;
 15683:         XEiJ.regPC = t + 4;
 15684:         return t;
 15685:       }
 15686:     }  //switch
 15687:     XEiJ.mpuCycleCount += 34;
 15688:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15689:     throw M68kException.m6eSignal;
 15690:   }  //efaAnyLong
 15691: 
 15692:   //a = efaMemLong (ea)  //|  M+-WXZP |
 15693:   //  メモリモードのロングオペランドの実効アドレスを求める
 15694:   //  efaAnyLongとの違いは#<data>がないこと
 15695:   @SuppressWarnings ("fallthrough") public static int efaMemLong (int ea) throws M68kException {
 15696:     int t, w;
 15697:     switch (ea) {
 15698:     case 0b010_000:  //(A0)
 15699:       if (XEiJ.EFA_SEPARATE_AR) {
 15700:         XEiJ.mpuCycleCount += 8;
 15701:         return XEiJ.regRn[ 8];
 15702:       }
 15703:       //fallthrough
 15704:     case 0b010_001:  //(A1)
 15705:       if (XEiJ.EFA_SEPARATE_AR) {
 15706:         XEiJ.mpuCycleCount += 8;
 15707:         return XEiJ.regRn[ 9];
 15708:       }
 15709:       //fallthrough
 15710:     case 0b010_010:  //(A2)
 15711:       if (XEiJ.EFA_SEPARATE_AR) {
 15712:         XEiJ.mpuCycleCount += 8;
 15713:         return XEiJ.regRn[10];
 15714:       }
 15715:       //fallthrough
 15716:     case 0b010_011:  //(A3)
 15717:       if (XEiJ.EFA_SEPARATE_AR) {
 15718:         XEiJ.mpuCycleCount += 8;
 15719:         return XEiJ.regRn[11];
 15720:       }
 15721:       //fallthrough
 15722:     case 0b010_100:  //(A4)
 15723:       if (XEiJ.EFA_SEPARATE_AR) {
 15724:         XEiJ.mpuCycleCount += 8;
 15725:         return XEiJ.regRn[12];
 15726:       }
 15727:       //fallthrough
 15728:     case 0b010_101:  //(A5)
 15729:       if (XEiJ.EFA_SEPARATE_AR) {
 15730:         XEiJ.mpuCycleCount += 8;
 15731:         return XEiJ.regRn[13];
 15732:       }
 15733:       //fallthrough
 15734:     case 0b010_110:  //(A6)
 15735:       if (XEiJ.EFA_SEPARATE_AR) {
 15736:         XEiJ.mpuCycleCount += 8;
 15737:         return XEiJ.regRn[14];
 15738:       }
 15739:       //fallthrough
 15740:     case 0b010_111:  //(A7)
 15741:       if (XEiJ.EFA_SEPARATE_AR) {
 15742:         XEiJ.mpuCycleCount += 8;
 15743:         return XEiJ.regRn[15];
 15744:       } else {
 15745:         XEiJ.mpuCycleCount += 8;
 15746:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15747:       }
 15748:     case 0b011_000:  //(A0)+
 15749:       if (XEiJ.EFA_SEPARATE_AR) {
 15750:         XEiJ.mpuCycleCount += 8;
 15751:         return (XEiJ.regRn[ 8] += 4) - 4;
 15752:       }
 15753:       //fallthrough
 15754:     case 0b011_001:  //(A1)+
 15755:       if (XEiJ.EFA_SEPARATE_AR) {
 15756:         XEiJ.mpuCycleCount += 8;
 15757:         return (XEiJ.regRn[ 9] += 4) - 4;
 15758:       }
 15759:       //fallthrough
 15760:     case 0b011_010:  //(A2)+
 15761:       if (XEiJ.EFA_SEPARATE_AR) {
 15762:         XEiJ.mpuCycleCount += 8;
 15763:         return (XEiJ.regRn[10] += 4) - 4;
 15764:       }
 15765:       //fallthrough
 15766:     case 0b011_011:  //(A3)+
 15767:       if (XEiJ.EFA_SEPARATE_AR) {
 15768:         XEiJ.mpuCycleCount += 8;
 15769:         return (XEiJ.regRn[11] += 4) - 4;
 15770:       }
 15771:       //fallthrough
 15772:     case 0b011_100:  //(A4)+
 15773:       if (XEiJ.EFA_SEPARATE_AR) {
 15774:         XEiJ.mpuCycleCount += 8;
 15775:         return (XEiJ.regRn[12] += 4) - 4;
 15776:       }
 15777:       //fallthrough
 15778:     case 0b011_101:  //(A5)+
 15779:       if (XEiJ.EFA_SEPARATE_AR) {
 15780:         XEiJ.mpuCycleCount += 8;
 15781:         return (XEiJ.regRn[13] += 4) - 4;
 15782:       }
 15783:       //fallthrough
 15784:     case 0b011_110:  //(A6)+
 15785:       if (XEiJ.EFA_SEPARATE_AR) {
 15786:         XEiJ.mpuCycleCount += 8;
 15787:         return (XEiJ.regRn[14] += 4) - 4;
 15788:       }
 15789:       //fallthrough
 15790:     case 0b011_111:  //(A7)+
 15791:       if (XEiJ.EFA_SEPARATE_AR) {
 15792:         XEiJ.mpuCycleCount += 8;
 15793:         return (XEiJ.regRn[15] += 4) - 4;
 15794:       } else {
 15795:         XEiJ.mpuCycleCount += 8;
 15796:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
 15797:       }
 15798:     case 0b100_000:  //-(A0)
 15799:       if (XEiJ.EFA_SEPARATE_AR) {
 15800:         XEiJ.mpuCycleCount += 10;
 15801:         return XEiJ.regRn[ 8] -= 4;
 15802:       }
 15803:       //fallthrough
 15804:     case 0b100_001:  //-(A1)
 15805:       if (XEiJ.EFA_SEPARATE_AR) {
 15806:         XEiJ.mpuCycleCount += 10;
 15807:         return XEiJ.regRn[ 9] -= 4;
 15808:       }
 15809:       //fallthrough
 15810:     case 0b100_010:  //-(A2)
 15811:       if (XEiJ.EFA_SEPARATE_AR) {
 15812:         XEiJ.mpuCycleCount += 10;
 15813:         return XEiJ.regRn[10] -= 4;
 15814:       }
 15815:       //fallthrough
 15816:     case 0b100_011:  //-(A3)
 15817:       if (XEiJ.EFA_SEPARATE_AR) {
 15818:         XEiJ.mpuCycleCount += 10;
 15819:         return XEiJ.regRn[11] -= 4;
 15820:       }
 15821:       //fallthrough
 15822:     case 0b100_100:  //-(A4)
 15823:       if (XEiJ.EFA_SEPARATE_AR) {
 15824:         XEiJ.mpuCycleCount += 10;
 15825:         return XEiJ.regRn[12] -= 4;
 15826:       }
 15827:       //fallthrough
 15828:     case 0b100_101:  //-(A5)
 15829:       if (XEiJ.EFA_SEPARATE_AR) {
 15830:         XEiJ.mpuCycleCount += 10;
 15831:         return XEiJ.regRn[13] -= 4;
 15832:       }
 15833:       //fallthrough
 15834:     case 0b100_110:  //-(A6)
 15835:       if (XEiJ.EFA_SEPARATE_AR) {
 15836:         XEiJ.mpuCycleCount += 10;
 15837:         return XEiJ.regRn[14] -= 4;
 15838:       }
 15839:       //fallthrough
 15840:     case 0b100_111:  //-(A7)
 15841:       if (XEiJ.EFA_SEPARATE_AR) {
 15842:         XEiJ.mpuCycleCount += 10;
 15843:         return XEiJ.regRn[15] -= 4;
 15844:       } else {
 15845:         XEiJ.mpuCycleCount += 10;
 15846:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
 15847:       }
 15848:     case 0b101_000:  //(d16,A0)
 15849:     case 0b101_001:  //(d16,A1)
 15850:     case 0b101_010:  //(d16,A2)
 15851:     case 0b101_011:  //(d16,A3)
 15852:     case 0b101_100:  //(d16,A4)
 15853:     case 0b101_101:  //(d16,A5)
 15854:     case 0b101_110:  //(d16,A6)
 15855:     case 0b101_111:  //(d16,A7)
 15856:       XEiJ.mpuCycleCount += 12;
 15857:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15858:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15859:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 15860:       } else {
 15861:         t = XEiJ.regPC;
 15862:         XEiJ.regPC = t + 2;
 15863:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 15864:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15865:       }
 15866:     case 0b110_000:  //(d8,A0,Rn.wl)
 15867:     case 0b110_001:  //(d8,A1,Rn.wl)
 15868:     case 0b110_010:  //(d8,A2,Rn.wl)
 15869:     case 0b110_011:  //(d8,A3,Rn.wl)
 15870:     case 0b110_100:  //(d8,A4,Rn.wl)
 15871:     case 0b110_101:  //(d8,A5,Rn.wl)
 15872:     case 0b110_110:  //(d8,A6,Rn.wl)
 15873:     case 0b110_111:  //(d8,A7,Rn.wl)
 15874:       XEiJ.mpuCycleCount += 14;
 15875:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 15876:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 15877:       } else {
 15878:         w = XEiJ.regPC;
 15879:         XEiJ.regPC = w + 2;
 15880:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 15881:       }
 15882:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 15883:               + (byte) w  //バイトディスプレースメント
 15884:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15885:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15886:     case 0b111_000:  //(xxx).W
 15887:       XEiJ.mpuCycleCount += 12;
 15888:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 15889:     case 0b111_001:  //(xxx).L
 15890:       XEiJ.mpuCycleCount += 16;
 15891:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 15892:     case 0b111_010:  //(d16,PC)
 15893:       XEiJ.mpuCycleCount += 12;
 15894:       t = XEiJ.regPC;
 15895:       XEiJ.regPC = t + 2;
 15896:       return (t  //ベースレジスタ
 15897:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 15898:     case 0b111_011:  //(d8,PC,Rn.wl)
 15899:       XEiJ.mpuCycleCount += 14;
 15900:       t = XEiJ.regPC;
 15901:       XEiJ.regPC = t + 2;
 15902:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 15903:       return (t  //ベースレジスタ
 15904:               + (byte) w  //バイトディスプレースメント
 15905:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 15906:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 15907:     }  //switch
 15908:     XEiJ.mpuCycleCount += 34;
 15909:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 15910:     throw M68kException.m6eSignal;
 15911:   }  //efaMemLong
 15912: 
 15913:   //a = efaMltLong (ea)  //|  M+-WXZ  |
 15914:   //  メモリ可変モードのロングオペランドの実効アドレスを求める
 15915:   //  efaMemLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 15916:   @SuppressWarnings ("fallthrough") public static int efaMltLong (int ea) throws M68kException {
 15917:     int t, w;
 15918:     switch (ea) {
 15919:     case 0b010_000:  //(A0)
 15920:       if (XEiJ.EFA_SEPARATE_AR) {
 15921:         XEiJ.mpuCycleCount += 8;
 15922:         return XEiJ.regRn[ 8];
 15923:       }
 15924:       //fallthrough
 15925:     case 0b010_001:  //(A1)
 15926:       if (XEiJ.EFA_SEPARATE_AR) {
 15927:         XEiJ.mpuCycleCount += 8;
 15928:         return XEiJ.regRn[ 9];
 15929:       }
 15930:       //fallthrough
 15931:     case 0b010_010:  //(A2)
 15932:       if (XEiJ.EFA_SEPARATE_AR) {
 15933:         XEiJ.mpuCycleCount += 8;
 15934:         return XEiJ.regRn[10];
 15935:       }
 15936:       //fallthrough
 15937:     case 0b010_011:  //(A3)
 15938:       if (XEiJ.EFA_SEPARATE_AR) {
 15939:         XEiJ.mpuCycleCount += 8;
 15940:         return XEiJ.regRn[11];
 15941:       }
 15942:       //fallthrough
 15943:     case 0b010_100:  //(A4)
 15944:       if (XEiJ.EFA_SEPARATE_AR) {
 15945:         XEiJ.mpuCycleCount += 8;
 15946:         return XEiJ.regRn[12];
 15947:       }
 15948:       //fallthrough
 15949:     case 0b010_101:  //(A5)
 15950:       if (XEiJ.EFA_SEPARATE_AR) {
 15951:         XEiJ.mpuCycleCount += 8;
 15952:         return XEiJ.regRn[13];
 15953:       }
 15954:       //fallthrough
 15955:     case 0b010_110:  //(A6)
 15956:       if (XEiJ.EFA_SEPARATE_AR) {
 15957:         XEiJ.mpuCycleCount += 8;
 15958:         return XEiJ.regRn[14];
 15959:       }
 15960:       //fallthrough
 15961:     case 0b010_111:  //(A7)
 15962:       if (XEiJ.EFA_SEPARATE_AR) {
 15963:         XEiJ.mpuCycleCount += 8;
 15964:         return XEiJ.regRn[15];
 15965:       } else {
 15966:         XEiJ.mpuCycleCount += 8;
 15967:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 15968:       }
 15969:     case 0b011_000:  //(A0)+
 15970:       if (XEiJ.EFA_SEPARATE_AR) {
 15971:         XEiJ.mpuCycleCount += 8;
 15972:         return (XEiJ.regRn[ 8] += 4) - 4;
 15973:       }
 15974:       //fallthrough
 15975:     case 0b011_001:  //(A1)+
 15976:       if (XEiJ.EFA_SEPARATE_AR) {
 15977:         XEiJ.mpuCycleCount += 8;
 15978:         return (XEiJ.regRn[ 9] += 4) - 4;
 15979:       }
 15980:       //fallthrough
 15981:     case 0b011_010:  //(A2)+
 15982:       if (XEiJ.EFA_SEPARATE_AR) {
 15983:         XEiJ.mpuCycleCount += 8;
 15984:         return (XEiJ.regRn[10] += 4) - 4;
 15985:       }
 15986:       //fallthrough
 15987:     case 0b011_011:  //(A3)+
 15988:       if (XEiJ.EFA_SEPARATE_AR) {
 15989:         XEiJ.mpuCycleCount += 8;
 15990:         return (XEiJ.regRn[11] += 4) - 4;
 15991:       }
 15992:       //fallthrough
 15993:     case 0b011_100:  //(A4)+
 15994:       if (XEiJ.EFA_SEPARATE_AR) {
 15995:         XEiJ.mpuCycleCount += 8;
 15996:         return (XEiJ.regRn[12] += 4) - 4;
 15997:       }
 15998:       //fallthrough
 15999:     case 0b011_101:  //(A5)+
 16000:       if (XEiJ.EFA_SEPARATE_AR) {
 16001:         XEiJ.mpuCycleCount += 8;
 16002:         return (XEiJ.regRn[13] += 4) - 4;
 16003:       }
 16004:       //fallthrough
 16005:     case 0b011_110:  //(A6)+
 16006:       if (XEiJ.EFA_SEPARATE_AR) {
 16007:         XEiJ.mpuCycleCount += 8;
 16008:         return (XEiJ.regRn[14] += 4) - 4;
 16009:       }
 16010:       //fallthrough
 16011:     case 0b011_111:  //(A7)+
 16012:       if (XEiJ.EFA_SEPARATE_AR) {
 16013:         XEiJ.mpuCycleCount += 8;
 16014:         return (XEiJ.regRn[15] += 4) - 4;
 16015:       } else {
 16016:         XEiJ.mpuCycleCount += 8;
 16017:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
 16018:       }
 16019:     case 0b100_000:  //-(A0)
 16020:       if (XEiJ.EFA_SEPARATE_AR) {
 16021:         XEiJ.mpuCycleCount += 10;
 16022:         return XEiJ.regRn[ 8] -= 4;
 16023:       }
 16024:       //fallthrough
 16025:     case 0b100_001:  //-(A1)
 16026:       if (XEiJ.EFA_SEPARATE_AR) {
 16027:         XEiJ.mpuCycleCount += 10;
 16028:         return XEiJ.regRn[ 9] -= 4;
 16029:       }
 16030:       //fallthrough
 16031:     case 0b100_010:  //-(A2)
 16032:       if (XEiJ.EFA_SEPARATE_AR) {
 16033:         XEiJ.mpuCycleCount += 10;
 16034:         return XEiJ.regRn[10] -= 4;
 16035:       }
 16036:       //fallthrough
 16037:     case 0b100_011:  //-(A3)
 16038:       if (XEiJ.EFA_SEPARATE_AR) {
 16039:         XEiJ.mpuCycleCount += 10;
 16040:         return XEiJ.regRn[11] -= 4;
 16041:       }
 16042:       //fallthrough
 16043:     case 0b100_100:  //-(A4)
 16044:       if (XEiJ.EFA_SEPARATE_AR) {
 16045:         XEiJ.mpuCycleCount += 10;
 16046:         return XEiJ.regRn[12] -= 4;
 16047:       }
 16048:       //fallthrough
 16049:     case 0b100_101:  //-(A5)
 16050:       if (XEiJ.EFA_SEPARATE_AR) {
 16051:         XEiJ.mpuCycleCount += 10;
 16052:         return XEiJ.regRn[13] -= 4;
 16053:       }
 16054:       //fallthrough
 16055:     case 0b100_110:  //-(A6)
 16056:       if (XEiJ.EFA_SEPARATE_AR) {
 16057:         XEiJ.mpuCycleCount += 10;
 16058:         return XEiJ.regRn[14] -= 4;
 16059:       }
 16060:       //fallthrough
 16061:     case 0b100_111:  //-(A7)
 16062:       if (XEiJ.EFA_SEPARATE_AR) {
 16063:         XEiJ.mpuCycleCount += 10;
 16064:         return XEiJ.regRn[15] -= 4;
 16065:       } else {
 16066:         XEiJ.mpuCycleCount += 10;
 16067:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
 16068:       }
 16069:     case 0b101_000:  //(d16,A0)
 16070:     case 0b101_001:  //(d16,A1)
 16071:     case 0b101_010:  //(d16,A2)
 16072:     case 0b101_011:  //(d16,A3)
 16073:     case 0b101_100:  //(d16,A4)
 16074:     case 0b101_101:  //(d16,A5)
 16075:     case 0b101_110:  //(d16,A6)
 16076:     case 0b101_111:  //(d16,A7)
 16077:       XEiJ.mpuCycleCount += 12;
 16078:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16079:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16080:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16081:       } else {
 16082:         t = XEiJ.regPC;
 16083:         XEiJ.regPC = t + 2;
 16084:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16085:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16086:       }
 16087:     case 0b110_000:  //(d8,A0,Rn.wl)
 16088:     case 0b110_001:  //(d8,A1,Rn.wl)
 16089:     case 0b110_010:  //(d8,A2,Rn.wl)
 16090:     case 0b110_011:  //(d8,A3,Rn.wl)
 16091:     case 0b110_100:  //(d8,A4,Rn.wl)
 16092:     case 0b110_101:  //(d8,A5,Rn.wl)
 16093:     case 0b110_110:  //(d8,A6,Rn.wl)
 16094:     case 0b110_111:  //(d8,A7,Rn.wl)
 16095:       XEiJ.mpuCycleCount += 14;
 16096:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16097:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16098:       } else {
 16099:         w = XEiJ.regPC;
 16100:         XEiJ.regPC = w + 2;
 16101:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16102:       }
 16103:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16104:               + (byte) w  //バイトディスプレースメント
 16105:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16106:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16107:     case 0b111_000:  //(xxx).W
 16108:       XEiJ.mpuCycleCount += 12;
 16109:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16110:     case 0b111_001:  //(xxx).L
 16111:       XEiJ.mpuCycleCount += 16;
 16112:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16113:     }  //switch
 16114:     XEiJ.mpuCycleCount += 34;
 16115:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16116:     throw M68kException.m6eSignal;
 16117:   }  //efaMltLong
 16118: 
 16119:   //a = efaCntLong (ea)  //|  M  WXZP |
 16120:   //  制御モードのロングオペランドの実効アドレスを求める
 16121:   //  efaMemLongとの違いは(Ar)+と-(Ar)がないこと
 16122:   @SuppressWarnings ("fallthrough") public static int efaCntLong (int ea) throws M68kException {
 16123:     int t, w;
 16124:     switch (ea) {
 16125:     case 0b010_000:  //(A0)
 16126:       if (XEiJ.EFA_SEPARATE_AR) {
 16127:         XEiJ.mpuCycleCount += 8;
 16128:         return XEiJ.regRn[ 8];
 16129:       }
 16130:       //fallthrough
 16131:     case 0b010_001:  //(A1)
 16132:       if (XEiJ.EFA_SEPARATE_AR) {
 16133:         XEiJ.mpuCycleCount += 8;
 16134:         return XEiJ.regRn[ 9];
 16135:       }
 16136:       //fallthrough
 16137:     case 0b010_010:  //(A2)
 16138:       if (XEiJ.EFA_SEPARATE_AR) {
 16139:         XEiJ.mpuCycleCount += 8;
 16140:         return XEiJ.regRn[10];
 16141:       }
 16142:       //fallthrough
 16143:     case 0b010_011:  //(A3)
 16144:       if (XEiJ.EFA_SEPARATE_AR) {
 16145:         XEiJ.mpuCycleCount += 8;
 16146:         return XEiJ.regRn[11];
 16147:       }
 16148:       //fallthrough
 16149:     case 0b010_100:  //(A4)
 16150:       if (XEiJ.EFA_SEPARATE_AR) {
 16151:         XEiJ.mpuCycleCount += 8;
 16152:         return XEiJ.regRn[12];
 16153:       }
 16154:       //fallthrough
 16155:     case 0b010_101:  //(A5)
 16156:       if (XEiJ.EFA_SEPARATE_AR) {
 16157:         XEiJ.mpuCycleCount += 8;
 16158:         return XEiJ.regRn[13];
 16159:       }
 16160:       //fallthrough
 16161:     case 0b010_110:  //(A6)
 16162:       if (XEiJ.EFA_SEPARATE_AR) {
 16163:         XEiJ.mpuCycleCount += 8;
 16164:         return XEiJ.regRn[14];
 16165:       }
 16166:       //fallthrough
 16167:     case 0b010_111:  //(A7)
 16168:       if (XEiJ.EFA_SEPARATE_AR) {
 16169:         XEiJ.mpuCycleCount += 8;
 16170:         return XEiJ.regRn[15];
 16171:       } else {
 16172:         XEiJ.mpuCycleCount += 8;
 16173:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16174:       }
 16175:     case 0b101_000:  //(d16,A0)
 16176:     case 0b101_001:  //(d16,A1)
 16177:     case 0b101_010:  //(d16,A2)
 16178:     case 0b101_011:  //(d16,A3)
 16179:     case 0b101_100:  //(d16,A4)
 16180:     case 0b101_101:  //(d16,A5)
 16181:     case 0b101_110:  //(d16,A6)
 16182:     case 0b101_111:  //(d16,A7)
 16183:       XEiJ.mpuCycleCount += 12;
 16184:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16185:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16186:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16187:       } else {
 16188:         t = XEiJ.regPC;
 16189:         XEiJ.regPC = t + 2;
 16190:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16191:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16192:       }
 16193:     case 0b110_000:  //(d8,A0,Rn.wl)
 16194:     case 0b110_001:  //(d8,A1,Rn.wl)
 16195:     case 0b110_010:  //(d8,A2,Rn.wl)
 16196:     case 0b110_011:  //(d8,A3,Rn.wl)
 16197:     case 0b110_100:  //(d8,A4,Rn.wl)
 16198:     case 0b110_101:  //(d8,A5,Rn.wl)
 16199:     case 0b110_110:  //(d8,A6,Rn.wl)
 16200:     case 0b110_111:  //(d8,A7,Rn.wl)
 16201:       XEiJ.mpuCycleCount += 14;
 16202:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16203:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16204:       } else {
 16205:         w = XEiJ.regPC;
 16206:         XEiJ.regPC = w + 2;
 16207:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16208:       }
 16209:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16210:               + (byte) w  //バイトディスプレースメント
 16211:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16212:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16213:     case 0b111_000:  //(xxx).W
 16214:       XEiJ.mpuCycleCount += 12;
 16215:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16216:     case 0b111_001:  //(xxx).L
 16217:       XEiJ.mpuCycleCount += 16;
 16218:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16219:     case 0b111_010:  //(d16,PC)
 16220:       XEiJ.mpuCycleCount += 12;
 16221:       t = XEiJ.regPC;
 16222:       XEiJ.regPC = t + 2;
 16223:       return (t  //ベースレジスタ
 16224:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16225:     case 0b111_011:  //(d8,PC,Rn.wl)
 16226:       XEiJ.mpuCycleCount += 14;
 16227:       t = XEiJ.regPC;
 16228:       XEiJ.regPC = t + 2;
 16229:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 16230:       return (t  //ベースレジスタ
 16231:               + (byte) w  //バイトディスプレースメント
 16232:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16233:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16234:     }  //switch
 16235:     XEiJ.mpuCycleCount += 34;
 16236:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16237:     throw M68kException.m6eSignal;
 16238:   }  //efaCntLong
 16239: 
 16240:   //a = efaCltLong (ea)  //|  M  WXZ  |
 16241:   //  制御可変モードのワードオペランドの実効アドレスを求める
 16242:   //  efaCntLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
 16243:   @SuppressWarnings ("fallthrough") public static int efaCltLong (int ea) throws M68kException {
 16244:     int t, w;
 16245:     switch (ea) {
 16246:     case 0b010_000:  //(A0)
 16247:       if (XEiJ.EFA_SEPARATE_AR) {
 16248:         XEiJ.mpuCycleCount += 8;
 16249:         return XEiJ.regRn[ 8];
 16250:       }
 16251:       //fallthrough
 16252:     case 0b010_001:  //(A1)
 16253:       if (XEiJ.EFA_SEPARATE_AR) {
 16254:         XEiJ.mpuCycleCount += 8;
 16255:         return XEiJ.regRn[ 9];
 16256:       }
 16257:       //fallthrough
 16258:     case 0b010_010:  //(A2)
 16259:       if (XEiJ.EFA_SEPARATE_AR) {
 16260:         XEiJ.mpuCycleCount += 8;
 16261:         return XEiJ.regRn[10];
 16262:       }
 16263:       //fallthrough
 16264:     case 0b010_011:  //(A3)
 16265:       if (XEiJ.EFA_SEPARATE_AR) {
 16266:         XEiJ.mpuCycleCount += 8;
 16267:         return XEiJ.regRn[11];
 16268:       }
 16269:       //fallthrough
 16270:     case 0b010_100:  //(A4)
 16271:       if (XEiJ.EFA_SEPARATE_AR) {
 16272:         XEiJ.mpuCycleCount += 8;
 16273:         return XEiJ.regRn[12];
 16274:       }
 16275:       //fallthrough
 16276:     case 0b010_101:  //(A5)
 16277:       if (XEiJ.EFA_SEPARATE_AR) {
 16278:         XEiJ.mpuCycleCount += 8;
 16279:         return XEiJ.regRn[13];
 16280:       }
 16281:       //fallthrough
 16282:     case 0b010_110:  //(A6)
 16283:       if (XEiJ.EFA_SEPARATE_AR) {
 16284:         XEiJ.mpuCycleCount += 8;
 16285:         return XEiJ.regRn[14];
 16286:       }
 16287:       //fallthrough
 16288:     case 0b010_111:  //(A7)
 16289:       if (XEiJ.EFA_SEPARATE_AR) {
 16290:         XEiJ.mpuCycleCount += 8;
 16291:         return XEiJ.regRn[15];
 16292:       } else {
 16293:         XEiJ.mpuCycleCount += 8;
 16294:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16295:       }
 16296:     case 0b101_000:  //(d16,A0)
 16297:     case 0b101_001:  //(d16,A1)
 16298:     case 0b101_010:  //(d16,A2)
 16299:     case 0b101_011:  //(d16,A3)
 16300:     case 0b101_100:  //(d16,A4)
 16301:     case 0b101_101:  //(d16,A5)
 16302:     case 0b101_110:  //(d16,A6)
 16303:     case 0b101_111:  //(d16,A7)
 16304:       XEiJ.mpuCycleCount += 12;
 16305:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16306:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16307:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16308:       } else {
 16309:         t = XEiJ.regPC;
 16310:         XEiJ.regPC = t + 2;
 16311:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16312:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16313:       }
 16314:     case 0b110_000:  //(d8,A0,Rn.wl)
 16315:     case 0b110_001:  //(d8,A1,Rn.wl)
 16316:     case 0b110_010:  //(d8,A2,Rn.wl)
 16317:     case 0b110_011:  //(d8,A3,Rn.wl)
 16318:     case 0b110_100:  //(d8,A4,Rn.wl)
 16319:     case 0b110_101:  //(d8,A5,Rn.wl)
 16320:     case 0b110_110:  //(d8,A6,Rn.wl)
 16321:     case 0b110_111:  //(d8,A7,Rn.wl)
 16322:       XEiJ.mpuCycleCount += 14;
 16323:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16324:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16325:       } else {
 16326:         w = XEiJ.regPC;
 16327:         XEiJ.regPC = w + 2;
 16328:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16329:       }
 16330:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16331:               + (byte) w  //バイトディスプレースメント
 16332:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16333:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16334:     case 0b111_000:  //(xxx).W
 16335:       XEiJ.mpuCycleCount += 12;
 16336:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16337:     case 0b111_001:  //(xxx).L
 16338:       XEiJ.mpuCycleCount += 16;
 16339:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16340:     }  //switch
 16341:     XEiJ.mpuCycleCount += 34;
 16342:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16343:     throw M68kException.m6eSignal;
 16344:   }  //efaCltLong
 16345: 
 16346:   //a = efaAnyQuad (ea)  //|  M+-WXZPI|
 16347:   //  任意のモードのクワッドオペランドの実効アドレスを求める
 16348:   //  efaAnyLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、
 16349:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 16350:   @SuppressWarnings ("fallthrough") public static int efaAnyQuad (int ea) throws M68kException {
 16351:     int t, w;
 16352:     switch (ea) {
 16353:     case 0b010_000:  //(A0)
 16354:       if (XEiJ.EFA_SEPARATE_AR) {
 16355:         XEiJ.mpuCycleCount += 16;
 16356:         return XEiJ.regRn[ 8];
 16357:       }
 16358:       //fallthrough
 16359:     case 0b010_001:  //(A1)
 16360:       if (XEiJ.EFA_SEPARATE_AR) {
 16361:         XEiJ.mpuCycleCount += 16;
 16362:         return XEiJ.regRn[ 9];
 16363:       }
 16364:       //fallthrough
 16365:     case 0b010_010:  //(A2)
 16366:       if (XEiJ.EFA_SEPARATE_AR) {
 16367:         XEiJ.mpuCycleCount += 16;
 16368:         return XEiJ.regRn[10];
 16369:       }
 16370:       //fallthrough
 16371:     case 0b010_011:  //(A3)
 16372:       if (XEiJ.EFA_SEPARATE_AR) {
 16373:         XEiJ.mpuCycleCount += 16;
 16374:         return XEiJ.regRn[11];
 16375:       }
 16376:       //fallthrough
 16377:     case 0b010_100:  //(A4)
 16378:       if (XEiJ.EFA_SEPARATE_AR) {
 16379:         XEiJ.mpuCycleCount += 16;
 16380:         return XEiJ.regRn[12];
 16381:       }
 16382:       //fallthrough
 16383:     case 0b010_101:  //(A5)
 16384:       if (XEiJ.EFA_SEPARATE_AR) {
 16385:         XEiJ.mpuCycleCount += 16;
 16386:         return XEiJ.regRn[13];
 16387:       }
 16388:       //fallthrough
 16389:     case 0b010_110:  //(A6)
 16390:       if (XEiJ.EFA_SEPARATE_AR) {
 16391:         XEiJ.mpuCycleCount += 16;
 16392:         return XEiJ.regRn[14];
 16393:       }
 16394:       //fallthrough
 16395:     case 0b010_111:  //(A7)
 16396:       if (XEiJ.EFA_SEPARATE_AR) {
 16397:         XEiJ.mpuCycleCount += 16;
 16398:         return XEiJ.regRn[15];
 16399:       } else {
 16400:         XEiJ.mpuCycleCount += 16;
 16401:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16402:       }
 16403:     case 0b011_000:  //(A0)+
 16404:       if (XEiJ.EFA_SEPARATE_AR) {
 16405:         XEiJ.mpuCycleCount += 16;
 16406:         return (XEiJ.regRn[ 8] += 8) - 8;
 16407:       }
 16408:       //fallthrough
 16409:     case 0b011_001:  //(A1)+
 16410:       if (XEiJ.EFA_SEPARATE_AR) {
 16411:         XEiJ.mpuCycleCount += 16;
 16412:         return (XEiJ.regRn[ 9] += 8) - 8;
 16413:       }
 16414:       //fallthrough
 16415:     case 0b011_010:  //(A2)+
 16416:       if (XEiJ.EFA_SEPARATE_AR) {
 16417:         XEiJ.mpuCycleCount += 16;
 16418:         return (XEiJ.regRn[10] += 8) - 8;
 16419:       }
 16420:       //fallthrough
 16421:     case 0b011_011:  //(A3)+
 16422:       if (XEiJ.EFA_SEPARATE_AR) {
 16423:         XEiJ.mpuCycleCount += 16;
 16424:         return (XEiJ.regRn[11] += 8) - 8;
 16425:       }
 16426:       //fallthrough
 16427:     case 0b011_100:  //(A4)+
 16428:       if (XEiJ.EFA_SEPARATE_AR) {
 16429:         XEiJ.mpuCycleCount += 16;
 16430:         return (XEiJ.regRn[12] += 8) - 8;
 16431:       }
 16432:       //fallthrough
 16433:     case 0b011_101:  //(A5)+
 16434:       if (XEiJ.EFA_SEPARATE_AR) {
 16435:         XEiJ.mpuCycleCount += 16;
 16436:         return (XEiJ.regRn[13] += 8) - 8;
 16437:       }
 16438:       //fallthrough
 16439:     case 0b011_110:  //(A6)+
 16440:       if (XEiJ.EFA_SEPARATE_AR) {
 16441:         XEiJ.mpuCycleCount += 16;
 16442:         return (XEiJ.regRn[14] += 8) - 8;
 16443:       }
 16444:       //fallthrough
 16445:     case 0b011_111:  //(A7)+
 16446:       if (XEiJ.EFA_SEPARATE_AR) {
 16447:         XEiJ.mpuCycleCount += 16;
 16448:         return (XEiJ.regRn[15] += 8) - 8;
 16449:       } else {
 16450:         XEiJ.mpuCycleCount += 16;
 16451:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8;
 16452:       }
 16453:     case 0b100_000:  //-(A0)
 16454:       if (XEiJ.EFA_SEPARATE_AR) {
 16455:         XEiJ.mpuCycleCount += 18;
 16456:         return XEiJ.regRn[ 8] -= 8;
 16457:       }
 16458:       //fallthrough
 16459:     case 0b100_001:  //-(A1)
 16460:       if (XEiJ.EFA_SEPARATE_AR) {
 16461:         XEiJ.mpuCycleCount += 18;
 16462:         return XEiJ.regRn[ 9] -= 8;
 16463:       }
 16464:       //fallthrough
 16465:     case 0b100_010:  //-(A2)
 16466:       if (XEiJ.EFA_SEPARATE_AR) {
 16467:         XEiJ.mpuCycleCount += 18;
 16468:         return XEiJ.regRn[10] -= 8;
 16469:       }
 16470:       //fallthrough
 16471:     case 0b100_011:  //-(A3)
 16472:       if (XEiJ.EFA_SEPARATE_AR) {
 16473:         XEiJ.mpuCycleCount += 18;
 16474:         return XEiJ.regRn[11] -= 8;
 16475:       }
 16476:       //fallthrough
 16477:     case 0b100_100:  //-(A4)
 16478:       if (XEiJ.EFA_SEPARATE_AR) {
 16479:         XEiJ.mpuCycleCount += 18;
 16480:         return XEiJ.regRn[12] -= 8;
 16481:       }
 16482:       //fallthrough
 16483:     case 0b100_101:  //-(A5)
 16484:       if (XEiJ.EFA_SEPARATE_AR) {
 16485:         XEiJ.mpuCycleCount += 18;
 16486:         return XEiJ.regRn[13] -= 8;
 16487:       }
 16488:       //fallthrough
 16489:     case 0b100_110:  //-(A6)
 16490:       if (XEiJ.EFA_SEPARATE_AR) {
 16491:         XEiJ.mpuCycleCount += 18;
 16492:         return XEiJ.regRn[14] -= 8;
 16493:       }
 16494:       //fallthrough
 16495:     case 0b100_111:  //-(A7)
 16496:       if (XEiJ.EFA_SEPARATE_AR) {
 16497:         XEiJ.mpuCycleCount += 18;
 16498:         return XEiJ.regRn[15] -= 8;
 16499:       } else {
 16500:         XEiJ.mpuCycleCount += 18;
 16501:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8;
 16502:       }
 16503:     case 0b101_000:  //(d16,A0)
 16504:     case 0b101_001:  //(d16,A1)
 16505:     case 0b101_010:  //(d16,A2)
 16506:     case 0b101_011:  //(d16,A3)
 16507:     case 0b101_100:  //(d16,A4)
 16508:     case 0b101_101:  //(d16,A5)
 16509:     case 0b101_110:  //(d16,A6)
 16510:     case 0b101_111:  //(d16,A7)
 16511:       XEiJ.mpuCycleCount += 20;
 16512:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16513:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16514:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16515:       } else {
 16516:         t = XEiJ.regPC;
 16517:         XEiJ.regPC = t + 2;
 16518:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16519:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16520:       }
 16521:     case 0b110_000:  //(d8,A0,Rn.wl)
 16522:     case 0b110_001:  //(d8,A1,Rn.wl)
 16523:     case 0b110_010:  //(d8,A2,Rn.wl)
 16524:     case 0b110_011:  //(d8,A3,Rn.wl)
 16525:     case 0b110_100:  //(d8,A4,Rn.wl)
 16526:     case 0b110_101:  //(d8,A5,Rn.wl)
 16527:     case 0b110_110:  //(d8,A6,Rn.wl)
 16528:     case 0b110_111:  //(d8,A7,Rn.wl)
 16529:       XEiJ.mpuCycleCount += 22;
 16530:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16531:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16532:       } else {
 16533:         w = XEiJ.regPC;
 16534:         XEiJ.regPC = w + 2;
 16535:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16536:       }
 16537:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16538:               + (byte) w  //バイトディスプレースメント
 16539:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16540:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16541:     case 0b111_000:  //(xxx).W
 16542:       XEiJ.mpuCycleCount += 20;
 16543:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16544:     case 0b111_001:  //(xxx).L
 16545:       XEiJ.mpuCycleCount += 24;
 16546:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16547:     case 0b111_010:  //(d16,PC)
 16548:       XEiJ.mpuCycleCount += 20;
 16549:       t = XEiJ.regPC;
 16550:       XEiJ.regPC = t + 2;
 16551:       return (t  //ベースレジスタ
 16552:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16553:     case 0b111_011:  //(d8,PC,Rn.wl)
 16554:       XEiJ.mpuCycleCount += 22;
 16555:       t = XEiJ.regPC;
 16556:       XEiJ.regPC = t + 2;
 16557:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 16558:       return (t  //ベースレジスタ
 16559:               + (byte) w  //バイトディスプレースメント
 16560:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16561:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16562:     case 0b111_100:  //#<data>
 16563:       XEiJ.mpuCycleCount += 16;
 16564:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16565:         return (XEiJ.regPC += 8) - 8;
 16566:       } else {
 16567:         t = XEiJ.regPC;
 16568:         XEiJ.regPC = t + 8;
 16569:         return t;
 16570:       }
 16571:     }  //switch
 16572:     XEiJ.mpuCycleCount += 34;
 16573:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16574:     throw M68kException.m6eSignal;
 16575:   }  //efaAnyQuad
 16576: 
 16577:   //a = efaMltQuad (ea)  //|  M+-WXZ  |
 16578:   //  メモリ可変モードのクワッドオペランドの実効アドレスを求める
 16579:   //  efaMltLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、
 16580:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 16581:   @SuppressWarnings ("fallthrough") public static int efaMltQuad (int ea) throws M68kException {
 16582:     int t, w;
 16583:     switch (ea) {
 16584:     case 0b010_000:  //(A0)
 16585:       if (XEiJ.EFA_SEPARATE_AR) {
 16586:         XEiJ.mpuCycleCount += 16;
 16587:         return XEiJ.regRn[ 8];
 16588:       }
 16589:       //fallthrough
 16590:     case 0b010_001:  //(A1)
 16591:       if (XEiJ.EFA_SEPARATE_AR) {
 16592:         XEiJ.mpuCycleCount += 16;
 16593:         return XEiJ.regRn[ 9];
 16594:       }
 16595:       //fallthrough
 16596:     case 0b010_010:  //(A2)
 16597:       if (XEiJ.EFA_SEPARATE_AR) {
 16598:         XEiJ.mpuCycleCount += 16;
 16599:         return XEiJ.regRn[10];
 16600:       }
 16601:       //fallthrough
 16602:     case 0b010_011:  //(A3)
 16603:       if (XEiJ.EFA_SEPARATE_AR) {
 16604:         XEiJ.mpuCycleCount += 16;
 16605:         return XEiJ.regRn[11];
 16606:       }
 16607:       //fallthrough
 16608:     case 0b010_100:  //(A4)
 16609:       if (XEiJ.EFA_SEPARATE_AR) {
 16610:         XEiJ.mpuCycleCount += 16;
 16611:         return XEiJ.regRn[12];
 16612:       }
 16613:       //fallthrough
 16614:     case 0b010_101:  //(A5)
 16615:       if (XEiJ.EFA_SEPARATE_AR) {
 16616:         XEiJ.mpuCycleCount += 16;
 16617:         return XEiJ.regRn[13];
 16618:       }
 16619:       //fallthrough
 16620:     case 0b010_110:  //(A6)
 16621:       if (XEiJ.EFA_SEPARATE_AR) {
 16622:         XEiJ.mpuCycleCount += 16;
 16623:         return XEiJ.regRn[14];
 16624:       }
 16625:       //fallthrough
 16626:     case 0b010_111:  //(A7)
 16627:       if (XEiJ.EFA_SEPARATE_AR) {
 16628:         XEiJ.mpuCycleCount += 16;
 16629:         return XEiJ.regRn[15];
 16630:       } else {
 16631:         XEiJ.mpuCycleCount += 16;
 16632:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16633:       }
 16634:     case 0b011_000:  //(A0)+
 16635:       if (XEiJ.EFA_SEPARATE_AR) {
 16636:         XEiJ.mpuCycleCount += 16;
 16637:         return (XEiJ.regRn[ 8] += 8) - 8;
 16638:       }
 16639:       //fallthrough
 16640:     case 0b011_001:  //(A1)+
 16641:       if (XEiJ.EFA_SEPARATE_AR) {
 16642:         XEiJ.mpuCycleCount += 16;
 16643:         return (XEiJ.regRn[ 9] += 8) - 8;
 16644:       }
 16645:       //fallthrough
 16646:     case 0b011_010:  //(A2)+
 16647:       if (XEiJ.EFA_SEPARATE_AR) {
 16648:         XEiJ.mpuCycleCount += 16;
 16649:         return (XEiJ.regRn[10] += 8) - 8;
 16650:       }
 16651:       //fallthrough
 16652:     case 0b011_011:  //(A3)+
 16653:       if (XEiJ.EFA_SEPARATE_AR) {
 16654:         XEiJ.mpuCycleCount += 16;
 16655:         return (XEiJ.regRn[11] += 8) - 8;
 16656:       }
 16657:       //fallthrough
 16658:     case 0b011_100:  //(A4)+
 16659:       if (XEiJ.EFA_SEPARATE_AR) {
 16660:         XEiJ.mpuCycleCount += 16;
 16661:         return (XEiJ.regRn[12] += 8) - 8;
 16662:       }
 16663:       //fallthrough
 16664:     case 0b011_101:  //(A5)+
 16665:       if (XEiJ.EFA_SEPARATE_AR) {
 16666:         XEiJ.mpuCycleCount += 16;
 16667:         return (XEiJ.regRn[13] += 8) - 8;
 16668:       }
 16669:       //fallthrough
 16670:     case 0b011_110:  //(A6)+
 16671:       if (XEiJ.EFA_SEPARATE_AR) {
 16672:         XEiJ.mpuCycleCount += 16;
 16673:         return (XEiJ.regRn[14] += 8) - 8;
 16674:       }
 16675:       //fallthrough
 16676:     case 0b011_111:  //(A7)+
 16677:       if (XEiJ.EFA_SEPARATE_AR) {
 16678:         XEiJ.mpuCycleCount += 16;
 16679:         return (XEiJ.regRn[15] += 8) - 8;
 16680:       } else {
 16681:         XEiJ.mpuCycleCount += 16;
 16682:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8;
 16683:       }
 16684:     case 0b100_000:  //-(A0)
 16685:       if (XEiJ.EFA_SEPARATE_AR) {
 16686:         XEiJ.mpuCycleCount += 18;
 16687:         return XEiJ.regRn[ 8] -= 8;
 16688:       }
 16689:       //fallthrough
 16690:     case 0b100_001:  //-(A1)
 16691:       if (XEiJ.EFA_SEPARATE_AR) {
 16692:         XEiJ.mpuCycleCount += 18;
 16693:         return XEiJ.regRn[ 9] -= 8;
 16694:       }
 16695:       //fallthrough
 16696:     case 0b100_010:  //-(A2)
 16697:       if (XEiJ.EFA_SEPARATE_AR) {
 16698:         XEiJ.mpuCycleCount += 18;
 16699:         return XEiJ.regRn[10] -= 8;
 16700:       }
 16701:       //fallthrough
 16702:     case 0b100_011:  //-(A3)
 16703:       if (XEiJ.EFA_SEPARATE_AR) {
 16704:         XEiJ.mpuCycleCount += 18;
 16705:         return XEiJ.regRn[11] -= 8;
 16706:       }
 16707:       //fallthrough
 16708:     case 0b100_100:  //-(A4)
 16709:       if (XEiJ.EFA_SEPARATE_AR) {
 16710:         XEiJ.mpuCycleCount += 18;
 16711:         return XEiJ.regRn[12] -= 8;
 16712:       }
 16713:       //fallthrough
 16714:     case 0b100_101:  //-(A5)
 16715:       if (XEiJ.EFA_SEPARATE_AR) {
 16716:         XEiJ.mpuCycleCount += 18;
 16717:         return XEiJ.regRn[13] -= 8;
 16718:       }
 16719:       //fallthrough
 16720:     case 0b100_110:  //-(A6)
 16721:       if (XEiJ.EFA_SEPARATE_AR) {
 16722:         XEiJ.mpuCycleCount += 18;
 16723:         return XEiJ.regRn[14] -= 8;
 16724:       }
 16725:       //fallthrough
 16726:     case 0b100_111:  //-(A7)
 16727:       if (XEiJ.EFA_SEPARATE_AR) {
 16728:         XEiJ.mpuCycleCount += 18;
 16729:         return XEiJ.regRn[15] -= 8;
 16730:       } else {
 16731:         XEiJ.mpuCycleCount += 18;
 16732:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8;
 16733:       }
 16734:     case 0b101_000:  //(d16,A0)
 16735:     case 0b101_001:  //(d16,A1)
 16736:     case 0b101_010:  //(d16,A2)
 16737:     case 0b101_011:  //(d16,A3)
 16738:     case 0b101_100:  //(d16,A4)
 16739:     case 0b101_101:  //(d16,A5)
 16740:     case 0b101_110:  //(d16,A6)
 16741:     case 0b101_111:  //(d16,A7)
 16742:       XEiJ.mpuCycleCount += 20;
 16743:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16744:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16745:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16746:       } else {
 16747:         t = XEiJ.regPC;
 16748:         XEiJ.regPC = t + 2;
 16749:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16750:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16751:       }
 16752:     case 0b110_000:  //(d8,A0,Rn.wl)
 16753:     case 0b110_001:  //(d8,A1,Rn.wl)
 16754:     case 0b110_010:  //(d8,A2,Rn.wl)
 16755:     case 0b110_011:  //(d8,A3,Rn.wl)
 16756:     case 0b110_100:  //(d8,A4,Rn.wl)
 16757:     case 0b110_101:  //(d8,A5,Rn.wl)
 16758:     case 0b110_110:  //(d8,A6,Rn.wl)
 16759:     case 0b110_111:  //(d8,A7,Rn.wl)
 16760:       XEiJ.mpuCycleCount += 22;
 16761:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16762:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16763:       } else {
 16764:         w = XEiJ.regPC;
 16765:         XEiJ.regPC = w + 2;
 16766:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16767:       }
 16768:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16769:               + (byte) w  //バイトディスプレースメント
 16770:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16771:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16772:     case 0b111_000:  //(xxx).W
 16773:       XEiJ.mpuCycleCount += 20;
 16774:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16775:     case 0b111_001:  //(xxx).L
 16776:       XEiJ.mpuCycleCount += 24;
 16777:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16778:     }  //switch
 16779:     XEiJ.mpuCycleCount += 34;
 16780:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 16781:     throw M68kException.m6eSignal;
 16782:   }  //efaMltQuad
 16783: 
 16784:   //a = efaAnyExtd (ea)  //|  M+-WXZPI|
 16785:   //  任意のモードのエクステンデッドオペランドの実効アドレスを求める
 16786:   //  efaAnyQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、
 16787:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 16788:   @SuppressWarnings ("fallthrough") public static int efaAnyExtd (int ea) throws M68kException {
 16789:     int t, w;
 16790:     switch (ea) {
 16791:     case 0b010_000:  //(A0)
 16792:       if (XEiJ.EFA_SEPARATE_AR) {
 16793:         XEiJ.mpuCycleCount += 24;
 16794:         return XEiJ.regRn[ 8];
 16795:       }
 16796:       //fallthrough
 16797:     case 0b010_001:  //(A1)
 16798:       if (XEiJ.EFA_SEPARATE_AR) {
 16799:         XEiJ.mpuCycleCount += 24;
 16800:         return XEiJ.regRn[ 9];
 16801:       }
 16802:       //fallthrough
 16803:     case 0b010_010:  //(A2)
 16804:       if (XEiJ.EFA_SEPARATE_AR) {
 16805:         XEiJ.mpuCycleCount += 24;
 16806:         return XEiJ.regRn[10];
 16807:       }
 16808:       //fallthrough
 16809:     case 0b010_011:  //(A3)
 16810:       if (XEiJ.EFA_SEPARATE_AR) {
 16811:         XEiJ.mpuCycleCount += 24;
 16812:         return XEiJ.regRn[11];
 16813:       }
 16814:       //fallthrough
 16815:     case 0b010_100:  //(A4)
 16816:       if (XEiJ.EFA_SEPARATE_AR) {
 16817:         XEiJ.mpuCycleCount += 24;
 16818:         return XEiJ.regRn[12];
 16819:       }
 16820:       //fallthrough
 16821:     case 0b010_101:  //(A5)
 16822:       if (XEiJ.EFA_SEPARATE_AR) {
 16823:         XEiJ.mpuCycleCount += 24;
 16824:         return XEiJ.regRn[13];
 16825:       }
 16826:       //fallthrough
 16827:     case 0b010_110:  //(A6)
 16828:       if (XEiJ.EFA_SEPARATE_AR) {
 16829:         XEiJ.mpuCycleCount += 24;
 16830:         return XEiJ.regRn[14];
 16831:       }
 16832:       //fallthrough
 16833:     case 0b010_111:  //(A7)
 16834:       if (XEiJ.EFA_SEPARATE_AR) {
 16835:         XEiJ.mpuCycleCount += 24;
 16836:         return XEiJ.regRn[15];
 16837:       } else {
 16838:         XEiJ.mpuCycleCount += 24;
 16839:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 16840:       }
 16841:     case 0b011_000:  //(A0)+
 16842:       if (XEiJ.EFA_SEPARATE_AR) {
 16843:         XEiJ.mpuCycleCount += 24;
 16844:         return (XEiJ.regRn[ 8] += 12) - 12;
 16845:       }
 16846:       //fallthrough
 16847:     case 0b011_001:  //(A1)+
 16848:       if (XEiJ.EFA_SEPARATE_AR) {
 16849:         XEiJ.mpuCycleCount += 24;
 16850:         return (XEiJ.regRn[ 9] += 12) - 12;
 16851:       }
 16852:       //fallthrough
 16853:     case 0b011_010:  //(A2)+
 16854:       if (XEiJ.EFA_SEPARATE_AR) {
 16855:         XEiJ.mpuCycleCount += 24;
 16856:         return (XEiJ.regRn[10] += 12) - 12;
 16857:       }
 16858:       //fallthrough
 16859:     case 0b011_011:  //(A3)+
 16860:       if (XEiJ.EFA_SEPARATE_AR) {
 16861:         XEiJ.mpuCycleCount += 24;
 16862:         return (XEiJ.regRn[11] += 12) - 12;
 16863:       }
 16864:       //fallthrough
 16865:     case 0b011_100:  //(A4)+
 16866:       if (XEiJ.EFA_SEPARATE_AR) {
 16867:         XEiJ.mpuCycleCount += 24;
 16868:         return (XEiJ.regRn[12] += 12) - 12;
 16869:       }
 16870:       //fallthrough
 16871:     case 0b011_101:  //(A5)+
 16872:       if (XEiJ.EFA_SEPARATE_AR) {
 16873:         XEiJ.mpuCycleCount += 24;
 16874:         return (XEiJ.regRn[13] += 12) - 12;
 16875:       }
 16876:       //fallthrough
 16877:     case 0b011_110:  //(A6)+
 16878:       if (XEiJ.EFA_SEPARATE_AR) {
 16879:         XEiJ.mpuCycleCount += 24;
 16880:         return (XEiJ.regRn[14] += 12) - 12;
 16881:       }
 16882:       //fallthrough
 16883:     case 0b011_111:  //(A7)+
 16884:       if (XEiJ.EFA_SEPARATE_AR) {
 16885:         XEiJ.mpuCycleCount += 24;
 16886:         return (XEiJ.regRn[15] += 12) - 12;
 16887:       } else {
 16888:         XEiJ.mpuCycleCount += 24;
 16889:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12;
 16890:       }
 16891:     case 0b100_000:  //-(A0)
 16892:       if (XEiJ.EFA_SEPARATE_AR) {
 16893:         XEiJ.mpuCycleCount += 26;
 16894:         return XEiJ.regRn[ 8] -= 12;
 16895:       }
 16896:       //fallthrough
 16897:     case 0b100_001:  //-(A1)
 16898:       if (XEiJ.EFA_SEPARATE_AR) {
 16899:         XEiJ.mpuCycleCount += 26;
 16900:         return XEiJ.regRn[ 9] -= 12;
 16901:       }
 16902:       //fallthrough
 16903:     case 0b100_010:  //-(A2)
 16904:       if (XEiJ.EFA_SEPARATE_AR) {
 16905:         XEiJ.mpuCycleCount += 26;
 16906:         return XEiJ.regRn[10] -= 12;
 16907:       }
 16908:       //fallthrough
 16909:     case 0b100_011:  //-(A3)
 16910:       if (XEiJ.EFA_SEPARATE_AR) {
 16911:         XEiJ.mpuCycleCount += 26;
 16912:         return XEiJ.regRn[11] -= 12;
 16913:       }
 16914:       //fallthrough
 16915:     case 0b100_100:  //-(A4)
 16916:       if (XEiJ.EFA_SEPARATE_AR) {
 16917:         XEiJ.mpuCycleCount += 26;
 16918:         return XEiJ.regRn[12] -= 12;
 16919:       }
 16920:       //fallthrough
 16921:     case 0b100_101:  //-(A5)
 16922:       if (XEiJ.EFA_SEPARATE_AR) {
 16923:         XEiJ.mpuCycleCount += 26;
 16924:         return XEiJ.regRn[13] -= 12;
 16925:       }
 16926:       //fallthrough
 16927:     case 0b100_110:  //-(A6)
 16928:       if (XEiJ.EFA_SEPARATE_AR) {
 16929:         XEiJ.mpuCycleCount += 26;
 16930:         return XEiJ.regRn[14] -= 12;
 16931:       }
 16932:       //fallthrough
 16933:     case 0b100_111:  //-(A7)
 16934:       if (XEiJ.EFA_SEPARATE_AR) {
 16935:         XEiJ.mpuCycleCount += 26;
 16936:         return XEiJ.regRn[15] -= 12;
 16937:       } else {
 16938:         XEiJ.mpuCycleCount += 26;
 16939:         return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12;
 16940:       }
 16941:     case 0b101_000:  //(d16,A0)
 16942:     case 0b101_001:  //(d16,A1)
 16943:     case 0b101_010:  //(d16,A2)
 16944:     case 0b101_011:  //(d16,A3)
 16945:     case 0b101_100:  //(d16,A4)
 16946:     case 0b101_101:  //(d16,A5)
 16947:     case 0b101_110:  //(d16,A6)
 16948:     case 0b101_111:  //(d16,A7)
 16949:       XEiJ.mpuCycleCount += 28;
 16950:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16951:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16952:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 16953:       } else {
 16954:         t = XEiJ.regPC;
 16955:         XEiJ.regPC = t + 2;
 16956:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 16957:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16958:       }
 16959:     case 0b110_000:  //(d8,A0,Rn.wl)
 16960:     case 0b110_001:  //(d8,A1,Rn.wl)
 16961:     case 0b110_010:  //(d8,A2,Rn.wl)
 16962:     case 0b110_011:  //(d8,A3,Rn.wl)
 16963:     case 0b110_100:  //(d8,A4,Rn.wl)
 16964:     case 0b110_101:  //(d8,A5,Rn.wl)
 16965:     case 0b110_110:  //(d8,A6,Rn.wl)
 16966:     case 0b110_111:  //(d8,A7,Rn.wl)
 16967:       XEiJ.mpuCycleCount += 30;
 16968:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 16969:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 16970:       } else {
 16971:         w = XEiJ.regPC;
 16972:         XEiJ.regPC = w + 2;
 16973:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 16974:       }
 16975:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 16976:               + (byte) w  //バイトディスプレースメント
 16977:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16978:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 16979:     case 0b111_000:  //(xxx).W
 16980:       XEiJ.mpuCycleCount += 28;
 16981:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 16982:     case 0b111_001:  //(xxx).L
 16983:       XEiJ.mpuCycleCount += 32;
 16984:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 16985:     case 0b111_010:  //(d16,PC)
 16986:       XEiJ.mpuCycleCount += 28;
 16987:       t = XEiJ.regPC;
 16988:       XEiJ.regPC = t + 2;
 16989:       return (t  //ベースレジスタ
 16990:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 16991:     case 0b111_011:  //(d8,PC,Rn.wl)
 16992:       XEiJ.mpuCycleCount += 30;
 16993:       t = XEiJ.regPC;
 16994:       XEiJ.regPC = t + 2;
 16995:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 16996:       return (t  //ベースレジスタ
 16997:               + (byte) w  //バイトディスプレースメント
 16998:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 16999:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17000:     case 0b111_100:  //#<data>
 17001:       XEiJ.mpuCycleCount += 24;
 17002:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17003:         return (XEiJ.regPC += 12) - 12;
 17004:       } else {
 17005:         t = XEiJ.regPC;
 17006:         XEiJ.regPC = t + 12;
 17007:         return t;
 17008:       }
 17009:     }  //switch
 17010:     XEiJ.mpuCycleCount += 34;
 17011:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17012:     throw M68kException.m6eSignal;
 17013:   }  //efaAnyExtd
 17014: 
 17015:   //a = efaMltExtd (ea)  //|  M+-WXZ  |
 17016:   //  メモリ可変モードのエクステンデッドオペランドの実効アドレスを求める
 17017:   //  efaMltQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、
 17018:   //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
 17019:   @SuppressWarnings ("fallthrough") public static int efaMltExtd (int ea) throws M68kException {
 17020:     int t, w;
 17021:     switch (ea) {
 17022:     case 0b010_000:  //(A0)
 17023:       if (XEiJ.EFA_SEPARATE_AR) {
 17024:         XEiJ.mpuCycleCount += 24;
 17025:         return XEiJ.regRn[ 8];
 17026:       }
 17027:       //fallthrough
 17028:     case 0b010_001:  //(A1)
 17029:       if (XEiJ.EFA_SEPARATE_AR) {
 17030:         XEiJ.mpuCycleCount += 24;
 17031:         return XEiJ.regRn[ 9];
 17032:       }
 17033:       //fallthrough
 17034:     case 0b010_010:  //(A2)
 17035:       if (XEiJ.EFA_SEPARATE_AR) {
 17036:         XEiJ.mpuCycleCount += 24;
 17037:         return XEiJ.regRn[10];
 17038:       }
 17039:       //fallthrough
 17040:     case 0b010_011:  //(A3)
 17041:       if (XEiJ.EFA_SEPARATE_AR) {
 17042:         XEiJ.mpuCycleCount += 24;
 17043:         return XEiJ.regRn[11];
 17044:       }
 17045:       //fallthrough
 17046:     case 0b010_100:  //(A4)
 17047:       if (XEiJ.EFA_SEPARATE_AR) {
 17048:         XEiJ.mpuCycleCount += 24;
 17049:         return XEiJ.regRn[12];
 17050:       }
 17051:       //fallthrough
 17052:     case 0b010_101:  //(A5)
 17053:       if (XEiJ.EFA_SEPARATE_AR) {
 17054:         XEiJ.mpuCycleCount += 24;
 17055:         return XEiJ.regRn[13];
 17056:       }
 17057:       //fallthrough
 17058:     case 0b010_110:  //(A6)
 17059:       if (XEiJ.EFA_SEPARATE_AR) {
 17060:         XEiJ.mpuCycleCount += 24;
 17061:         return XEiJ.regRn[14];
 17062:       }
 17063:       //fallthrough
 17064:     case 0b010_111:  //(A7)
 17065:       if (XEiJ.EFA_SEPARATE_AR) {
 17066:         XEiJ.mpuCycleCount += 24;
 17067:         return XEiJ.regRn[15];
 17068:       } else {
 17069:         XEiJ.mpuCycleCount += 24;
 17070:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 17071:       }
 17072:     case 0b011_000:  //(A0)+
 17073:       if (XEiJ.EFA_SEPARATE_AR) {
 17074:         XEiJ.mpuCycleCount += 24;
 17075:         return (XEiJ.regRn[ 8] += 12) - 12;
 17076:       }
 17077:       //fallthrough
 17078:     case 0b011_001:  //(A1)+
 17079:       if (XEiJ.EFA_SEPARATE_AR) {
 17080:         XEiJ.mpuCycleCount += 24;
 17081:         return (XEiJ.regRn[ 9] += 12) - 12;
 17082:       }
 17083:       //fallthrough
 17084:     case 0b011_010:  //(A2)+
 17085:       if (XEiJ.EFA_SEPARATE_AR) {
 17086:         XEiJ.mpuCycleCount += 24;
 17087:         return (XEiJ.regRn[10] += 12) - 12;
 17088:       }
 17089:       //fallthrough
 17090:     case 0b011_011:  //(A3)+
 17091:       if (XEiJ.EFA_SEPARATE_AR) {
 17092:         XEiJ.mpuCycleCount += 24;
 17093:         return (XEiJ.regRn[11] += 12) - 12;
 17094:       }
 17095:       //fallthrough
 17096:     case 0b011_100:  //(A4)+
 17097:       if (XEiJ.EFA_SEPARATE_AR) {
 17098:         XEiJ.mpuCycleCount += 24;
 17099:         return (XEiJ.regRn[12] += 12) - 12;
 17100:       }
 17101:       //fallthrough
 17102:     case 0b011_101:  //(A5)+
 17103:       if (XEiJ.EFA_SEPARATE_AR) {
 17104:         XEiJ.mpuCycleCount += 24;
 17105:         return (XEiJ.regRn[13] += 12) - 12;
 17106:       }
 17107:       //fallthrough
 17108:     case 0b011_110:  //(A6)+
 17109:       if (XEiJ.EFA_SEPARATE_AR) {
 17110:         XEiJ.mpuCycleCount += 24;
 17111:         return (XEiJ.regRn[14] += 12) - 12;
 17112:       }
 17113:       //fallthrough
 17114:     case 0b011_111:  //(A7)+
 17115:       if (XEiJ.EFA_SEPARATE_AR) {
 17116:         XEiJ.mpuCycleCount += 24;
 17117:         return (XEiJ.regRn[15] += 12) - 12;
 17118:       } else {
 17119:         XEiJ.mpuCycleCount += 24;
 17120:         return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12;
 17121:       }
 17122:     case 0b100_000:  //-(A0)
 17123:     case 0b100_001:  //-(A1)
 17124:     case 0b100_010:  //-(A2)
 17125:     case 0b100_011:  //-(A3)
 17126:     case 0b100_100:  //-(A4)
 17127:     case 0b100_101:  //-(A5)
 17128:     case 0b100_110:  //-(A6)
 17129:     case 0b100_111:  //-(A7)
 17130:       XEiJ.mpuCycleCount += 26;
 17131:       return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12;
 17132:     case 0b101_000:  //(d16,A0)
 17133:     case 0b101_001:  //(d16,A1)
 17134:     case 0b101_010:  //(d16,A2)
 17135:     case 0b101_011:  //(d16,A3)
 17136:     case 0b101_100:  //(d16,A4)
 17137:     case 0b101_101:  //(d16,A5)
 17138:     case 0b101_110:  //(d16,A6)
 17139:     case 0b101_111:  //(d16,A7)
 17140:       XEiJ.mpuCycleCount += 28;
 17141:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17142:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17143:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 17144:       } else {
 17145:         t = XEiJ.regPC;
 17146:         XEiJ.regPC = t + 2;
 17147:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17148:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17149:       }
 17150:     case 0b110_000:  //(d8,A0,Rn.wl)
 17151:     case 0b110_001:  //(d8,A1,Rn.wl)
 17152:     case 0b110_010:  //(d8,A2,Rn.wl)
 17153:     case 0b110_011:  //(d8,A3,Rn.wl)
 17154:     case 0b110_100:  //(d8,A4,Rn.wl)
 17155:     case 0b110_101:  //(d8,A5,Rn.wl)
 17156:     case 0b110_110:  //(d8,A6,Rn.wl)
 17157:     case 0b110_111:  //(d8,A7,Rn.wl)
 17158:       XEiJ.mpuCycleCount += 30;
 17159:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17160:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 17161:       } else {
 17162:         w = XEiJ.regPC;
 17163:         XEiJ.regPC = w + 2;
 17164:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 17165:       }
 17166:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 17167:               + (byte) w  //バイトディスプレースメント
 17168:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17169:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17170:     case 0b111_000:  //(xxx).W
 17171:       XEiJ.mpuCycleCount += 28;
 17172:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 17173:     case 0b111_001:  //(xxx).L
 17174:       XEiJ.mpuCycleCount += 32;
 17175:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 17176:     }  //switch
 17177:     XEiJ.mpuCycleCount += 34;
 17178:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17179:     throw M68kException.m6eSignal;
 17180:   }  //efaMltExtd
 17181: 
 17182:   //a = efaLeaPea (ea)  //|  M  WXZP |
 17183:   //  LEA命令とPEA命令のオペランドの実効アドレスを求める
 17184:   //  efaCntWordとの違いはサイクル数のみ
 17185:   //  LEA命令のベースサイクル数4を含んでいるのでLEA命令ではベースサイクル数を加えなくてよい
 17186:   //  PEA命令のベースサイクル数は12-4=8
 17187:   @SuppressWarnings ("fallthrough") public static int efaLeaPea (int ea) throws M68kException {
 17188:     int t, w;
 17189:     switch (ea) {
 17190:     case 0b010_000:  //(A0)
 17191:       if (XEiJ.EFA_SEPARATE_AR) {
 17192:         XEiJ.mpuCycleCount += 4;
 17193:         return XEiJ.regRn[ 8];
 17194:       }
 17195:       //fallthrough
 17196:     case 0b010_001:  //(A1)
 17197:       if (XEiJ.EFA_SEPARATE_AR) {
 17198:         XEiJ.mpuCycleCount += 4;
 17199:         return XEiJ.regRn[ 9];
 17200:       }
 17201:       //fallthrough
 17202:     case 0b010_010:  //(A2)
 17203:       if (XEiJ.EFA_SEPARATE_AR) {
 17204:         XEiJ.mpuCycleCount += 4;
 17205:         return XEiJ.regRn[10];
 17206:       }
 17207:       //fallthrough
 17208:     case 0b010_011:  //(A3)
 17209:       if (XEiJ.EFA_SEPARATE_AR) {
 17210:         XEiJ.mpuCycleCount += 4;
 17211:         return XEiJ.regRn[11];
 17212:       }
 17213:       //fallthrough
 17214:     case 0b010_100:  //(A4)
 17215:       if (XEiJ.EFA_SEPARATE_AR) {
 17216:         XEiJ.mpuCycleCount += 4;
 17217:         return XEiJ.regRn[12];
 17218:       }
 17219:       //fallthrough
 17220:     case 0b010_101:  //(A5)
 17221:       if (XEiJ.EFA_SEPARATE_AR) {
 17222:         XEiJ.mpuCycleCount += 4;
 17223:         return XEiJ.regRn[13];
 17224:       }
 17225:       //fallthrough
 17226:     case 0b010_110:  //(A6)
 17227:       if (XEiJ.EFA_SEPARATE_AR) {
 17228:         XEiJ.mpuCycleCount += 4;
 17229:         return XEiJ.regRn[14];
 17230:       }
 17231:       //fallthrough
 17232:     case 0b010_111:  //(A7)
 17233:       if (XEiJ.EFA_SEPARATE_AR) {
 17234:         XEiJ.mpuCycleCount += 4;
 17235:         return XEiJ.regRn[15];
 17236:       } else {
 17237:         XEiJ.mpuCycleCount += 4;
 17238:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 17239:       }
 17240:     case 0b101_000:  //(d16,A0)
 17241:     case 0b101_001:  //(d16,A1)
 17242:     case 0b101_010:  //(d16,A2)
 17243:     case 0b101_011:  //(d16,A3)
 17244:     case 0b101_100:  //(d16,A4)
 17245:     case 0b101_101:  //(d16,A5)
 17246:     case 0b101_110:  //(d16,A6)
 17247:     case 0b101_111:  //(d16,A7)
 17248:       XEiJ.mpuCycleCount += 8;
 17249:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17250:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17251:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 17252:       } else {
 17253:         t = XEiJ.regPC;
 17254:         XEiJ.regPC = t + 2;
 17255:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17256:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17257:       }
 17258:     case 0b110_000:  //(d8,A0,Rn.wl)
 17259:     case 0b110_001:  //(d8,A1,Rn.wl)
 17260:     case 0b110_010:  //(d8,A2,Rn.wl)
 17261:     case 0b110_011:  //(d8,A3,Rn.wl)
 17262:     case 0b110_100:  //(d8,A4,Rn.wl)
 17263:     case 0b110_101:  //(d8,A5,Rn.wl)
 17264:     case 0b110_110:  //(d8,A6,Rn.wl)
 17265:     case 0b110_111:  //(d8,A7,Rn.wl)
 17266:       XEiJ.mpuCycleCount += 12;
 17267:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17268:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 17269:       } else {
 17270:         w = XEiJ.regPC;
 17271:         XEiJ.regPC = w + 2;
 17272:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 17273:       }
 17274:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 17275:               + (byte) w  //バイトディスプレースメント
 17276:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17277:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17278:     case 0b111_000:  //(xxx).W
 17279:       XEiJ.mpuCycleCount += 8;
 17280:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 17281:     case 0b111_001:  //(xxx).L
 17282:       XEiJ.mpuCycleCount += 12;
 17283:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 17284:     case 0b111_010:  //(d16,PC)
 17285:       XEiJ.mpuCycleCount += 8;
 17286:       t = XEiJ.regPC;
 17287:       XEiJ.regPC = t + 2;
 17288:       return (t  //ベースレジスタ
 17289:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17290:     case 0b111_011:  //(d8,PC,Rn.wl)
 17291:       XEiJ.mpuCycleCount += 12;
 17292:       t = XEiJ.regPC;
 17293:       XEiJ.regPC = t + 2;
 17294:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 17295:       return (t  //ベースレジスタ
 17296:               + (byte) w  //バイトディスプレースメント
 17297:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17298:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17299:     }  //switch
 17300:     XEiJ.mpuCycleCount += 34;
 17301:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17302:     throw M68kException.m6eSignal;
 17303:   }  //efaLeaPea
 17304: 
 17305:   //a = efaJmpJsr (ea)  //|  M  WXZP |
 17306:   //  JMP命令とJSR命令のオペランドの実効アドレスを求める
 17307:   //  efaCntWordとの違いはサイクル数のみ
 17308:   //  JMP命令のベースサイクル数8を含んでいるのでJMP命令ではベースサイクル数を加えなくてよい
 17309:   //  JSR命令のベースサイクル数は16-8=8
 17310:   @SuppressWarnings ("fallthrough") public static int efaJmpJsr (int ea) throws M68kException {
 17311:     int t, w;
 17312:     switch (ea) {
 17313:     case 0b010_000:  //(A0)
 17314:       if (XEiJ.EFA_SEPARATE_AR) {
 17315:         XEiJ.mpuCycleCount += 8;
 17316:         return XEiJ.regRn[ 8];
 17317:       }
 17318:       //fallthrough
 17319:     case 0b010_001:  //(A1)
 17320:       if (XEiJ.EFA_SEPARATE_AR) {
 17321:         XEiJ.mpuCycleCount += 8;
 17322:         return XEiJ.regRn[ 9];
 17323:       }
 17324:       //fallthrough
 17325:     case 0b010_010:  //(A2)
 17326:       if (XEiJ.EFA_SEPARATE_AR) {
 17327:         XEiJ.mpuCycleCount += 8;
 17328:         return XEiJ.regRn[10];
 17329:       }
 17330:       //fallthrough
 17331:     case 0b010_011:  //(A3)
 17332:       if (XEiJ.EFA_SEPARATE_AR) {
 17333:         XEiJ.mpuCycleCount += 8;
 17334:         return XEiJ.regRn[11];
 17335:       }
 17336:       //fallthrough
 17337:     case 0b010_100:  //(A4)
 17338:       if (XEiJ.EFA_SEPARATE_AR) {
 17339:         XEiJ.mpuCycleCount += 8;
 17340:         return XEiJ.regRn[12];
 17341:       }
 17342:       //fallthrough
 17343:     case 0b010_101:  //(A5)
 17344:       if (XEiJ.EFA_SEPARATE_AR) {
 17345:         XEiJ.mpuCycleCount += 8;
 17346:         return XEiJ.regRn[13];
 17347:       }
 17348:       //fallthrough
 17349:     case 0b010_110:  //(A6)
 17350:       if (XEiJ.EFA_SEPARATE_AR) {
 17351:         XEiJ.mpuCycleCount += 8;
 17352:         return XEiJ.regRn[14];
 17353:       }
 17354:       //fallthrough
 17355:     case 0b010_111:  //(A7)
 17356:       if (XEiJ.EFA_SEPARATE_AR) {
 17357:         XEiJ.mpuCycleCount += 8;
 17358:         return XEiJ.regRn[15];
 17359:       } else {
 17360:         XEiJ.mpuCycleCount += 8;
 17361:         return XEiJ.regRn[ea - (0b010_000 - 8)];
 17362:       }
 17363:     case 0b101_000:  //(d16,A0)
 17364:     case 0b101_001:  //(d16,A1)
 17365:     case 0b101_010:  //(d16,A2)
 17366:     case 0b101_011:  //(d16,A3)
 17367:     case 0b101_100:  //(d16,A4)
 17368:     case 0b101_101:  //(d16,A5)
 17369:     case 0b101_110:  //(d16,A6)
 17370:     case 0b101_111:  //(d16,A7)
 17371:       XEiJ.mpuCycleCount += 10;
 17372:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17373:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17374:                 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
 17375:       } else {
 17376:         t = XEiJ.regPC;
 17377:         XEiJ.regPC = t + 2;
 17378:         return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
 17379:                 + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17380:       }
 17381:     case 0b110_000:  //(d8,A0,Rn.wl)
 17382:     case 0b110_001:  //(d8,A1,Rn.wl)
 17383:     case 0b110_010:  //(d8,A2,Rn.wl)
 17384:     case 0b110_011:  //(d8,A3,Rn.wl)
 17385:     case 0b110_100:  //(d8,A4,Rn.wl)
 17386:     case 0b110_101:  //(d8,A5,Rn.wl)
 17387:     case 0b110_110:  //(d8,A6,Rn.wl)
 17388:     case 0b110_111:  //(d8,A7,Rn.wl)
 17389:       XEiJ.mpuCycleCount += 14;
 17390:       if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
 17391:         w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
 17392:       } else {
 17393:         w = XEiJ.regPC;
 17394:         XEiJ.regPC = w + 2;
 17395:         w = XEiJ.busRwze (w);  //pcwz。拡張ワード
 17396:       }
 17397:       return (XEiJ.regRn[ea - (0b110_000 - 8)]  //ベースレジスタ
 17398:               + (byte) w  //バイトディスプレースメント
 17399:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17400:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17401:     case 0b111_000:  //(xxx).W
 17402:       XEiJ.mpuCycleCount += 10;
 17403:       return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
 17404:     case 0b111_001:  //(xxx).L
 17405:       XEiJ.mpuCycleCount += 12;
 17406:       return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
 17407:     case 0b111_010:  //(d16,PC)
 17408:       XEiJ.mpuCycleCount += 10;
 17409:       t = XEiJ.regPC;
 17410:       XEiJ.regPC = t + 2;
 17411:       return (t  //ベースレジスタ
 17412:               + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
 17413:     case 0b111_011:  //(d8,PC,Rn.wl)
 17414:       XEiJ.mpuCycleCount += 14;
 17415:       t = XEiJ.regPC;
 17416:       XEiJ.regPC = t + 2;
 17417:       w = XEiJ.busRwze (t);  //pcwz。拡張ワード
 17418:       return (t  //ベースレジスタ
 17419:               + (byte) w  //バイトディスプレースメント
 17420:               + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
 17421:                  XEiJ.regRn[w >> 12]));  //ロングインデックス
 17422:     }  //switch
 17423:     XEiJ.mpuCycleCount += 34;
 17424:     M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
 17425:     throw M68kException.m6eSignal;
 17426:   }  //efaJmpJsr
 17427: 
 17428: 
 17429: 
 17430: }  //class MC68010
 17431: 
 17432: 
 17433: