1: //======================================================================================== 2: // MC68000.java 3: // en:MC68000 core 4: // ja:MC68000コア 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 MC68000 { 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: //MOVE.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr 398: case 0b0001_000_000: 399: case 0b0001_001_000: 400: case 0b0001_010_000: 401: case 0b0001_011_000: 402: case 0b0001_100_000: 403: case 0b0001_101_000: 404: case 0b0001_110_000: 405: case 0b0001_111_000: 406: irpMoveToDRByte (); 407: break irpSwitch; 408: 409: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 410: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 411: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 412: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 413: //MOVE.B <ea>,(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr 414: case 0b0001_000_010: 415: case 0b0001_001_010: 416: case 0b0001_010_010: 417: case 0b0001_011_010: 418: case 0b0001_100_010: 419: case 0b0001_101_010: 420: case 0b0001_110_010: 421: case 0b0001_111_010: 422: irpMoveToMMByte (); 423: break irpSwitch; 424: 425: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 426: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 427: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 428: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 429: //MOVE.B <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr 430: case 0b0001_000_011: 431: case 0b0001_001_011: 432: case 0b0001_010_011: 433: case 0b0001_011_011: 434: case 0b0001_100_011: 435: case 0b0001_101_011: 436: case 0b0001_110_011: 437: case 0b0001_111_011: 438: irpMoveToMPByte (); 439: break irpSwitch; 440: 441: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 442: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 443: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 444: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 445: //MOVE.B <ea>,-(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr 446: case 0b0001_000_100: 447: case 0b0001_001_100: 448: case 0b0001_010_100: 449: case 0b0001_011_100: 450: case 0b0001_100_100: 451: case 0b0001_101_100: 452: case 0b0001_110_100: 453: case 0b0001_111_100: 454: irpMoveToMNByte (); 455: break irpSwitch; 456: 457: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 458: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 459: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 460: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 461: //MOVE.B <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr 462: case 0b0001_000_101: 463: case 0b0001_001_101: 464: case 0b0001_010_101: 465: case 0b0001_011_101: 466: case 0b0001_100_101: 467: case 0b0001_101_101: 468: case 0b0001_110_101: 469: case 0b0001_111_101: 470: irpMoveToMWByte (); 471: break irpSwitch; 472: 473: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 474: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 475: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 476: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 477: //MOVE.B <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr 478: case 0b0001_000_110: 479: case 0b0001_001_110: 480: case 0b0001_010_110: 481: case 0b0001_011_110: 482: case 0b0001_100_110: 483: case 0b0001_101_110: 484: case 0b0001_110_110: 485: case 0b0001_111_110: 486: irpMoveToMXByte (); 487: break irpSwitch; 488: 489: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 490: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 491: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 492: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 493: //MOVE.B <ea>,(xxx).W |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr 494: case 0b0001_000_111: 495: irpMoveToZWByte (); 496: break irpSwitch; 497: 498: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 499: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 500: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 501: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 502: //MOVE.B <ea>,(xxx).L |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr 503: case 0b0001_001_111: 504: irpMoveToZLByte (); 505: break irpSwitch; 506: 507: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 508: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 509: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 510: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 511: //MOVE.L <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr 512: case 0b0010_000_000: 513: case 0b0010_001_000: 514: case 0b0010_010_000: 515: case 0b0010_011_000: 516: case 0b0010_100_000: 517: case 0b0010_101_000: 518: case 0b0010_110_000: 519: case 0b0010_111_000: 520: irpMoveToDRLong (); 521: break irpSwitch; 522: 523: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 524: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 525: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 526: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 527: //MOVEA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr 528: //MOVE.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq] 529: case 0b0010_000_001: 530: case 0b0010_001_001: 531: case 0b0010_010_001: 532: case 0b0010_011_001: 533: case 0b0010_100_001: 534: case 0b0010_101_001: 535: case 0b0010_110_001: 536: case 0b0010_111_001: 537: irpMoveaLong (); 538: break irpSwitch; 539: 540: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 541: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 542: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 543: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 544: //MOVE.L <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr 545: case 0b0010_000_010: 546: case 0b0010_001_010: 547: case 0b0010_010_010: 548: case 0b0010_011_010: 549: case 0b0010_100_010: 550: case 0b0010_101_010: 551: case 0b0010_110_010: 552: case 0b0010_111_010: 553: irpMoveToMMLong (); 554: break irpSwitch; 555: 556: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 557: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 558: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 559: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 560: //MOVE.L <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr 561: case 0b0010_000_011: 562: case 0b0010_001_011: 563: case 0b0010_010_011: 564: case 0b0010_011_011: 565: case 0b0010_100_011: 566: case 0b0010_101_011: 567: case 0b0010_110_011: 568: case 0b0010_111_011: 569: irpMoveToMPLong (); 570: break irpSwitch; 571: 572: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 573: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 574: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 575: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 576: //MOVE.L <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr 577: case 0b0010_000_100: 578: case 0b0010_001_100: 579: case 0b0010_010_100: 580: case 0b0010_011_100: 581: case 0b0010_100_100: 582: case 0b0010_101_100: 583: case 0b0010_110_100: 584: case 0b0010_111_100: 585: irpMoveToMNLong (); 586: break irpSwitch; 587: 588: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 589: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 590: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 591: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 592: //MOVE.L <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr 593: case 0b0010_000_101: 594: case 0b0010_001_101: 595: case 0b0010_010_101: 596: case 0b0010_011_101: 597: case 0b0010_100_101: 598: case 0b0010_101_101: 599: case 0b0010_110_101: 600: case 0b0010_111_101: 601: irpMoveToMWLong (); 602: break irpSwitch; 603: 604: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 605: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 606: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 607: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 608: //MOVE.L <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr 609: case 0b0010_000_110: 610: case 0b0010_001_110: 611: case 0b0010_010_110: 612: case 0b0010_011_110: 613: case 0b0010_100_110: 614: case 0b0010_101_110: 615: case 0b0010_110_110: 616: case 0b0010_111_110: 617: irpMoveToMXLong (); 618: break irpSwitch; 619: 620: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 621: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 622: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 623: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 624: //MOVE.L <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr 625: case 0b0010_000_111: 626: irpMoveToZWLong (); 627: break irpSwitch; 628: 629: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 630: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 631: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 632: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 633: //MOVE.L <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr 634: case 0b0010_001_111: 635: irpMoveToZLLong (); 636: break irpSwitch; 637: 638: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 639: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 640: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 641: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 642: //MOVE.W <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr 643: case 0b0011_000_000: 644: case 0b0011_001_000: 645: case 0b0011_010_000: 646: case 0b0011_011_000: 647: case 0b0011_100_000: 648: case 0b0011_101_000: 649: case 0b0011_110_000: 650: case 0b0011_111_000: 651: irpMoveToDRWord (); 652: break irpSwitch; 653: 654: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 655: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 656: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 657: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 658: //MOVEA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr 659: //MOVE.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq] 660: case 0b0011_000_001: 661: case 0b0011_001_001: 662: case 0b0011_010_001: 663: case 0b0011_011_001: 664: case 0b0011_100_001: 665: case 0b0011_101_001: 666: case 0b0011_110_001: 667: case 0b0011_111_001: 668: irpMoveaWord (); 669: break irpSwitch; 670: 671: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 672: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 673: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 674: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 675: //MOVE.W <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr 676: case 0b0011_000_010: 677: case 0b0011_001_010: 678: case 0b0011_010_010: 679: case 0b0011_011_010: 680: case 0b0011_100_010: 681: case 0b0011_101_010: 682: case 0b0011_110_010: 683: case 0b0011_111_010: 684: irpMoveToMMWord (); 685: break irpSwitch; 686: 687: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 688: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 689: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 690: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 691: //MOVE.W <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr 692: case 0b0011_000_011: 693: case 0b0011_001_011: 694: case 0b0011_010_011: 695: case 0b0011_011_011: 696: case 0b0011_100_011: 697: case 0b0011_101_011: 698: case 0b0011_110_011: 699: case 0b0011_111_011: 700: irpMoveToMPWord (); 701: break irpSwitch; 702: 703: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 704: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 705: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 706: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 707: //MOVE.W <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr 708: case 0b0011_000_100: 709: case 0b0011_001_100: 710: case 0b0011_010_100: 711: case 0b0011_011_100: 712: case 0b0011_100_100: 713: case 0b0011_101_100: 714: case 0b0011_110_100: 715: case 0b0011_111_100: 716: irpMoveToMNWord (); 717: break irpSwitch; 718: 719: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 720: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 721: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 722: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 723: //MOVE.W <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr 724: case 0b0011_000_101: 725: case 0b0011_001_101: 726: case 0b0011_010_101: 727: case 0b0011_011_101: 728: case 0b0011_100_101: 729: case 0b0011_101_101: 730: case 0b0011_110_101: 731: case 0b0011_111_101: 732: irpMoveToMWWord (); 733: break irpSwitch; 734: 735: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 736: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 737: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 738: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 739: //MOVE.W <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr 740: case 0b0011_000_110: 741: case 0b0011_001_110: 742: case 0b0011_010_110: 743: case 0b0011_011_110: 744: case 0b0011_100_110: 745: case 0b0011_101_110: 746: case 0b0011_110_110: 747: case 0b0011_111_110: 748: irpMoveToMXWord (); 749: break irpSwitch; 750: 751: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 752: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 753: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 754: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 755: //MOVE.W <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr 756: case 0b0011_000_111: 757: irpMoveToZWWord (); 758: break irpSwitch; 759: 760: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 761: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 762: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 763: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 764: //MOVE.W <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr 765: case 0b0011_001_111: 766: irpMoveToZLWord (); 767: break irpSwitch; 768: 769: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 770: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 771: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 772: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 773: //NEGX.B <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_000_mmm_rrr 774: case 0b0100_000_000: 775: irpNegxByte (); 776: break irpSwitch; 777: 778: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 779: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 780: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 781: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 782: //NEGX.W <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_001_mmm_rrr 783: case 0b0100_000_001: 784: irpNegxWord (); 785: break irpSwitch; 786: 787: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 788: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 789: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 790: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 791: //NEGX.L <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_010_mmm_rrr 792: case 0b0100_000_010: 793: irpNegxLong (); 794: break irpSwitch; 795: 796: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 797: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 798: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 799: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 800: //MOVE.W SR,<ea> |-|0-----|-|*****|-----|D M+-WXZ |0100_000_011_mmm_rrr (68000 and 68008 read before move) 801: case 0b0100_000_011: 802: irpMoveFromSR (); 803: break irpSwitch; 804: 805: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 806: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 807: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 808: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 809: //CHK.W <ea>,Dq |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr 810: case 0b0100_000_110: 811: case 0b0100_001_110: 812: case 0b0100_010_110: 813: case 0b0100_011_110: 814: case 0b0100_100_110: 815: case 0b0100_101_110: 816: case 0b0100_110_110: 817: case 0b0100_111_110: 818: irpChkWord (); 819: break irpSwitch; 820: 821: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 822: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 823: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 824: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 825: //LEA.L <ea>,Aq |-|012346|-|-----|-----| M WXZP |0100_qqq_111_mmm_rrr 826: case 0b0100_000_111: 827: case 0b0100_001_111: 828: case 0b0100_010_111: 829: case 0b0100_011_111: 830: case 0b0100_100_111: 831: case 0b0100_101_111: 832: case 0b0100_110_111: 833: case 0b0100_111_111: 834: irpLea (); 835: break irpSwitch; 836: 837: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 838: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 839: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 840: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 841: //CLR.B <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_000_mmm_rrr (68000 and 68008 read before clear) 842: case 0b0100_001_000: 843: irpClrByte (); 844: break irpSwitch; 845: 846: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 847: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 848: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 849: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 850: //CLR.W <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_001_mmm_rrr (68000 and 68008 read before clear) 851: case 0b0100_001_001: 852: irpClrWord (); 853: break irpSwitch; 854: 855: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 856: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 857: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 858: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 859: //CLR.L <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_010_mmm_rrr (68000 and 68008 read before clear) 860: case 0b0100_001_010: 861: irpClrLong (); 862: break irpSwitch; 863: 864: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 865: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 866: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 867: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 868: //NEG.B <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_000_mmm_rrr 869: case 0b0100_010_000: 870: irpNegByte (); 871: break irpSwitch; 872: 873: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 874: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 875: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 876: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 877: //NEG.W <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_001_mmm_rrr 878: case 0b0100_010_001: 879: irpNegWord (); 880: break irpSwitch; 881: 882: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 883: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 884: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 885: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 886: //NEG.L <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_010_mmm_rrr 887: case 0b0100_010_010: 888: irpNegLong (); 889: break irpSwitch; 890: 891: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 892: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 893: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 894: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 895: //MOVE.W <ea>,CCR |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr 896: case 0b0100_010_011: 897: irpMoveToCCR (); 898: break irpSwitch; 899: 900: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 901: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 902: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 903: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 904: //NOT.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_000_mmm_rrr 905: case 0b0100_011_000: 906: irpNotByte (); 907: break irpSwitch; 908: 909: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 910: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 911: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 912: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 913: //NOT.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_001_mmm_rrr 914: case 0b0100_011_001: 915: irpNotWord (); 916: break irpSwitch; 917: 918: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 919: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 920: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 921: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 922: //NOT.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_010_mmm_rrr 923: case 0b0100_011_010: 924: irpNotLong (); 925: break irpSwitch; 926: 927: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 928: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 929: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 930: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 931: //MOVE.W <ea>,SR |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr 932: case 0b0100_011_011: 933: irpMoveToSR (); 934: break irpSwitch; 935: 936: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 937: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 938: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 939: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 940: //NBCD.B <ea> |-|012346|-|UUUUU|*U*U*|D M+-WXZ |0100_100_000_mmm_rrr 941: case 0b0100_100_000: 942: irpNbcd (); 943: break irpSwitch; 944: 945: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 946: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 947: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 948: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 949: //SWAP.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_001_000_rrr 950: //PEA.L <ea> |-|012346|-|-----|-----| M WXZP |0100_100_001_mmm_rrr 951: case 0b0100_100_001: 952: irpPea (); 953: break irpSwitch; 954: 955: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 956: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 957: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 958: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 959: //EXT.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_010_000_rrr 960: //MOVEM.W <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_010_mmm_rrr-llllllllllllllll 961: case 0b0100_100_010: 962: irpMovemToMemWord (); 963: break irpSwitch; 964: 965: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 966: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 967: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 968: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 969: //EXT.L Dr |-|012346|-|-UUUU|-**00|D |0100_100_011_000_rrr 970: //MOVEM.L <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_011_mmm_rrr-llllllllllllllll 971: case 0b0100_100_011: 972: irpMovemToMemLong (); 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: //TST.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_000_mmm_rrr 980: case 0b0100_101_000: 981: irpTstByte (); 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: //TST.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_001_mmm_rrr 989: case 0b0100_101_001: 990: irpTstWord (); 991: break irpSwitch; 992: 993: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 994: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 995: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 996: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 997: //TST.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_010_mmm_rrr 998: case 0b0100_101_010: 999: irpTstLong (); 1000: break irpSwitch; 1001: 1002: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1003: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1004: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1005: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1006: //TAS.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_011_mmm_rrr 1007: //ILLEGAL |-|012346|-|-----|-----| |0100_101_011_111_100 1008: case 0b0100_101_011: 1009: irpTas (); 1010: break irpSwitch; 1011: 1012: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1013: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1014: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1015: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1016: //SATS.L Dr |-|------|-|-UUUU|-**00|D |0100_110_010_000_rrr (ISA_B) 1017: //MOVEM.W <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll 1018: case 0b0100_110_010: 1019: irpMovemToRegWord (); 1020: break irpSwitch; 1021: 1022: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1023: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1024: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1025: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1026: //MOVEM.L <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll 1027: case 0b0100_110_011: 1028: irpMovemToRegLong (); 1029: break irpSwitch; 1030: 1031: case 0b0100_111_001: 1032: switch (XEiJ.regOC & 0b111_111) { 1033: 1034: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1035: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1036: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1037: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1038: //TRAP #<vector> |-|012346|-|-----|-----| |0100_111_001_00v_vvv 1039: case 0b000_000: 1040: case 0b000_001: 1041: case 0b000_010: 1042: case 0b000_011: 1043: case 0b000_100: 1044: case 0b000_101: 1045: case 0b000_110: 1046: case 0b000_111: 1047: case 0b001_000: 1048: case 0b001_001: 1049: case 0b001_010: 1050: case 0b001_011: 1051: case 0b001_100: 1052: case 0b001_101: 1053: case 0b001_110: 1054: irpTrap (); 1055: break irpSwitch; 1056: case 0b001_111: 1057: irpTrap15 (); 1058: break irpSwitch; 1059: 1060: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1061: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1062: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1063: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1064: //LINK.W Ar,#<data> |-|012346|-|-----|-----| |0100_111_001_010_rrr-{data} 1065: case 0b010_000: 1066: case 0b010_001: 1067: case 0b010_010: 1068: case 0b010_011: 1069: case 0b010_100: 1070: case 0b010_101: 1071: case 0b010_110: 1072: case 0b010_111: 1073: irpLinkWord (); 1074: break irpSwitch; 1075: 1076: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1077: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1078: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1079: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1080: //UNLK Ar |-|012346|-|-----|-----| |0100_111_001_011_rrr 1081: case 0b011_000: 1082: case 0b011_001: 1083: case 0b011_010: 1084: case 0b011_011: 1085: case 0b011_100: 1086: case 0b011_101: 1087: case 0b011_110: 1088: case 0b011_111: 1089: irpUnlk (); 1090: break irpSwitch; 1091: 1092: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1093: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1094: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1095: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1096: //MOVE.L Ar,USP |-|012346|P|-----|-----| |0100_111_001_100_rrr 1097: case 0b100_000: 1098: case 0b100_001: 1099: case 0b100_010: 1100: case 0b100_011: 1101: case 0b100_100: 1102: case 0b100_101: 1103: case 0b100_110: 1104: case 0b100_111: 1105: irpMoveToUsp (); 1106: break irpSwitch; 1107: 1108: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1109: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1110: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1111: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1112: //MOVE.L USP,Ar |-|012346|P|-----|-----| |0100_111_001_101_rrr 1113: case 0b101_000: 1114: case 0b101_001: 1115: case 0b101_010: 1116: case 0b101_011: 1117: case 0b101_100: 1118: case 0b101_101: 1119: case 0b101_110: 1120: case 0b101_111: 1121: irpMoveFromUsp (); 1122: break irpSwitch; 1123: 1124: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1125: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1126: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1127: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1128: //RESET |-|012346|P|-----|-----| |0100_111_001_110_000 1129: case 0b110_000: 1130: irpReset (); 1131: break irpSwitch; 1132: 1133: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1134: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1135: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1136: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1137: //NOP |-|012346|-|-----|-----| |0100_111_001_110_001 1138: case 0b110_001: 1139: irpNop (); 1140: break irpSwitch; 1141: 1142: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1143: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1144: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1145: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1146: //STOP #<data> |-|012346|P|UUUUU|*****| |0100_111_001_110_010-{data} 1147: case 0b110_010: 1148: irpStop (); 1149: break irpSwitch; 1150: 1151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1152: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1153: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1154: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1155: //RTE |-|012346|P|UUUUU|*****| |0100_111_001_110_011 1156: case 0b110_011: 1157: irpRte (); 1158: break irpSwitch; 1159: 1160: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1161: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1162: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1163: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1164: //RTS |-|012346|-|-----|-----| |0100_111_001_110_101 1165: case 0b110_101: 1166: irpRts (); 1167: break irpSwitch; 1168: 1169: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1170: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1171: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1172: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1173: //TRAPV |-|012346|-|---*-|-----| |0100_111_001_110_110 1174: case 0b110_110: 1175: irpTrapv (); 1176: break irpSwitch; 1177: 1178: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1179: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1180: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1181: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1182: //RTR |-|012346|-|UUUUU|*****| |0100_111_001_110_111 1183: case 0b110_111: 1184: irpRtr (); 1185: break irpSwitch; 1186: 1187: default: 1188: irpIllegal (); 1189: 1190: } //switch XEiJ.regOC & 0b111_111 1191: break irpSwitch; 1192: 1193: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1194: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1195: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1196: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1197: //JSR <ea> |-|012346|-|-----|-----| M WXZP |0100_111_010_mmm_rrr 1198: //JBSR.L <label> |A|012346|-|-----|-----| |0100_111_010_111_001-{address} [JSR <label>] 1199: case 0b0100_111_010: 1200: irpJsr (); 1201: break irpSwitch; 1202: 1203: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1204: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1205: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1206: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1207: //JMP <ea> |-|012346|-|-----|-----| M WXZP |0100_111_011_mmm_rrr 1208: //JBRA.L <label> |A|012346|-|-----|-----| |0100_111_011_111_001-{address} [JMP <label>] 1209: case 0b0100_111_011: 1210: irpJmp (); 1211: break irpSwitch; 1212: 1213: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1214: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1215: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1216: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1217: //ADDQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_000_mmm_rrr 1218: //INC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>] 1219: case 0b0101_000_000: 1220: case 0b0101_001_000: 1221: case 0b0101_010_000: 1222: case 0b0101_011_000: 1223: case 0b0101_100_000: 1224: case 0b0101_101_000: 1225: case 0b0101_110_000: 1226: case 0b0101_111_000: 1227: irpAddqByte (); 1228: break irpSwitch; 1229: 1230: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1231: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1232: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1233: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1234: //ADDQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_001_mmm_rrr 1235: //ADDQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_001_001_rrr 1236: //INC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>] 1237: //INC.W Ar |A|012346|-|-----|-----| A |0101_001_001_001_rrr [ADDQ.W #1,Ar] 1238: case 0b0101_000_001: 1239: case 0b0101_001_001: 1240: case 0b0101_010_001: 1241: case 0b0101_011_001: 1242: case 0b0101_100_001: 1243: case 0b0101_101_001: 1244: case 0b0101_110_001: 1245: case 0b0101_111_001: 1246: irpAddqWord (); 1247: break irpSwitch; 1248: 1249: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1250: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1251: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1252: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1253: //ADDQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_010_mmm_rrr 1254: //ADDQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_010_001_rrr 1255: //INC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>] 1256: //INC.L Ar |A|012346|-|-----|-----| A |0101_001_010_001_rrr [ADDQ.L #1,Ar] 1257: case 0b0101_000_010: 1258: case 0b0101_001_010: 1259: case 0b0101_010_010: 1260: case 0b0101_011_010: 1261: case 0b0101_100_010: 1262: case 0b0101_101_010: 1263: case 0b0101_110_010: 1264: case 0b0101_111_010: 1265: irpAddqLong (); 1266: break irpSwitch; 1267: 1268: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1269: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1270: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1271: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1272: //ST.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr 1273: //SNF.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr [ST.B <ea>] 1274: //DBT.W Dr,<label> |-|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} 1275: //DBNF.W Dr,<label> |A|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} [DBT.W Dr,<label>] 1276: case 0b0101_000_011: 1277: irpSt (); 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: //SUBQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_100_mmm_rrr 1285: //DEC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>] 1286: case 0b0101_000_100: 1287: case 0b0101_001_100: 1288: case 0b0101_010_100: 1289: case 0b0101_011_100: 1290: case 0b0101_100_100: 1291: case 0b0101_101_100: 1292: case 0b0101_110_100: 1293: case 0b0101_111_100: 1294: irpSubqByte (); 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: //SUBQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_101_mmm_rrr 1302: //SUBQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_101_001_rrr 1303: //DEC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>] 1304: //DEC.W Ar |A|012346|-|-----|-----| A |0101_001_101_001_rrr [SUBQ.W #1,Ar] 1305: case 0b0101_000_101: 1306: case 0b0101_001_101: 1307: case 0b0101_010_101: 1308: case 0b0101_011_101: 1309: case 0b0101_100_101: 1310: case 0b0101_101_101: 1311: case 0b0101_110_101: 1312: case 0b0101_111_101: 1313: irpSubqWord (); 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: //SUBQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_110_mmm_rrr 1321: //SUBQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_110_001_rrr 1322: //DEC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>] 1323: //DEC.L Ar |A|012346|-|-----|-----| A |0101_001_110_001_rrr [SUBQ.L #1,Ar] 1324: case 0b0101_000_110: 1325: case 0b0101_001_110: 1326: case 0b0101_010_110: 1327: case 0b0101_011_110: 1328: case 0b0101_100_110: 1329: case 0b0101_101_110: 1330: case 0b0101_110_110: 1331: case 0b0101_111_110: 1332: irpSubqLong (); 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: //SF.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr 1340: //SNT.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr [SF.B <ea>] 1341: //DBF.W Dr,<label> |-|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} 1342: //DBNT.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 1343: //DBRA.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 1344: case 0b0101_000_111: 1345: irpSf (); 1346: break irpSwitch; 1347: 1348: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1349: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1350: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1351: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1352: //SHI.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr 1353: //SNLS.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr [SHI.B <ea>] 1354: //DBHI.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} 1355: //DBNLS.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} [DBHI.W Dr,<label>] 1356: case 0b0101_001_011: 1357: irpShi (); 1358: break irpSwitch; 1359: 1360: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1361: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1362: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1363: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1364: //SLS.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr 1365: //SNHI.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr [SLS.B <ea>] 1366: //DBLS.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} 1367: //DBNHI.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} [DBLS.W Dr,<label>] 1368: case 0b0101_001_111: 1369: irpSls (); 1370: break irpSwitch; 1371: 1372: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1373: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1374: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1375: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1376: //SCC.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr 1377: //SHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1378: //SNCS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1379: //SNLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1380: //DBCC.W Dr,<label> |-|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} 1381: //DBHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1382: //DBNCS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1383: //DBNLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1384: case 0b0101_010_011: 1385: irpShs (); 1386: break irpSwitch; 1387: 1388: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1389: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1390: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1391: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1392: //SCS.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr 1393: //SLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1394: //SNCC.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1395: //SNHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1396: //DBCS.W Dr,<label> |-|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} 1397: //DBLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1398: //DBNCC.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1399: //DBNHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1400: case 0b0101_010_111: 1401: irpSlo (); 1402: break irpSwitch; 1403: 1404: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1405: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1406: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1407: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1408: //SNE.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr 1409: //SNEQ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1410: //SNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1411: //SNZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1412: //DBNE.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} 1413: //DBNEQ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1414: //DBNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1415: //DBNZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1416: case 0b0101_011_011: 1417: irpSne (); 1418: break irpSwitch; 1419: 1420: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1421: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1422: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1423: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1424: //SEQ.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr 1425: //SNNE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1426: //SNNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1427: //SZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1428: //DBEQ.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} 1429: //DBNNE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1430: //DBNNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1431: //DBZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1432: case 0b0101_011_111: 1433: irpSeq (); 1434: break irpSwitch; 1435: 1436: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1437: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1438: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1439: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1440: //SVC.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr 1441: //SNVS.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr [SVC.B <ea>] 1442: //DBVC.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} 1443: //DBNVS.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} [DBVC.W Dr,<label>] 1444: case 0b0101_100_011: 1445: irpSvc (); 1446: break irpSwitch; 1447: 1448: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1449: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1450: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1451: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1452: //SVS.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr 1453: //SNVC.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr [SVS.B <ea>] 1454: //DBVS.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} 1455: //DBNVC.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} [DBVS.W Dr,<label>] 1456: case 0b0101_100_111: 1457: irpSvs (); 1458: break irpSwitch; 1459: 1460: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1461: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1462: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1463: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1464: //SPL.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr 1465: //SNMI.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr [SPL.B <ea>] 1466: //DBPL.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} 1467: //DBNMI.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} [DBPL.W Dr,<label>] 1468: case 0b0101_101_011: 1469: irpSpl (); 1470: break irpSwitch; 1471: 1472: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1473: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1474: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1475: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1476: //SMI.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr 1477: //SNPL.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr [SMI.B <ea>] 1478: //DBMI.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} 1479: //DBNPL.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} [DBMI.W Dr,<label>] 1480: case 0b0101_101_111: 1481: irpSmi (); 1482: break irpSwitch; 1483: 1484: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1485: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1486: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1487: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1488: //SGE.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr 1489: //SNLT.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr [SGE.B <ea>] 1490: //DBGE.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} 1491: //DBNLT.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} [DBGE.W Dr,<label>] 1492: case 0b0101_110_011: 1493: irpSge (); 1494: break irpSwitch; 1495: 1496: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1497: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1498: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1500: //SLT.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr 1501: //SNGE.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr [SLT.B <ea>] 1502: //DBLT.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} 1503: //DBNGE.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} [DBLT.W Dr,<label>] 1504: case 0b0101_110_111: 1505: irpSlt (); 1506: break irpSwitch; 1507: 1508: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1509: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1510: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1511: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1512: //SGT.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr 1513: //SNLE.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr [SGT.B <ea>] 1514: //DBGT.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} 1515: //DBNLE.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} [DBGT.W Dr,<label>] 1516: case 0b0101_111_011: 1517: irpSgt (); 1518: break irpSwitch; 1519: 1520: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1521: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1522: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1523: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1524: //SLE.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr 1525: //SNGT.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr [SLE.B <ea>] 1526: //DBLE.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} 1527: //DBNGT.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} [DBLE.W Dr,<label>] 1528: case 0b0101_111_111: 1529: irpSle (); 1530: break irpSwitch; 1531: 1532: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1533: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1534: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1535: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1536: //BRA.W <label> |-|012346|-|-----|-----| |0110_000_000_000_000-{offset} 1537: //JBRA.W <label> |A|012346|-|-----|-----| |0110_000_000_000_000-{offset} [BRA.W <label>] 1538: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) 1539: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) [BRA.S <label>] 1540: case 0b0110_000_000: 1541: irpBrasw (); 1542: break irpSwitch; 1543: 1544: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1545: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1546: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1547: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1548: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_001_sss_sss 1549: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_001_sss_sss [BRA.S <label>] 1550: case 0b0110_000_001: 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: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_010_sss_sss 1556: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_010_sss_sss [BRA.S <label>] 1557: case 0b0110_000_010: 1558: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1559: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1560: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1561: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1562: //BRA.S <label> |-|01----|-|-----|-----| |0110_000_011_sss_sss 1563: //JBRA.S <label> |A|01----|-|-----|-----| |0110_000_011_sss_sss [BRA.S <label>] 1564: case 0b0110_000_011: 1565: irpBras (); 1566: break irpSwitch; 1567: 1568: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1569: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1570: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1571: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1572: //BSR.W <label> |-|012346|-|-----|-----| |0110_000_100_000_000-{offset} 1573: //JBSR.W <label> |A|012346|-|-----|-----| |0110_000_100_000_000-{offset} [BSR.W <label>] 1574: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) 1575: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) [BSR.S <label>] 1576: case 0b0110_000_100: 1577: irpBsrsw (); 1578: break irpSwitch; 1579: 1580: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1581: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1582: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1583: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1584: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_101_sss_sss 1585: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_101_sss_sss [BSR.S <label>] 1586: case 0b0110_000_101: 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: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_110_sss_sss 1592: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_110_sss_sss [BSR.S <label>] 1593: case 0b0110_000_110: 1594: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1595: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1596: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1597: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1598: //BSR.S <label> |-|01----|-|-----|-----| |0110_000_111_sss_sss 1599: //JBSR.S <label> |A|01----|-|-----|-----| |0110_000_111_sss_sss [BSR.S <label>] 1600: case 0b0110_000_111: 1601: irpBsrs (); 1602: break irpSwitch; 1603: 1604: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1605: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1606: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1607: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1608: //BHI.W <label> |-|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} 1609: //BNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1610: //JBHI.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1611: //JBNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1612: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) 1613: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1614: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1615: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1616: //JBLS.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 1617: //JBNHI.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 1618: case 0b0110_001_000: 1619: irpBhisw (); 1620: break irpSwitch; 1621: 1622: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1623: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1624: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1625: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1626: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_001_sss_sss 1627: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1628: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1629: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1630: case 0b0110_001_001: 1631: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1632: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1633: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1635: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_010_sss_sss 1636: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1637: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1638: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1639: case 0b0110_001_010: 1640: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1641: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1642: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1643: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1644: //BHI.S <label> |-|01----|-|--*-*|-----| |0110_001_011_sss_sss 1645: //BNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1646: //JBHI.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1647: //JBNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1648: case 0b0110_001_011: 1649: irpBhis (); 1650: break irpSwitch; 1651: 1652: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1653: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1654: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1655: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1656: //BLS.W <label> |-|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} 1657: //BNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1658: //JBLS.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1659: //JBNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1660: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) 1661: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1662: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1663: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1664: //JBHI.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 1665: //JBNLS.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 1666: case 0b0110_001_100: 1667: irpBlssw (); 1668: break irpSwitch; 1669: 1670: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1671: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1672: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1673: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1674: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_101_sss_sss 1675: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1676: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1677: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1678: case 0b0110_001_101: 1679: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1680: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1681: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1682: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1683: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_110_sss_sss 1684: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1685: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1686: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1687: case 0b0110_001_110: 1688: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1689: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1690: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1691: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1692: //BLS.S <label> |-|01----|-|--*-*|-----| |0110_001_111_sss_sss 1693: //BNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1694: //JBLS.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1695: //JBNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1696: case 0b0110_001_111: 1697: irpBlss (); 1698: break irpSwitch; 1699: 1700: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1701: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1702: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1703: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1704: //BCC.W <label> |-|012346|-|----*|-----| |0110_010_000_000_000-{offset} 1705: //BHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1706: //BNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1707: //BNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1708: //JBCC.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1709: //JBHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1710: //JBNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1711: //JBNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1712: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) 1713: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1714: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1715: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1716: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1717: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1718: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1719: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1720: //JBCS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1721: //JBLO.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1722: //JBNCC.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1723: //JBNHS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1724: case 0b0110_010_000: 1725: irpBhssw (); 1726: break irpSwitch; 1727: 1728: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1729: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1730: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1731: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1732: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_001_sss_sss 1733: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1734: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1735: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1736: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1737: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1738: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1739: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1740: case 0b0110_010_001: 1741: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1742: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1743: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1744: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1745: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_010_sss_sss 1746: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1747: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1748: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1749: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1750: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1751: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1752: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1753: case 0b0110_010_010: 1754: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1755: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1756: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1757: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1758: //BCC.S <label> |-|01----|-|----*|-----| |0110_010_011_sss_sss 1759: //BHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1760: //BNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1761: //BNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1762: //JBCC.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1763: //JBHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1764: //JBNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1765: //JBNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1766: case 0b0110_010_011: 1767: irpBhss (); 1768: break irpSwitch; 1769: 1770: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1771: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1772: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1773: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1774: //BCS.W <label> |-|012346|-|----*|-----| |0110_010_100_000_000-{offset} 1775: //BLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1776: //BNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1777: //BNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1778: //JBCS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1779: //JBLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1780: //JBNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1781: //JBNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1782: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) 1783: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1784: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1785: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1786: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1787: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1788: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1789: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1790: //JBCC.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1791: //JBHS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1792: //JBNCS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1793: //JBNLO.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1794: case 0b0110_010_100: 1795: irpBlosw (); 1796: break irpSwitch; 1797: 1798: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1799: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1800: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1801: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1802: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_101_sss_sss 1803: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1804: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1805: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1806: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1807: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1808: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1809: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1810: case 0b0110_010_101: 1811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1812: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1813: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1814: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1815: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_110_sss_sss 1816: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1817: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1818: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1819: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1820: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1821: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1822: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1823: case 0b0110_010_110: 1824: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1825: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1826: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1827: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1828: //BCS.S <label> |-|01----|-|----*|-----| |0110_010_111_sss_sss 1829: //BLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1830: //BNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1831: //BNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1832: //JBCS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1833: //JBLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1834: //JBNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1835: //JBNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1836: case 0b0110_010_111: 1837: irpBlos (); 1838: break irpSwitch; 1839: 1840: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1841: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1842: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1843: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1844: //BNE.W <label> |-|012346|-|--*--|-----| |0110_011_000_000_000-{offset} 1845: //BNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1846: //BNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1847: //BNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1848: //JBNE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1849: //JBNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1850: //JBNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1851: //JBNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1852: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) 1853: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1854: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1855: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1856: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1857: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1858: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1859: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1860: //JBEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1861: //JBNEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1862: //JBNNE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1863: //JBNNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1864: //JBNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1865: //JBNZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1866: //JBZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1867: case 0b0110_011_000: 1868: irpBnesw (); 1869: break irpSwitch; 1870: 1871: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1872: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1873: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1874: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1875: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_001_sss_sss 1876: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1877: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1878: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1879: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1880: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1881: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1882: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1883: case 0b0110_011_001: 1884: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1885: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1886: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1887: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1888: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_010_sss_sss 1889: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1890: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1891: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1892: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1893: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1894: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1895: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1896: case 0b0110_011_010: 1897: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1898: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1899: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1900: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1901: //BNE.S <label> |-|01----|-|--*--|-----| |0110_011_011_sss_sss 1902: //BNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1903: //BNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1904: //BNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1905: //JBNE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1906: //JBNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1907: //JBNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1908: //JBNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1909: case 0b0110_011_011: 1910: irpBnes (); 1911: break irpSwitch; 1912: 1913: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1914: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1915: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1916: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1917: //BEQ.W <label> |-|012346|-|--*--|-----| |0110_011_100_000_000-{offset} 1918: //BNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1919: //BNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1920: //BZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1921: //JBEQ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1922: //JBNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1923: //JBNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1924: //JBZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1925: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) 1926: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1927: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1928: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1929: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1930: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1931: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1932: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1933: //JBNE.L <label> |A|012346|-|--*--|-----| |0110_011_100_000_110-0100111011111001-{address} [BEQ.S (*)+8;JMP <label>] 1934: case 0b0110_011_100: 1935: irpBeqsw (); 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: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_101_sss_sss 1943: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 1944: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 1945: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 1946: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 1947: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 1948: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 1949: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 1950: case 0b0110_011_101: 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: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_110_sss_sss 1956: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 1957: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 1958: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 1959: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 1960: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 1961: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 1962: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 1963: case 0b0110_011_110: 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: //BEQ.S <label> |-|01----|-|--*--|-----| |0110_011_111_sss_sss 1969: //BNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 1970: //BNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 1971: //BZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 1972: //JBEQ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 1973: //JBNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 1974: //JBNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 1975: //JBZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 1976: case 0b0110_011_111: 1977: irpBeqs (); 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: //BVC.W <label> |-|012346|-|---*-|-----| |0110_100_000_000_000-{offset} 1985: //BNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 1986: //JBNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 1987: //JBVC.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 1988: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) 1989: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 1990: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 1991: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 1992: //JBNVC.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 1993: //JBVS.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 1994: case 0b0110_100_000: 1995: irpBvcsw (); 1996: break irpSwitch; 1997: 1998: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1999: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2000: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2001: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2002: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_001_sss_sss 2003: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2004: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2005: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2006: case 0b0110_100_001: 2007: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2008: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2009: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2010: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2011: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_010_sss_sss 2012: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2013: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2014: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2015: case 0b0110_100_010: 2016: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2017: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2018: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2019: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2020: //BVC.S <label> |-|01----|-|---*-|-----| |0110_100_011_sss_sss 2021: //BNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2022: //JBNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2023: //JBVC.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2024: case 0b0110_100_011: 2025: irpBvcs (); 2026: break irpSwitch; 2027: 2028: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2029: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2030: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2031: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2032: //BVS.W <label> |-|012346|-|---*-|-----| |0110_100_100_000_000-{offset} 2033: //BNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2034: //JBNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2035: //JBVS.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2036: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) 2037: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2038: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2039: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2040: //JBNVS.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 2041: //JBVC.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 2042: case 0b0110_100_100: 2043: irpBvssw (); 2044: break irpSwitch; 2045: 2046: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2047: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2048: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2049: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2050: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_101_sss_sss 2051: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2052: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2053: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2054: case 0b0110_100_101: 2055: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2056: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2057: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2058: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2059: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_110_sss_sss 2060: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2061: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2062: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2063: case 0b0110_100_110: 2064: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2065: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2066: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2067: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2068: //BVS.S <label> |-|01----|-|---*-|-----| |0110_100_111_sss_sss 2069: //BNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2070: //JBNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2071: //JBVS.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2072: case 0b0110_100_111: 2073: irpBvss (); 2074: break irpSwitch; 2075: 2076: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2077: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2078: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2079: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2080: //BPL.W <label> |-|012346|-|-*---|-----| |0110_101_000_000_000-{offset} 2081: //BNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2082: //JBNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2083: //JBPL.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2084: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) 2085: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2086: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2087: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2088: //JBMI.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 2089: //JBNPL.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 2090: case 0b0110_101_000: 2091: irpBplsw (); 2092: break irpSwitch; 2093: 2094: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2095: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2096: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2097: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2098: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_001_sss_sss 2099: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2100: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2101: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2102: case 0b0110_101_001: 2103: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2104: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2105: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2106: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2107: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_010_sss_sss 2108: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2109: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2110: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2111: case 0b0110_101_010: 2112: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2113: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2114: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2115: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2116: //BPL.S <label> |-|01----|-|-*---|-----| |0110_101_011_sss_sss 2117: //BNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2118: //JBNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2119: //JBPL.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2120: case 0b0110_101_011: 2121: irpBpls (); 2122: break irpSwitch; 2123: 2124: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2125: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2126: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2127: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2128: //BMI.W <label> |-|012346|-|-*---|-----| |0110_101_100_000_000-{offset} 2129: //BNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2130: //JBMI.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2131: //JBNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2132: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) 2133: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2134: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2135: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2136: //JBNMI.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 2137: //JBPL.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 2138: case 0b0110_101_100: 2139: irpBmisw (); 2140: break irpSwitch; 2141: 2142: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2143: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2144: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2145: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2146: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_101_sss_sss 2147: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2148: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2149: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2150: case 0b0110_101_101: 2151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2152: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2153: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2154: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2155: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_110_sss_sss 2156: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2157: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2158: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2159: case 0b0110_101_110: 2160: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2161: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2162: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2163: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2164: //BMI.S <label> |-|01----|-|-*---|-----| |0110_101_111_sss_sss 2165: //BNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2166: //JBMI.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2167: //JBNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2168: case 0b0110_101_111: 2169: irpBmis (); 2170: break irpSwitch; 2171: 2172: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2173: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2174: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2175: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2176: //BGE.W <label> |-|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} 2177: //BNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2178: //JBGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2179: //JBNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2180: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) 2181: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2182: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2183: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2184: //JBLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 2185: //JBNGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 2186: case 0b0110_110_000: 2187: irpBgesw (); 2188: break irpSwitch; 2189: 2190: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2191: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2192: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2193: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2194: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_001_sss_sss 2195: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2196: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2197: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2198: case 0b0110_110_001: 2199: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2200: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2201: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2202: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2203: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_010_sss_sss 2204: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2205: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2206: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2207: case 0b0110_110_010: 2208: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2209: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2210: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2211: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2212: //BGE.S <label> |-|01----|-|-*-*-|-----| |0110_110_011_sss_sss 2213: //BNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2214: //JBGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2215: //JBNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2216: case 0b0110_110_011: 2217: irpBges (); 2218: break irpSwitch; 2219: 2220: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2221: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2222: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2223: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2224: //BLT.W <label> |-|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} 2225: //BNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2226: //JBLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2227: //JBNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2228: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) 2229: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2230: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2231: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2232: //JBGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 2233: //JBNLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 2234: case 0b0110_110_100: 2235: irpBltsw (); 2236: break irpSwitch; 2237: 2238: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2239: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2240: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2241: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2242: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_101_sss_sss 2243: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2244: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2245: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2246: case 0b0110_110_101: 2247: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2248: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2249: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2250: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2251: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_110_sss_sss 2252: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2253: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2254: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2255: case 0b0110_110_110: 2256: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2257: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2258: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2259: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2260: //BLT.S <label> |-|01----|-|-*-*-|-----| |0110_110_111_sss_sss 2261: //BNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2262: //JBLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2263: //JBNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2264: case 0b0110_110_111: 2265: irpBlts (); 2266: break irpSwitch; 2267: 2268: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2269: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2270: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2271: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2272: //BGT.W <label> |-|012346|-|-***-|-----| |0110_111_000_000_000-{offset} 2273: //BNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2274: //JBGT.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2275: //JBNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2276: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) 2277: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2278: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2279: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2280: //JBLE.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 2281: //JBNGT.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 2282: case 0b0110_111_000: 2283: irpBgtsw (); 2284: break irpSwitch; 2285: 2286: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2287: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2288: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2289: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2290: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_001_sss_sss 2291: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2292: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2293: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2294: case 0b0110_111_001: 2295: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2296: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2297: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2298: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2299: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_010_sss_sss 2300: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2301: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2302: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2303: case 0b0110_111_010: 2304: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2305: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2306: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2307: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2308: //BGT.S <label> |-|01----|-|-***-|-----| |0110_111_011_sss_sss 2309: //BNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2310: //JBGT.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2311: //JBNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2312: case 0b0110_111_011: 2313: irpBgts (); 2314: break irpSwitch; 2315: 2316: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2317: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2318: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2319: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2320: //BLE.W <label> |-|012346|-|-***-|-----| |0110_111_100_000_000-{offset} 2321: //BNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2322: //JBLE.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2323: //JBNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2324: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) 2325: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2326: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2327: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2328: //JBGT.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 2329: //JBNLE.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 2330: case 0b0110_111_100: 2331: irpBlesw (); 2332: break irpSwitch; 2333: 2334: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2335: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2336: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2337: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2338: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_101_sss_sss 2339: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2340: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2341: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2342: case 0b0110_111_101: 2343: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2344: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2345: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2346: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2347: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_110_sss_sss 2348: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2349: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2350: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2351: case 0b0110_111_110: 2352: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2353: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2354: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2355: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2356: //BLE.S <label> |-|01----|-|-***-|-----| |0110_111_111_sss_sss 2357: //BNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2358: //JBLE.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2359: //JBNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2360: case 0b0110_111_111: 2361: irpBles (); 2362: break irpSwitch; 2363: 2364: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2365: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2366: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2367: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2368: //IOCS <name> |A|012346|-|UUUUU|UUUUU| |0111_000_0dd_ddd_ddd-0100111001001111 [MOVEQ.L #<data>,D0;TRAP #15] 2369: //MOVEQ.L #<data>,Dq |-|012346|-|-UUUU|-**00| |0111_qqq_0dd_ddd_ddd 2370: case 0b0111_000_000: 2371: case 0b0111_000_001: 2372: case 0b0111_000_010: 2373: case 0b0111_000_011: 2374: case 0b0111_001_000: 2375: case 0b0111_001_001: 2376: case 0b0111_001_010: 2377: case 0b0111_001_011: 2378: case 0b0111_010_000: 2379: case 0b0111_010_001: 2380: case 0b0111_010_010: 2381: case 0b0111_010_011: 2382: case 0b0111_011_000: 2383: case 0b0111_011_001: 2384: case 0b0111_011_010: 2385: case 0b0111_011_011: 2386: case 0b0111_100_000: 2387: case 0b0111_100_001: 2388: case 0b0111_100_010: 2389: case 0b0111_100_011: 2390: case 0b0111_101_000: 2391: case 0b0111_101_001: 2392: case 0b0111_101_010: 2393: case 0b0111_101_011: 2394: case 0b0111_110_000: 2395: case 0b0111_110_001: 2396: case 0b0111_110_010: 2397: case 0b0111_110_011: 2398: case 0b0111_111_000: 2399: case 0b0111_111_001: 2400: case 0b0111_111_010: 2401: case 0b0111_111_011: 2402: irpMoveq (); 2403: break irpSwitch; 2404: 2405: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2406: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2407: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2408: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2409: //MVS.B <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B) 2410: case 0b0111_000_100: 2411: case 0b0111_001_100: 2412: case 0b0111_010_100: 2413: case 0b0111_011_100: 2414: case 0b0111_100_100: 2415: case 0b0111_101_100: 2416: case 0b0111_110_100: 2417: case 0b0111_111_100: 2418: irpMvsByte (); 2419: break irpSwitch; 2420: 2421: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2422: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2423: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2424: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2425: //MVS.W <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B) 2426: case 0b0111_000_101: 2427: case 0b0111_001_101: 2428: case 0b0111_010_101: 2429: case 0b0111_011_101: 2430: case 0b0111_100_101: 2431: case 0b0111_101_101: 2432: case 0b0111_110_101: 2433: case 0b0111_111_101: 2434: irpMvsWord (); 2435: break irpSwitch; 2436: 2437: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2438: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2439: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2440: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2441: //MVZ.B <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B) 2442: case 0b0111_000_110: 2443: case 0b0111_001_110: 2444: case 0b0111_010_110: 2445: case 0b0111_011_110: 2446: case 0b0111_100_110: 2447: case 0b0111_101_110: 2448: case 0b0111_110_110: 2449: case 0b0111_111_110: 2450: irpMvzByte (); 2451: break irpSwitch; 2452: 2453: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2454: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2455: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2456: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2457: //MVZ.W <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B) 2458: case 0b0111_000_111: 2459: case 0b0111_001_111: 2460: case 0b0111_010_111: 2461: case 0b0111_011_111: 2462: case 0b0111_100_111: 2463: case 0b0111_101_111: 2464: case 0b0111_110_111: 2465: case 0b0111_111_111: 2466: irpMvzWord (); 2467: break irpSwitch; 2468: 2469: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2470: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2471: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2472: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2473: //OR.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr 2474: case 0b1000_000_000: 2475: case 0b1000_001_000: 2476: case 0b1000_010_000: 2477: case 0b1000_011_000: 2478: case 0b1000_100_000: 2479: case 0b1000_101_000: 2480: case 0b1000_110_000: 2481: case 0b1000_111_000: 2482: irpOrToRegByte (); 2483: break irpSwitch; 2484: 2485: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2486: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2487: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2488: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2489: //OR.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr 2490: case 0b1000_000_001: 2491: case 0b1000_001_001: 2492: case 0b1000_010_001: 2493: case 0b1000_011_001: 2494: case 0b1000_100_001: 2495: case 0b1000_101_001: 2496: case 0b1000_110_001: 2497: case 0b1000_111_001: 2498: irpOrToRegWord (); 2499: break irpSwitch; 2500: 2501: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2502: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2503: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2504: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2505: //OR.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr 2506: case 0b1000_000_010: 2507: case 0b1000_001_010: 2508: case 0b1000_010_010: 2509: case 0b1000_011_010: 2510: case 0b1000_100_010: 2511: case 0b1000_101_010: 2512: case 0b1000_110_010: 2513: case 0b1000_111_010: 2514: irpOrToRegLong (); 2515: break irpSwitch; 2516: 2517: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2518: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2519: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2520: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2521: //DIVU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr 2522: case 0b1000_000_011: 2523: case 0b1000_001_011: 2524: case 0b1000_010_011: 2525: case 0b1000_011_011: 2526: case 0b1000_100_011: 2527: case 0b1000_101_011: 2528: case 0b1000_110_011: 2529: case 0b1000_111_011: 2530: irpDivuWord (); 2531: break irpSwitch; 2532: 2533: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2534: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2535: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2536: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2537: //SBCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_000_rrr 2538: //SBCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_001_rrr 2539: //OR.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_100_mmm_rrr 2540: case 0b1000_000_100: 2541: case 0b1000_001_100: 2542: case 0b1000_010_100: 2543: case 0b1000_011_100: 2544: case 0b1000_100_100: 2545: case 0b1000_101_100: 2546: case 0b1000_110_100: 2547: case 0b1000_111_100: 2548: irpOrToMemByte (); 2549: break irpSwitch; 2550: 2551: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2552: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2553: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2554: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2555: //OR.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_101_mmm_rrr 2556: case 0b1000_000_101: 2557: case 0b1000_001_101: 2558: case 0b1000_010_101: 2559: case 0b1000_011_101: 2560: case 0b1000_100_101: 2561: case 0b1000_101_101: 2562: case 0b1000_110_101: 2563: case 0b1000_111_101: 2564: irpOrToMemWord (); 2565: break irpSwitch; 2566: 2567: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2568: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2569: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2570: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2571: //OR.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_110_mmm_rrr 2572: case 0b1000_000_110: 2573: case 0b1000_001_110: 2574: case 0b1000_010_110: 2575: case 0b1000_011_110: 2576: case 0b1000_100_110: 2577: case 0b1000_101_110: 2578: case 0b1000_110_110: 2579: case 0b1000_111_110: 2580: irpOrToMemLong (); 2581: break irpSwitch; 2582: 2583: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2584: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2585: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2586: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2587: //DIVS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr 2588: case 0b1000_000_111: 2589: case 0b1000_001_111: 2590: case 0b1000_010_111: 2591: case 0b1000_011_111: 2592: case 0b1000_100_111: 2593: case 0b1000_101_111: 2594: case 0b1000_110_111: 2595: case 0b1000_111_111: 2596: irpDivsWord (); 2597: break irpSwitch; 2598: 2599: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2600: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2601: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2602: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2603: //SUB.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr 2604: case 0b1001_000_000: 2605: case 0b1001_001_000: 2606: case 0b1001_010_000: 2607: case 0b1001_011_000: 2608: case 0b1001_100_000: 2609: case 0b1001_101_000: 2610: case 0b1001_110_000: 2611: case 0b1001_111_000: 2612: irpSubToRegByte (); 2613: break irpSwitch; 2614: 2615: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2616: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2617: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2619: //SUB.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr 2620: case 0b1001_000_001: 2621: case 0b1001_001_001: 2622: case 0b1001_010_001: 2623: case 0b1001_011_001: 2624: case 0b1001_100_001: 2625: case 0b1001_101_001: 2626: case 0b1001_110_001: 2627: case 0b1001_111_001: 2628: irpSubToRegWord (); 2629: break irpSwitch; 2630: 2631: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2632: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2633: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2635: //SUB.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr 2636: case 0b1001_000_010: 2637: case 0b1001_001_010: 2638: case 0b1001_010_010: 2639: case 0b1001_011_010: 2640: case 0b1001_100_010: 2641: case 0b1001_101_010: 2642: case 0b1001_110_010: 2643: case 0b1001_111_010: 2644: irpSubToRegLong (); 2645: break irpSwitch; 2646: 2647: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2648: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2649: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2651: //SUBA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr 2652: //SUB.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq] 2653: //CLR.W Ar |A|012346|-|-----|-----| A |1001_rrr_011_001_rrr [SUBA.W Ar,Ar] 2654: case 0b1001_000_011: 2655: case 0b1001_001_011: 2656: case 0b1001_010_011: 2657: case 0b1001_011_011: 2658: case 0b1001_100_011: 2659: case 0b1001_101_011: 2660: case 0b1001_110_011: 2661: case 0b1001_111_011: 2662: irpSubaWord (); 2663: break irpSwitch; 2664: 2665: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2666: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2667: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2668: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2669: //SUBX.B Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_100_000_rrr 2670: //SUBX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_100_001_rrr 2671: //SUB.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_100_mmm_rrr 2672: case 0b1001_000_100: 2673: case 0b1001_001_100: 2674: case 0b1001_010_100: 2675: case 0b1001_011_100: 2676: case 0b1001_100_100: 2677: case 0b1001_101_100: 2678: case 0b1001_110_100: 2679: case 0b1001_111_100: 2680: irpSubToMemByte (); 2681: break irpSwitch; 2682: 2683: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2684: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2685: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2686: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2687: //SUBX.W Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_101_000_rrr 2688: //SUBX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_101_001_rrr 2689: //SUB.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_101_mmm_rrr 2690: case 0b1001_000_101: 2691: case 0b1001_001_101: 2692: case 0b1001_010_101: 2693: case 0b1001_011_101: 2694: case 0b1001_100_101: 2695: case 0b1001_101_101: 2696: case 0b1001_110_101: 2697: case 0b1001_111_101: 2698: irpSubToMemWord (); 2699: break irpSwitch; 2700: 2701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2702: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2703: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2704: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2705: //SUBX.L Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_110_000_rrr 2706: //SUBX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_110_001_rrr 2707: //SUB.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_110_mmm_rrr 2708: case 0b1001_000_110: 2709: case 0b1001_001_110: 2710: case 0b1001_010_110: 2711: case 0b1001_011_110: 2712: case 0b1001_100_110: 2713: case 0b1001_101_110: 2714: case 0b1001_110_110: 2715: case 0b1001_111_110: 2716: irpSubToMemLong (); 2717: break irpSwitch; 2718: 2719: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2720: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2721: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2722: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2723: //SUBA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr 2724: //SUB.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq] 2725: //CLR.L Ar |A|012346|-|-----|-----| A |1001_rrr_111_001_rrr [SUBA.L Ar,Ar] 2726: case 0b1001_000_111: 2727: case 0b1001_001_111: 2728: case 0b1001_010_111: 2729: case 0b1001_011_111: 2730: case 0b1001_100_111: 2731: case 0b1001_101_111: 2732: case 0b1001_110_111: 2733: case 0b1001_111_111: 2734: irpSubaLong (); 2735: break irpSwitch; 2736: 2737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2738: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2739: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2740: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2741: //SXCALL <name> |A|012346|-|UUUUU|*****| |1010_0dd_ddd_ddd_ddd [ALINE #<data>] 2742: case 0b1010_000_000: 2743: case 0b1010_000_001: 2744: case 0b1010_000_010: 2745: case 0b1010_000_011: 2746: case 0b1010_000_100: 2747: case 0b1010_000_101: 2748: case 0b1010_000_110: 2749: case 0b1010_000_111: 2750: case 0b1010_001_000: 2751: case 0b1010_001_001: 2752: case 0b1010_001_010: 2753: case 0b1010_001_011: 2754: case 0b1010_001_100: 2755: case 0b1010_001_101: 2756: case 0b1010_001_110: 2757: case 0b1010_001_111: 2758: case 0b1010_010_000: 2759: case 0b1010_010_001: 2760: case 0b1010_010_010: 2761: case 0b1010_010_011: 2762: case 0b1010_010_100: 2763: case 0b1010_010_101: 2764: case 0b1010_010_110: 2765: case 0b1010_010_111: 2766: case 0b1010_011_000: 2767: case 0b1010_011_001: 2768: case 0b1010_011_010: 2769: case 0b1010_011_011: 2770: case 0b1010_011_100: 2771: case 0b1010_011_101: 2772: case 0b1010_011_110: 2773: case 0b1010_011_111: 2774: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2775: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2776: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2777: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2778: //ALINE #<data> |-|012346|-|UUUUU|*****| |1010_ddd_ddd_ddd_ddd (line 1010 emulator) 2779: case 0b1010_100_000: 2780: case 0b1010_100_001: 2781: case 0b1010_100_010: 2782: case 0b1010_100_011: 2783: case 0b1010_100_100: 2784: case 0b1010_100_101: 2785: case 0b1010_100_110: 2786: case 0b1010_100_111: 2787: case 0b1010_101_000: 2788: case 0b1010_101_001: 2789: case 0b1010_101_010: 2790: case 0b1010_101_011: 2791: case 0b1010_101_100: 2792: case 0b1010_101_101: 2793: case 0b1010_101_110: 2794: case 0b1010_101_111: 2795: case 0b1010_110_000: 2796: case 0b1010_110_001: 2797: case 0b1010_110_010: 2798: case 0b1010_110_011: 2799: case 0b1010_110_100: 2800: case 0b1010_110_101: 2801: case 0b1010_110_110: 2802: case 0b1010_110_111: 2803: case 0b1010_111_000: 2804: case 0b1010_111_001: 2805: case 0b1010_111_010: 2806: case 0b1010_111_011: 2807: case 0b1010_111_100: 2808: case 0b1010_111_101: 2809: case 0b1010_111_110: 2810: case 0b1010_111_111: 2811: irpAline (); 2812: break irpSwitch; 2813: 2814: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2815: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2816: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2817: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2818: //CMP.B <ea>,Dq |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr 2819: case 0b1011_000_000: 2820: case 0b1011_001_000: 2821: case 0b1011_010_000: 2822: case 0b1011_011_000: 2823: case 0b1011_100_000: 2824: case 0b1011_101_000: 2825: case 0b1011_110_000: 2826: case 0b1011_111_000: 2827: irpCmpByte (); 2828: break irpSwitch; 2829: 2830: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2831: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2832: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2833: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2834: //CMP.W <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr 2835: case 0b1011_000_001: 2836: case 0b1011_001_001: 2837: case 0b1011_010_001: 2838: case 0b1011_011_001: 2839: case 0b1011_100_001: 2840: case 0b1011_101_001: 2841: case 0b1011_110_001: 2842: case 0b1011_111_001: 2843: irpCmpWord (); 2844: break irpSwitch; 2845: 2846: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2847: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2848: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2849: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2850: //CMP.L <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr 2851: case 0b1011_000_010: 2852: case 0b1011_001_010: 2853: case 0b1011_010_010: 2854: case 0b1011_011_010: 2855: case 0b1011_100_010: 2856: case 0b1011_101_010: 2857: case 0b1011_110_010: 2858: case 0b1011_111_010: 2859: irpCmpLong (); 2860: break irpSwitch; 2861: 2862: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2863: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2864: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2865: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2866: //CMPA.W <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr 2867: //CMP.W <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq] 2868: case 0b1011_000_011: 2869: case 0b1011_001_011: 2870: case 0b1011_010_011: 2871: case 0b1011_011_011: 2872: case 0b1011_100_011: 2873: case 0b1011_101_011: 2874: case 0b1011_110_011: 2875: case 0b1011_111_011: 2876: irpCmpaWord (); 2877: break irpSwitch; 2878: 2879: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2880: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2881: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2882: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2883: //EOR.B Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_100_mmm_rrr 2884: //CMPM.B (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_100_001_rrr 2885: case 0b1011_000_100: 2886: case 0b1011_001_100: 2887: case 0b1011_010_100: 2888: case 0b1011_011_100: 2889: case 0b1011_100_100: 2890: case 0b1011_101_100: 2891: case 0b1011_110_100: 2892: case 0b1011_111_100: 2893: irpEorByte (); 2894: break irpSwitch; 2895: 2896: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2897: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2898: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2899: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2900: //EOR.W Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_101_mmm_rrr 2901: //CMPM.W (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_101_001_rrr 2902: case 0b1011_000_101: 2903: case 0b1011_001_101: 2904: case 0b1011_010_101: 2905: case 0b1011_011_101: 2906: case 0b1011_100_101: 2907: case 0b1011_101_101: 2908: case 0b1011_110_101: 2909: case 0b1011_111_101: 2910: irpEorWord (); 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: //EOR.L Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_110_mmm_rrr 2918: //CMPM.L (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_110_001_rrr 2919: case 0b1011_000_110: 2920: case 0b1011_001_110: 2921: case 0b1011_010_110: 2922: case 0b1011_011_110: 2923: case 0b1011_100_110: 2924: case 0b1011_101_110: 2925: case 0b1011_110_110: 2926: case 0b1011_111_110: 2927: irpEorLong (); 2928: break irpSwitch; 2929: 2930: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2931: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2932: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2933: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2934: //CMPA.L <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr 2935: //CMP.L <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq] 2936: case 0b1011_000_111: 2937: case 0b1011_001_111: 2938: case 0b1011_010_111: 2939: case 0b1011_011_111: 2940: case 0b1011_100_111: 2941: case 0b1011_101_111: 2942: case 0b1011_110_111: 2943: case 0b1011_111_111: 2944: irpCmpaLong (); 2945: break irpSwitch; 2946: 2947: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2948: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2949: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2950: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2951: //AND.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr 2952: case 0b1100_000_000: 2953: case 0b1100_001_000: 2954: case 0b1100_010_000: 2955: case 0b1100_011_000: 2956: case 0b1100_100_000: 2957: case 0b1100_101_000: 2958: case 0b1100_110_000: 2959: case 0b1100_111_000: 2960: irpAndToRegByte (); 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: //AND.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr 2968: case 0b1100_000_001: 2969: case 0b1100_001_001: 2970: case 0b1100_010_001: 2971: case 0b1100_011_001: 2972: case 0b1100_100_001: 2973: case 0b1100_101_001: 2974: case 0b1100_110_001: 2975: case 0b1100_111_001: 2976: irpAndToRegWord (); 2977: break irpSwitch; 2978: 2979: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2980: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2981: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2982: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2983: //AND.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr 2984: case 0b1100_000_010: 2985: case 0b1100_001_010: 2986: case 0b1100_010_010: 2987: case 0b1100_011_010: 2988: case 0b1100_100_010: 2989: case 0b1100_101_010: 2990: case 0b1100_110_010: 2991: case 0b1100_111_010: 2992: irpAndToRegLong (); 2993: break irpSwitch; 2994: 2995: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2996: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2997: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2998: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2999: //MULU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr 3000: case 0b1100_000_011: 3001: case 0b1100_001_011: 3002: case 0b1100_010_011: 3003: case 0b1100_011_011: 3004: case 0b1100_100_011: 3005: case 0b1100_101_011: 3006: case 0b1100_110_011: 3007: case 0b1100_111_011: 3008: irpMuluWord (); 3009: break irpSwitch; 3010: 3011: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3012: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3013: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3014: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3015: //ABCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_000_rrr 3016: //ABCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_001_rrr 3017: //AND.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_100_mmm_rrr 3018: case 0b1100_000_100: 3019: case 0b1100_001_100: 3020: case 0b1100_010_100: 3021: case 0b1100_011_100: 3022: case 0b1100_100_100: 3023: case 0b1100_101_100: 3024: case 0b1100_110_100: 3025: case 0b1100_111_100: 3026: irpAndToMemByte (); 3027: break irpSwitch; 3028: 3029: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3030: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3031: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3032: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3033: //EXG.L Dq,Dr |-|012346|-|-----|-----| |1100_qqq_101_000_rrr 3034: //EXG.L Aq,Ar |-|012346|-|-----|-----| |1100_qqq_101_001_rrr 3035: //AND.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_101_mmm_rrr 3036: case 0b1100_000_101: 3037: case 0b1100_001_101: 3038: case 0b1100_010_101: 3039: case 0b1100_011_101: 3040: case 0b1100_100_101: 3041: case 0b1100_101_101: 3042: case 0b1100_110_101: 3043: case 0b1100_111_101: 3044: irpAndToMemWord (); 3045: break irpSwitch; 3046: 3047: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3048: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3049: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3050: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3051: //EXG.L Dq,Ar |-|012346|-|-----|-----| |1100_qqq_110_001_rrr 3052: //AND.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_110_mmm_rrr 3053: case 0b1100_000_110: 3054: case 0b1100_001_110: 3055: case 0b1100_010_110: 3056: case 0b1100_011_110: 3057: case 0b1100_100_110: 3058: case 0b1100_101_110: 3059: case 0b1100_110_110: 3060: case 0b1100_111_110: 3061: irpAndToMemLong (); 3062: break irpSwitch; 3063: 3064: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3065: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3066: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3067: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3068: //MULS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr 3069: case 0b1100_000_111: 3070: case 0b1100_001_111: 3071: case 0b1100_010_111: 3072: case 0b1100_011_111: 3073: case 0b1100_100_111: 3074: case 0b1100_101_111: 3075: case 0b1100_110_111: 3076: case 0b1100_111_111: 3077: irpMulsWord (); 3078: break irpSwitch; 3079: 3080: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3081: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3082: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3083: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3084: //ADD.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr 3085: case 0b1101_000_000: 3086: case 0b1101_001_000: 3087: case 0b1101_010_000: 3088: case 0b1101_011_000: 3089: case 0b1101_100_000: 3090: case 0b1101_101_000: 3091: case 0b1101_110_000: 3092: case 0b1101_111_000: 3093: irpAddToRegByte (); 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: //ADD.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr 3101: case 0b1101_000_001: 3102: case 0b1101_001_001: 3103: case 0b1101_010_001: 3104: case 0b1101_011_001: 3105: case 0b1101_100_001: 3106: case 0b1101_101_001: 3107: case 0b1101_110_001: 3108: case 0b1101_111_001: 3109: irpAddToRegWord (); 3110: break irpSwitch; 3111: 3112: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3113: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3114: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3115: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3116: //ADD.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr 3117: case 0b1101_000_010: 3118: case 0b1101_001_010: 3119: case 0b1101_010_010: 3120: case 0b1101_011_010: 3121: case 0b1101_100_010: 3122: case 0b1101_101_010: 3123: case 0b1101_110_010: 3124: case 0b1101_111_010: 3125: irpAddToRegLong (); 3126: break irpSwitch; 3127: 3128: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3129: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3130: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3131: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3132: //ADDA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr 3133: //ADD.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq] 3134: case 0b1101_000_011: 3135: case 0b1101_001_011: 3136: case 0b1101_010_011: 3137: case 0b1101_011_011: 3138: case 0b1101_100_011: 3139: case 0b1101_101_011: 3140: case 0b1101_110_011: 3141: case 0b1101_111_011: 3142: irpAddaWord (); 3143: break irpSwitch; 3144: 3145: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3146: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3147: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3148: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3149: //ADDX.B Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_100_000_rrr 3150: //ADDX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_100_001_rrr 3151: //ADD.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_100_mmm_rrr 3152: case 0b1101_000_100: 3153: case 0b1101_001_100: 3154: case 0b1101_010_100: 3155: case 0b1101_011_100: 3156: case 0b1101_100_100: 3157: case 0b1101_101_100: 3158: case 0b1101_110_100: 3159: case 0b1101_111_100: 3160: irpAddToMemByte (); 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: //ADDX.W Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_101_000_rrr 3168: //ADDX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_101_001_rrr 3169: //ADD.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_101_mmm_rrr 3170: case 0b1101_000_101: 3171: case 0b1101_001_101: 3172: case 0b1101_010_101: 3173: case 0b1101_011_101: 3174: case 0b1101_100_101: 3175: case 0b1101_101_101: 3176: case 0b1101_110_101: 3177: case 0b1101_111_101: 3178: irpAddToMemWord (); 3179: break irpSwitch; 3180: 3181: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3182: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3183: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3184: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3185: //ADDX.L Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_110_000_rrr 3186: //ADDX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_110_001_rrr 3187: //ADD.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_110_mmm_rrr 3188: case 0b1101_000_110: 3189: case 0b1101_001_110: 3190: case 0b1101_010_110: 3191: case 0b1101_011_110: 3192: case 0b1101_100_110: 3193: case 0b1101_101_110: 3194: case 0b1101_110_110: 3195: case 0b1101_111_110: 3196: irpAddToMemLong (); 3197: break irpSwitch; 3198: 3199: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3200: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3201: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3202: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3203: //ADDA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr 3204: //ADD.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq] 3205: case 0b1101_000_111: 3206: case 0b1101_001_111: 3207: case 0b1101_010_111: 3208: case 0b1101_011_111: 3209: case 0b1101_100_111: 3210: case 0b1101_101_111: 3211: case 0b1101_110_111: 3212: case 0b1101_111_111: 3213: irpAddaLong (); 3214: break irpSwitch; 3215: 3216: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3217: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3218: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3219: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3220: //ASR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_000_rrr 3221: //LSR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_001_rrr 3222: //ROXR.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_010_rrr 3223: //ROR.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_011_rrr 3224: //ASR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_100_rrr 3225: //LSR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_101_rrr 3226: //ROXR.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_110_rrr 3227: //ROR.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_111_rrr 3228: //ASR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_000_rrr [ASR.B #1,Dr] 3229: //LSR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_001_rrr [LSR.B #1,Dr] 3230: //ROXR.B Dr |A|012346|-|*UUUU|***0*| |1110_001_000_010_rrr [ROXR.B #1,Dr] 3231: //ROR.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_000_011_rrr [ROR.B #1,Dr] 3232: case 0b1110_000_000: 3233: case 0b1110_001_000: 3234: case 0b1110_010_000: 3235: case 0b1110_011_000: 3236: case 0b1110_100_000: 3237: case 0b1110_101_000: 3238: case 0b1110_110_000: 3239: case 0b1110_111_000: 3240: irpXxrToRegByte (); 3241: break irpSwitch; 3242: 3243: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3244: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3245: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3246: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3247: //ASR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_000_rrr 3248: //LSR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_001_rrr 3249: //ROXR.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_010_rrr 3250: //ROR.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_011_rrr 3251: //ASR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_100_rrr 3252: //LSR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_101_rrr 3253: //ROXR.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_110_rrr 3254: //ROR.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_111_rrr 3255: //ASR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_000_rrr [ASR.W #1,Dr] 3256: //LSR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_001_rrr [LSR.W #1,Dr] 3257: //ROXR.W Dr |A|012346|-|*UUUU|***0*| |1110_001_001_010_rrr [ROXR.W #1,Dr] 3258: //ROR.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_001_011_rrr [ROR.W #1,Dr] 3259: case 0b1110_000_001: 3260: case 0b1110_001_001: 3261: case 0b1110_010_001: 3262: case 0b1110_011_001: 3263: case 0b1110_100_001: 3264: case 0b1110_101_001: 3265: case 0b1110_110_001: 3266: case 0b1110_111_001: 3267: irpXxrToRegWord (); 3268: break irpSwitch; 3269: 3270: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3271: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3272: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3273: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3274: //ASR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_000_rrr 3275: //LSR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_001_rrr 3276: //ROXR.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_010_rrr 3277: //ROR.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_011_rrr 3278: //ASR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_100_rrr 3279: //LSR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_101_rrr 3280: //ROXR.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_110_rrr 3281: //ROR.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_111_rrr 3282: //ASR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_000_rrr [ASR.L #1,Dr] 3283: //LSR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_001_rrr [LSR.L #1,Dr] 3284: //ROXR.L Dr |A|012346|-|*UUUU|***0*| |1110_001_010_010_rrr [ROXR.L #1,Dr] 3285: //ROR.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_010_011_rrr [ROR.L #1,Dr] 3286: case 0b1110_000_010: 3287: case 0b1110_001_010: 3288: case 0b1110_010_010: 3289: case 0b1110_011_010: 3290: case 0b1110_100_010: 3291: case 0b1110_101_010: 3292: case 0b1110_110_010: 3293: case 0b1110_111_010: 3294: irpXxrToRegLong (); 3295: break irpSwitch; 3296: 3297: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3298: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3299: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3300: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3301: //ASR.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_000_011_mmm_rrr 3302: case 0b1110_000_011: 3303: irpAsrToMem (); 3304: break irpSwitch; 3305: 3306: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3307: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3308: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3309: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3310: //ASL.B #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_000_rrr 3311: //LSL.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_001_rrr 3312: //ROXL.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_010_rrr 3313: //ROL.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_011_rrr 3314: //ASL.B Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_100_rrr 3315: //LSL.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_101_rrr 3316: //ROXL.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_110_rrr 3317: //ROL.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_111_rrr 3318: //ASL.B Dr |A|012346|-|UUUUU|*****| |1110_001_100_000_rrr [ASL.B #1,Dr] 3319: //LSL.B Dr |A|012346|-|UUUUU|***0*| |1110_001_100_001_rrr [LSL.B #1,Dr] 3320: //ROXL.B Dr |A|012346|-|*UUUU|***0*| |1110_001_100_010_rrr [ROXL.B #1,Dr] 3321: //ROL.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_100_011_rrr [ROL.B #1,Dr] 3322: case 0b1110_000_100: 3323: case 0b1110_001_100: 3324: case 0b1110_010_100: 3325: case 0b1110_011_100: 3326: case 0b1110_100_100: 3327: case 0b1110_101_100: 3328: case 0b1110_110_100: 3329: case 0b1110_111_100: 3330: irpXxlToRegByte (); 3331: break irpSwitch; 3332: 3333: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3334: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3335: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3336: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3337: //ASL.W #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_000_rrr 3338: //LSL.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_001_rrr 3339: //ROXL.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_010_rrr 3340: //ROL.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_011_rrr 3341: //ASL.W Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_100_rrr 3342: //LSL.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_101_rrr 3343: //ROXL.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_110_rrr 3344: //ROL.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_111_rrr 3345: //ASL.W Dr |A|012346|-|UUUUU|*****| |1110_001_101_000_rrr [ASL.W #1,Dr] 3346: //LSL.W Dr |A|012346|-|UUUUU|***0*| |1110_001_101_001_rrr [LSL.W #1,Dr] 3347: //ROXL.W Dr |A|012346|-|*UUUU|***0*| |1110_001_101_010_rrr [ROXL.W #1,Dr] 3348: //ROL.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_101_011_rrr [ROL.W #1,Dr] 3349: case 0b1110_000_101: 3350: case 0b1110_001_101: 3351: case 0b1110_010_101: 3352: case 0b1110_011_101: 3353: case 0b1110_100_101: 3354: case 0b1110_101_101: 3355: case 0b1110_110_101: 3356: case 0b1110_111_101: 3357: irpXxlToRegWord (); 3358: break irpSwitch; 3359: 3360: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3361: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3362: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3363: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3364: //ASL.L #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_000_rrr 3365: //LSL.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_001_rrr 3366: //ROXL.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_010_rrr 3367: //ROL.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_011_rrr 3368: //ASL.L Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_100_rrr 3369: //LSL.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_101_rrr 3370: //ROXL.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_110_rrr 3371: //ROL.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_111_rrr 3372: //ASL.L Dr |A|012346|-|UUUUU|*****| |1110_001_110_000_rrr [ASL.L #1,Dr] 3373: //LSL.L Dr |A|012346|-|UUUUU|***0*| |1110_001_110_001_rrr [LSL.L #1,Dr] 3374: //ROXL.L Dr |A|012346|-|*UUUU|***0*| |1110_001_110_010_rrr [ROXL.L #1,Dr] 3375: //ROL.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_110_011_rrr [ROL.L #1,Dr] 3376: case 0b1110_000_110: 3377: case 0b1110_001_110: 3378: case 0b1110_010_110: 3379: case 0b1110_011_110: 3380: case 0b1110_100_110: 3381: case 0b1110_101_110: 3382: case 0b1110_110_110: 3383: case 0b1110_111_110: 3384: irpXxlToRegLong (); 3385: break irpSwitch; 3386: 3387: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3388: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3389: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3390: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3391: //ASL.W <ea> |-|012346|-|UUUUU|*****| M+-WXZ |1110_000_111_mmm_rrr 3392: case 0b1110_000_111: 3393: irpAslToMem (); 3394: break irpSwitch; 3395: 3396: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3397: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3398: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3399: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3400: //LSR.W <ea> |-|012346|-|UUUUU|*0*0*| M+-WXZ |1110_001_011_mmm_rrr 3401: case 0b1110_001_011: 3402: irpLsrToMem (); 3403: break irpSwitch; 3404: 3405: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3406: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3407: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3408: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3409: //LSL.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_001_111_mmm_rrr 3410: case 0b1110_001_111: 3411: irpLslToMem (); 3412: break irpSwitch; 3413: 3414: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3415: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3416: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3417: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3418: //ROXR.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_011_mmm_rrr 3419: case 0b1110_010_011: 3420: irpRoxrToMem (); 3421: break irpSwitch; 3422: 3423: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3424: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3425: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3426: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3427: //ROXL.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_111_mmm_rrr 3428: case 0b1110_010_111: 3429: irpRoxlToMem (); 3430: break irpSwitch; 3431: 3432: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3433: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3434: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3435: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3436: //ROR.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_011_mmm_rrr 3437: case 0b1110_011_011: 3438: irpRorToMem (); 3439: break irpSwitch; 3440: 3441: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3442: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3443: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3444: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3445: //ROL.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_111_mmm_rrr 3446: case 0b1110_011_111: 3447: irpRolToMem (); 3448: break irpSwitch; 3449: 3450: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3451: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3452: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3453: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3454: //FPACK <data> |A|012346|-|UUUUU|*****| |1111_111_0dd_ddd_ddd [FLINE #<data>] 3455: case 0b1111_111_000: 3456: case 0b1111_111_001: 3457: case 0b1111_111_010: 3458: case 0b1111_111_011: 3459: irpFpack (); 3460: break irpSwitch; 3461: 3462: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3463: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3464: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3465: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3466: //DOS <data> |A|012346|-|UUUUU|UUUUU| |1111_111_1dd_ddd_ddd [FLINE #<data>] 3467: case 0b1111_111_100: 3468: case 0b1111_111_101: 3469: case 0b1111_111_110: 3470: case 0b1111_111_111: 3471: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3472: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3473: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3474: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3475: //FLINE #<data> |-|012346|-|UUUUU|UUUUU| |1111_ddd_ddd_ddd_ddd (line 1111 emulator) 3476: case 0b1111_000_000: 3477: case 0b1111_000_001: 3478: case 0b1111_000_010: 3479: case 0b1111_000_011: 3480: case 0b1111_000_100: 3481: case 0b1111_000_101: 3482: case 0b1111_000_110: 3483: case 0b1111_000_111: 3484: case 0b1111_001_000: 3485: case 0b1111_001_001: 3486: case 0b1111_001_010: 3487: case 0b1111_001_011: 3488: case 0b1111_001_100: 3489: case 0b1111_001_101: 3490: case 0b1111_001_110: 3491: case 0b1111_001_111: 3492: case 0b1111_010_000: 3493: case 0b1111_010_001: 3494: case 0b1111_010_010: 3495: case 0b1111_010_011: 3496: case 0b1111_010_100: 3497: case 0b1111_010_101: 3498: case 0b1111_010_110: 3499: case 0b1111_010_111: 3500: case 0b1111_011_000: 3501: case 0b1111_011_001: 3502: case 0b1111_011_010: 3503: case 0b1111_011_011: 3504: case 0b1111_011_100: 3505: case 0b1111_011_101: 3506: case 0b1111_011_110: 3507: case 0b1111_011_111: 3508: case 0b1111_100_000: 3509: case 0b1111_100_001: 3510: case 0b1111_100_010: 3511: case 0b1111_100_011: 3512: case 0b1111_100_100: 3513: case 0b1111_100_101: 3514: case 0b1111_100_110: 3515: case 0b1111_100_111: 3516: case 0b1111_101_000: 3517: case 0b1111_101_001: 3518: case 0b1111_101_010: 3519: case 0b1111_101_011: 3520: case 0b1111_101_100: 3521: case 0b1111_101_101: 3522: case 0b1111_101_110: 3523: case 0b1111_101_111: 3524: case 0b1111_110_000: 3525: case 0b1111_110_001: 3526: case 0b1111_110_010: 3527: case 0b1111_110_011: 3528: case 0b1111_110_100: 3529: case 0b1111_110_101: 3530: case 0b1111_110_110: 3531: case 0b1111_110_111: 3532: irpFline (); 3533: break irpSwitch; 3534: 3535: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3536: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3537: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3538: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3539: //HFSBOOT |-|012346|-|-----|-----| |0100_111_000_000_000 3540: //HFSINST |-|012346|-|-----|-----| |0100_111_000_000_001 3541: //HFSSTR |-|012346|-|-----|-----| |0100_111_000_000_010 3542: //HFSINT |-|012346|-|-----|-----| |0100_111_000_000_011 3543: //EMXNOP |-|012346|-|-----|-----| |0100_111_000_000_100 3544: case 0b0100_111_000: 3545: irpEmx (); 3546: break; 3547: 3548: default: 3549: irpIllegal (); 3550: 3551: } //switch XEiJ.regOC >>> 6 3552: 3553: //トレース例外 3554: // 命令実行前にsrのTビットがセットされていたとき命令実行後にトレース例外が発生する 3555: // トレース例外の発動は命令の機能拡張であり、他の例外処理で命令が中断されたときはトレース例外は発生しない 3556: // 命令例外はトレース例外の前に、割り込み例外はトレース例外の後に処理される 3557: // 未実装命令のエミュレーションルーチンはrteの直前にsrのTビットを復元することで未実装命令が1個の命令としてトレースされたように見せる 3558: // ;DOSコールの終了 3559: // ~008616: 3560: // btst.b #$07,(sp) 3561: // bne.s ~00861E 3562: // rte 3563: // ~00861E: 3564: // ori.w #$8000,sr 3565: // rte 3566: if (XEiJ.mpuTraceFlag != 0) { //命令実行前にsrのTビットがセットされていた 3567: XEiJ.mpuCycleCount += 34; 3568: irpException (M68kException.M6E_TRACE, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 3569: } 3570: //クロックをカウントアップする 3571: // オペランドをアクセスした時点ではまだXEiJ.mpuClockTimeが更新されていないのでXEiJ.mpuClockTime<xxxClock 3572: // xxxTickを呼び出すときはXEiJ.mpuClockTime>=xxxClock 3573: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount; 3574: //デバイスを呼び出す 3575: TickerQueue.tkqRun (XEiJ.mpuClockTime); 3576: //割り込みを受け付ける 3577: if ((t = XEiJ.mpuIMR & XEiJ.mpuIRR) != 0) { //マスクされているレベルよりも高くて受け付けていない割り込みがあるとき 3578: if (XEiJ.MPU_INTERRUPT_SWITCH) { 3579: switch (t) { 3580: case 0b00000001: 3581: case 0b00000011: 3582: case 0b00000101: 3583: case 0b00000111: 3584: case 0b00001001: 3585: case 0b00001011: 3586: case 0b00001101: 3587: case 0b00001111: 3588: case 0b00010001: 3589: case 0b00010011: 3590: case 0b00010101: 3591: case 0b00010111: 3592: case 0b00011001: 3593: case 0b00011011: 3594: case 0b00011101: 3595: case 0b00011111: 3596: case 0b00100001: 3597: case 0b00100011: 3598: case 0b00100101: 3599: case 0b00100111: 3600: case 0b00101001: 3601: case 0b00101011: 3602: case 0b00101101: 3603: case 0b00101111: 3604: case 0b00110001: 3605: case 0b00110011: 3606: case 0b00110101: 3607: case 0b00110111: 3608: case 0b00111001: 3609: case 0b00111011: 3610: case 0b00111101: 3611: case 0b00111111: 3612: case 0b01000001: 3613: case 0b01000011: 3614: case 0b01000101: 3615: case 0b01000111: 3616: case 0b01001001: 3617: case 0b01001011: 3618: case 0b01001101: 3619: case 0b01001111: 3620: case 0b01010001: 3621: case 0b01010011: 3622: case 0b01010101: 3623: case 0b01010111: 3624: case 0b01011001: 3625: case 0b01011011: 3626: case 0b01011101: 3627: case 0b01011111: 3628: case 0b01100001: 3629: case 0b01100011: 3630: case 0b01100101: 3631: case 0b01100111: 3632: case 0b01101001: 3633: case 0b01101011: 3634: case 0b01101101: 3635: case 0b01101111: 3636: case 0b01110001: 3637: case 0b01110011: 3638: case 0b01110101: 3639: case 0b01110111: 3640: case 0b01111001: 3641: case 0b01111011: 3642: case 0b01111101: 3643: case 0b01111111: 3644: case 0b10000001: 3645: case 0b10000011: 3646: case 0b10000101: 3647: case 0b10000111: 3648: case 0b10001001: 3649: case 0b10001011: 3650: case 0b10001101: 3651: case 0b10001111: 3652: case 0b10010001: 3653: case 0b10010011: 3654: case 0b10010101: 3655: case 0b10010111: 3656: case 0b10011001: 3657: case 0b10011011: 3658: case 0b10011101: 3659: case 0b10011111: 3660: case 0b10100001: 3661: case 0b10100011: 3662: case 0b10100101: 3663: case 0b10100111: 3664: case 0b10101001: 3665: case 0b10101011: 3666: case 0b10101101: 3667: case 0b10101111: 3668: case 0b10110001: 3669: case 0b10110011: 3670: case 0b10110101: 3671: case 0b10110111: 3672: case 0b10111001: 3673: case 0b10111011: 3674: case 0b10111101: 3675: case 0b10111111: 3676: case 0b11000001: 3677: case 0b11000011: 3678: case 0b11000101: 3679: case 0b11000111: 3680: case 0b11001001: 3681: case 0b11001011: 3682: case 0b11001101: 3683: case 0b11001111: 3684: case 0b11010001: 3685: case 0b11010011: 3686: case 0b11010101: 3687: case 0b11010111: 3688: case 0b11011001: 3689: case 0b11011011: 3690: case 0b11011101: 3691: case 0b11011111: 3692: case 0b11100001: 3693: case 0b11100011: 3694: case 0b11100101: 3695: case 0b11100111: 3696: case 0b11101001: 3697: case 0b11101011: 3698: case 0b11101101: 3699: case 0b11101111: 3700: case 0b11110001: 3701: case 0b11110011: 3702: case 0b11110101: 3703: case 0b11110111: 3704: case 0b11111001: 3705: case 0b11111011: 3706: case 0b11111101: 3707: case 0b11111111: 3708: //レベル7 3709: XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みを受け付ける 3710: if ((t = XEiJ.sysAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3711: irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL); //割り込み処理を開始する 3712: } 3713: break; 3714: case 0b00000010: 3715: case 0b00000110: 3716: case 0b00001010: 3717: case 0b00001110: 3718: case 0b00010010: 3719: case 0b00010110: 3720: case 0b00011010: 3721: case 0b00011110: 3722: case 0b00100010: 3723: case 0b00100110: 3724: case 0b00101010: 3725: case 0b00101110: 3726: case 0b00110010: 3727: case 0b00110110: 3728: case 0b00111010: 3729: case 0b00111110: 3730: case 0b01000010: 3731: case 0b01000110: 3732: case 0b01001010: 3733: case 0b01001110: 3734: case 0b01010010: 3735: case 0b01010110: 3736: case 0b01011010: 3737: case 0b01011110: 3738: case 0b01100010: 3739: case 0b01100110: 3740: case 0b01101010: 3741: case 0b01101110: 3742: case 0b01110010: 3743: case 0b01110110: 3744: case 0b01111010: 3745: case 0b01111110: 3746: case 0b10000010: 3747: case 0b10000110: 3748: case 0b10001010: 3749: case 0b10001110: 3750: case 0b10010010: 3751: case 0b10010110: 3752: case 0b10011010: 3753: case 0b10011110: 3754: case 0b10100010: 3755: case 0b10100110: 3756: case 0b10101010: 3757: case 0b10101110: 3758: case 0b10110010: 3759: case 0b10110110: 3760: case 0b10111010: 3761: case 0b10111110: 3762: case 0b11000010: 3763: case 0b11000110: 3764: case 0b11001010: 3765: case 0b11001110: 3766: case 0b11010010: 3767: case 0b11010110: 3768: case 0b11011010: 3769: case 0b11011110: 3770: case 0b11100010: 3771: case 0b11100110: 3772: case 0b11101010: 3773: case 0b11101110: 3774: case 0b11110010: 3775: case 0b11110110: 3776: case 0b11111010: 3777: case 0b11111110: 3778: //レベル6 3779: XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK; //割り込みを受け付ける 3780: if ((t = MC68901.mfpAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3781: irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL); //割り込み処理を開始する 3782: } 3783: break; 3784: case 0b00000100: 3785: case 0b00001100: 3786: case 0b00010100: 3787: case 0b00011100: 3788: case 0b00100100: 3789: case 0b00101100: 3790: case 0b00110100: 3791: case 0b00111100: 3792: case 0b01000100: 3793: case 0b01001100: 3794: case 0b01010100: 3795: case 0b01011100: 3796: case 0b01100100: 3797: case 0b01101100: 3798: case 0b01110100: 3799: case 0b01111100: 3800: case 0b10000100: 3801: case 0b10001100: 3802: case 0b10010100: 3803: case 0b10011100: 3804: case 0b10100100: 3805: case 0b10101100: 3806: case 0b10110100: 3807: case 0b10111100: 3808: case 0b11000100: 3809: case 0b11001100: 3810: case 0b11010100: 3811: case 0b11011100: 3812: case 0b11100100: 3813: case 0b11101100: 3814: case 0b11110100: 3815: case 0b11111100: 3816: //レベル5 3817: XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK; //割り込みを受け付ける 3818: if ((t = Z8530.sccAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3819: irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL); //割り込み処理を開始する 3820: } 3821: break; 3822: case 0b00010000: 3823: case 0b00110000: 3824: case 0b01010000: 3825: case 0b01110000: 3826: case 0b10010000: 3827: case 0b10110000: 3828: case 0b11010000: 3829: case 0b11110000: 3830: //レベル3 3831: XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK; //割り込みを受け付ける 3832: if ((t = HD63450.dmaAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3833: irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL); //割り込み処理を開始する 3834: } 3835: break; 3836: case 0b00100000: 3837: case 0b01100000: 3838: case 0b10100000: 3839: case 0b11100000: 3840: //レベル2 3841: XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK; //割り込みを受け付ける 3842: if ((t = XEiJ.eb2Acknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3843: irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL); //割り込み処理を開始する 3844: } 3845: break; 3846: case 0b01000000: 3847: case 0b11000000: 3848: //レベル1 3849: XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK; //割り込みを受け付ける 3850: if ((t = IOInterrupt.ioiAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3851: irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL); //割り込み処理を開始する 3852: } 3853: break; 3854: } 3855: } else { 3856: t &= -t; 3857: // x&=-xはxの最下位の1のビットだけを残す演算 3858: // すなわちマスクされているレベルよりも高くて受け付けていない割り込みの中で最高レベルの割り込みのビットだけが残る 3859: // 最高レベルの割り込みのビットしか残っていないので、割り込みの有無をレベルの高い順ではなく使用頻度の高い順に調べられる 3860: // MFPやDMAの割り込みがかかる度にそれより優先度の高いインタラプトスイッチが押されていないかどうかを確かめる必要がない 3861: if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) { 3862: XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK; //割り込みを受け付ける 3863: if ((t = MC68901.mfpAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3864: irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL); //割り込み処理を開始する 3865: } 3866: } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) { 3867: XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK; //割り込みを受け付ける 3868: if ((t = HD63450.dmaAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3869: irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL); //割り込み処理を開始する 3870: } 3871: } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) { 3872: XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK; //割り込みを受け付ける 3873: if ((t = Z8530.sccAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3874: irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL); //割り込み処理を開始する 3875: } 3876: } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) { 3877: XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK; //割り込みを受け付ける 3878: if ((t = IOInterrupt.ioiAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3879: irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL); //割り込み処理を開始する 3880: } 3881: } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) { 3882: XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK; //割り込みを受け付ける 3883: if ((t = XEiJ.eb2Acknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3884: irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL); //割り込み処理を開始する 3885: } 3886: } else if (t == XEiJ.MPU_SYS_INTERRUPT_MASK) { 3887: XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みを受け付ける 3888: if ((t = XEiJ.sysAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3889: irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL); //割り込み処理を開始する 3890: } 3891: } 3892: } 3893: } //if t!=0 3894: if (MC68901.MFP_DELAYED_INTERRUPT) { 3895: XEiJ.mpuIRR |= XEiJ.mpuDIRR; //遅延割り込み要求 3896: XEiJ.mpuDIRR = 0; 3897: } 3898: } //命令ループ 3899: } catch (M68kException e) { 3900: if (M68kException.m6eNumber < 0) { //命令ブレークポイントによる停止 3901: XEiJ.regPC = XEiJ.regPC0; 3902: XEiJ.mpuStop1 (null); //"Instruction Break Point" 3903: break errorLoop; 3904: } 3905: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount; 3906: //例外処理 3907: // ここで処理するのはベクタ番号が2~31の例外に限る。TRAP #n命令はインライン展開する 3908: // 使用頻度が高いと思われる例外はインライン展開するのでここには来ない 3909: // 例外処理をインライン展開する場合はMC68000とMC68030のコードを分けなければならずコードが冗長になる 3910: // 使用頻度が低いと思われる例外はインライン展開しない 3911: // セーブされるpcは以下の例外は命令の先頭、これ以外は次の命令 3912: // 2 BUS_ERROR 3913: // 3 ADDRESS_ERROR 3914: // 4 ILLEGAL_INSTRUCTION 3915: // 8 PRIVILEGE_VIOLATION 3916: // 10 LINE_1010_EMULATOR 3917: // 11 LINE_1111_EMULATOR 3918: // fedcba9876543210fedcba9876543210 3919: //if ((1 << M68kException.m6eNumber & 0b00000000000000000000110100011100) != 0) { 3920: // 0123456789abcdef0123456789abcdef 3921: if (0b00111000101100000000000000000000 << M68kException.m6eNumber < 0) { 3922: XEiJ.regPC = XEiJ.regPC0; //セーブされるpcは命令の先頭 3923: } 3924: try { 3925: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 3926: int sp = XEiJ.regRn[15]; 3927: XEiJ.regSRT1 = 0; //srのTビットを消す 3928: if (XEiJ.regSRS == 0) { //ユーザモードのとき 3929: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 3930: XEiJ.mpuUSP = sp; //USPを保存 3931: sp = XEiJ.mpuISP; //SSPを復元 3932: if (DataBreakPoint.DBP_ON) { 3933: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 3934: } else { 3935: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 3936: } 3937: if (InstructionBreakPoint.IBP_ON) { 3938: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 3939: } 3940: } 3941: if (M68kException.m6eNumber <= M68kException.M6E_ADDRESS_ERROR) { //バスエラーまたはアドレスエラー 3942: //ホストファイルシステムのデバイスコマンドを強制終了させる 3943: HFS.hfsState = HFS.HFS_STATE_IDLE; 3944: XEiJ.mpuClockTime += 50 * XEiJ.mpuModifiedUnit; 3945: XEiJ.regRn[15] = sp -= 14; 3946: XEiJ.busWl (sp + 10, XEiJ.regPC); //pushl。pcをプッシュする 3947: XEiJ.busWw (sp + 8, save_sr); //pushw。srをプッシュする 3948: XEiJ.busWw (sp + 6, XEiJ.regOC); //instruction register。バスエラーまたはアドレスエラーを発生させた命令の命令コード。アドレスを特定するときに使う 3949: XEiJ.busWl (sp + 2, M68kException.m6eAddress); //access address 3950: XEiJ.busWw (sp, M68kException.m6eDirection << 4); //r/w,i/n,fc。r/wのみ 3951: } else { 3952: XEiJ.regRn[15] = sp -= 6; 3953: XEiJ.busWl (sp + 2, XEiJ.regPC); //pushl。pcをプッシュする 3954: XEiJ.busWw (sp, save_sr); //pushw。srをプッシュする 3955: } 3956: irpSetPC (XEiJ.busRlsf (M68kException.m6eNumber << 2)); //例外ベクタを取り出してジャンプする 3957: if (XEiJ.dbgStopOnError) { //エラーで停止する場合 3958: if (XEiJ.dbgDoStopOnError ()) { 3959: break errorLoop; 3960: } 3961: } 3962: } catch (M68kException ee) { //ダブルバスフォルト 3963: XEiJ.dbgDoubleBusFault (); 3964: break errorLoop; 3965: } 3966: } //catch M68kException 3967: } //例外ループ 3968: 3969: // 通常 3970: // pc0 最後に実行した命令 3971: // pc 次に実行する命令 3972: // バスエラー、アドレスエラー、不当命令、特権違反で停止したとき 3973: // pc0 エラーを発生させた命令 3974: // pc 例外処理ルーチンの先頭 3975: // ダブルバスフォルトで停止したとき 3976: // pc0 エラーを発生させた命令 3977: // pc エラーを発生させた命令 3978: // 命令ブレークポイントで停止したとき 3979: // pc0 命令ブレークポイントが設定された、次に実行する命令 3980: // pc 命令ブレークポイントが設定された、次に実行する命令 3981: // データブレークポイントで停止したとき 3982: // pc0 データを書き換えた、最後に実行した命令 3983: // pc 次に実行する命令 3984: 3985: //分岐ログに停止レコードを記録する 3986: if (BranchLog.BLG_ON) { 3987: //BranchLog.blgStop (); 3988: int i = (char) BranchLog.blgNewestRecord << BranchLog.BLG_RECORD_SHIFT; 3989: BranchLog.blgArray[i] = BranchLog.blgHead | BranchLog.blgSuper; 3990: BranchLog.blgArray[i + 1] = XEiJ.regPC; //次に実行する命令 3991: } 3992: 3993: } //mpuCore() 3994: 3995: 3996: 3997: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3998: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3999: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4000: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4001: //ORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_000_mmm_rrr-{data} 4002: //OR.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_000_mmm_rrr-{data} [ORI.B #<data>,<ea>] 4003: //ORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_000_000_111_100-{data} 4004: public static void irpOriByte () throws M68kException { 4005: int ea = XEiJ.regOC & 63; 4006: int z; 4007: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4008: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4009: } else { 4010: z = XEiJ.regPC; 4011: XEiJ.regPC = z + 2; 4012: z = XEiJ.busRbs (z + 1); //pcbs 4013: } 4014: if (ea < XEiJ.EA_AR) { //ORI.B #<data>,Dr 4015: if (XEiJ.DBG_ORI_BYTE_ZERO_D0) { 4016: if (z == 0 && ea == 0 && XEiJ.dbgOriByteZeroD0) { //ORI.B #$00,D0 4017: XEiJ.mpuCycleCount += 34; 4018: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4019: throw M68kException.m6eSignal; 4020: } 4021: } 4022: XEiJ.mpuCycleCount += 8; 4023: z = XEiJ.regRn[ea] |= 255 & z; //0拡張してからOR 4024: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4025: } else if (ea == XEiJ.EA_IM) { //ORI.B #<data>,CCR 4026: XEiJ.mpuCycleCount += 20; 4027: XEiJ.regCCR |= XEiJ.REG_CCR_MASK & z; 4028: } else { //ORI.B #<data>,<mem> 4029: XEiJ.mpuCycleCount += 12; 4030: int a = efaMltByte (ea); 4031: XEiJ.busWb (a, z |= XEiJ.busRbs (a)); 4032: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4033: } 4034: } //irpOriByte 4035: 4036: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4037: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4038: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4039: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4040: //ORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_001_mmm_rrr-{data} 4041: //OR.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_001_mmm_rrr-{data} [ORI.W #<data>,<ea>] 4042: //ORI.W #<data>,SR |-|012346|P|*****|*****| |0000_000_001_111_100-{data} 4043: public static void irpOriWord () throws M68kException { 4044: int ea = XEiJ.regOC & 63; 4045: if (ea < XEiJ.EA_AR) { //ORI.W #<data>,Dr 4046: int z; 4047: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4048: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4049: } else { 4050: z = XEiJ.regPC; 4051: XEiJ.regPC = z + 2; 4052: z = XEiJ.busRwse (z); //pcws 4053: } 4054: XEiJ.mpuCycleCount += 8; 4055: z = XEiJ.regRn[ea] |= (char) z; //0拡張してからOR 4056: 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 4057: } else if (ea == XEiJ.EA_IM) { //ORI.W #<data>,SR 4058: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4059: XEiJ.mpuCycleCount += 34; 4060: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4061: throw M68kException.m6eSignal; 4062: } 4063: //以下はスーパーバイザモード 4064: XEiJ.mpuCycleCount += 20; 4065: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4066: irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4067: } else { 4068: int t = XEiJ.regPC; 4069: XEiJ.regPC = t + 2; 4070: irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4071: } 4072: } else { //ORI.W #<data>,<mem> 4073: int z; 4074: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4075: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4076: } else { 4077: z = XEiJ.regPC; 4078: XEiJ.regPC = z + 2; 4079: z = XEiJ.busRwse (z); //pcws 4080: } 4081: XEiJ.mpuCycleCount += 12; 4082: int a = efaMltWord (ea); 4083: XEiJ.busWw (a, z |= XEiJ.busRws (a)); 4084: 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 4085: } 4086: } //irpOriWord 4087: 4088: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4089: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4090: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4091: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4092: //ORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_010_mmm_rrr-{data} 4093: //OR.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_010_mmm_rrr-{data} [ORI.L #<data>,<ea>] 4094: public static void irpOriLong () throws M68kException { 4095: int ea = XEiJ.regOC & 63; 4096: int y; 4097: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4098: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4099: } else { 4100: y = XEiJ.regPC; 4101: XEiJ.regPC = y + 4; 4102: y = XEiJ.busRlse (y); //pcls 4103: } 4104: int z; 4105: if (ea < XEiJ.EA_AR) { //ORI.L #<data>,Dr 4106: XEiJ.mpuCycleCount += 16; 4107: z = XEiJ.regRn[ea] |= y; 4108: } else { //ORI.L #<data>,<mem> 4109: XEiJ.mpuCycleCount += 20; 4110: int a = efaMltLong (ea); 4111: XEiJ.busWl (a, z = XEiJ.busRls (a) | y); 4112: } 4113: 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 4114: } //irpOriLong 4115: 4116: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4117: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4118: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4119: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4120: //BITREV.L Dr |-|------|-|-----|-----|D |0000_000_011_000_rrr (ISA_C) 4121: // 4122: //BITREV.L Dr 4123: // Drのビットの並びを逆順にする。CCRは変化しない 4124: public static void irpCmp2Chk2Byte () throws M68kException { 4125: int ea = XEiJ.regOC & 63; 4126: if (ea < XEiJ.EA_AR) { //BITREV.L Dr 4127: XEiJ.mpuCycleCount += 4; 4128: if (XEiJ.IRP_BITREV_REVERSE) { //2.83ns 0x0f801f3c 4129: XEiJ.regRn[ea] = Integer.reverse (XEiJ.regRn[ea]); 4130: } else if (XEiJ.IRP_BITREV_SHIFT) { //2.57ns 0x0f801f3c 4131: int x = XEiJ.regRn[ea]; 4132: x = x << 16 | x >>> 16; 4133: x = x << 8 & 0xff00ff00 | x >>> 8 & 0x00ff00ff; 4134: x = x << 4 & 0xf0f0f0f0 | x >>> 4 & 0x0f0f0f0f; 4135: x = x << 2 & 0xcccccccc | x >>> 2 & 0x33333333; 4136: XEiJ.regRn[ea] = x << 1 & 0xaaaaaaaa | x >>> 1 & 0x55555555; 4137: } else if (XEiJ.IRP_BITREV_TABLE) { //1.57ns 0x0f801f3c 4138: int x = XEiJ.regRn[ea]; 4139: 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]; 4140: } 4141: } else { //CMP2/CHK2.B <ea>,Rn 4142: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4143: XEiJ.mpuCycleCount += 34; 4144: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4145: throw M68kException.m6eSignal; 4146: } 4147: } //irpCmp2Chk2Byte 4148: 4149: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4150: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4151: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4152: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4153: //BTST.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_100_000_rrr 4154: //MOVEP.W (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_100_001_rrr-{data} 4155: //BTST.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZPI|0000_qqq_100_mmm_rrr 4156: public static void irpBtstReg () throws M68kException { 4157: int ea = XEiJ.regOC & 63; 4158: int qqq = XEiJ.regOC >> 9; //qqq 4159: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.W (d16,Ar),Dq 4160: XEiJ.mpuCycleCount += 16; 4161: int a; 4162: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4163: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4164: } else { 4165: a = XEiJ.regPC; 4166: XEiJ.regPC = a + 2; 4167: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4168: } 4169: XEiJ.regRn[qqq] = ~0xffff & XEiJ.regRn[qqq] | XEiJ.busRbz (a) << 8 | XEiJ.busRbz (a + 2); //Javaは評価順序が保証されている 4170: } else { //BTST.L Dq,Dr/<ea> 4171: int y = XEiJ.regRn[qqq]; 4172: if (ea < XEiJ.EA_AR) { //BTST.L Dq,Dr 4173: XEiJ.mpuCycleCount += 6; 4174: 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を省略 4175: } else { //BTST.B Dq,<ea> 4176: XEiJ.mpuCycleCount += 4; 4177: 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 4178: } 4179: } 4180: } //irpBtstReg 4181: 4182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4183: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4184: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4185: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4186: //BCHG.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_101_000_rrr 4187: //MOVEP.L (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_101_001_rrr-{data} 4188: //BCHG.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_101_mmm_rrr 4189: public static void irpBchgReg () throws M68kException { 4190: int ea = XEiJ.regOC & 63; 4191: int qqq = XEiJ.regOC >> 9; //qqq 4192: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.L (d16,Ar),Dq 4193: XEiJ.mpuCycleCount += 24; 4194: int a; 4195: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4196: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4197: } else { 4198: a = XEiJ.regPC; 4199: XEiJ.regPC = a + 2; 4200: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4201: } 4202: XEiJ.regRn[qqq] = XEiJ.busRbs (a) << 24 | XEiJ.busRbz (a + 2) << 16 | XEiJ.busRbz (a + 4) << 8 | XEiJ.busRbz (a + 6); //Javaは評価順序が保証されている 4203: } else { //BCHG.L Dq,Dr/<ea> 4204: int x; 4205: int y = XEiJ.regRn[qqq]; 4206: if (ea < XEiJ.EA_AR) { //BCHG.L Dq,Dr 4207: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4208: XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8; //(0xffff&y)!=0 4209: } else { //BCHG.B Dq,<ea> 4210: XEiJ.mpuCycleCount += 8; 4211: int a = efaMltByte (ea); 4212: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7))); 4213: } 4214: 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 4215: } 4216: } //irpBchgReg 4217: 4218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4219: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4220: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4222: //BCLR.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_110_000_rrr 4223: //MOVEP.W Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_110_001_rrr-{data} 4224: //BCLR.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_110_mmm_rrr 4225: public static void irpBclrReg () throws M68kException { 4226: int ea = XEiJ.regOC & 63; 4227: int y = XEiJ.regRn[XEiJ.regOC >> 9]; //qqq 4228: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.W Dq,(d16,Ar) 4229: XEiJ.mpuCycleCount += 16; 4230: int a; 4231: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4232: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4233: } else { 4234: a = XEiJ.regPC; 4235: XEiJ.regPC = a + 2; 4236: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4237: } 4238: XEiJ.busWb (a, y >> 8); 4239: XEiJ.busWb (a + 2, y); 4240: } else { //BCLR.L Dq,Dr/<ea> 4241: int x; 4242: if (ea < XEiJ.EA_AR) { //BCLR.L Dq,Dr 4243: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4244: XEiJ.mpuCycleCount += (char) y != 0 ? 8 : 10; //(0xffff&y)!=0 4245: } else { //BCLR.B Dq,<ea> 4246: XEiJ.mpuCycleCount += 8; 4247: int a = efaMltByte (ea); 4248: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7))); 4249: } 4250: 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 4251: } 4252: } //irpBclrReg 4253: 4254: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4255: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4256: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4257: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4258: //BSET.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_111_000_rrr 4259: //MOVEP.L Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_111_001_rrr-{data} 4260: //BSET.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_111_mmm_rrr 4261: public static void irpBsetReg () throws M68kException { 4262: int ea = XEiJ.regOC & 63; 4263: int y = XEiJ.regRn[XEiJ.regOC >> 9]; //qqq 4264: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.L Dq,(d16,Ar) 4265: XEiJ.mpuCycleCount += 24; 4266: int a; 4267: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4268: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4269: } else { 4270: a = XEiJ.regPC; 4271: XEiJ.regPC = a + 2; 4272: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4273: } 4274: XEiJ.busWb (a, y >> 24); 4275: XEiJ.busWb (a + 2, y >> 16); 4276: XEiJ.busWb (a + 4, y >> 8); 4277: XEiJ.busWb (a + 6, y); 4278: } else { //BSET.L Dq,Dr/<ea> 4279: int x; 4280: if (ea < XEiJ.EA_AR) { //BSET.L Dq,Dr 4281: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4282: XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8; //(0xffff&y)!=0 4283: } else { //BSET.B Dq,<ea> 4284: XEiJ.mpuCycleCount += 8; 4285: int a = efaMltByte (ea); 4286: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7))); 4287: } 4288: 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 4289: } 4290: } //irpBsetReg 4291: 4292: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4293: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4294: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4295: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4296: //ANDI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_000_mmm_rrr-{data} 4297: //AND.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_000_mmm_rrr-{data} [ANDI.B #<data>,<ea>] 4298: //ANDI.B #<data>,CCR |-|012346|-|*****|*****| |0000_001_000_111_100-{data} 4299: public static void irpAndiByte () throws M68kException { 4300: int ea = XEiJ.regOC & 63; 4301: int z; 4302: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4303: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4304: } else { 4305: z = XEiJ.regPC; 4306: XEiJ.regPC = z + 2; 4307: z = XEiJ.busRbs (z + 1); //pcbs 4308: } 4309: if (ea < XEiJ.EA_AR) { //ANDI.B #<data>,Dr 4310: XEiJ.mpuCycleCount += 8; 4311: z = XEiJ.regRn[ea] &= ~255 | z; //1拡張してからAND 4312: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4313: } else if (ea == XEiJ.EA_IM) { //ANDI.B #<data>,CCR 4314: XEiJ.mpuCycleCount += 20; 4315: XEiJ.regCCR &= z; 4316: } else { //ANDI.B #<data>,<mem> 4317: XEiJ.mpuCycleCount += 12; 4318: int a = efaMltByte (ea); 4319: XEiJ.busWb (a, z &= XEiJ.busRbs (a)); 4320: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4321: } 4322: } //irpAndiByte 4323: 4324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4325: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4326: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4327: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4328: //ANDI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_001_mmm_rrr-{data} 4329: //AND.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_001_mmm_rrr-{data} [ANDI.W #<data>,<ea>] 4330: //ANDI.W #<data>,SR |-|012346|P|*****|*****| |0000_001_001_111_100-{data} 4331: public static void irpAndiWord () throws M68kException { 4332: int ea = XEiJ.regOC & 63; 4333: if (ea < XEiJ.EA_AR) { //ANDI.W #<data>,Dr 4334: int z; 4335: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4336: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4337: } else { 4338: z = XEiJ.regPC; 4339: XEiJ.regPC = z + 2; 4340: z = XEiJ.busRwse (z); //pcws 4341: } 4342: XEiJ.mpuCycleCount += 8; 4343: z = XEiJ.regRn[ea] &= ~65535 | z; //1拡張してからAND 4344: 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 4345: } else if (ea == XEiJ.EA_IM) { //ANDI.W #<data>,SR 4346: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4347: XEiJ.mpuCycleCount += 34; 4348: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4349: throw M68kException.m6eSignal; 4350: } 4351: //以下はスーパーバイザモード 4352: XEiJ.mpuCycleCount += 20; 4353: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4354: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4355: } else { 4356: int t = XEiJ.regPC; 4357: XEiJ.regPC = t + 2; 4358: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4359: } 4360: } else { //ANDI.W #<data>,<mem> 4361: int z; 4362: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4363: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4364: } else { 4365: z = XEiJ.regPC; 4366: XEiJ.regPC = z + 2; 4367: z = XEiJ.busRwse (z); //pcws 4368: } 4369: XEiJ.mpuCycleCount += 12; 4370: int a = efaMltWord (ea); 4371: XEiJ.busWw (a, z &= XEiJ.busRws (a)); 4372: 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 4373: } 4374: } //irpAndiWord 4375: 4376: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4377: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4378: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4379: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4380: //ANDI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_010_mmm_rrr-{data} 4381: //AND.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_010_mmm_rrr-{data} [ANDI.L #<data>,<ea>] 4382: public static void irpAndiLong () throws M68kException { 4383: int ea = XEiJ.regOC & 63; 4384: int y; 4385: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4386: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4387: } else { 4388: y = XEiJ.regPC; 4389: XEiJ.regPC = y + 4; 4390: y = XEiJ.busRlse (y); //pcls 4391: } 4392: int z; 4393: if (ea < XEiJ.EA_AR) { //ANDI.L #<data>,Dr 4394: XEiJ.mpuCycleCount += 16; 4395: z = XEiJ.regRn[ea] &= y; 4396: } else { //ANDI.L #<data>,<mem> 4397: XEiJ.mpuCycleCount += 20; 4398: int a = efaMltLong (ea); 4399: XEiJ.busWl (a, z = XEiJ.busRls (a) & y); 4400: } 4401: 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 4402: } //irpAndiLong 4403: 4404: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4405: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4406: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4407: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4408: //BYTEREV.L Dr |-|------|-|-----|-----|D |0000_001_011_000_rrr (ISA_C) 4409: // 4410: //BYTEREV.L Dr 4411: // Drのバイトの並びを逆順にする。CCRは変化しない 4412: public static void irpCmp2Chk2Word () throws M68kException { 4413: int ea = XEiJ.regOC & 63; 4414: if (ea < XEiJ.EA_AR) { //BYTEREV.L Dr 4415: XEiJ.mpuCycleCount += 4; 4416: if (true) { //0.10ns-0.18ns 0x782750ec 4417: XEiJ.regRn[ea] = Integer.reverseBytes (XEiJ.regRn[ea]); 4418: } else { //1.06ns 0x782750ec 4419: int x = XEiJ.regRn[ea]; 4420: XEiJ.regRn[ea] = x << 24 | x << 8 & 0x00ff0000 | x >>> 8 & 0x0000ff00 | x >>> 24; 4421: } 4422: } else { //CMP2/CHK2.W <ea>,Rn 4423: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4424: XEiJ.mpuCycleCount += 34; 4425: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4426: throw M68kException.m6eSignal; 4427: } 4428: } //irpCmp2Chk2Word 4429: 4430: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4431: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4432: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4433: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4434: //SUBI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_000_mmm_rrr-{data} 4435: //SUB.B #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_000_mmm_rrr-{data} [SUBI.B #<data>,<ea>] 4436: public static void irpSubiByte () throws M68kException { 4437: int ea = XEiJ.regOC & 63; 4438: int x; 4439: int y; 4440: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4441: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4442: } else { 4443: y = XEiJ.regPC; 4444: XEiJ.regPC = y + 2; 4445: y = XEiJ.busRbs (y + 1); //pcbs 4446: } 4447: int z; 4448: if (ea < XEiJ.EA_AR) { //SUBI.B #<data>,Dr 4449: XEiJ.mpuCycleCount += 8; 4450: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y); 4451: } else { //SUBI.B #<data>,<mem> 4452: XEiJ.mpuCycleCount += 12; 4453: int a = efaMltByte (ea); 4454: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y)); 4455: } 4456: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4457: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4458: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4459: } //irpSubiByte 4460: 4461: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4462: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4463: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4464: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4465: //SUBI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_001_mmm_rrr-{data} 4466: //SUB.W #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_001_mmm_rrr-{data} [SUBI.W #<data>,<ea>] 4467: public static void irpSubiWord () throws M68kException { 4468: int ea = XEiJ.regOC & 63; 4469: int x; 4470: int y; 4471: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4472: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4473: } else { 4474: y = XEiJ.regPC; 4475: XEiJ.regPC = y + 2; 4476: y = XEiJ.busRwse (y); //pcws 4477: } 4478: int z; 4479: if (ea < XEiJ.EA_AR) { //SUBI.W #<data>,Dr 4480: XEiJ.mpuCycleCount += 8; 4481: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y)); 4482: } else { //SUBI.W #<data>,<mem> 4483: XEiJ.mpuCycleCount += 12; 4484: int a = efaMltWord (ea); 4485: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y)); 4486: } 4487: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4488: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4489: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4490: } //irpSubiWord 4491: 4492: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4493: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4494: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4495: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4496: //SUBI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_010_mmm_rrr-{data} 4497: //SUB.L #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_010_mmm_rrr-{data} [SUBI.L #<data>,<ea>] 4498: public static void irpSubiLong () throws M68kException { 4499: int ea = XEiJ.regOC & 63; 4500: int x; 4501: int y; 4502: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4503: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4504: } else { 4505: y = XEiJ.regPC; 4506: XEiJ.regPC = y + 4; 4507: y = XEiJ.busRlse (y); //pcls 4508: } 4509: int z; 4510: if (ea < XEiJ.EA_AR) { //SUBI.L #<data>,Dr 4511: XEiJ.mpuCycleCount += 16; 4512: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y; 4513: } else { //SUBI.L #<data>,<mem> 4514: XEiJ.mpuCycleCount += 20; 4515: int a = efaMltLong (ea); 4516: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y); 4517: } 4518: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4519: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4520: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4521: } //irpSubiLong 4522: 4523: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4524: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4525: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4526: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4527: //FF1.L Dr |-|------|-|-UUUU|-**00|D |0000_010_011_000_rrr (ISA_C) 4528: // 4529: //FF1.L Dr 4530: // Drの最上位の1のbit31からのオフセットをDrに格納する 4531: // Drが0のときは32になる 4532: public static void irpCmp2Chk2Long () throws M68kException { 4533: int ea = XEiJ.regOC & 63; 4534: if (ea < XEiJ.EA_AR) { //FF1.L Dr 4535: XEiJ.mpuCycleCount += 4; 4536: int z = XEiJ.regRn[ea]; 4537: if (true) { 4538: XEiJ.regRn[ea] = Integer.numberOfLeadingZeros (z); 4539: } else { 4540: if (z == 0) { 4541: XEiJ.regRn[ea] = 32; 4542: } else { 4543: int k = -(z >>> 16) >> 16 & 16; 4544: k += -(z >>> k + 8) >> 8 & 8; 4545: k += -(z >>> k + 4) >> 4 & 4; 4546: // bit3 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4547: // bit2 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 4548: // bit1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 4549: // bit0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 4550: 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だけが使用される 4551: } 4552: } 4553: 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 4554: } else { //CMP2/CHK2.L <ea>,Rn 4555: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4556: XEiJ.mpuCycleCount += 34; 4557: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4558: throw M68kException.m6eSignal; 4559: } 4560: } //irpCmp2Chk2Long 4561: 4562: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4563: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4564: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4565: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4566: //ADDI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_000_mmm_rrr-{data} 4567: public static void irpAddiByte () throws M68kException { 4568: int ea = XEiJ.regOC & 63; 4569: int x; 4570: int y; 4571: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4572: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4573: } else { 4574: y = XEiJ.regPC; 4575: XEiJ.regPC = y + 2; 4576: y = XEiJ.busRbs (y + 1); //pcbs 4577: } 4578: int z; 4579: if (ea < XEiJ.EA_AR) { //ADDI.B #<data>,Dr 4580: XEiJ.mpuCycleCount += 8; 4581: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y); 4582: } else { //ADDI.B #<data>,<mem> 4583: XEiJ.mpuCycleCount += 12; 4584: int a = efaMltByte (ea); 4585: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y)); 4586: } 4587: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4588: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4589: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4590: } //irpAddiByte 4591: 4592: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4593: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4594: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4595: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4596: //ADDI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_001_mmm_rrr-{data} 4597: public static void irpAddiWord () throws M68kException { 4598: int ea = XEiJ.regOC & 63; 4599: int x; 4600: int y; 4601: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4602: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4603: } else { 4604: y = XEiJ.regPC; 4605: XEiJ.regPC = y + 2; 4606: y = XEiJ.busRwse (y); //pcws 4607: } 4608: int z; 4609: if (ea < XEiJ.EA_AR) { //ADDI.W #<data>,Dr 4610: XEiJ.mpuCycleCount += 8; 4611: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y)); 4612: } else { //ADDI.W #<data>,<mem> 4613: XEiJ.mpuCycleCount += 12; 4614: int a = efaMltWord (ea); 4615: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y)); 4616: } 4617: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4618: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4619: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4620: } //irpAddiWord 4621: 4622: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4623: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4624: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4625: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4626: //ADDI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_010_mmm_rrr-{data} 4627: public static void irpAddiLong () throws M68kException { 4628: int ea = XEiJ.regOC & 63; 4629: int x; 4630: int y; 4631: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4632: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4633: } else { 4634: y = XEiJ.regPC; 4635: XEiJ.regPC = y + 4; 4636: y = XEiJ.busRlse (y); //pcls 4637: } 4638: int z; 4639: if (ea < XEiJ.EA_AR) { //ADDI.L #<data>,Dr 4640: XEiJ.mpuCycleCount += 16; 4641: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y; 4642: } else { //ADDI.L #<data>,<mem> 4643: XEiJ.mpuCycleCount += 20; 4644: int a = efaMltLong (ea); 4645: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y); 4646: } 4647: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4648: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4649: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4650: } //irpAddiLong 4651: 4652: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4653: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4654: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4655: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4656: //BTST.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_000_000_rrr-{data} 4657: //BTST.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZP |0000_100_000_mmm_rrr-{data} 4658: public static void irpBtstImm () throws M68kException { 4659: int ea = XEiJ.regOC & 63; 4660: int y; 4661: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4662: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4663: } else { 4664: y = XEiJ.regPC; 4665: XEiJ.regPC = y + 2; 4666: y = XEiJ.busRbs (y + 1); //pcbs 4667: } 4668: if (ea < XEiJ.EA_AR) { //BTST.L #<data>,Dr 4669: XEiJ.mpuCycleCount += 10; 4670: 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を省略 4671: } else { //BTST.B #<data>,<ea> 4672: XEiJ.mpuCycleCount += 8; 4673: 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 4674: } 4675: } //irpBtstImm 4676: 4677: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4678: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4679: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4680: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4681: //BCHG.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_001_000_rrr-{data} 4682: //BCHG.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_001_mmm_rrr-{data} 4683: public static void irpBchgImm () throws M68kException { 4684: int ea = XEiJ.regOC & 63; 4685: int x; 4686: int y; 4687: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4688: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4689: } else { 4690: y = XEiJ.regPC; 4691: XEiJ.regPC = y + 2; 4692: y = XEiJ.busRbs (y + 1); //pcbs 4693: } 4694: if (ea < XEiJ.EA_AR) { //BCHG.L #<data>,Dr 4695: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4696: XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12; //(0xffff&y)!=0 4697: } else { //BCHG.B #<data>,<ea> 4698: XEiJ.mpuCycleCount += 12; 4699: int a = efaMltByte (ea); 4700: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7))); 4701: } 4702: 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 4703: } //irpBchgImm 4704: 4705: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4706: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4707: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4708: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4709: //BCLR.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_010_000_rrr-{data} 4710: //BCLR.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_010_mmm_rrr-{data} 4711: public static void irpBclrImm () throws M68kException { 4712: int ea = XEiJ.regOC & 63; 4713: int x; 4714: int y; 4715: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4716: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4717: } else { 4718: y = XEiJ.regPC; 4719: XEiJ.regPC = y + 2; 4720: y = XEiJ.busRbs (y + 1); //pcbs 4721: } 4722: if (ea < XEiJ.EA_AR) { //BCLR.L #<data>,Dr 4723: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4724: XEiJ.mpuCycleCount += (char) y != 0 ? 12 : 14; //(0xffff&y)!=0 4725: } else { //BCLR.B #<data>,<ea> 4726: XEiJ.mpuCycleCount += 12; 4727: int a = efaMltByte (ea); 4728: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7))); 4729: } 4730: 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 4731: } //irpBclrImm 4732: 4733: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4734: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4735: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4736: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4737: //BSET.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_011_000_rrr-{data} 4738: //BSET.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_011_mmm_rrr-{data} 4739: public static void irpBsetImm () throws M68kException { 4740: int ea = XEiJ.regOC & 63; 4741: int x; 4742: int y; 4743: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4744: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4745: } else { 4746: y = XEiJ.regPC; 4747: XEiJ.regPC = y + 2; 4748: y = XEiJ.busRbs (y + 1); //pcbs 4749: } 4750: if (ea < XEiJ.EA_AR) { //BSET.L #<data>,Dr 4751: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4752: XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12; //(0xffff&y)!=0 4753: } else { //BSET.B #<data>,<ea> 4754: XEiJ.mpuCycleCount += 12; 4755: int a = efaMltByte (ea); 4756: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7))); 4757: } 4758: 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 4759: } //irpBsetImm 4760: 4761: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4762: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4763: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4764: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4765: //EORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} 4766: //EOR.B #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} [EORI.B #<data>,<ea>] 4767: //EORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_101_000_111_100-{data} 4768: public static void irpEoriByte () throws M68kException { 4769: int ea = XEiJ.regOC & 63; 4770: int z; 4771: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4772: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4773: } else { 4774: z = XEiJ.regPC; 4775: XEiJ.regPC = z + 2; 4776: z = XEiJ.busRbs (z + 1); //pcbs 4777: } 4778: if (ea < XEiJ.EA_AR) { //EORI.B #<data>,Dr 4779: XEiJ.mpuCycleCount += 8; 4780: z = XEiJ.regRn[ea] ^= 255 & z; //0拡張してからEOR 4781: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4782: } else if (ea == XEiJ.EA_IM) { //EORI.B #<data>,CCR 4783: XEiJ.mpuCycleCount += 20; 4784: XEiJ.regCCR ^= XEiJ.REG_CCR_MASK & z; 4785: } else { //EORI.B #<data>,<mem> 4786: XEiJ.mpuCycleCount += 12; 4787: int a = efaMltByte (ea); 4788: XEiJ.busWb (a, z ^= XEiJ.busRbs (a)); 4789: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4790: } 4791: } //irpEoriByte 4792: 4793: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4794: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4795: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4796: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4797: //EORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} 4798: //EOR.W #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} [EORI.W #<data>,<ea>] 4799: //EORI.W #<data>,SR |-|012346|P|*****|*****| |0000_101_001_111_100-{data} 4800: public static void irpEoriWord () throws M68kException { 4801: int ea = XEiJ.regOC & 63; 4802: if (ea < XEiJ.EA_AR) { //EORI.W #<data>,Dr 4803: int z; 4804: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4805: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4806: } else { 4807: z = XEiJ.regPC; 4808: XEiJ.regPC = z + 2; 4809: z = XEiJ.busRwse (z); //pcws 4810: } 4811: XEiJ.mpuCycleCount += 8; 4812: z = XEiJ.regRn[ea] ^= (char) z; //0拡張してからEOR 4813: 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 4814: } else if (ea == XEiJ.EA_IM) { //EORI.W #<data>,SR 4815: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4816: XEiJ.mpuCycleCount += 34; 4817: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4818: throw M68kException.m6eSignal; 4819: } 4820: //以下はスーパーバイザモード 4821: XEiJ.mpuCycleCount += 20; 4822: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4823: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4824: } else { 4825: int t = XEiJ.regPC; 4826: XEiJ.regPC = t + 2; 4827: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4828: } 4829: } else { //EORI.W #<data>,<mem> 4830: int z; 4831: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4832: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4833: } else { 4834: z = XEiJ.regPC; 4835: XEiJ.regPC = z + 2; 4836: z = XEiJ.busRwse (z); //pcws 4837: } 4838: XEiJ.mpuCycleCount += 12; 4839: int a = efaMltWord (ea); 4840: XEiJ.busWw (a, z ^= XEiJ.busRws (a)); 4841: 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 4842: } 4843: } //irpEoriWord 4844: 4845: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4846: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4847: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4848: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4849: //EORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} 4850: //EOR.L #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} [EORI.L #<data>,<ea>] 4851: public static void irpEoriLong () throws M68kException { 4852: int ea = XEiJ.regOC & 63; 4853: int y; 4854: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4855: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4856: } else { 4857: y = XEiJ.regPC; 4858: XEiJ.regPC = y + 4; 4859: y = XEiJ.busRlse (y); //pcls 4860: } 4861: int z; 4862: if (ea < XEiJ.EA_AR) { //EORI.L #<data>,Dr 4863: XEiJ.mpuCycleCount += 16; 4864: z = XEiJ.regRn[ea] ^= y; 4865: } else { //EORI.L #<data>,<mem> 4866: XEiJ.mpuCycleCount += 20; 4867: int a = efaMltLong (ea); 4868: XEiJ.busWl (a, z = XEiJ.busRls (a) ^ y); 4869: } 4870: 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 4871: } //irpEoriLong 4872: 4873: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4874: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4875: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4876: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4877: //CMPI.B #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_000_mmm_rrr-{data} 4878: //CMP.B #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_000_mmm_rrr-{data} [CMPI.B #<data>,<ea>] 4879: public static void irpCmpiByte () throws M68kException { 4880: XEiJ.mpuCycleCount += 8; 4881: int ea = XEiJ.regOC & 63; 4882: int x; 4883: int y; 4884: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4885: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4886: } else { 4887: y = XEiJ.regPC; 4888: XEiJ.regPC = y + 2; 4889: y = XEiJ.busRbs (y + 1); //pcbs 4890: } 4891: int z = (byte) ((x = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea))) - y); //アドレッシングモードに注意 4892: 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) | 4893: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4894: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 4895: } //irpCmpiByte 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: //CMPI.W #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_001_mmm_rrr-{data} 4902: //CMP.W #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_001_mmm_rrr-{data} [CMPI.W #<data>,<ea>] 4903: public static void irpCmpiWord () throws M68kException { 4904: XEiJ.mpuCycleCount += 8; 4905: int ea = XEiJ.regOC & 63; 4906: int x; 4907: int y; 4908: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4909: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4910: } else { 4911: y = XEiJ.regPC; 4912: XEiJ.regPC = y + 2; 4913: y = XEiJ.busRwse (y); //pcws 4914: } 4915: int z = (short) ((x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea))) - y); //アドレッシングモードに注意 4916: 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) | 4917: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4918: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 4919: } //irpCmpiWord 4920: 4921: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4922: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4923: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4924: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4925: //CMPI.L #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_010_mmm_rrr-{data} 4926: //CMP.L #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_010_mmm_rrr-{data} [CMPI.L #<data>,<ea>] 4927: public static void irpCmpiLong () throws M68kException { 4928: int ea = XEiJ.regOC & 63; 4929: int x; 4930: int y; 4931: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4932: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4933: } else { 4934: y = XEiJ.regPC; 4935: XEiJ.regPC = y + 4; 4936: y = XEiJ.busRlse (y); //pcls 4937: } 4938: int z; 4939: if (ea < XEiJ.EA_AR) { //CMPI.L #<data>,Dr 4940: XEiJ.mpuCycleCount += 14; 4941: z = (x = XEiJ.regRn[ea]) - y; 4942: } else { //CMPI.L #<data>,<mem> 4943: XEiJ.mpuCycleCount += 12; 4944: z = (x = XEiJ.busRls (efaMltLong (ea))) - y; //アドレッシングモードに注意 4945: } 4946: 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) | 4947: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4948: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 4949: } //irpCmpiLong 4950: 4951: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4952: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4953: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4954: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4955: //MOVE.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr 4956: public static void irpMoveToDRByte () throws M68kException { 4957: XEiJ.mpuCycleCount += 4; 4958: int ea = XEiJ.regOC & 63; 4959: int qqq = XEiJ.regOC >> 9 & 7; 4960: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 4961: XEiJ.regRn[qqq] = ~255 & XEiJ.regRn[qqq] | 255 & z; 4962: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4963: } //irpMoveToDRByte 4964: 4965: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4966: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4967: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4968: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4969: //MOVE.B <ea>,(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr 4970: public static void irpMoveToMMByte () throws M68kException { 4971: XEiJ.mpuCycleCount += 8; 4972: int ea = XEiJ.regOC & 63; 4973: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 4974: XEiJ.busWb (XEiJ.regRn[XEiJ.regOC >> 9], z); //1qqq=aqq 4975: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4976: } //irpMoveToMMByte 4977: 4978: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4979: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4980: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4981: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4982: //MOVE.B <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr 4983: public static void irpMoveToMPByte () throws M68kException { 4984: XEiJ.mpuCycleCount += 8; 4985: int ea = XEiJ.regOC & 63; 4986: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 4987: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 4988: XEiJ.busWb (aqq < 15 ? XEiJ.regRn[aqq]++ : (XEiJ.regRn[15] += 2) - 2, z); 4989: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4990: } //irpMoveToMPByte 4991: 4992: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4993: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4994: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4995: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4996: //MOVE.B <ea>,-(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr 4997: public static void irpMoveToMNByte () throws M68kException { 4998: XEiJ.mpuCycleCount += 8; 4999: int ea = XEiJ.regOC & 63; 5000: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5001: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5002: XEiJ.busWb (aqq < 15 ? --XEiJ.regRn[aqq] : (XEiJ.regRn[15] -= 2), z); 5003: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5004: } //irpMoveToMNByte 5005: 5006: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5007: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5008: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5009: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5010: //MOVE.B <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr 5011: public static void irpMoveToMWByte () throws M68kException { 5012: XEiJ.mpuCycleCount += 12; 5013: int ea = XEiJ.regOC & 63; 5014: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5015: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5016: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5017: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5018: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5019: z); 5020: } else { 5021: int t = XEiJ.regPC; 5022: XEiJ.regPC = t + 2; 5023: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5024: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5025: z); 5026: } 5027: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5028: } //irpMoveToMWByte 5029: 5030: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5031: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5032: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5034: //MOVE.B <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr 5035: public static void irpMoveToMXByte () throws M68kException { 5036: XEiJ.mpuCycleCount += 14; 5037: int ea = XEiJ.regOC & 63; 5038: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5039: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5040: int w; 5041: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5042: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5043: } else { 5044: w = XEiJ.regPC; 5045: XEiJ.regPC = w + 2; 5046: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5047: } 5048: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5049: + (byte) w //バイトディスプレースメント 5050: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5051: XEiJ.regRn[w >> 12]), //ロングインデックス 5052: z); 5053: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5054: } //irpMoveToMXByte 5055: 5056: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5057: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5058: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5059: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5060: //MOVE.B <ea>,(xxx).W |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr 5061: public static void irpMoveToZWByte () throws M68kException { 5062: XEiJ.mpuCycleCount += 12; 5063: int ea = XEiJ.regOC & 63; 5064: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5065: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5066: XEiJ.busWb (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5067: z); 5068: } else { 5069: int t = XEiJ.regPC; 5070: XEiJ.regPC = t + 2; 5071: XEiJ.busWb (XEiJ.busRwse (t), //pcws 5072: z); 5073: } 5074: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5075: } //irpMoveToZWByte 5076: 5077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5078: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5079: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5080: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5081: //MOVE.B <ea>,(xxx).L |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr 5082: public static void irpMoveToZLByte () throws M68kException { 5083: XEiJ.mpuCycleCount += 16; 5084: int ea = XEiJ.regOC & 63; 5085: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5086: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5087: XEiJ.busWb (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5088: z); 5089: } else { 5090: int t = XEiJ.regPC; 5091: XEiJ.regPC = t + 4; 5092: XEiJ.busWb (XEiJ.busRlse (t), //pcls 5093: z); 5094: } 5095: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5096: } //irpMoveToZLByte 5097: 5098: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5099: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5100: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5101: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5102: //MOVE.L <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr 5103: public static void irpMoveToDRLong () throws M68kException { 5104: XEiJ.mpuCycleCount += 4; 5105: int ea = XEiJ.regOC & 63; 5106: int z; 5107: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5108: 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 5109: } //irpMoveToDRLong 5110: 5111: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5112: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5113: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5115: //MOVEA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr 5116: //MOVE.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq] 5117: public static void irpMoveaLong () throws M68kException { 5118: XEiJ.mpuCycleCount += 4; 5119: int ea = XEiJ.regOC & 63; 5120: XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意 5121: } //irpMoveaLong 5122: 5123: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5124: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5125: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5126: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5127: //MOVE.L <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr 5128: public static void irpMoveToMMLong () throws M68kException { 5129: XEiJ.mpuCycleCount += 12; 5130: int ea = XEiJ.regOC & 63; 5131: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5132: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)], z); 5133: 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 5134: } //irpMoveToMMLong 5135: 5136: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5137: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5138: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5139: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5140: //MOVE.L <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr 5141: public static void irpMoveToMPLong () throws M68kException { 5142: XEiJ.mpuCycleCount += 12; 5143: int ea = XEiJ.regOC & 63; 5144: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5145: XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] += 4) - 4, z); 5146: 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 5147: } //irpMoveToMPLong 5148: 5149: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5150: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5151: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5152: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5153: //MOVE.L <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr 5154: public static void irpMoveToMNLong () throws M68kException { 5155: XEiJ.mpuCycleCount += 12; 5156: int ea = XEiJ.regOC & 63; 5157: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5158: XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] -= 4), z); 5159: 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 5160: } //irpMoveToMNLong 5161: 5162: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5163: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5164: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5165: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5166: //MOVE.L <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr 5167: public static void irpMoveToMWLong () throws M68kException { 5168: XEiJ.mpuCycleCount += 16; 5169: int ea = XEiJ.regOC & 63; 5170: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5171: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5172: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] //ベースレジスタ 5173: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5174: z); 5175: } else { 5176: int t = XEiJ.regPC; 5177: XEiJ.regPC = t + 2; 5178: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] //ベースレジスタ 5179: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5180: z); 5181: } 5182: 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 5183: } //irpMoveToMWLong 5184: 5185: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5186: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5187: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5188: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5189: //MOVE.L <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr 5190: public static void irpMoveToMXLong () throws M68kException { 5191: XEiJ.mpuCycleCount += 18; 5192: int ea = XEiJ.regOC & 63; 5193: int aqq = (XEiJ.regOC >> 9) - (16 - 8); 5194: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5195: int w; 5196: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5197: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5198: } else { 5199: w = XEiJ.regPC; 5200: XEiJ.regPC = w + 2; 5201: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5202: } 5203: XEiJ.busWl (XEiJ.regRn[aqq] //ベースレジスタ 5204: + (byte) w //バイトディスプレースメント 5205: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5206: XEiJ.regRn[w >> 12]), //ロングインデックス 5207: z); 5208: 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 5209: } //irpMoveToMXLong 5210: 5211: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5212: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5213: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5214: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5215: //MOVE.L <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr 5216: public static void irpMoveToZWLong () throws M68kException { 5217: XEiJ.mpuCycleCount += 16; 5218: int ea = XEiJ.regOC & 63; 5219: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5220: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5221: XEiJ.busWl (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5222: z); 5223: } else { 5224: int t = XEiJ.regPC; 5225: XEiJ.regPC = t + 2; 5226: XEiJ.busWl (XEiJ.busRwse (t), //pcws 5227: z); 5228: } 5229: 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 5230: } //irpMoveToZWLong 5231: 5232: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5233: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5234: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5235: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5236: //MOVE.L <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr 5237: public static void irpMoveToZLLong () throws M68kException { 5238: XEiJ.mpuCycleCount += 20; 5239: int ea = XEiJ.regOC & 63; 5240: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5241: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5242: XEiJ.busWl (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5243: z); 5244: } else { 5245: int t = XEiJ.regPC; 5246: XEiJ.regPC = t + 4; 5247: XEiJ.busWl (XEiJ.busRlse (t), //pcls 5248: z); 5249: } 5250: 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 5251: } //irpMoveToZLLong 5252: 5253: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5254: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5255: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5256: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5257: //MOVE.W <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr 5258: public static void irpMoveToDRWord () throws M68kException { 5259: XEiJ.mpuCycleCount += 4; 5260: int ea = XEiJ.regOC & 63; 5261: int qqq = XEiJ.regOC >> 9 & 7; 5262: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5263: XEiJ.regRn[qqq] = ~65535 & XEiJ.regRn[qqq] | (char) z; 5264: 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 5265: } //irpMoveToDRWord 5266: 5267: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5268: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5269: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5270: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5271: //MOVEA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr 5272: //MOVE.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq] 5273: // 5274: //MOVEA.W <ea>,Aq 5275: // ワードデータをロングに符号拡張してAqの全体を更新する 5276: public static void irpMoveaWord () throws M68kException { 5277: XEiJ.mpuCycleCount += 4; 5278: int ea = XEiJ.regOC & 63; 5279: XEiJ.regRn[XEiJ.regOC >> 9 & 15] = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //符号拡張して32bit全部書き換える。このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意 5280: } //irpMoveaWord 5281: 5282: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5283: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5284: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5285: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5286: //MOVE.W <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr 5287: public static void irpMoveToMMWord () throws M68kException { 5288: XEiJ.mpuCycleCount += 8; 5289: int ea = XEiJ.regOC & 63; 5290: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5291: XEiJ.busWw (XEiJ.regRn[XEiJ.regOC >> 9 & 15], z); 5292: 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 5293: } //irpMoveToMMWord 5294: 5295: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5296: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5297: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5298: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5299: //MOVE.W <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr 5300: public static void irpMoveToMPWord () throws M68kException { 5301: XEiJ.mpuCycleCount += 8; 5302: int ea = XEiJ.regOC & 63; 5303: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5304: XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2, z); 5305: 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 5306: } //irpMoveToMPWord 5307: 5308: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5309: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5310: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5311: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5312: //MOVE.W <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr 5313: public static void irpMoveToMNWord () throws M68kException { 5314: XEiJ.mpuCycleCount += 8; 5315: int ea = XEiJ.regOC & 63; 5316: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5317: XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2), z); 5318: 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 5319: } //irpMoveToMNWord 5320: 5321: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5322: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5323: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5325: //MOVE.W <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr 5326: public static void irpMoveToMWWord () throws M68kException { 5327: XEiJ.mpuCycleCount += 12; 5328: int ea = XEiJ.regOC & 63; 5329: int aqq = XEiJ.regOC >> 9 & 15; 5330: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5331: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5332: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5333: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5334: z); 5335: } else { 5336: int t = XEiJ.regPC; 5337: XEiJ.regPC = t + 2; 5338: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5339: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5340: z); 5341: } 5342: 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 5343: } //irpMoveToMWWord 5344: 5345: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5346: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5347: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5348: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5349: //MOVE.W <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr 5350: public static void irpMoveToMXWord () throws M68kException { 5351: XEiJ.mpuCycleCount += 14; 5352: int ea = XEiJ.regOC & 63; 5353: int aqq = XEiJ.regOC >> 9 & 15; 5354: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5355: int w; 5356: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5357: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5358: } else { 5359: w = XEiJ.regPC; 5360: XEiJ.regPC = w + 2; 5361: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5362: } 5363: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5364: + (byte) w //バイトディスプレースメント 5365: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5366: XEiJ.regRn[w >> 12]), //ロングインデックス 5367: z); 5368: 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 5369: } //irpMoveToMXWord 5370: 5371: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5372: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5373: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5374: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5375: //MOVE.W <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr 5376: public static void irpMoveToZWWord () throws M68kException { 5377: XEiJ.mpuCycleCount += 12; 5378: int ea = XEiJ.regOC & 63; 5379: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5380: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5381: XEiJ.busWw (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5382: z); 5383: } else { 5384: int t = XEiJ.regPC; 5385: XEiJ.regPC = t + 2; 5386: XEiJ.busWw (XEiJ.busRwse (t), //pcws 5387: z); 5388: } 5389: 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 5390: } //irpMoveToZWWord 5391: 5392: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5393: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5394: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5395: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5396: //MOVE.W <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr 5397: public static void irpMoveToZLWord () throws M68kException { 5398: XEiJ.mpuCycleCount += 16; 5399: int ea = XEiJ.regOC & 63; 5400: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5401: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5402: XEiJ.busWw (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5403: z); 5404: } else { 5405: int t = XEiJ.regPC; 5406: XEiJ.regPC = t + 4; 5407: XEiJ.busWw (XEiJ.busRlse (t), //pcls 5408: z); 5409: } 5410: 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 5411: } //irpMoveToZLWord 5412: 5413: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5414: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5415: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5416: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5417: //NEGX.B <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_000_mmm_rrr 5418: public static void irpNegxByte () throws M68kException { 5419: int ea = XEiJ.regOC & 63; 5420: int y; 5421: int z; 5422: if (ea < XEiJ.EA_AR) { //NEGX.B Dr 5423: XEiJ.mpuCycleCount += 4; 5424: z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y) - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 5425: } else { //NEGX.B <mem> 5426: XEiJ.mpuCycleCount += 8; 5427: int a = efaMltByte (ea); 5428: XEiJ.busWb (a, z = (byte) (-(y = XEiJ.busRbs (a)) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5429: } 5430: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5431: (y & z) >>> 31 << 1 | 5432: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5433: } //irpNegxByte 5434: 5435: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5436: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5437: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5438: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5439: //NEGX.W <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_001_mmm_rrr 5440: public static void irpNegxWord () throws M68kException { 5441: int ea = XEiJ.regOC & 63; 5442: int y; 5443: int z; 5444: if (ea < XEiJ.EA_AR) { //NEGX.W Dr 5445: XEiJ.mpuCycleCount += 4; 5446: z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) (-(y = (short) y) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5447: } else { //NEGX.W <mem> 5448: XEiJ.mpuCycleCount += 8; 5449: int a = efaMltWord (ea); 5450: XEiJ.busWw (a, z = (short) (-(y = XEiJ.busRws (a)) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5451: } 5452: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5453: (y & z) >>> 31 << 1 | 5454: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5455: } //irpNegxWord 5456: 5457: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5458: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5459: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5460: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5461: //NEGX.L <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_010_mmm_rrr 5462: public static void irpNegxLong () throws M68kException { 5463: int ea = XEiJ.regOC & 63; 5464: int y; 5465: int z; 5466: if (ea < XEiJ.EA_AR) { //NEGX.L Dr 5467: XEiJ.mpuCycleCount += 6; 5468: XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 5469: } else { //NEGX.L <mem> 5470: XEiJ.mpuCycleCount += 12; 5471: int a = efaMltLong (ea); 5472: XEiJ.busWl (a, z = -(y = XEiJ.busRls (a)) - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 5473: } 5474: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5475: (y & z) >>> 31 << 1 | 5476: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5477: } //irpNegxLong 5478: 5479: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5480: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5481: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5482: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5483: //MOVE.W SR,<ea> |-|0-----|-|*****|-----|D M+-WXZ |0100_000_011_mmm_rrr (68000 and 68008 read before move) 5484: public static void irpMoveFromSR () throws M68kException { 5485: //MC68000では特権命令ではない 5486: int ea = XEiJ.regOC & 63; 5487: if (ea < XEiJ.EA_AR) { //MOVE.W SR,Dr 5488: XEiJ.mpuCycleCount += 6; 5489: XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 5490: } else { //MOVE.W SR,<mem> 5491: //! 軽量化。MOVE from SRによる直後の命令のイミディエイトオペランドの自己書き換えが直後に反映されてしまう 5492: // MC68000でFEファンクションコールやSXコールのようなCCRを変化させる例外処理ルーチンの出口を次のように書くと、 5493: // 自己書き換えが直後に反映されずイミディエイトオペランドの領域がバッファになって前回の結果を返すことになるので期待通りに動作しない 5494: // move.w sr,@f+2 5495: // @@: move.b #0,(1,sp) 5496: // rte 5497: // これが期待通りに動作してしまったらMC68000を正しくエミュレートできていないということになる 5498: // https://stdkmd.net/bbs/page2.htm#comment134 5499: XEiJ.mpuCycleCount += 8; 5500: int a = efaMltWord (ea); 5501: if (XEiJ.MPU_OMIT_EXTRA_READ) { 5502: //! 軽量化。MC68000では書き込む前にリードが入るが省略する 5503: } else { 5504: XEiJ.busRws (a); 5505: } 5506: XEiJ.busWw (a, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); 5507: } 5508: } //irpMoveFromSR 5509: 5510: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5511: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5512: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5513: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5514: //CHK.W <ea>,Dq |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr 5515: public static void irpChkWord () throws M68kException { 5516: XEiJ.mpuCycleCount += 10; 5517: int ea = XEiJ.regOC & 63; 5518: int x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 5519: int y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 5520: int z = (short) (x - y); 5521: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | 5522: (y < 0 ? XEiJ.REG_CCR_N : 0) | 5523: (y == 0 ? XEiJ.REG_CCR_Z : 0) | 5524: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5525: (x & (y ^ z) ^ (y | z)) >>> 31); 5526: if (y < 0 || x < y) { 5527: XEiJ.mpuCycleCount += 38 - 10; 5528: M68kException.m6eNumber = M68kException.M6E_CHK_INSTRUCTION; 5529: throw M68kException.m6eSignal; 5530: } 5531: } //irpChkWord 5532: 5533: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5534: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5535: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5536: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5537: //LEA.L <ea>,Aq |-|012346|-|-----|-----| M WXZP |0100_qqq_111_mmm_rrr 5538: public static void irpLea () throws M68kException { 5539: //XEiJ.mpuCycleCount += 4 - 4; 5540: XEiJ.regRn[(XEiJ.regOC >> 9) - (32 - 8)] = efaLeaPea (XEiJ.regOC & 63); 5541: } //irpLea 5542: 5543: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5544: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5545: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5546: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5547: //CLR.B <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_000_mmm_rrr (68000 and 68008 read before clear) 5548: public static void irpClrByte () throws M68kException { 5549: int ea = XEiJ.regOC & 63; 5550: if (ea < XEiJ.EA_AR) { //CLR.B Dr 5551: XEiJ.mpuCycleCount += 4; 5552: XEiJ.regRn[ea] &= ~0xff; 5553: } else { //CLR.B <mem> 5554: XEiJ.mpuCycleCount += 8; 5555: //MC68000のCLRはリードしてからライトする 5556: if (XEiJ.MPU_OMIT_EXTRA_READ) { 5557: //! 軽量化。リードを省略する 5558: XEiJ.busWb (efaMltByte (ea), 0); 5559: } else { 5560: int a = efaMltByte (ea); 5561: XEiJ.busRbs (a); 5562: XEiJ.busWb (a, 0); 5563: } 5564: } 5565: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5566: } //irpClrByte 5567: 5568: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5569: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5570: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5571: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5572: //CLR.W <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_001_mmm_rrr (68000 and 68008 read before clear) 5573: public static void irpClrWord () throws M68kException { 5574: int ea = XEiJ.regOC & 63; 5575: if (ea < XEiJ.EA_AR) { //CLR.W Dr 5576: XEiJ.mpuCycleCount += 4; 5577: XEiJ.regRn[ea] &= ~0xffff; 5578: } else { //CLR.W <mem> 5579: XEiJ.mpuCycleCount += 8; 5580: //MC68000のCLRはリードしてからライトする 5581: if (XEiJ.MPU_OMIT_EXTRA_READ) { 5582: //! 軽量化。リードを省略する 5583: XEiJ.busWw (efaMltWord (ea), 0); 5584: } else { 5585: int a = efaMltWord (ea); 5586: XEiJ.busRws (a); 5587: XEiJ.busWw (a, 0); 5588: } 5589: } 5590: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5591: } //irpClrWord 5592: 5593: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5594: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5595: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5596: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5597: //CLR.L <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_010_mmm_rrr (68000 and 68008 read before clear) 5598: public static void irpClrLong () throws M68kException { 5599: int ea = XEiJ.regOC & 63; 5600: if (ea < XEiJ.EA_AR) { //CLR.L Dr 5601: XEiJ.mpuCycleCount += 6; 5602: XEiJ.regRn[ea] = 0; 5603: } else { //CLR.L <mem> 5604: XEiJ.mpuCycleCount += 12; 5605: //MC68000のCLRはリードしてからライトする 5606: if (XEiJ.MPU_OMIT_EXTRA_READ) { 5607: //! 軽量化。リードを省略する 5608: XEiJ.busWl (efaMltLong (ea), 0); 5609: } else { 5610: int a = efaMltLong (ea); 5611: XEiJ.busRls (a); 5612: XEiJ.busWl (a, 0); 5613: } 5614: } 5615: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5616: } //irpClrLong 5617: 5618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5619: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5620: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5622: //NEG.B <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_000_mmm_rrr 5623: public static void irpNegByte () throws M68kException { 5624: int ea = XEiJ.regOC & 63; 5625: int y; 5626: int z; 5627: if (ea < XEiJ.EA_AR) { //NEG.B Dr 5628: XEiJ.mpuCycleCount += 4; 5629: z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y)); 5630: } else { //NEG.B <mem> 5631: XEiJ.mpuCycleCount += 8; 5632: int a = efaMltByte (ea); 5633: XEiJ.busWb (a, z = (byte) -(y = XEiJ.busRbs (a))); 5634: } 5635: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 5636: (y & z) >>> 31 << 1 | 5637: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 5638: } //irpNegByte 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: //NEG.W <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_001_mmm_rrr 5645: public static void irpNegWord () throws M68kException { 5646: int ea = XEiJ.regOC & 63; 5647: int y; 5648: int z; 5649: if (ea < XEiJ.EA_AR) { //NEG.W Dr 5650: XEiJ.mpuCycleCount += 4; 5651: z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) -(y = (short) y)); 5652: } else { //NEG.W <mem> 5653: XEiJ.mpuCycleCount += 8; 5654: int a = efaMltWord (ea); 5655: XEiJ.busWw (a, z = (short) -(y = XEiJ.busRws (a))); 5656: } 5657: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 5658: (y & z) >>> 31 << 1 | 5659: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 5660: } //irpNegWord 5661: 5662: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5663: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5664: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5665: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5666: //NEG.L <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_010_mmm_rrr 5667: public static void irpNegLong () throws M68kException { 5668: int ea = XEiJ.regOC & 63; 5669: int y; 5670: int z; 5671: if (ea < XEiJ.EA_AR) { //NEG.L Dr 5672: XEiJ.mpuCycleCount += 6; 5673: XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]); 5674: } else { //NEG.L <mem> 5675: XEiJ.mpuCycleCount += 12; 5676: int a = efaMltLong (ea); 5677: XEiJ.busWl (a, z = -(y = XEiJ.busRls (a))); 5678: } 5679: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 5680: (y & z) >>> 31 << 1 | 5681: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 5682: } //irpNegLong 5683: 5684: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5685: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5686: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5687: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5688: //MOVE.W <ea>,CCR |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr 5689: public static void irpMoveToCCR () throws M68kException { 5690: XEiJ.mpuCycleCount += 12; 5691: int ea = XEiJ.regOC & 63; 5692: XEiJ.regCCR = XEiJ.REG_CCR_MASK & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea))); 5693: } //irpMoveToCCR 5694: 5695: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5696: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5697: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5698: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5699: //NOT.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_000_mmm_rrr 5700: public static void irpNotByte () throws M68kException { 5701: int ea = XEiJ.regOC & 63; 5702: int z; 5703: if (ea < XEiJ.EA_AR) { //NOT.B Dr 5704: XEiJ.mpuCycleCount += 4; 5705: z = XEiJ.regRn[ea] ^= 255; //0拡張してからEOR 5706: } else { //NOT.B <mem> 5707: XEiJ.mpuCycleCount += 8; 5708: int a = efaMltByte (ea); 5709: XEiJ.busWb (a, z = ~XEiJ.busRbs (a)); 5710: } 5711: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5712: } //irpNotByte 5713: 5714: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5715: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5716: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5717: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5718: //NOT.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_001_mmm_rrr 5719: public static void irpNotWord () throws M68kException { 5720: int ea = XEiJ.regOC & 63; 5721: int z; 5722: if (ea < XEiJ.EA_AR) { //NOT.W Dr 5723: XEiJ.mpuCycleCount += 4; 5724: z = XEiJ.regRn[ea] ^= 65535; //0拡張してからEOR 5725: } else { //NOT.W <mem> 5726: XEiJ.mpuCycleCount += 8; 5727: int a = efaMltWord (ea); 5728: XEiJ.busWw (a, z = ~XEiJ.busRws (a)); 5729: } 5730: 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 5731: } //irpNotWord 5732: 5733: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5734: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5735: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5736: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5737: //NOT.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_010_mmm_rrr 5738: public static void irpNotLong () throws M68kException { 5739: int ea = XEiJ.regOC & 63; 5740: int z; 5741: if (ea < XEiJ.EA_AR) { //NOT.L Dr 5742: XEiJ.mpuCycleCount += 6; 5743: z = XEiJ.regRn[ea] ^= 0xffffffff; 5744: } else { //NOT.L <mem> 5745: XEiJ.mpuCycleCount += 12; 5746: int a = efaMltLong (ea); 5747: XEiJ.busWl (a, z = ~XEiJ.busRls (a)); 5748: } 5749: 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 5750: } //irpNotLong 5751: 5752: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5753: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5754: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5755: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5756: //MOVE.W <ea>,SR |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr 5757: public static void irpMoveToSR () throws M68kException { 5758: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5759: XEiJ.mpuCycleCount += 34; 5760: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5761: throw M68kException.m6eSignal; 5762: } 5763: //以下はスーパーバイザモード 5764: XEiJ.mpuCycleCount += 12; 5765: int ea = XEiJ.regOC & 63; 5766: irpSetSR (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea))); //特権違反チェックが先 5767: } //irpMoveToSR 5768: 5769: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5770: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5771: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5772: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5773: //NBCD.B <ea> |-|012346|-|UUUUU|*U*U*|D M+-WXZ |0100_100_000_mmm_rrr 5774: public static void irpNbcd () throws M68kException { 5775: int ea = XEiJ.regOC & 63; 5776: if (ea < XEiJ.EA_AR) { //NBCD.B Dr 5777: XEiJ.mpuCycleCount += 6; 5778: XEiJ.regRn[ea] = ~0xff & XEiJ.regRn[ea] | irpSbcd (0, XEiJ.regRn[ea]); 5779: } else { //NBCD.B <mem> 5780: XEiJ.mpuCycleCount += 8; 5781: int a = efaMltByte (ea); 5782: XEiJ.busWb (a, irpSbcd (0, XEiJ.busRbs (a))); 5783: } 5784: } //irpNbcd 5785: 5786: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5787: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5788: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5789: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5790: //SWAP.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_001_000_rrr 5791: //PEA.L <ea> |-|012346|-|-----|-----| M WXZP |0100_100_001_mmm_rrr 5792: public static void irpPea () throws M68kException { 5793: int ea = XEiJ.regOC & 63; 5794: if (ea < XEiJ.EA_AR) { //SWAP.W Dr 5795: XEiJ.mpuCycleCount += 4; 5796: int x; 5797: int z; 5798: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) << 16 | x >>> 16; 5799: //上位ワードと下位ワードを入れ替えた後のDrをロングでテストする 5800: 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 5801: } else { //PEA.L <ea> 5802: XEiJ.mpuCycleCount += 12 - 4; 5803: int a = efaLeaPea (ea); //BKPT #<data>はここでillegal instructionになる 5804: XEiJ.busWl (XEiJ.regRn[15] -= 4, a); //pushl。評価順序に注意。wl(r[15]-=4,eaz_leapea(ea))は不可 5805: } 5806: } //irpPea 5807: 5808: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5809: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5810: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5812: //EXT.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_010_000_rrr 5813: //MOVEM.W <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_010_mmm_rrr-llllllllllllllll 5814: public static void irpMovemToMemWord () throws M68kException { 5815: int ea = XEiJ.regOC & 63; 5816: if (ea < XEiJ.EA_AR) { //EXT.W Dr 5817: XEiJ.mpuCycleCount += 4; 5818: int z; 5819: XEiJ.regRn[ea] = ~0xffff & (z = XEiJ.regRn[ea]) | (char) (z = (byte) z); 5820: 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 5821: } else { //MOVEM.W <list>,<ea> 5822: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 5823: XEiJ.regPC += 2; 5824: if (ea >> 3 == XEiJ.MMM_MN) { //-(Ar) 5825: //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む 5826: //転送するレジスタが0個のときArは変化しない 5827: int arr = ea - (XEiJ.EA_MN - 8); 5828: int a = XEiJ.regRn[arr]; 5829: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 5830: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5831: M68kException.m6eAddress = a; 5832: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5833: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5834: throw M68kException.m6eSignal; 5835: } 5836: int t = a; 5837: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 5838: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 2 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 5839: 2 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) { //16個転送してもページを跨がない 5840: a &= XEiJ.BUS_MOTHER_MASK; 5841: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 5842: if ((l & 0x0001) != 0) { 5843: a -= 2; 5844: int x = XEiJ.regRn[15]; 5845: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5846: MainMemory.mmrM8[a + 1] = (byte) x; 5847: } 5848: if ((l & 0x0002) != 0) { 5849: a -= 2; 5850: int x = XEiJ.regRn[14]; 5851: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5852: MainMemory.mmrM8[a + 1] = (byte) x; 5853: } 5854: if ((l & 0x0004) != 0) { 5855: a -= 2; 5856: int x = XEiJ.regRn[13]; 5857: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5858: MainMemory.mmrM8[a + 1] = (byte) x; 5859: } 5860: if ((l & 0x0008) != 0) { 5861: a -= 2; 5862: int x = XEiJ.regRn[12]; 5863: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5864: MainMemory.mmrM8[a + 1] = (byte) x; 5865: } 5866: if ((l & 0x0010) != 0) { 5867: a -= 2; 5868: int x = XEiJ.regRn[11]; 5869: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5870: MainMemory.mmrM8[a + 1] = (byte) x; 5871: } 5872: if ((l & 0x0020) != 0) { 5873: a -= 2; 5874: int x = XEiJ.regRn[10]; 5875: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5876: MainMemory.mmrM8[a + 1] = (byte) x; 5877: } 5878: if ((l & 0x0040) != 0) { 5879: a -= 2; 5880: int x = XEiJ.regRn[ 9]; 5881: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5882: MainMemory.mmrM8[a + 1] = (byte) x; 5883: } 5884: if ((byte) l < 0) { //(l & 0x0080) != 0 5885: a -= 2; 5886: int x = XEiJ.regRn[ 8]; 5887: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5888: MainMemory.mmrM8[a + 1] = (byte) x; 5889: } 5890: if ((l & 0x0100) != 0) { 5891: a -= 2; 5892: int x = XEiJ.regRn[ 7]; 5893: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5894: MainMemory.mmrM8[a + 1] = (byte) x; 5895: } 5896: if ((l & 0x0200) != 0) { 5897: a -= 2; 5898: int x = XEiJ.regRn[ 6]; 5899: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5900: MainMemory.mmrM8[a + 1] = (byte) x; 5901: } 5902: if ((l & 0x0400) != 0) { 5903: a -= 2; 5904: int x = XEiJ.regRn[ 5]; 5905: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5906: MainMemory.mmrM8[a + 1] = (byte) x; 5907: } 5908: if ((l & 0x0800) != 0) { 5909: a -= 2; 5910: int x = XEiJ.regRn[ 4]; 5911: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5912: MainMemory.mmrM8[a + 1] = (byte) x; 5913: } 5914: if ((l & 0x1000) != 0) { 5915: a -= 2; 5916: int x = XEiJ.regRn[ 3]; 5917: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5918: MainMemory.mmrM8[a + 1] = (byte) x; 5919: } 5920: if ((l & 0x2000) != 0) { 5921: a -= 2; 5922: int x = XEiJ.regRn[ 2]; 5923: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5924: MainMemory.mmrM8[a + 1] = (byte) x; 5925: } 5926: if ((l & 0x4000) != 0) { 5927: a -= 2; 5928: int x = XEiJ.regRn[ 1]; 5929: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5930: MainMemory.mmrM8[a + 1] = (byte) x; 5931: } 5932: if ((short) l < 0) { //(l & 0x8000) != 0 5933: a -= 2; 5934: int x = XEiJ.regRn[ 0]; 5935: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5936: MainMemory.mmrM8[a + 1] = (byte) x; 5937: } 5938: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 5939: for (int i = 15; i >= 0; i--) { 5940: if ((l & 0x8000 >>> i) != 0) { 5941: a -= 2; 5942: int x = XEiJ.regRn[i]; 5943: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5944: MainMemory.mmrM8[a + 1] = (byte) x; 5945: } 5946: } 5947: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 5948: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 5949: for (int i = 15; l != 0; i--, l <<= 1) { 5950: if (l < 0) { 5951: a -= 2; 5952: int x = XEiJ.regRn[i]; 5953: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5954: MainMemory.mmrM8[a + 1] = (byte) x; 5955: } 5956: } 5957: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 5958: for (int i = 15; l != 0; i--, l >>>= 1) { 5959: if ((l & 1) != 0) { 5960: a -= 2; 5961: int x = XEiJ.regRn[i]; 5962: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5963: MainMemory.mmrM8[a + 1] = (byte) x; 5964: } 5965: } 5966: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 5967: for (int i = 15; l != 0; ) { 5968: int k = Integer.numberOfTrailingZeros (l); 5969: a -= 2; 5970: int x = XEiJ.regRn[i -= k]; 5971: MainMemory.mmrM8[a ] = (byte) (x >> 8); 5972: MainMemory.mmrM8[a + 1] = (byte) x; 5973: l = l >>> k & ~1; 5974: } 5975: } 5976: a = t - (short) (t - a); 5977: } else { //メインメモリでないかページを跨ぐ可能性がある 5978: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 5979: if ((l & 0x0001) != 0) { 5980: XEiJ.busWwe (a -= 2, XEiJ.regRn[15]); 5981: } 5982: if ((l & 0x0002) != 0) { 5983: XEiJ.busWwe (a -= 2, XEiJ.regRn[14]); 5984: } 5985: if ((l & 0x0004) != 0) { 5986: XEiJ.busWwe (a -= 2, XEiJ.regRn[13]); 5987: } 5988: if ((l & 0x0008) != 0) { 5989: XEiJ.busWwe (a -= 2, XEiJ.regRn[12]); 5990: } 5991: if ((l & 0x0010) != 0) { 5992: XEiJ.busWwe (a -= 2, XEiJ.regRn[11]); 5993: } 5994: if ((l & 0x0020) != 0) { 5995: XEiJ.busWwe (a -= 2, XEiJ.regRn[10]); 5996: } 5997: if ((l & 0x0040) != 0) { 5998: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 9]); 5999: } 6000: if ((byte) l < 0) { //(l & 0x0080) != 0 6001: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 8]); 6002: } 6003: if ((l & 0x0100) != 0) { 6004: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 7]); 6005: } 6006: if ((l & 0x0200) != 0) { 6007: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 6]); 6008: } 6009: if ((l & 0x0400) != 0) { 6010: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 5]); 6011: } 6012: if ((l & 0x0800) != 0) { 6013: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 4]); 6014: } 6015: if ((l & 0x1000) != 0) { 6016: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 3]); 6017: } 6018: if ((l & 0x2000) != 0) { 6019: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 2]); 6020: } 6021: if ((l & 0x4000) != 0) { 6022: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 1]); 6023: } 6024: if ((short) l < 0) { //(l & 0x8000) != 0 6025: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 0]); 6026: } 6027: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6028: for (int i = 15; i >= 0; i--) { 6029: if ((l & 0x8000 >>> i) != 0) { 6030: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6031: } 6032: } 6033: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6034: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6035: for (int i = 15; l != 0; i--, l <<= 1) { 6036: if (l < 0) { 6037: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6038: } 6039: } 6040: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6041: for (int i = 15; l != 0; i--, l >>>= 1) { 6042: if ((l & 1) != 0) { 6043: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6044: } 6045: } 6046: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6047: for (int i = 15; l != 0; ) { 6048: int k = Integer.numberOfTrailingZeros (l); 6049: XEiJ.busWwe (a -= 2, XEiJ.regRn[i -= k]); 6050: l = l >>> k & ~1; 6051: } 6052: } 6053: } 6054: XEiJ.regRn[arr] = a; 6055: XEiJ.mpuCycleCount += 8 + (t - a << 1); //2バイト/個→4サイクル/個 6056: } else { //-(Ar)以外 6057: int a = efaCltWord (ea); 6058: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6059: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6060: M68kException.m6eAddress = a; 6061: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6062: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 6063: throw M68kException.m6eSignal; 6064: } 6065: int t = a; 6066: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6067: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6068: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) { //16個転送してもページを跨がない 6069: a &= XEiJ.BUS_MOTHER_MASK; 6070: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6071: if ((l & 0x0001) != 0) { 6072: int x = XEiJ.regRn[ 0]; 6073: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6074: MainMemory.mmrM8[a + 1] = (byte) x; 6075: a += 2; 6076: } 6077: if ((l & 0x0002) != 0) { 6078: int x = XEiJ.regRn[ 1]; 6079: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6080: MainMemory.mmrM8[a + 1] = (byte) x; 6081: a += 2; 6082: } 6083: if ((l & 0x0004) != 0) { 6084: int x = XEiJ.regRn[ 2]; 6085: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6086: MainMemory.mmrM8[a + 1] = (byte) x; 6087: a += 2; 6088: } 6089: if ((l & 0x0008) != 0) { 6090: int x = XEiJ.regRn[ 3]; 6091: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6092: MainMemory.mmrM8[a + 1] = (byte) x; 6093: a += 2; 6094: } 6095: if ((l & 0x0010) != 0) { 6096: int x = XEiJ.regRn[ 4]; 6097: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6098: MainMemory.mmrM8[a + 1] = (byte) x; 6099: a += 2; 6100: } 6101: if ((l & 0x0020) != 0) { 6102: int x = XEiJ.regRn[ 5]; 6103: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6104: MainMemory.mmrM8[a + 1] = (byte) x; 6105: a += 2; 6106: } 6107: if ((l & 0x0040) != 0) { 6108: int x = XEiJ.regRn[ 6]; 6109: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6110: MainMemory.mmrM8[a + 1] = (byte) x; 6111: a += 2; 6112: } 6113: if ((byte) l < 0) { //(l & 0x0080) != 0 6114: int x = XEiJ.regRn[ 7]; 6115: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6116: MainMemory.mmrM8[a + 1] = (byte) x; 6117: a += 2; 6118: } 6119: if ((l & 0x0100) != 0) { 6120: int x = XEiJ.regRn[ 8]; 6121: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6122: MainMemory.mmrM8[a + 1] = (byte) x; 6123: a += 2; 6124: } 6125: if ((l & 0x0200) != 0) { 6126: int x = XEiJ.regRn[ 9]; 6127: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6128: MainMemory.mmrM8[a + 1] = (byte) x; 6129: a += 2; 6130: } 6131: if ((l & 0x0400) != 0) { 6132: int x = XEiJ.regRn[10]; 6133: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6134: MainMemory.mmrM8[a + 1] = (byte) x; 6135: a += 2; 6136: } 6137: if ((l & 0x0800) != 0) { 6138: int x = XEiJ.regRn[11]; 6139: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6140: MainMemory.mmrM8[a + 1] = (byte) x; 6141: a += 2; 6142: } 6143: if ((l & 0x1000) != 0) { 6144: int x = XEiJ.regRn[12]; 6145: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6146: MainMemory.mmrM8[a + 1] = (byte) x; 6147: a += 2; 6148: } 6149: if ((l & 0x2000) != 0) { 6150: int x = XEiJ.regRn[13]; 6151: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6152: MainMemory.mmrM8[a + 1] = (byte) x; 6153: a += 2; 6154: } 6155: if ((l & 0x4000) != 0) { 6156: int x = XEiJ.regRn[14]; 6157: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6158: MainMemory.mmrM8[a + 1] = (byte) x; 6159: a += 2; 6160: } 6161: if ((short) l < 0) { //(l & 0x8000) != 0 6162: int x = XEiJ.regRn[15]; 6163: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6164: MainMemory.mmrM8[a + 1] = (byte) x; 6165: a += 2; 6166: } 6167: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6168: for (int i = 0; i <= 15; i++) { 6169: if ((l & 0x0001 << i) != 0) { 6170: int x = XEiJ.regRn[i]; 6171: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6172: MainMemory.mmrM8[a + 1] = (byte) x; 6173: a += 2; 6174: } 6175: } 6176: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6177: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6178: for (int i = 0; l != 0; i++, l <<= 1) { 6179: if (l < 0) { 6180: int x = XEiJ.regRn[i]; 6181: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6182: MainMemory.mmrM8[a + 1] = (byte) x; 6183: a += 2; 6184: } 6185: } 6186: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6187: for (int i = 0; l != 0; i++, l >>>= 1) { 6188: if ((l & 1) != 0) { 6189: int x = XEiJ.regRn[i]; 6190: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6191: MainMemory.mmrM8[a + 1] = (byte) x; 6192: a += 2; 6193: } 6194: } 6195: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6196: for (int i = 0; l != 0; ) { 6197: int k = Integer.numberOfTrailingZeros (l); 6198: int x = XEiJ.regRn[i += k]; 6199: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6200: MainMemory.mmrM8[a + 1] = (byte) x; 6201: a += 2; 6202: l = l >>> k & ~1; 6203: } 6204: } 6205: a = t + (short) (a - t); 6206: } else { //メインメモリでないかページを跨ぐ可能性がある 6207: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6208: if ((l & 0x0001) != 0) { 6209: XEiJ.busWwe (a, XEiJ.regRn[ 0]); 6210: a += 2; 6211: } 6212: if ((l & 0x0002) != 0) { 6213: XEiJ.busWwe (a, XEiJ.regRn[ 1]); 6214: a += 2; 6215: } 6216: if ((l & 0x0004) != 0) { 6217: XEiJ.busWwe (a, XEiJ.regRn[ 2]); 6218: a += 2; 6219: } 6220: if ((l & 0x0008) != 0) { 6221: XEiJ.busWwe (a, XEiJ.regRn[ 3]); 6222: a += 2; 6223: } 6224: if ((l & 0x0010) != 0) { 6225: XEiJ.busWwe (a, XEiJ.regRn[ 4]); 6226: a += 2; 6227: } 6228: if ((l & 0x0020) != 0) { 6229: XEiJ.busWwe (a, XEiJ.regRn[ 5]); 6230: a += 2; 6231: } 6232: if ((l & 0x0040) != 0) { 6233: XEiJ.busWwe (a, XEiJ.regRn[ 6]); 6234: a += 2; 6235: } 6236: if ((byte) l < 0) { //(l & 0x0080) != 0 6237: XEiJ.busWwe (a, XEiJ.regRn[ 7]); 6238: a += 2; 6239: } 6240: if ((l & 0x0100) != 0) { 6241: XEiJ.busWwe (a, XEiJ.regRn[ 8]); 6242: a += 2; 6243: } 6244: if ((l & 0x0200) != 0) { 6245: XEiJ.busWwe (a, XEiJ.regRn[ 9]); 6246: a += 2; 6247: } 6248: if ((l & 0x0400) != 0) { 6249: XEiJ.busWwe (a, XEiJ.regRn[10]); 6250: a += 2; 6251: } 6252: if ((l & 0x0800) != 0) { 6253: XEiJ.busWwe (a, XEiJ.regRn[11]); 6254: a += 2; 6255: } 6256: if ((l & 0x1000) != 0) { 6257: XEiJ.busWwe (a, XEiJ.regRn[12]); 6258: a += 2; 6259: } 6260: if ((l & 0x2000) != 0) { 6261: XEiJ.busWwe (a, XEiJ.regRn[13]); 6262: a += 2; 6263: } 6264: if ((l & 0x4000) != 0) { 6265: XEiJ.busWwe (a, XEiJ.regRn[14]); 6266: a += 2; 6267: } 6268: if ((short) l < 0) { //(l & 0x8000) != 0 6269: XEiJ.busWwe (a, XEiJ.regRn[15]); 6270: a += 2; 6271: } 6272: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6273: for (int i = 0; i <= 15; i++) { 6274: if ((l & 0x0001 << i) != 0) { 6275: XEiJ.busWwe (a, XEiJ.regRn[i]); 6276: a += 2; 6277: } 6278: } 6279: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6280: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6281: for (int i = 0; l != 0; i++, l <<= 1) { 6282: if (l < 0) { 6283: XEiJ.busWwe (a, XEiJ.regRn[i]); 6284: a += 2; 6285: } 6286: } 6287: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6288: for (int i = 0; l != 0; i++, l >>>= 1) { 6289: if ((l & 1) != 0) { 6290: XEiJ.busWwe (a, XEiJ.regRn[i]); 6291: a += 2; 6292: } 6293: } 6294: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6295: for (int i = 0; l != 0; ) { 6296: int k = Integer.numberOfTrailingZeros (l); 6297: XEiJ.busWwe (a, XEiJ.regRn[i += k]); 6298: a += 2; 6299: l = l >>> k & ~1; 6300: } 6301: } 6302: } 6303: XEiJ.mpuCycleCount += 4 + (a - t << 1); //2バイト/個→4サイクル/個 6304: } 6305: } 6306: } //irpMovemToMemWord 6307: 6308: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6309: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6310: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6311: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6312: //EXT.L Dr |-|012346|-|-UUUU|-**00|D |0100_100_011_000_rrr 6313: //MOVEM.L <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_011_mmm_rrr-llllllllllllllll 6314: public static void irpMovemToMemLong () throws M68kException { 6315: int ea = XEiJ.regOC & 63; 6316: if (ea < XEiJ.EA_AR) { //EXT.L Dr 6317: XEiJ.mpuCycleCount += 4; 6318: int z; 6319: XEiJ.regRn[ea] = z = (short) XEiJ.regRn[ea]; 6320: 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 6321: } else { //MOVEM.L <list>,<ea> 6322: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 6323: XEiJ.regPC += 2; 6324: if (ea >> 3 == XEiJ.MMM_MN) { //-(Ar) 6325: //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む 6326: //転送するレジスタが0個のときArは変化しない 6327: int arr = ea - (XEiJ.EA_MN - 8); 6328: int a = XEiJ.regRn[arr]; 6329: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6330: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6331: M68kException.m6eAddress = a; 6332: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6333: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 6334: throw M68kException.m6eSignal; 6335: } 6336: int t = a; 6337: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6338: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 4 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6339: 4 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) { //16個転送してもページを跨がない 6340: a &= XEiJ.BUS_MOTHER_MASK; 6341: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6342: if ((l & 0x0001) != 0) { 6343: a -= 4; 6344: int x = XEiJ.regRn[15]; 6345: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6346: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6347: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6348: MainMemory.mmrM8[a + 3] = (byte) x; 6349: } 6350: if ((l & 0x0002) != 0) { 6351: a -= 4; 6352: int x = XEiJ.regRn[14]; 6353: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6354: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6355: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6356: MainMemory.mmrM8[a + 3] = (byte) x; 6357: } 6358: if ((l & 0x0004) != 0) { 6359: a -= 4; 6360: int x = XEiJ.regRn[13]; 6361: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6362: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6363: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6364: MainMemory.mmrM8[a + 3] = (byte) x; 6365: } 6366: if ((l & 0x0008) != 0) { 6367: a -= 4; 6368: int x = XEiJ.regRn[12]; 6369: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6370: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6371: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6372: MainMemory.mmrM8[a + 3] = (byte) x; 6373: } 6374: if ((l & 0x0010) != 0) { 6375: a -= 4; 6376: int x = XEiJ.regRn[11]; 6377: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6378: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6379: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6380: MainMemory.mmrM8[a + 3] = (byte) x; 6381: } 6382: if ((l & 0x0020) != 0) { 6383: a -= 4; 6384: int x = XEiJ.regRn[10]; 6385: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6386: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6387: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6388: MainMemory.mmrM8[a + 3] = (byte) x; 6389: } 6390: if ((l & 0x0040) != 0) { 6391: a -= 4; 6392: int x = XEiJ.regRn[ 9]; 6393: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6394: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6395: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6396: MainMemory.mmrM8[a + 3] = (byte) x; 6397: } 6398: if ((byte) l < 0) { //(l & 0x0080) != 0 6399: a -= 4; 6400: int x = XEiJ.regRn[ 8]; 6401: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6402: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6403: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6404: MainMemory.mmrM8[a + 3] = (byte) x; 6405: } 6406: if ((l & 0x0100) != 0) { 6407: a -= 4; 6408: int x = XEiJ.regRn[ 7]; 6409: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6410: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6411: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6412: MainMemory.mmrM8[a + 3] = (byte) x; 6413: } 6414: if ((l & 0x0200) != 0) { 6415: a -= 4; 6416: int x = XEiJ.regRn[ 6]; 6417: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6418: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6419: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6420: MainMemory.mmrM8[a + 3] = (byte) x; 6421: } 6422: if ((l & 0x0400) != 0) { 6423: a -= 4; 6424: int x = XEiJ.regRn[ 5]; 6425: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6426: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6427: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6428: MainMemory.mmrM8[a + 3] = (byte) x; 6429: } 6430: if ((l & 0x0800) != 0) { 6431: a -= 4; 6432: int x = XEiJ.regRn[ 4]; 6433: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6434: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6435: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6436: MainMemory.mmrM8[a + 3] = (byte) x; 6437: } 6438: if ((l & 0x1000) != 0) { 6439: a -= 4; 6440: int x = XEiJ.regRn[ 3]; 6441: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6442: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6443: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6444: MainMemory.mmrM8[a + 3] = (byte) x; 6445: } 6446: if ((l & 0x2000) != 0) { 6447: a -= 4; 6448: int x = XEiJ.regRn[ 2]; 6449: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6450: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6451: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6452: MainMemory.mmrM8[a + 3] = (byte) x; 6453: } 6454: if ((l & 0x4000) != 0) { 6455: a -= 4; 6456: int x = XEiJ.regRn[ 1]; 6457: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6458: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6459: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6460: MainMemory.mmrM8[a + 3] = (byte) x; 6461: } 6462: if ((short) l < 0) { //(l & 0x8000) != 0 6463: a -= 4; 6464: int x = XEiJ.regRn[ 0]; 6465: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6466: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6467: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6468: MainMemory.mmrM8[a + 3] = (byte) x; 6469: } 6470: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6471: for (int i = 15; i >= 0; i--) { 6472: if ((l & 0x8000 >>> i) != 0) { 6473: a -= 4; 6474: int x = XEiJ.regRn[i]; 6475: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6476: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6477: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6478: MainMemory.mmrM8[a + 3] = (byte) x; 6479: } 6480: } 6481: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6482: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6483: for (int i = 15; l != 0; i--, l <<= 1) { 6484: if (l < 0) { 6485: a -= 4; 6486: int x = XEiJ.regRn[i]; 6487: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6488: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6489: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6490: MainMemory.mmrM8[a + 3] = (byte) x; 6491: } 6492: } 6493: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6494: for (int i = 15; l != 0; i--, l >>>= 1) { 6495: if ((l & 1) != 0) { 6496: a -= 4; 6497: int x = XEiJ.regRn[i]; 6498: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6499: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6500: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6501: MainMemory.mmrM8[a + 3] = (byte) x; 6502: } 6503: } 6504: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6505: for (int i = 15; l != 0; ) { 6506: int k = Integer.numberOfTrailingZeros (l); 6507: a -= 4; 6508: int x = XEiJ.regRn[i -= k]; 6509: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6510: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6511: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6512: MainMemory.mmrM8[a + 3] = (byte) x; 6513: l = l >>> k & ~1; 6514: } 6515: } 6516: a = t - (short) (t - a); 6517: } else { //メインメモリでないかページを跨ぐ可能性がある 6518: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6519: if ((l & 0x0001) != 0) { 6520: XEiJ.busWle (a -= 4, XEiJ.regRn[15]); 6521: } 6522: if ((l & 0x0002) != 0) { 6523: XEiJ.busWle (a -= 4, XEiJ.regRn[14]); 6524: } 6525: if ((l & 0x0004) != 0) { 6526: XEiJ.busWle (a -= 4, XEiJ.regRn[13]); 6527: } 6528: if ((l & 0x0008) != 0) { 6529: XEiJ.busWle (a -= 4, XEiJ.regRn[12]); 6530: } 6531: if ((l & 0x0010) != 0) { 6532: XEiJ.busWle (a -= 4, XEiJ.regRn[11]); 6533: } 6534: if ((l & 0x0020) != 0) { 6535: XEiJ.busWle (a -= 4, XEiJ.regRn[10]); 6536: } 6537: if ((l & 0x0040) != 0) { 6538: XEiJ.busWle (a -= 4, XEiJ.regRn[ 9]); 6539: } 6540: if ((byte) l < 0) { //(l & 0x0080) != 0 6541: XEiJ.busWle (a -= 4, XEiJ.regRn[ 8]); 6542: } 6543: if ((l & 0x0100) != 0) { 6544: XEiJ.busWle (a -= 4, XEiJ.regRn[ 7]); 6545: } 6546: if ((l & 0x0200) != 0) { 6547: XEiJ.busWle (a -= 4, XEiJ.regRn[ 6]); 6548: } 6549: if ((l & 0x0400) != 0) { 6550: XEiJ.busWle (a -= 4, XEiJ.regRn[ 5]); 6551: } 6552: if ((l & 0x0800) != 0) { 6553: XEiJ.busWle (a -= 4, XEiJ.regRn[ 4]); 6554: } 6555: if ((l & 0x1000) != 0) { 6556: XEiJ.busWle (a -= 4, XEiJ.regRn[ 3]); 6557: } 6558: if ((l & 0x2000) != 0) { 6559: XEiJ.busWle (a -= 4, XEiJ.regRn[ 2]); 6560: } 6561: if ((l & 0x4000) != 0) { 6562: XEiJ.busWle (a -= 4, XEiJ.regRn[ 1]); 6563: } 6564: if ((short) l < 0) { //(l & 0x8000) != 0 6565: XEiJ.busWle (a -= 4, XEiJ.regRn[ 0]); 6566: } 6567: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6568: for (int i = 15; i >= 0; i--) { 6569: if ((l & 0x8000 >>> i) != 0) { 6570: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6571: } 6572: } 6573: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6574: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6575: for (int i = 15; l != 0; i--, l <<= 1) { 6576: if (l < 0) { 6577: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6578: } 6579: } 6580: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6581: for (int i = 15; l != 0; i--, l >>>= 1) { 6582: if ((l & 1) != 0) { 6583: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6584: } 6585: } 6586: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6587: for (int i = 15; l != 0; ) { 6588: int k = Integer.numberOfTrailingZeros (l); 6589: XEiJ.busWle (a -= 4, XEiJ.regRn[i -= k]); 6590: l = l >>> k & ~1; 6591: } 6592: } 6593: } 6594: XEiJ.regRn[arr] = a; 6595: XEiJ.mpuCycleCount += 8 + (t - a << 1); //4バイト/個→8サイクル/個 6596: } else { //-(Ar)以外 6597: int a = efaCltLong (ea); 6598: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6599: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6600: M68kException.m6eAddress = a; 6601: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6602: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 6603: throw M68kException.m6eSignal; 6604: } 6605: int t = a; 6606: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6607: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6608: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) { //16個転送してもページを跨がない 6609: a &= XEiJ.BUS_MOTHER_MASK; 6610: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6611: if ((l & 0x0001) != 0) { 6612: int x = XEiJ.regRn[ 0]; 6613: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6614: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6615: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6616: MainMemory.mmrM8[a + 3] = (byte) x; 6617: a += 4; 6618: } 6619: if ((l & 0x0002) != 0) { 6620: int x = XEiJ.regRn[ 1]; 6621: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6622: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6623: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6624: MainMemory.mmrM8[a + 3] = (byte) x; 6625: a += 4; 6626: } 6627: if ((l & 0x0004) != 0) { 6628: int x = XEiJ.regRn[ 2]; 6629: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6630: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6631: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6632: MainMemory.mmrM8[a + 3] = (byte) x; 6633: a += 4; 6634: } 6635: if ((l & 0x0008) != 0) { 6636: int x = XEiJ.regRn[ 3]; 6637: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6638: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6639: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6640: MainMemory.mmrM8[a + 3] = (byte) x; 6641: a += 4; 6642: } 6643: if ((l & 0x0010) != 0) { 6644: int x = XEiJ.regRn[ 4]; 6645: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6646: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6647: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6648: MainMemory.mmrM8[a + 3] = (byte) x; 6649: a += 4; 6650: } 6651: if ((l & 0x0020) != 0) { 6652: int x = XEiJ.regRn[ 5]; 6653: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6654: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6655: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6656: MainMemory.mmrM8[a + 3] = (byte) x; 6657: a += 4; 6658: } 6659: if ((l & 0x0040) != 0) { 6660: int x = XEiJ.regRn[ 6]; 6661: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6662: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6663: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6664: MainMemory.mmrM8[a + 3] = (byte) x; 6665: a += 4; 6666: } 6667: if ((byte) l < 0) { //(l & 0x0080) != 0 6668: int x = XEiJ.regRn[ 7]; 6669: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6670: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6671: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6672: MainMemory.mmrM8[a + 3] = (byte) x; 6673: a += 4; 6674: } 6675: if ((l & 0x0100) != 0) { 6676: int x = XEiJ.regRn[ 8]; 6677: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6678: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6679: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6680: MainMemory.mmrM8[a + 3] = (byte) x; 6681: a += 4; 6682: } 6683: if ((l & 0x0200) != 0) { 6684: int x = XEiJ.regRn[ 9]; 6685: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6686: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6687: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6688: MainMemory.mmrM8[a + 3] = (byte) x; 6689: a += 4; 6690: } 6691: if ((l & 0x0400) != 0) { 6692: int x = XEiJ.regRn[10]; 6693: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6694: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6695: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6696: MainMemory.mmrM8[a + 3] = (byte) x; 6697: a += 4; 6698: } 6699: if ((l & 0x0800) != 0) { 6700: int x = XEiJ.regRn[11]; 6701: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6702: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6703: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6704: MainMemory.mmrM8[a + 3] = (byte) x; 6705: a += 4; 6706: } 6707: if ((l & 0x1000) != 0) { 6708: int x = XEiJ.regRn[12]; 6709: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6710: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6711: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6712: MainMemory.mmrM8[a + 3] = (byte) x; 6713: a += 4; 6714: } 6715: if ((l & 0x2000) != 0) { 6716: int x = XEiJ.regRn[13]; 6717: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6718: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6719: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6720: MainMemory.mmrM8[a + 3] = (byte) x; 6721: a += 4; 6722: } 6723: if ((l & 0x4000) != 0) { 6724: int x = XEiJ.regRn[14]; 6725: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6726: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6727: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6728: MainMemory.mmrM8[a + 3] = (byte) x; 6729: a += 4; 6730: } 6731: if ((short) l < 0) { //(l & 0x8000) != 0 6732: int x = XEiJ.regRn[15]; 6733: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6734: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6735: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6736: MainMemory.mmrM8[a + 3] = (byte) x; 6737: a += 4; 6738: } 6739: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6740: for (int i = 0; i <= 15; i++) { 6741: if ((l & 0x0001 << i) != 0) { 6742: int x = XEiJ.regRn[i]; 6743: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6744: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6745: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6746: MainMemory.mmrM8[a + 3] = (byte) x; 6747: a += 4; 6748: } 6749: } 6750: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6751: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6752: for (int i = 0; l != 0; i++, l <<= 1) { 6753: if (l < 0) { 6754: int x = XEiJ.regRn[i]; 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: a += 4; 6760: } 6761: } 6762: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6763: for (int i = 0; l != 0; i++, l >>>= 1) { 6764: if ((l & 1) != 0) { 6765: int x = XEiJ.regRn[i]; 6766: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6767: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6768: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6769: MainMemory.mmrM8[a + 3] = (byte) x; 6770: a += 4; 6771: } 6772: } 6773: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6774: for (int i = 0; l != 0; ) { 6775: int k = Integer.numberOfTrailingZeros (l); 6776: int x = XEiJ.regRn[i += k]; 6777: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6778: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6779: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6780: MainMemory.mmrM8[a + 3] = (byte) x; 6781: a += 4; 6782: l = l >>> k & ~1; 6783: } 6784: } 6785: a = t + (short) (a - t); 6786: } else { //メインメモリでないかページを跨ぐ可能性がある 6787: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6788: if ((l & 0x0001) != 0) { 6789: XEiJ.busWle (a, XEiJ.regRn[ 0]); 6790: a += 4; 6791: } 6792: if ((l & 0x0002) != 0) { 6793: XEiJ.busWle (a, XEiJ.regRn[ 1]); 6794: a += 4; 6795: } 6796: if ((l & 0x0004) != 0) { 6797: XEiJ.busWle (a, XEiJ.regRn[ 2]); 6798: a += 4; 6799: } 6800: if ((l & 0x0008) != 0) { 6801: XEiJ.busWle (a, XEiJ.regRn[ 3]); 6802: a += 4; 6803: } 6804: if ((l & 0x0010) != 0) { 6805: XEiJ.busWle (a, XEiJ.regRn[ 4]); 6806: a += 4; 6807: } 6808: if ((l & 0x0020) != 0) { 6809: XEiJ.busWle (a, XEiJ.regRn[ 5]); 6810: a += 4; 6811: } 6812: if ((l & 0x0040) != 0) { 6813: XEiJ.busWle (a, XEiJ.regRn[ 6]); 6814: a += 4; 6815: } 6816: if ((byte) l < 0) { //(l & 0x0080) != 0 6817: XEiJ.busWle (a, XEiJ.regRn[ 7]); 6818: a += 4; 6819: } 6820: if ((l & 0x0100) != 0) { 6821: XEiJ.busWle (a, XEiJ.regRn[ 8]); 6822: a += 4; 6823: } 6824: if ((l & 0x0200) != 0) { 6825: XEiJ.busWle (a, XEiJ.regRn[ 9]); 6826: a += 4; 6827: } 6828: if ((l & 0x0400) != 0) { 6829: XEiJ.busWle (a, XEiJ.regRn[10]); 6830: a += 4; 6831: } 6832: if ((l & 0x0800) != 0) { 6833: XEiJ.busWle (a, XEiJ.regRn[11]); 6834: a += 4; 6835: } 6836: if ((l & 0x1000) != 0) { 6837: XEiJ.busWle (a, XEiJ.regRn[12]); 6838: a += 4; 6839: } 6840: if ((l & 0x2000) != 0) { 6841: XEiJ.busWle (a, XEiJ.regRn[13]); 6842: a += 4; 6843: } 6844: if ((l & 0x4000) != 0) { 6845: XEiJ.busWle (a, XEiJ.regRn[14]); 6846: a += 4; 6847: } 6848: if ((short) l < 0) { //(l & 0x8000) != 0 6849: XEiJ.busWle (a, XEiJ.regRn[15]); 6850: a += 4; 6851: } 6852: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6853: for (int i = 0; i <= 15; i++) { 6854: if ((l & 0x0001 << i) != 0) { 6855: XEiJ.busWle (a, XEiJ.regRn[i]); 6856: a += 4; 6857: } 6858: } 6859: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6860: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6861: for (int i = 0; l != 0; i++, l <<= 1) { 6862: if (l < 0) { 6863: XEiJ.busWle (a, XEiJ.regRn[i]); 6864: a += 4; 6865: } 6866: } 6867: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6868: for (int i = 0; l != 0; i++, l >>>= 1) { 6869: if ((l & 1) != 0) { 6870: XEiJ.busWle (a, XEiJ.regRn[i]); 6871: a += 4; 6872: } 6873: } 6874: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6875: for (int i = 0; l != 0; ) { 6876: int k = Integer.numberOfTrailingZeros (l); 6877: XEiJ.busWle (a, XEiJ.regRn[i += k]); 6878: a += 4; 6879: l = l >>> k & ~1; 6880: } 6881: } 6882: } 6883: XEiJ.mpuCycleCount += 0 + (a - t << 1); //4バイト/個→8サイクル/個 6884: } 6885: } 6886: } //irpMovemToMemLong 6887: 6888: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6889: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6890: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6891: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6892: //TST.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_000_mmm_rrr 6893: public static void irpTstByte () throws M68kException { 6894: XEiJ.mpuCycleCount += 4; 6895: int ea = XEiJ.regOC & 63; 6896: 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。アドレッシングモードに注意 6897: } //irpTstByte 6898: 6899: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6900: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6901: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6902: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6903: //TST.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_001_mmm_rrr 6904: public static void irpTstWord () throws M68kException { 6905: XEiJ.mpuCycleCount += 4; 6906: int ea = XEiJ.regOC & 63; 6907: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea)); //アドレッシングモードに注意 6908: 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 6909: } //irpTstWord 6910: 6911: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6912: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6913: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6914: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6915: //TST.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_010_mmm_rrr 6916: public static void irpTstLong () throws M68kException { 6917: XEiJ.mpuCycleCount += 4; 6918: int ea = XEiJ.regOC & 63; 6919: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRls (efaMltLong (ea)); //アドレッシングモードに注意 6920: 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 6921: } //irpTstLong 6922: 6923: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6924: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6925: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6926: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6927: //TAS.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_011_mmm_rrr 6928: //ILLEGAL |-|012346|-|-----|-----| |0100_101_011_111_100 6929: public static void irpTas () throws M68kException { 6930: int ea = XEiJ.regOC & 63; 6931: int z; 6932: if (ea < XEiJ.EA_AR) { //TAS.B Dr 6933: XEiJ.mpuCycleCount += 4; 6934: XEiJ.regRn[ea] = 0x80 | (z = XEiJ.regRn[ea]); 6935: } else if (ea == XEiJ.EA_IM) { //ILLEGAL 6936: XEiJ.mpuCycleCount += 34; 6937: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 6938: throw M68kException.m6eSignal; 6939: } else { //TAS.B <mem> 6940: XEiJ.mpuCycleCount += 10; 6941: int a = efaMltByte (ea); 6942: XEiJ.busWb (a, 0x80 | (z = XEiJ.busRbs (a))); 6943: } 6944: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 6945: } //irpTas 6946: 6947: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6948: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6949: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6950: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6951: //SATS.L Dr |-|------|-|-UUUU|-**00|D |0100_110_010_000_rrr (ISA_B) 6952: //MOVEM.W <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll 6953: // 6954: //SATS.L Dr 6955: // VがセットされていたらDrを符号が逆で絶対値が最大の値にする(直前のDrに対する演算を飽和演算にする) 6956: public static void irpMovemToRegWord () throws M68kException { 6957: int ea = XEiJ.regOC & 63; 6958: if (ea < XEiJ.EA_AR) { //SATS.L Dr 6959: XEiJ.mpuCycleCount += 4; 6960: int z = XEiJ.regRn[ea]; 6961: if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 < 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) != 0) { //Vがセットされているとき 6962: XEiJ.regRn[ea] = z = z >> 31 ^ 0x80000000; //符号が逆で絶対値が最大の値にする 6963: } 6964: 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 6965: } else { //MOVEM.W <ea>,<list> 6966: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 6967: XEiJ.regPC += 2; 6968: int arr, a; 6969: if (ea >> 3 == XEiJ.MMM_MP) { //(Ar)+ 6970: XEiJ.mpuCycleCount += 12; 6971: arr = ea - (XEiJ.EA_MP - 8); 6972: a = XEiJ.regRn[arr]; 6973: } else { //(Ar)+以外 6974: XEiJ.mpuCycleCount += 8; 6975: arr = 16; 6976: a = efaCntWord (ea); 6977: } 6978: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6979: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6980: M68kException.m6eAddress = a; 6981: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 6982: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 6983: throw M68kException.m6eSignal; 6984: } 6985: int t = a; 6986: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6987: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6988: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) { //16個転送してもページを跨がない 6989: a &= XEiJ.BUS_MOTHER_MASK; 6990: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6991: if ((l & 0x0001) != 0) { 6992: XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 6993: a += 2; 6994: } 6995: if ((l & 0x0002) != 0) { 6996: XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 6997: a += 2; 6998: } 6999: if ((l & 0x0004) != 0) { 7000: XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7001: a += 2; 7002: } 7003: if ((l & 0x0008) != 0) { 7004: XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7005: a += 2; 7006: } 7007: if ((l & 0x0010) != 0) { 7008: XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7009: a += 2; 7010: } 7011: if ((l & 0x0020) != 0) { 7012: XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7013: a += 2; 7014: } 7015: if ((l & 0x0040) != 0) { 7016: XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7017: a += 2; 7018: } 7019: if ((byte) l < 0) { //(l & 0x0080) != 0 7020: XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7021: a += 2; 7022: } 7023: if ((l & 0x0100) != 0) { 7024: XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7025: a += 2; 7026: } 7027: if ((l & 0x0200) != 0) { 7028: XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7029: a += 2; 7030: } 7031: if ((l & 0x0400) != 0) { 7032: XEiJ.regRn[10] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7033: a += 2; 7034: } 7035: if ((l & 0x0800) != 0) { 7036: XEiJ.regRn[11] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7037: a += 2; 7038: } 7039: if ((l & 0x1000) != 0) { 7040: XEiJ.regRn[12] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7041: a += 2; 7042: } 7043: if ((l & 0x2000) != 0) { 7044: XEiJ.regRn[13] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7045: a += 2; 7046: } 7047: if ((l & 0x4000) != 0) { 7048: XEiJ.regRn[14] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7049: a += 2; 7050: } 7051: if ((short) l < 0) { //(l & 0x8000) != 0 7052: XEiJ.regRn[15] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7053: a += 2; 7054: } 7055: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7056: for (int i = 0; i <= 15; i++) { 7057: if ((l & 0x0001 << i) != 0) { 7058: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7059: a += 2; 7060: } 7061: } 7062: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7063: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7064: for (int i = 0; l != 0; i++, l <<= 1) { 7065: if (l < 0) { 7066: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7067: a += 2; 7068: } 7069: } 7070: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7071: for (int i = 0; l != 0; i++, l >>>= 1) { 7072: if ((l & 1) != 0) { 7073: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7074: a += 2; 7075: } 7076: } 7077: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7078: for (int i = 0; l != 0; ) { 7079: int k = Integer.numberOfTrailingZeros (l); 7080: XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7081: a += 2; 7082: l = l >>> k & ~1; 7083: } 7084: } 7085: a = t + (short) (a - t); 7086: } else { //メインメモリでないかページを跨ぐ可能性がある 7087: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7088: if ((l & 0x0001) != 0) { 7089: XEiJ.regRn[ 0] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7090: a += 2; 7091: } 7092: if ((l & 0x0002) != 0) { 7093: XEiJ.regRn[ 1] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7094: a += 2; 7095: } 7096: if ((l & 0x0004) != 0) { 7097: XEiJ.regRn[ 2] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7098: a += 2; 7099: } 7100: if ((l & 0x0008) != 0) { 7101: XEiJ.regRn[ 3] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7102: a += 2; 7103: } 7104: if ((l & 0x0010) != 0) { 7105: XEiJ.regRn[ 4] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7106: a += 2; 7107: } 7108: if ((l & 0x0020) != 0) { 7109: XEiJ.regRn[ 5] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7110: a += 2; 7111: } 7112: if ((l & 0x0040) != 0) { 7113: XEiJ.regRn[ 6] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7114: a += 2; 7115: } 7116: if ((byte) l < 0) { //(l & 0x0080) != 0 7117: XEiJ.regRn[ 7] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7118: a += 2; 7119: } 7120: if ((l & 0x0100) != 0) { 7121: XEiJ.regRn[ 8] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7122: a += 2; 7123: } 7124: if ((l & 0x0200) != 0) { 7125: XEiJ.regRn[ 9] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7126: a += 2; 7127: } 7128: if ((l & 0x0400) != 0) { 7129: XEiJ.regRn[10] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7130: a += 2; 7131: } 7132: if ((l & 0x0800) != 0) { 7133: XEiJ.regRn[11] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7134: a += 2; 7135: } 7136: if ((l & 0x1000) != 0) { 7137: XEiJ.regRn[12] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7138: a += 2; 7139: } 7140: if ((l & 0x2000) != 0) { 7141: XEiJ.regRn[13] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7142: a += 2; 7143: } 7144: if ((l & 0x4000) != 0) { 7145: XEiJ.regRn[14] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7146: a += 2; 7147: } 7148: if ((short) l < 0) { //(l & 0x8000) != 0 7149: XEiJ.regRn[15] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7150: a += 2; 7151: } 7152: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7153: for (int i = 0; i <= 15; i++) { 7154: if ((l & 0x0001 << i) != 0) { 7155: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7156: a += 2; 7157: } 7158: } 7159: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7160: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7161: for (int i = 0; l != 0; i++, l <<= 1) { 7162: if (l < 0) { 7163: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7164: a += 2; 7165: } 7166: } 7167: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7168: for (int i = 0; l != 0; i++, l >>>= 1) { 7169: if ((l & 1) != 0) { 7170: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7171: a += 2; 7172: } 7173: } 7174: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7175: for (int i = 0; l != 0; ) { 7176: int k = Integer.numberOfTrailingZeros (l); 7177: XEiJ.regRn[i += k] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7178: a += 2; 7179: l = l >>> k & ~1; 7180: } 7181: } 7182: } 7183: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7184: //! 軽量化。MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするが省略する 7185: // MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する 7186: // RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、 7187: // 12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因 7188: } else { 7189: XEiJ.busRws (a); 7190: } 7191: //MOVEM.W (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする 7192: XEiJ.regRn[arr] = a; 7193: XEiJ.mpuCycleCount += a - t << 1; //2バイト/個→4サイクル/個 7194: } 7195: } //irpMovemToRegWord 7196: 7197: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7198: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7199: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7200: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7201: //MOVEM.L <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll 7202: public static void irpMovemToRegLong () throws M68kException { 7203: int ea = XEiJ.regOC & 63; 7204: { 7205: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 7206: XEiJ.regPC += 2; 7207: int arr, a; 7208: if (ea >> 3 == XEiJ.MMM_MP) { //(Ar)+ 7209: XEiJ.mpuCycleCount += 8; 7210: arr = ea - (XEiJ.EA_MP - 8); 7211: a = XEiJ.regRn[arr]; 7212: } else { //(Ar)+以外 7213: XEiJ.mpuCycleCount += 4; 7214: arr = 16; 7215: a = efaCntLong (ea); 7216: } 7217: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 7218: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 7219: M68kException.m6eAddress = a; 7220: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 7221: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 7222: throw M68kException.m6eSignal; 7223: } 7224: int t = a; 7225: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 7226: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 7227: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) { //16個転送してもページを跨がない 7228: a &= XEiJ.BUS_MOTHER_MASK; 7229: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7230: if ((l & 0x0001) != 0) { 7231: XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7232: a += 4; 7233: } 7234: if ((l & 0x0002) != 0) { 7235: XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7236: a += 4; 7237: } 7238: if ((l & 0x0004) != 0) { 7239: XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7240: a += 4; 7241: } 7242: if ((l & 0x0008) != 0) { 7243: XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7244: a += 4; 7245: } 7246: if ((l & 0x0010) != 0) { 7247: XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7248: a += 4; 7249: } 7250: if ((l & 0x0020) != 0) { 7251: XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7252: a += 4; 7253: } 7254: if ((l & 0x0040) != 0) { 7255: XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7256: a += 4; 7257: } 7258: if ((byte) l < 0) { //(l & 0x0080) != 0 7259: XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7260: a += 4; 7261: } 7262: if ((l & 0x0100) != 0) { 7263: XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7264: a += 4; 7265: } 7266: if ((l & 0x0200) != 0) { 7267: XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7268: a += 4; 7269: } 7270: if ((l & 0x0400) != 0) { 7271: XEiJ.regRn[10] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7272: a += 4; 7273: } 7274: if ((l & 0x0800) != 0) { 7275: XEiJ.regRn[11] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7276: a += 4; 7277: } 7278: if ((l & 0x1000) != 0) { 7279: XEiJ.regRn[12] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7280: a += 4; 7281: } 7282: if ((l & 0x2000) != 0) { 7283: XEiJ.regRn[13] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7284: a += 4; 7285: } 7286: if ((l & 0x4000) != 0) { 7287: XEiJ.regRn[14] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7288: a += 4; 7289: } 7290: if ((short) l < 0) { //(l & 0x8000) != 0 7291: XEiJ.regRn[15] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7292: a += 4; 7293: } 7294: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7295: for (int i = 0; i <= 15; i++) { 7296: if ((l & 0x0001 << i) != 0) { 7297: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7298: a += 4; 7299: } 7300: } 7301: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7302: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7303: for (int i = 0; l != 0; i++, l <<= 1) { 7304: if (l < 0) { 7305: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7306: a += 4; 7307: } 7308: } 7309: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7310: for (int i = 0; l != 0; i++, l >>>= 1) { 7311: if ((l & 1) != 0) { 7312: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7313: a += 4; 7314: } 7315: } 7316: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7317: for (int i = 0; l != 0; ) { 7318: int k = Integer.numberOfTrailingZeros (l); 7319: 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); 7320: a += 4; 7321: l = l >>> k & ~1; 7322: } 7323: } 7324: a = t + (short) (a - t); 7325: } else { //メインメモリでないかページを跨ぐ可能性がある 7326: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7327: if ((l & 0x0001) != 0) { 7328: XEiJ.regRn[ 0] = XEiJ.busRlse (a); 7329: a += 4; 7330: } 7331: if ((l & 0x0002) != 0) { 7332: XEiJ.regRn[ 1] = XEiJ.busRlse (a); 7333: a += 4; 7334: } 7335: if ((l & 0x0004) != 0) { 7336: XEiJ.regRn[ 2] = XEiJ.busRlse (a); 7337: a += 4; 7338: } 7339: if ((l & 0x0008) != 0) { 7340: XEiJ.regRn[ 3] = XEiJ.busRlse (a); 7341: a += 4; 7342: } 7343: if ((l & 0x0010) != 0) { 7344: XEiJ.regRn[ 4] = XEiJ.busRlse (a); 7345: a += 4; 7346: } 7347: if ((l & 0x0020) != 0) { 7348: XEiJ.regRn[ 5] = XEiJ.busRlse (a); 7349: a += 4; 7350: } 7351: if ((l & 0x0040) != 0) { 7352: XEiJ.regRn[ 6] = XEiJ.busRlse (a); 7353: a += 4; 7354: } 7355: if ((byte) l < 0) { //(l & 0x0080) != 0 7356: XEiJ.regRn[ 7] = XEiJ.busRlse (a); 7357: a += 4; 7358: } 7359: if ((l & 0x0100) != 0) { 7360: XEiJ.regRn[ 8] = XEiJ.busRlse (a); 7361: a += 4; 7362: } 7363: if ((l & 0x0200) != 0) { 7364: XEiJ.regRn[ 9] = XEiJ.busRlse (a); 7365: a += 4; 7366: } 7367: if ((l & 0x0400) != 0) { 7368: XEiJ.regRn[10] = XEiJ.busRlse (a); 7369: a += 4; 7370: } 7371: if ((l & 0x0800) != 0) { 7372: XEiJ.regRn[11] = XEiJ.busRlse (a); 7373: a += 4; 7374: } 7375: if ((l & 0x1000) != 0) { 7376: XEiJ.regRn[12] = XEiJ.busRlse (a); 7377: a += 4; 7378: } 7379: if ((l & 0x2000) != 0) { 7380: XEiJ.regRn[13] = XEiJ.busRlse (a); 7381: a += 4; 7382: } 7383: if ((l & 0x4000) != 0) { 7384: XEiJ.regRn[14] = XEiJ.busRlse (a); 7385: a += 4; 7386: } 7387: if ((short) l < 0) { //(l & 0x8000) != 0 7388: XEiJ.regRn[15] = XEiJ.busRlse (a); 7389: a += 4; 7390: } 7391: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7392: for (int i = 0; i <= 15; i++) { 7393: if ((l & 0x0001 << i) != 0) { 7394: XEiJ.regRn[i] = XEiJ.busRlse (a); 7395: a += 4; 7396: } 7397: } 7398: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7399: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7400: for (int i = 0; l != 0; i++, l <<= 1) { 7401: if (l < 0) { 7402: XEiJ.regRn[i] = XEiJ.busRlse (a); 7403: a += 4; 7404: } 7405: } 7406: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7407: for (int i = 0; l != 0; i++, l >>>= 1) { 7408: if ((l & 1) != 0) { 7409: XEiJ.regRn[i] = XEiJ.busRlse (a); 7410: a += 4; 7411: } 7412: } 7413: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7414: for (int i = 0; l != 0; ) { 7415: int k = Integer.numberOfTrailingZeros (l); 7416: XEiJ.regRn[i += k] = XEiJ.busRlse (a); 7417: a += 4; 7418: l = l >>> k & ~1; 7419: } 7420: } 7421: } 7422: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7423: //! 軽量化。MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするが省略する 7424: // MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する 7425: // RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、 7426: // 12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因 7427: } else { 7428: XEiJ.busRws (a); 7429: } 7430: //MOVEM.L (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする 7431: XEiJ.regRn[arr] = a; //XEiJ.regRn[arr]は破壊されているのでXEiJ.regRn[arr]+=a-=tは不可 7432: XEiJ.mpuCycleCount += a - t << 1; //4バイト/個→8サイクル/個 7433: } 7434: } //irpMovemToRegLong 7435: 7436: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7437: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7438: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7439: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7440: //TRAP #<vector> |-|012346|-|-----|-----| |0100_111_001_00v_vvv 7441: public static void irpTrap () throws M68kException { 7442: XEiJ.mpuCycleCount += 34; 7443: if (XEiJ.MPU_INLINE_EXCEPTION) { 7444: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 7445: int sp = XEiJ.regRn[15]; 7446: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 7447: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7448: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 7449: XEiJ.mpuUSP = sp; //USPを保存 7450: sp = XEiJ.mpuISP; //SSPを復元 7451: if (DataBreakPoint.DBP_ON) { 7452: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 7453: } else { 7454: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 7455: } 7456: if (InstructionBreakPoint.IBP_ON) { 7457: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 7458: } 7459: } 7460: XEiJ.regRn[15] = sp -= 6; 7461: XEiJ.busWl (sp + 2, XEiJ.regPC); //pushl。pcをプッシュする 7462: XEiJ.busWw (sp, save_sr); //pushw。srをプッシュする 7463: irpSetPC (XEiJ.busRlsf (XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR) << 2)); //例外ベクタを取り出してジャンプする 7464: } else { 7465: irpException (XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR), XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 7466: } 7467: } //irpTrap 7468: public static void irpTrap15 () throws M68kException { 7469: if ((XEiJ.regRn[0] & 255) == 0x8e) { //IOCS _BOOTINF 7470: MainMemory.mmrCheckHuman (); 7471: } 7472: XEiJ.mpuCycleCount += 34; 7473: if (XEiJ.MPU_INLINE_EXCEPTION) { 7474: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 7475: int sp = XEiJ.regRn[15]; 7476: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 7477: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7478: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 7479: XEiJ.mpuUSP = sp; //USPを保存 7480: sp = XEiJ.mpuISP; //SSPを復元 7481: if (DataBreakPoint.DBP_ON) { 7482: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 7483: } else { 7484: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 7485: } 7486: if (InstructionBreakPoint.IBP_ON) { 7487: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 7488: } 7489: } 7490: XEiJ.regRn[15] = sp -= 6; 7491: XEiJ.busWl (sp + 2, XEiJ.regPC); //pushl。pcをプッシュする 7492: XEiJ.busWw (sp, save_sr); //pushw。srをプッシュする 7493: irpSetPC (XEiJ.busRlsf (M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR << 2)); //例外ベクタを取り出してジャンプする 7494: } else { 7495: irpException (M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 7496: } 7497: } //irpTrap15 7498: 7499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7500: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7501: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7502: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7503: //LINK.W Ar,#<data> |-|012346|-|-----|-----| |0100_111_001_010_rrr-{data} 7504: // 7505: //LINK.W Ar,#<data> 7506: // PEA.L (Ar);MOVEA.L A7,Ar;ADDA.W #<data>,A7と同じ 7507: // LINK.W A7,#<data>はA7をデクリメントする前の値がプッシュされ、A7に#<data>が加算される 7508: public static void irpLinkWord () throws M68kException { 7509: XEiJ.mpuCycleCount += 16; 7510: int arr = XEiJ.regOC - (0b0100_111_001_010_000 - 8); 7511: //評価順序に注意 7512: // wl(r[15]-=4,r[8+rrr])は不可 7513: int sp = XEiJ.regRn[15] - 4; 7514: XEiJ.busWl (sp, XEiJ.regRn[arr]); //pushl 7515: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 7516: XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 7517: } else { 7518: int t = XEiJ.regPC; 7519: XEiJ.regPC = t + 2; 7520: XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse (t); //pcws 7521: } 7522: } //irpLinkWord 7523: 7524: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7525: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7526: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7527: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7528: //UNLK Ar |-|012346|-|-----|-----| |0100_111_001_011_rrr 7529: // 7530: //UNLK Ar 7531: // MOVEA.L Ar,A7;MOVEA.L (A7)+,Arと同じ 7532: // UNLK A7はMOVEA.L A7,A7;MOVEA.L (A7)+,A7すなわちMOVEA.L (A7),A7と同じ 7533: // ソースオペランドのポストインクリメントはデスティネーションオペランドが評価される前に完了しているとみなされる 7534: // 例えばMOVE.L (A0)+,(A0)+はMOVE.L (A0),(4,A0);ADDQ.L #8,A0と同じ 7535: // MOVEA.L (A0)+,A0はポストインクリメントされたA0が(A0)から読み出された値で上書きされるのでMOVEA.L (A0),A0と同じ 7536: // M68000PRMにUNLK Anの動作はAn→SP;(SP)→An;SP+4→SPだと書かれているがこれはn=7の場合に当てはまらない 7537: // 余談だが68040の初期のマスクセットはUNLK A7を実行すると固まるらしい 7538: public static void irpUnlk () throws M68kException { 7539: XEiJ.mpuCycleCount += 12; 7540: int arr = XEiJ.regOC - (0b0100_111_001_011_000 - 8); 7541: //評価順序に注意 7542: int sp = XEiJ.regRn[arr]; 7543: XEiJ.regRn[15] = sp + 4; 7544: XEiJ.regRn[arr] = XEiJ.busRls (sp); //popls 7545: } //irpUnlk 7546: 7547: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7548: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7549: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7550: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7551: //MOVE.L Ar,USP |-|012346|P|-----|-----| |0100_111_001_100_rrr 7552: public static void irpMoveToUsp () throws M68kException { 7553: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7554: XEiJ.mpuCycleCount += 34; 7555: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7556: throw M68kException.m6eSignal; 7557: } 7558: //以下はスーパーバイザモード 7559: XEiJ.mpuCycleCount += 4; 7560: XEiJ.mpuUSP = XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_100_000 - 8)]; 7561: } //irpMoveToUsp 7562: 7563: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7564: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7565: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7566: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7567: //MOVE.L USP,Ar |-|012346|P|-----|-----| |0100_111_001_101_rrr 7568: public static void irpMoveFromUsp () throws M68kException { 7569: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7570: XEiJ.mpuCycleCount += 34; 7571: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7572: throw M68kException.m6eSignal; 7573: } 7574: //以下はスーパーバイザモード 7575: XEiJ.mpuCycleCount += 4; 7576: XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_101_000 - 8)] = XEiJ.mpuUSP; 7577: } //irpMoveFromUsp 7578: 7579: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7580: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7581: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7582: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7583: //RESET |-|012346|P|-----|-----| |0100_111_001_110_000 7584: public static void irpReset () throws M68kException { 7585: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7586: XEiJ.mpuCycleCount += 34; 7587: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7588: throw M68kException.m6eSignal; 7589: } 7590: //以下はスーパーバイザモード 7591: XEiJ.mpuCycleCount += 132; 7592: XEiJ.irpReset (); 7593: } //irpReset 7594: 7595: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7596: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7597: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7598: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7599: //NOP |-|012346|-|-----|-----| |0100_111_001_110_001 7600: public static void irpNop () throws M68kException { 7601: XEiJ.mpuCycleCount += 4; 7602: //何もしない 7603: } //irpNop 7604: 7605: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7606: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7607: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7608: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7609: //STOP #<data> |-|012346|P|UUUUU|*****| |0100_111_001_110_010-{data} 7610: // 7611: //STOP #<data> 7612: // 1. #<data>をsrに設定する 7613: // 2. pcを進める 7614: // 3. 以下のいずれかの条件が成立するまで停止する 7615: // 3a. トレース 7616: // 3b. マスクされているレベルよりも高い割り込み要求 7617: // 3c. リセット 7618: // コアと一緒にデバイスを止めるわけにいかないので、ここでは条件が成立するまで同じ命令を繰り返すループ命令として実装する 7619: public static void irpStop () throws M68kException { 7620: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7621: XEiJ.mpuCycleCount += 34; 7622: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7623: throw M68kException.m6eSignal; 7624: } 7625: //以下はスーパーバイザモード 7626: XEiJ.mpuCycleCount += 4; 7627: irpSetSR (XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 7628: if (XEiJ.mpuTraceFlag == 0) { //トレースまたはマスクされているレベルよりも高い割り込み要求がない 7629: XEiJ.regPC = XEiJ.regPC0; //ループ 7630: //任意の負荷率を100%に設定しているときSTOP命令が軽すぎると動作周波数が大きくなりすぎて割り込みがかかったとき次に進めなくなる 7631: //負荷率の計算にSTOP命令で止まっていた時間を含めないことにする 7632: XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000; //4μs。10MHzのとき40clk 7633: XEiJ.mpuLastNano += 4000L; 7634: } 7635: } //irpStop 7636: 7637: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7638: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7639: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7640: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7641: //RTE |-|012346|P|UUUUU|*****| |0100_111_001_110_011 7642: public static void irpRte () throws M68kException { 7643: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7644: XEiJ.mpuCycleCount += 34; 7645: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7646: throw M68kException.m6eSignal; 7647: } 7648: //以下はスーパーバイザモード 7649: XEiJ.mpuCycleCount += 20; 7650: int sp = XEiJ.regRn[15]; 7651: XEiJ.regRn[15] = sp + 6; 7652: int newSR = XEiJ.busRwz (sp); //popwz。ここでバスエラーが生じる可能性がある 7653: int newPC = XEiJ.busRlse (sp + 2); //popls。srを読めたのだからspは奇数ではない 7654: //irpSetSRでモードが切り替わる場合があるのでその前にr[15]を更新しておくこと 7655: irpSetSR (newSR); //ここでユーザモードに戻る場合がある。特権違反チェックが先 7656: irpSetPC (newPC); //分岐ログが新しいsrを使う。順序に注意 7657: } //irpRte 7658: 7659: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7660: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7661: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7662: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7663: //RTS |-|012346|-|-----|-----| |0100_111_001_110_101 7664: public static void irpRts () throws M68kException { 7665: XEiJ.mpuCycleCount += 16; 7666: int sp = XEiJ.regRn[15]; 7667: XEiJ.regRn[15] = sp + 4; 7668: irpSetPC (XEiJ.busRls (sp)); //popls 7669: } //irpRts 7670: 7671: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7672: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7673: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7674: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7675: //TRAPV |-|012346|-|---*-|-----| |0100_111_001_110_110 7676: public static void irpTrapv () throws M68kException { 7677: if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 >= 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) == 0) { //通過 7678: XEiJ.mpuCycleCount += 4; 7679: } else { 7680: XEiJ.mpuCycleCount += 34; 7681: M68kException.m6eNumber = M68kException.M6E_TRAPV_INSTRUCTION; 7682: throw M68kException.m6eSignal; 7683: } 7684: } //irpTrapv 7685: 7686: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7687: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7688: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7689: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7690: //RTR |-|012346|-|UUUUU|*****| |0100_111_001_110_111 7691: public static void irpRtr () throws M68kException { 7692: XEiJ.mpuCycleCount += 20; 7693: int sp = XEiJ.regRn[15]; 7694: XEiJ.regRn[15] = sp + 6; 7695: XEiJ.regCCR = XEiJ.REG_CCR_MASK & XEiJ.busRwz (sp); //popwz 7696: irpSetPC (XEiJ.busRlse (sp + 2)); //popls。ccrを読めたのだからspは奇数ではない 7697: } //irpRtr 7698: 7699: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7700: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7701: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7702: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7703: //JSR <ea> |-|012346|-|-----|-----| M WXZP |0100_111_010_mmm_rrr 7704: //JBSR.L <label> |A|012346|-|-----|-----| |0100_111_010_111_001-{address} [JSR <label>] 7705: public static void irpJsr () throws M68kException { 7706: XEiJ.mpuCycleCount += 16 - 8; 7707: int a = efaJmpJsr (XEiJ.regOC & 63); //プッシュする前に実効アドレスを計算する 7708: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 7709: irpSetPC (a); 7710: } //irpJsr 7711: 7712: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7713: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7714: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7715: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7716: //JMP <ea> |-|012346|-|-----|-----| M WXZP |0100_111_011_mmm_rrr 7717: //JBRA.L <label> |A|012346|-|-----|-----| |0100_111_011_111_001-{address} [JMP <label>] 7718: public static void irpJmp () throws M68kException { 7719: //XEiJ.mpuCycleCount += 8 - 8; 7720: irpSetPC (efaJmpJsr (XEiJ.regOC & 63)); 7721: } //irpJmp 7722: 7723: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7724: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7725: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7726: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7727: //ADDQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_000_mmm_rrr 7728: //INC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>] 7729: public static void irpAddqByte () throws M68kException { 7730: int ea = XEiJ.regOC & 63; 7731: int x; 7732: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 7733: int z; 7734: if (ea < XEiJ.EA_AR) { //ADDQ.B #<data>,Dr 7735: XEiJ.mpuCycleCount += 4; 7736: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y); 7737: } else { //ADDQ.B #<data>,<mem> 7738: XEiJ.mpuCycleCount += 8; 7739: int a = efaMltByte (ea); 7740: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y)); 7741: } 7742: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 7743: (~x & z) >>> 31 << 1 | 7744: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 7745: } //irpAddqByte 7746: 7747: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7748: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7749: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7750: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7751: //ADDQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_001_mmm_rrr 7752: //ADDQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_001_001_rrr 7753: //INC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>] 7754: //INC.W Ar |A|012346|-|-----|-----| A |0101_001_001_001_rrr [ADDQ.W #1,Ar] 7755: // 7756: //ADDQ.W #<data>,Ar 7757: // ソースを符号拡張してロングで加算する 7758: public static void irpAddqWord () throws M68kException { 7759: int ea = XEiJ.regOC & 63; 7760: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 7761: if (ea >> 3 == XEiJ.MMM_AR) { //ADDQ.W #<data>,Ar 7762: XEiJ.mpuCycleCount += 8; //MC68000 User's Manualに4と書いてあるのは8の間違い 7763: XEiJ.regRn[ea] += y; //ロングで計算する。このr[ea]はアドレスレジスタ 7764: //ccrは操作しない 7765: } else { 7766: int x; 7767: int z; 7768: if (ea < XEiJ.EA_AR) { //ADDQ.W #<data>,Dr 7769: XEiJ.mpuCycleCount += 4; 7770: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y)); 7771: } else { //ADDQ.W #<data>,<mem> 7772: XEiJ.mpuCycleCount += 8; 7773: int a = efaMltWord (ea); 7774: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y)); 7775: } 7776: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 7777: (~x & z) >>> 31 << 1 | 7778: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 7779: } 7780: } //irpAddqWord 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: //ADDQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_010_mmm_rrr 7787: //ADDQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_010_001_rrr 7788: //INC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>] 7789: //INC.L Ar |A|012346|-|-----|-----| A |0101_001_010_001_rrr [ADDQ.L #1,Ar] 7790: public static void irpAddqLong () throws M68kException { 7791: int ea = XEiJ.regOC & 63; 7792: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 7793: if (ea >> 3 == XEiJ.MMM_AR) { //ADDQ.L #<data>,Ar 7794: XEiJ.mpuCycleCount += 8; 7795: XEiJ.regRn[ea] += y; //このr[ea]はアドレスレジスタ 7796: //ccrは操作しない 7797: } else { 7798: int x; 7799: int z; 7800: if (ea < XEiJ.EA_AR) { //ADDQ.L #<data>,Dr 7801: XEiJ.mpuCycleCount += 8; 7802: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y; 7803: } else { //ADDQ.L #<data>,<mem> 7804: XEiJ.mpuCycleCount += 12; 7805: int a = efaMltLong (ea); 7806: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y); 7807: } 7808: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 7809: (~x & z) >>> 31 << 1 | 7810: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 7811: } 7812: } //irpAddqLong 7813: 7814: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7815: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7816: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7817: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7818: //ST.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr 7819: //SNF.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr [ST.B <ea>] 7820: //DBT.W Dr,<label> |-|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} 7821: //DBNF.W Dr,<label> |A|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} [DBT.W Dr,<label>] 7822: public static void irpSt () throws M68kException { 7823: int ea = XEiJ.regOC & 63; 7824: //DBT.W Dr,<label>よりもST.B Drを優先する 7825: if (ea < XEiJ.EA_AR) { //ST.B Dr 7826: XEiJ.mpuCycleCount += 6; 7827: XEiJ.regRn[ea] |= 0xff; 7828: } else if (ea < XEiJ.EA_MM) { //DBT.W Dr,<label> 7829: //条件が成立しているので通過 7830: XEiJ.mpuCycleCount += 12; 7831: if (XEiJ.MPU_OMIT_OFFSET_READ) { 7832: //リードを省略する 7833: } else { 7834: XEiJ.busRws (XEiJ.regPC); 7835: } 7836: XEiJ.regPC += 2; 7837: } else { //ST.B <mem> 7838: XEiJ.mpuCycleCount += 8; 7839: //MC68000のSccはリードしてからライトする 7840: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7841: //! 軽量化。リードを省略する 7842: XEiJ.busWb (efaMltByte (ea), 0xff); 7843: } else { 7844: int a = efaMltByte (ea); 7845: XEiJ.busRbs (a); 7846: XEiJ.busWb (a, 0xff); 7847: } 7848: } 7849: } //irpSt 7850: 7851: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7852: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7853: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7854: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7855: //SUBQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_100_mmm_rrr 7856: //DEC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>] 7857: public static void irpSubqByte () throws M68kException { 7858: int ea = XEiJ.regOC & 63; 7859: int x; 7860: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 7861: int z; 7862: if (ea < XEiJ.EA_AR) { //SUBQ.B #<data>,Dr 7863: XEiJ.mpuCycleCount += 4; 7864: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y); 7865: } else { //SUBQ.B #<data>,<mem> 7866: XEiJ.mpuCycleCount += 8; 7867: int a = efaMltByte (ea); 7868: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y)); 7869: } 7870: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 7871: (x & ~z) >>> 31 << 1 | 7872: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 7873: } //irpSubqByte 7874: 7875: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7876: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7877: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7878: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7879: //SUBQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_101_mmm_rrr 7880: //SUBQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_101_001_rrr 7881: //DEC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>] 7882: //DEC.W Ar |A|012346|-|-----|-----| A |0101_001_101_001_rrr [SUBQ.W #1,Ar] 7883: // 7884: //SUBQ.W #<data>,Ar 7885: // ソースを符号拡張してロングで減算する 7886: public static void irpSubqWord () throws M68kException { 7887: int ea = XEiJ.regOC & 63; 7888: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 7889: if (ea >> 3 == XEiJ.MMM_AR) { //SUBQ.W #<data>,Ar 7890: XEiJ.mpuCycleCount += 8; 7891: XEiJ.regRn[ea] -= y; //ロングで計算する。このr[ea]はアドレスレジスタ 7892: //ccrは操作しない 7893: } else { 7894: int x; 7895: int z; 7896: if (ea < XEiJ.EA_AR) { //SUBQ.W #<data>,Dr 7897: XEiJ.mpuCycleCount += 4; 7898: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y)); 7899: } else { //SUBQ.W #<data>,<mem> 7900: XEiJ.mpuCycleCount += 8; 7901: int a = efaMltWord (ea); 7902: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y)); 7903: } 7904: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 7905: (x & ~z) >>> 31 << 1 | 7906: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 7907: } 7908: } //irpSubqWord 7909: 7910: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7911: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7912: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7913: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7914: //SUBQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_110_mmm_rrr 7915: //SUBQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_110_001_rrr 7916: //DEC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>] 7917: //DEC.L Ar |A|012346|-|-----|-----| A |0101_001_110_001_rrr [SUBQ.L #1,Ar] 7918: public static void irpSubqLong () throws M68kException { 7919: int ea = XEiJ.regOC & 63; 7920: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 7921: if (ea >> 3 == XEiJ.MMM_AR) { //SUBQ.L #<data>,Ar 7922: XEiJ.mpuCycleCount += 8; 7923: XEiJ.regRn[ea] -= y; //このr[ea]はアドレスレジスタ 7924: //ccrは操作しない 7925: } else { 7926: int x; 7927: int z; 7928: if (ea < XEiJ.EA_AR) { //SUBQ.L #<data>,Dr 7929: XEiJ.mpuCycleCount += 8; 7930: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y; 7931: } else { //SUBQ.L #<data>,<mem> 7932: XEiJ.mpuCycleCount += 12; 7933: int a = efaMltLong (ea); 7934: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y); 7935: } 7936: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 7937: (x & ~z) >>> 31 << 1 | 7938: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 7939: } 7940: } //irpSubqLong 7941: 7942: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7943: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7944: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7945: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7946: //SF.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr 7947: //SNT.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr [SF.B <ea>] 7948: //DBF.W Dr,<label> |-|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} 7949: //DBNT.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 7950: //DBRA.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 7951: public static void irpSf () throws M68kException { 7952: int ea = XEiJ.regOC & 63; 7953: //DBRA.W Dr,<label>よりもSF.B Drを優先する 7954: if (ea < XEiJ.EA_AR) { //SF.B Dr 7955: XEiJ.mpuCycleCount += 4; 7956: XEiJ.regRn[ea] &= ~0xff; 7957: } else if (ea < XEiJ.EA_MM) { //DBRA.W Dr,<label> 7958: //条件が成立していないのでデクリメント 7959: int rrr = XEiJ.regOC & 7; 7960: int t = XEiJ.regRn[rrr]; 7961: if ((short) t == 0) { //Drの下位16bitが0なので通過 7962: XEiJ.mpuCycleCount += 14; 7963: XEiJ.regRn[rrr] = t + 65535; 7964: if (XEiJ.MPU_OMIT_OFFSET_READ) { 7965: //リードを省略する 7966: } else { 7967: XEiJ.busRws (XEiJ.regPC); 7968: } 7969: XEiJ.regPC += 2; 7970: } else { //Drの下位16bitが0でないのでジャンプ 7971: XEiJ.mpuCycleCount += 10; 7972: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 7973: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 7974: } 7975: } else { //SF.B <mem> 7976: XEiJ.mpuCycleCount += 8; 7977: //MC68000のSccはリードしてからライトする 7978: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7979: //! 軽量化。リードを省略する 7980: XEiJ.busWb (efaMltByte (ea), 0x00); 7981: } else { 7982: int a = efaMltByte (ea); 7983: XEiJ.busRbs (a); 7984: XEiJ.busWb (a, 0x00); 7985: } 7986: } 7987: } //irpSf 7988: 7989: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7990: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7991: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7992: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7993: //SHI.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr 7994: //SNLS.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr [SHI.B <ea>] 7995: //DBHI.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} 7996: //DBNLS.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} [DBHI.W Dr,<label>] 7997: public static void irpShi () throws M68kException { 7998: int ea = XEiJ.regOC & 63; 7999: if (ea >> 3 == XEiJ.MMM_AR) { //DBHI.W Dr,<label> 8000: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { 8001: //条件が成立しているので通過 8002: XEiJ.mpuCycleCount += 12; 8003: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8004: //リードを省略する 8005: } else { 8006: XEiJ.busRws (XEiJ.regPC); 8007: } 8008: XEiJ.regPC += 2; 8009: } else { 8010: //条件が成立していないのでデクリメント 8011: int rrr = XEiJ.regOC & 7; 8012: int t = XEiJ.regRn[rrr]; 8013: if ((short) t == 0) { //Drの下位16bitが0なので通過 8014: XEiJ.mpuCycleCount += 14; 8015: XEiJ.regRn[rrr] = t + 65535; 8016: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8017: //リードを省略する 8018: } else { 8019: XEiJ.busRws (XEiJ.regPC); 8020: } 8021: XEiJ.regPC += 2; 8022: } else { //Drの下位16bitが0でないのでジャンプ 8023: XEiJ.mpuCycleCount += 10; 8024: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8025: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8026: } 8027: } 8028: } else if (ea < XEiJ.EA_AR) { //SHI.B Dr 8029: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //セット 8030: XEiJ.mpuCycleCount += 6; 8031: XEiJ.regRn[ea] |= 0xff; 8032: } else { //クリア 8033: XEiJ.mpuCycleCount += 4; 8034: XEiJ.regRn[ea] &= ~0xff; 8035: } 8036: } else { //SHI.B <mem> 8037: XEiJ.mpuCycleCount += 8; 8038: //MC68000のSccはリードしてからライトする 8039: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8040: //! 軽量化。リードを省略する 8041: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HI << XEiJ.regCCR >> 31); 8042: } else { 8043: int a = efaMltByte (ea); 8044: XEiJ.busRbs (a); 8045: XEiJ.busWb (a, XEiJ.MPU_CC_HI << XEiJ.regCCR >> 31); 8046: } 8047: } 8048: } //irpShi 8049: 8050: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8051: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8052: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8053: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8054: //SLS.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr 8055: //SNHI.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr [SLS.B <ea>] 8056: //DBLS.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} 8057: //DBNHI.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} [DBLS.W Dr,<label>] 8058: public static void irpSls () throws M68kException { 8059: int ea = XEiJ.regOC & 63; 8060: if (ea >> 3 == XEiJ.MMM_AR) { //DBLS.W Dr,<label> 8061: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { 8062: //条件が成立しているので通過 8063: XEiJ.mpuCycleCount += 12; 8064: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8065: //リードを省略する 8066: } else { 8067: XEiJ.busRws (XEiJ.regPC); 8068: } 8069: XEiJ.regPC += 2; 8070: } else { 8071: //条件が成立していないのでデクリメント 8072: int rrr = XEiJ.regOC & 7; 8073: int t = XEiJ.regRn[rrr]; 8074: if ((short) t == 0) { //Drの下位16bitが0なので通過 8075: XEiJ.mpuCycleCount += 14; 8076: XEiJ.regRn[rrr] = t + 65535; 8077: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8078: //リードを省略する 8079: } else { 8080: XEiJ.busRws (XEiJ.regPC); 8081: } 8082: XEiJ.regPC += 2; 8083: } else { //Drの下位16bitが0でないのでジャンプ 8084: XEiJ.mpuCycleCount += 10; 8085: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8086: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8087: } 8088: } 8089: } else if (ea < XEiJ.EA_AR) { //SLS.B Dr 8090: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //セット 8091: XEiJ.mpuCycleCount += 6; 8092: XEiJ.regRn[ea] |= 0xff; 8093: } else { //クリア 8094: XEiJ.mpuCycleCount += 4; 8095: XEiJ.regRn[ea] &= ~0xff; 8096: } 8097: } else { //SLS.B <mem> 8098: XEiJ.mpuCycleCount += 8; 8099: //MC68000のSccはリードしてからライトする 8100: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8101: //! 軽量化。リードを省略する 8102: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LS << XEiJ.regCCR >> 31); 8103: } else { 8104: int a = efaMltByte (ea); 8105: XEiJ.busRbs (a); 8106: XEiJ.busWb (a, XEiJ.MPU_CC_LS << XEiJ.regCCR >> 31); 8107: } 8108: } 8109: } //irpSls 8110: 8111: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8112: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8113: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8115: //SCC.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr 8116: //SHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8117: //SNCS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8118: //SNLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8119: //DBCC.W Dr,<label> |-|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} 8120: //DBHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8121: //DBNCS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8122: //DBNLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8123: public static void irpShs () throws M68kException { 8124: int ea = XEiJ.regOC & 63; 8125: if (ea >> 3 == XEiJ.MMM_AR) { //DBHS.W Dr,<label> 8126: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { 8127: //条件が成立しているので通過 8128: XEiJ.mpuCycleCount += 12; 8129: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8130: //リードを省略する 8131: } else { 8132: XEiJ.busRws (XEiJ.regPC); 8133: } 8134: XEiJ.regPC += 2; 8135: } else { 8136: //条件が成立していないのでデクリメント 8137: int rrr = XEiJ.regOC & 7; 8138: int t = XEiJ.regRn[rrr]; 8139: if ((short) t == 0) { //Drの下位16bitが0なので通過 8140: XEiJ.mpuCycleCount += 14; 8141: XEiJ.regRn[rrr] = t + 65535; 8142: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8143: //リードを省略する 8144: } else { 8145: XEiJ.busRws (XEiJ.regPC); 8146: } 8147: XEiJ.regPC += 2; 8148: } else { //Drの下位16bitが0でないのでジャンプ 8149: XEiJ.mpuCycleCount += 10; 8150: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8151: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8152: } 8153: } 8154: } else if (ea < XEiJ.EA_AR) { //SHS.B Dr 8155: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //セット 8156: XEiJ.mpuCycleCount += 6; 8157: XEiJ.regRn[ea] |= 0xff; 8158: } else { //クリア 8159: XEiJ.mpuCycleCount += 4; 8160: XEiJ.regRn[ea] &= ~0xff; 8161: } 8162: } else { //SHS.B <mem> 8163: XEiJ.mpuCycleCount += 8; 8164: //MC68000のSccはリードしてからライトする 8165: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8166: //! 軽量化。リードを省略する 8167: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HS << XEiJ.regCCR >> 31); 8168: } else { 8169: int a = efaMltByte (ea); 8170: XEiJ.busRbs (a); 8171: XEiJ.busWb (a, XEiJ.MPU_CC_HS << XEiJ.regCCR >> 31); 8172: } 8173: } 8174: } //irpShs 8175: 8176: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8177: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8178: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8179: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8180: //SCS.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr 8181: //SLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8182: //SNCC.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8183: //SNHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8184: //DBCS.W Dr,<label> |-|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} 8185: //DBLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8186: //DBNCC.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8187: //DBNHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8188: public static void irpSlo () throws M68kException { 8189: int ea = XEiJ.regOC & 63; 8190: if (ea >> 3 == XEiJ.MMM_AR) { //DBLO.W Dr,<label> 8191: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { 8192: //条件が成立しているので通過 8193: XEiJ.mpuCycleCount += 12; 8194: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8195: //リードを省略する 8196: } else { 8197: XEiJ.busRws (XEiJ.regPC); 8198: } 8199: XEiJ.regPC += 2; 8200: } else { 8201: //条件が成立していないのでデクリメント 8202: int rrr = XEiJ.regOC & 7; 8203: int t = XEiJ.regRn[rrr]; 8204: if ((short) t == 0) { //Drの下位16bitが0なので通過 8205: XEiJ.mpuCycleCount += 14; 8206: XEiJ.regRn[rrr] = t + 65535; 8207: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8208: //リードを省略する 8209: } else { 8210: XEiJ.busRws (XEiJ.regPC); 8211: } 8212: XEiJ.regPC += 2; 8213: } else { //Drの下位16bitが0でないのでジャンプ 8214: XEiJ.mpuCycleCount += 10; 8215: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8216: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8217: } 8218: } 8219: } else if (ea < XEiJ.EA_AR) { //SLO.B Dr 8220: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //セット 8221: XEiJ.mpuCycleCount += 6; 8222: XEiJ.regRn[ea] |= 0xff; 8223: } else { //クリア 8224: XEiJ.mpuCycleCount += 4; 8225: XEiJ.regRn[ea] &= ~0xff; 8226: } 8227: } else { //SLO.B <mem> 8228: XEiJ.mpuCycleCount += 8; 8229: //MC68000のSccはリードしてからライトする 8230: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8231: //! 軽量化。リードを省略する 8232: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LO << XEiJ.regCCR >> 31); 8233: } else { 8234: int a = efaMltByte (ea); 8235: XEiJ.busRbs (a); 8236: XEiJ.busWb (a, XEiJ.MPU_CC_LO << XEiJ.regCCR >> 31); 8237: } 8238: } 8239: } //irpSlo 8240: 8241: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8242: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8243: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8244: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8245: //SNE.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr 8246: //SNEQ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8247: //SNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8248: //SNZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8249: //DBNE.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} 8250: //DBNEQ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8251: //DBNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8252: //DBNZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8253: public static void irpSne () throws M68kException { 8254: int ea = XEiJ.regOC & 63; 8255: if (ea >> 3 == XEiJ.MMM_AR) { //DBNE.W Dr,<label> 8256: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { 8257: //条件が成立しているので通過 8258: XEiJ.mpuCycleCount += 12; 8259: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8260: //リードを省略する 8261: } else { 8262: XEiJ.busRws (XEiJ.regPC); 8263: } 8264: XEiJ.regPC += 2; 8265: } else { 8266: //条件が成立していないのでデクリメント 8267: int rrr = XEiJ.regOC & 7; 8268: int t = XEiJ.regRn[rrr]; 8269: if ((short) t == 0) { //Drの下位16bitが0なので通過 8270: XEiJ.mpuCycleCount += 14; 8271: XEiJ.regRn[rrr] = t + 65535; 8272: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8273: //リードを省略する 8274: } else { 8275: XEiJ.busRws (XEiJ.regPC); 8276: } 8277: XEiJ.regPC += 2; 8278: } else { //Drの下位16bitが0でないのでジャンプ 8279: XEiJ.mpuCycleCount += 10; 8280: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8281: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8282: } 8283: } 8284: } else if (ea < XEiJ.EA_AR) { //SNE.B Dr 8285: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //セット 8286: XEiJ.mpuCycleCount += 6; 8287: XEiJ.regRn[ea] |= 0xff; 8288: } else { //クリア 8289: XEiJ.mpuCycleCount += 4; 8290: XEiJ.regRn[ea] &= ~0xff; 8291: } 8292: } else { //SNE.B <mem> 8293: XEiJ.mpuCycleCount += 8; 8294: //MC68000のSccはリードしてからライトする 8295: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8296: //! 軽量化。リードを省略する 8297: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_NE << XEiJ.regCCR >> 31); 8298: } else { 8299: int a = efaMltByte (ea); 8300: XEiJ.busRbs (a); 8301: XEiJ.busWb (a, XEiJ.MPU_CC_NE << XEiJ.regCCR >> 31); 8302: } 8303: } 8304: } //irpSne 8305: 8306: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8307: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8308: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8309: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8310: //SEQ.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr 8311: //SNNE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8312: //SNNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8313: //SZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8314: //DBEQ.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} 8315: //DBNNE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8316: //DBNNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8317: //DBZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8318: public static void irpSeq () throws M68kException { 8319: int ea = XEiJ.regOC & 63; 8320: if (ea >> 3 == XEiJ.MMM_AR) { //DBEQ.W Dr,<label> 8321: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { 8322: //条件が成立しているので通過 8323: XEiJ.mpuCycleCount += 12; 8324: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8325: //リードを省略する 8326: } else { 8327: XEiJ.busRws (XEiJ.regPC); 8328: } 8329: XEiJ.regPC += 2; 8330: } else { 8331: //条件が成立していないのでデクリメント 8332: int rrr = XEiJ.regOC & 7; 8333: int t = XEiJ.regRn[rrr]; 8334: if ((short) t == 0) { //Drの下位16bitが0なので通過 8335: XEiJ.mpuCycleCount += 14; 8336: XEiJ.regRn[rrr] = t + 65535; 8337: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8338: //リードを省略する 8339: } else { 8340: XEiJ.busRws (XEiJ.regPC); 8341: } 8342: XEiJ.regPC += 2; 8343: } else { //Drの下位16bitが0でないのでジャンプ 8344: XEiJ.mpuCycleCount += 10; 8345: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8346: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8347: } 8348: } 8349: } else if (ea < XEiJ.EA_AR) { //SEQ.B Dr 8350: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //セット 8351: XEiJ.mpuCycleCount += 6; 8352: XEiJ.regRn[ea] |= 0xff; 8353: } else { //クリア 8354: XEiJ.mpuCycleCount += 4; 8355: XEiJ.regRn[ea] &= ~0xff; 8356: } 8357: } else { //SEQ.B <mem> 8358: XEiJ.mpuCycleCount += 8; 8359: //MC68000のSccはリードしてからライトする 8360: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8361: //! 軽量化。リードを省略する 8362: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_EQ << XEiJ.regCCR >> 31); 8363: } else { 8364: int a = efaMltByte (ea); 8365: XEiJ.busRbs (a); 8366: XEiJ.busWb (a, XEiJ.MPU_CC_EQ << XEiJ.regCCR >> 31); 8367: } 8368: } 8369: } //irpSeq 8370: 8371: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8372: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8373: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8374: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8375: //SVC.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr 8376: //SNVS.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr [SVC.B <ea>] 8377: //DBVC.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} 8378: //DBNVS.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} [DBVC.W Dr,<label>] 8379: public static void irpSvc () throws M68kException { 8380: int ea = XEiJ.regOC & 63; 8381: if (ea >> 3 == XEiJ.MMM_AR) { //DBVC.W Dr,<label> 8382: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { 8383: //条件が成立しているので通過 8384: XEiJ.mpuCycleCount += 12; 8385: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8386: //リードを省略する 8387: } else { 8388: XEiJ.busRws (XEiJ.regPC); 8389: } 8390: XEiJ.regPC += 2; 8391: } else { 8392: //条件が成立していないのでデクリメント 8393: int rrr = XEiJ.regOC & 7; 8394: int t = XEiJ.regRn[rrr]; 8395: if ((short) t == 0) { //Drの下位16bitが0なので通過 8396: XEiJ.mpuCycleCount += 14; 8397: XEiJ.regRn[rrr] = t + 65535; 8398: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8399: //リードを省略する 8400: } else { 8401: XEiJ.busRws (XEiJ.regPC); 8402: } 8403: XEiJ.regPC += 2; 8404: } else { //Drの下位16bitが0でないのでジャンプ 8405: XEiJ.mpuCycleCount += 10; 8406: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8407: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8408: } 8409: } 8410: } else if (ea < XEiJ.EA_AR) { //SVC.B Dr 8411: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //セット 8412: XEiJ.mpuCycleCount += 6; 8413: XEiJ.regRn[ea] |= 0xff; 8414: } else { //クリア 8415: XEiJ.mpuCycleCount += 4; 8416: XEiJ.regRn[ea] &= ~0xff; 8417: } 8418: } else { //SVC.B <mem> 8419: XEiJ.mpuCycleCount += 8; 8420: //MC68000のSccはリードしてからライトする 8421: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8422: //! 軽量化。リードを省略する 8423: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VC << XEiJ.regCCR >> 31); 8424: } else { 8425: int a = efaMltByte (ea); 8426: XEiJ.busRbs (a); 8427: XEiJ.busWb (a, XEiJ.MPU_CC_VC << XEiJ.regCCR >> 31); 8428: } 8429: } 8430: } //irpSvc 8431: 8432: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8433: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8434: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8435: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8436: //SVS.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr 8437: //SNVC.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr [SVS.B <ea>] 8438: //DBVS.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} 8439: //DBNVC.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} [DBVS.W Dr,<label>] 8440: public static void irpSvs () throws M68kException { 8441: int ea = XEiJ.regOC & 63; 8442: if (ea >> 3 == XEiJ.MMM_AR) { //DBVS.W Dr,<label> 8443: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { 8444: //条件が成立しているので通過 8445: XEiJ.mpuCycleCount += 12; 8446: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8447: //リードを省略する 8448: } else { 8449: XEiJ.busRws (XEiJ.regPC); 8450: } 8451: XEiJ.regPC += 2; 8452: } else { 8453: //条件が成立していないのでデクリメント 8454: int rrr = XEiJ.regOC & 7; 8455: int t = XEiJ.regRn[rrr]; 8456: if ((short) t == 0) { //Drの下位16bitが0なので通過 8457: XEiJ.mpuCycleCount += 14; 8458: XEiJ.regRn[rrr] = t + 65535; 8459: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8460: //リードを省略する 8461: } else { 8462: XEiJ.busRws (XEiJ.regPC); 8463: } 8464: XEiJ.regPC += 2; 8465: } else { //Drの下位16bitが0でないのでジャンプ 8466: XEiJ.mpuCycleCount += 10; 8467: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8468: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8469: } 8470: } 8471: } else if (ea < XEiJ.EA_AR) { //SVS.B Dr 8472: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //セット 8473: XEiJ.mpuCycleCount += 6; 8474: XEiJ.regRn[ea] |= 0xff; 8475: } else { //クリア 8476: XEiJ.mpuCycleCount += 4; 8477: XEiJ.regRn[ea] &= ~0xff; 8478: } 8479: } else { //SVS.B <mem> 8480: XEiJ.mpuCycleCount += 8; 8481: //MC68000のSccはリードしてからライトする 8482: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8483: //! 軽量化。リードを省略する 8484: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VS << XEiJ.regCCR >> 31); 8485: } else { 8486: int a = efaMltByte (ea); 8487: XEiJ.busRbs (a); 8488: XEiJ.busWb (a, XEiJ.MPU_CC_VS << XEiJ.regCCR >> 31); 8489: } 8490: } 8491: } //irpSvs 8492: 8493: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8494: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8495: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8496: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8497: //SPL.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr 8498: //SNMI.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr [SPL.B <ea>] 8499: //DBPL.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} 8500: //DBNMI.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} [DBPL.W Dr,<label>] 8501: public static void irpSpl () throws M68kException { 8502: int ea = XEiJ.regOC & 63; 8503: if (ea >> 3 == XEiJ.MMM_AR) { //DBPL.W Dr,<label> 8504: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { 8505: //条件が成立しているので通過 8506: XEiJ.mpuCycleCount += 12; 8507: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8508: //リードを省略する 8509: } else { 8510: XEiJ.busRws (XEiJ.regPC); 8511: } 8512: XEiJ.regPC += 2; 8513: } else { 8514: //条件が成立していないのでデクリメント 8515: int rrr = XEiJ.regOC & 7; 8516: int t = XEiJ.regRn[rrr]; 8517: if ((short) t == 0) { //Drの下位16bitが0なので通過 8518: XEiJ.mpuCycleCount += 14; 8519: XEiJ.regRn[rrr] = t + 65535; 8520: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8521: //リードを省略する 8522: } else { 8523: XEiJ.busRws (XEiJ.regPC); 8524: } 8525: XEiJ.regPC += 2; 8526: } else { //Drの下位16bitが0でないのでジャンプ 8527: XEiJ.mpuCycleCount += 10; 8528: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8529: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8530: } 8531: } 8532: } else if (ea < XEiJ.EA_AR) { //SPL.B Dr 8533: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //セット 8534: XEiJ.mpuCycleCount += 6; 8535: XEiJ.regRn[ea] |= 0xff; 8536: } else { //クリア 8537: XEiJ.mpuCycleCount += 4; 8538: XEiJ.regRn[ea] &= ~0xff; 8539: } 8540: } else { //SPL.B <mem> 8541: XEiJ.mpuCycleCount += 8; 8542: //MC68000のSccはリードしてからライトする 8543: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8544: //! 軽量化。リードを省略する 8545: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_PL << XEiJ.regCCR >> 31); 8546: } else { 8547: int a = efaMltByte (ea); 8548: XEiJ.busRbs (a); 8549: XEiJ.busWb (a, XEiJ.MPU_CC_PL << XEiJ.regCCR >> 31); 8550: } 8551: } 8552: } //irpSpl 8553: 8554: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8555: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8556: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8557: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8558: //SMI.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr 8559: //SNPL.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr [SMI.B <ea>] 8560: //DBMI.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} 8561: //DBNPL.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} [DBMI.W Dr,<label>] 8562: public static void irpSmi () throws M68kException { 8563: int ea = XEiJ.regOC & 63; 8564: if (ea >> 3 == XEiJ.MMM_AR) { //DBMI.W Dr,<label> 8565: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { 8566: //条件が成立しているので通過 8567: XEiJ.mpuCycleCount += 12; 8568: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8569: //リードを省略する 8570: } else { 8571: XEiJ.busRws (XEiJ.regPC); 8572: } 8573: XEiJ.regPC += 2; 8574: } else { 8575: //条件が成立していないのでデクリメント 8576: int rrr = XEiJ.regOC & 7; 8577: int t = XEiJ.regRn[rrr]; 8578: if ((short) t == 0) { //Drの下位16bitが0なので通過 8579: XEiJ.mpuCycleCount += 14; 8580: XEiJ.regRn[rrr] = t + 65535; 8581: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8582: //リードを省略する 8583: } else { 8584: XEiJ.busRws (XEiJ.regPC); 8585: } 8586: XEiJ.regPC += 2; 8587: } else { //Drの下位16bitが0でないのでジャンプ 8588: XEiJ.mpuCycleCount += 10; 8589: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8590: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8591: } 8592: } 8593: } else if (ea < XEiJ.EA_AR) { //SMI.B Dr 8594: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //セット 8595: XEiJ.mpuCycleCount += 6; 8596: XEiJ.regRn[ea] |= 0xff; 8597: } else { //クリア 8598: XEiJ.mpuCycleCount += 4; 8599: XEiJ.regRn[ea] &= ~0xff; 8600: } 8601: } else { //SMI.B <mem> 8602: XEiJ.mpuCycleCount += 8; 8603: //MC68000のSccはリードしてからライトする 8604: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8605: //! 軽量化。リードを省略する 8606: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_MI << XEiJ.regCCR >> 31); 8607: } else { 8608: int a = efaMltByte (ea); 8609: XEiJ.busRbs (a); 8610: XEiJ.busWb (a, XEiJ.MPU_CC_MI << XEiJ.regCCR >> 31); 8611: } 8612: } 8613: } //irpSmi 8614: 8615: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8616: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8617: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8619: //SGE.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr 8620: //SNLT.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr [SGE.B <ea>] 8621: //DBGE.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} 8622: //DBNLT.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} [DBGE.W Dr,<label>] 8623: public static void irpSge () throws M68kException { 8624: int ea = XEiJ.regOC & 63; 8625: if (ea >> 3 == XEiJ.MMM_AR) { //DBGE.W Dr,<label> 8626: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { 8627: //条件が成立しているので通過 8628: XEiJ.mpuCycleCount += 12; 8629: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8630: //リードを省略する 8631: } else { 8632: XEiJ.busRws (XEiJ.regPC); 8633: } 8634: XEiJ.regPC += 2; 8635: } else { 8636: //条件が成立していないのでデクリメント 8637: int rrr = XEiJ.regOC & 7; 8638: int t = XEiJ.regRn[rrr]; 8639: if ((short) t == 0) { //Drの下位16bitが0なので通過 8640: XEiJ.mpuCycleCount += 14; 8641: XEiJ.regRn[rrr] = t + 65535; 8642: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8643: //リードを省略する 8644: } else { 8645: XEiJ.busRws (XEiJ.regPC); 8646: } 8647: XEiJ.regPC += 2; 8648: } else { //Drの下位16bitが0でないのでジャンプ 8649: XEiJ.mpuCycleCount += 10; 8650: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8651: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8652: } 8653: } 8654: } else if (ea < XEiJ.EA_AR) { //SGE.B Dr 8655: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //セット 8656: XEiJ.mpuCycleCount += 6; 8657: XEiJ.regRn[ea] |= 0xff; 8658: } else { //クリア 8659: XEiJ.mpuCycleCount += 4; 8660: XEiJ.regRn[ea] &= ~0xff; 8661: } 8662: } else { //SGE.B <mem> 8663: XEiJ.mpuCycleCount += 8; 8664: //MC68000のSccはリードしてからライトする 8665: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8666: //! 軽量化。リードを省略する 8667: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GE << XEiJ.regCCR >> 31); 8668: } else { 8669: int a = efaMltByte (ea); 8670: XEiJ.busRbs (a); 8671: XEiJ.busWb (a, XEiJ.MPU_CC_GE << XEiJ.regCCR >> 31); 8672: } 8673: } 8674: } //irpSge 8675: 8676: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8677: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8678: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8679: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8680: //SLT.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr 8681: //SNGE.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr [SLT.B <ea>] 8682: //DBLT.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} 8683: //DBNGE.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} [DBLT.W Dr,<label>] 8684: public static void irpSlt () throws M68kException { 8685: int ea = XEiJ.regOC & 63; 8686: if (ea >> 3 == XEiJ.MMM_AR) { //DBLT.W Dr,<label> 8687: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { 8688: //条件が成立しているので通過 8689: XEiJ.mpuCycleCount += 12; 8690: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8691: //リードを省略する 8692: } else { 8693: XEiJ.busRws (XEiJ.regPC); 8694: } 8695: XEiJ.regPC += 2; 8696: } else { 8697: //条件が成立していないのでデクリメント 8698: int rrr = XEiJ.regOC & 7; 8699: int t = XEiJ.regRn[rrr]; 8700: if ((short) t == 0) { //Drの下位16bitが0なので通過 8701: XEiJ.mpuCycleCount += 14; 8702: XEiJ.regRn[rrr] = t + 65535; 8703: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8704: //リードを省略する 8705: } else { 8706: XEiJ.busRws (XEiJ.regPC); 8707: } 8708: XEiJ.regPC += 2; 8709: } else { //Drの下位16bitが0でないのでジャンプ 8710: XEiJ.mpuCycleCount += 10; 8711: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8712: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8713: } 8714: } 8715: } else if (ea < XEiJ.EA_AR) { //SLT.B Dr 8716: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //セット 8717: XEiJ.mpuCycleCount += 6; 8718: XEiJ.regRn[ea] |= 0xff; 8719: } else { //クリア 8720: XEiJ.mpuCycleCount += 4; 8721: XEiJ.regRn[ea] &= ~0xff; 8722: } 8723: } else { //SLT.B <mem> 8724: XEiJ.mpuCycleCount += 8; 8725: //MC68000のSccはリードしてからライトする 8726: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8727: //! 軽量化。リードを省略する 8728: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LT << XEiJ.regCCR >> 31); 8729: } else { 8730: int a = efaMltByte (ea); 8731: XEiJ.busRbs (a); 8732: XEiJ.busWb (a, XEiJ.MPU_CC_LT << XEiJ.regCCR >> 31); 8733: } 8734: } 8735: } //irpSlt 8736: 8737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8738: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8739: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8740: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8741: //SGT.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr 8742: //SNLE.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr [SGT.B <ea>] 8743: //DBGT.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} 8744: //DBNLE.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} [DBGT.W Dr,<label>] 8745: public static void irpSgt () throws M68kException { 8746: int ea = XEiJ.regOC & 63; 8747: if (ea >> 3 == XEiJ.MMM_AR) { //DBGT.W Dr,<label> 8748: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { 8749: //条件が成立しているので通過 8750: XEiJ.mpuCycleCount += 12; 8751: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8752: //リードを省略する 8753: } else { 8754: XEiJ.busRws (XEiJ.regPC); 8755: } 8756: XEiJ.regPC += 2; 8757: } else { 8758: //条件が成立していないのでデクリメント 8759: int rrr = XEiJ.regOC & 7; 8760: int t = XEiJ.regRn[rrr]; 8761: if ((short) t == 0) { //Drの下位16bitが0なので通過 8762: XEiJ.mpuCycleCount += 14; 8763: XEiJ.regRn[rrr] = t + 65535; 8764: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8765: //リードを省略する 8766: } else { 8767: XEiJ.busRws (XEiJ.regPC); 8768: } 8769: XEiJ.regPC += 2; 8770: } else { //Drの下位16bitが0でないのでジャンプ 8771: XEiJ.mpuCycleCount += 10; 8772: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8773: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8774: } 8775: } 8776: } else if (ea < XEiJ.EA_AR) { //SGT.B Dr 8777: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //セット 8778: XEiJ.mpuCycleCount += 6; 8779: XEiJ.regRn[ea] |= 0xff; 8780: } else { //クリア 8781: XEiJ.mpuCycleCount += 4; 8782: XEiJ.regRn[ea] &= ~0xff; 8783: } 8784: } else { //SGT.B <mem> 8785: XEiJ.mpuCycleCount += 8; 8786: //MC68000のSccはリードしてからライトする 8787: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8788: //! 軽量化。リードを省略する 8789: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GT << XEiJ.regCCR >> 31); 8790: } else { 8791: int a = efaMltByte (ea); 8792: XEiJ.busRbs (a); 8793: XEiJ.busWb (a, XEiJ.MPU_CC_GT << XEiJ.regCCR >> 31); 8794: } 8795: } 8796: } //irpSgt 8797: 8798: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8799: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8800: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8801: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8802: //SLE.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr 8803: //SNGT.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr [SLE.B <ea>] 8804: //DBLE.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} 8805: //DBNGT.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} [DBLE.W Dr,<label>] 8806: public static void irpSle () throws M68kException { 8807: int ea = XEiJ.regOC & 63; 8808: if (ea >> 3 == XEiJ.MMM_AR) { //DBLE.W Dr,<label> 8809: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { 8810: //条件が成立しているので通過 8811: XEiJ.mpuCycleCount += 12; 8812: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8813: //リードを省略する 8814: } else { 8815: XEiJ.busRws (XEiJ.regPC); 8816: } 8817: XEiJ.regPC += 2; 8818: } else { 8819: //条件が成立していないのでデクリメント 8820: int rrr = XEiJ.regOC & 7; 8821: int t = XEiJ.regRn[rrr]; 8822: if ((short) t == 0) { //Drの下位16bitが0なので通過 8823: XEiJ.mpuCycleCount += 14; 8824: XEiJ.regRn[rrr] = t + 65535; 8825: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8826: //リードを省略する 8827: } else { 8828: XEiJ.busRws (XEiJ.regPC); 8829: } 8830: XEiJ.regPC += 2; 8831: } else { //Drの下位16bitが0でないのでジャンプ 8832: XEiJ.mpuCycleCount += 10; 8833: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8834: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8835: } 8836: } 8837: } else if (ea < XEiJ.EA_AR) { //SLE.B Dr 8838: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //セット 8839: XEiJ.mpuCycleCount += 6; 8840: XEiJ.regRn[ea] |= 0xff; 8841: } else { //クリア 8842: XEiJ.mpuCycleCount += 4; 8843: XEiJ.regRn[ea] &= ~0xff; 8844: } 8845: } else { //SLE.B <mem> 8846: XEiJ.mpuCycleCount += 8; 8847: //MC68000のSccはリードしてからライトする 8848: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8849: //! 軽量化。リードを省略する 8850: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LE << XEiJ.regCCR >> 31); 8851: } else { 8852: int a = efaMltByte (ea); 8853: XEiJ.busRbs (a); 8854: XEiJ.busWb (a, XEiJ.MPU_CC_LE << XEiJ.regCCR >> 31); 8855: } 8856: } 8857: } //irpSle 8858: 8859: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8860: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8861: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8862: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8863: //BRA.W <label> |-|012346|-|-----|-----| |0110_000_000_000_000-{offset} 8864: //JBRA.W <label> |A|012346|-|-----|-----| |0110_000_000_000_000-{offset} [BRA.W <label>] 8865: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) 8866: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) [BRA.S <label>] 8867: public static void irpBrasw () throws M68kException { 8868: XEiJ.mpuCycleCount += 10; 8869: int t = XEiJ.regPC; //pc0+2 8870: int s = (byte) XEiJ.regOC; //オフセット 8871: if (s == 0) { //BRA.W 8872: XEiJ.regPC = t + 2; 8873: s = XEiJ.busRwse (t); //pcws 8874: } else { //BRA.S 8875: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 8876: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 8877: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8878: //! 軽量化。リードを省略する 8879: } else { 8880: XEiJ.busRwse (t); //pcws 8881: } 8882: } 8883: irpSetPC (t + s); //pc0+2+オフセット 8884: } //irpBrasw 8885: 8886: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8887: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8888: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8889: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8890: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_001_sss_sss 8891: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_001_sss_sss [BRA.S <label>] 8892: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8893: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8894: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8895: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8896: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_010_sss_sss 8897: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_010_sss_sss [BRA.S <label>] 8898: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8899: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8900: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8901: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8902: //BRA.S <label> |-|01----|-|-----|-----| |0110_000_011_sss_sss 8903: //JBRA.S <label> |A|01----|-|-----|-----| |0110_000_011_sss_sss [BRA.S <label>] 8904: public static void irpBras () throws M68kException { 8905: XEiJ.mpuCycleCount += 10; 8906: int t = XEiJ.regPC; //pc0+2 8907: int s = (byte) XEiJ.regOC; //オフセット 8908: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 8909: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 8910: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8911: //! 軽量化。リードを省略する 8912: } else { 8913: XEiJ.busRwse (t); //pcws 8914: } 8915: irpSetPC (t + s); //pc0+2+オフセット 8916: } //irpBras 8917: 8918: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8919: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8920: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8921: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8922: //BSR.W <label> |-|012346|-|-----|-----| |0110_000_100_000_000-{offset} 8923: //JBSR.W <label> |A|012346|-|-----|-----| |0110_000_100_000_000-{offset} [BSR.W <label>] 8924: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) 8925: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) [BSR.S <label>] 8926: public static void irpBsrsw () throws M68kException { 8927: XEiJ.mpuCycleCount += 18; 8928: int t = XEiJ.regPC; //pc0+2 8929: int s = (byte) XEiJ.regOC; //オフセット 8930: if (s == 0) { //BSR.W 8931: XEiJ.regPC = t + 2; 8932: s = XEiJ.busRwse (t); //pcws 8933: } else { //BSR.S 8934: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 8935: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 8936: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8937: //! 軽量化。リードを省略する 8938: } else { 8939: XEiJ.busRwse (t); //pcws 8940: } 8941: } 8942: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 8943: irpSetPC (t + s); //pc0+2+オフセット 8944: } //irpBsrsw 8945: 8946: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8947: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8948: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8949: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8950: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_101_sss_sss 8951: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_101_sss_sss [BSR.S <label>] 8952: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8953: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8954: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8955: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8956: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_110_sss_sss 8957: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_110_sss_sss [BSR.S <label>] 8958: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8959: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8960: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8961: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8962: //BSR.S <label> |-|01----|-|-----|-----| |0110_000_111_sss_sss 8963: //JBSR.S <label> |A|01----|-|-----|-----| |0110_000_111_sss_sss [BSR.S <label>] 8964: public static void irpBsrs () throws M68kException { 8965: XEiJ.mpuCycleCount += 18; 8966: int t = XEiJ.regPC; //pc0+2 8967: int s = (byte) XEiJ.regOC; //オフセット 8968: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 8969: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 8970: if (XEiJ.MPU_OMIT_EXTRA_READ) { 8971: //! 軽量化。リードを省略する 8972: } else { 8973: XEiJ.busRwse (t); //pcws 8974: } 8975: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 8976: irpSetPC (t + s); //pc0+2+オフセット 8977: } //irpBsrs 8978: 8979: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8980: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8981: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8982: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8983: //BHI.W <label> |-|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} 8984: //BNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 8985: //JBHI.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 8986: //JBNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 8987: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) 8988: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 8989: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 8990: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 8991: //JBLS.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 8992: //JBNHI.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 8993: public static void irpBhisw () throws M68kException { 8994: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //Bccでジャンプ 8995: XEiJ.mpuCycleCount += 10; 8996: int t = XEiJ.regPC; //pc0+2 8997: int s = (byte) XEiJ.regOC; //オフセット 8998: if (s == 0) { //Bcc.Wでジャンプ 8999: XEiJ.regPC = t + 2; 9000: s = XEiJ.busRwse (t); //pcws 9001: } else { //Bcc.Sでジャンプ 9002: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9003: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9004: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9005: //! 軽量化。リードを省略する 9006: } else { 9007: XEiJ.busRwse (t); //pcws 9008: } 9009: } 9010: irpSetPC (t + s); //pc0+2+オフセット 9011: } else if (XEiJ.regOC == 0x6200) { //Bcc.Wで通過 9012: XEiJ.mpuCycleCount += 12; 9013: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9014: //リードを省略する 9015: } else { 9016: XEiJ.busRws (XEiJ.regPC); 9017: } 9018: XEiJ.regPC += 2; 9019: } else { //Bcc.Sで通過 9020: XEiJ.mpuCycleCount += 8; 9021: } 9022: } //irpBhisw 9023: 9024: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9025: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9026: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9027: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9028: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_001_sss_sss 9029: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9030: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9031: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9032: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9033: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9034: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9035: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9036: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_010_sss_sss 9037: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9038: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9039: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9040: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9041: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9042: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9043: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9044: //BHI.S <label> |-|01----|-|--*-*|-----| |0110_001_011_sss_sss 9045: //BNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9046: //JBHI.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9047: //JBNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9048: public static void irpBhis () throws M68kException { 9049: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9050: XEiJ.mpuCycleCount += 10; 9051: int t = XEiJ.regPC; //pc0+2 9052: int s = (byte) XEiJ.regOC; //オフセット 9053: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9054: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9055: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9056: //! 軽量化。リードを省略する 9057: } else { 9058: XEiJ.busRwse (t); //pcws 9059: } 9060: irpSetPC (t + s); //pc0+2+オフセット 9061: } else { //Bcc.Sで通過 9062: XEiJ.mpuCycleCount += 8; 9063: } 9064: } //irpBhis 9065: 9066: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9067: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9068: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9069: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9070: //BLS.W <label> |-|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} 9071: //BNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9072: //JBLS.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9073: //JBNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9074: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) 9075: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9076: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9077: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9078: //JBHI.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 9079: //JBNLS.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 9080: public static void irpBlssw () throws M68kException { 9081: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //Bccでジャンプ 9082: XEiJ.mpuCycleCount += 10; 9083: int t = XEiJ.regPC; //pc0+2 9084: int s = (byte) XEiJ.regOC; //オフセット 9085: if (s == 0) { //Bcc.Wでジャンプ 9086: XEiJ.regPC = t + 2; 9087: s = XEiJ.busRwse (t); //pcws 9088: } else { //Bcc.Sでジャンプ 9089: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9090: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9091: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9092: //! 軽量化。リードを省略する 9093: } else { 9094: XEiJ.busRwse (t); //pcws 9095: } 9096: } 9097: irpSetPC (t + s); //pc0+2+オフセット 9098: } else if (XEiJ.regOC == 0x6300) { //Bcc.Wで通過 9099: XEiJ.mpuCycleCount += 12; 9100: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9101: //リードを省略する 9102: } else { 9103: XEiJ.busRws (XEiJ.regPC); 9104: } 9105: XEiJ.regPC += 2; 9106: } else { //Bcc.Sで通過 9107: XEiJ.mpuCycleCount += 8; 9108: } 9109: } //irpBlssw 9110: 9111: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9112: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9113: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9115: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_101_sss_sss 9116: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9117: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9118: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9119: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9120: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9121: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9122: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9123: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_110_sss_sss 9124: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9125: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9126: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9127: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9128: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9129: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9130: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9131: //BLS.S <label> |-|01----|-|--*-*|-----| |0110_001_111_sss_sss 9132: //BNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9133: //JBLS.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9134: //JBNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9135: public static void irpBlss () throws M68kException { 9136: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9137: XEiJ.mpuCycleCount += 10; 9138: int t = XEiJ.regPC; //pc0+2 9139: int s = (byte) XEiJ.regOC; //オフセット 9140: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9141: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9142: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9143: //! 軽量化。リードを省略する 9144: } else { 9145: XEiJ.busRwse (t); //pcws 9146: } 9147: irpSetPC (t + s); //pc0+2+オフセット 9148: } else { //Bcc.Sで通過 9149: XEiJ.mpuCycleCount += 8; 9150: } 9151: } //irpBlss 9152: 9153: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9154: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9155: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9156: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9157: //BCC.W <label> |-|012346|-|----*|-----| |0110_010_000_000_000-{offset} 9158: //BHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9159: //BNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9160: //BNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9161: //JBCC.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9162: //JBHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9163: //JBNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9164: //JBNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9165: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) 9166: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9167: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9168: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9169: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9170: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9171: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9172: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9173: //JBCS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9174: //JBLO.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9175: //JBNCC.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9176: //JBNHS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9177: public static void irpBhssw () throws M68kException { 9178: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //Bccでジャンプ 9179: XEiJ.mpuCycleCount += 10; 9180: int t = XEiJ.regPC; //pc0+2 9181: int s = (byte) XEiJ.regOC; //オフセット 9182: if (s == 0) { //Bcc.Wでジャンプ 9183: XEiJ.regPC = t + 2; 9184: s = XEiJ.busRwse (t); //pcws 9185: } else { //Bcc.Sでジャンプ 9186: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9187: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9188: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9189: //! 軽量化。リードを省略する 9190: } else { 9191: XEiJ.busRwse (t); //pcws 9192: } 9193: } 9194: irpSetPC (t + s); //pc0+2+オフセット 9195: } else if (XEiJ.regOC == 0x6400) { //Bcc.Wで通過 9196: XEiJ.mpuCycleCount += 12; 9197: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9198: //リードを省略する 9199: } else { 9200: XEiJ.busRws (XEiJ.regPC); 9201: } 9202: XEiJ.regPC += 2; 9203: } else { //Bcc.Sで通過 9204: XEiJ.mpuCycleCount += 8; 9205: } 9206: } //irpBhssw 9207: 9208: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9209: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9210: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9211: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9212: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_001_sss_sss 9213: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9214: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9215: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9216: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9217: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9218: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9219: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9220: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9221: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9222: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9223: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9224: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_010_sss_sss 9225: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9226: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9227: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9228: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9229: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9230: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9231: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9232: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9233: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9234: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9235: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9236: //BCC.S <label> |-|01----|-|----*|-----| |0110_010_011_sss_sss 9237: //BHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9238: //BNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9239: //BNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9240: //JBCC.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9241: //JBHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9242: //JBNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9243: //JBNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9244: public static void irpBhss () throws M68kException { 9245: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9246: XEiJ.mpuCycleCount += 10; 9247: int t = XEiJ.regPC; //pc0+2 9248: int s = (byte) XEiJ.regOC; //オフセット 9249: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9250: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9251: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9252: //! 軽量化。リードを省略する 9253: } else { 9254: XEiJ.busRwse (t); //pcws 9255: } 9256: irpSetPC (t + s); //pc0+2+オフセット 9257: } else { //Bcc.Sで通過 9258: XEiJ.mpuCycleCount += 8; 9259: } 9260: } //irpBhss 9261: 9262: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9263: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9264: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9265: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9266: //BCS.W <label> |-|012346|-|----*|-----| |0110_010_100_000_000-{offset} 9267: //BLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9268: //BNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9269: //BNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9270: //JBCS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9271: //JBLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9272: //JBNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9273: //JBNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9274: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) 9275: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9276: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9277: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9278: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9279: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9280: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9281: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9282: //JBCC.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9283: //JBHS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9284: //JBNCS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9285: //JBNLO.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9286: public static void irpBlosw () throws M68kException { 9287: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //Bccでジャンプ 9288: XEiJ.mpuCycleCount += 10; 9289: int t = XEiJ.regPC; //pc0+2 9290: int s = (byte) XEiJ.regOC; //オフセット 9291: if (s == 0) { //Bcc.Wでジャンプ 9292: XEiJ.regPC = t + 2; 9293: s = XEiJ.busRwse (t); //pcws 9294: } else { //Bcc.Sでジャンプ 9295: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9296: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9297: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9298: //! 軽量化。リードを省略する 9299: } else { 9300: XEiJ.busRwse (t); //pcws 9301: } 9302: } 9303: irpSetPC (t + s); //pc0+2+オフセット 9304: } else if (XEiJ.regOC == 0x6500) { //Bcc.Wで通過 9305: XEiJ.mpuCycleCount += 12; 9306: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9307: //リードを省略する 9308: } else { 9309: XEiJ.busRws (XEiJ.regPC); 9310: } 9311: XEiJ.regPC += 2; 9312: } else { //Bcc.Sで通過 9313: XEiJ.mpuCycleCount += 8; 9314: } 9315: } //irpBlosw 9316: 9317: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9318: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9319: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9320: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9321: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_101_sss_sss 9322: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9323: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9324: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9325: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9326: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9327: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9328: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9329: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9330: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9331: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9332: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9333: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_110_sss_sss 9334: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9335: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9336: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9337: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9338: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9339: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9340: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9341: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9342: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9343: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9344: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9345: //BCS.S <label> |-|01----|-|----*|-----| |0110_010_111_sss_sss 9346: //BLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9347: //BNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9348: //BNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9349: //JBCS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9350: //JBLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9351: //JBNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9352: //JBNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9353: public static void irpBlos () throws M68kException { 9354: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //Bccでジャンプ 9355: XEiJ.mpuCycleCount += 10; 9356: int t = XEiJ.regPC; //pc0+2 9357: int s = (byte) XEiJ.regOC; //オフセット 9358: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9359: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9360: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9361: //! 軽量化。リードを省略する 9362: } else { 9363: XEiJ.busRwse (t); //pcws 9364: } 9365: irpSetPC (t + s); //pc0+2+オフセット 9366: } else { //Bcc.Sで通過 9367: XEiJ.mpuCycleCount += 8; 9368: } 9369: } //irpBlos 9370: 9371: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9372: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9373: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9374: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9375: //BNE.W <label> |-|012346|-|--*--|-----| |0110_011_000_000_000-{offset} 9376: //BNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9377: //BNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9378: //BNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9379: //JBNE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9380: //JBNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9381: //JBNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9382: //JBNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9383: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) 9384: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9385: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9386: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9387: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9388: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9389: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9390: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9391: //JBEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9392: //JBNEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9393: //JBNNE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9394: //JBNNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9395: //JBNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9396: //JBNZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9397: //JBZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9398: public static void irpBnesw () throws M68kException { 9399: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //Bccでジャンプ 9400: XEiJ.mpuCycleCount += 10; 9401: int t = XEiJ.regPC; //pc0+2 9402: int s = (byte) XEiJ.regOC; //オフセット 9403: if (s == 0) { //Bcc.Wでジャンプ 9404: XEiJ.regPC = t + 2; 9405: s = XEiJ.busRwse (t); //pcws 9406: } else { //Bcc.Sでジャンプ 9407: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9408: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9409: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9410: //! 軽量化。リードを省略する 9411: } else { 9412: XEiJ.busRwse (t); //pcws 9413: } 9414: } 9415: irpSetPC (t + s); //pc0+2+オフセット 9416: } else if (XEiJ.regOC == 0x6600) { //Bcc.Wで通過 9417: XEiJ.mpuCycleCount += 12; 9418: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9419: //リードを省略する 9420: } else { 9421: XEiJ.busRws (XEiJ.regPC); 9422: } 9423: XEiJ.regPC += 2; 9424: } else { //Bcc.Sで通過 9425: XEiJ.mpuCycleCount += 8; 9426: } 9427: } //irpBnesw 9428: 9429: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9430: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9431: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9432: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9433: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_001_sss_sss 9434: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9435: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9436: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9437: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9438: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9439: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9440: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9441: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9442: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9443: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9444: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9445: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_010_sss_sss 9446: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9447: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9448: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9449: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9450: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9451: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9452: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9453: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9454: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9455: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9456: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9457: //BNE.S <label> |-|01----|-|--*--|-----| |0110_011_011_sss_sss 9458: //BNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9459: //BNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9460: //BNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9461: //JBNE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9462: //JBNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9463: //JBNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9464: //JBNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9465: public static void irpBnes () throws M68kException { 9466: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //Bccでジャンプ 9467: XEiJ.mpuCycleCount += 10; 9468: int t = XEiJ.regPC; //pc0+2 9469: int s = (byte) XEiJ.regOC; //オフセット 9470: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9471: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9472: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9473: //! 軽量化。リードを省略する 9474: } else { 9475: XEiJ.busRwse (t); //pcws 9476: } 9477: irpSetPC (t + s); //pc0+2+オフセット 9478: } else { //Bcc.Sで通過 9479: XEiJ.mpuCycleCount += 8; 9480: } 9481: } //irpBnes 9482: 9483: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9484: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9485: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9486: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9487: //BEQ.W <label> |-|012346|-|--*--|-----| |0110_011_100_000_000-{offset} 9488: //BNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9489: //BNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9490: //BZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9491: //JBEQ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9492: //JBNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9493: //JBNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9494: //JBZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9495: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) 9496: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9497: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9498: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9499: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9500: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9501: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9502: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9503: //JBNE.L <label> |A|012346|-|--*--|-----| |0110_011_100_000_110-0100111011111001-{address} [BEQ.S (*)+8;JMP <label>] 9504: public static void irpBeqsw () throws M68kException { 9505: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //Bccでジャンプ 9506: XEiJ.mpuCycleCount += 10; 9507: int t = XEiJ.regPC; //pc0+2 9508: int s = (byte) XEiJ.regOC; //オフセット 9509: if (s == 0) { //Bcc.Wでジャンプ 9510: XEiJ.regPC = t + 2; 9511: s = XEiJ.busRwse (t); //pcws 9512: } else { //Bcc.Sでジャンプ 9513: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9514: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9515: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9516: //! 軽量化。リードを省略する 9517: } else { 9518: XEiJ.busRwse (t); //pcws 9519: } 9520: } 9521: irpSetPC (t + s); //pc0+2+オフセット 9522: } else if (XEiJ.regOC == 0x6700) { //Bcc.Wで通過 9523: XEiJ.mpuCycleCount += 12; 9524: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9525: //リードを省略する 9526: } else { 9527: XEiJ.busRws (XEiJ.regPC); 9528: } 9529: XEiJ.regPC += 2; 9530: } else { //Bcc.Sで通過 9531: XEiJ.mpuCycleCount += 8; 9532: } 9533: } //irpBeqsw 9534: 9535: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9536: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9537: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9538: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9539: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_101_sss_sss 9540: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9541: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9542: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9543: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9544: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9545: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9546: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9547: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9548: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9549: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9550: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9551: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_110_sss_sss 9552: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9553: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9554: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9555: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9556: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9557: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9558: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9559: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9560: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9561: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9562: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9563: //BEQ.S <label> |-|01----|-|--*--|-----| |0110_011_111_sss_sss 9564: //BNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9565: //BNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9566: //BZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9567: //JBEQ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9568: //JBNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9569: //JBNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9570: //JBZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9571: public static void irpBeqs () throws M68kException { 9572: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //Bccでジャンプ 9573: XEiJ.mpuCycleCount += 10; 9574: int t = XEiJ.regPC; //pc0+2 9575: int s = (byte) XEiJ.regOC; //オフセット 9576: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9577: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9578: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9579: //! 軽量化。リードを省略する 9580: } else { 9581: XEiJ.busRwse (t); //pcws 9582: } 9583: irpSetPC (t + s); //pc0+2+オフセット 9584: } else { //Bcc.Sで通過 9585: XEiJ.mpuCycleCount += 8; 9586: } 9587: } //irpBeqs 9588: 9589: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9590: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9591: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9592: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9593: //BVC.W <label> |-|012346|-|---*-|-----| |0110_100_000_000_000-{offset} 9594: //BNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9595: //JBNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9596: //JBVC.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9597: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) 9598: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9599: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9600: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9601: //JBNVC.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 9602: //JBVS.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 9603: public static void irpBvcsw () throws M68kException { 9604: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //Bccでジャンプ 9605: XEiJ.mpuCycleCount += 10; 9606: int t = XEiJ.regPC; //pc0+2 9607: int s = (byte) XEiJ.regOC; //オフセット 9608: if (s == 0) { //Bcc.Wでジャンプ 9609: XEiJ.regPC = t + 2; 9610: s = XEiJ.busRwse (t); //pcws 9611: } else { //Bcc.Sでジャンプ 9612: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9613: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9614: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9615: //! 軽量化。リードを省略する 9616: } else { 9617: XEiJ.busRwse (t); //pcws 9618: } 9619: } 9620: irpSetPC (t + s); //pc0+2+オフセット 9621: } else if (XEiJ.regOC == 0x6800) { //Bcc.Wで通過 9622: XEiJ.mpuCycleCount += 12; 9623: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9624: //リードを省略する 9625: } else { 9626: XEiJ.busRws (XEiJ.regPC); 9627: } 9628: XEiJ.regPC += 2; 9629: } else { //Bcc.Sで通過 9630: XEiJ.mpuCycleCount += 8; 9631: } 9632: } //irpBvcsw 9633: 9634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9635: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9636: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9637: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9638: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_001_sss_sss 9639: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 9640: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 9641: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 9642: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9643: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9644: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9645: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9646: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_010_sss_sss 9647: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 9648: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 9649: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 9650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9651: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9652: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9654: //BVC.S <label> |-|01----|-|---*-|-----| |0110_100_011_sss_sss 9655: //BNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 9656: //JBNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 9657: //JBVC.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 9658: public static void irpBvcs () throws M68kException { 9659: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //Bccでジャンプ 9660: XEiJ.mpuCycleCount += 10; 9661: int t = XEiJ.regPC; //pc0+2 9662: int s = (byte) XEiJ.regOC; //オフセット 9663: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9664: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9665: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9666: //! 軽量化。リードを省略する 9667: } else { 9668: XEiJ.busRwse (t); //pcws 9669: } 9670: irpSetPC (t + s); //pc0+2+オフセット 9671: } else { //Bcc.Sで通過 9672: XEiJ.mpuCycleCount += 8; 9673: } 9674: } //irpBvcs 9675: 9676: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9677: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9678: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9679: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9680: //BVS.W <label> |-|012346|-|---*-|-----| |0110_100_100_000_000-{offset} 9681: //BNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 9682: //JBNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 9683: //JBVS.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 9684: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) 9685: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 9686: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 9687: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 9688: //JBNVS.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 9689: //JBVC.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 9690: public static void irpBvssw () throws M68kException { 9691: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //Bccでジャンプ 9692: XEiJ.mpuCycleCount += 10; 9693: int t = XEiJ.regPC; //pc0+2 9694: int s = (byte) XEiJ.regOC; //オフセット 9695: if (s == 0) { //Bcc.Wでジャンプ 9696: XEiJ.regPC = t + 2; 9697: s = XEiJ.busRwse (t); //pcws 9698: } else { //Bcc.Sでジャンプ 9699: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9700: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9701: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9702: //! 軽量化。リードを省略する 9703: } else { 9704: XEiJ.busRwse (t); //pcws 9705: } 9706: } 9707: irpSetPC (t + s); //pc0+2+オフセット 9708: } else if (XEiJ.regOC == 0x6900) { //Bcc.Wで通過 9709: XEiJ.mpuCycleCount += 12; 9710: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9711: //リードを省略する 9712: } else { 9713: XEiJ.busRws (XEiJ.regPC); 9714: } 9715: XEiJ.regPC += 2; 9716: } else { //Bcc.Sで通過 9717: XEiJ.mpuCycleCount += 8; 9718: } 9719: } //irpBvssw 9720: 9721: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9722: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9723: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9724: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9725: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_101_sss_sss 9726: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 9727: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 9728: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 9729: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9730: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9731: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9732: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9733: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_110_sss_sss 9734: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 9735: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 9736: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 9737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9738: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9739: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9740: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9741: //BVS.S <label> |-|01----|-|---*-|-----| |0110_100_111_sss_sss 9742: //BNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 9743: //JBNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 9744: //JBVS.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 9745: public static void irpBvss () throws M68kException { 9746: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //Bccでジャンプ 9747: XEiJ.mpuCycleCount += 10; 9748: int t = XEiJ.regPC; //pc0+2 9749: int s = (byte) XEiJ.regOC; //オフセット 9750: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9751: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9752: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9753: //! 軽量化。リードを省略する 9754: } else { 9755: XEiJ.busRwse (t); //pcws 9756: } 9757: irpSetPC (t + s); //pc0+2+オフセット 9758: } else { //Bcc.Sで通過 9759: XEiJ.mpuCycleCount += 8; 9760: } 9761: } //irpBvss 9762: 9763: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9764: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9765: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9766: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9767: //BPL.W <label> |-|012346|-|-*---|-----| |0110_101_000_000_000-{offset} 9768: //BNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 9769: //JBNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 9770: //JBPL.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 9771: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) 9772: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 9773: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 9774: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 9775: //JBMI.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 9776: //JBNPL.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 9777: public static void irpBplsw () throws M68kException { 9778: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //Bccでジャンプ 9779: XEiJ.mpuCycleCount += 10; 9780: int t = XEiJ.regPC; //pc0+2 9781: int s = (byte) XEiJ.regOC; //オフセット 9782: if (s == 0) { //Bcc.Wでジャンプ 9783: XEiJ.regPC = t + 2; 9784: s = XEiJ.busRwse (t); //pcws 9785: } else { //Bcc.Sでジャンプ 9786: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9787: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9788: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9789: //! 軽量化。リードを省略する 9790: } else { 9791: XEiJ.busRwse (t); //pcws 9792: } 9793: } 9794: irpSetPC (t + s); //pc0+2+オフセット 9795: } else if (XEiJ.regOC == 0x6a00) { //Bcc.Wで通過 9796: XEiJ.mpuCycleCount += 12; 9797: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9798: //リードを省略する 9799: } else { 9800: XEiJ.busRws (XEiJ.regPC); 9801: } 9802: XEiJ.regPC += 2; 9803: } else { //Bcc.Sで通過 9804: XEiJ.mpuCycleCount += 8; 9805: } 9806: } //irpBplsw 9807: 9808: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9809: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9810: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9812: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_001_sss_sss 9813: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 9814: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 9815: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 9816: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9817: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9818: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9819: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9820: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_010_sss_sss 9821: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 9822: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 9823: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 9824: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9825: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9826: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9827: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9828: //BPL.S <label> |-|01----|-|-*---|-----| |0110_101_011_sss_sss 9829: //BNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 9830: //JBNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 9831: //JBPL.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 9832: public static void irpBpls () throws M68kException { 9833: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //Bccでジャンプ 9834: XEiJ.mpuCycleCount += 10; 9835: int t = XEiJ.regPC; //pc0+2 9836: int s = (byte) XEiJ.regOC; //オフセット 9837: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9838: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9839: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9840: //! 軽量化。リードを省略する 9841: } else { 9842: XEiJ.busRwse (t); //pcws 9843: } 9844: irpSetPC (t + s); //pc0+2+オフセット 9845: } else { //Bcc.Sで通過 9846: XEiJ.mpuCycleCount += 8; 9847: } 9848: } //irpBpls 9849: 9850: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9851: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9852: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9853: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9854: //BMI.W <label> |-|012346|-|-*---|-----| |0110_101_100_000_000-{offset} 9855: //BNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 9856: //JBMI.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 9857: //JBNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 9858: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) 9859: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 9860: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 9861: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 9862: //JBNMI.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 9863: //JBPL.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 9864: public static void irpBmisw () throws M68kException { 9865: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //Bccでジャンプ 9866: XEiJ.mpuCycleCount += 10; 9867: int t = XEiJ.regPC; //pc0+2 9868: int s = (byte) XEiJ.regOC; //オフセット 9869: if (s == 0) { //Bcc.Wでジャンプ 9870: XEiJ.regPC = t + 2; 9871: s = XEiJ.busRwse (t); //pcws 9872: } else { //Bcc.Sでジャンプ 9873: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9874: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9875: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9876: //! 軽量化。リードを省略する 9877: } else { 9878: XEiJ.busRwse (t); //pcws 9879: } 9880: } 9881: irpSetPC (t + s); //pc0+2+オフセット 9882: } else if (XEiJ.regOC == 0x6b00) { //Bcc.Wで通過 9883: XEiJ.mpuCycleCount += 12; 9884: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9885: //リードを省略する 9886: } else { 9887: XEiJ.busRws (XEiJ.regPC); 9888: } 9889: XEiJ.regPC += 2; 9890: } else { //Bcc.Sで通過 9891: XEiJ.mpuCycleCount += 8; 9892: } 9893: } //irpBmisw 9894: 9895: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9896: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9897: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9898: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9899: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_101_sss_sss 9900: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 9901: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 9902: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 9903: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9904: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9905: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9906: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9907: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_110_sss_sss 9908: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 9909: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 9910: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 9911: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9912: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9913: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9914: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9915: //BMI.S <label> |-|01----|-|-*---|-----| |0110_101_111_sss_sss 9916: //BNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 9917: //JBMI.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 9918: //JBNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 9919: public static void irpBmis () throws M68kException { 9920: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //Bccでジャンプ 9921: XEiJ.mpuCycleCount += 10; 9922: int t = XEiJ.regPC; //pc0+2 9923: int s = (byte) XEiJ.regOC; //オフセット 9924: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9925: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9926: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9927: //! 軽量化。リードを省略する 9928: } else { 9929: XEiJ.busRwse (t); //pcws 9930: } 9931: irpSetPC (t + s); //pc0+2+オフセット 9932: } else { //Bcc.Sで通過 9933: XEiJ.mpuCycleCount += 8; 9934: } 9935: } //irpBmis 9936: 9937: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9938: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9939: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9940: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9941: //BGE.W <label> |-|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} 9942: //BNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 9943: //JBGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 9944: //JBNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 9945: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) 9946: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 9947: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 9948: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 9949: //JBLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 9950: //JBNGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 9951: public static void irpBgesw () throws M68kException { 9952: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //Bccでジャンプ 9953: XEiJ.mpuCycleCount += 10; 9954: int t = XEiJ.regPC; //pc0+2 9955: int s = (byte) XEiJ.regOC; //オフセット 9956: if (s == 0) { //Bcc.Wでジャンプ 9957: XEiJ.regPC = t + 2; 9958: s = XEiJ.busRwse (t); //pcws 9959: } else { //Bcc.Sでジャンプ 9960: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9961: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9962: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9963: //! 軽量化。リードを省略する 9964: } else { 9965: XEiJ.busRwse (t); //pcws 9966: } 9967: } 9968: irpSetPC (t + s); //pc0+2+オフセット 9969: } else if (XEiJ.regOC == 0x6c00) { //Bcc.Wで通過 9970: XEiJ.mpuCycleCount += 12; 9971: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9972: //リードを省略する 9973: } else { 9974: XEiJ.busRws (XEiJ.regPC); 9975: } 9976: XEiJ.regPC += 2; 9977: } else { //Bcc.Sで通過 9978: XEiJ.mpuCycleCount += 8; 9979: } 9980: } //irpBgesw 9981: 9982: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9983: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9984: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9985: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9986: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_001_sss_sss 9987: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 9988: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 9989: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 9990: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9991: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9992: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9993: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9994: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_010_sss_sss 9995: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 9996: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 9997: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 9998: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9999: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10000: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10001: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10002: //BGE.S <label> |-|01----|-|-*-*-|-----| |0110_110_011_sss_sss 10003: //BNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10004: //JBGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10005: //JBNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10006: public static void irpBges () throws M68kException { 10007: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //Bccでジャンプ 10008: XEiJ.mpuCycleCount += 10; 10009: int t = XEiJ.regPC; //pc0+2 10010: int s = (byte) XEiJ.regOC; //オフセット 10011: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10012: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10013: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10014: //! 軽量化。リードを省略する 10015: } else { 10016: XEiJ.busRwse (t); //pcws 10017: } 10018: irpSetPC (t + s); //pc0+2+オフセット 10019: } else { //Bcc.Sで通過 10020: XEiJ.mpuCycleCount += 8; 10021: } 10022: } //irpBges 10023: 10024: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10025: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10026: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10027: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10028: //BLT.W <label> |-|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} 10029: //BNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10030: //JBLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10031: //JBNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10032: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) 10033: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10034: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10035: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10036: //JBGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 10037: //JBNLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 10038: public static void irpBltsw () throws M68kException { 10039: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //Bccでジャンプ 10040: XEiJ.mpuCycleCount += 10; 10041: int t = XEiJ.regPC; //pc0+2 10042: int s = (byte) XEiJ.regOC; //オフセット 10043: if (s == 0) { //Bcc.Wでジャンプ 10044: XEiJ.regPC = t + 2; 10045: s = XEiJ.busRwse (t); //pcws 10046: } else { //Bcc.Sでジャンプ 10047: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10048: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10049: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10050: //! 軽量化。リードを省略する 10051: } else { 10052: XEiJ.busRwse (t); //pcws 10053: } 10054: } 10055: irpSetPC (t + s); //pc0+2+オフセット 10056: } else if (XEiJ.regOC == 0x6d00) { //Bcc.Wで通過 10057: XEiJ.mpuCycleCount += 12; 10058: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10059: //リードを省略する 10060: } else { 10061: XEiJ.busRws (XEiJ.regPC); 10062: } 10063: XEiJ.regPC += 2; 10064: } else { //Bcc.Sで通過 10065: XEiJ.mpuCycleCount += 8; 10066: } 10067: } //irpBltsw 10068: 10069: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10070: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10071: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10072: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10073: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_101_sss_sss 10074: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10075: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10076: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10078: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10079: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10080: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10081: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_110_sss_sss 10082: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10083: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10084: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10085: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10086: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10087: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10088: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10089: //BLT.S <label> |-|01----|-|-*-*-|-----| |0110_110_111_sss_sss 10090: //BNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10091: //JBLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10092: //JBNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10093: public static void irpBlts () throws M68kException { 10094: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //Bccでジャンプ 10095: XEiJ.mpuCycleCount += 10; 10096: int t = XEiJ.regPC; //pc0+2 10097: int s = (byte) XEiJ.regOC; //オフセット 10098: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10099: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10100: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10101: //! 軽量化。リードを省略する 10102: } else { 10103: XEiJ.busRwse (t); //pcws 10104: } 10105: irpSetPC (t + s); //pc0+2+オフセット 10106: } else { //Bcc.Sで通過 10107: XEiJ.mpuCycleCount += 8; 10108: } 10109: } //irpBlts 10110: 10111: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10112: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10113: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10115: //BGT.W <label> |-|012346|-|-***-|-----| |0110_111_000_000_000-{offset} 10116: //BNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10117: //JBGT.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10118: //JBNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10119: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) 10120: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10121: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10122: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10123: //JBLE.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 10124: //JBNGT.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 10125: public static void irpBgtsw () throws M68kException { 10126: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //Bccでジャンプ 10127: XEiJ.mpuCycleCount += 10; 10128: int t = XEiJ.regPC; //pc0+2 10129: int s = (byte) XEiJ.regOC; //オフセット 10130: if (s == 0) { //Bcc.Wでジャンプ 10131: XEiJ.regPC = t + 2; 10132: s = XEiJ.busRwse (t); //pcws 10133: } else { //Bcc.Sでジャンプ 10134: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10135: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10136: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10137: //! 軽量化。リードを省略する 10138: } else { 10139: XEiJ.busRwse (t); //pcws 10140: } 10141: } 10142: irpSetPC (t + s); //pc0+2+オフセット 10143: } else if (XEiJ.regOC == 0x6e00) { //Bcc.Wで通過 10144: XEiJ.mpuCycleCount += 12; 10145: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10146: //リードを省略する 10147: } else { 10148: XEiJ.busRws (XEiJ.regPC); 10149: } 10150: XEiJ.regPC += 2; 10151: } else { //Bcc.Sで通過 10152: XEiJ.mpuCycleCount += 8; 10153: } 10154: } //irpBgtsw 10155: 10156: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10157: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10158: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10159: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10160: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_001_sss_sss 10161: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10162: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10163: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10164: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10165: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10166: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10167: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10168: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_010_sss_sss 10169: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10170: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10171: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10172: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10173: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10174: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10175: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10176: //BGT.S <label> |-|01----|-|-***-|-----| |0110_111_011_sss_sss 10177: //BNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10178: //JBGT.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10179: //JBNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10180: public static void irpBgts () throws M68kException { 10181: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //Bccでジャンプ 10182: XEiJ.mpuCycleCount += 10; 10183: int t = XEiJ.regPC; //pc0+2 10184: int s = (byte) XEiJ.regOC; //オフセット 10185: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10186: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10187: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10188: //! 軽量化。リードを省略する 10189: } else { 10190: XEiJ.busRwse (t); //pcws 10191: } 10192: irpSetPC (t + s); //pc0+2+オフセット 10193: } else { //Bcc.Sで通過 10194: XEiJ.mpuCycleCount += 8; 10195: } 10196: } //irpBgts 10197: 10198: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10199: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10200: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10201: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10202: //BLE.W <label> |-|012346|-|-***-|-----| |0110_111_100_000_000-{offset} 10203: //BNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10204: //JBLE.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10205: //JBNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10206: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) 10207: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10208: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10209: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10210: //JBGT.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 10211: //JBNLE.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 10212: public static void irpBlesw () throws M68kException { 10213: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //Bccでジャンプ 10214: XEiJ.mpuCycleCount += 10; 10215: int t = XEiJ.regPC; //pc0+2 10216: int s = (byte) XEiJ.regOC; //オフセット 10217: if (s == 0) { //Bcc.Wでジャンプ 10218: XEiJ.regPC = t + 2; 10219: s = XEiJ.busRwse (t); //pcws 10220: } else { //Bcc.Sでジャンプ 10221: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10222: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10223: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10224: //! 軽量化。リードを省略する 10225: } else { 10226: XEiJ.busRwse (t); //pcws 10227: } 10228: } 10229: irpSetPC (t + s); //pc0+2+オフセット 10230: } else if (XEiJ.regOC == 0x6f00) { //Bcc.Wで通過 10231: XEiJ.mpuCycleCount += 12; 10232: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10233: //リードを省略する 10234: } else { 10235: XEiJ.busRws (XEiJ.regPC); 10236: } 10237: XEiJ.regPC += 2; 10238: } else { //Bcc.Sで通過 10239: XEiJ.mpuCycleCount += 8; 10240: } 10241: } //irpBlesw 10242: 10243: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10244: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10245: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10246: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10247: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_101_sss_sss 10248: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10249: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10250: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10251: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10252: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10253: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10254: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10255: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_110_sss_sss 10256: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10257: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10258: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10259: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10260: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10261: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10262: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10263: //BLE.S <label> |-|01----|-|-***-|-----| |0110_111_111_sss_sss 10264: //BNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10265: //JBLE.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10266: //JBNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10267: public static void irpBles () throws M68kException { 10268: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //Bccでジャンプ 10269: XEiJ.mpuCycleCount += 10; 10270: int t = XEiJ.regPC; //pc0+2 10271: int s = (byte) XEiJ.regOC; //オフセット 10272: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10273: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10274: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10275: //! 軽量化。リードを省略する 10276: } else { 10277: XEiJ.busRwse (t); //pcws 10278: } 10279: irpSetPC (t + s); //pc0+2+オフセット 10280: } else { //Bcc.Sで通過 10281: XEiJ.mpuCycleCount += 8; 10282: } 10283: } //irpBles 10284: 10285: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10286: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10287: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10288: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10289: //IOCS <name> |A|012346|-|UUUUU|UUUUU| |0111_000_0dd_ddd_ddd-0100111001001111 [MOVEQ.L #<data>,D0;TRAP #15] 10290: //MOVEQ.L #<data>,Dq |-|012346|-|-UUUU|-**00| |0111_qqq_0dd_ddd_ddd 10291: public static void irpMoveq () throws M68kException { 10292: XEiJ.mpuCycleCount += 4; 10293: int z; 10294: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = (byte) XEiJ.regOC; 10295: 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 10296: } //irpMoveq 10297: 10298: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10299: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10300: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10301: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10302: //MVS.B <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B) 10303: // 10304: //MVS.B <ea>,Dq 10305: // バイトデータをロングに符号拡張してDqの全体を更新する 10306: public static void irpMvsByte () throws M68kException { 10307: XEiJ.mpuCycleCount += 4; 10308: int ea = XEiJ.regOC & 63; 10309: int z; 10310: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 10311: 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 10312: } //irpMvsByte 10313: 10314: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10315: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10316: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10317: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10318: //MVS.W <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B) 10319: // 10320: //MVS.W <ea>,Dq 10321: // ワードデータをロングに符号拡張してDqの全体を更新する 10322: public static void irpMvsWord () throws M68kException { 10323: XEiJ.mpuCycleCount += 4; 10324: int ea = XEiJ.regOC & 63; 10325: int z; 10326: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 10327: 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 10328: } //irpMvsWord 10329: 10330: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10331: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10332: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10333: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10334: //MVZ.B <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B) 10335: // 10336: //MVZ.B <ea>,Dq 10337: // バイトデータをロングにゼロ拡張してDqの全体を更新する 10338: public static void irpMvzByte () throws M68kException { 10339: XEiJ.mpuCycleCount += 4; 10340: int ea = XEiJ.regOC & 63; 10341: int z; 10342: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? 0xff & XEiJ.regRn[ea] : XEiJ.busRbz (efaAnyByte (ea)); 10343: XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0); 10344: } //irpMvzByte 10345: 10346: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10347: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10348: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10349: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10350: //MVZ.W <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B) 10351: // 10352: //MVZ.W <ea>,Dq 10353: // ワードデータをロングにゼロ拡張してDqの全体を更新する 10354: public static void irpMvzWord () throws M68kException { 10355: XEiJ.mpuCycleCount += 4; 10356: int ea = XEiJ.regOC & 63; 10357: int z; 10358: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); 10359: XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0); 10360: } //irpMvzWord 10361: 10362: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10363: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10364: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10365: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10366: //OR.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr 10367: public static void irpOrToRegByte () throws M68kException { 10368: XEiJ.mpuCycleCount += 4; 10369: int ea = XEiJ.regOC & 63; 10370: 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 10371: } //irpOrToRegByte 10372: 10373: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10374: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10375: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10376: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10377: //OR.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr 10378: public static void irpOrToRegWord () throws M68kException { 10379: XEiJ.mpuCycleCount += 4; 10380: int ea = XEiJ.regOC & 63; 10381: int z = (short) (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea))); //0拡張してからOR 10382: 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 10383: } //irpOrToRegWord 10384: 10385: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10386: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10387: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10388: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10389: //OR.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr 10390: public static void irpOrToRegLong () throws M68kException { 10391: int ea = XEiJ.regOC & 63; 10392: int qqq = XEiJ.regOC >> 9 & 7; 10393: int z; 10394: if (ea < XEiJ.EA_AR) { //OR.L Dr,Dq 10395: XEiJ.mpuCycleCount += 8; 10396: XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.regRn[ea]; 10397: } else { //OR.L <mem>,Dq 10398: XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 10399: XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.busRls (efaAnyLong (ea)); 10400: } 10401: 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 10402: } //irpOrToRegLong 10403: 10404: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10405: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10406: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10407: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10408: //DIVU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr 10409: // 10410: //DIVU.W <ea>,Dq 10411: // M68000PRMでDIVU.Wのオーバーフローの条件が16bit符号あり整数と書かれているのは16bit符号なし整数の間違い 10412: public static void irpDivuWord () throws M68kException { 10413: // X 変化しない 10414: // N ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア 10415: // Z ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア 10416: // V ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア 10417: // C 常にクリア 10418: int ea = XEiJ.regOC & 63; 10419: int qqq = XEiJ.regOC >> 9 & 7; 10420: int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); //除数 10421: int x = XEiJ.regRn[qqq]; //被除数 10422: XEiJ.mpuCycleCount += irpDivuCyclesModified (x, y); 10423: if (y == 0) { //ゼロ除算 10424: //Dqは変化しない 10425: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10426: (x < 0 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が負のときセット、さもなくばクリア 10427: (x >> 16 == 0 ? XEiJ.REG_CCR_Z : 0) | //Zは被除数が$0000xxxxのときセット、さもなくばクリア 10428: XEiJ.REG_CCR_V //Vは常にセット 10429: ); //Cは常にクリア 10430: M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO; 10431: throw M68kException.m6eSignal; 10432: } 10433: //無理にintで符号なし除算をやろうとするよりもdoubleにキャストしてから割ったほうが速い 10434: // intの除算をdoubleの除算器で行うプロセッサならばなおさら 10435: //被除数を符号なし32ビットとみなすためlongを経由してdoubleに変換する 10436: //doubleからlongやintへのキャストは小数点以下が切り捨てられ、オーバーフローは表現できる絶対値最大の値になる 10437: //doubleから直接intに戻しているので0xffffffff/0x0001=0xffffffffが絶対値最大の0x7fffffffになってしまうが、 10438: //DIVU.Wではオーバーフローになることに変わりはないのでよいことにする 10439: // 符号なし32ビットの0xffffffffにしたいときは戻すときもlongを経由すればよい 10440: int z = (int) ((double) ((long) x & 0xffffffffL) / (double) y); //商 10441: if (z >>> 16 != 0) { //オーバーフローあり 10442: //Dqは変化しない 10443: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10444: (x < 0 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が負のときセット、さもなくばクリア 10445: //Zは常にクリア 10446: XEiJ.REG_CCR_V //Vは常にセット 10447: ); //Cは常にクリア 10448: } else { //オーバーフローなし 10449: XEiJ.regRn[qqq] = x - y * z << 16 | z; //余り<<16|商 10450: z = (short) z; 10451: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10452: (z < 0 ? XEiJ.REG_CCR_N : 0) | //Nは商が負のときセット、さもなくばクリア 10453: (z == 0 ? XEiJ.REG_CCR_Z : 0) //Zは商が0のときセット、さもなくばクリア 10454: //Vは常にクリア 10455: ); //Cは常にクリア 10456: } //if オーバーフローあり/オーバーフローなし 10457: } //irpDivuWord 10458: 10459: //DIVUの実行時間 10460: // 以下に実効アドレスの時間を加える 10461: // ゼロ除算のとき38 10462: // オーバーフローのとき10 10463: // 正常終了のとき76+ 10464: // 商のビット15~1について 10465: // 被除数のビット16が1で商が1のとき0 10466: // 被除数のビット16が0で商が1のとき2 10467: // 被除数のビット16が0で商が0のとき4 10468: // 補足 10469: // 商のビット0を計算に含めると最大140になりマニュアルと一致する 10470: // 参考 10471: // https://www.atari-forum.com/viewtopic.php?t=6484 10472: public static int irpDivuCyclesModified (int x, int y) { 10473: y &= 0xffff; //ゼロ拡張 10474: if (y == 0) { //ゼロ除算 10475: return 38; 10476: } 10477: int r = x >>> 16; //余り。符号なし右シフト 10478: if (y <= r) { //オーバーフロー 10479: return 10; 10480: } 10481: int c = 76; 10482: for (int i = 15; 0 < i; i--) { //ビット0を含まない 10483: r = r << 1 | ((x >> i) & 1); 10484: if (0x10000 <= r) { //被除数のビット16が1で商が1 10485: r -= y; 10486: } else if (y <= r) { //被除数のビット16が0で商が1 10487: r -= y; 10488: c += 2; 10489: } else { //被除数のビット16が0で商が0 10490: c += 4; 10491: } 10492: } 10493: return c; 10494: } 10495: 10496: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10497: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10498: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10500: //SBCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_000_rrr 10501: //SBCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_001_rrr 10502: //OR.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_100_mmm_rrr 10503: public static void irpOrToMemByte () throws M68kException { 10504: int ea = XEiJ.regOC & 63; 10505: if (ea >= XEiJ.EA_MM) { //OR.B Dq,<ea> 10506: XEiJ.mpuCycleCount += 8; 10507: int a = efaMltByte (ea); 10508: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRbs (a); 10509: XEiJ.busWb (a, z); 10510: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 10511: } else if (ea < XEiJ.EA_AR) { //SBCD.B Dr,Dq 10512: int qqq = XEiJ.regOC >> 9 & 7; 10513: XEiJ.mpuCycleCount += 6; 10514: int x; 10515: XEiJ.regRn[qqq] = ~0xff & (x = XEiJ.regRn[qqq]) | irpSbcd (x, XEiJ.regRn[ea]); 10516: } else { //SBCD.B -(Ar),-(Aq) 10517: XEiJ.mpuCycleCount += 18; 10518: int y = XEiJ.busRbz (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 10519: int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (64 - 8)]; 10520: XEiJ.busWb (a, irpSbcd (XEiJ.busRbz (a), y)); 10521: } 10522: } //irpOrToMemByte 10523: 10524: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10525: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10526: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10527: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10528: //OR.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_101_mmm_rrr 10529: public static void irpOrToMemWord () throws M68kException { 10530: XEiJ.mpuCycleCount += 8; 10531: int ea = XEiJ.regOC & 63; 10532: int a = efaMltWord (ea); 10533: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRws (a); 10534: XEiJ.busWw (a, z); 10535: 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 10536: } //irpOrToMemWord 10537: 10538: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10539: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10540: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10541: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10542: //OR.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_110_mmm_rrr 10543: public static void irpOrToMemLong () throws M68kException { 10544: XEiJ.mpuCycleCount += 12; 10545: int ea = XEiJ.regOC & 63; 10546: int a = efaMltLong (ea); 10547: int z; 10548: XEiJ.busWl (a, z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRls (a)); 10549: 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 10550: } //irpOrToMemLong 10551: 10552: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10553: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10554: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10555: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10556: //DIVS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr 10557: // 10558: //DIVS.W <ea>,Dq 10559: // DIVSの余りの符号は被除数と一致 10560: // M68000PRMでDIVS.Wのアドレッシングモードがデータ可変と書かれているのはデータの間違い 10561: public static void irpDivsWord () throws M68kException { 10562: // X 変化しない 10563: // N ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア 10564: // Z ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア 10565: // V ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア 10566: // C 常にクリア 10567: //divsの余りの符号は被除数と一致 10568: //Javaの除算演算子の挙動 10569: // 10 / 3 == 3 10 % 3 == 1 10 = 3 * 3 + 1 10570: // 10 / -3 == -3 10 % -3 == 1 10 = -3 * -3 + 1 10571: // -10 / 3 == -3 -10 % 3 == -1 -10 = 3 * -3 + -1 10572: // -10 / -3 == 3 -10 % -3 == -1 -10 = -3 * 3 + -1 10573: int ea = XEiJ.regOC & 63; 10574: int qqq = XEiJ.regOC >> 9 & 7; 10575: int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //除数 10576: int x = XEiJ.regRn[qqq]; //被除数 10577: XEiJ.mpuCycleCount += irpDivsCycles (x, y); 10578: if (y == 0) { //ゼロ除算 10579: //Dqは変化しない 10580: //!!! MC68030はゼロ除算のときオペランド以外の要因でZとVが変化する。その要因がわからないとZとVを正確に再現することができない 10581: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10582: //Nは常にクリア 10583: XEiJ.REG_CCR_Z | //Zは常にセット 10584: (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のときセット、さもなくば変化しない 10585: ); //Cは常にクリア 10586: M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO; 10587: throw M68kException.m6eSignal; 10588: } 10589: int z = x / y; //商 10590: if ((short) z != z) { //オーバーフローあり 10591: //Dqは変化しない 10592: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10593: (x == 0x80000000 || (z & 0xffff0080) == 0x00000080 || (z & 0xffff0080) == 0xffff0080 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が$80000000または商が$0000xxyyまたは$ffffxxyyでyyが負のときセット、さもなくばクリア 10594: (z == 0x00008000 || (((z & 0xffff00ff) == 0x00000000 || (z & 0xffff00ff) == 0xffff0000) && (z & 0x0000ff00) != 0) ? XEiJ.REG_CCR_Z : 0) | //Zは商が$00008000または商が$0000xxyyまたは$ffffxxyyでxxが0でなくてyyが0のときセット、さもなくばクリア 10595: XEiJ.REG_CCR_V //Vは常にセット 10596: ); //Cは常にクリア 10597: } else { //オーバーフローなし 10598: XEiJ.regRn[qqq] = x - y * z << 16 | (char) z; //Dqは余り<<16|商&$ffff 10599: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10600: (z < 0 ? XEiJ.REG_CCR_N : 0) | //Nは商が負のときセット、さもなくばクリア 10601: (z == 0 ? XEiJ.REG_CCR_Z : 0) //Zは商が0のときセット、さもなくばクリア 10602: //Vは常にクリア 10603: ); //Cは常にクリア 10604: } //if オーバーフローあり/オーバーフローなし 10605: } //irpDivsWord 10606: 10607: //DIVSの実行時間 10608: // 以下に実効アドレスの時間を加える 10609: // ゼロ除算のとき38 10610: // 符号なしオーバーフローのとき 10611: // 被除数が正のとき16 10612: // 被除数が負のとき18 10613: // 正常終了または符号ありオーバーフローのとき 10614: // 被除数が正で除数が正のとき120+ 10615: // 被除数が正で除数が負のとき122+ 10616: // 被除数が負で除数が正のとき126+ 10617: // 被除数が負で除数が負のとき124+ 10618: // 符号なし商のビット15~1について 10619: // 符号なし商が1のとき0 10620: // 符号なし商が0のとき2 10621: // 補足 10622: // 符号なし商のビット0を計算に含めると最大158になりマニュアルと一致する 10623: // 参考 10624: // https://www.atari-forum.com/viewtopic.php?t=6484 10625: public static int irpDivsCycles (int x, int y) { 10626: y = (short) y; //符号拡張 10627: if (y == 0) { //ゼロ除算 10628: return 38; 10629: } 10630: //符号あり除算だと0x80000000/0xffffffffが0x00000000になる環境があるので 10631: //符号なし除算を用いる。JavaはInteger.divideUnsigned 10632: //符号なし商に0x80000000が含まれることに注意 10633: int q = Integer.divideUnsigned ((x < 0 ? -x : x), (y < 0 ? -y : y)); 10634: if ((q & 0xffff0000) != 0) { //符号なしオーバーフロー。0xffff<qは不可 10635: return x < 0 ? 18 : 16; 10636: } 10637: int t = ~q; 10638: t = (t & 0x5554) + ((t >> 1) & 0x5555); //0x5554に注意。ビット0を含まない 10639: t = (t & 0x3333) + ((t >> 2) & 0x3333); 10640: t = (t & 0x0F0F) + ((t >> 4) & 0x0F0F); 10641: t = (t & 0x00FF) + ((t >> 8) & 0x00FF); 10642: return (x < 0 ? y < 0 ? 124 : 126 : y < 0 ? 122 : 120) + (t << 1); 10643: } 10644: 10645: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10646: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10647: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10648: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10649: //SUB.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr 10650: public static void irpSubToRegByte () throws M68kException { 10651: XEiJ.mpuCycleCount += 4; 10652: int ea = XEiJ.regOC & 63; 10653: int qqq = XEiJ.regOC >> 9 & 7; 10654: int x, y, z; 10655: y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 10656: x = XEiJ.regRn[qqq]; 10657: z = x - y; 10658: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 10659: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 10660: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 10661: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_byte 10662: } //irpSubToRegByte 10663: 10664: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10665: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10666: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10667: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10668: //SUB.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr 10669: public static void irpSubToRegWord () throws M68kException { 10670: XEiJ.mpuCycleCount += 4; 10671: int ea = XEiJ.regOC & 63; 10672: int qqq = XEiJ.regOC >> 9 & 7; 10673: int x, y, z; 10674: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 10675: x = XEiJ.regRn[qqq]; 10676: z = x - y; 10677: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 10678: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 10679: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 10680: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_word 10681: } //irpSubToRegWord 10682: 10683: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10684: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10685: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10686: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10687: //SUB.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr 10688: public static void irpSubToRegLong () throws M68kException { 10689: int ea = XEiJ.regOC & 63; 10690: int qqq = XEiJ.regOC >> 9 & 7; 10691: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 10692: int x, y, z; 10693: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 10694: x = XEiJ.regRn[qqq]; 10695: z = x - y; 10696: XEiJ.regRn[qqq] = z; 10697: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 10698: ((x ^ y) & (x ^ z)) >> 30 & XEiJ.REG_CCR_V | 10699: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 10700: } //irpSubToRegLong 10701: 10702: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10703: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10704: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10705: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10706: //SUBA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr 10707: //SUB.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq] 10708: //CLR.W Ar |A|012346|-|-----|-----| A |1001_rrr_011_001_rrr [SUBA.W Ar,Ar] 10709: // 10710: //SUBA.W <ea>,Aq 10711: // ソースを符号拡張してロングで減算する 10712: public static void irpSubaWord () throws M68kException { 10713: XEiJ.mpuCycleCount += 8; 10714: int ea = XEiJ.regOC & 63; 10715: int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 10716: XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z; //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可 10717: //ccrは変化しない 10718: } //irpSubaWord 10719: 10720: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10721: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10722: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10723: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10724: //SUBX.B Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_100_000_rrr 10725: //SUBX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_100_001_rrr 10726: //SUB.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_100_mmm_rrr 10727: public static void irpSubToMemByte () throws M68kException { 10728: int ea = XEiJ.regOC & 63; 10729: int a, x, y, z; 10730: if (ea < XEiJ.EA_MM) { 10731: if (ea < XEiJ.EA_AR) { //SUBX.B Dr,Dq 10732: int qqq = XEiJ.regOC >> 9 & 7; 10733: XEiJ.mpuCycleCount += 4; 10734: y = XEiJ.regRn[ea]; 10735: x = XEiJ.regRn[qqq]; 10736: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 10737: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 10738: } else { //SUBX.B -(Ar),-(Aq) 10739: XEiJ.mpuCycleCount += 18; 10740: y = XEiJ.busRbs (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 10741: a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15]; //1qqq=aqq 10742: x = XEiJ.busRbs (a); 10743: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 10744: XEiJ.busWb (a, z); 10745: } 10746: XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //SUBXはZをクリアすることはあるがセットすることはない 10747: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 10748: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx_byte 10749: } else { //SUB.B Dq,<ea> 10750: XEiJ.mpuCycleCount += 8; 10751: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 10752: a = efaMltByte (ea); 10753: x = XEiJ.busRbs (a); 10754: z = x - y; 10755: XEiJ.busWb (a, z); 10756: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 10757: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 10758: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_byte 10759: } 10760: } //irpSubToMemByte 10761: 10762: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10763: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10764: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10765: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10766: //SUBX.W Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_101_000_rrr 10767: //SUBX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_101_001_rrr 10768: //SUB.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_101_mmm_rrr 10769: public static void irpSubToMemWord () throws M68kException { 10770: int ea = XEiJ.regOC & 63; 10771: int a, x, y, z; 10772: if (ea < XEiJ.EA_MM) { 10773: if (ea < XEiJ.EA_AR) { //SUBX.W Dr,Dq 10774: int qqq = XEiJ.regOC >> 9 & 7; 10775: XEiJ.mpuCycleCount += 4; 10776: y = XEiJ.regRn[ea]; 10777: x = XEiJ.regRn[qqq]; 10778: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 10779: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 10780: } else { //SUBX.W -(Ar),-(Aq) 10781: XEiJ.mpuCycleCount += 18; 10782: y = XEiJ.busRws (XEiJ.regRn[ea] -= 2); //このr[ea]はアドレスレジスタ 10783: a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2; 10784: x = XEiJ.busRws (a); 10785: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 10786: XEiJ.busWw (a, z); 10787: } 10788: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 10789: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 10790: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx_word 10791: } else { //SUB.W Dq,<ea> 10792: XEiJ.mpuCycleCount += 8; 10793: y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 10794: a = efaMltWord (ea); 10795: x = XEiJ.busRws (a); 10796: z = x - y; 10797: XEiJ.busWw (a, z); 10798: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 10799: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 10800: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_word 10801: } 10802: } //irpSubToMemWord 10803: 10804: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10805: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10806: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10807: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10808: //SUBX.L Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_110_000_rrr 10809: //SUBX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_110_001_rrr 10810: //SUB.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_110_mmm_rrr 10811: public static void irpSubToMemLong () throws M68kException { 10812: int ea = XEiJ.regOC & 63; 10813: if (ea < XEiJ.EA_MM) { 10814: int x; 10815: int y; 10816: int z; 10817: if (ea < XEiJ.EA_AR) { //SUBX.L Dr,Dq 10818: int qqq = XEiJ.regOC >> 9 & 7; 10819: XEiJ.mpuCycleCount += 8; 10820: XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) - (y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 10821: } else { //SUBX.L -(Ar),-(Aq) 10822: XEiJ.mpuCycleCount += 30; 10823: y = XEiJ.busRls (XEiJ.regRn[ea] -= 4); //このr[ea]はアドレスレジスタ 10824: int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4; 10825: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 10826: } 10827: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 10828: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 10829: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx 10830: } else { //SUB.L Dq,<ea> 10831: XEiJ.mpuCycleCount += 12; 10832: int a = efaMltLong (ea); 10833: int x; 10834: int y; 10835: int z; 10836: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7])); 10837: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 10838: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 10839: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 10840: } 10841: } //irpSubToMemLong 10842: 10843: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10844: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10845: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10846: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10847: //SUBA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr 10848: //SUB.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq] 10849: //CLR.L Ar |A|012346|-|-----|-----| A |1001_rrr_111_001_rrr [SUBA.L Ar,Ar] 10850: public static void irpSubaLong () throws M68kException { 10851: int ea = XEiJ.regOC & 63; 10852: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //Dr/Ar/#<data>のとき8+、それ以外は6+ 10853: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 10854: XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z; //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可 10855: //ccrは変化しない 10856: } //irpSubaLong 10857: 10858: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10859: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10860: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10861: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10862: //SXCALL <name> |A|012346|-|UUUUU|*****| |1010_0dd_ddd_ddd_ddd [ALINE #<data>] 10863: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10864: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10865: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10866: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10867: //ALINE #<data> |-|012346|-|UUUUU|*****| |1010_ddd_ddd_ddd_ddd (line 1010 emulator) 10868: public static void irpAline () throws M68kException { 10869: XEiJ.mpuCycleCount += 34; 10870: if (XEiJ.MPU_INLINE_EXCEPTION) { 10871: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 10872: int sp = XEiJ.regRn[15]; 10873: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 10874: if (XEiJ.regSRS == 0) { //ユーザモードのとき 10875: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 10876: XEiJ.mpuUSP = sp; //USPを保存 10877: sp = XEiJ.mpuISP; //SSPを復元 10878: if (DataBreakPoint.DBP_ON) { 10879: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 10880: } else { 10881: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 10882: } 10883: if (InstructionBreakPoint.IBP_ON) { 10884: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 10885: } 10886: } 10887: XEiJ.regRn[15] = sp -= 6; 10888: XEiJ.busWl (sp + 2, XEiJ.regPC0); //pushl。pcをプッシュする 10889: XEiJ.busWw (sp, save_sr); //pushw。srをプッシュする 10890: irpSetPC (XEiJ.busRlsf (M68kException.M6E_LINE_1010_EMULATOR << 2)); //例外ベクタを取り出してジャンプする 10891: } else { 10892: irpException (M68kException.M6E_LINE_1010_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは命令の先頭 10893: } 10894: } //irpAline 10895: 10896: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10897: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10898: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10899: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10900: //CMP.B <ea>,Dq |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr 10901: public static void irpCmpByte () throws M68kException { 10902: XEiJ.mpuCycleCount += 4; 10903: int ea = XEiJ.regOC & 63; 10904: int x; 10905: int y; 10906: int z = (byte) ((x = (byte) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)))); 10907: 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) | 10908: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 10909: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 10910: } //irpCmpByte 10911: 10912: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10913: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10914: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10915: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10916: //CMP.W <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr 10917: public static void irpCmpWord () throws M68kException { 10918: XEiJ.mpuCycleCount += 4; 10919: int ea = XEiJ.regOC & 63; 10920: int x; 10921: int y; 10922: 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]はデータレジスタまたはアドレスレジスタ 10923: 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) | 10924: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 10925: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 10926: } //irpCmpWord 10927: 10928: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10929: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10930: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10931: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10932: //CMP.L <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr 10933: public static void irpCmpLong () throws M68kException { 10934: XEiJ.mpuCycleCount += 6; 10935: int ea = XEiJ.regOC & 63; 10936: int x; 10937: int y; 10938: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea))); //このr[ea]はデータレジスタまたはアドレスレジスタ 10939: 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) | 10940: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 10941: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 10942: } //irpCmpLong 10943: 10944: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10945: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10946: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10947: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10948: //CMPA.W <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr 10949: //CMP.W <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq] 10950: // 10951: //CMPA.W <ea>,Aq 10952: // ソースを符号拡張してロングで比較する 10953: public static void irpCmpaWord () throws M68kException { 10954: XEiJ.mpuCycleCount += 6; 10955: int ea = XEiJ.regOC & 63; 10956: //ソースを符号拡張してからロングで比較する 10957: int y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 10958: int x; 10959: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y; 10960: 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) | 10961: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 10962: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 10963: } //irpCmpaWord 10964: 10965: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10966: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10967: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10968: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10969: //EOR.B Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_100_mmm_rrr 10970: //CMPM.B (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_100_001_rrr 10971: public static void irpEorByte () throws M68kException { 10972: int ea = XEiJ.regOC & 63; 10973: if (ea >> 3 == XEiJ.MMM_AR) { //CMPM.B (Ar)+,(Aq)+ 10974: XEiJ.mpuCycleCount += 12; 10975: int y = XEiJ.busRbs (XEiJ.regRn[ea]++); //このr[ea]はアドレスレジスタ 10976: int x; 10977: int z = (byte) ((x = XEiJ.busRbs (XEiJ.regRn[XEiJ.regOC >> 9 & 15]++)) - y); 10978: 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) | 10979: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 10980: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 10981: } else { 10982: int qqq = XEiJ.regOC >> 9 & 7; 10983: int z; 10984: if (ea < XEiJ.EA_AR) { //EOR.B Dq,Dr 10985: XEiJ.mpuCycleCount += 4; 10986: z = XEiJ.regRn[ea] ^= 255 & XEiJ.regRn[qqq]; //0拡張してからEOR 10987: } else { //EOR.B Dq,<mem> 10988: XEiJ.mpuCycleCount += 8; 10989: int a = efaMltByte (ea); 10990: XEiJ.busWb (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRbs (a)); 10991: } 10992: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 10993: } 10994: } //irpEorByte 10995: 10996: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10997: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10998: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10999: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11000: //EOR.W Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_101_mmm_rrr 11001: //CMPM.W (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_101_001_rrr 11002: public static void irpEorWord () throws M68kException { 11003: int ea = XEiJ.regOC & 63; 11004: int rrr = XEiJ.regOC & 7; 11005: int mmm = ea >> 3; 11006: if (mmm == XEiJ.MMM_AR) { //CMPM.W (Ar)+,(Aq)+ 11007: XEiJ.mpuCycleCount += 12; 11008: int y = XEiJ.busRws ((XEiJ.regRn[ea] += 2) - 2); //このr[ea]はアドレスレジスタ 11009: int x; 11010: int z = (short) ((x = XEiJ.busRws ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2)) - y); 11011: 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) | 11012: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11013: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11014: } else { 11015: int qqq = XEiJ.regOC >> 9 & 7; 11016: int z; 11017: if (ea < XEiJ.EA_AR) { //EOR.W Dq,Dr 11018: XEiJ.mpuCycleCount += 4; 11019: z = XEiJ.regRn[rrr] ^= (char) XEiJ.regRn[qqq]; //0拡張してからEOR 11020: } else { //EOR.W Dq,<mem> 11021: XEiJ.mpuCycleCount += 8; 11022: int a = efaMltWord (ea); 11023: XEiJ.busWw (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRws (a)); 11024: } 11025: 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 11026: } 11027: } //irpEorWord 11028: 11029: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11030: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11031: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11032: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11033: //EOR.L Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_110_mmm_rrr 11034: //CMPM.L (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_110_001_rrr 11035: public static void irpEorLong () throws M68kException { 11036: int ea = XEiJ.regOC & 63; 11037: if (ea >> 3 == XEiJ.MMM_AR) { //CMPM.L (Ar)+,(Aq)+ 11038: XEiJ.mpuCycleCount += 20; 11039: int y = XEiJ.busRls ((XEiJ.regRn[ea] += 4) - 4); //このr[ea]はアドレスレジスタ 11040: int x; 11041: int z = (x = XEiJ.busRls ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 4) - 4)) - y; 11042: 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) | 11043: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11044: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11045: } else { 11046: int qqq = XEiJ.regOC >> 9 & 7; 11047: int z; 11048: if (ea < XEiJ.EA_AR) { //EOR.L Dq,Dr 11049: XEiJ.mpuCycleCount += 8; 11050: XEiJ.regRn[ea] = z = XEiJ.regRn[ea] ^ XEiJ.regRn[qqq]; 11051: } else { //EOR.L Dq,<mem> 11052: XEiJ.mpuCycleCount += 12; 11053: int a = efaMltLong (ea); 11054: XEiJ.busWl (a, z = XEiJ.busRls (a) ^ XEiJ.regRn[qqq]); 11055: } 11056: 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 11057: } 11058: } //irpEorLong 11059: 11060: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11061: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11062: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11063: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11064: //CMPA.L <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr 11065: //CMP.L <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq] 11066: public static void irpCmpaLong () throws M68kException { 11067: XEiJ.mpuCycleCount += 6; 11068: int ea = XEiJ.regOC & 63; 11069: int y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11070: int x; 11071: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y; 11072: 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) | 11073: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11074: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11075: } //irpCmpaLong 11076: 11077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11078: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11079: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11080: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11081: //AND.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr 11082: public static void irpAndToRegByte () throws M68kException { 11083: XEiJ.mpuCycleCount += 4; 11084: int ea = XEiJ.regOC & 63; 11085: 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 11086: } //irpAndToRegByte 11087: 11088: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11089: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11090: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11091: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11092: //AND.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr 11093: public static void irpAndToRegWord () throws M68kException { 11094: XEiJ.mpuCycleCount += 4; 11095: int ea = XEiJ.regOC & 63; 11096: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~65535 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea))); //1拡張してからAND 11097: 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 11098: } //irpAndToRegWord 11099: 11100: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11101: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11102: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11103: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11104: //AND.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr 11105: public static void irpAndToRegLong () throws M68kException { 11106: int ea = XEiJ.regOC & 63; 11107: int qqq = XEiJ.regOC >> 9 & 7; 11108: int z; 11109: if (ea < XEiJ.EA_AR) { //AND.L Dr,Dq 11110: XEiJ.mpuCycleCount += 8; 11111: z = XEiJ.regRn[qqq] &= XEiJ.regRn[ea]; 11112: } else { //AND.L <mem>,Dq 11113: XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11114: z = XEiJ.regRn[qqq] &= XEiJ.busRls (efaAnyLong (ea)); 11115: } 11116: 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 11117: } //irpAndToRegLong 11118: 11119: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11120: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11121: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11122: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11123: //MULU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr 11124: public static void irpMuluWord () throws M68kException { 11125: int ea = XEiJ.regOC & 63; 11126: int qqq = XEiJ.regOC >> 9 & 7; 11127: int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); 11128: //muluの所要サイクル数は38+2n 11129: //nはソースに含まれる1の数 11130: int s = y & 0x5555; 11131: s += y - s >> 1; 11132: int t = s & 0x3333; 11133: t += s - t >> 2; 11134: t += t >> 4; 11135: XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1); //38+2n 11136: //XEiJ.mpuCycleCount += 38 + (Integer.bitCount (y) << 1); //少し遅くなる 11137: int z; 11138: XEiJ.regRn[qqq] = z = (char) XEiJ.regRn[qqq] * y; //積の下位32ビット。オーバーフローは無視 11139: 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 11140: } //irpMuluWord 11141: 11142: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11143: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11144: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11145: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11146: //ABCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_000_rrr 11147: //ABCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_001_rrr 11148: //AND.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_100_mmm_rrr 11149: public static void irpAndToMemByte () throws M68kException { 11150: int ea = XEiJ.regOC & 63; 11151: if (ea >= XEiJ.EA_MM) { //AND.B Dq,<ea> 11152: XEiJ.mpuCycleCount += 8; 11153: int a = efaMltByte (ea); 11154: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRbs (a); 11155: XEiJ.busWb (a, z); 11156: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 11157: } else if (ea < XEiJ.EA_AR) { //ABCD.B Dr,Dq 11158: int qqq = XEiJ.regOC >> 9 & 7; 11159: XEiJ.mpuCycleCount += 6; 11160: XEiJ.regRn[qqq] = ~0xff & XEiJ.regRn[qqq] | irpAbcd (XEiJ.regRn[qqq], XEiJ.regRn[ea]); 11161: } else { //ABCD.B -(Ar),-(Aq) 11162: XEiJ.mpuCycleCount += 18; 11163: int y = XEiJ.busRbz (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11164: int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (96 - 8)]; 11165: XEiJ.busWb (a, irpAbcd (XEiJ.busRbz (a), y)); 11166: } 11167: } //irpAndToMemByte 11168: 11169: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11170: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11171: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11172: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11173: //EXG.L Dq,Dr |-|012346|-|-----|-----| |1100_qqq_101_000_rrr 11174: //EXG.L Aq,Ar |-|012346|-|-----|-----| |1100_qqq_101_001_rrr 11175: //AND.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_101_mmm_rrr 11176: public static void irpAndToMemWord () throws M68kException { 11177: int ea = XEiJ.regOC & 63; 11178: if (ea < XEiJ.EA_MM) { //EXG 11179: XEiJ.mpuCycleCount += 6; 11180: if (ea < XEiJ.EA_AR) { //EXG.L Dq,Dr 11181: int qqq = XEiJ.regOC >> 9 & 7; 11182: int t = XEiJ.regRn[qqq]; 11183: XEiJ.regRn[qqq] = XEiJ.regRn[ea]; 11184: XEiJ.regRn[ea] = t; 11185: } else { //EXG.L Aq,Ar 11186: int aqq = (XEiJ.regOC >> 9) - (96 - 8); 11187: int t = XEiJ.regRn[aqq]; 11188: XEiJ.regRn[aqq] = XEiJ.regRn[ea]; //このr[ea]アドレスレジスタ 11189: XEiJ.regRn[ea] = t; //このr[ea]はアドレスレジスタ 11190: } 11191: } else { //AND.W Dq,<ea> 11192: XEiJ.mpuCycleCount += 8; 11193: int a = efaMltWord (ea); 11194: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRws (a); 11195: XEiJ.busWw (a, z); 11196: 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 11197: } 11198: } //irpAndToMemWord 11199: 11200: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11201: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11202: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11203: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11204: //EXG.L Dq,Ar |-|012346|-|-----|-----| |1100_qqq_110_001_rrr 11205: //AND.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_110_mmm_rrr 11206: public static void irpAndToMemLong () throws M68kException { 11207: int ea = XEiJ.regOC & 63; 11208: int qqq = XEiJ.regOC >> 9 & 7; 11209: if (ea >> 3 == XEiJ.MMM_AR) { //EXG.L Dq,Ar 11210: XEiJ.mpuCycleCount += 6; 11211: int t = XEiJ.regRn[qqq]; 11212: XEiJ.regRn[qqq] = XEiJ.regRn[ea]; //このr[ea]はアドレスレジスタ 11213: XEiJ.regRn[ea] = t; //このr[ea]はアドレスレジスタ 11214: } else { //AND.L Dq,<ea> 11215: XEiJ.mpuCycleCount += 12; 11216: int a = efaMltLong (ea); 11217: int z; 11218: XEiJ.busWl (a, z = XEiJ.busRls (a) & XEiJ.regRn[qqq]); 11219: 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 11220: } 11221: } //irpAndToMemLong 11222: 11223: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11224: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11225: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11226: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11227: //MULS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr 11228: public static void irpMulsWord () throws M68kException { 11229: int ea = XEiJ.regOC & 63; 11230: int qqq = XEiJ.regOC >> 9 & 7; 11231: int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 11232: int t = y << 1 ^ y; //右側が1である0と右側が0または末尾である1は1、それ以外は0。ソースは符号拡張されているので上位16ビットはすべて0 11233: //mulsの所要サイクル数は38+2n 11234: //nはソースの末尾に0を付け加えた17ビットに含まれる10または01の数 11235: int s = t & 0x5555; 11236: s += t - s >> 1; 11237: t = s & 0x3333; 11238: t += s - t >> 2; 11239: t += t >> 4; 11240: XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1); //38+2n 11241: int z; 11242: XEiJ.regRn[qqq] = z = (short) XEiJ.regRn[qqq] * y; //積の下位32ビット。オーバーフローは無視 11243: 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 11244: } //irpMulsWord 11245: 11246: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11247: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11248: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11249: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11250: //ADD.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr 11251: public static void irpAddToRegByte () throws M68kException { 11252: XEiJ.mpuCycleCount += 4; 11253: int ea = XEiJ.regOC & 63; 11254: int qqq = XEiJ.regOC >> 9 & 7; 11255: int x, y, z; 11256: y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 11257: x = XEiJ.regRn[qqq]; 11258: z = x + y; 11259: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11260: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11261: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11262: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_byte 11263: } //irpAddToRegByte 11264: 11265: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11266: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11267: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11268: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11269: //ADD.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr 11270: public static void irpAddToRegWord () throws M68kException { 11271: XEiJ.mpuCycleCount += 4; 11272: int ea = XEiJ.regOC & 63; 11273: int qqq = XEiJ.regOC >> 9 & 7; 11274: int x, y, z; 11275: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11276: x = XEiJ.regRn[qqq]; 11277: z = x + y; 11278: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11279: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11280: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11281: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_word 11282: } //irpAddToRegWord 11283: 11284: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11285: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11286: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11287: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11288: //ADD.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr 11289: public static void irpAddToRegLong () throws M68kException { 11290: int ea = XEiJ.regOC & 63; 11291: int qqq = XEiJ.regOC >> 9 & 7; 11292: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11293: int x, y, z; 11294: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11295: x = XEiJ.regRn[qqq]; 11296: z = x + y; 11297: XEiJ.regRn[qqq] = z; 11298: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11299: ((x ^ z) & (y ^ z)) >> 30 & XEiJ.REG_CCR_V | 11300: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 11301: } //irpAddToRegLong 11302: 11303: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11304: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11305: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11306: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11307: //ADDA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr 11308: //ADD.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq] 11309: // 11310: //ADDA.W <ea>,Aq 11311: // ソースを符号拡張してロングで加算する 11312: public static void irpAddaWord () throws M68kException { 11313: XEiJ.mpuCycleCount += 8; 11314: int ea = XEiJ.regOC & 63; 11315: int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11316: XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z; //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可 11317: //ccrは変化しない 11318: } //irpAddaWord 11319: 11320: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11321: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11322: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11323: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11324: //ADDX.B Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_100_000_rrr 11325: //ADDX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_100_001_rrr 11326: //ADD.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_100_mmm_rrr 11327: public static void irpAddToMemByte () throws M68kException { 11328: int ea = XEiJ.regOC & 63; 11329: int a, x, y, z; 11330: if (ea < XEiJ.EA_MM) { 11331: if (ea < XEiJ.EA_AR) { //ADDX.B Dr,Dq 11332: int qqq = XEiJ.regOC >> 9 & 7; 11333: XEiJ.mpuCycleCount += 4; 11334: y = XEiJ.regRn[ea]; 11335: x = XEiJ.regRn[qqq]; 11336: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11337: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11338: } else { //ADDX.B -(Ar),-(Aq) 11339: XEiJ.mpuCycleCount += 18; 11340: y = XEiJ.busRbs (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11341: a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15]; //1qqq=aqq 11342: x = XEiJ.busRbs (a); 11343: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11344: XEiJ.busWb (a, z); 11345: } 11346: XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11347: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11348: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx_byte 11349: } else { //ADD.B Dq,<ea> 11350: XEiJ.mpuCycleCount += 8; 11351: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11352: a = efaMltByte (ea); 11353: x = XEiJ.busRbs (a); 11354: z = x + y; 11355: XEiJ.busWb (a, z); 11356: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11357: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11358: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_byte 11359: } 11360: } //irpAddToMemByte 11361: 11362: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11363: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11364: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11365: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11366: //ADDX.W Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_101_000_rrr 11367: //ADDX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_101_001_rrr 11368: //ADD.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_101_mmm_rrr 11369: public static void irpAddToMemWord () throws M68kException { 11370: int ea = XEiJ.regOC & 63; 11371: int a, x, y, z; 11372: if (ea < XEiJ.EA_MM) { 11373: if (ea < XEiJ.EA_AR) { //ADDX.W Dr,Dq 11374: int qqq = XEiJ.regOC >> 9 & 7; 11375: XEiJ.mpuCycleCount += 4; 11376: y = XEiJ.regRn[ea]; 11377: x = XEiJ.regRn[qqq]; 11378: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11379: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11380: } else { //ADDX.W -(Ar),-(Aq) 11381: XEiJ.mpuCycleCount += 18; 11382: y = XEiJ.busRws (XEiJ.regRn[ea] -= 2); //このr[ea]はアドレスレジスタ 11383: a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2; 11384: x = XEiJ.busRws (a); 11385: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11386: XEiJ.busWw (a, z); 11387: } 11388: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11389: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11390: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx_word 11391: } else { //ADD.W Dq,<ea> 11392: XEiJ.mpuCycleCount += 8; 11393: a = efaMltWord (ea); 11394: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11395: x = XEiJ.busRws (a); 11396: z = x + y; 11397: XEiJ.busWw (a, z); 11398: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11399: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11400: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_word 11401: } 11402: } //irpAddToMemWord 11403: 11404: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11405: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11406: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11407: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11408: //ADDX.L Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_110_000_rrr 11409: //ADDX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_110_001_rrr 11410: //ADD.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_110_mmm_rrr 11411: public static void irpAddToMemLong () throws M68kException { 11412: int ea = XEiJ.regOC & 63; 11413: if (ea < XEiJ.EA_MM) { 11414: int x; 11415: int y; 11416: int z; 11417: if (ea < XEiJ.EA_AR) { //ADDX.L Dr,Dq 11418: int qqq = XEiJ.regOC >> 9 & 7; 11419: XEiJ.mpuCycleCount += 8; 11420: XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) + (y = XEiJ.regRn[ea]) + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11421: } else { //ADDX.L -(Ar),-(Aq) 11422: XEiJ.mpuCycleCount += 30; 11423: y = XEiJ.busRls (XEiJ.regRn[ea] -= 4); //このr[ea]はアドレスレジスタ 11424: int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4; 11425: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y + (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 11426: } 11427: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 11428: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 11429: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx 11430: } else { //ADD.L Dq,<ea> 11431: XEiJ.mpuCycleCount += 12; 11432: int a = efaMltLong (ea); 11433: int x; 11434: int y; 11435: int z; 11436: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7])); 11437: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11438: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 11439: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 11440: } 11441: } //irpAddToMemLong 11442: 11443: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11444: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11445: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11446: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11447: //ADDA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr 11448: //ADD.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq] 11449: public static void irpAddaLong () throws M68kException { 11450: int ea = XEiJ.regOC & 63; 11451: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //Dr/Ar/#<data>のとき8+、それ以外は6+ 11452: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11453: XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z; //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可 11454: //ccrは変化しない 11455: } //irpAddaLong 11456: 11457: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11458: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11459: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11460: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11461: //ASR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_000_rrr 11462: //LSR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_001_rrr 11463: //ROXR.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_010_rrr 11464: //ROR.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_011_rrr 11465: //ASR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_100_rrr 11466: //LSR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_101_rrr 11467: //ROXR.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_110_rrr 11468: //ROR.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_111_rrr 11469: //ASR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_000_rrr [ASR.B #1,Dr] 11470: //LSR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_001_rrr [LSR.B #1,Dr] 11471: //ROXR.B Dr |A|012346|-|*UUUU|***0*| |1110_001_000_010_rrr [ROXR.B #1,Dr] 11472: //ROR.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_000_011_rrr [ROR.B #1,Dr] 11473: // 11474: //ASR.B #<data>,Dr 11475: //ASR.B Dq,Dr 11476: // 算術右シフトバイト 11477: // ........................アイウエオカキク XNZVC 11478: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11479: // 1 ........................アアイウエオカキ クア*0ク Z=アイウエオカキ==0 11480: // 2 ........................アアアイウエオカ キア*0キ Z=アイウエオカ==0 11481: // 3 ........................アアアアイウエオ カア*0カ Z=アイウエオ==0 11482: // 4 ........................アアアアアイウエ オア*0オ Z=アイウエ==0 11483: // 5 ........................アアアアアアイウ エア*0エ Z=アイウ==0 11484: // 6 ........................アアアアアアアイ ウア*0ウ Z=アイ==0 11485: // 7 ........................アアアアアアアア イア*0イ Z=ア==0 11486: // 8 ........................アアアアアアアア アア*0ア Z=ア==0 11487: // CCR 11488: // X countが0のとき変化しない。他は最後に押し出されたビット 11489: // N 結果の最上位ビット 11490: // Z 結果が0のときセット。他はクリア 11491: // V 常にクリア 11492: // C countが0のときクリア。他は最後に押し出されたビット 11493: // 11494: //LSR.B #<data>,Dr 11495: //LSR.B Dq,Dr 11496: // 論理右シフトバイト 11497: // ........................アイウエオカキク XNZVC 11498: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11499: // 1 ........................0アイウエオカキ ク0*0ク Z=アイウエオカキ==0 11500: // 2 ........................00アイウエオカ キ0*0キ Z=アイウエオカ==0 11501: // 3 ........................000アイウエオ カ0*0カ Z=アイウエオ==0 11502: // 4 ........................0000アイウエ オ0*0オ Z=アイウエ==0 11503: // 5 ........................00000アイウ エ0*0エ Z=アイウ==0 11504: // 6 ........................000000アイ ウ0*0ウ Z=アイ==0 11505: // 7 ........................0000000ア イ0*0イ Z=ア==0 11506: // 8 ........................00000000 ア010ア 11507: // 9 ........................00000000 00100 11508: // CCR 11509: // X countが0のとき変化しない。他は最後に押し出されたビット 11510: // N 結果の最上位ビット 11511: // Z 結果が0のときセット。他はクリア 11512: // V 常にクリア 11513: // C countが0のときクリア。他は最後に押し出されたビット 11514: // 11515: //ROR.B #<data>,Dr 11516: //ROR.B Dq,Dr 11517: // 右ローテートバイト 11518: // ........................アイウエオカキク XNZVC 11519: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11520: // 1 ........................クアイウエオカキ Xク*0ク Z=アイウエオカキク==0 11521: // : 11522: // 7 ........................イウエオカキクア Xイ*0イ Z=アイウエオカキク==0 11523: // 8 ........................アイウエオカキク Xア*0ア Z=アイウエオカキク==0 11524: // CCR 11525: // X 常に変化しない 11526: // N 結果の最上位ビット 11527: // Z 結果が0のときセット。他はクリア 11528: // V 常にクリア 11529: // C countが0のときクリア。他は結果の最上位ビット 11530: // 11531: //ROXR.B #<data>,Dr 11532: //ROXR.B Dq,Dr 11533: // 拡張右ローテートバイト 11534: // ........................アイウエオカキク XNZVC 11535: // 0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 11536: // 1 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0 11537: // 2 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0 11538: // 3 ........................キクXアイウエオ カキ*0カ Z=アイウエオキクX==0 11539: // 4 ........................カキクXアイウエ オカ*0オ Z=アイウエカキクX==0 11540: // 5 ........................オカキクXアイウ エオ*0エ Z=アイウオカキクX==0 11541: // 6 ........................エオカキクXアイ ウエ*0ウ Z=アイエオカキクX==0 11542: // 7 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0 11543: // 8 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0 11544: // 9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 11545: // CCR 11546: // X countが0のとき変化しない。他は最後に押し出されたビット 11547: // N 結果の最上位ビット 11548: // Z 結果が0のときセット。他はクリア 11549: // V 常にクリア 11550: // C countが0のときXのコピー。他は最後に押し出されたビット 11551: public static void irpXxrToRegByte () throws M68kException { 11552: int rrr; 11553: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 11554: int y; 11555: int z; 11556: int t; 11557: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 11558: case 0b000_000 >> 3: //ASR.B #<data>,Dr 11559: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11560: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> y) >> 1); 11561: 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は最後に押し出されたビット 11562: break; 11563: case 0b001_000 >> 3: //LSR.B #<data>,Dr 11564: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11565: XEiJ.regRn[rrr] = ~0xff & x | (z = (t = (0xff & x) >>> y) >>> 1); 11566: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11567: break; 11568: case 0b010_000 >> 3: //ROXR.B #<data>,Dr 11569: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11570: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1; 11571: if (y == 1 - 1) { //y=data-1=1-1 11572: t = x; 11573: } else { //y=data-1=2-1~8-1 11574: z = x << 9 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1; 11575: } 11576: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 11577: 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は最後に押し出されたビット 11578: break; 11579: case 0b011_000 >> 3: //ROR.B #<data>,Dr 11580: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11581: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 7 - y | (0xff & x) >>> y + 1)); 11582: 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は結果の最上位ビット 11583: break; 11584: case 0b100_000 >> 3: //ASR.B Dq,Dr 11585: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11586: XEiJ.mpuCycleCount += 6 + (y << 1); 11587: if (y == 0) { //y=data=0 11588: z = (byte) x; 11589: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 11590: } else { //y=data=1~63 11591: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> (y <= 8 ? y - 1 : 7)) >> 1); 11592: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11593: } 11594: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11595: break; 11596: case 0b101_000 >> 3: //LSR.B Dq,Dr 11597: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11598: XEiJ.mpuCycleCount += 6 + (y << 1); 11599: if (y == 0) { //y=data=0 11600: z = (byte) x; 11601: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 11602: } else { //y=data=1~63 11603: XEiJ.regRn[rrr] = ~0xff & x | (z = (t = y <= 8 ? (0xff & x) >>> y - 1 : 0) >>> 1); 11604: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11605: } 11606: break; 11607: case 0b110_000 >> 3: //ROXR.B Dq,Dr 11608: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11609: XEiJ.mpuCycleCount += 6 + (y << 1); 11610: //y %= 9; 11611: y = (y & 7) - (y >> 3); //y=data=-7~7 11612: y += y >> 3 & 9; //y=data=0~8 11613: if (y == 0) { //y=data=0 11614: z = (byte) x; 11615: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 11616: } else { //y=data=1~8 11617: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1; 11618: if (y == 1) { //y=data=1 11619: t = x; //Cは最後に押し出されたビット 11620: } else { //y=data=2~8 11621: z = x << 9 - y | (t = z >>> y - 2) >>> 1; 11622: } 11623: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 11624: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11625: } 11626: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11627: break; 11628: case 0b111_000 >> 3: //ROR.B Dq,Dr 11629: default: 11630: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11631: XEiJ.mpuCycleCount += 6 + (y << 1); 11632: if (y == 0) { 11633: z = (byte) x; 11634: t = 0; //Cはクリア 11635: } else { 11636: y &= 7; //y=data=0~7 11637: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 8 - y | (0xff & x) >>> y)); 11638: t = z >>> 7 & 1; //Cは結果の最上位ビット 11639: } 11640: 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は変化しない 11641: } 11642: } //irpXxrToRegByte 11643: 11644: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11645: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11646: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11647: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11648: //ASR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_000_rrr 11649: //LSR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_001_rrr 11650: //ROXR.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_010_rrr 11651: //ROR.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_011_rrr 11652: //ASR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_100_rrr 11653: //LSR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_101_rrr 11654: //ROXR.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_110_rrr 11655: //ROR.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_111_rrr 11656: //ASR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_000_rrr [ASR.W #1,Dr] 11657: //LSR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_001_rrr [LSR.W #1,Dr] 11658: //ROXR.W Dr |A|012346|-|*UUUU|***0*| |1110_001_001_010_rrr [ROXR.W #1,Dr] 11659: //ROR.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_001_011_rrr [ROR.W #1,Dr] 11660: // 11661: //ASR.W #<data>,Dr 11662: //ASR.W Dq,Dr 11663: //ASR.W <ea> 11664: // 算術右シフトワード 11665: // ................アイウエオカキクケコサシスセソタ XNZVC 11666: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 11667: // 1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0 11668: // : 11669: // 15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0 11670: // 16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0 11671: // CCR 11672: // X countが0のとき変化しない。他は最後に押し出されたビット 11673: // N 結果の最上位ビット 11674: // Z 結果が0のときセット。他はクリア 11675: // V 常にクリア 11676: // C countが0のときクリア。他は最後に押し出されたビット 11677: // 11678: //LSR.W #<data>,Dr 11679: //LSR.W Dq,Dr 11680: //LSR.W <ea> 11681: // 論理右シフトワード 11682: // ................アイウエオカキクケコサシスセソタ XNZVC 11683: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 11684: // 1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0 11685: // : 11686: // 15 ................000000000000000ア イ0*0イ Z=ア==0 11687: // 16 ................0000000000000000 ア010ア 11688: // 17 ................0000000000000000 00100 11689: // CCR 11690: // X countが0のとき変化しない。他は最後に押し出されたビット 11691: // N 結果の最上位ビット 11692: // Z 結果が0のときセット。他はクリア 11693: // V 常にクリア 11694: // C countが0のときクリア。他は最後に押し出されたビット 11695: // 11696: //ROR.W #<data>,Dr 11697: //ROR.W Dq,Dr 11698: //ROR.W <ea> 11699: // 右ローテートワード 11700: // ................アイウエオカキクケコサシスセソタ XNZVC 11701: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 11702: // 1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0 11703: // : 11704: // 15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0 11705: // 16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0 11706: // CCR 11707: // X 常に変化しない 11708: // N 結果の最上位ビット 11709: // Z 結果が0のときセット。他はクリア 11710: // V 常にクリア 11711: // C countが0のときクリア。他は結果の最上位ビット 11712: // 11713: //ROXR.W #<data>,Dr 11714: //ROXR.W Dq,Dr 11715: //ROXR.W <ea> 11716: // 拡張右ローテートワード 11717: // ................アイウエオカキクケコサシスセソタ XNZVC 11718: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 11719: // 1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 11720: // 2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 11721: // : 11722: // 15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 11723: // 16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 11724: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 11725: // CCR 11726: // X countが0のとき変化しない。他は最後に押し出されたビット 11727: // N 結果の最上位ビット 11728: // Z 結果が0のときセット。他はクリア 11729: // V 常にクリア 11730: // C countが0のときXのコピー。他は最後に押し出されたビット 11731: public static void irpXxrToRegWord () throws M68kException { 11732: int rrr; 11733: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 11734: int y; 11735: int z; 11736: int t; 11737: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 11738: case 0b000_000 >> 3: //ASR.W #<data>,Dr 11739: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11740: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> y) >> 1); 11741: 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は最後に押し出されたビット 11742: break; 11743: case 0b001_000 >> 3: //LSR.W #<data>,Dr 11744: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11745: XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = (char) x >>> y) >>> 1); 11746: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11747: break; 11748: case 0b010_000 >> 3: //ROXR.W #<data>,Dr 11749: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11750: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1; 11751: if (y == 1 - 1) { //y=data-1=1-1 11752: t = x; 11753: } else { //y=data-1=2-1~8-1 11754: z = x << 17 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1; 11755: } 11756: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 11757: 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は最後に押し出されたビット 11758: break; 11759: case 0b011_000 >> 3: //ROR.W #<data>,Dr 11760: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11761: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - 1 - y | (char) x >>> y + 1)); 11762: 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は結果の最上位ビット 11763: break; 11764: case 0b100_000 >> 3: //ASR.W Dq,Dr 11765: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11766: XEiJ.mpuCycleCount += 6 + (y << 1); 11767: if (y == 0) { //y=data=0 11768: z = (short) x; 11769: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 11770: } else { //y=data=1~63 11771: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> (y <= 16 ? y - 1 : 15)) >> 1); 11772: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11773: } 11774: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11775: break; 11776: case 0b101_000 >> 3: //LSR.W Dq,Dr 11777: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11778: XEiJ.mpuCycleCount += 6 + (y << 1); 11779: if (y == 0) { //y=data=0 11780: z = (short) x; 11781: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 11782: } else { //y=data=1~63 11783: XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = y <= 16 ? (char) x >>> y - 1 : 0) >>> 1); 11784: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11785: } 11786: break; 11787: case 0b110_000 >> 3: //ROXR.W Dq,Dr 11788: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11789: XEiJ.mpuCycleCount += 6 + (y << 1); 11790: //y %= 17; 11791: y = (y & 15) - (y >> 4); //y=data=-3~15 11792: y += y >> 4 & 17; //y=data=0~16 11793: if (y == 0) { //y=data=0 11794: z = (short) x; 11795: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 11796: } else { //y=data=1~16 11797: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1; 11798: if (y == 1) { //y=data=1 11799: t = x; //Cは最後に押し出されたビット 11800: } else { //y=data=2~16 11801: z = x << 17 - y | (t = z >>> y - 2) >>> 1; 11802: } 11803: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 11804: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11805: } 11806: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11807: break; 11808: case 0b111_000 >> 3: //ROR.W Dq,Dr 11809: default: 11810: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11811: XEiJ.mpuCycleCount += 6 + (y << 1); 11812: if (y == 0) { 11813: z = (short) x; 11814: t = 0; //Cはクリア 11815: } else { 11816: y &= 15; //y=data=0~15 11817: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - y | (char) x >>> y)); 11818: t = z >>> 15 & 1; //Cは結果の最上位ビット 11819: } 11820: 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は変化しない 11821: } 11822: } //irpXxrToRegWord 11823: 11824: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11825: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11826: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11827: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11828: //ASR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_000_rrr 11829: //LSR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_001_rrr 11830: //ROXR.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_010_rrr 11831: //ROR.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_011_rrr 11832: //ASR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_100_rrr 11833: //LSR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_101_rrr 11834: //ROXR.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_110_rrr 11835: //ROR.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_111_rrr 11836: //ASR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_000_rrr [ASR.L #1,Dr] 11837: //LSR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_001_rrr [LSR.L #1,Dr] 11838: //ROXR.L Dr |A|012346|-|*UUUU|***0*| |1110_001_010_010_rrr [ROXR.L #1,Dr] 11839: //ROR.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_010_011_rrr [ROR.L #1,Dr] 11840: // 11841: //ASR.L #<data>,Dr 11842: //ASR.L Dq,Dr 11843: // 算術右シフトロング 11844: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 11845: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11846: // 1 アアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0 11847: // : 11848: // 31 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア イア*0イ Z=ア==0 11849: // 32 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア アア*0ア Z=ア==0 11850: // CCR 11851: // X countが0のとき変化しない。他は最後に押し出されたビット 11852: // N 結果の最上位ビット 11853: // Z 結果が0のときセット。他はクリア 11854: // V 常にクリア 11855: // C countが0のときクリア。他は最後に押し出されたビット 11856: // 11857: //LSR.L #<data>,Dr 11858: //LSR.L Dq,Dr 11859: // 論理右シフトロング 11860: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 11861: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11862: // 1 0アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミ0*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0 11863: // : 11864: // 31 0000000000000000000000000000000ア イ0*0イ Z=ア==0 11865: // 32 00000000000000000000000000000000 ア010ア 11866: // 33 00000000000000000000000000000000 00100 11867: // CCR 11868: // X countが0のとき変化しない。他は最後に押し出されたビット 11869: // N 結果の最上位ビット 11870: // Z 結果が0のときセット。他はクリア 11871: // V 常にクリア 11872: // C countが0のときクリア。他は最後に押し出されたビット 11873: // 11874: //ROR.L #<data>,Dr 11875: //ROR.L Dq,Dr 11876: // 右ローテートロング 11877: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 11878: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11879: // 1 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11880: // : 11881: // 31 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0イ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11882: // 32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11883: // CCR 11884: // X 常に変化しない 11885: // N 結果の最上位ビット 11886: // Z 結果が0のときセット。他はクリア 11887: // V 常にクリア 11888: // C countが0のときクリア。他は結果の最上位ビット 11889: // 11890: //ROXR.L #<data>,Dr 11891: //ROXR.L Dq,Dr 11892: // 拡張右ローテートロング 11893: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 11894: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11895: // 1 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0 11896: // 2 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0 11897: // : 11898: // 31 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 11899: // 32 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 11900: // 33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 11901: // CCR 11902: // X countが0のとき変化しない。他は最後に押し出されたビット 11903: // N 結果の最上位ビット 11904: // Z 結果が0のときセット。他はクリア 11905: // V 常にクリア 11906: // C countが0のときXのコピー。他は最後に押し出されたビット 11907: public static void irpXxrToRegLong () throws M68kException { 11908: int rrr; 11909: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 11910: int y; 11911: int z; 11912: int t; 11913: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 11914: case 0b000_000 >> 3: //ASR.L #<data>,Dr 11915: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11916: XEiJ.regRn[rrr] = z = (t = x >> y) >> 1; 11917: 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は最後に押し出されたビット 11918: break; 11919: case 0b001_000 >> 3: //LSR.L #<data>,Dr 11920: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11921: XEiJ.regRn[rrr] = z = (t = x >>> y) >>> 1; 11922: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11923: break; 11924: case 0b010_000 >> 3: //ROXR.L #<data>,Dr 11925: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11926: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1; 11927: if (y == 1 - 1) { //y=data-1=1-1 11928: t = x; 11929: } else { //y=data-1=2-1~8-1 11930: z = x << -y | (t = z >>> y - (2 - 1)) >>> 1; //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略 11931: } 11932: XEiJ.regRn[rrr] = z; 11933: 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は最後に押し出されたビット 11934: break; 11935: case 0b011_000 >> 3: //ROR.L #<data>,Dr 11936: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11937: XEiJ.regRn[rrr] = z = x << ~y | x >>> y + 1; //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略 11938: 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は結果の最上位ビット 11939: break; 11940: case 0b100_000 >> 3: //ASR.L Dq,Dr 11941: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11942: XEiJ.mpuCycleCount += 8 + (y << 1); 11943: if (y == 0) { //y=data=0 11944: z = x; 11945: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 11946: } else { //y=data=1~63 11947: XEiJ.regRn[rrr] = z = (t = x >> (y <= 32 ? y - 1 : 31)) >> 1; 11948: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11949: } 11950: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11951: break; 11952: case 0b101_000 >> 3: //LSR.L Dq,Dr 11953: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11954: XEiJ.mpuCycleCount += 8 + (y << 1); 11955: if (y == 0) { //y=data=0 11956: z = x; 11957: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 11958: } else { //y=data=1~63 11959: XEiJ.regRn[rrr] = z = (t = y <= 32 ? x >>> y - 1 : 0) >>> 1; 11960: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11961: } 11962: break; 11963: case 0b110_000 >> 3: //ROXR.L Dq,Dr 11964: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11965: XEiJ.mpuCycleCount += 8 + (y << 1); 11966: //y %= 33; 11967: y -= 32 - y >> 6 & 33; //y=data=0~32 11968: if (y == 0) { //y=data=0 11969: z = x; 11970: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 11971: } else { //y=data=1~32 11972: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1; 11973: if (y == 1) { //y=data=1 11974: t = x; //Cは最後に押し出されたビット 11975: } else { //y=data=2~32 11976: z = x << 33 - y | (t = z >>> y - 2) >>> 1; 11977: } 11978: XEiJ.regRn[rrr] = z; 11979: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11980: } 11981: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11982: break; 11983: case 0b111_000 >> 3: //ROR.L Dq,Dr 11984: default: 11985: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11986: XEiJ.mpuCycleCount += 8 + (y << 1); 11987: if (y == 0) { 11988: z = x; 11989: t = 0; //Cはクリア 11990: } else { 11991: y &= 31; //y=data=0~31 11992: XEiJ.regRn[rrr] = z = x << -y | x >>> y; //Javaのシフト演算子は5ビットでマスクされるので32-yを-yに省略。y=32のときx|xになるが問題ない 11993: t = z >>> 31; //Cは結果の最上位ビット 11994: } 11995: 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は変化しない 11996: } 11997: } //irpXxrToRegLong 11998: 11999: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12000: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12001: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12002: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12003: //ASR.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_000_011_mmm_rrr 12004: // 12005: //ASR.W #<data>,Dr 12006: //ASR.W Dq,Dr 12007: //ASR.W <ea> 12008: // 算術右シフトワード 12009: // ................アイウエオカキクケコサシスセソタ XNZVC 12010: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12011: // 1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0 12012: // : 12013: // 15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0 12014: // 16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0 12015: // CCR 12016: // X countが0のとき変化しない。他は最後に押し出されたビット 12017: // N 結果の最上位ビット 12018: // Z 結果が0のときセット。他はクリア 12019: // V 常にクリア 12020: // C countが0のときクリア。他は最後に押し出されたビット 12021: public static void irpAsrToMem () throws M68kException { 12022: XEiJ.mpuCycleCount += 8; 12023: int ea = XEiJ.regOC & 63; 12024: int a = efaMltWord (ea); 12025: int x = XEiJ.busRws (a); 12026: int z = x >> 1; 12027: XEiJ.busWw (a, z); 12028: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12029: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12030: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12031: } //irpAsrToMem 12032: 12033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12034: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12035: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12036: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12037: //ASL.B #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_000_rrr 12038: //LSL.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_001_rrr 12039: //ROXL.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_010_rrr 12040: //ROL.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_011_rrr 12041: //ASL.B Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_100_rrr 12042: //LSL.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_101_rrr 12043: //ROXL.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_110_rrr 12044: //ROL.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_111_rrr 12045: //ASL.B Dr |A|012346|-|UUUUU|*****| |1110_001_100_000_rrr [ASL.B #1,Dr] 12046: //LSL.B Dr |A|012346|-|UUUUU|***0*| |1110_001_100_001_rrr [LSL.B #1,Dr] 12047: //ROXL.B Dr |A|012346|-|*UUUU|***0*| |1110_001_100_010_rrr [ROXL.B #1,Dr] 12048: //ROL.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_100_011_rrr [ROL.B #1,Dr] 12049: // 12050: //ASL.B #<data>,Dr 12051: //ASL.B Dq,Dr 12052: // 算術左シフトバイト 12053: // ........................アイウエオカキク XNZVC 12054: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12055: // 1 ........................イウエオカキク0 アイ**ア Z=イウエオカキク==0,V=アイ!=0/-1 12056: // : 12057: // 7 ........................ク0000000 キク**キ Z=ク==0,V=アイウエオカキク!=0/-1 12058: // 8 ........................00000000 ク01*ク V=アイウエオカキク!=0 12059: // 9 ........................00000000 001*0 V=アイウエオカキク!=0 12060: // CCR 12061: // X countが0のとき変化しない。他は最後に押し出されたビット 12062: // N 結果の最上位ビット 12063: // Z 結果が0のときセット。他はクリア 12064: // V ASRで元に戻せないときセット。他はクリア 12065: // C countが0のときクリア。他は最後に押し出されたビット 12066: // 12067: //LSL.B #<data>,Dr 12068: //LSL.B Dq,Dr 12069: // 論理左シフトバイト 12070: // ........................アイウエオカキク XNZVC 12071: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12072: // 1 ........................イウエオカキク0 アイ*0ア Z=イウエオカキク==0 12073: // : 12074: // 7 ........................ク0000000 キク*0キ Z=ク==0 12075: // 8 ........................00000000 ク010ク 12076: // 9 ........................00000000 00100 12077: // CCR 12078: // X countが0のとき変化しない。他は最後に押し出されたビット 12079: // N 結果の最上位ビット 12080: // Z 結果が0のときセット。他はクリア 12081: // V 常にクリア 12082: // C countが0のときクリア。他は最後に押し出されたビット 12083: // 12084: //ROL.B #<data>,Dr 12085: //ROL.B Dq,Dr 12086: // 左ローテートバイト 12087: // ........................アイウエオカキク XNZVC 12088: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12089: // 1 ........................イウエオカキクア Xイ*0ア Z=アイウエオカキク==0 12090: // : 12091: // 7 ........................クアイウエオカキ Xク*0キ Z=アイウエオカキク==0 12092: // 8 ........................アイウエオカキク Xア*0ク Z=アイウエオカキク==0 12093: // CCR 12094: // X 常に変化しない 12095: // N 結果の最上位ビット 12096: // Z 結果が0のときセット。他はクリア 12097: // V 常にクリア 12098: // C countが0のときクリア。他は結果の最下位ビット 12099: // 12100: //ROXL.B #<data>,Dr 12101: //ROXL.B Dq,Dr 12102: // 拡張左ローテートバイト 12103: // ........................アイウエオカキク XNZVC 12104: // 0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 12105: // 1 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0 12106: // 2 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0 12107: // : 12108: // 7 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0 12109: // 8 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0 12110: // 9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 12111: // CCR 12112: // X countが0のとき変化しない。他は最後に押し出されたビット 12113: // N 結果の最上位ビット 12114: // Z 結果が0のときセット。他はクリア 12115: // V 常にクリア 12116: // C countが0のときXのコピー。他は最後に押し出されたビット 12117: public static void irpXxlToRegByte () throws M68kException { 12118: int rrr; 12119: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12120: int y; 12121: int z; 12122: int t; 12123: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12124: case 0b000_000 >> 3: //ASL.B #<data>,Dr 12125: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12126: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1)); 12127: 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は最後に押し出されたビット 12128: break; 12129: case 0b001_000 >> 3: //LSL.B #<data>,Dr 12130: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12131: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1)); 12132: 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は最後に押し出されたビット 12133: break; 12134: case 0b010_000 >> 3: //ROXL.B #<data>,Dr 12135: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12136: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12137: if (y == 1 - 1) { //y=data-1=1-1 12138: t = x; 12139: } else { //y=data-1=2-1~8-1 12140: z = (t = z << y - (2 - 1)) << 1 | (0xff & x) >>> 9 - 1 - y; 12141: } 12142: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 12143: 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は最後に押し出されたビット 12144: break; 12145: case 0b011_000 >> 3: //ROL.B #<data>,Dr 12146: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12147: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y + 1 | (0xff & x) >>> 7 - y)); 12148: 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は結果の最下位ビット 12149: break; 12150: case 0b100_000 >> 3: //ASL.B Dq,Dr 12151: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12152: XEiJ.mpuCycleCount += 6 + (y << 1); 12153: if (y <= 7) { //y=data=0~7 12154: if (y == 0) { //y=data=0 12155: z = (byte) x; 12156: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12157: } else { //y=data=1~7 12158: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y - 1) << 1)); 12159: 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は最後に押し出されたビット 12160: } 12161: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12162: } else { //y=data=8~63 12163: XEiJ.regRn[rrr] = ~0xff & x; 12164: 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); 12165: } 12166: break; 12167: case 0b101_000 >> 3: //LSL.B Dq,Dr 12168: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12169: XEiJ.mpuCycleCount += 6 + (y << 1); 12170: if (y == 0) { //y=data=0 12171: z = (byte) x; 12172: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12173: } else { //y=data=1~63 12174: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = y <= 8 ? x << y - 1 : 0) << 1)); 12175: t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12176: } 12177: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12178: break; 12179: case 0b110_000 >> 3: //ROXL.B Dq,Dr 12180: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12181: XEiJ.mpuCycleCount += 6 + (y << 1); 12182: //y %= 9; 12183: y = (y & 7) - (y >> 3); //y=data=-7~7 12184: y += y >> 3 & 9; //y=data=0~8 12185: if (y == 0) { //y=data=0 12186: z = (byte) x; 12187: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12188: } else { //y=data=1~8 12189: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12190: if (y == 1) { //y=data=1 12191: t = x; //Cは最後に押し出されたビット 12192: } else { //y=data=2~8 12193: z = (t = z << y - 2) << 1 | (0xff & x) >>> 9 - y; 12194: } 12195: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 12196: t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12197: } 12198: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12199: break; 12200: case 0b111_000 >> 3: //ROL.B Dq,Dr 12201: default: 12202: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12203: XEiJ.mpuCycleCount += 6 + (y << 1); 12204: if (y == 0) { 12205: z = (byte) x; 12206: t = 0; //Cはクリア 12207: } else { 12208: y &= 7; //y=data=0~7 12209: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y | (0xff & x) >>> 8 - y)); 12210: t = z & 1; //Cは結果の最下位ビット 12211: } 12212: 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は変化しない 12213: } 12214: } //irpXxlToRegByte 12215: 12216: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12217: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12218: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12219: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12220: //ASL.W #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_000_rrr 12221: //LSL.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_001_rrr 12222: //ROXL.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_010_rrr 12223: //ROL.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_011_rrr 12224: //ASL.W Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_100_rrr 12225: //LSL.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_101_rrr 12226: //ROXL.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_110_rrr 12227: //ROL.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_111_rrr 12228: //ASL.W Dr |A|012346|-|UUUUU|*****| |1110_001_101_000_rrr [ASL.W #1,Dr] 12229: //LSL.W Dr |A|012346|-|UUUUU|***0*| |1110_001_101_001_rrr [LSL.W #1,Dr] 12230: //ROXL.W Dr |A|012346|-|*UUUU|***0*| |1110_001_101_010_rrr [ROXL.W #1,Dr] 12231: //ROL.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_101_011_rrr [ROL.W #1,Dr] 12232: // 12233: //ASL.W #<data>,Dr 12234: //ASL.W Dq,Dr 12235: //ASL.W <ea> 12236: // 算術左シフトワード 12237: // ................アイウエオカキクケコサシスセソタ XNZVC 12238: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12239: // 1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1 12240: // : 12241: // 15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1 12242: // 16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0 12243: // 17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0 12244: // CCR 12245: // X countが0のとき変化しない。他は最後に押し出されたビット 12246: // N 結果の最上位ビット 12247: // Z 結果が0のときセット。他はクリア 12248: // V ASRで元に戻せないときセット。他はクリア 12249: // C countが0のときクリア。他は最後に押し出されたビット 12250: // 12251: //LSL.W #<data>,Dr 12252: //LSL.W Dq,Dr 12253: //LSL.W <ea> 12254: // 論理左シフトワード 12255: // ................アイウエオカキクケコサシスセソタ XNZVC 12256: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12257: // 1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0 12258: // : 12259: // 15 ................タ000000000000000 ソタ*0ソ Z=タ==0 12260: // 16 ................0000000000000000 タ010タ 12261: // 17 ................0000000000000000 00100 12262: // CCR 12263: // X countが0のとき変化しない。他は最後に押し出されたビット 12264: // N 結果の最上位ビット 12265: // Z 結果が0のときセット。他はクリア 12266: // V 常にクリア 12267: // C countが0のときクリア。他は最後に押し出されたビット 12268: // 12269: //ROL.W #<data>,Dr 12270: //ROL.W Dq,Dr 12271: //ROL.W <ea> 12272: // 左ローテートワード 12273: // ................アイウエオカキクケコサシスセソタ XNZVC 12274: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12275: // 1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0 12276: // : 12277: // 15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0 12278: // 16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0 12279: // CCR 12280: // X 常に変化しない 12281: // N 結果の最上位ビット 12282: // Z 結果が0のときセット。他はクリア 12283: // V 常にクリア 12284: // C countが0のときクリア。他は結果の最下位ビット 12285: // 12286: //ROXL.W #<data>,Dr 12287: //ROXL.W Dq,Dr 12288: //ROXL.W <ea> 12289: // 拡張左ローテートワード 12290: // ................アイウエオカキクケコサシスセソタ XNZVC 12291: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12292: // 1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 12293: // 2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 12294: // : 12295: // 15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 12296: // 16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 12297: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12298: // CCR 12299: // X countが0のとき変化しない。他は最後に押し出されたビット 12300: // N 結果の最上位ビット 12301: // Z 結果が0のときセット。他はクリア 12302: // V 常にクリア 12303: // C countが0のときXのコピー。他は最後に押し出されたビット 12304: public static void irpXxlToRegWord () throws M68kException { 12305: int rrr; 12306: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12307: int y; 12308: int z; 12309: int t; 12310: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12311: case 0b000_000 >> 3: //ASL.W #<data>,Dr 12312: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12313: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1)); 12314: 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は最後に押し出されたビット 12315: break; 12316: case 0b001_000 >> 3: //LSL.W #<data>,Dr 12317: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12318: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1)); 12319: 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は最後に押し出されたビット 12320: break; 12321: case 0b010_000 >> 3: //ROXL.W #<data>,Dr 12322: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12323: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12324: if (y == 1 - 1) { //y=data-1=1-1 12325: t = x; 12326: } else { //y=data-1=2-1~8-1 12327: z = (t = z << y - (2 - 1)) << 1 | (char) x >>> 17 - 1 - y; 12328: } 12329: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12330: 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は最後に押し出されたビット 12331: break; 12332: case 0b011_000 >> 3: //ROL.W #<data>,Dr 12333: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12334: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y + 1 | (char) x >>> 16 - 1 - y)); 12335: 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は結果の最下位ビット 12336: break; 12337: case 0b100_000 >> 3: //ASL.W Dq,Dr 12338: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12339: XEiJ.mpuCycleCount += 6 + (y << 1); 12340: if (y <= 15) { //y=data=0~15 12341: if (y == 0) { //y=data=0 12342: z = (short) x; 12343: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12344: } else { //y=data=1~15 12345: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y - 1) << 1)); 12346: 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は最後に押し出されたビット 12347: } 12348: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12349: } else { //y=data=16~63 12350: XEiJ.regRn[rrr] = ~0xffff & x; 12351: 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); 12352: } 12353: break; 12354: case 0b101_000 >> 3: //LSL.W Dq,Dr 12355: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12356: XEiJ.mpuCycleCount += 6 + (y << 1); 12357: if (y == 0) { //y=data=0 12358: z = (short) x; 12359: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12360: } else { //y=data=1~63 12361: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = y <= 16 ? x << y - 1 : 0) << 1)); 12362: t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12363: } 12364: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12365: break; 12366: case 0b110_000 >> 3: //ROXL.W Dq,Dr 12367: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12368: XEiJ.mpuCycleCount += 6 + (y << 1); 12369: //y %= 17; 12370: y = (y & 15) - (y >> 4); //y=data=-3~15 12371: y += y >> 4 & 17; //y=data=0~16 12372: if (y == 0) { //y=data=0 12373: z = (short) x; 12374: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12375: } else { //y=data=1~16 12376: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12377: if (y == 1) { //y=data=1 12378: t = x; //Cは最後に押し出されたビット 12379: } else { //y=data=2~16 12380: z = (t = z << y - 2) << 1 | (char) x >>> 17 - y; 12381: } 12382: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12383: t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12384: } 12385: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12386: break; 12387: case 0b111_000 >> 3: //ROL.W Dq,Dr 12388: default: 12389: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12390: XEiJ.mpuCycleCount += 6 + (y << 1); 12391: if (y == 0) { 12392: z = (short) x; 12393: t = 0; //Cはクリア 12394: } else { 12395: y &= 15; //y=data=0~15 12396: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y | (char) x >>> 16 - y)); 12397: t = z & 1; //Cは結果の最下位ビット 12398: } 12399: 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は変化しない 12400: } 12401: } //irpXxlToRegWord 12402: 12403: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12404: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12405: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12406: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12407: //ASL.L #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_000_rrr 12408: //LSL.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_001_rrr 12409: //ROXL.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_010_rrr 12410: //ROL.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_011_rrr 12411: //ASL.L Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_100_rrr 12412: //LSL.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_101_rrr 12413: //ROXL.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_110_rrr 12414: //ROL.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_111_rrr 12415: //ASL.L Dr |A|012346|-|UUUUU|*****| |1110_001_110_000_rrr [ASL.L #1,Dr] 12416: //LSL.L Dr |A|012346|-|UUUUU|***0*| |1110_001_110_001_rrr [LSL.L #1,Dr] 12417: //ROXL.L Dr |A|012346|-|*UUUU|***0*| |1110_001_110_010_rrr [ROXL.L #1,Dr] 12418: //ROL.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_110_011_rrr [ROL.L #1,Dr] 12419: // 12420: //ASL.L #<data>,Dr 12421: //ASL.L Dq,Dr 12422: // 算術左シフトロング 12423: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12424: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア**0 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12425: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ**ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0,V=アイ!=0/-1 12426: // : 12427: // 31 ミ0000000000000000000000000000000 マミ**マ Z=ミ==0,V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0/-1 12428: // 32 00000000000000000000000000000000 ミ01*ミ V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0 12429: // 33 00000000000000000000000000000000 001*0 V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0 12430: // CCR 12431: // X countが0のとき変化しない。他は最後に押し出されたビット 12432: // N 結果の最上位ビット 12433: // Z 結果が0のときセット。他はクリア 12434: // V ASRで元に戻せないときセット。他はクリア 12435: // C countが0のときクリア。他は最後に押し出されたビット 12436: // 12437: //LSL.L #<data>,Dr 12438: //LSL.L Dq,Dr 12439: // 論理左シフトロング 12440: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12441: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12442: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12443: // : 12444: // 31 ミ0000000000000000000000000000000 マミ*0マ Z=ミ==0 12445: // 32 00000000000000000000000000000000 ミ010ミ 12446: // 33 00000000000000000000000000000000 00100 12447: // CCR 12448: // X countが0のとき変化しない。他は最後に押し出されたビット 12449: // N 結果の最上位ビット 12450: // Z 結果が0のときセット。他はクリア 12451: // V 常にクリア 12452: // C countが0のときクリア。他は最後に押し出されたビット 12453: // 12454: //ROL.L #<data>,Dr 12455: //ROL.L Dq,Dr 12456: // 左ローテートロング 12457: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12458: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12459: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12460: // : 12461: // 31 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12462: // 32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12463: // CCR 12464: // X 常に変化しない 12465: // N 結果の最上位ビット 12466: // Z 結果が0のときセット。他はクリア 12467: // V 常にクリア 12468: // C countが0のときクリア。他は結果の最下位ビット 12469: // 12470: //ROXL.L #<data>,Dr 12471: //ROXL.L Dq,Dr 12472: // 拡張左ローテートロング 12473: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12474: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12475: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12476: // 2 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12477: // : 12478: // 31 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0 12479: // 32 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0 12480: // 33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12481: // CCR 12482: // X countが0のとき変化しない。他は最後に押し出されたビット 12483: // N 結果の最上位ビット 12484: // Z 結果が0のときセット。他はクリア 12485: // V 常にクリア 12486: // C countが0のときXのコピー。他は最後に押し出されたビット 12487: public static void irpXxlToRegLong () throws M68kException { 12488: int rrr; 12489: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12490: int y; 12491: int z; 12492: int t; 12493: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12494: case 0b000_000 >> 3: //ASL.L #<data>,Dr 12495: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12496: XEiJ.regRn[rrr] = z = (t = x << y) << 1; 12497: 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は最後に押し出されたビット 12498: break; 12499: case 0b001_000 >> 3: //LSL.L #<data>,Dr 12500: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12501: XEiJ.regRn[rrr] = z = (t = x << y) << 1; 12502: 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は最後に押し出されたビット 12503: break; 12504: case 0b010_000 >> 3: //ROXL.L #<data>,Dr 12505: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12506: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12507: if (y == 1 - 1) { //y=data-1=1-1 12508: t = x; 12509: } else { //y=data-1=2-1~8-1 12510: z = (t = z << y - (2 - 1)) << 1 | x >>> -y; //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略 12511: } 12512: XEiJ.regRn[rrr] = z; 12513: 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は最後に押し出されたビット 12514: break; 12515: case 0b011_000 >> 3: //ROL.L #<data>,Dr 12516: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12517: XEiJ.regRn[rrr] = z = x << y + 1 | x >>> ~y; //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略 12518: 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は結果の最下位ビット 12519: break; 12520: case 0b100_000 >> 3: //ASL.L Dq,Dr 12521: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12522: XEiJ.mpuCycleCount += 8 + (y << 1); 12523: if (y <= 31) { //y=data=0~31 12524: if (y == 0) { //y=data=0 12525: z = x; 12526: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12527: } else { //y=data=1~31 12528: XEiJ.regRn[rrr] = z = (t = x << y - 1) << 1; 12529: t = (z >> y != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12530: } 12531: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12532: } else { //y=data=32~63 12533: XEiJ.regRn[rrr] = 0; 12534: 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); 12535: } 12536: break; 12537: case 0b101_000 >> 3: //LSL.L Dq,Dr 12538: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12539: XEiJ.mpuCycleCount += 8 + (y << 1); 12540: if (y == 0) { //y=data=0 12541: z = x; 12542: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12543: } else { //y=data=1~63 12544: XEiJ.regRn[rrr] = z = (t = y <= 32 ? x << y - 1 : 0) << 1; 12545: t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12546: } 12547: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12548: break; 12549: case 0b110_000 >> 3: //ROXL.L Dq,Dr 12550: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12551: XEiJ.mpuCycleCount += 8 + (y << 1); 12552: //y %= 33; 12553: y -= 32 - y >> 6 & 33; //y=data=0~32 12554: if (y == 0) { //y=data=0 12555: z = x; 12556: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12557: } else { //y=data=1~32 12558: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12559: if (y == 1) { //y=data=1 12560: t = x; //Cは最後に押し出されたビット 12561: } else { //y=data=2~32 12562: z = (t = z << y - 2) << 1 | x >>> 33 - y; 12563: } 12564: XEiJ.regRn[rrr] = z; 12565: t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12566: } 12567: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12568: break; 12569: case 0b111_000 >> 3: //ROL.L Dq,Dr 12570: default: 12571: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12572: XEiJ.mpuCycleCount += 8 + (y << 1); 12573: if (y == 0) { 12574: z = x; 12575: t = 0; //Cはクリア 12576: } else { 12577: XEiJ.regRn[rrr] = z = x << y | x >>> -y; //Javaのシフト演算子は5ビットでマスクされるのでy&31をyに、32-(y&31)を-yに省略。y=32のときx|xになるが問題ない 12578: t = z & 1; 12579: } 12580: 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は変化しない 12581: } 12582: } //irpXxlToRegLong 12583: 12584: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12585: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12586: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12587: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12588: //ASL.W <ea> |-|012346|-|UUUUU|*****| M+-WXZ |1110_000_111_mmm_rrr 12589: // 12590: //ASL.W #<data>,Dr 12591: //ASL.W Dq,Dr 12592: //ASL.W <ea> 12593: // 算術左シフトワード 12594: // ................アイウエオカキクケコサシスセソタ XNZVC 12595: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12596: // 1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1 12597: // : 12598: // 15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1 12599: // 16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0 12600: // 17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0 12601: // CCR 12602: // X countが0のとき変化しない。他は最後に押し出されたビット 12603: // N 結果の最上位ビット 12604: // Z 結果が0のときセット。他はクリア 12605: // V ASRで元に戻せないときセット。他はクリア 12606: // C countが0のときクリア。他は最後に押し出されたビット 12607: public static void irpAslToMem () throws M68kException { 12608: XEiJ.mpuCycleCount += 8; 12609: int ea = XEiJ.regOC & 63; 12610: int a = efaMltWord (ea); 12611: int x = XEiJ.busRws (a); 12612: int z = (short) (x << 1); 12613: XEiJ.busWw (a, z); 12614: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12615: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12616: (x ^ z) >>> 31 << 1 | //Vは最上位ビットが変化したときセット 12617: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12618: } //irpAslToMem 12619: 12620: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12621: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12622: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12623: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12624: //LSR.W <ea> |-|012346|-|UUUUU|*0*0*| M+-WXZ |1110_001_011_mmm_rrr 12625: // 12626: //LSR.W #<data>,Dr 12627: //LSR.W Dq,Dr 12628: //LSR.W <ea> 12629: // 論理右シフトワード 12630: // ................アイウエオカキクケコサシスセソタ XNZVC 12631: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12632: // 1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0 12633: // : 12634: // 15 ................000000000000000ア イ0*0イ Z=ア==0 12635: // 16 ................0000000000000000 ア010ア 12636: // 17 ................0000000000000000 00100 12637: // CCR 12638: // X countが0のとき変化しない。他は最後に押し出されたビット 12639: // N 結果の最上位ビット 12640: // Z 結果が0のときセット。他はクリア 12641: // V 常にクリア 12642: // C countが0のときクリア。他は最後に押し出されたビット 12643: public static void irpLsrToMem () throws M68kException { 12644: XEiJ.mpuCycleCount += 8; 12645: int ea = XEiJ.regOC & 63; 12646: int a = efaMltWord (ea); 12647: int x = XEiJ.busRwz (a); 12648: int z = x >>> 1; 12649: XEiJ.busWw (a, z); 12650: XEiJ.regCCR = ((z == 0 ? XEiJ.REG_CCR_Z : 0) | 12651: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12652: } //irpLsrToMem 12653: 12654: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12655: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12656: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12657: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12658: //LSL.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_001_111_mmm_rrr 12659: // 12660: //LSL.W #<data>,Dr 12661: //LSL.W Dq,Dr 12662: //LSL.W <ea> 12663: // 論理左シフトワード 12664: // ................アイウエオカキクケコサシスセソタ XNZVC 12665: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12666: // 1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0 12667: // : 12668: // 15 ................タ000000000000000 ソタ*0ソ Z=タ==0 12669: // 16 ................0000000000000000 タ010タ 12670: // 17 ................0000000000000000 00100 12671: // CCR 12672: // X countが0のとき変化しない。他は最後に押し出されたビット 12673: // N 結果の最上位ビット 12674: // Z 結果が0のときセット。他はクリア 12675: // V 常にクリア 12676: // C countが0のときクリア。他は最後に押し出されたビット 12677: public static void irpLslToMem () throws M68kException { 12678: XEiJ.mpuCycleCount += 8; 12679: int ea = XEiJ.regOC & 63; 12680: int a = efaMltWord (ea); 12681: int x = XEiJ.busRws (a); 12682: int z = (short) (x << 1); 12683: XEiJ.busWw (a, z); 12684: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12685: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12686: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12687: } //irpLslToMem 12688: 12689: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12690: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12691: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12692: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12693: //ROXR.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_011_mmm_rrr 12694: // 12695: //ROXR.W #<data>,Dr 12696: //ROXR.W Dq,Dr 12697: //ROXR.W <ea> 12698: // 拡張右ローテートワード 12699: // ................アイウエオカキクケコサシスセソタ XNZVC 12700: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12701: // 1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 12702: // 2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 12703: // : 12704: // 15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 12705: // 16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 12706: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12707: // CCR 12708: // X countが0のとき変化しない。他は最後に押し出されたビット 12709: // N 結果の最上位ビット 12710: // Z 結果が0のときセット。他はクリア 12711: // V 常にクリア 12712: // C countが0のときXのコピー。他は最後に押し出されたビット 12713: public static void irpRoxrToMem () throws M68kException { 12714: XEiJ.mpuCycleCount += 8; 12715: int ea = XEiJ.regOC & 63; 12716: int a = efaMltWord (ea); 12717: int x = XEiJ.busRwz (a); 12718: int z = -(XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | x >>> 1; 12719: XEiJ.busWw (a, z); 12720: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12721: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12722: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12723: } //irpRoxrToMem 12724: 12725: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12726: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12727: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12728: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12729: //ROXL.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_111_mmm_rrr 12730: // 12731: //ROXL.W #<data>,Dr 12732: //ROXL.W Dq,Dr 12733: //ROXL.W <ea> 12734: // 拡張左ローテートワード 12735: // ................アイウエオカキクケコサシスセソタ XNZVC 12736: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12737: // 1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 12738: // 2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 12739: // : 12740: // 15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 12741: // 16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 12742: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12743: // CCR 12744: // X countが0のとき変化しない。他は最後に押し出されたビット 12745: // N 結果の最上位ビット 12746: // Z 結果が0のときセット。他はクリア 12747: // V 常にクリア 12748: // C countが0のときXのコピー。他は最後に押し出されたビット 12749: public static void irpRoxlToMem () throws M68kException { 12750: XEiJ.mpuCycleCount += 8; 12751: int ea = XEiJ.regOC & 63; 12752: int a = efaMltWord (ea); 12753: int x = XEiJ.busRws (a); 12754: int z = (short) (x << 1 | XEiJ.regCCR >> 4 & 1); 12755: XEiJ.busWw (a, z); 12756: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12757: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12758: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12759: } //irpRoxlToMem 12760: 12761: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12762: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12763: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12764: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12765: //ROR.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_011_mmm_rrr 12766: // 12767: //ROR.W #<data>,Dr 12768: //ROR.W Dq,Dr 12769: //ROR.W <ea> 12770: // 右ローテートワード 12771: // ................アイウエオカキクケコサシスセソタ XNZVC 12772: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12773: // 1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0 12774: // : 12775: // 15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0 12776: // 16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0 12777: // CCR 12778: // X 常に変化しない 12779: // N 結果の最上位ビット 12780: // Z 結果が0のときセット。他はクリア 12781: // V 常にクリア 12782: // C countが0のときクリア。他は結果の最上位ビット 12783: public static void irpRorToMem () throws M68kException { 12784: XEiJ.mpuCycleCount += 8; 12785: int ea = XEiJ.regOC & 63; 12786: int a = efaMltWord (ea); 12787: int x = XEiJ.busRwz (a); 12788: int z = (short) (x << 15 | x >>> 1); 12789: XEiJ.busWw (a, z); 12790: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 12791: (z < 0 ? XEiJ.REG_CCR_N : 0) | 12792: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12793: z >>> 31); //Cは結果の最上位ビット 12794: } //irpRorToMem 12795: 12796: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12797: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12798: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12799: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12800: //ROL.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_111_mmm_rrr 12801: // 12802: //ROL.W #<data>,Dr 12803: //ROL.W Dq,Dr 12804: //ROL.W <ea> 12805: // 左ローテートワード 12806: // ................アイウエオカキクケコサシスセソタ XNZVC 12807: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12808: // 1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0 12809: // : 12810: // 15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0 12811: // 16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0 12812: // CCR 12813: // X 常に変化しない 12814: // N 結果の最上位ビット 12815: // Z 結果が0のときセット。他はクリア 12816: // V 常にクリア 12817: // C countが0のときクリア。他は結果の最下位ビット 12818: public static void irpRolToMem () throws M68kException { 12819: XEiJ.mpuCycleCount += 8; 12820: int ea = XEiJ.regOC & 63; 12821: int a = efaMltWord (ea); 12822: int x = XEiJ.busRwz (a); 12823: int z = (short) (x << 1 | x >>> 15); 12824: XEiJ.busWw (a, z); 12825: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 12826: (z < 0 ? XEiJ.REG_CCR_N : 0) | 12827: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12828: z & 1); //Cは結果の最下位ビット 12829: } //irpRolToMem 12830: 12831: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12832: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12833: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12834: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12835: //FPACK <data> |A|012346|-|UUUUU|*****| |1111_111_0dd_ddd_ddd [FLINE #<data>] 12836: public static void irpFpack () throws M68kException { 12837: if (!MainMemory.mmrFEfuncActivated) { 12838: irpFline (); 12839: return; 12840: } 12841: StringBuilder sb; 12842: int a0; 12843: if (FEFunction.FPK_DEBUG_TRACE) { 12844: sb = new StringBuilder (); 12845: String name = Disassembler.DIS_FPACK_NAME[XEiJ.regOC & 255]; 12846: if (name.length () == 0) { 12847: XEiJ.fmtHex4 (sb.append ('$'), XEiJ.regOC); 12848: } else { 12849: sb.append (name); 12850: } 12851: sb.append ('\n'); 12852: 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]); 12853: a0 = XEiJ.regRn[8]; 12854: MainMemory.mmrRstr (sb.append (" (A0)=\""), a0, MainMemory.mmrStrlen (a0, 20)).append ("\"\n"); 12855: } 12856: XEiJ.mpuCycleCount += FEFunction.FPK_CLOCK; //一律にFEFunction.FPK_CLOCKサイクルかかることにする 12857: switch (XEiJ.regOC & 255) { 12858: case 0x00: FEFunction.fpkLMUL (); break; 12859: case 0x01: FEFunction.fpkLDIV (); break; 12860: case 0x02: FEFunction.fpkLMOD (); break; 12861: //case 0x03: break; 12862: case 0x04: FEFunction.fpkUMUL (); break; 12863: case 0x05: FEFunction.fpkUDIV (); break; 12864: case 0x06: FEFunction.fpkUMOD (); break; 12865: //case 0x07: break; 12866: case 0x08: FEFunction.fpkIMUL (); break; 12867: case 0x09: FEFunction.fpkIDIV (); break; 12868: //case 0x0a: break; 12869: //case 0x0b: break; 12870: case 0x0c: FEFunction.fpkRANDOMIZE (); break; 12871: case 0x0d: FEFunction.fpkSRAND (); break; 12872: case 0x0e: FEFunction.fpkRAND (); break; 12873: //case 0x0f: break; 12874: case 0x10: FEFunction.fpkSTOL (); break; 12875: case 0x11: FEFunction.fpkLTOS (); break; 12876: case 0x12: FEFunction.fpkSTOH (); break; 12877: case 0x13: FEFunction.fpkHTOS (); break; 12878: case 0x14: FEFunction.fpkSTOO (); break; 12879: case 0x15: FEFunction.fpkOTOS (); break; 12880: case 0x16: FEFunction.fpkSTOB (); break; 12881: case 0x17: FEFunction.fpkBTOS (); break; 12882: case 0x18: FEFunction.fpkIUSING (); break; 12883: //case 0x19: break; 12884: case 0x1a: FEFunction.fpkLTOD (); break; 12885: case 0x1b: FEFunction.fpkDTOL (); break; 12886: case 0x1c: FEFunction.fpkLTOF (); break; 12887: case 0x1d: FEFunction.fpkFTOL (); break; 12888: case 0x1e: FEFunction.fpkFTOD (); break; 12889: case 0x1f: FEFunction.fpkDTOF (); break; 12890: case 0x20: FEFunction.fpkVAL (); break; 12891: case 0x21: FEFunction.fpkUSING (); break; 12892: case 0x22: FEFunction.fpkSTOD (); break; 12893: case 0x23: FEFunction.fpkDTOS (); break; 12894: case 0x24: FEFunction.fpkECVT (); break; 12895: case 0x25: FEFunction.fpkFCVT (); break; 12896: case 0x26: FEFunction.fpkGCVT (); break; 12897: //case 0x27: break; 12898: case 0x28: FEFunction.fpkDTST (); break; 12899: case 0x29: FEFunction.fpkDCMP (); break; 12900: case 0x2a: FEFunction.fpkDNEG (); break; 12901: case 0x2b: FEFunction.fpkDADD (); break; 12902: case 0x2c: FEFunction.fpkDSUB (); break; 12903: case 0x2d: FEFunction.fpkDMUL (); break; 12904: case 0x2e: FEFunction.fpkDDIV (); break; 12905: case 0x2f: FEFunction.fpkDMOD (); break; 12906: case 0x30: FEFunction.fpkDABS (); break; 12907: case 0x31: FEFunction.fpkDCEIL (); break; 12908: case 0x32: FEFunction.fpkDFIX (); break; 12909: case 0x33: FEFunction.fpkDFLOOR (); break; 12910: case 0x34: FEFunction.fpkDFRAC (); break; 12911: case 0x35: FEFunction.fpkDSGN (); break; 12912: case 0x36: FEFunction.fpkSIN (); break; 12913: case 0x37: FEFunction.fpkCOS (); break; 12914: case 0x38: FEFunction.fpkTAN (); break; 12915: case 0x39: FEFunction.fpkATAN (); break; 12916: case 0x3a: FEFunction.fpkLOG (); break; 12917: case 0x3b: FEFunction.fpkEXP (); break; 12918: case 0x3c: FEFunction.fpkSQR (); break; 12919: case 0x3d: FEFunction.fpkPI (); break; 12920: case 0x3e: FEFunction.fpkNPI (); break; 12921: case 0x3f: FEFunction.fpkPOWER (); break; 12922: case 0x40: FEFunction.fpkRND (); break; 12923: case 0x41: FEFunction.fpkSINH (); break; 12924: case 0x42: FEFunction.fpkCOSH (); break; 12925: case 0x43: FEFunction.fpkTANH (); break; 12926: case 0x44: FEFunction.fpkATANH (); break; 12927: case 0x45: FEFunction.fpkASIN (); break; 12928: case 0x46: FEFunction.fpkACOS (); break; 12929: case 0x47: FEFunction.fpkLOG10 (); break; 12930: case 0x48: FEFunction.fpkLOG2 (); break; 12931: case 0x49: FEFunction.fpkDFREXP (); break; 12932: case 0x4a: FEFunction.fpkDLDEXP (); break; 12933: case 0x4b: FEFunction.fpkDADDONE (); break; 12934: case 0x4c: FEFunction.fpkDSUBONE (); break; 12935: case 0x4d: FEFunction.fpkDDIVTWO (); break; 12936: case 0x4e: FEFunction.fpkDIEECNV (); break; 12937: case 0x4f: FEFunction.fpkIEEDCNV (); break; 12938: case 0x50: FEFunction.fpkFVAL (); break; 12939: case 0x51: FEFunction.fpkFUSING (); break; 12940: case 0x52: FEFunction.fpkSTOF (); break; 12941: case 0x53: FEFunction.fpkFTOS (); break; 12942: case 0x54: FEFunction.fpkFECVT (); break; 12943: case 0x55: FEFunction.fpkFFCVT (); break; 12944: case 0x56: FEFunction.fpkFGCVT (); break; 12945: //case 0x57: break; 12946: case 0x58: FEFunction.fpkFTST (); break; 12947: case 0x59: FEFunction.fpkFCMP (); break; 12948: case 0x5a: FEFunction.fpkFNEG (); break; 12949: case 0x5b: FEFunction.fpkFADD (); break; 12950: case 0x5c: FEFunction.fpkFSUB (); break; 12951: case 0x5d: FEFunction.fpkFMUL (); break; 12952: case 0x5e: FEFunction.fpkFDIV (); break; 12953: case 0x5f: FEFunction.fpkFMOD (); break; 12954: case 0x60: FEFunction.fpkFABS (); break; 12955: case 0x61: FEFunction.fpkFCEIL (); break; 12956: case 0x62: FEFunction.fpkFFIX (); break; 12957: case 0x63: FEFunction.fpkFFLOOR (); break; 12958: case 0x64: FEFunction.fpkFFRAC (); break; 12959: case 0x65: FEFunction.fpkFSGN (); break; 12960: case 0x66: FEFunction.fpkFSIN (); break; 12961: case 0x67: FEFunction.fpkFCOS (); break; 12962: case 0x68: FEFunction.fpkFTAN (); break; 12963: case 0x69: FEFunction.fpkFATAN (); break; 12964: case 0x6a: FEFunction.fpkFLOG (); break; 12965: case 0x6b: FEFunction.fpkFEXP (); break; 12966: case 0x6c: FEFunction.fpkFSQR (); break; 12967: case 0x6d: FEFunction.fpkFPI (); break; 12968: case 0x6e: FEFunction.fpkFNPI (); break; 12969: case 0x6f: FEFunction.fpkFPOWER (); break; 12970: case 0x70: FEFunction.fpkFRND (); break; 12971: case 0x71: FEFunction.fpkFSINH (); break; 12972: case 0x72: FEFunction.fpkFCOSH (); break; 12973: case 0x73: FEFunction.fpkFTANH (); break; 12974: case 0x74: FEFunction.fpkFATANH (); break; 12975: case 0x75: FEFunction.fpkFASIN (); break; 12976: case 0x76: FEFunction.fpkFACOS (); break; 12977: case 0x77: FEFunction.fpkFLOG10 (); break; 12978: case 0x78: FEFunction.fpkFLOG2 (); break; 12979: case 0x79: FEFunction.fpkFFREXP (); break; 12980: case 0x7a: FEFunction.fpkFLDEXP (); break; 12981: case 0x7b: FEFunction.fpkFADDONE (); break; 12982: case 0x7c: FEFunction.fpkFSUBONE (); break; 12983: case 0x7d: FEFunction.fpkFDIVTWO (); break; 12984: case 0x7e: FEFunction.fpkFIEECNV (); break; 12985: case 0x7f: FEFunction.fpkIEEFCNV (); break; 12986: //case 0x80: break; 12987: //case 0x81: break; 12988: //case 0x82: break; 12989: //case 0x83: break; 12990: //case 0x84: break; 12991: //case 0x85: break; 12992: //case 0x86: break; 12993: //case 0x87: break; 12994: //case 0x88: break; 12995: //case 0x89: break; 12996: //case 0x8a: break; 12997: //case 0x8b: break; 12998: //case 0x8c: break; 12999: //case 0x8d: break; 13000: //case 0x8e: break; 13001: //case 0x8f: break; 13002: //case 0x90: break; 13003: //case 0x91: break; 13004: //case 0x92: break; 13005: //case 0x93: break; 13006: //case 0x94: break; 13007: //case 0x95: break; 13008: //case 0x96: break; 13009: //case 0x97: break; 13010: //case 0x98: break; 13011: //case 0x99: break; 13012: //case 0x9a: break; 13013: //case 0x9b: break; 13014: //case 0x9c: break; 13015: //case 0x9d: break; 13016: //case 0x9e: break; 13017: //case 0x9f: break; 13018: //case 0xa0: break; 13019: //case 0xa1: break; 13020: //case 0xa2: break; 13021: //case 0xa3: break; 13022: //case 0xa4: break; 13023: //case 0xa5: break; 13024: //case 0xa6: break; 13025: //case 0xa7: break; 13026: //case 0xa8: break; 13027: //case 0xa9: break; 13028: //case 0xaa: break; 13029: //case 0xab: break; 13030: //case 0xac: break; 13031: //case 0xad: break; 13032: //case 0xae: break; 13033: //case 0xaf: break; 13034: //case 0xb0: break; 13035: //case 0xb1: break; 13036: //case 0xb2: break; 13037: //case 0xb3: break; 13038: //case 0xb4: break; 13039: //case 0xb5: break; 13040: //case 0xb6: break; 13041: //case 0xb7: break; 13042: //case 0xb8: break; 13043: //case 0xb9: break; 13044: //case 0xba: break; 13045: //case 0xbb: break; 13046: //case 0xbc: break; 13047: //case 0xbd: break; 13048: //case 0xbe: break; 13049: //case 0xbf: break; 13050: //case 0xc0: break; 13051: //case 0xc1: break; 13052: //case 0xc2: break; 13053: //case 0xc3: break; 13054: //case 0xc4: break; 13055: //case 0xc5: break; 13056: //case 0xc6: break; 13057: //case 0xc7: break; 13058: //case 0xc8: break; 13059: //case 0xc9: break; 13060: //case 0xca: break; 13061: //case 0xcb: break; 13062: //case 0xcc: break; 13063: //case 0xcd: break; 13064: //case 0xce: break; 13065: //case 0xcf: break; 13066: //case 0xd0: break; 13067: //case 0xd1: break; 13068: //case 0xd2: break; 13069: //case 0xd3: break; 13070: //case 0xd4: break; 13071: //case 0xd5: break; 13072: //case 0xd6: break; 13073: //case 0xd7: break; 13074: //case 0xd8: break; 13075: //case 0xd9: break; 13076: //case 0xda: break; 13077: //case 0xdb: break; 13078: //case 0xdc: break; 13079: //case 0xdd: break; 13080: //case 0xde: break; 13081: //case 0xdf: break; 13082: case 0xe0: FEFunction.fpkCLMUL (); break; 13083: case 0xe1: FEFunction.fpkCLDIV (); break; 13084: case 0xe2: FEFunction.fpkCLMOD (); break; 13085: case 0xe3: FEFunction.fpkCUMUL (); break; 13086: case 0xe4: FEFunction.fpkCUDIV (); break; 13087: case 0xe5: FEFunction.fpkCUMOD (); break; 13088: case 0xe6: FEFunction.fpkCLTOD (); break; 13089: case 0xe7: FEFunction.fpkCDTOL (); break; 13090: case 0xe8: FEFunction.fpkCLTOF (); break; 13091: case 0xe9: FEFunction.fpkCFTOL (); break; 13092: case 0xea: FEFunction.fpkCFTOD (); break; 13093: case 0xeb: FEFunction.fpkCDTOF (); break; 13094: case 0xec: FEFunction.fpkCDCMP (); break; 13095: case 0xed: FEFunction.fpkCDADD (); break; 13096: case 0xee: FEFunction.fpkCDSUB (); break; 13097: case 0xef: FEFunction.fpkCDMUL (); break; 13098: case 0xf0: FEFunction.fpkCDDIV (); break; 13099: case 0xf1: FEFunction.fpkCDMOD (); break; 13100: case 0xf2: FEFunction.fpkCFCMP (); break; 13101: case 0xf3: FEFunction.fpkCFADD (); break; 13102: case 0xf4: FEFunction.fpkCFSUB (); break; 13103: case 0xf5: FEFunction.fpkCFMUL (); break; 13104: case 0xf6: FEFunction.fpkCFDIV (); break; 13105: case 0xf7: FEFunction.fpkCFMOD (); break; 13106: case 0xf8: FEFunction.fpkCDTST (); break; 13107: case 0xf9: FEFunction.fpkCFTST (); break; 13108: case 0xfa: FEFunction.fpkCDINC (); break; 13109: case 0xfb: FEFunction.fpkCFINC (); break; 13110: case 0xfc: FEFunction.fpkCDDEC (); break; 13111: case 0xfd: FEFunction.fpkCFDEC (); break; 13112: case 0xfe: FEFunction.fpkFEVARG (); break; 13113: //case 0xff: FEFunction.fpkFEVECS (); break; //FLOATn.Xに処理させる 13114: default: 13115: XEiJ.mpuCycleCount -= FEFunction.FPK_CLOCK; //戻す 13116: irpFline (); 13117: } 13118: if (FEFunction.FPK_DEBUG_TRACE) { 13119: int i = sb.length (); 13120: 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]); 13121: int l = MainMemory.mmrStrlen (a0, 20); 13122: sb.append (" (A0)=\""); 13123: i = sb.length () - i; 13124: MainMemory.mmrRstr (sb, a0, l).append ("\"\n"); 13125: if (a0 <= XEiJ.regRn[8] && XEiJ.regRn[8] <= a0 + l) { 13126: for (i += sb.length () + XEiJ.regRn[8] - a0; sb.length () < i; ) { 13127: sb.append (' '); 13128: } 13129: sb.append ('^'); 13130: } 13131: System.out.println (sb.toString ()); 13132: } 13133: } //irpFpack 13134: 13135: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13136: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13137: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13138: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13139: //DOS <data> |A|012346|-|UUUUU|UUUUU| |1111_111_1dd_ddd_ddd [FLINE #<data>] 13140: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13141: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13142: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13143: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13144: //FLINE #<data> |-|012346|-|UUUUU|UUUUU| |1111_ddd_ddd_ddd_ddd (line 1111 emulator) 13145: public static void irpFline () throws M68kException { 13146: XEiJ.mpuCycleCount += 34; 13147: if (XEiJ.MPU_INLINE_EXCEPTION) { 13148: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 13149: int sp = XEiJ.regRn[15]; 13150: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 13151: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13152: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13153: XEiJ.mpuUSP = sp; //USPを保存 13154: sp = XEiJ.mpuISP; //SSPを復元 13155: if (DataBreakPoint.DBP_ON) { 13156: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13157: } else { 13158: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13159: } 13160: if (InstructionBreakPoint.IBP_ON) { 13161: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13162: } 13163: } 13164: XEiJ.regRn[15] = sp -= 6; 13165: XEiJ.busWl (sp + 2, XEiJ.regPC0); //pushl。pcをプッシュする 13166: XEiJ.busWw (sp, save_sr); //pushw。srをプッシュする 13167: irpSetPC (XEiJ.busRlsf (M68kException.M6E_LINE_1111_EMULATOR << 2)); //例外ベクタを取り出してジャンプする 13168: } else { 13169: irpException (M68kException.M6E_LINE_1111_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは命令の先頭 13170: } 13171: } //irpFline 13172: 13173: //irpIllegal () 13174: // オペコードの上位10bitで分類されなかった未実装命令 13175: // 0x4afcのILLEGAL命令はここには来ない 13176: public static void irpIllegal () throws M68kException { 13177: if (true) { 13178: XEiJ.mpuCycleCount += 34; 13179: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13180: throw M68kException.m6eSignal; 13181: } 13182: } //irpIllegal 13183: 13184: //z = irpAbcd (x, y) 13185: // ABCD 13186: public static int irpAbcd (int x, int y) { 13187: int c = XEiJ.regCCR >> 4; 13188: int t = (x & 0xff) + (y & 0xff) + c; //仮の結果 13189: int z = t; //結果 13190: if (0x0a <= (x & 0x0f) + (y & 0x0f) + c) { //ハーフキャリー 13191: z += 0x10 - 0x0a; 13192: } 13193: //XとCはキャリーがあるときセット、さもなくばクリア 13194: if (0xa0 <= z) { //キャリー 13195: z += 0x100 - 0xa0; 13196: XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C; 13197: } else { 13198: XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); 13199: } 13200: //Zは結果が0でないときクリア、さもなくば変化しない 13201: z &= 0xff; 13202: if (z != 0x00) { 13203: XEiJ.regCCR &= ~XEiJ.REG_CCR_Z; 13204: } 13205: if (true) { 13206: //000/030のときNは結果の最上位ビット 13207: if ((z & 0x80) != 0) { 13208: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13209: } else { 13210: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13211: } 13212: //000のときVは補正値の加算でオーバーフローしたときセット、さもなくばクリア 13213: int a = z - t; //補正値 13214: if ((((t ^ z) & (a ^ z)) & 0x80) != 0) { 13215: XEiJ.regCCR |= XEiJ.REG_CCR_V; 13216: } else { 13217: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13218: } 13219: } else if (false) { 13220: //000/030のときNは結果の最上位ビット 13221: if ((z & 0x80) != 0) { 13222: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13223: } else { 13224: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13225: } 13226: //030のときVはクリア 13227: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13228: } else { 13229: //060のときNとVは変化しない 13230: } 13231: return z; 13232: } //irpAbcd 13233: 13234: //z = irpSbcd (x, y) 13235: // SBCD 13236: public static int irpSbcd (int x, int y) { 13237: int b = XEiJ.regCCR >> 4; 13238: int t = (x & 0xff) - (y & 0xff) - b; //仮の結果 13239: int z = t; //結果 13240: if ((x & 0x0f) - (y & 0x0f) - b < 0) { //ハーフボロー 13241: z -= 0x10 - 0x0a; 13242: } 13243: //XとCはボローがあるときセット、さもなくばクリア 13244: if (z < 0) { //ボロー 13245: if (t < 0) { 13246: z -= 0x100 - 0xa0; 13247: } 13248: XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C; 13249: } else { 13250: XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); 13251: } 13252: //Zは結果が0でないときクリア、さもなくば変化しない 13253: z &= 0xff; 13254: if (z != 0x00) { 13255: XEiJ.regCCR &= ~XEiJ.REG_CCR_Z; 13256: } 13257: if (true) { 13258: //000/030のときNは結果の最上位ビット 13259: if ((z & 0x80) != 0) { 13260: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13261: } else { 13262: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13263: } 13264: //000のときVは補正値の減算でオーバーフローしたときセット、さもなくばクリア 13265: int a = t - z; //補正値 13266: if ((((t & (a ^ z)) ^ (a | z)) & 0x80) != 0) { 13267: XEiJ.regCCR |= XEiJ.REG_CCR_V; 13268: } else { 13269: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13270: } 13271: } else if (false) { 13272: //000/030のときNは結果の最上位ビット 13273: if ((z & 0x80) != 0) { 13274: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13275: } else { 13276: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13277: } 13278: //030のときVはクリア 13279: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13280: } else { 13281: //060のときNとVは変化しない 13282: } 13283: return z; 13284: } //irpSbcd 13285: 13286: 13287: 13288: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13289: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13290: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13291: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13292: //HFSBOOT |-|012346|-|-----|-----| |0100_111_000_000_000 13293: //HFSINST |-|012346|-|-----|-----| |0100_111_000_000_001 13294: //HFSSTR |-|012346|-|-----|-----| |0100_111_000_000_010 13295: //HFSINT |-|012346|-|-----|-----| |0100_111_000_000_011 13296: //EMXNOP |-|012346|-|-----|-----| |0100_111_000_000_100 13297: // エミュレータ拡張命令 13298: public static void irpEmx () throws M68kException { 13299: switch (XEiJ.regOC & 63) { 13300: case XEiJ.EMX_OPCODE_HFSBOOT & 63: 13301: XEiJ.mpuCycleCount += 40; 13302: if (HFS.hfsIPLBoot ()) { 13303: //JMP $6800.W 13304: irpSetPC (0x00006800); 13305: } 13306: break; 13307: case XEiJ.EMX_OPCODE_HFSINST & 63: 13308: XEiJ.mpuCycleCount += 40; 13309: HFS.hfsInstall (); 13310: break; 13311: case XEiJ.EMX_OPCODE_HFSSTR & 63: 13312: XEiJ.mpuCycleCount += 40; 13313: HFS.hfsStrategy (); 13314: break; 13315: case XEiJ.EMX_OPCODE_HFSINT & 63: 13316: XEiJ.mpuCycleCount += 40; 13317: //XEiJ.mpuClockTime += (int) (TMR_FREQ / 100000L); //0.01ms 13318: if (HFS.hfsInterrupt ()) { 13319: //WAIT 13320: XEiJ.mpuTraceFlag = 0; //トレース例外を発生させない 13321: XEiJ.regPC = XEiJ.regPC0; //ループ 13322: XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000; //4μs。10MHzのとき40clk 13323: XEiJ.mpuLastNano += 4000L; 13324: } 13325: break; 13326: case XEiJ.EMX_OPCODE_EMXNOP & 63: 13327: XEiJ.emxNop (); 13328: break; 13329: default: 13330: XEiJ.mpuCycleCount += 34; 13331: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13332: throw M68kException.m6eSignal; 13333: } 13334: } //irpEmx 13335: 13336: 13337: 13338: //irpSetPC (a) 13339: // pcへデータを書き込む 13340: // 奇数のときはアドレスエラーが発生する 13341: public static void irpSetPC (int a) throws M68kException { 13342: if (XEiJ.TEST_BIT_0_SHIFT ? a << 31 - 0 < 0 : (a & 1) != 0) { 13343: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 13344: M68kException.m6eAddress = a; 13345: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 13346: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 13347: throw M68kException.m6eSignal; 13348: } 13349: if (BranchLog.BLG_ON) { 13350: //BranchLog.blgJump (a); //分岐ログに分岐レコードを追加する 13351: if (BranchLog.blgPrevHeadSuper != (BranchLog.blgHead | BranchLog.blgSuper) || BranchLog.blgPrevTail != XEiJ.regPC0) { //前回のレコードと異なるとき 13352: int i = (char) BranchLog.blgNewestRecord++ << BranchLog.BLG_RECORD_SHIFT; 13353: BranchLog.blgArray[i] = BranchLog.blgPrevHeadSuper = BranchLog.blgHead | BranchLog.blgSuper; 13354: BranchLog.blgArray[i + 1] = BranchLog.blgPrevTail = XEiJ.regPC0; 13355: } 13356: BranchLog.blgHead = XEiJ.regPC = a; 13357: BranchLog.blgSuper = XEiJ.regSRS >>> 13; 13358: } else { 13359: XEiJ.regPC = a; 13360: } 13361: } //irpSetPC 13362: 13363: //irpSetSR (newSr) 13364: // srへデータを書き込む 13365: // ori to sr/andi to sr/eori to sr/move to sr/stop/rteで使用される 13366: // スーパーバイザモードになっていることを確認してから呼び出すこと 13367: // rteではr[15]が指すアドレスからsrとpcを取り出してr[15]を更新してから呼び出すこと 13368: // スーパーバイザモード→ユーザモードのときは移行のための処理を行う 13369: // 新しい割り込みマスクレベルよりも高い割り込み処理の終了をデバイスに通知する 13370: public static void irpSetSR (int newSr) { 13371: XEiJ.regSRT1 = XEiJ.REG_SR_T1 & newSr; 13372: if ((XEiJ.regSRS = XEiJ.REG_SR_S & newSr) == 0) { //スーパーバイザモード→ユーザモード 13373: XEiJ.mpuISP = XEiJ.regRn[15]; //XEiJ.mpuISPを保存 13374: XEiJ.regRn[15] = XEiJ.mpuUSP; //XEiJ.mpuUSPを復元 13375: if (DataBreakPoint.DBP_ON) { 13376: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpUserMap; //ユーザメモリマップに切り替える 13377: } else { 13378: XEiJ.busMemoryMap = XEiJ.busUserMap; //ユーザメモリマップに切り替える 13379: } 13380: if (InstructionBreakPoint.IBP_ON) { 13381: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1UserMap; 13382: } 13383: } 13384: int t = (XEiJ.mpuIMR = 0x7f >> ((XEiJ.regSRI = XEiJ.REG_SR_I & newSr) >> 8)) & XEiJ.mpuISR; //XEiJ.mpuISRで1→0とするビット 13385: if (t != 0) { //終了する割り込みがあるとき 13386: XEiJ.mpuISR ^= t; 13387: //デバイスに割り込み処理の終了を通知する 13388: if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) { //MFPのみ 13389: MC68901.mfpDone (); 13390: } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) { //DMAのみ 13391: HD63450.dmaDone (); 13392: } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) { //SCCのみ 13393: Z8530.sccDone (); 13394: } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) { //IOIのみ 13395: IOInterrupt.ioiDone (); 13396: } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) { //EB2のみ 13397: XEiJ.eb2Done (); 13398: } else { //SYSのみまたは複数 13399: if (XEiJ.TEST_BIT_1_SHIFT ? t << 24 + XEiJ.MPU_MFP_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_MFP_INTERRUPT_MASK) != 0) { 13400: MC68901.mfpDone (); 13401: } 13402: if (t << 24 + XEiJ.MPU_DMA_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_DMA_INTERRUPT_MASK) != 0 13403: HD63450.dmaDone (); 13404: } 13405: if (XEiJ.TEST_BIT_2_SHIFT ? t << 24 + XEiJ.MPU_SCC_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SCC_INTERRUPT_MASK) != 0) { 13406: Z8530.sccDone (); 13407: } 13408: if (t << 24 + XEiJ.MPU_IOI_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_IOI_INTERRUPT_MASK) != 0 13409: IOInterrupt.ioiDone (); 13410: } 13411: if (t << 24 + XEiJ.MPU_EB2_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_EB2_INTERRUPT_MASK) != 0 13412: XEiJ.eb2Done (); 13413: } 13414: if (XEiJ.TEST_BIT_0_SHIFT ? t << 24 + XEiJ.MPU_SYS_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SYS_INTERRUPT_MASK) != 0) { 13415: XEiJ.sysDone (); 13416: } 13417: } 13418: } 13419: XEiJ.mpuIMR |= ~XEiJ.mpuISR & XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みマスクレベルが7のときレベル7割り込みの処理中でなければレベル7割り込みを許可する 13420: XEiJ.regCCR = XEiJ.REG_CCR_MASK & newSr; 13421: } //irpSetSR 13422: 13423: //irpInterrupt (vectorNumber, level) 13424: // 割り込み処理を開始する 13425: public static void irpInterrupt (int vectorNumber, int level) throws M68kException { 13426: if (XEiJ.regOC == 0b0100_111_001_110_010) { //最後に実行した命令はSTOP命令 13427: XEiJ.regPC = XEiJ.regPC0 + 4; //次の命令に進む 13428: } 13429: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * 44; 13430: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 13431: XEiJ.regSRI = level << 8; //割り込みマスクを要求されたレベルに変更する 13432: XEiJ.mpuIMR = 0x7f >> level; 13433: XEiJ.mpuISR |= 0x80 >> level; 13434: int sp = XEiJ.regRn[15]; 13435: XEiJ.regSRT1 = 0; //srのTビットを消す 13436: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13437: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13438: XEiJ.mpuUSP = sp; //USPを保存 13439: sp = XEiJ.mpuISP; //SSPを復元 13440: if (DataBreakPoint.DBP_ON) { 13441: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13442: } else { 13443: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13444: } 13445: if (InstructionBreakPoint.IBP_ON) { 13446: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13447: } 13448: } 13449: XEiJ.regRn[15] = sp -= 6; 13450: XEiJ.busWl (sp + 2, XEiJ.regPC); //pushl。pcをプッシュする 13451: XEiJ.busWw (sp, save_sr); //pushw。srをプッシュする 13452: if (BranchLog.BLG_ON) { 13453: XEiJ.regPC0 = XEiJ.regPC; //rteによる割り込み終了と同時に次の割り込みを受け付けたとき間でpc0を更新しないと2番目の分岐レコードの終了アドレスが1番目と同じになっておかしな分岐レコードができてしまう 13454: } 13455: irpSetPC (XEiJ.busRlsf (vectorNumber << 2)); //例外ベクタを取り出してジャンプする 13456: } //irpInterrupt 13457: 13458: //irpException (vectorNumber, save_pc, save_sr) 13459: // 例外処理を開始する 13460: // スタックへのプッシュ、ベクタの取り出し、ジャンプのいずれかでバスエラーまたはアドレスエラーが発生する場合がある 13461: public static void irpException (int vectorNumber, int save_pc, int save_sr) throws M68kException { 13462: int sp = XEiJ.regRn[15]; 13463: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 13464: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13465: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13466: XEiJ.mpuUSP = sp; //USPを保存 13467: sp = XEiJ.mpuISP; //SSPを復元 13468: if (DataBreakPoint.DBP_ON) { 13469: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13470: } else { 13471: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13472: } 13473: if (InstructionBreakPoint.IBP_ON) { 13474: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13475: } 13476: } 13477: XEiJ.regRn[15] = sp -= 6; 13478: XEiJ.busWl (sp + 2, save_pc); //pushl。pcをプッシュする 13479: XEiJ.busWw (sp, save_sr); //pushw。srをプッシュする 13480: irpSetPC (XEiJ.busRlsf (vectorNumber << 2)); //例外ベクタを取り出してジャンプする 13481: } //irpException 13482: 13483: 13484: 13485: //a = efaAnyByte (ea) //| M+-WXZPI| 13486: // 任意のモードのバイトオペランドの実効アドレスを求める 13487: // (A7)+と-(A7)はA7を奇偶に関わらず2変化させ、跨いだワードの上位バイト(アドレスの小さい方)を参照する 13488: // #<data>はオペコードに続くワードの下位バイトを参照する。上位バイトは不定なので参照してはならない 13489: @SuppressWarnings ("fallthrough") public static int efaAnyByte (int ea) throws M68kException { 13490: int t, w; 13491: switch (ea) { 13492: case 0b010_000: //(A0) 13493: if (XEiJ.EFA_SEPARATE_AR) { 13494: XEiJ.mpuCycleCount += 4; 13495: return XEiJ.regRn[ 8]; 13496: } 13497: //fallthrough 13498: case 0b010_001: //(A1) 13499: if (XEiJ.EFA_SEPARATE_AR) { 13500: XEiJ.mpuCycleCount += 4; 13501: return XEiJ.regRn[ 9]; 13502: } 13503: //fallthrough 13504: case 0b010_010: //(A2) 13505: if (XEiJ.EFA_SEPARATE_AR) { 13506: XEiJ.mpuCycleCount += 4; 13507: return XEiJ.regRn[10]; 13508: } 13509: //fallthrough 13510: case 0b010_011: //(A3) 13511: if (XEiJ.EFA_SEPARATE_AR) { 13512: XEiJ.mpuCycleCount += 4; 13513: return XEiJ.regRn[11]; 13514: } 13515: //fallthrough 13516: case 0b010_100: //(A4) 13517: if (XEiJ.EFA_SEPARATE_AR) { 13518: XEiJ.mpuCycleCount += 4; 13519: return XEiJ.regRn[12]; 13520: } 13521: //fallthrough 13522: case 0b010_101: //(A5) 13523: if (XEiJ.EFA_SEPARATE_AR) { 13524: XEiJ.mpuCycleCount += 4; 13525: return XEiJ.regRn[13]; 13526: } 13527: //fallthrough 13528: case 0b010_110: //(A6) 13529: if (XEiJ.EFA_SEPARATE_AR) { 13530: XEiJ.mpuCycleCount += 4; 13531: return XEiJ.regRn[14]; 13532: } 13533: //fallthrough 13534: case 0b010_111: //(A7) 13535: if (XEiJ.EFA_SEPARATE_AR) { 13536: XEiJ.mpuCycleCount += 4; 13537: return XEiJ.regRn[15]; 13538: } else { 13539: XEiJ.mpuCycleCount += 4; 13540: return XEiJ.regRn[ea - (0b010_000 - 8)]; 13541: } 13542: case 0b011_000: //(A0)+ 13543: if (XEiJ.EFA_SEPARATE_AR) { 13544: XEiJ.mpuCycleCount += 4; 13545: return XEiJ.regRn[ 8]++; 13546: } 13547: //fallthrough 13548: case 0b011_001: //(A1)+ 13549: if (XEiJ.EFA_SEPARATE_AR) { 13550: XEiJ.mpuCycleCount += 4; 13551: return XEiJ.regRn[ 9]++; 13552: } 13553: //fallthrough 13554: case 0b011_010: //(A2)+ 13555: if (XEiJ.EFA_SEPARATE_AR) { 13556: XEiJ.mpuCycleCount += 4; 13557: return XEiJ.regRn[10]++; 13558: } 13559: //fallthrough 13560: case 0b011_011: //(A3)+ 13561: if (XEiJ.EFA_SEPARATE_AR) { 13562: XEiJ.mpuCycleCount += 4; 13563: return XEiJ.regRn[11]++; 13564: } 13565: //fallthrough 13566: case 0b011_100: //(A4)+ 13567: if (XEiJ.EFA_SEPARATE_AR) { 13568: XEiJ.mpuCycleCount += 4; 13569: return XEiJ.regRn[12]++; 13570: } 13571: //fallthrough 13572: case 0b011_101: //(A5)+ 13573: if (XEiJ.EFA_SEPARATE_AR) { 13574: XEiJ.mpuCycleCount += 4; 13575: return XEiJ.regRn[13]++; 13576: } 13577: //fallthrough 13578: case 0b011_110: //(A6)+ 13579: if (XEiJ.EFA_SEPARATE_AR) { 13580: XEiJ.mpuCycleCount += 4; 13581: return XEiJ.regRn[14]++; 13582: } else { 13583: XEiJ.mpuCycleCount += 4; 13584: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 13585: } 13586: case 0b011_111: //(A7)+ 13587: XEiJ.mpuCycleCount += 4; 13588: return (XEiJ.regRn[15] += 2) - 2; 13589: case 0b100_000: //-(A0) 13590: if (XEiJ.EFA_SEPARATE_AR) { 13591: XEiJ.mpuCycleCount += 6; 13592: return --XEiJ.regRn[ 8]; 13593: } 13594: //fallthrough 13595: case 0b100_001: //-(A1) 13596: if (XEiJ.EFA_SEPARATE_AR) { 13597: XEiJ.mpuCycleCount += 6; 13598: return --XEiJ.regRn[ 9]; 13599: } 13600: //fallthrough 13601: case 0b100_010: //-(A2) 13602: if (XEiJ.EFA_SEPARATE_AR) { 13603: XEiJ.mpuCycleCount += 6; 13604: return --XEiJ.regRn[10]; 13605: } 13606: //fallthrough 13607: case 0b100_011: //-(A3) 13608: if (XEiJ.EFA_SEPARATE_AR) { 13609: XEiJ.mpuCycleCount += 6; 13610: return --XEiJ.regRn[11]; 13611: } 13612: //fallthrough 13613: case 0b100_100: //-(A4) 13614: if (XEiJ.EFA_SEPARATE_AR) { 13615: XEiJ.mpuCycleCount += 6; 13616: return --XEiJ.regRn[12]; 13617: } 13618: //fallthrough 13619: case 0b100_101: //-(A5) 13620: if (XEiJ.EFA_SEPARATE_AR) { 13621: XEiJ.mpuCycleCount += 6; 13622: return --XEiJ.regRn[13]; 13623: } 13624: //fallthrough 13625: case 0b100_110: //-(A6) 13626: if (XEiJ.EFA_SEPARATE_AR) { 13627: XEiJ.mpuCycleCount += 6; 13628: return --XEiJ.regRn[14]; 13629: } else { 13630: XEiJ.mpuCycleCount += 6; 13631: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 13632: } 13633: case 0b100_111: //-(A7) 13634: XEiJ.mpuCycleCount += 6; 13635: return XEiJ.regRn[15] -= 2; 13636: case 0b101_000: //(d16,A0) 13637: case 0b101_001: //(d16,A1) 13638: case 0b101_010: //(d16,A2) 13639: case 0b101_011: //(d16,A3) 13640: case 0b101_100: //(d16,A4) 13641: case 0b101_101: //(d16,A5) 13642: case 0b101_110: //(d16,A6) 13643: case 0b101_111: //(d16,A7) 13644: XEiJ.mpuCycleCount += 8; 13645: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 13646: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 13647: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 13648: } else { 13649: t = XEiJ.regPC; 13650: XEiJ.regPC = t + 2; 13651: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 13652: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 13653: } 13654: case 0b110_000: //(d8,A0,Rn.wl) 13655: case 0b110_001: //(d8,A1,Rn.wl) 13656: case 0b110_010: //(d8,A2,Rn.wl) 13657: case 0b110_011: //(d8,A3,Rn.wl) 13658: case 0b110_100: //(d8,A4,Rn.wl) 13659: case 0b110_101: //(d8,A5,Rn.wl) 13660: case 0b110_110: //(d8,A6,Rn.wl) 13661: case 0b110_111: //(d8,A7,Rn.wl) 13662: XEiJ.mpuCycleCount += 10; 13663: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 13664: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 13665: } else { 13666: w = XEiJ.regPC; 13667: XEiJ.regPC = w + 2; 13668: w = XEiJ.busRwze (w); //pcwz。拡張ワード 13669: } 13670: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 13671: + (byte) w //バイトディスプレースメント 13672: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 13673: XEiJ.regRn[w >> 12])); //ロングインデックス 13674: case 0b111_000: //(xxx).W 13675: XEiJ.mpuCycleCount += 8; 13676: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 13677: case 0b111_001: //(xxx).L 13678: XEiJ.mpuCycleCount += 12; 13679: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 13680: case 0b111_010: //(d16,PC) 13681: XEiJ.mpuCycleCount += 8; 13682: t = XEiJ.regPC; 13683: XEiJ.regPC = t + 2; 13684: return (t //ベースレジスタ 13685: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 13686: case 0b111_011: //(d8,PC,Rn.wl) 13687: XEiJ.mpuCycleCount += 10; 13688: t = XEiJ.regPC; 13689: XEiJ.regPC = t + 2; 13690: w = XEiJ.busRwze (t); //pcwz。拡張ワード 13691: return (t //ベースレジスタ 13692: + (byte) w //バイトディスプレースメント 13693: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 13694: XEiJ.regRn[w >> 12])); //ロングインデックス 13695: case 0b111_100: //#<data> 13696: XEiJ.mpuCycleCount += 4; 13697: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 13698: return (XEiJ.regPC += 2) - 1; //下位バイト 13699: } else { 13700: t = XEiJ.regPC; 13701: XEiJ.regPC = t + 2; 13702: return t + 1; //下位バイト 13703: } 13704: } //switch 13705: XEiJ.mpuCycleCount += 34; 13706: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13707: throw M68kException.m6eSignal; 13708: } //efaAnyByte 13709: 13710: //a = efaMemByte (ea) //| M+-WXZP | 13711: // メモリモードのバイトオペランドの実効アドレスを求める 13712: // efaAnyByteとの違いは#<data>がないこと 13713: @SuppressWarnings ("fallthrough") public static int efaMemByte (int ea) throws M68kException { 13714: int t, w; 13715: switch (ea) { 13716: case 0b010_000: //(A0) 13717: if (XEiJ.EFA_SEPARATE_AR) { 13718: XEiJ.mpuCycleCount += 4; 13719: return XEiJ.regRn[ 8]; 13720: } 13721: //fallthrough 13722: case 0b010_001: //(A1) 13723: if (XEiJ.EFA_SEPARATE_AR) { 13724: XEiJ.mpuCycleCount += 4; 13725: return XEiJ.regRn[ 9]; 13726: } 13727: //fallthrough 13728: case 0b010_010: //(A2) 13729: if (XEiJ.EFA_SEPARATE_AR) { 13730: XEiJ.mpuCycleCount += 4; 13731: return XEiJ.regRn[10]; 13732: } 13733: //fallthrough 13734: case 0b010_011: //(A3) 13735: if (XEiJ.EFA_SEPARATE_AR) { 13736: XEiJ.mpuCycleCount += 4; 13737: return XEiJ.regRn[11]; 13738: } 13739: //fallthrough 13740: case 0b010_100: //(A4) 13741: if (XEiJ.EFA_SEPARATE_AR) { 13742: XEiJ.mpuCycleCount += 4; 13743: return XEiJ.regRn[12]; 13744: } 13745: //fallthrough 13746: case 0b010_101: //(A5) 13747: if (XEiJ.EFA_SEPARATE_AR) { 13748: XEiJ.mpuCycleCount += 4; 13749: return XEiJ.regRn[13]; 13750: } 13751: //fallthrough 13752: case 0b010_110: //(A6) 13753: if (XEiJ.EFA_SEPARATE_AR) { 13754: XEiJ.mpuCycleCount += 4; 13755: return XEiJ.regRn[14]; 13756: } 13757: //fallthrough 13758: case 0b010_111: //(A7) 13759: if (XEiJ.EFA_SEPARATE_AR) { 13760: XEiJ.mpuCycleCount += 4; 13761: return XEiJ.regRn[15]; 13762: } else { 13763: XEiJ.mpuCycleCount += 4; 13764: return XEiJ.regRn[ea - (0b010_000 - 8)]; 13765: } 13766: case 0b011_000: //(A0)+ 13767: if (XEiJ.EFA_SEPARATE_AR) { 13768: XEiJ.mpuCycleCount += 4; 13769: return XEiJ.regRn[ 8]++; 13770: } 13771: //fallthrough 13772: case 0b011_001: //(A1)+ 13773: if (XEiJ.EFA_SEPARATE_AR) { 13774: XEiJ.mpuCycleCount += 4; 13775: return XEiJ.regRn[ 9]++; 13776: } 13777: //fallthrough 13778: case 0b011_010: //(A2)+ 13779: if (XEiJ.EFA_SEPARATE_AR) { 13780: XEiJ.mpuCycleCount += 4; 13781: return XEiJ.regRn[10]++; 13782: } 13783: //fallthrough 13784: case 0b011_011: //(A3)+ 13785: if (XEiJ.EFA_SEPARATE_AR) { 13786: XEiJ.mpuCycleCount += 4; 13787: return XEiJ.regRn[11]++; 13788: } 13789: //fallthrough 13790: case 0b011_100: //(A4)+ 13791: if (XEiJ.EFA_SEPARATE_AR) { 13792: XEiJ.mpuCycleCount += 4; 13793: return XEiJ.regRn[12]++; 13794: } 13795: //fallthrough 13796: case 0b011_101: //(A5)+ 13797: if (XEiJ.EFA_SEPARATE_AR) { 13798: XEiJ.mpuCycleCount += 4; 13799: return XEiJ.regRn[13]++; 13800: } 13801: //fallthrough 13802: case 0b011_110: //(A6)+ 13803: if (XEiJ.EFA_SEPARATE_AR) { 13804: XEiJ.mpuCycleCount += 4; 13805: return XEiJ.regRn[14]++; 13806: } else { 13807: XEiJ.mpuCycleCount += 4; 13808: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 13809: } 13810: case 0b011_111: //(A7)+ 13811: XEiJ.mpuCycleCount += 4; 13812: return (XEiJ.regRn[15] += 2) - 2; 13813: case 0b100_000: //-(A0) 13814: if (XEiJ.EFA_SEPARATE_AR) { 13815: XEiJ.mpuCycleCount += 6; 13816: return --XEiJ.regRn[ 8]; 13817: } 13818: //fallthrough 13819: case 0b100_001: //-(A1) 13820: if (XEiJ.EFA_SEPARATE_AR) { 13821: XEiJ.mpuCycleCount += 6; 13822: return --XEiJ.regRn[ 9]; 13823: } 13824: //fallthrough 13825: case 0b100_010: //-(A2) 13826: if (XEiJ.EFA_SEPARATE_AR) { 13827: XEiJ.mpuCycleCount += 6; 13828: return --XEiJ.regRn[10]; 13829: } 13830: //fallthrough 13831: case 0b100_011: //-(A3) 13832: if (XEiJ.EFA_SEPARATE_AR) { 13833: XEiJ.mpuCycleCount += 6; 13834: return --XEiJ.regRn[11]; 13835: } 13836: //fallthrough 13837: case 0b100_100: //-(A4) 13838: if (XEiJ.EFA_SEPARATE_AR) { 13839: XEiJ.mpuCycleCount += 6; 13840: return --XEiJ.regRn[12]; 13841: } 13842: //fallthrough 13843: case 0b100_101: //-(A5) 13844: if (XEiJ.EFA_SEPARATE_AR) { 13845: XEiJ.mpuCycleCount += 6; 13846: return --XEiJ.regRn[13]; 13847: } 13848: //fallthrough 13849: case 0b100_110: //-(A6) 13850: if (XEiJ.EFA_SEPARATE_AR) { 13851: XEiJ.mpuCycleCount += 6; 13852: return --XEiJ.regRn[14]; 13853: } else { 13854: XEiJ.mpuCycleCount += 6; 13855: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 13856: } 13857: case 0b100_111: //-(A7) 13858: XEiJ.mpuCycleCount += 6; 13859: return XEiJ.regRn[15] -= 2; 13860: case 0b101_000: //(d16,A0) 13861: case 0b101_001: //(d16,A1) 13862: case 0b101_010: //(d16,A2) 13863: case 0b101_011: //(d16,A3) 13864: case 0b101_100: //(d16,A4) 13865: case 0b101_101: //(d16,A5) 13866: case 0b101_110: //(d16,A6) 13867: case 0b101_111: //(d16,A7) 13868: XEiJ.mpuCycleCount += 8; 13869: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 13870: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 13871: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 13872: } else { 13873: t = XEiJ.regPC; 13874: XEiJ.regPC = t + 2; 13875: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 13876: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 13877: } 13878: case 0b110_000: //(d8,A0,Rn.wl) 13879: case 0b110_001: //(d8,A1,Rn.wl) 13880: case 0b110_010: //(d8,A2,Rn.wl) 13881: case 0b110_011: //(d8,A3,Rn.wl) 13882: case 0b110_100: //(d8,A4,Rn.wl) 13883: case 0b110_101: //(d8,A5,Rn.wl) 13884: case 0b110_110: //(d8,A6,Rn.wl) 13885: case 0b110_111: //(d8,A7,Rn.wl) 13886: XEiJ.mpuCycleCount += 10; 13887: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 13888: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 13889: } else { 13890: w = XEiJ.regPC; 13891: XEiJ.regPC = w + 2; 13892: w = XEiJ.busRwze (w); //pcwz。拡張ワード 13893: } 13894: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 13895: + (byte) w //バイトディスプレースメント 13896: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 13897: XEiJ.regRn[w >> 12])); //ロングインデックス 13898: case 0b111_000: //(xxx).W 13899: XEiJ.mpuCycleCount += 8; 13900: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 13901: case 0b111_001: //(xxx).L 13902: XEiJ.mpuCycleCount += 12; 13903: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 13904: case 0b111_010: //(d16,PC) 13905: XEiJ.mpuCycleCount += 8; 13906: t = XEiJ.regPC; 13907: XEiJ.regPC = t + 2; 13908: return (t //ベースレジスタ 13909: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 13910: case 0b111_011: //(d8,PC,Rn.wl) 13911: XEiJ.mpuCycleCount += 10; 13912: t = XEiJ.regPC; 13913: XEiJ.regPC = t + 2; 13914: w = XEiJ.busRwze (t); //pcwz。拡張ワード 13915: return (t //ベースレジスタ 13916: + (byte) w //バイトディスプレースメント 13917: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 13918: XEiJ.regRn[w >> 12])); //ロングインデックス 13919: } //switch 13920: XEiJ.mpuCycleCount += 34; 13921: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13922: throw M68kException.m6eSignal; 13923: } //efaMemByte 13924: 13925: //a = efaMltByte (ea) //| M+-WXZ | 13926: // メモリ可変モードのバイトオペランドの実効アドレスを求める 13927: // efaMemByteとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 13928: @SuppressWarnings ("fallthrough") public static int efaMltByte (int ea) throws M68kException { 13929: int t, w; 13930: switch (ea) { 13931: case 0b010_000: //(A0) 13932: if (XEiJ.EFA_SEPARATE_AR) { 13933: XEiJ.mpuCycleCount += 4; 13934: return XEiJ.regRn[ 8]; 13935: } 13936: //fallthrough 13937: case 0b010_001: //(A1) 13938: if (XEiJ.EFA_SEPARATE_AR) { 13939: XEiJ.mpuCycleCount += 4; 13940: return XEiJ.regRn[ 9]; 13941: } 13942: //fallthrough 13943: case 0b010_010: //(A2) 13944: if (XEiJ.EFA_SEPARATE_AR) { 13945: XEiJ.mpuCycleCount += 4; 13946: return XEiJ.regRn[10]; 13947: } 13948: //fallthrough 13949: case 0b010_011: //(A3) 13950: if (XEiJ.EFA_SEPARATE_AR) { 13951: XEiJ.mpuCycleCount += 4; 13952: return XEiJ.regRn[11]; 13953: } 13954: //fallthrough 13955: case 0b010_100: //(A4) 13956: if (XEiJ.EFA_SEPARATE_AR) { 13957: XEiJ.mpuCycleCount += 4; 13958: return XEiJ.regRn[12]; 13959: } 13960: //fallthrough 13961: case 0b010_101: //(A5) 13962: if (XEiJ.EFA_SEPARATE_AR) { 13963: XEiJ.mpuCycleCount += 4; 13964: return XEiJ.regRn[13]; 13965: } 13966: //fallthrough 13967: case 0b010_110: //(A6) 13968: if (XEiJ.EFA_SEPARATE_AR) { 13969: XEiJ.mpuCycleCount += 4; 13970: return XEiJ.regRn[14]; 13971: } 13972: //fallthrough 13973: case 0b010_111: //(A7) 13974: if (XEiJ.EFA_SEPARATE_AR) { 13975: XEiJ.mpuCycleCount += 4; 13976: return XEiJ.regRn[15]; 13977: } else { 13978: XEiJ.mpuCycleCount += 4; 13979: return XEiJ.regRn[ea - (0b010_000 - 8)]; 13980: } 13981: case 0b011_000: //(A0)+ 13982: if (XEiJ.EFA_SEPARATE_AR) { 13983: XEiJ.mpuCycleCount += 4; 13984: return XEiJ.regRn[ 8]++; 13985: } 13986: //fallthrough 13987: case 0b011_001: //(A1)+ 13988: if (XEiJ.EFA_SEPARATE_AR) { 13989: XEiJ.mpuCycleCount += 4; 13990: return XEiJ.regRn[ 9]++; 13991: } 13992: //fallthrough 13993: case 0b011_010: //(A2)+ 13994: if (XEiJ.EFA_SEPARATE_AR) { 13995: XEiJ.mpuCycleCount += 4; 13996: return XEiJ.regRn[10]++; 13997: } 13998: //fallthrough 13999: case 0b011_011: //(A3)+ 14000: if (XEiJ.EFA_SEPARATE_AR) { 14001: XEiJ.mpuCycleCount += 4; 14002: return XEiJ.regRn[11]++; 14003: } 14004: //fallthrough 14005: case 0b011_100: //(A4)+ 14006: if (XEiJ.EFA_SEPARATE_AR) { 14007: XEiJ.mpuCycleCount += 4; 14008: return XEiJ.regRn[12]++; 14009: } 14010: //fallthrough 14011: case 0b011_101: //(A5)+ 14012: if (XEiJ.EFA_SEPARATE_AR) { 14013: XEiJ.mpuCycleCount += 4; 14014: return XEiJ.regRn[13]++; 14015: } 14016: //fallthrough 14017: case 0b011_110: //(A6)+ 14018: if (XEiJ.EFA_SEPARATE_AR) { 14019: XEiJ.mpuCycleCount += 4; 14020: return XEiJ.regRn[14]++; 14021: } else { 14022: XEiJ.mpuCycleCount += 4; 14023: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 14024: } 14025: case 0b011_111: //(A7)+ 14026: XEiJ.mpuCycleCount += 4; 14027: return (XEiJ.regRn[15] += 2) - 2; 14028: case 0b100_000: //-(A0) 14029: if (XEiJ.EFA_SEPARATE_AR) { 14030: XEiJ.mpuCycleCount += 6; 14031: return --XEiJ.regRn[ 8]; 14032: } 14033: //fallthrough 14034: case 0b100_001: //-(A1) 14035: if (XEiJ.EFA_SEPARATE_AR) { 14036: XEiJ.mpuCycleCount += 6; 14037: return --XEiJ.regRn[ 9]; 14038: } 14039: //fallthrough 14040: case 0b100_010: //-(A2) 14041: if (XEiJ.EFA_SEPARATE_AR) { 14042: XEiJ.mpuCycleCount += 6; 14043: return --XEiJ.regRn[10]; 14044: } 14045: //fallthrough 14046: case 0b100_011: //-(A3) 14047: if (XEiJ.EFA_SEPARATE_AR) { 14048: XEiJ.mpuCycleCount += 6; 14049: return --XEiJ.regRn[11]; 14050: } 14051: //fallthrough 14052: case 0b100_100: //-(A4) 14053: if (XEiJ.EFA_SEPARATE_AR) { 14054: XEiJ.mpuCycleCount += 6; 14055: return --XEiJ.regRn[12]; 14056: } 14057: //fallthrough 14058: case 0b100_101: //-(A5) 14059: if (XEiJ.EFA_SEPARATE_AR) { 14060: XEiJ.mpuCycleCount += 6; 14061: return --XEiJ.regRn[13]; 14062: } 14063: //fallthrough 14064: case 0b100_110: //-(A6) 14065: if (XEiJ.EFA_SEPARATE_AR) { 14066: XEiJ.mpuCycleCount += 6; 14067: return --XEiJ.regRn[14]; 14068: } else { 14069: XEiJ.mpuCycleCount += 6; 14070: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 14071: } 14072: case 0b100_111: //-(A7) 14073: XEiJ.mpuCycleCount += 6; 14074: return XEiJ.regRn[15] -= 2; 14075: case 0b101_000: //(d16,A0) 14076: case 0b101_001: //(d16,A1) 14077: case 0b101_010: //(d16,A2) 14078: case 0b101_011: //(d16,A3) 14079: case 0b101_100: //(d16,A4) 14080: case 0b101_101: //(d16,A5) 14081: case 0b101_110: //(d16,A6) 14082: case 0b101_111: //(d16,A7) 14083: XEiJ.mpuCycleCount += 8; 14084: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14085: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14086: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14087: } else { 14088: t = XEiJ.regPC; 14089: XEiJ.regPC = t + 2; 14090: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14091: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14092: } 14093: case 0b110_000: //(d8,A0,Rn.wl) 14094: case 0b110_001: //(d8,A1,Rn.wl) 14095: case 0b110_010: //(d8,A2,Rn.wl) 14096: case 0b110_011: //(d8,A3,Rn.wl) 14097: case 0b110_100: //(d8,A4,Rn.wl) 14098: case 0b110_101: //(d8,A5,Rn.wl) 14099: case 0b110_110: //(d8,A6,Rn.wl) 14100: case 0b110_111: //(d8,A7,Rn.wl) 14101: XEiJ.mpuCycleCount += 10; 14102: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14103: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14104: } else { 14105: w = XEiJ.regPC; 14106: XEiJ.regPC = w + 2; 14107: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14108: } 14109: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14110: + (byte) w //バイトディスプレースメント 14111: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14112: XEiJ.regRn[w >> 12])); //ロングインデックス 14113: case 0b111_000: //(xxx).W 14114: XEiJ.mpuCycleCount += 8; 14115: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14116: case 0b111_001: //(xxx).L 14117: XEiJ.mpuCycleCount += 12; 14118: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14119: } //switch 14120: XEiJ.mpuCycleCount += 34; 14121: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14122: throw M68kException.m6eSignal; 14123: } //efaMltByte 14124: 14125: //a = efaCntByte (ea) //| M WXZP | 14126: // 制御モードのロングオペランドの実効アドレスを求める 14127: // efaMemByteとの違いは(Ar)+と-(Ar)がないこと 14128: @SuppressWarnings ("fallthrough") public static int efaCntByte (int ea) throws M68kException { 14129: int t, w; 14130: switch (ea) { 14131: case 0b010_000: //(A0) 14132: if (XEiJ.EFA_SEPARATE_AR) { 14133: XEiJ.mpuCycleCount += 4; 14134: return XEiJ.regRn[ 8]; 14135: } 14136: //fallthrough 14137: case 0b010_001: //(A1) 14138: if (XEiJ.EFA_SEPARATE_AR) { 14139: XEiJ.mpuCycleCount += 4; 14140: return XEiJ.regRn[ 9]; 14141: } 14142: //fallthrough 14143: case 0b010_010: //(A2) 14144: if (XEiJ.EFA_SEPARATE_AR) { 14145: XEiJ.mpuCycleCount += 4; 14146: return XEiJ.regRn[10]; 14147: } 14148: //fallthrough 14149: case 0b010_011: //(A3) 14150: if (XEiJ.EFA_SEPARATE_AR) { 14151: XEiJ.mpuCycleCount += 4; 14152: return XEiJ.regRn[11]; 14153: } 14154: //fallthrough 14155: case 0b010_100: //(A4) 14156: if (XEiJ.EFA_SEPARATE_AR) { 14157: XEiJ.mpuCycleCount += 4; 14158: return XEiJ.regRn[12]; 14159: } 14160: //fallthrough 14161: case 0b010_101: //(A5) 14162: if (XEiJ.EFA_SEPARATE_AR) { 14163: XEiJ.mpuCycleCount += 4; 14164: return XEiJ.regRn[13]; 14165: } 14166: //fallthrough 14167: case 0b010_110: //(A6) 14168: if (XEiJ.EFA_SEPARATE_AR) { 14169: XEiJ.mpuCycleCount += 4; 14170: return XEiJ.regRn[14]; 14171: } 14172: //fallthrough 14173: case 0b010_111: //(A7) 14174: if (XEiJ.EFA_SEPARATE_AR) { 14175: XEiJ.mpuCycleCount += 4; 14176: return XEiJ.regRn[15]; 14177: } else { 14178: XEiJ.mpuCycleCount += 4; 14179: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14180: } 14181: case 0b101_000: //(d16,A0) 14182: case 0b101_001: //(d16,A1) 14183: case 0b101_010: //(d16,A2) 14184: case 0b101_011: //(d16,A3) 14185: case 0b101_100: //(d16,A4) 14186: case 0b101_101: //(d16,A5) 14187: case 0b101_110: //(d16,A6) 14188: case 0b101_111: //(d16,A7) 14189: XEiJ.mpuCycleCount += 8; 14190: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14191: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14192: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14193: } else { 14194: t = XEiJ.regPC; 14195: XEiJ.regPC = t + 2; 14196: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14197: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14198: } 14199: case 0b110_000: //(d8,A0,Rn.wl) 14200: case 0b110_001: //(d8,A1,Rn.wl) 14201: case 0b110_010: //(d8,A2,Rn.wl) 14202: case 0b110_011: //(d8,A3,Rn.wl) 14203: case 0b110_100: //(d8,A4,Rn.wl) 14204: case 0b110_101: //(d8,A5,Rn.wl) 14205: case 0b110_110: //(d8,A6,Rn.wl) 14206: case 0b110_111: //(d8,A7,Rn.wl) 14207: XEiJ.mpuCycleCount += 10; 14208: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14209: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14210: } else { 14211: w = XEiJ.regPC; 14212: XEiJ.regPC = w + 2; 14213: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14214: } 14215: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14216: + (byte) w //バイトディスプレースメント 14217: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14218: XEiJ.regRn[w >> 12])); //ロングインデックス 14219: case 0b111_000: //(xxx).W 14220: XEiJ.mpuCycleCount += 8; 14221: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14222: case 0b111_001: //(xxx).L 14223: XEiJ.mpuCycleCount += 12; 14224: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14225: case 0b111_010: //(d16,PC) 14226: XEiJ.mpuCycleCount += 8; 14227: t = XEiJ.regPC; 14228: XEiJ.regPC = t + 2; 14229: return (t //ベースレジスタ 14230: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14231: case 0b111_011: //(d8,PC,Rn.wl) 14232: XEiJ.mpuCycleCount += 10; 14233: t = XEiJ.regPC; 14234: XEiJ.regPC = t + 2; 14235: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14236: return (t //ベースレジスタ 14237: + (byte) w //バイトディスプレースメント 14238: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14239: XEiJ.regRn[w >> 12])); //ロングインデックス 14240: } //switch 14241: XEiJ.mpuCycleCount += 34; 14242: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14243: throw M68kException.m6eSignal; 14244: } //efaCntByte 14245: 14246: //a = efaAnyWord (ea) //| M+-WXZPI| 14247: // 任意のモードのワードオペランドの実効アドレスを求める 14248: // efaAnyByteとの違いは(Ar)+と-(Ar)がArを2変化させることと、(A7)+と-(A7)と#<data>の特別な動作がないこと 14249: @SuppressWarnings ("fallthrough") public static int efaAnyWord (int ea) throws M68kException { 14250: int t, w; 14251: switch (ea) { 14252: case 0b010_000: //(A0) 14253: if (XEiJ.EFA_SEPARATE_AR) { 14254: XEiJ.mpuCycleCount += 4; 14255: return XEiJ.regRn[ 8]; 14256: } 14257: //fallthrough 14258: case 0b010_001: //(A1) 14259: if (XEiJ.EFA_SEPARATE_AR) { 14260: XEiJ.mpuCycleCount += 4; 14261: return XEiJ.regRn[ 9]; 14262: } 14263: //fallthrough 14264: case 0b010_010: //(A2) 14265: if (XEiJ.EFA_SEPARATE_AR) { 14266: XEiJ.mpuCycleCount += 4; 14267: return XEiJ.regRn[10]; 14268: } 14269: //fallthrough 14270: case 0b010_011: //(A3) 14271: if (XEiJ.EFA_SEPARATE_AR) { 14272: XEiJ.mpuCycleCount += 4; 14273: return XEiJ.regRn[11]; 14274: } 14275: //fallthrough 14276: case 0b010_100: //(A4) 14277: if (XEiJ.EFA_SEPARATE_AR) { 14278: XEiJ.mpuCycleCount += 4; 14279: return XEiJ.regRn[12]; 14280: } 14281: //fallthrough 14282: case 0b010_101: //(A5) 14283: if (XEiJ.EFA_SEPARATE_AR) { 14284: XEiJ.mpuCycleCount += 4; 14285: return XEiJ.regRn[13]; 14286: } 14287: //fallthrough 14288: case 0b010_110: //(A6) 14289: if (XEiJ.EFA_SEPARATE_AR) { 14290: XEiJ.mpuCycleCount += 4; 14291: return XEiJ.regRn[14]; 14292: } 14293: //fallthrough 14294: case 0b010_111: //(A7) 14295: if (XEiJ.EFA_SEPARATE_AR) { 14296: XEiJ.mpuCycleCount += 4; 14297: return XEiJ.regRn[15]; 14298: } else { 14299: XEiJ.mpuCycleCount += 4; 14300: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14301: } 14302: case 0b011_000: //(A0)+ 14303: if (XEiJ.EFA_SEPARATE_AR) { 14304: XEiJ.mpuCycleCount += 4; 14305: return (XEiJ.regRn[ 8] += 2) - 2; 14306: } 14307: //fallthrough 14308: case 0b011_001: //(A1)+ 14309: if (XEiJ.EFA_SEPARATE_AR) { 14310: XEiJ.mpuCycleCount += 4; 14311: return (XEiJ.regRn[ 9] += 2) - 2; 14312: } 14313: //fallthrough 14314: case 0b011_010: //(A2)+ 14315: if (XEiJ.EFA_SEPARATE_AR) { 14316: XEiJ.mpuCycleCount += 4; 14317: return (XEiJ.regRn[10] += 2) - 2; 14318: } 14319: //fallthrough 14320: case 0b011_011: //(A3)+ 14321: if (XEiJ.EFA_SEPARATE_AR) { 14322: XEiJ.mpuCycleCount += 4; 14323: return (XEiJ.regRn[11] += 2) - 2; 14324: } 14325: //fallthrough 14326: case 0b011_100: //(A4)+ 14327: if (XEiJ.EFA_SEPARATE_AR) { 14328: XEiJ.mpuCycleCount += 4; 14329: return (XEiJ.regRn[12] += 2) - 2; 14330: } 14331: //fallthrough 14332: case 0b011_101: //(A5)+ 14333: if (XEiJ.EFA_SEPARATE_AR) { 14334: XEiJ.mpuCycleCount += 4; 14335: return (XEiJ.regRn[13] += 2) - 2; 14336: } 14337: //fallthrough 14338: case 0b011_110: //(A6)+ 14339: if (XEiJ.EFA_SEPARATE_AR) { 14340: XEiJ.mpuCycleCount += 4; 14341: return (XEiJ.regRn[14] += 2) - 2; 14342: } 14343: //fallthrough 14344: case 0b011_111: //(A7)+ 14345: if (XEiJ.EFA_SEPARATE_AR) { 14346: XEiJ.mpuCycleCount += 4; 14347: return (XEiJ.regRn[15] += 2) - 2; 14348: } else { 14349: XEiJ.mpuCycleCount += 4; 14350: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 14351: } 14352: case 0b100_000: //-(A0) 14353: if (XEiJ.EFA_SEPARATE_AR) { 14354: XEiJ.mpuCycleCount += 6; 14355: return XEiJ.regRn[ 8] -= 2; 14356: } 14357: //fallthrough 14358: case 0b100_001: //-(A1) 14359: if (XEiJ.EFA_SEPARATE_AR) { 14360: XEiJ.mpuCycleCount += 6; 14361: return XEiJ.regRn[ 9] -= 2; 14362: } 14363: //fallthrough 14364: case 0b100_010: //-(A2) 14365: if (XEiJ.EFA_SEPARATE_AR) { 14366: XEiJ.mpuCycleCount += 6; 14367: return XEiJ.regRn[10] -= 2; 14368: } 14369: //fallthrough 14370: case 0b100_011: //-(A3) 14371: if (XEiJ.EFA_SEPARATE_AR) { 14372: XEiJ.mpuCycleCount += 6; 14373: return XEiJ.regRn[11] -= 2; 14374: } 14375: //fallthrough 14376: case 0b100_100: //-(A4) 14377: if (XEiJ.EFA_SEPARATE_AR) { 14378: XEiJ.mpuCycleCount += 6; 14379: return XEiJ.regRn[12] -= 2; 14380: } 14381: //fallthrough 14382: case 0b100_101: //-(A5) 14383: if (XEiJ.EFA_SEPARATE_AR) { 14384: XEiJ.mpuCycleCount += 6; 14385: return XEiJ.regRn[13] -= 2; 14386: } 14387: //fallthrough 14388: case 0b100_110: //-(A6) 14389: if (XEiJ.EFA_SEPARATE_AR) { 14390: XEiJ.mpuCycleCount += 6; 14391: return XEiJ.regRn[14] -= 2; 14392: } 14393: //fallthrough 14394: case 0b100_111: //-(A7) 14395: if (XEiJ.EFA_SEPARATE_AR) { 14396: XEiJ.mpuCycleCount += 6; 14397: return XEiJ.regRn[15] -= 2; 14398: } else { 14399: XEiJ.mpuCycleCount += 6; 14400: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 14401: } 14402: case 0b101_000: //(d16,A0) 14403: case 0b101_001: //(d16,A1) 14404: case 0b101_010: //(d16,A2) 14405: case 0b101_011: //(d16,A3) 14406: case 0b101_100: //(d16,A4) 14407: case 0b101_101: //(d16,A5) 14408: case 0b101_110: //(d16,A6) 14409: case 0b101_111: //(d16,A7) 14410: XEiJ.mpuCycleCount += 8; 14411: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14412: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14413: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14414: } else { 14415: t = XEiJ.regPC; 14416: XEiJ.regPC = t + 2; 14417: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14418: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14419: } 14420: case 0b110_000: //(d8,A0,Rn.wl) 14421: case 0b110_001: //(d8,A1,Rn.wl) 14422: case 0b110_010: //(d8,A2,Rn.wl) 14423: case 0b110_011: //(d8,A3,Rn.wl) 14424: case 0b110_100: //(d8,A4,Rn.wl) 14425: case 0b110_101: //(d8,A5,Rn.wl) 14426: case 0b110_110: //(d8,A6,Rn.wl) 14427: case 0b110_111: //(d8,A7,Rn.wl) 14428: XEiJ.mpuCycleCount += 10; 14429: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14430: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14431: } else { 14432: w = XEiJ.regPC; 14433: XEiJ.regPC = w + 2; 14434: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14435: } 14436: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14437: + (byte) w //バイトディスプレースメント 14438: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14439: XEiJ.regRn[w >> 12])); //ロングインデックス 14440: case 0b111_000: //(xxx).W 14441: XEiJ.mpuCycleCount += 8; 14442: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14443: case 0b111_001: //(xxx).L 14444: XEiJ.mpuCycleCount += 12; 14445: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14446: case 0b111_010: //(d16,PC) 14447: XEiJ.mpuCycleCount += 8; 14448: t = XEiJ.regPC; 14449: XEiJ.regPC = t + 2; 14450: return (t //ベースレジスタ 14451: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14452: case 0b111_011: //(d8,PC,Rn.wl) 14453: XEiJ.mpuCycleCount += 10; 14454: t = XEiJ.regPC; 14455: XEiJ.regPC = t + 2; 14456: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14457: return (t //ベースレジスタ 14458: + (byte) w //バイトディスプレースメント 14459: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14460: XEiJ.regRn[w >> 12])); //ロングインデックス 14461: case 0b111_100: //#<data> 14462: XEiJ.mpuCycleCount += 4; 14463: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14464: return (XEiJ.regPC += 2) - 2; 14465: } else { 14466: t = XEiJ.regPC; 14467: XEiJ.regPC = t + 2; 14468: return t; 14469: } 14470: } //switch 14471: XEiJ.mpuCycleCount += 34; 14472: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14473: throw M68kException.m6eSignal; 14474: } //efaAnyWord 14475: 14476: //a = efaMemWord (ea) //| M+-WXZP | 14477: // メモリモードのワードオペランドの実効アドレスを求める 14478: // efaAnyWordとの違いは#<data>がないこと 14479: @SuppressWarnings ("fallthrough") public static int efaMemWord (int ea) throws M68kException { 14480: int t, w; 14481: switch (ea) { 14482: case 0b010_000: //(A0) 14483: if (XEiJ.EFA_SEPARATE_AR) { 14484: XEiJ.mpuCycleCount += 4; 14485: return XEiJ.regRn[ 8]; 14486: } 14487: //fallthrough 14488: case 0b010_001: //(A1) 14489: if (XEiJ.EFA_SEPARATE_AR) { 14490: XEiJ.mpuCycleCount += 4; 14491: return XEiJ.regRn[ 9]; 14492: } 14493: //fallthrough 14494: case 0b010_010: //(A2) 14495: if (XEiJ.EFA_SEPARATE_AR) { 14496: XEiJ.mpuCycleCount += 4; 14497: return XEiJ.regRn[10]; 14498: } 14499: //fallthrough 14500: case 0b010_011: //(A3) 14501: if (XEiJ.EFA_SEPARATE_AR) { 14502: XEiJ.mpuCycleCount += 4; 14503: return XEiJ.regRn[11]; 14504: } 14505: //fallthrough 14506: case 0b010_100: //(A4) 14507: if (XEiJ.EFA_SEPARATE_AR) { 14508: XEiJ.mpuCycleCount += 4; 14509: return XEiJ.regRn[12]; 14510: } 14511: //fallthrough 14512: case 0b010_101: //(A5) 14513: if (XEiJ.EFA_SEPARATE_AR) { 14514: XEiJ.mpuCycleCount += 4; 14515: return XEiJ.regRn[13]; 14516: } 14517: //fallthrough 14518: case 0b010_110: //(A6) 14519: if (XEiJ.EFA_SEPARATE_AR) { 14520: XEiJ.mpuCycleCount += 4; 14521: return XEiJ.regRn[14]; 14522: } 14523: //fallthrough 14524: case 0b010_111: //(A7) 14525: if (XEiJ.EFA_SEPARATE_AR) { 14526: XEiJ.mpuCycleCount += 4; 14527: return XEiJ.regRn[15]; 14528: } else { 14529: XEiJ.mpuCycleCount += 4; 14530: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14531: } 14532: case 0b011_000: //(A0)+ 14533: if (XEiJ.EFA_SEPARATE_AR) { 14534: XEiJ.mpuCycleCount += 4; 14535: return (XEiJ.regRn[ 8] += 2) - 2; 14536: } 14537: //fallthrough 14538: case 0b011_001: //(A1)+ 14539: if (XEiJ.EFA_SEPARATE_AR) { 14540: XEiJ.mpuCycleCount += 4; 14541: return (XEiJ.regRn[ 9] += 2) - 2; 14542: } 14543: //fallthrough 14544: case 0b011_010: //(A2)+ 14545: if (XEiJ.EFA_SEPARATE_AR) { 14546: XEiJ.mpuCycleCount += 4; 14547: return (XEiJ.regRn[10] += 2) - 2; 14548: } 14549: //fallthrough 14550: case 0b011_011: //(A3)+ 14551: if (XEiJ.EFA_SEPARATE_AR) { 14552: XEiJ.mpuCycleCount += 4; 14553: return (XEiJ.regRn[11] += 2) - 2; 14554: } 14555: //fallthrough 14556: case 0b011_100: //(A4)+ 14557: if (XEiJ.EFA_SEPARATE_AR) { 14558: XEiJ.mpuCycleCount += 4; 14559: return (XEiJ.regRn[12] += 2) - 2; 14560: } 14561: //fallthrough 14562: case 0b011_101: //(A5)+ 14563: if (XEiJ.EFA_SEPARATE_AR) { 14564: XEiJ.mpuCycleCount += 4; 14565: return (XEiJ.regRn[13] += 2) - 2; 14566: } 14567: //fallthrough 14568: case 0b011_110: //(A6)+ 14569: if (XEiJ.EFA_SEPARATE_AR) { 14570: XEiJ.mpuCycleCount += 4; 14571: return (XEiJ.regRn[14] += 2) - 2; 14572: } 14573: //fallthrough 14574: case 0b011_111: //(A7)+ 14575: if (XEiJ.EFA_SEPARATE_AR) { 14576: XEiJ.mpuCycleCount += 4; 14577: return (XEiJ.regRn[15] += 2) - 2; 14578: } else { 14579: XEiJ.mpuCycleCount += 4; 14580: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 14581: } 14582: case 0b100_000: //-(A0) 14583: if (XEiJ.EFA_SEPARATE_AR) { 14584: XEiJ.mpuCycleCount += 6; 14585: return XEiJ.regRn[ 8] -= 2; 14586: } 14587: //fallthrough 14588: case 0b100_001: //-(A1) 14589: if (XEiJ.EFA_SEPARATE_AR) { 14590: XEiJ.mpuCycleCount += 6; 14591: return XEiJ.regRn[ 9] -= 2; 14592: } 14593: //fallthrough 14594: case 0b100_010: //-(A2) 14595: if (XEiJ.EFA_SEPARATE_AR) { 14596: XEiJ.mpuCycleCount += 6; 14597: return XEiJ.regRn[10] -= 2; 14598: } 14599: //fallthrough 14600: case 0b100_011: //-(A3) 14601: if (XEiJ.EFA_SEPARATE_AR) { 14602: XEiJ.mpuCycleCount += 6; 14603: return XEiJ.regRn[11] -= 2; 14604: } 14605: //fallthrough 14606: case 0b100_100: //-(A4) 14607: if (XEiJ.EFA_SEPARATE_AR) { 14608: XEiJ.mpuCycleCount += 6; 14609: return XEiJ.regRn[12] -= 2; 14610: } 14611: //fallthrough 14612: case 0b100_101: //-(A5) 14613: if (XEiJ.EFA_SEPARATE_AR) { 14614: XEiJ.mpuCycleCount += 6; 14615: return XEiJ.regRn[13] -= 2; 14616: } 14617: //fallthrough 14618: case 0b100_110: //-(A6) 14619: if (XEiJ.EFA_SEPARATE_AR) { 14620: XEiJ.mpuCycleCount += 6; 14621: return XEiJ.regRn[14] -= 2; 14622: } 14623: //fallthrough 14624: case 0b100_111: //-(A7) 14625: if (XEiJ.EFA_SEPARATE_AR) { 14626: XEiJ.mpuCycleCount += 6; 14627: return XEiJ.regRn[15] -= 2; 14628: } else { 14629: XEiJ.mpuCycleCount += 6; 14630: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 14631: } 14632: case 0b101_000: //(d16,A0) 14633: case 0b101_001: //(d16,A1) 14634: case 0b101_010: //(d16,A2) 14635: case 0b101_011: //(d16,A3) 14636: case 0b101_100: //(d16,A4) 14637: case 0b101_101: //(d16,A5) 14638: case 0b101_110: //(d16,A6) 14639: case 0b101_111: //(d16,A7) 14640: XEiJ.mpuCycleCount += 8; 14641: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14642: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14643: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14644: } else { 14645: t = XEiJ.regPC; 14646: XEiJ.regPC = t + 2; 14647: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14648: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14649: } 14650: case 0b110_000: //(d8,A0,Rn.wl) 14651: case 0b110_001: //(d8,A1,Rn.wl) 14652: case 0b110_010: //(d8,A2,Rn.wl) 14653: case 0b110_011: //(d8,A3,Rn.wl) 14654: case 0b110_100: //(d8,A4,Rn.wl) 14655: case 0b110_101: //(d8,A5,Rn.wl) 14656: case 0b110_110: //(d8,A6,Rn.wl) 14657: case 0b110_111: //(d8,A7,Rn.wl) 14658: XEiJ.mpuCycleCount += 10; 14659: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14660: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14661: } else { 14662: w = XEiJ.regPC; 14663: XEiJ.regPC = w + 2; 14664: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14665: } 14666: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14667: + (byte) w //バイトディスプレースメント 14668: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14669: XEiJ.regRn[w >> 12])); //ロングインデックス 14670: case 0b111_000: //(xxx).W 14671: XEiJ.mpuCycleCount += 8; 14672: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14673: case 0b111_001: //(xxx).L 14674: XEiJ.mpuCycleCount += 12; 14675: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14676: case 0b111_010: //(d16,PC) 14677: XEiJ.mpuCycleCount += 8; 14678: t = XEiJ.regPC; 14679: XEiJ.regPC = t + 2; 14680: return (t //ベースレジスタ 14681: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14682: case 0b111_011: //(d8,PC,Rn.wl) 14683: XEiJ.mpuCycleCount += 10; 14684: t = XEiJ.regPC; 14685: XEiJ.regPC = t + 2; 14686: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14687: return (t //ベースレジスタ 14688: + (byte) w //バイトディスプレースメント 14689: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14690: XEiJ.regRn[w >> 12])); //ロングインデックス 14691: } //switch 14692: XEiJ.mpuCycleCount += 34; 14693: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14694: throw M68kException.m6eSignal; 14695: } //efaMemWord 14696: 14697: //a = efaMltWord (ea) //| M+-WXZ | 14698: // メモリ可変モードのワードオペランドの実効アドレスを求める 14699: // efaMemWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 14700: @SuppressWarnings ("fallthrough") public static int efaMltWord (int ea) throws M68kException { 14701: int t, w; 14702: switch (ea) { 14703: case 0b010_000: //(A0) 14704: if (XEiJ.EFA_SEPARATE_AR) { 14705: XEiJ.mpuCycleCount += 4; 14706: return XEiJ.regRn[ 8]; 14707: } 14708: //fallthrough 14709: case 0b010_001: //(A1) 14710: if (XEiJ.EFA_SEPARATE_AR) { 14711: XEiJ.mpuCycleCount += 4; 14712: return XEiJ.regRn[ 9]; 14713: } 14714: //fallthrough 14715: case 0b010_010: //(A2) 14716: if (XEiJ.EFA_SEPARATE_AR) { 14717: XEiJ.mpuCycleCount += 4; 14718: return XEiJ.regRn[10]; 14719: } 14720: //fallthrough 14721: case 0b010_011: //(A3) 14722: if (XEiJ.EFA_SEPARATE_AR) { 14723: XEiJ.mpuCycleCount += 4; 14724: return XEiJ.regRn[11]; 14725: } 14726: //fallthrough 14727: case 0b010_100: //(A4) 14728: if (XEiJ.EFA_SEPARATE_AR) { 14729: XEiJ.mpuCycleCount += 4; 14730: return XEiJ.regRn[12]; 14731: } 14732: //fallthrough 14733: case 0b010_101: //(A5) 14734: if (XEiJ.EFA_SEPARATE_AR) { 14735: XEiJ.mpuCycleCount += 4; 14736: return XEiJ.regRn[13]; 14737: } 14738: //fallthrough 14739: case 0b010_110: //(A6) 14740: if (XEiJ.EFA_SEPARATE_AR) { 14741: XEiJ.mpuCycleCount += 4; 14742: return XEiJ.regRn[14]; 14743: } 14744: //fallthrough 14745: case 0b010_111: //(A7) 14746: if (XEiJ.EFA_SEPARATE_AR) { 14747: XEiJ.mpuCycleCount += 4; 14748: return XEiJ.regRn[15]; 14749: } else { 14750: XEiJ.mpuCycleCount += 4; 14751: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14752: } 14753: case 0b011_000: //(A0)+ 14754: if (XEiJ.EFA_SEPARATE_AR) { 14755: XEiJ.mpuCycleCount += 4; 14756: return (XEiJ.regRn[ 8] += 2) - 2; 14757: } 14758: //fallthrough 14759: case 0b011_001: //(A1)+ 14760: if (XEiJ.EFA_SEPARATE_AR) { 14761: XEiJ.mpuCycleCount += 4; 14762: return (XEiJ.regRn[ 9] += 2) - 2; 14763: } 14764: //fallthrough 14765: case 0b011_010: //(A2)+ 14766: if (XEiJ.EFA_SEPARATE_AR) { 14767: XEiJ.mpuCycleCount += 4; 14768: return (XEiJ.regRn[10] += 2) - 2; 14769: } 14770: //fallthrough 14771: case 0b011_011: //(A3)+ 14772: if (XEiJ.EFA_SEPARATE_AR) { 14773: XEiJ.mpuCycleCount += 4; 14774: return (XEiJ.regRn[11] += 2) - 2; 14775: } 14776: //fallthrough 14777: case 0b011_100: //(A4)+ 14778: if (XEiJ.EFA_SEPARATE_AR) { 14779: XEiJ.mpuCycleCount += 4; 14780: return (XEiJ.regRn[12] += 2) - 2; 14781: } 14782: //fallthrough 14783: case 0b011_101: //(A5)+ 14784: if (XEiJ.EFA_SEPARATE_AR) { 14785: XEiJ.mpuCycleCount += 4; 14786: return (XEiJ.regRn[13] += 2) - 2; 14787: } 14788: //fallthrough 14789: case 0b011_110: //(A6)+ 14790: if (XEiJ.EFA_SEPARATE_AR) { 14791: XEiJ.mpuCycleCount += 4; 14792: return (XEiJ.regRn[14] += 2) - 2; 14793: } 14794: //fallthrough 14795: case 0b011_111: //(A7)+ 14796: if (XEiJ.EFA_SEPARATE_AR) { 14797: XEiJ.mpuCycleCount += 4; 14798: return (XEiJ.regRn[15] += 2) - 2; 14799: } else { 14800: XEiJ.mpuCycleCount += 4; 14801: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 14802: } 14803: case 0b100_000: //-(A0) 14804: if (XEiJ.EFA_SEPARATE_AR) { 14805: XEiJ.mpuCycleCount += 6; 14806: return XEiJ.regRn[ 8] -= 2; 14807: } 14808: //fallthrough 14809: case 0b100_001: //-(A1) 14810: if (XEiJ.EFA_SEPARATE_AR) { 14811: XEiJ.mpuCycleCount += 6; 14812: return XEiJ.regRn[ 9] -= 2; 14813: } 14814: //fallthrough 14815: case 0b100_010: //-(A2) 14816: if (XEiJ.EFA_SEPARATE_AR) { 14817: XEiJ.mpuCycleCount += 6; 14818: return XEiJ.regRn[10] -= 2; 14819: } 14820: //fallthrough 14821: case 0b100_011: //-(A3) 14822: if (XEiJ.EFA_SEPARATE_AR) { 14823: XEiJ.mpuCycleCount += 6; 14824: return XEiJ.regRn[11] -= 2; 14825: } 14826: //fallthrough 14827: case 0b100_100: //-(A4) 14828: if (XEiJ.EFA_SEPARATE_AR) { 14829: XEiJ.mpuCycleCount += 6; 14830: return XEiJ.regRn[12] -= 2; 14831: } 14832: //fallthrough 14833: case 0b100_101: //-(A5) 14834: if (XEiJ.EFA_SEPARATE_AR) { 14835: XEiJ.mpuCycleCount += 6; 14836: return XEiJ.regRn[13] -= 2; 14837: } 14838: //fallthrough 14839: case 0b100_110: //-(A6) 14840: if (XEiJ.EFA_SEPARATE_AR) { 14841: XEiJ.mpuCycleCount += 6; 14842: return XEiJ.regRn[14] -= 2; 14843: } 14844: //fallthrough 14845: case 0b100_111: //-(A7) 14846: if (XEiJ.EFA_SEPARATE_AR) { 14847: XEiJ.mpuCycleCount += 6; 14848: return XEiJ.regRn[15] -= 2; 14849: } else { 14850: XEiJ.mpuCycleCount += 6; 14851: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 14852: } 14853: case 0b101_000: //(d16,A0) 14854: case 0b101_001: //(d16,A1) 14855: case 0b101_010: //(d16,A2) 14856: case 0b101_011: //(d16,A3) 14857: case 0b101_100: //(d16,A4) 14858: case 0b101_101: //(d16,A5) 14859: case 0b101_110: //(d16,A6) 14860: case 0b101_111: //(d16,A7) 14861: XEiJ.mpuCycleCount += 8; 14862: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14863: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14864: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14865: } else { 14866: t = XEiJ.regPC; 14867: XEiJ.regPC = t + 2; 14868: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14869: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14870: } 14871: case 0b110_000: //(d8,A0,Rn.wl) 14872: case 0b110_001: //(d8,A1,Rn.wl) 14873: case 0b110_010: //(d8,A2,Rn.wl) 14874: case 0b110_011: //(d8,A3,Rn.wl) 14875: case 0b110_100: //(d8,A4,Rn.wl) 14876: case 0b110_101: //(d8,A5,Rn.wl) 14877: case 0b110_110: //(d8,A6,Rn.wl) 14878: case 0b110_111: //(d8,A7,Rn.wl) 14879: XEiJ.mpuCycleCount += 10; 14880: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14881: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14882: } else { 14883: w = XEiJ.regPC; 14884: XEiJ.regPC = w + 2; 14885: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14886: } 14887: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14888: + (byte) w //バイトディスプレースメント 14889: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14890: XEiJ.regRn[w >> 12])); //ロングインデックス 14891: case 0b111_000: //(xxx).W 14892: XEiJ.mpuCycleCount += 8; 14893: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14894: case 0b111_001: //(xxx).L 14895: XEiJ.mpuCycleCount += 12; 14896: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14897: } //switch 14898: XEiJ.mpuCycleCount += 34; 14899: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14900: throw M68kException.m6eSignal; 14901: } //efaMltWord 14902: 14903: //a = efaCntWord (ea) //| M WXZP | 14904: // 制御モードのワードオペランドの実効アドレスを求める 14905: // efaMemWordとの違いは(Ar)+と-(Ar)がないこと 14906: @SuppressWarnings ("fallthrough") public static int efaCntWord (int ea) throws M68kException { 14907: int t, w; 14908: switch (ea) { 14909: case 0b010_000: //(A0) 14910: if (XEiJ.EFA_SEPARATE_AR) { 14911: XEiJ.mpuCycleCount += 4; 14912: return XEiJ.regRn[ 8]; 14913: } 14914: //fallthrough 14915: case 0b010_001: //(A1) 14916: if (XEiJ.EFA_SEPARATE_AR) { 14917: XEiJ.mpuCycleCount += 4; 14918: return XEiJ.regRn[ 9]; 14919: } 14920: //fallthrough 14921: case 0b010_010: //(A2) 14922: if (XEiJ.EFA_SEPARATE_AR) { 14923: XEiJ.mpuCycleCount += 4; 14924: return XEiJ.regRn[10]; 14925: } 14926: //fallthrough 14927: case 0b010_011: //(A3) 14928: if (XEiJ.EFA_SEPARATE_AR) { 14929: XEiJ.mpuCycleCount += 4; 14930: return XEiJ.regRn[11]; 14931: } 14932: //fallthrough 14933: case 0b010_100: //(A4) 14934: if (XEiJ.EFA_SEPARATE_AR) { 14935: XEiJ.mpuCycleCount += 4; 14936: return XEiJ.regRn[12]; 14937: } 14938: //fallthrough 14939: case 0b010_101: //(A5) 14940: if (XEiJ.EFA_SEPARATE_AR) { 14941: XEiJ.mpuCycleCount += 4; 14942: return XEiJ.regRn[13]; 14943: } 14944: //fallthrough 14945: case 0b010_110: //(A6) 14946: if (XEiJ.EFA_SEPARATE_AR) { 14947: XEiJ.mpuCycleCount += 4; 14948: return XEiJ.regRn[14]; 14949: } 14950: //fallthrough 14951: case 0b010_111: //(A7) 14952: if (XEiJ.EFA_SEPARATE_AR) { 14953: XEiJ.mpuCycleCount += 4; 14954: return XEiJ.regRn[15]; 14955: } else { 14956: XEiJ.mpuCycleCount += 4; 14957: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14958: } 14959: case 0b101_000: //(d16,A0) 14960: case 0b101_001: //(d16,A1) 14961: case 0b101_010: //(d16,A2) 14962: case 0b101_011: //(d16,A3) 14963: case 0b101_100: //(d16,A4) 14964: case 0b101_101: //(d16,A5) 14965: case 0b101_110: //(d16,A6) 14966: case 0b101_111: //(d16,A7) 14967: XEiJ.mpuCycleCount += 8; 14968: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14969: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14970: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14971: } else { 14972: t = XEiJ.regPC; 14973: XEiJ.regPC = t + 2; 14974: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14975: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14976: } 14977: case 0b110_000: //(d8,A0,Rn.wl) 14978: case 0b110_001: //(d8,A1,Rn.wl) 14979: case 0b110_010: //(d8,A2,Rn.wl) 14980: case 0b110_011: //(d8,A3,Rn.wl) 14981: case 0b110_100: //(d8,A4,Rn.wl) 14982: case 0b110_101: //(d8,A5,Rn.wl) 14983: case 0b110_110: //(d8,A6,Rn.wl) 14984: case 0b110_111: //(d8,A7,Rn.wl) 14985: XEiJ.mpuCycleCount += 10; 14986: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14987: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14988: } else { 14989: w = XEiJ.regPC; 14990: XEiJ.regPC = w + 2; 14991: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14992: } 14993: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14994: + (byte) w //バイトディスプレースメント 14995: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14996: XEiJ.regRn[w >> 12])); //ロングインデックス 14997: case 0b111_000: //(xxx).W 14998: XEiJ.mpuCycleCount += 8; 14999: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15000: case 0b111_001: //(xxx).L 15001: XEiJ.mpuCycleCount += 12; 15002: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15003: case 0b111_010: //(d16,PC) 15004: XEiJ.mpuCycleCount += 8; 15005: t = XEiJ.regPC; 15006: XEiJ.regPC = t + 2; 15007: return (t //ベースレジスタ 15008: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15009: case 0b111_011: //(d8,PC,Rn.wl) 15010: XEiJ.mpuCycleCount += 10; 15011: t = XEiJ.regPC; 15012: XEiJ.regPC = t + 2; 15013: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15014: return (t //ベースレジスタ 15015: + (byte) w //バイトディスプレースメント 15016: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15017: XEiJ.regRn[w >> 12])); //ロングインデックス 15018: } //switch 15019: XEiJ.mpuCycleCount += 34; 15020: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15021: throw M68kException.m6eSignal; 15022: } //efaCntWord 15023: 15024: //a = efaCltWord (ea) //| M WXZ | 15025: // 制御可変モードのワードオペランドの実効アドレスを求める 15026: // efaCntWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15027: @SuppressWarnings ("fallthrough") public static int efaCltWord (int ea) throws M68kException { 15028: int t, w; 15029: switch (ea) { 15030: case 0b010_000: //(A0) 15031: if (XEiJ.EFA_SEPARATE_AR) { 15032: XEiJ.mpuCycleCount += 4; 15033: return XEiJ.regRn[ 8]; 15034: } 15035: //fallthrough 15036: case 0b010_001: //(A1) 15037: if (XEiJ.EFA_SEPARATE_AR) { 15038: XEiJ.mpuCycleCount += 4; 15039: return XEiJ.regRn[ 9]; 15040: } 15041: //fallthrough 15042: case 0b010_010: //(A2) 15043: if (XEiJ.EFA_SEPARATE_AR) { 15044: XEiJ.mpuCycleCount += 4; 15045: return XEiJ.regRn[10]; 15046: } 15047: //fallthrough 15048: case 0b010_011: //(A3) 15049: if (XEiJ.EFA_SEPARATE_AR) { 15050: XEiJ.mpuCycleCount += 4; 15051: return XEiJ.regRn[11]; 15052: } 15053: //fallthrough 15054: case 0b010_100: //(A4) 15055: if (XEiJ.EFA_SEPARATE_AR) { 15056: XEiJ.mpuCycleCount += 4; 15057: return XEiJ.regRn[12]; 15058: } 15059: //fallthrough 15060: case 0b010_101: //(A5) 15061: if (XEiJ.EFA_SEPARATE_AR) { 15062: XEiJ.mpuCycleCount += 4; 15063: return XEiJ.regRn[13]; 15064: } 15065: //fallthrough 15066: case 0b010_110: //(A6) 15067: if (XEiJ.EFA_SEPARATE_AR) { 15068: XEiJ.mpuCycleCount += 4; 15069: return XEiJ.regRn[14]; 15070: } 15071: //fallthrough 15072: case 0b010_111: //(A7) 15073: if (XEiJ.EFA_SEPARATE_AR) { 15074: XEiJ.mpuCycleCount += 4; 15075: return XEiJ.regRn[15]; 15076: } else { 15077: XEiJ.mpuCycleCount += 4; 15078: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15079: } 15080: case 0b101_000: //(d16,A0) 15081: case 0b101_001: //(d16,A1) 15082: case 0b101_010: //(d16,A2) 15083: case 0b101_011: //(d16,A3) 15084: case 0b101_100: //(d16,A4) 15085: case 0b101_101: //(d16,A5) 15086: case 0b101_110: //(d16,A6) 15087: case 0b101_111: //(d16,A7) 15088: XEiJ.mpuCycleCount += 8; 15089: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15090: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15091: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15092: } else { 15093: t = XEiJ.regPC; 15094: XEiJ.regPC = t + 2; 15095: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15096: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15097: } 15098: case 0b110_000: //(d8,A0,Rn.wl) 15099: case 0b110_001: //(d8,A1,Rn.wl) 15100: case 0b110_010: //(d8,A2,Rn.wl) 15101: case 0b110_011: //(d8,A3,Rn.wl) 15102: case 0b110_100: //(d8,A4,Rn.wl) 15103: case 0b110_101: //(d8,A5,Rn.wl) 15104: case 0b110_110: //(d8,A6,Rn.wl) 15105: case 0b110_111: //(d8,A7,Rn.wl) 15106: XEiJ.mpuCycleCount += 10; 15107: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15108: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15109: } else { 15110: w = XEiJ.regPC; 15111: XEiJ.regPC = w + 2; 15112: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15113: } 15114: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15115: + (byte) w //バイトディスプレースメント 15116: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15117: XEiJ.regRn[w >> 12])); //ロングインデックス 15118: case 0b111_000: //(xxx).W 15119: XEiJ.mpuCycleCount += 8; 15120: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15121: case 0b111_001: //(xxx).L 15122: XEiJ.mpuCycleCount += 12; 15123: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15124: } //switch 15125: XEiJ.mpuCycleCount += 34; 15126: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15127: throw M68kException.m6eSignal; 15128: } //efaCltWord 15129: 15130: //a = efaAnyLong (ea) //| M+-WXZPI| 15131: // 任意のモードのロングオペランドの実効アドレスを求める 15132: // efaAnyWordとの違いは(Ar)+と-(Ar)がArを4変化させることと、#<data>がPCを4変化させることと、 15133: // オペランドのアクセスが1ワード増える分の4サイクルが追加されていること 15134: @SuppressWarnings ("fallthrough") public static int efaAnyLong (int ea) throws M68kException { 15135: int t, w; 15136: switch (ea) { 15137: case 0b010_000: //(A0) 15138: if (XEiJ.EFA_SEPARATE_AR) { 15139: XEiJ.mpuCycleCount += 8; 15140: return XEiJ.regRn[ 8]; 15141: } 15142: //fallthrough 15143: case 0b010_001: //(A1) 15144: if (XEiJ.EFA_SEPARATE_AR) { 15145: XEiJ.mpuCycleCount += 8; 15146: return XEiJ.regRn[ 9]; 15147: } 15148: //fallthrough 15149: case 0b010_010: //(A2) 15150: if (XEiJ.EFA_SEPARATE_AR) { 15151: XEiJ.mpuCycleCount += 8; 15152: return XEiJ.regRn[10]; 15153: } 15154: //fallthrough 15155: case 0b010_011: //(A3) 15156: if (XEiJ.EFA_SEPARATE_AR) { 15157: XEiJ.mpuCycleCount += 8; 15158: return XEiJ.regRn[11]; 15159: } 15160: //fallthrough 15161: case 0b010_100: //(A4) 15162: if (XEiJ.EFA_SEPARATE_AR) { 15163: XEiJ.mpuCycleCount += 8; 15164: return XEiJ.regRn[12]; 15165: } 15166: //fallthrough 15167: case 0b010_101: //(A5) 15168: if (XEiJ.EFA_SEPARATE_AR) { 15169: XEiJ.mpuCycleCount += 8; 15170: return XEiJ.regRn[13]; 15171: } 15172: //fallthrough 15173: case 0b010_110: //(A6) 15174: if (XEiJ.EFA_SEPARATE_AR) { 15175: XEiJ.mpuCycleCount += 8; 15176: return XEiJ.regRn[14]; 15177: } 15178: //fallthrough 15179: case 0b010_111: //(A7) 15180: if (XEiJ.EFA_SEPARATE_AR) { 15181: XEiJ.mpuCycleCount += 8; 15182: return XEiJ.regRn[15]; 15183: } else { 15184: XEiJ.mpuCycleCount += 8; 15185: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15186: } 15187: case 0b011_000: //(A0)+ 15188: if (XEiJ.EFA_SEPARATE_AR) { 15189: XEiJ.mpuCycleCount += 8; 15190: return (XEiJ.regRn[ 8] += 4) - 4; 15191: } 15192: //fallthrough 15193: case 0b011_001: //(A1)+ 15194: if (XEiJ.EFA_SEPARATE_AR) { 15195: XEiJ.mpuCycleCount += 8; 15196: return (XEiJ.regRn[ 9] += 4) - 4; 15197: } 15198: //fallthrough 15199: case 0b011_010: //(A2)+ 15200: if (XEiJ.EFA_SEPARATE_AR) { 15201: XEiJ.mpuCycleCount += 8; 15202: return (XEiJ.regRn[10] += 4) - 4; 15203: } 15204: //fallthrough 15205: case 0b011_011: //(A3)+ 15206: if (XEiJ.EFA_SEPARATE_AR) { 15207: XEiJ.mpuCycleCount += 8; 15208: return (XEiJ.regRn[11] += 4) - 4; 15209: } 15210: //fallthrough 15211: case 0b011_100: //(A4)+ 15212: if (XEiJ.EFA_SEPARATE_AR) { 15213: XEiJ.mpuCycleCount += 8; 15214: return (XEiJ.regRn[12] += 4) - 4; 15215: } 15216: //fallthrough 15217: case 0b011_101: //(A5)+ 15218: if (XEiJ.EFA_SEPARATE_AR) { 15219: XEiJ.mpuCycleCount += 8; 15220: return (XEiJ.regRn[13] += 4) - 4; 15221: } 15222: //fallthrough 15223: case 0b011_110: //(A6)+ 15224: if (XEiJ.EFA_SEPARATE_AR) { 15225: XEiJ.mpuCycleCount += 8; 15226: return (XEiJ.regRn[14] += 4) - 4; 15227: } 15228: //fallthrough 15229: case 0b011_111: //(A7)+ 15230: if (XEiJ.EFA_SEPARATE_AR) { 15231: XEiJ.mpuCycleCount += 8; 15232: return (XEiJ.regRn[15] += 4) - 4; 15233: } else { 15234: XEiJ.mpuCycleCount += 8; 15235: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 15236: } 15237: case 0b100_000: //-(A0) 15238: if (XEiJ.EFA_SEPARATE_AR) { 15239: XEiJ.mpuCycleCount += 10; 15240: return XEiJ.regRn[ 8] -= 4; 15241: } 15242: //fallthrough 15243: case 0b100_001: //-(A1) 15244: if (XEiJ.EFA_SEPARATE_AR) { 15245: XEiJ.mpuCycleCount += 10; 15246: return XEiJ.regRn[ 9] -= 4; 15247: } 15248: //fallthrough 15249: case 0b100_010: //-(A2) 15250: if (XEiJ.EFA_SEPARATE_AR) { 15251: XEiJ.mpuCycleCount += 10; 15252: return XEiJ.regRn[10] -= 4; 15253: } 15254: //fallthrough 15255: case 0b100_011: //-(A3) 15256: if (XEiJ.EFA_SEPARATE_AR) { 15257: XEiJ.mpuCycleCount += 10; 15258: return XEiJ.regRn[11] -= 4; 15259: } 15260: //fallthrough 15261: case 0b100_100: //-(A4) 15262: if (XEiJ.EFA_SEPARATE_AR) { 15263: XEiJ.mpuCycleCount += 10; 15264: return XEiJ.regRn[12] -= 4; 15265: } 15266: //fallthrough 15267: case 0b100_101: //-(A5) 15268: if (XEiJ.EFA_SEPARATE_AR) { 15269: XEiJ.mpuCycleCount += 10; 15270: return XEiJ.regRn[13] -= 4; 15271: } 15272: //fallthrough 15273: case 0b100_110: //-(A6) 15274: if (XEiJ.EFA_SEPARATE_AR) { 15275: XEiJ.mpuCycleCount += 10; 15276: return XEiJ.regRn[14] -= 4; 15277: } 15278: //fallthrough 15279: case 0b100_111: //-(A7) 15280: if (XEiJ.EFA_SEPARATE_AR) { 15281: XEiJ.mpuCycleCount += 10; 15282: return XEiJ.regRn[15] -= 4; 15283: } else { 15284: XEiJ.mpuCycleCount += 10; 15285: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 15286: } 15287: case 0b101_000: //(d16,A0) 15288: case 0b101_001: //(d16,A1) 15289: case 0b101_010: //(d16,A2) 15290: case 0b101_011: //(d16,A3) 15291: case 0b101_100: //(d16,A4) 15292: case 0b101_101: //(d16,A5) 15293: case 0b101_110: //(d16,A6) 15294: case 0b101_111: //(d16,A7) 15295: XEiJ.mpuCycleCount += 12; 15296: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15297: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15298: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15299: } else { 15300: t = XEiJ.regPC; 15301: XEiJ.regPC = t + 2; 15302: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15303: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15304: } 15305: case 0b110_000: //(d8,A0,Rn.wl) 15306: case 0b110_001: //(d8,A1,Rn.wl) 15307: case 0b110_010: //(d8,A2,Rn.wl) 15308: case 0b110_011: //(d8,A3,Rn.wl) 15309: case 0b110_100: //(d8,A4,Rn.wl) 15310: case 0b110_101: //(d8,A5,Rn.wl) 15311: case 0b110_110: //(d8,A6,Rn.wl) 15312: case 0b110_111: //(d8,A7,Rn.wl) 15313: XEiJ.mpuCycleCount += 14; 15314: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15315: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15316: } else { 15317: w = XEiJ.regPC; 15318: XEiJ.regPC = w + 2; 15319: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15320: } 15321: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15322: + (byte) w //バイトディスプレースメント 15323: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15324: XEiJ.regRn[w >> 12])); //ロングインデックス 15325: case 0b111_000: //(xxx).W 15326: XEiJ.mpuCycleCount += 12; 15327: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15328: case 0b111_001: //(xxx).L 15329: XEiJ.mpuCycleCount += 16; 15330: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15331: case 0b111_010: //(d16,PC) 15332: XEiJ.mpuCycleCount += 12; 15333: t = XEiJ.regPC; 15334: XEiJ.regPC = t + 2; 15335: return (t //ベースレジスタ 15336: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15337: case 0b111_011: //(d8,PC,Rn.wl) 15338: XEiJ.mpuCycleCount += 14; 15339: t = XEiJ.regPC; 15340: XEiJ.regPC = t + 2; 15341: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15342: return (t //ベースレジスタ 15343: + (byte) w //バイトディスプレースメント 15344: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15345: XEiJ.regRn[w >> 12])); //ロングインデックス 15346: case 0b111_100: //#<data> 15347: XEiJ.mpuCycleCount += 8; 15348: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15349: return (XEiJ.regPC += 4) - 4; 15350: } else { 15351: t = XEiJ.regPC; 15352: XEiJ.regPC = t + 4; 15353: return t; 15354: } 15355: } //switch 15356: XEiJ.mpuCycleCount += 34; 15357: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15358: throw M68kException.m6eSignal; 15359: } //efaAnyLong 15360: 15361: //a = efaMemLong (ea) //| M+-WXZP | 15362: // メモリモードのロングオペランドの実効アドレスを求める 15363: // efaAnyLongとの違いは#<data>がないこと 15364: @SuppressWarnings ("fallthrough") public static int efaMemLong (int ea) throws M68kException { 15365: int t, w; 15366: switch (ea) { 15367: case 0b010_000: //(A0) 15368: if (XEiJ.EFA_SEPARATE_AR) { 15369: XEiJ.mpuCycleCount += 8; 15370: return XEiJ.regRn[ 8]; 15371: } 15372: //fallthrough 15373: case 0b010_001: //(A1) 15374: if (XEiJ.EFA_SEPARATE_AR) { 15375: XEiJ.mpuCycleCount += 8; 15376: return XEiJ.regRn[ 9]; 15377: } 15378: //fallthrough 15379: case 0b010_010: //(A2) 15380: if (XEiJ.EFA_SEPARATE_AR) { 15381: XEiJ.mpuCycleCount += 8; 15382: return XEiJ.regRn[10]; 15383: } 15384: //fallthrough 15385: case 0b010_011: //(A3) 15386: if (XEiJ.EFA_SEPARATE_AR) { 15387: XEiJ.mpuCycleCount += 8; 15388: return XEiJ.regRn[11]; 15389: } 15390: //fallthrough 15391: case 0b010_100: //(A4) 15392: if (XEiJ.EFA_SEPARATE_AR) { 15393: XEiJ.mpuCycleCount += 8; 15394: return XEiJ.regRn[12]; 15395: } 15396: //fallthrough 15397: case 0b010_101: //(A5) 15398: if (XEiJ.EFA_SEPARATE_AR) { 15399: XEiJ.mpuCycleCount += 8; 15400: return XEiJ.regRn[13]; 15401: } 15402: //fallthrough 15403: case 0b010_110: //(A6) 15404: if (XEiJ.EFA_SEPARATE_AR) { 15405: XEiJ.mpuCycleCount += 8; 15406: return XEiJ.regRn[14]; 15407: } 15408: //fallthrough 15409: case 0b010_111: //(A7) 15410: if (XEiJ.EFA_SEPARATE_AR) { 15411: XEiJ.mpuCycleCount += 8; 15412: return XEiJ.regRn[15]; 15413: } else { 15414: XEiJ.mpuCycleCount += 8; 15415: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15416: } 15417: case 0b011_000: //(A0)+ 15418: if (XEiJ.EFA_SEPARATE_AR) { 15419: XEiJ.mpuCycleCount += 8; 15420: return (XEiJ.regRn[ 8] += 4) - 4; 15421: } 15422: //fallthrough 15423: case 0b011_001: //(A1)+ 15424: if (XEiJ.EFA_SEPARATE_AR) { 15425: XEiJ.mpuCycleCount += 8; 15426: return (XEiJ.regRn[ 9] += 4) - 4; 15427: } 15428: //fallthrough 15429: case 0b011_010: //(A2)+ 15430: if (XEiJ.EFA_SEPARATE_AR) { 15431: XEiJ.mpuCycleCount += 8; 15432: return (XEiJ.regRn[10] += 4) - 4; 15433: } 15434: //fallthrough 15435: case 0b011_011: //(A3)+ 15436: if (XEiJ.EFA_SEPARATE_AR) { 15437: XEiJ.mpuCycleCount += 8; 15438: return (XEiJ.regRn[11] += 4) - 4; 15439: } 15440: //fallthrough 15441: case 0b011_100: //(A4)+ 15442: if (XEiJ.EFA_SEPARATE_AR) { 15443: XEiJ.mpuCycleCount += 8; 15444: return (XEiJ.regRn[12] += 4) - 4; 15445: } 15446: //fallthrough 15447: case 0b011_101: //(A5)+ 15448: if (XEiJ.EFA_SEPARATE_AR) { 15449: XEiJ.mpuCycleCount += 8; 15450: return (XEiJ.regRn[13] += 4) - 4; 15451: } 15452: //fallthrough 15453: case 0b011_110: //(A6)+ 15454: if (XEiJ.EFA_SEPARATE_AR) { 15455: XEiJ.mpuCycleCount += 8; 15456: return (XEiJ.regRn[14] += 4) - 4; 15457: } 15458: //fallthrough 15459: case 0b011_111: //(A7)+ 15460: if (XEiJ.EFA_SEPARATE_AR) { 15461: XEiJ.mpuCycleCount += 8; 15462: return (XEiJ.regRn[15] += 4) - 4; 15463: } else { 15464: XEiJ.mpuCycleCount += 8; 15465: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 15466: } 15467: case 0b100_000: //-(A0) 15468: if (XEiJ.EFA_SEPARATE_AR) { 15469: XEiJ.mpuCycleCount += 10; 15470: return XEiJ.regRn[ 8] -= 4; 15471: } 15472: //fallthrough 15473: case 0b100_001: //-(A1) 15474: if (XEiJ.EFA_SEPARATE_AR) { 15475: XEiJ.mpuCycleCount += 10; 15476: return XEiJ.regRn[ 9] -= 4; 15477: } 15478: //fallthrough 15479: case 0b100_010: //-(A2) 15480: if (XEiJ.EFA_SEPARATE_AR) { 15481: XEiJ.mpuCycleCount += 10; 15482: return XEiJ.regRn[10] -= 4; 15483: } 15484: //fallthrough 15485: case 0b100_011: //-(A3) 15486: if (XEiJ.EFA_SEPARATE_AR) { 15487: XEiJ.mpuCycleCount += 10; 15488: return XEiJ.regRn[11] -= 4; 15489: } 15490: //fallthrough 15491: case 0b100_100: //-(A4) 15492: if (XEiJ.EFA_SEPARATE_AR) { 15493: XEiJ.mpuCycleCount += 10; 15494: return XEiJ.regRn[12] -= 4; 15495: } 15496: //fallthrough 15497: case 0b100_101: //-(A5) 15498: if (XEiJ.EFA_SEPARATE_AR) { 15499: XEiJ.mpuCycleCount += 10; 15500: return XEiJ.regRn[13] -= 4; 15501: } 15502: //fallthrough 15503: case 0b100_110: //-(A6) 15504: if (XEiJ.EFA_SEPARATE_AR) { 15505: XEiJ.mpuCycleCount += 10; 15506: return XEiJ.regRn[14] -= 4; 15507: } 15508: //fallthrough 15509: case 0b100_111: //-(A7) 15510: if (XEiJ.EFA_SEPARATE_AR) { 15511: XEiJ.mpuCycleCount += 10; 15512: return XEiJ.regRn[15] -= 4; 15513: } else { 15514: XEiJ.mpuCycleCount += 10; 15515: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 15516: } 15517: case 0b101_000: //(d16,A0) 15518: case 0b101_001: //(d16,A1) 15519: case 0b101_010: //(d16,A2) 15520: case 0b101_011: //(d16,A3) 15521: case 0b101_100: //(d16,A4) 15522: case 0b101_101: //(d16,A5) 15523: case 0b101_110: //(d16,A6) 15524: case 0b101_111: //(d16,A7) 15525: XEiJ.mpuCycleCount += 12; 15526: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15527: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15528: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15529: } else { 15530: t = XEiJ.regPC; 15531: XEiJ.regPC = t + 2; 15532: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15533: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15534: } 15535: case 0b110_000: //(d8,A0,Rn.wl) 15536: case 0b110_001: //(d8,A1,Rn.wl) 15537: case 0b110_010: //(d8,A2,Rn.wl) 15538: case 0b110_011: //(d8,A3,Rn.wl) 15539: case 0b110_100: //(d8,A4,Rn.wl) 15540: case 0b110_101: //(d8,A5,Rn.wl) 15541: case 0b110_110: //(d8,A6,Rn.wl) 15542: case 0b110_111: //(d8,A7,Rn.wl) 15543: XEiJ.mpuCycleCount += 14; 15544: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15545: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15546: } else { 15547: w = XEiJ.regPC; 15548: XEiJ.regPC = w + 2; 15549: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15550: } 15551: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15552: + (byte) w //バイトディスプレースメント 15553: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15554: XEiJ.regRn[w >> 12])); //ロングインデックス 15555: case 0b111_000: //(xxx).W 15556: XEiJ.mpuCycleCount += 12; 15557: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15558: case 0b111_001: //(xxx).L 15559: XEiJ.mpuCycleCount += 16; 15560: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15561: case 0b111_010: //(d16,PC) 15562: XEiJ.mpuCycleCount += 12; 15563: t = XEiJ.regPC; 15564: XEiJ.regPC = t + 2; 15565: return (t //ベースレジスタ 15566: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15567: case 0b111_011: //(d8,PC,Rn.wl) 15568: XEiJ.mpuCycleCount += 14; 15569: t = XEiJ.regPC; 15570: XEiJ.regPC = t + 2; 15571: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15572: return (t //ベースレジスタ 15573: + (byte) w //バイトディスプレースメント 15574: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15575: XEiJ.regRn[w >> 12])); //ロングインデックス 15576: } //switch 15577: XEiJ.mpuCycleCount += 34; 15578: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15579: throw M68kException.m6eSignal; 15580: } //efaMemLong 15581: 15582: //a = efaMltLong (ea) //| M+-WXZ | 15583: // メモリ可変モードのロングオペランドの実効アドレスを求める 15584: // efaMemLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15585: @SuppressWarnings ("fallthrough") public static int efaMltLong (int ea) throws M68kException { 15586: int t, w; 15587: switch (ea) { 15588: case 0b010_000: //(A0) 15589: if (XEiJ.EFA_SEPARATE_AR) { 15590: XEiJ.mpuCycleCount += 8; 15591: return XEiJ.regRn[ 8]; 15592: } 15593: //fallthrough 15594: case 0b010_001: //(A1) 15595: if (XEiJ.EFA_SEPARATE_AR) { 15596: XEiJ.mpuCycleCount += 8; 15597: return XEiJ.regRn[ 9]; 15598: } 15599: //fallthrough 15600: case 0b010_010: //(A2) 15601: if (XEiJ.EFA_SEPARATE_AR) { 15602: XEiJ.mpuCycleCount += 8; 15603: return XEiJ.regRn[10]; 15604: } 15605: //fallthrough 15606: case 0b010_011: //(A3) 15607: if (XEiJ.EFA_SEPARATE_AR) { 15608: XEiJ.mpuCycleCount += 8; 15609: return XEiJ.regRn[11]; 15610: } 15611: //fallthrough 15612: case 0b010_100: //(A4) 15613: if (XEiJ.EFA_SEPARATE_AR) { 15614: XEiJ.mpuCycleCount += 8; 15615: return XEiJ.regRn[12]; 15616: } 15617: //fallthrough 15618: case 0b010_101: //(A5) 15619: if (XEiJ.EFA_SEPARATE_AR) { 15620: XEiJ.mpuCycleCount += 8; 15621: return XEiJ.regRn[13]; 15622: } 15623: //fallthrough 15624: case 0b010_110: //(A6) 15625: if (XEiJ.EFA_SEPARATE_AR) { 15626: XEiJ.mpuCycleCount += 8; 15627: return XEiJ.regRn[14]; 15628: } 15629: //fallthrough 15630: case 0b010_111: //(A7) 15631: if (XEiJ.EFA_SEPARATE_AR) { 15632: XEiJ.mpuCycleCount += 8; 15633: return XEiJ.regRn[15]; 15634: } else { 15635: XEiJ.mpuCycleCount += 8; 15636: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15637: } 15638: case 0b011_000: //(A0)+ 15639: if (XEiJ.EFA_SEPARATE_AR) { 15640: XEiJ.mpuCycleCount += 8; 15641: return (XEiJ.regRn[ 8] += 4) - 4; 15642: } 15643: //fallthrough 15644: case 0b011_001: //(A1)+ 15645: if (XEiJ.EFA_SEPARATE_AR) { 15646: XEiJ.mpuCycleCount += 8; 15647: return (XEiJ.regRn[ 9] += 4) - 4; 15648: } 15649: //fallthrough 15650: case 0b011_010: //(A2)+ 15651: if (XEiJ.EFA_SEPARATE_AR) { 15652: XEiJ.mpuCycleCount += 8; 15653: return (XEiJ.regRn[10] += 4) - 4; 15654: } 15655: //fallthrough 15656: case 0b011_011: //(A3)+ 15657: if (XEiJ.EFA_SEPARATE_AR) { 15658: XEiJ.mpuCycleCount += 8; 15659: return (XEiJ.regRn[11] += 4) - 4; 15660: } 15661: //fallthrough 15662: case 0b011_100: //(A4)+ 15663: if (XEiJ.EFA_SEPARATE_AR) { 15664: XEiJ.mpuCycleCount += 8; 15665: return (XEiJ.regRn[12] += 4) - 4; 15666: } 15667: //fallthrough 15668: case 0b011_101: //(A5)+ 15669: if (XEiJ.EFA_SEPARATE_AR) { 15670: XEiJ.mpuCycleCount += 8; 15671: return (XEiJ.regRn[13] += 4) - 4; 15672: } 15673: //fallthrough 15674: case 0b011_110: //(A6)+ 15675: if (XEiJ.EFA_SEPARATE_AR) { 15676: XEiJ.mpuCycleCount += 8; 15677: return (XEiJ.regRn[14] += 4) - 4; 15678: } 15679: //fallthrough 15680: case 0b011_111: //(A7)+ 15681: if (XEiJ.EFA_SEPARATE_AR) { 15682: XEiJ.mpuCycleCount += 8; 15683: return (XEiJ.regRn[15] += 4) - 4; 15684: } else { 15685: XEiJ.mpuCycleCount += 8; 15686: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 15687: } 15688: case 0b100_000: //-(A0) 15689: if (XEiJ.EFA_SEPARATE_AR) { 15690: XEiJ.mpuCycleCount += 10; 15691: return XEiJ.regRn[ 8] -= 4; 15692: } 15693: //fallthrough 15694: case 0b100_001: //-(A1) 15695: if (XEiJ.EFA_SEPARATE_AR) { 15696: XEiJ.mpuCycleCount += 10; 15697: return XEiJ.regRn[ 9] -= 4; 15698: } 15699: //fallthrough 15700: case 0b100_010: //-(A2) 15701: if (XEiJ.EFA_SEPARATE_AR) { 15702: XEiJ.mpuCycleCount += 10; 15703: return XEiJ.regRn[10] -= 4; 15704: } 15705: //fallthrough 15706: case 0b100_011: //-(A3) 15707: if (XEiJ.EFA_SEPARATE_AR) { 15708: XEiJ.mpuCycleCount += 10; 15709: return XEiJ.regRn[11] -= 4; 15710: } 15711: //fallthrough 15712: case 0b100_100: //-(A4) 15713: if (XEiJ.EFA_SEPARATE_AR) { 15714: XEiJ.mpuCycleCount += 10; 15715: return XEiJ.regRn[12] -= 4; 15716: } 15717: //fallthrough 15718: case 0b100_101: //-(A5) 15719: if (XEiJ.EFA_SEPARATE_AR) { 15720: XEiJ.mpuCycleCount += 10; 15721: return XEiJ.regRn[13] -= 4; 15722: } 15723: //fallthrough 15724: case 0b100_110: //-(A6) 15725: if (XEiJ.EFA_SEPARATE_AR) { 15726: XEiJ.mpuCycleCount += 10; 15727: return XEiJ.regRn[14] -= 4; 15728: } 15729: //fallthrough 15730: case 0b100_111: //-(A7) 15731: if (XEiJ.EFA_SEPARATE_AR) { 15732: XEiJ.mpuCycleCount += 10; 15733: return XEiJ.regRn[15] -= 4; 15734: } else { 15735: XEiJ.mpuCycleCount += 10; 15736: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 15737: } 15738: case 0b101_000: //(d16,A0) 15739: case 0b101_001: //(d16,A1) 15740: case 0b101_010: //(d16,A2) 15741: case 0b101_011: //(d16,A3) 15742: case 0b101_100: //(d16,A4) 15743: case 0b101_101: //(d16,A5) 15744: case 0b101_110: //(d16,A6) 15745: case 0b101_111: //(d16,A7) 15746: XEiJ.mpuCycleCount += 12; 15747: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15748: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15749: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15750: } else { 15751: t = XEiJ.regPC; 15752: XEiJ.regPC = t + 2; 15753: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15754: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15755: } 15756: case 0b110_000: //(d8,A0,Rn.wl) 15757: case 0b110_001: //(d8,A1,Rn.wl) 15758: case 0b110_010: //(d8,A2,Rn.wl) 15759: case 0b110_011: //(d8,A3,Rn.wl) 15760: case 0b110_100: //(d8,A4,Rn.wl) 15761: case 0b110_101: //(d8,A5,Rn.wl) 15762: case 0b110_110: //(d8,A6,Rn.wl) 15763: case 0b110_111: //(d8,A7,Rn.wl) 15764: XEiJ.mpuCycleCount += 14; 15765: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15766: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15767: } else { 15768: w = XEiJ.regPC; 15769: XEiJ.regPC = w + 2; 15770: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15771: } 15772: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15773: + (byte) w //バイトディスプレースメント 15774: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15775: XEiJ.regRn[w >> 12])); //ロングインデックス 15776: case 0b111_000: //(xxx).W 15777: XEiJ.mpuCycleCount += 12; 15778: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15779: case 0b111_001: //(xxx).L 15780: XEiJ.mpuCycleCount += 16; 15781: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15782: } //switch 15783: XEiJ.mpuCycleCount += 34; 15784: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15785: throw M68kException.m6eSignal; 15786: } //efaMltLong 15787: 15788: //a = efaCntLong (ea) //| M WXZP | 15789: // 制御モードのロングオペランドの実効アドレスを求める 15790: // efaMemLongとの違いは(Ar)+と-(Ar)がないこと 15791: @SuppressWarnings ("fallthrough") public static int efaCntLong (int ea) throws M68kException { 15792: int t, w; 15793: switch (ea) { 15794: case 0b010_000: //(A0) 15795: if (XEiJ.EFA_SEPARATE_AR) { 15796: XEiJ.mpuCycleCount += 8; 15797: return XEiJ.regRn[ 8]; 15798: } 15799: //fallthrough 15800: case 0b010_001: //(A1) 15801: if (XEiJ.EFA_SEPARATE_AR) { 15802: XEiJ.mpuCycleCount += 8; 15803: return XEiJ.regRn[ 9]; 15804: } 15805: //fallthrough 15806: case 0b010_010: //(A2) 15807: if (XEiJ.EFA_SEPARATE_AR) { 15808: XEiJ.mpuCycleCount += 8; 15809: return XEiJ.regRn[10]; 15810: } 15811: //fallthrough 15812: case 0b010_011: //(A3) 15813: if (XEiJ.EFA_SEPARATE_AR) { 15814: XEiJ.mpuCycleCount += 8; 15815: return XEiJ.regRn[11]; 15816: } 15817: //fallthrough 15818: case 0b010_100: //(A4) 15819: if (XEiJ.EFA_SEPARATE_AR) { 15820: XEiJ.mpuCycleCount += 8; 15821: return XEiJ.regRn[12]; 15822: } 15823: //fallthrough 15824: case 0b010_101: //(A5) 15825: if (XEiJ.EFA_SEPARATE_AR) { 15826: XEiJ.mpuCycleCount += 8; 15827: return XEiJ.regRn[13]; 15828: } 15829: //fallthrough 15830: case 0b010_110: //(A6) 15831: if (XEiJ.EFA_SEPARATE_AR) { 15832: XEiJ.mpuCycleCount += 8; 15833: return XEiJ.regRn[14]; 15834: } 15835: //fallthrough 15836: case 0b010_111: //(A7) 15837: if (XEiJ.EFA_SEPARATE_AR) { 15838: XEiJ.mpuCycleCount += 8; 15839: return XEiJ.regRn[15]; 15840: } else { 15841: XEiJ.mpuCycleCount += 8; 15842: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15843: } 15844: case 0b101_000: //(d16,A0) 15845: case 0b101_001: //(d16,A1) 15846: case 0b101_010: //(d16,A2) 15847: case 0b101_011: //(d16,A3) 15848: case 0b101_100: //(d16,A4) 15849: case 0b101_101: //(d16,A5) 15850: case 0b101_110: //(d16,A6) 15851: case 0b101_111: //(d16,A7) 15852: XEiJ.mpuCycleCount += 12; 15853: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15854: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15855: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15856: } else { 15857: t = XEiJ.regPC; 15858: XEiJ.regPC = t + 2; 15859: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15860: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15861: } 15862: case 0b110_000: //(d8,A0,Rn.wl) 15863: case 0b110_001: //(d8,A1,Rn.wl) 15864: case 0b110_010: //(d8,A2,Rn.wl) 15865: case 0b110_011: //(d8,A3,Rn.wl) 15866: case 0b110_100: //(d8,A4,Rn.wl) 15867: case 0b110_101: //(d8,A5,Rn.wl) 15868: case 0b110_110: //(d8,A6,Rn.wl) 15869: case 0b110_111: //(d8,A7,Rn.wl) 15870: XEiJ.mpuCycleCount += 14; 15871: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15872: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15873: } else { 15874: w = XEiJ.regPC; 15875: XEiJ.regPC = w + 2; 15876: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15877: } 15878: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15879: + (byte) w //バイトディスプレースメント 15880: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15881: XEiJ.regRn[w >> 12])); //ロングインデックス 15882: case 0b111_000: //(xxx).W 15883: XEiJ.mpuCycleCount += 12; 15884: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15885: case 0b111_001: //(xxx).L 15886: XEiJ.mpuCycleCount += 16; 15887: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15888: case 0b111_010: //(d16,PC) 15889: XEiJ.mpuCycleCount += 12; 15890: t = XEiJ.regPC; 15891: XEiJ.regPC = t + 2; 15892: return (t //ベースレジスタ 15893: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15894: case 0b111_011: //(d8,PC,Rn.wl) 15895: XEiJ.mpuCycleCount += 14; 15896: t = XEiJ.regPC; 15897: XEiJ.regPC = t + 2; 15898: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15899: return (t //ベースレジスタ 15900: + (byte) w //バイトディスプレースメント 15901: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15902: XEiJ.regRn[w >> 12])); //ロングインデックス 15903: } //switch 15904: XEiJ.mpuCycleCount += 34; 15905: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15906: throw M68kException.m6eSignal; 15907: } //efaCntLong 15908: 15909: //a = efaCltLong (ea) //| M WXZ | 15910: // 制御可変モードのワードオペランドの実効アドレスを求める 15911: // efaCntLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15912: @SuppressWarnings ("fallthrough") public static int efaCltLong (int ea) throws M68kException { 15913: int t, w; 15914: switch (ea) { 15915: case 0b010_000: //(A0) 15916: if (XEiJ.EFA_SEPARATE_AR) { 15917: XEiJ.mpuCycleCount += 8; 15918: return XEiJ.regRn[ 8]; 15919: } 15920: //fallthrough 15921: case 0b010_001: //(A1) 15922: if (XEiJ.EFA_SEPARATE_AR) { 15923: XEiJ.mpuCycleCount += 8; 15924: return XEiJ.regRn[ 9]; 15925: } 15926: //fallthrough 15927: case 0b010_010: //(A2) 15928: if (XEiJ.EFA_SEPARATE_AR) { 15929: XEiJ.mpuCycleCount += 8; 15930: return XEiJ.regRn[10]; 15931: } 15932: //fallthrough 15933: case 0b010_011: //(A3) 15934: if (XEiJ.EFA_SEPARATE_AR) { 15935: XEiJ.mpuCycleCount += 8; 15936: return XEiJ.regRn[11]; 15937: } 15938: //fallthrough 15939: case 0b010_100: //(A4) 15940: if (XEiJ.EFA_SEPARATE_AR) { 15941: XEiJ.mpuCycleCount += 8; 15942: return XEiJ.regRn[12]; 15943: } 15944: //fallthrough 15945: case 0b010_101: //(A5) 15946: if (XEiJ.EFA_SEPARATE_AR) { 15947: XEiJ.mpuCycleCount += 8; 15948: return XEiJ.regRn[13]; 15949: } 15950: //fallthrough 15951: case 0b010_110: //(A6) 15952: if (XEiJ.EFA_SEPARATE_AR) { 15953: XEiJ.mpuCycleCount += 8; 15954: return XEiJ.regRn[14]; 15955: } 15956: //fallthrough 15957: case 0b010_111: //(A7) 15958: if (XEiJ.EFA_SEPARATE_AR) { 15959: XEiJ.mpuCycleCount += 8; 15960: return XEiJ.regRn[15]; 15961: } else { 15962: XEiJ.mpuCycleCount += 8; 15963: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15964: } 15965: case 0b101_000: //(d16,A0) 15966: case 0b101_001: //(d16,A1) 15967: case 0b101_010: //(d16,A2) 15968: case 0b101_011: //(d16,A3) 15969: case 0b101_100: //(d16,A4) 15970: case 0b101_101: //(d16,A5) 15971: case 0b101_110: //(d16,A6) 15972: case 0b101_111: //(d16,A7) 15973: XEiJ.mpuCycleCount += 12; 15974: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15975: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15976: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15977: } else { 15978: t = XEiJ.regPC; 15979: XEiJ.regPC = t + 2; 15980: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15981: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15982: } 15983: case 0b110_000: //(d8,A0,Rn.wl) 15984: case 0b110_001: //(d8,A1,Rn.wl) 15985: case 0b110_010: //(d8,A2,Rn.wl) 15986: case 0b110_011: //(d8,A3,Rn.wl) 15987: case 0b110_100: //(d8,A4,Rn.wl) 15988: case 0b110_101: //(d8,A5,Rn.wl) 15989: case 0b110_110: //(d8,A6,Rn.wl) 15990: case 0b110_111: //(d8,A7,Rn.wl) 15991: XEiJ.mpuCycleCount += 14; 15992: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15993: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15994: } else { 15995: w = XEiJ.regPC; 15996: XEiJ.regPC = w + 2; 15997: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15998: } 15999: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16000: + (byte) w //バイトディスプレースメント 16001: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16002: XEiJ.regRn[w >> 12])); //ロングインデックス 16003: case 0b111_000: //(xxx).W 16004: XEiJ.mpuCycleCount += 12; 16005: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16006: case 0b111_001: //(xxx).L 16007: XEiJ.mpuCycleCount += 16; 16008: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16009: } //switch 16010: XEiJ.mpuCycleCount += 34; 16011: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16012: throw M68kException.m6eSignal; 16013: } //efaCltLong 16014: 16015: //a = efaAnyQuad (ea) //| M+-WXZPI| 16016: // 任意のモードのクワッドオペランドの実効アドレスを求める 16017: // efaAnyLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、 16018: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16019: @SuppressWarnings ("fallthrough") public static int efaAnyQuad (int ea) throws M68kException { 16020: int t, w; 16021: switch (ea) { 16022: case 0b010_000: //(A0) 16023: if (XEiJ.EFA_SEPARATE_AR) { 16024: XEiJ.mpuCycleCount += 16; 16025: return XEiJ.regRn[ 8]; 16026: } 16027: //fallthrough 16028: case 0b010_001: //(A1) 16029: if (XEiJ.EFA_SEPARATE_AR) { 16030: XEiJ.mpuCycleCount += 16; 16031: return XEiJ.regRn[ 9]; 16032: } 16033: //fallthrough 16034: case 0b010_010: //(A2) 16035: if (XEiJ.EFA_SEPARATE_AR) { 16036: XEiJ.mpuCycleCount += 16; 16037: return XEiJ.regRn[10]; 16038: } 16039: //fallthrough 16040: case 0b010_011: //(A3) 16041: if (XEiJ.EFA_SEPARATE_AR) { 16042: XEiJ.mpuCycleCount += 16; 16043: return XEiJ.regRn[11]; 16044: } 16045: //fallthrough 16046: case 0b010_100: //(A4) 16047: if (XEiJ.EFA_SEPARATE_AR) { 16048: XEiJ.mpuCycleCount += 16; 16049: return XEiJ.regRn[12]; 16050: } 16051: //fallthrough 16052: case 0b010_101: //(A5) 16053: if (XEiJ.EFA_SEPARATE_AR) { 16054: XEiJ.mpuCycleCount += 16; 16055: return XEiJ.regRn[13]; 16056: } 16057: //fallthrough 16058: case 0b010_110: //(A6) 16059: if (XEiJ.EFA_SEPARATE_AR) { 16060: XEiJ.mpuCycleCount += 16; 16061: return XEiJ.regRn[14]; 16062: } 16063: //fallthrough 16064: case 0b010_111: //(A7) 16065: if (XEiJ.EFA_SEPARATE_AR) { 16066: XEiJ.mpuCycleCount += 16; 16067: return XEiJ.regRn[15]; 16068: } else { 16069: XEiJ.mpuCycleCount += 16; 16070: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16071: } 16072: case 0b011_000: //(A0)+ 16073: if (XEiJ.EFA_SEPARATE_AR) { 16074: XEiJ.mpuCycleCount += 16; 16075: return (XEiJ.regRn[ 8] += 8) - 8; 16076: } 16077: //fallthrough 16078: case 0b011_001: //(A1)+ 16079: if (XEiJ.EFA_SEPARATE_AR) { 16080: XEiJ.mpuCycleCount += 16; 16081: return (XEiJ.regRn[ 9] += 8) - 8; 16082: } 16083: //fallthrough 16084: case 0b011_010: //(A2)+ 16085: if (XEiJ.EFA_SEPARATE_AR) { 16086: XEiJ.mpuCycleCount += 16; 16087: return (XEiJ.regRn[10] += 8) - 8; 16088: } 16089: //fallthrough 16090: case 0b011_011: //(A3)+ 16091: if (XEiJ.EFA_SEPARATE_AR) { 16092: XEiJ.mpuCycleCount += 16; 16093: return (XEiJ.regRn[11] += 8) - 8; 16094: } 16095: //fallthrough 16096: case 0b011_100: //(A4)+ 16097: if (XEiJ.EFA_SEPARATE_AR) { 16098: XEiJ.mpuCycleCount += 16; 16099: return (XEiJ.regRn[12] += 8) - 8; 16100: } 16101: //fallthrough 16102: case 0b011_101: //(A5)+ 16103: if (XEiJ.EFA_SEPARATE_AR) { 16104: XEiJ.mpuCycleCount += 16; 16105: return (XEiJ.regRn[13] += 8) - 8; 16106: } 16107: //fallthrough 16108: case 0b011_110: //(A6)+ 16109: if (XEiJ.EFA_SEPARATE_AR) { 16110: XEiJ.mpuCycleCount += 16; 16111: return (XEiJ.regRn[14] += 8) - 8; 16112: } 16113: //fallthrough 16114: case 0b011_111: //(A7)+ 16115: if (XEiJ.EFA_SEPARATE_AR) { 16116: XEiJ.mpuCycleCount += 16; 16117: return (XEiJ.regRn[15] += 8) - 8; 16118: } else { 16119: XEiJ.mpuCycleCount += 16; 16120: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8; 16121: } 16122: case 0b100_000: //-(A0) 16123: if (XEiJ.EFA_SEPARATE_AR) { 16124: XEiJ.mpuCycleCount += 18; 16125: return XEiJ.regRn[ 8] -= 8; 16126: } 16127: //fallthrough 16128: case 0b100_001: //-(A1) 16129: if (XEiJ.EFA_SEPARATE_AR) { 16130: XEiJ.mpuCycleCount += 18; 16131: return XEiJ.regRn[ 9] -= 8; 16132: } 16133: //fallthrough 16134: case 0b100_010: //-(A2) 16135: if (XEiJ.EFA_SEPARATE_AR) { 16136: XEiJ.mpuCycleCount += 18; 16137: return XEiJ.regRn[10] -= 8; 16138: } 16139: //fallthrough 16140: case 0b100_011: //-(A3) 16141: if (XEiJ.EFA_SEPARATE_AR) { 16142: XEiJ.mpuCycleCount += 18; 16143: return XEiJ.regRn[11] -= 8; 16144: } 16145: //fallthrough 16146: case 0b100_100: //-(A4) 16147: if (XEiJ.EFA_SEPARATE_AR) { 16148: XEiJ.mpuCycleCount += 18; 16149: return XEiJ.regRn[12] -= 8; 16150: } 16151: //fallthrough 16152: case 0b100_101: //-(A5) 16153: if (XEiJ.EFA_SEPARATE_AR) { 16154: XEiJ.mpuCycleCount += 18; 16155: return XEiJ.regRn[13] -= 8; 16156: } 16157: //fallthrough 16158: case 0b100_110: //-(A6) 16159: if (XEiJ.EFA_SEPARATE_AR) { 16160: XEiJ.mpuCycleCount += 18; 16161: return XEiJ.regRn[14] -= 8; 16162: } 16163: //fallthrough 16164: case 0b100_111: //-(A7) 16165: if (XEiJ.EFA_SEPARATE_AR) { 16166: XEiJ.mpuCycleCount += 18; 16167: return XEiJ.regRn[15] -= 8; 16168: } else { 16169: XEiJ.mpuCycleCount += 18; 16170: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8; 16171: } 16172: case 0b101_000: //(d16,A0) 16173: case 0b101_001: //(d16,A1) 16174: case 0b101_010: //(d16,A2) 16175: case 0b101_011: //(d16,A3) 16176: case 0b101_100: //(d16,A4) 16177: case 0b101_101: //(d16,A5) 16178: case 0b101_110: //(d16,A6) 16179: case 0b101_111: //(d16,A7) 16180: XEiJ.mpuCycleCount += 20; 16181: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16182: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16183: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16184: } else { 16185: t = XEiJ.regPC; 16186: XEiJ.regPC = t + 2; 16187: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16188: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16189: } 16190: case 0b110_000: //(d8,A0,Rn.wl) 16191: case 0b110_001: //(d8,A1,Rn.wl) 16192: case 0b110_010: //(d8,A2,Rn.wl) 16193: case 0b110_011: //(d8,A3,Rn.wl) 16194: case 0b110_100: //(d8,A4,Rn.wl) 16195: case 0b110_101: //(d8,A5,Rn.wl) 16196: case 0b110_110: //(d8,A6,Rn.wl) 16197: case 0b110_111: //(d8,A7,Rn.wl) 16198: XEiJ.mpuCycleCount += 22; 16199: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16200: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16201: } else { 16202: w = XEiJ.regPC; 16203: XEiJ.regPC = w + 2; 16204: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16205: } 16206: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16207: + (byte) w //バイトディスプレースメント 16208: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16209: XEiJ.regRn[w >> 12])); //ロングインデックス 16210: case 0b111_000: //(xxx).W 16211: XEiJ.mpuCycleCount += 20; 16212: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16213: case 0b111_001: //(xxx).L 16214: XEiJ.mpuCycleCount += 24; 16215: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16216: case 0b111_010: //(d16,PC) 16217: XEiJ.mpuCycleCount += 20; 16218: t = XEiJ.regPC; 16219: XEiJ.regPC = t + 2; 16220: return (t //ベースレジスタ 16221: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16222: case 0b111_011: //(d8,PC,Rn.wl) 16223: XEiJ.mpuCycleCount += 22; 16224: t = XEiJ.regPC; 16225: XEiJ.regPC = t + 2; 16226: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16227: return (t //ベースレジスタ 16228: + (byte) w //バイトディスプレースメント 16229: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16230: XEiJ.regRn[w >> 12])); //ロングインデックス 16231: case 0b111_100: //#<data> 16232: XEiJ.mpuCycleCount += 16; 16233: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16234: return (XEiJ.regPC += 8) - 8; 16235: } else { 16236: t = XEiJ.regPC; 16237: XEiJ.regPC = t + 8; 16238: return t; 16239: } 16240: } //switch 16241: XEiJ.mpuCycleCount += 34; 16242: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16243: throw M68kException.m6eSignal; 16244: } //efaAnyQuad 16245: 16246: //a = efaMltQuad (ea) //| M+-WXZ | 16247: // メモリ可変モードのクワッドオペランドの実効アドレスを求める 16248: // efaMltLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、 16249: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16250: @SuppressWarnings ("fallthrough") public static int efaMltQuad (int ea) throws M68kException { 16251: int t, w; 16252: switch (ea) { 16253: case 0b010_000: //(A0) 16254: if (XEiJ.EFA_SEPARATE_AR) { 16255: XEiJ.mpuCycleCount += 16; 16256: return XEiJ.regRn[ 8]; 16257: } 16258: //fallthrough 16259: case 0b010_001: //(A1) 16260: if (XEiJ.EFA_SEPARATE_AR) { 16261: XEiJ.mpuCycleCount += 16; 16262: return XEiJ.regRn[ 9]; 16263: } 16264: //fallthrough 16265: case 0b010_010: //(A2) 16266: if (XEiJ.EFA_SEPARATE_AR) { 16267: XEiJ.mpuCycleCount += 16; 16268: return XEiJ.regRn[10]; 16269: } 16270: //fallthrough 16271: case 0b010_011: //(A3) 16272: if (XEiJ.EFA_SEPARATE_AR) { 16273: XEiJ.mpuCycleCount += 16; 16274: return XEiJ.regRn[11]; 16275: } 16276: //fallthrough 16277: case 0b010_100: //(A4) 16278: if (XEiJ.EFA_SEPARATE_AR) { 16279: XEiJ.mpuCycleCount += 16; 16280: return XEiJ.regRn[12]; 16281: } 16282: //fallthrough 16283: case 0b010_101: //(A5) 16284: if (XEiJ.EFA_SEPARATE_AR) { 16285: XEiJ.mpuCycleCount += 16; 16286: return XEiJ.regRn[13]; 16287: } 16288: //fallthrough 16289: case 0b010_110: //(A6) 16290: if (XEiJ.EFA_SEPARATE_AR) { 16291: XEiJ.mpuCycleCount += 16; 16292: return XEiJ.regRn[14]; 16293: } 16294: //fallthrough 16295: case 0b010_111: //(A7) 16296: if (XEiJ.EFA_SEPARATE_AR) { 16297: XEiJ.mpuCycleCount += 16; 16298: return XEiJ.regRn[15]; 16299: } else { 16300: XEiJ.mpuCycleCount += 16; 16301: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16302: } 16303: case 0b011_000: //(A0)+ 16304: if (XEiJ.EFA_SEPARATE_AR) { 16305: XEiJ.mpuCycleCount += 16; 16306: return (XEiJ.regRn[ 8] += 8) - 8; 16307: } 16308: //fallthrough 16309: case 0b011_001: //(A1)+ 16310: if (XEiJ.EFA_SEPARATE_AR) { 16311: XEiJ.mpuCycleCount += 16; 16312: return (XEiJ.regRn[ 9] += 8) - 8; 16313: } 16314: //fallthrough 16315: case 0b011_010: //(A2)+ 16316: if (XEiJ.EFA_SEPARATE_AR) { 16317: XEiJ.mpuCycleCount += 16; 16318: return (XEiJ.regRn[10] += 8) - 8; 16319: } 16320: //fallthrough 16321: case 0b011_011: //(A3)+ 16322: if (XEiJ.EFA_SEPARATE_AR) { 16323: XEiJ.mpuCycleCount += 16; 16324: return (XEiJ.regRn[11] += 8) - 8; 16325: } 16326: //fallthrough 16327: case 0b011_100: //(A4)+ 16328: if (XEiJ.EFA_SEPARATE_AR) { 16329: XEiJ.mpuCycleCount += 16; 16330: return (XEiJ.regRn[12] += 8) - 8; 16331: } 16332: //fallthrough 16333: case 0b011_101: //(A5)+ 16334: if (XEiJ.EFA_SEPARATE_AR) { 16335: XEiJ.mpuCycleCount += 16; 16336: return (XEiJ.regRn[13] += 8) - 8; 16337: } 16338: //fallthrough 16339: case 0b011_110: //(A6)+ 16340: if (XEiJ.EFA_SEPARATE_AR) { 16341: XEiJ.mpuCycleCount += 16; 16342: return (XEiJ.regRn[14] += 8) - 8; 16343: } 16344: //fallthrough 16345: case 0b011_111: //(A7)+ 16346: if (XEiJ.EFA_SEPARATE_AR) { 16347: XEiJ.mpuCycleCount += 16; 16348: return (XEiJ.regRn[15] += 8) - 8; 16349: } else { 16350: XEiJ.mpuCycleCount += 16; 16351: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8; 16352: } 16353: case 0b100_000: //-(A0) 16354: if (XEiJ.EFA_SEPARATE_AR) { 16355: XEiJ.mpuCycleCount += 18; 16356: return XEiJ.regRn[ 8] -= 8; 16357: } 16358: //fallthrough 16359: case 0b100_001: //-(A1) 16360: if (XEiJ.EFA_SEPARATE_AR) { 16361: XEiJ.mpuCycleCount += 18; 16362: return XEiJ.regRn[ 9] -= 8; 16363: } 16364: //fallthrough 16365: case 0b100_010: //-(A2) 16366: if (XEiJ.EFA_SEPARATE_AR) { 16367: XEiJ.mpuCycleCount += 18; 16368: return XEiJ.regRn[10] -= 8; 16369: } 16370: //fallthrough 16371: case 0b100_011: //-(A3) 16372: if (XEiJ.EFA_SEPARATE_AR) { 16373: XEiJ.mpuCycleCount += 18; 16374: return XEiJ.regRn[11] -= 8; 16375: } 16376: //fallthrough 16377: case 0b100_100: //-(A4) 16378: if (XEiJ.EFA_SEPARATE_AR) { 16379: XEiJ.mpuCycleCount += 18; 16380: return XEiJ.regRn[12] -= 8; 16381: } 16382: //fallthrough 16383: case 0b100_101: //-(A5) 16384: if (XEiJ.EFA_SEPARATE_AR) { 16385: XEiJ.mpuCycleCount += 18; 16386: return XEiJ.regRn[13] -= 8; 16387: } 16388: //fallthrough 16389: case 0b100_110: //-(A6) 16390: if (XEiJ.EFA_SEPARATE_AR) { 16391: XEiJ.mpuCycleCount += 18; 16392: return XEiJ.regRn[14] -= 8; 16393: } 16394: //fallthrough 16395: case 0b100_111: //-(A7) 16396: if (XEiJ.EFA_SEPARATE_AR) { 16397: XEiJ.mpuCycleCount += 18; 16398: return XEiJ.regRn[15] -= 8; 16399: } else { 16400: XEiJ.mpuCycleCount += 18; 16401: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8; 16402: } 16403: case 0b101_000: //(d16,A0) 16404: case 0b101_001: //(d16,A1) 16405: case 0b101_010: //(d16,A2) 16406: case 0b101_011: //(d16,A3) 16407: case 0b101_100: //(d16,A4) 16408: case 0b101_101: //(d16,A5) 16409: case 0b101_110: //(d16,A6) 16410: case 0b101_111: //(d16,A7) 16411: XEiJ.mpuCycleCount += 20; 16412: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16413: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16414: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16415: } else { 16416: t = XEiJ.regPC; 16417: XEiJ.regPC = t + 2; 16418: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16419: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16420: } 16421: case 0b110_000: //(d8,A0,Rn.wl) 16422: case 0b110_001: //(d8,A1,Rn.wl) 16423: case 0b110_010: //(d8,A2,Rn.wl) 16424: case 0b110_011: //(d8,A3,Rn.wl) 16425: case 0b110_100: //(d8,A4,Rn.wl) 16426: case 0b110_101: //(d8,A5,Rn.wl) 16427: case 0b110_110: //(d8,A6,Rn.wl) 16428: case 0b110_111: //(d8,A7,Rn.wl) 16429: XEiJ.mpuCycleCount += 22; 16430: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16431: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16432: } else { 16433: w = XEiJ.regPC; 16434: XEiJ.regPC = w + 2; 16435: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16436: } 16437: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16438: + (byte) w //バイトディスプレースメント 16439: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16440: XEiJ.regRn[w >> 12])); //ロングインデックス 16441: case 0b111_000: //(xxx).W 16442: XEiJ.mpuCycleCount += 20; 16443: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16444: case 0b111_001: //(xxx).L 16445: XEiJ.mpuCycleCount += 24; 16446: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16447: } //switch 16448: XEiJ.mpuCycleCount += 34; 16449: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16450: throw M68kException.m6eSignal; 16451: } //efaMltQuad 16452: 16453: //a = efaAnyExtd (ea) //| M+-WXZPI| 16454: // 任意のモードのエクステンデッドオペランドの実効アドレスを求める 16455: // efaAnyQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、 16456: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16457: @SuppressWarnings ("fallthrough") public static int efaAnyExtd (int ea) throws M68kException { 16458: int t, w; 16459: switch (ea) { 16460: case 0b010_000: //(A0) 16461: if (XEiJ.EFA_SEPARATE_AR) { 16462: XEiJ.mpuCycleCount += 24; 16463: return XEiJ.regRn[ 8]; 16464: } 16465: //fallthrough 16466: case 0b010_001: //(A1) 16467: if (XEiJ.EFA_SEPARATE_AR) { 16468: XEiJ.mpuCycleCount += 24; 16469: return XEiJ.regRn[ 9]; 16470: } 16471: //fallthrough 16472: case 0b010_010: //(A2) 16473: if (XEiJ.EFA_SEPARATE_AR) { 16474: XEiJ.mpuCycleCount += 24; 16475: return XEiJ.regRn[10]; 16476: } 16477: //fallthrough 16478: case 0b010_011: //(A3) 16479: if (XEiJ.EFA_SEPARATE_AR) { 16480: XEiJ.mpuCycleCount += 24; 16481: return XEiJ.regRn[11]; 16482: } 16483: //fallthrough 16484: case 0b010_100: //(A4) 16485: if (XEiJ.EFA_SEPARATE_AR) { 16486: XEiJ.mpuCycleCount += 24; 16487: return XEiJ.regRn[12]; 16488: } 16489: //fallthrough 16490: case 0b010_101: //(A5) 16491: if (XEiJ.EFA_SEPARATE_AR) { 16492: XEiJ.mpuCycleCount += 24; 16493: return XEiJ.regRn[13]; 16494: } 16495: //fallthrough 16496: case 0b010_110: //(A6) 16497: if (XEiJ.EFA_SEPARATE_AR) { 16498: XEiJ.mpuCycleCount += 24; 16499: return XEiJ.regRn[14]; 16500: } 16501: //fallthrough 16502: case 0b010_111: //(A7) 16503: if (XEiJ.EFA_SEPARATE_AR) { 16504: XEiJ.mpuCycleCount += 24; 16505: return XEiJ.regRn[15]; 16506: } else { 16507: XEiJ.mpuCycleCount += 24; 16508: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16509: } 16510: case 0b011_000: //(A0)+ 16511: if (XEiJ.EFA_SEPARATE_AR) { 16512: XEiJ.mpuCycleCount += 24; 16513: return (XEiJ.regRn[ 8] += 12) - 12; 16514: } 16515: //fallthrough 16516: case 0b011_001: //(A1)+ 16517: if (XEiJ.EFA_SEPARATE_AR) { 16518: XEiJ.mpuCycleCount += 24; 16519: return (XEiJ.regRn[ 9] += 12) - 12; 16520: } 16521: //fallthrough 16522: case 0b011_010: //(A2)+ 16523: if (XEiJ.EFA_SEPARATE_AR) { 16524: XEiJ.mpuCycleCount += 24; 16525: return (XEiJ.regRn[10] += 12) - 12; 16526: } 16527: //fallthrough 16528: case 0b011_011: //(A3)+ 16529: if (XEiJ.EFA_SEPARATE_AR) { 16530: XEiJ.mpuCycleCount += 24; 16531: return (XEiJ.regRn[11] += 12) - 12; 16532: } 16533: //fallthrough 16534: case 0b011_100: //(A4)+ 16535: if (XEiJ.EFA_SEPARATE_AR) { 16536: XEiJ.mpuCycleCount += 24; 16537: return (XEiJ.regRn[12] += 12) - 12; 16538: } 16539: //fallthrough 16540: case 0b011_101: //(A5)+ 16541: if (XEiJ.EFA_SEPARATE_AR) { 16542: XEiJ.mpuCycleCount += 24; 16543: return (XEiJ.regRn[13] += 12) - 12; 16544: } 16545: //fallthrough 16546: case 0b011_110: //(A6)+ 16547: if (XEiJ.EFA_SEPARATE_AR) { 16548: XEiJ.mpuCycleCount += 24; 16549: return (XEiJ.regRn[14] += 12) - 12; 16550: } 16551: //fallthrough 16552: case 0b011_111: //(A7)+ 16553: if (XEiJ.EFA_SEPARATE_AR) { 16554: XEiJ.mpuCycleCount += 24; 16555: return (XEiJ.regRn[15] += 12) - 12; 16556: } else { 16557: XEiJ.mpuCycleCount += 24; 16558: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12; 16559: } 16560: case 0b100_000: //-(A0) 16561: if (XEiJ.EFA_SEPARATE_AR) { 16562: XEiJ.mpuCycleCount += 26; 16563: return XEiJ.regRn[ 8] -= 12; 16564: } 16565: //fallthrough 16566: case 0b100_001: //-(A1) 16567: if (XEiJ.EFA_SEPARATE_AR) { 16568: XEiJ.mpuCycleCount += 26; 16569: return XEiJ.regRn[ 9] -= 12; 16570: } 16571: //fallthrough 16572: case 0b100_010: //-(A2) 16573: if (XEiJ.EFA_SEPARATE_AR) { 16574: XEiJ.mpuCycleCount += 26; 16575: return XEiJ.regRn[10] -= 12; 16576: } 16577: //fallthrough 16578: case 0b100_011: //-(A3) 16579: if (XEiJ.EFA_SEPARATE_AR) { 16580: XEiJ.mpuCycleCount += 26; 16581: return XEiJ.regRn[11] -= 12; 16582: } 16583: //fallthrough 16584: case 0b100_100: //-(A4) 16585: if (XEiJ.EFA_SEPARATE_AR) { 16586: XEiJ.mpuCycleCount += 26; 16587: return XEiJ.regRn[12] -= 12; 16588: } 16589: //fallthrough 16590: case 0b100_101: //-(A5) 16591: if (XEiJ.EFA_SEPARATE_AR) { 16592: XEiJ.mpuCycleCount += 26; 16593: return XEiJ.regRn[13] -= 12; 16594: } 16595: //fallthrough 16596: case 0b100_110: //-(A6) 16597: if (XEiJ.EFA_SEPARATE_AR) { 16598: XEiJ.mpuCycleCount += 26; 16599: return XEiJ.regRn[14] -= 12; 16600: } 16601: //fallthrough 16602: case 0b100_111: //-(A7) 16603: if (XEiJ.EFA_SEPARATE_AR) { 16604: XEiJ.mpuCycleCount += 26; 16605: return XEiJ.regRn[15] -= 12; 16606: } else { 16607: XEiJ.mpuCycleCount += 26; 16608: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12; 16609: } 16610: case 0b101_000: //(d16,A0) 16611: case 0b101_001: //(d16,A1) 16612: case 0b101_010: //(d16,A2) 16613: case 0b101_011: //(d16,A3) 16614: case 0b101_100: //(d16,A4) 16615: case 0b101_101: //(d16,A5) 16616: case 0b101_110: //(d16,A6) 16617: case 0b101_111: //(d16,A7) 16618: XEiJ.mpuCycleCount += 28; 16619: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16620: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16621: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16622: } else { 16623: t = XEiJ.regPC; 16624: XEiJ.regPC = t + 2; 16625: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16626: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16627: } 16628: case 0b110_000: //(d8,A0,Rn.wl) 16629: case 0b110_001: //(d8,A1,Rn.wl) 16630: case 0b110_010: //(d8,A2,Rn.wl) 16631: case 0b110_011: //(d8,A3,Rn.wl) 16632: case 0b110_100: //(d8,A4,Rn.wl) 16633: case 0b110_101: //(d8,A5,Rn.wl) 16634: case 0b110_110: //(d8,A6,Rn.wl) 16635: case 0b110_111: //(d8,A7,Rn.wl) 16636: XEiJ.mpuCycleCount += 30; 16637: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16638: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16639: } else { 16640: w = XEiJ.regPC; 16641: XEiJ.regPC = w + 2; 16642: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16643: } 16644: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16645: + (byte) w //バイトディスプレースメント 16646: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16647: XEiJ.regRn[w >> 12])); //ロングインデックス 16648: case 0b111_000: //(xxx).W 16649: XEiJ.mpuCycleCount += 28; 16650: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16651: case 0b111_001: //(xxx).L 16652: XEiJ.mpuCycleCount += 32; 16653: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16654: case 0b111_010: //(d16,PC) 16655: XEiJ.mpuCycleCount += 28; 16656: t = XEiJ.regPC; 16657: XEiJ.regPC = t + 2; 16658: return (t //ベースレジスタ 16659: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16660: case 0b111_011: //(d8,PC,Rn.wl) 16661: XEiJ.mpuCycleCount += 30; 16662: t = XEiJ.regPC; 16663: XEiJ.regPC = t + 2; 16664: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16665: return (t //ベースレジスタ 16666: + (byte) w //バイトディスプレースメント 16667: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16668: XEiJ.regRn[w >> 12])); //ロングインデックス 16669: case 0b111_100: //#<data> 16670: XEiJ.mpuCycleCount += 24; 16671: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16672: return (XEiJ.regPC += 12) - 12; 16673: } else { 16674: t = XEiJ.regPC; 16675: XEiJ.regPC = t + 12; 16676: return t; 16677: } 16678: } //switch 16679: XEiJ.mpuCycleCount += 34; 16680: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16681: throw M68kException.m6eSignal; 16682: } //efaAnyExtd 16683: 16684: //a = efaMltExtd (ea) //| M+-WXZ | 16685: // メモリ可変モードのエクステンデッドオペランドの実効アドレスを求める 16686: // efaMltQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、 16687: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16688: @SuppressWarnings ("fallthrough") public static int efaMltExtd (int ea) throws M68kException { 16689: int t, w; 16690: switch (ea) { 16691: case 0b010_000: //(A0) 16692: if (XEiJ.EFA_SEPARATE_AR) { 16693: XEiJ.mpuCycleCount += 24; 16694: return XEiJ.regRn[ 8]; 16695: } 16696: //fallthrough 16697: case 0b010_001: //(A1) 16698: if (XEiJ.EFA_SEPARATE_AR) { 16699: XEiJ.mpuCycleCount += 24; 16700: return XEiJ.regRn[ 9]; 16701: } 16702: //fallthrough 16703: case 0b010_010: //(A2) 16704: if (XEiJ.EFA_SEPARATE_AR) { 16705: XEiJ.mpuCycleCount += 24; 16706: return XEiJ.regRn[10]; 16707: } 16708: //fallthrough 16709: case 0b010_011: //(A3) 16710: if (XEiJ.EFA_SEPARATE_AR) { 16711: XEiJ.mpuCycleCount += 24; 16712: return XEiJ.regRn[11]; 16713: } 16714: //fallthrough 16715: case 0b010_100: //(A4) 16716: if (XEiJ.EFA_SEPARATE_AR) { 16717: XEiJ.mpuCycleCount += 24; 16718: return XEiJ.regRn[12]; 16719: } 16720: //fallthrough 16721: case 0b010_101: //(A5) 16722: if (XEiJ.EFA_SEPARATE_AR) { 16723: XEiJ.mpuCycleCount += 24; 16724: return XEiJ.regRn[13]; 16725: } 16726: //fallthrough 16727: case 0b010_110: //(A6) 16728: if (XEiJ.EFA_SEPARATE_AR) { 16729: XEiJ.mpuCycleCount += 24; 16730: return XEiJ.regRn[14]; 16731: } 16732: //fallthrough 16733: case 0b010_111: //(A7) 16734: if (XEiJ.EFA_SEPARATE_AR) { 16735: XEiJ.mpuCycleCount += 24; 16736: return XEiJ.regRn[15]; 16737: } else { 16738: XEiJ.mpuCycleCount += 24; 16739: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16740: } 16741: case 0b011_000: //(A0)+ 16742: if (XEiJ.EFA_SEPARATE_AR) { 16743: XEiJ.mpuCycleCount += 24; 16744: return (XEiJ.regRn[ 8] += 12) - 12; 16745: } 16746: //fallthrough 16747: case 0b011_001: //(A1)+ 16748: if (XEiJ.EFA_SEPARATE_AR) { 16749: XEiJ.mpuCycleCount += 24; 16750: return (XEiJ.regRn[ 9] += 12) - 12; 16751: } 16752: //fallthrough 16753: case 0b011_010: //(A2)+ 16754: if (XEiJ.EFA_SEPARATE_AR) { 16755: XEiJ.mpuCycleCount += 24; 16756: return (XEiJ.regRn[10] += 12) - 12; 16757: } 16758: //fallthrough 16759: case 0b011_011: //(A3)+ 16760: if (XEiJ.EFA_SEPARATE_AR) { 16761: XEiJ.mpuCycleCount += 24; 16762: return (XEiJ.regRn[11] += 12) - 12; 16763: } 16764: //fallthrough 16765: case 0b011_100: //(A4)+ 16766: if (XEiJ.EFA_SEPARATE_AR) { 16767: XEiJ.mpuCycleCount += 24; 16768: return (XEiJ.regRn[12] += 12) - 12; 16769: } 16770: //fallthrough 16771: case 0b011_101: //(A5)+ 16772: if (XEiJ.EFA_SEPARATE_AR) { 16773: XEiJ.mpuCycleCount += 24; 16774: return (XEiJ.regRn[13] += 12) - 12; 16775: } 16776: //fallthrough 16777: case 0b011_110: //(A6)+ 16778: if (XEiJ.EFA_SEPARATE_AR) { 16779: XEiJ.mpuCycleCount += 24; 16780: return (XEiJ.regRn[14] += 12) - 12; 16781: } 16782: //fallthrough 16783: case 0b011_111: //(A7)+ 16784: if (XEiJ.EFA_SEPARATE_AR) { 16785: XEiJ.mpuCycleCount += 24; 16786: return (XEiJ.regRn[15] += 12) - 12; 16787: } else { 16788: XEiJ.mpuCycleCount += 24; 16789: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12; 16790: } 16791: case 0b100_000: //-(A0) 16792: case 0b100_001: //-(A1) 16793: case 0b100_010: //-(A2) 16794: case 0b100_011: //-(A3) 16795: case 0b100_100: //-(A4) 16796: case 0b100_101: //-(A5) 16797: case 0b100_110: //-(A6) 16798: case 0b100_111: //-(A7) 16799: XEiJ.mpuCycleCount += 26; 16800: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12; 16801: case 0b101_000: //(d16,A0) 16802: case 0b101_001: //(d16,A1) 16803: case 0b101_010: //(d16,A2) 16804: case 0b101_011: //(d16,A3) 16805: case 0b101_100: //(d16,A4) 16806: case 0b101_101: //(d16,A5) 16807: case 0b101_110: //(d16,A6) 16808: case 0b101_111: //(d16,A7) 16809: XEiJ.mpuCycleCount += 28; 16810: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16811: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16812: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16813: } else { 16814: t = XEiJ.regPC; 16815: XEiJ.regPC = t + 2; 16816: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16817: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16818: } 16819: case 0b110_000: //(d8,A0,Rn.wl) 16820: case 0b110_001: //(d8,A1,Rn.wl) 16821: case 0b110_010: //(d8,A2,Rn.wl) 16822: case 0b110_011: //(d8,A3,Rn.wl) 16823: case 0b110_100: //(d8,A4,Rn.wl) 16824: case 0b110_101: //(d8,A5,Rn.wl) 16825: case 0b110_110: //(d8,A6,Rn.wl) 16826: case 0b110_111: //(d8,A7,Rn.wl) 16827: XEiJ.mpuCycleCount += 30; 16828: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16829: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16830: } else { 16831: w = XEiJ.regPC; 16832: XEiJ.regPC = w + 2; 16833: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16834: } 16835: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16836: + (byte) w //バイトディスプレースメント 16837: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16838: XEiJ.regRn[w >> 12])); //ロングインデックス 16839: case 0b111_000: //(xxx).W 16840: XEiJ.mpuCycleCount += 28; 16841: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16842: case 0b111_001: //(xxx).L 16843: XEiJ.mpuCycleCount += 32; 16844: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16845: } //switch 16846: XEiJ.mpuCycleCount += 34; 16847: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16848: throw M68kException.m6eSignal; 16849: } //efaMltExtd 16850: 16851: //a = efaLeaPea (ea) //| M WXZP | 16852: // LEA命令とPEA命令のオペランドの実効アドレスを求める 16853: // efaCntWordとの違いはサイクル数のみ 16854: // LEA命令のベースサイクル数4を含んでいるのでLEA命令ではベースサイクル数を加えなくてよい 16855: // PEA命令のベースサイクル数は12-4=8 16856: @SuppressWarnings ("fallthrough") public static int efaLeaPea (int ea) throws M68kException { 16857: int t, w; 16858: switch (ea) { 16859: case 0b010_000: //(A0) 16860: if (XEiJ.EFA_SEPARATE_AR) { 16861: XEiJ.mpuCycleCount += 4; 16862: return XEiJ.regRn[ 8]; 16863: } 16864: //fallthrough 16865: case 0b010_001: //(A1) 16866: if (XEiJ.EFA_SEPARATE_AR) { 16867: XEiJ.mpuCycleCount += 4; 16868: return XEiJ.regRn[ 9]; 16869: } 16870: //fallthrough 16871: case 0b010_010: //(A2) 16872: if (XEiJ.EFA_SEPARATE_AR) { 16873: XEiJ.mpuCycleCount += 4; 16874: return XEiJ.regRn[10]; 16875: } 16876: //fallthrough 16877: case 0b010_011: //(A3) 16878: if (XEiJ.EFA_SEPARATE_AR) { 16879: XEiJ.mpuCycleCount += 4; 16880: return XEiJ.regRn[11]; 16881: } 16882: //fallthrough 16883: case 0b010_100: //(A4) 16884: if (XEiJ.EFA_SEPARATE_AR) { 16885: XEiJ.mpuCycleCount += 4; 16886: return XEiJ.regRn[12]; 16887: } 16888: //fallthrough 16889: case 0b010_101: //(A5) 16890: if (XEiJ.EFA_SEPARATE_AR) { 16891: XEiJ.mpuCycleCount += 4; 16892: return XEiJ.regRn[13]; 16893: } 16894: //fallthrough 16895: case 0b010_110: //(A6) 16896: if (XEiJ.EFA_SEPARATE_AR) { 16897: XEiJ.mpuCycleCount += 4; 16898: return XEiJ.regRn[14]; 16899: } 16900: //fallthrough 16901: case 0b010_111: //(A7) 16902: if (XEiJ.EFA_SEPARATE_AR) { 16903: XEiJ.mpuCycleCount += 4; 16904: return XEiJ.regRn[15]; 16905: } else { 16906: XEiJ.mpuCycleCount += 4; 16907: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16908: } 16909: case 0b101_000: //(d16,A0) 16910: case 0b101_001: //(d16,A1) 16911: case 0b101_010: //(d16,A2) 16912: case 0b101_011: //(d16,A3) 16913: case 0b101_100: //(d16,A4) 16914: case 0b101_101: //(d16,A5) 16915: case 0b101_110: //(d16,A6) 16916: case 0b101_111: //(d16,A7) 16917: XEiJ.mpuCycleCount += 8; 16918: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16919: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16920: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16921: } else { 16922: t = XEiJ.regPC; 16923: XEiJ.regPC = t + 2; 16924: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16925: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16926: } 16927: case 0b110_000: //(d8,A0,Rn.wl) 16928: case 0b110_001: //(d8,A1,Rn.wl) 16929: case 0b110_010: //(d8,A2,Rn.wl) 16930: case 0b110_011: //(d8,A3,Rn.wl) 16931: case 0b110_100: //(d8,A4,Rn.wl) 16932: case 0b110_101: //(d8,A5,Rn.wl) 16933: case 0b110_110: //(d8,A6,Rn.wl) 16934: case 0b110_111: //(d8,A7,Rn.wl) 16935: XEiJ.mpuCycleCount += 12; 16936: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16937: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16938: } else { 16939: w = XEiJ.regPC; 16940: XEiJ.regPC = w + 2; 16941: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16942: } 16943: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16944: + (byte) w //バイトディスプレースメント 16945: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16946: XEiJ.regRn[w >> 12])); //ロングインデックス 16947: case 0b111_000: //(xxx).W 16948: XEiJ.mpuCycleCount += 8; 16949: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16950: case 0b111_001: //(xxx).L 16951: XEiJ.mpuCycleCount += 12; 16952: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16953: case 0b111_010: //(d16,PC) 16954: XEiJ.mpuCycleCount += 8; 16955: t = XEiJ.regPC; 16956: XEiJ.regPC = t + 2; 16957: return (t //ベースレジスタ 16958: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16959: case 0b111_011: //(d8,PC,Rn.wl) 16960: XEiJ.mpuCycleCount += 12; 16961: t = XEiJ.regPC; 16962: XEiJ.regPC = t + 2; 16963: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16964: return (t //ベースレジスタ 16965: + (byte) w //バイトディスプレースメント 16966: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16967: XEiJ.regRn[w >> 12])); //ロングインデックス 16968: } //switch 16969: XEiJ.mpuCycleCount += 34; 16970: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16971: throw M68kException.m6eSignal; 16972: } //efaLeaPea 16973: 16974: //a = efaJmpJsr (ea) //| M WXZP | 16975: // JMP命令とJSR命令のオペランドの実効アドレスを求める 16976: // efaCntWordとの違いはサイクル数のみ 16977: // JMP命令のベースサイクル数8を含んでいるのでJMP命令ではベースサイクル数を加えなくてよい 16978: // JSR命令のベースサイクル数は16-8=8 16979: @SuppressWarnings ("fallthrough") public static int efaJmpJsr (int ea) throws M68kException { 16980: int t, w; 16981: switch (ea) { 16982: case 0b010_000: //(A0) 16983: if (XEiJ.EFA_SEPARATE_AR) { 16984: XEiJ.mpuCycleCount += 8; 16985: return XEiJ.regRn[ 8]; 16986: } 16987: //fallthrough 16988: case 0b010_001: //(A1) 16989: if (XEiJ.EFA_SEPARATE_AR) { 16990: XEiJ.mpuCycleCount += 8; 16991: return XEiJ.regRn[ 9]; 16992: } 16993: //fallthrough 16994: case 0b010_010: //(A2) 16995: if (XEiJ.EFA_SEPARATE_AR) { 16996: XEiJ.mpuCycleCount += 8; 16997: return XEiJ.regRn[10]; 16998: } 16999: //fallthrough 17000: case 0b010_011: //(A3) 17001: if (XEiJ.EFA_SEPARATE_AR) { 17002: XEiJ.mpuCycleCount += 8; 17003: return XEiJ.regRn[11]; 17004: } 17005: //fallthrough 17006: case 0b010_100: //(A4) 17007: if (XEiJ.EFA_SEPARATE_AR) { 17008: XEiJ.mpuCycleCount += 8; 17009: return XEiJ.regRn[12]; 17010: } 17011: //fallthrough 17012: case 0b010_101: //(A5) 17013: if (XEiJ.EFA_SEPARATE_AR) { 17014: XEiJ.mpuCycleCount += 8; 17015: return XEiJ.regRn[13]; 17016: } 17017: //fallthrough 17018: case 0b010_110: //(A6) 17019: if (XEiJ.EFA_SEPARATE_AR) { 17020: XEiJ.mpuCycleCount += 8; 17021: return XEiJ.regRn[14]; 17022: } 17023: //fallthrough 17024: case 0b010_111: //(A7) 17025: if (XEiJ.EFA_SEPARATE_AR) { 17026: XEiJ.mpuCycleCount += 8; 17027: return XEiJ.regRn[15]; 17028: } else { 17029: XEiJ.mpuCycleCount += 8; 17030: return XEiJ.regRn[ea - (0b010_000 - 8)]; 17031: } 17032: case 0b101_000: //(d16,A0) 17033: case 0b101_001: //(d16,A1) 17034: case 0b101_010: //(d16,A2) 17035: case 0b101_011: //(d16,A3) 17036: case 0b101_100: //(d16,A4) 17037: case 0b101_101: //(d16,A5) 17038: case 0b101_110: //(d16,A6) 17039: case 0b101_111: //(d16,A7) 17040: XEiJ.mpuCycleCount += 10; 17041: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17042: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17043: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17044: } else { 17045: t = XEiJ.regPC; 17046: XEiJ.regPC = t + 2; 17047: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17048: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17049: } 17050: case 0b110_000: //(d8,A0,Rn.wl) 17051: case 0b110_001: //(d8,A1,Rn.wl) 17052: case 0b110_010: //(d8,A2,Rn.wl) 17053: case 0b110_011: //(d8,A3,Rn.wl) 17054: case 0b110_100: //(d8,A4,Rn.wl) 17055: case 0b110_101: //(d8,A5,Rn.wl) 17056: case 0b110_110: //(d8,A6,Rn.wl) 17057: case 0b110_111: //(d8,A7,Rn.wl) 17058: XEiJ.mpuCycleCount += 14; 17059: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17060: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17061: } else { 17062: w = XEiJ.regPC; 17063: XEiJ.regPC = w + 2; 17064: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17065: } 17066: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17067: + (byte) w //バイトディスプレースメント 17068: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17069: XEiJ.regRn[w >> 12])); //ロングインデックス 17070: case 0b111_000: //(xxx).W 17071: XEiJ.mpuCycleCount += 10; 17072: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17073: case 0b111_001: //(xxx).L 17074: XEiJ.mpuCycleCount += 12; 17075: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17076: case 0b111_010: //(d16,PC) 17077: XEiJ.mpuCycleCount += 10; 17078: t = XEiJ.regPC; 17079: XEiJ.regPC = t + 2; 17080: return (t //ベースレジスタ 17081: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17082: case 0b111_011: //(d8,PC,Rn.wl) 17083: XEiJ.mpuCycleCount += 14; 17084: t = XEiJ.regPC; 17085: XEiJ.regPC = t + 2; 17086: w = XEiJ.busRwze (t); //pcwz。拡張ワード 17087: return (t //ベースレジスタ 17088: + (byte) w //バイトディスプレースメント 17089: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17090: XEiJ.regRn[w >> 12])); //ロングインデックス 17091: } //switch 17092: XEiJ.mpuCycleCount += 34; 17093: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17094: throw M68kException.m6eSignal; 17095: } //efaJmpJsr 17096: 17097: 17098: 17099: } //class MC68000 17100: 17101: 17102: