1: //======================================================================================== 2: // MC68000.java 3: // en:MC68010 core 4: // ja:MC68010コア 5: // Copyright (C) 2003-2025 Makoto Kamada 6: // 7: // This file is part of the XEiJ (X68000 Emulator in Java). 8: // You can use, modify and redistribute the XEiJ if the conditions are met. 9: // Read the XEiJ License for more details. 10: // https://stdkmd.net/xeij/ 11: //======================================================================================== 12: 13: package xeij; 14: 15: import java.lang.*; //Boolean,Character,Class,Comparable,Double,Exception,Float,IllegalArgumentException,Integer,Long,Math,Number,Object,Runnable,SecurityException,String,StringBuilder,System 16: 17: public class MC68010 { 18: 19: public static void mpuCore () { 20: 21: //例外ループ 22: // 別のメソッドで検出された例外を命令ループの外側でcatchすることで命令ループを高速化する 23: errorLoop: 24: while (XEiJ.mpuClockTime < XEiJ.mpuClockLimit) { 25: try { 26: //命令ループ 27: while (XEiJ.mpuClockTime < XEiJ.mpuClockLimit) { 28: int t; 29: //命令を実行する 30: XEiJ.mpuTraceFlag = XEiJ.regSRT1; //命令実行前のsrT1 31: XEiJ.mpuCycleCount = 0; //第1オペコードからROMのアクセスウエイトを有効にする。命令のサイクル数はすべてXEiJ.mpuCycleCount+=~で加えること 32: XEiJ.regPC0 = t = XEiJ.regPC; //命令の先頭アドレス 33: XEiJ.regPC = t + 2; 34: XEiJ.regOC = (InstructionBreakPoint.IBP_ON ? InstructionBreakPoint.ibpOp1MemoryMap : DataBreakPoint.DBP_ON ? XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap : XEiJ.busMemoryMap)[t >>> XEiJ.BUS_PAGE_BITS].mmdRwz (t); //第1オペコード。必ずゼロ拡張すること。pcに奇数が入っていることはないのでアドレスエラーのチェックを省略する 35: 36: //命令の処理 37: // 第1オペコードの上位10bitで分岐する 38: // 分岐方法 39: // XEiJ.IRP_STATIC 40: // 手順 41: // 命令の処理をstaticメソッドに書く 42: // switch(XEiJ.regOC>>>6)で分岐してirpXXX()で呼び出す 43: // Javaはメソッドのサイズに制限があるためswitch(XEiJ.regOC>>>6)の中にすべての命令の処理を書くことができない 44: // C言語のときはswitchの中にすべての命令の処理を書くことができる 45: // 利点 46: // 速い 47: // XEiJ.IRP_ENUM_DIRECT 48: // 手順 49: // 命令の処理をenum bodyのメソッドに書く 50: // switch(XEiJ.regOC>>>6)で分岐してIRP.XXX.exec()で呼び出す 51: // 欠点 52: // XEiJ.IRP_STATICよりも遅い 53: // staticなメソッドを直接呼び出せることに変わりないはずだが、インライン展開などの最適化が弱くなるのかも知れない 54: // XEiJ.IRP_STATICと共存させようとすると命令の処理を2回書かなければならず管理が面倒になる 55: // XEiJ.IRP_ENUM_INDIRECT 56: // 手順 57: // 命令の処理をenum bodyのメソッドに書く 58: // XEiJ.regOCの上位10bit→enum値の配列を用意する 59: // IRPMAP.IRPMAP0[XEiJ.regOC>>>6].exec()で呼び出す 60: // C言語のときは関数を指すポインタの配列が使えるのでIRPMAP0[XEiJ.regOC>>>6]()で済む 61: // 利点 62: // 命令の処理を動的に組み替えることができる 63: // 欠点 64: // XEiJ.IRP_ENUM_DIRECTよりも遅い 65: // 配列参照による多分岐とenum bodyのメソッドの動的呼び出しによる多分岐の2段階になる 66: // XEiJ.IRP_STATICと共存させようとすると命令の処理を2回書かなければならず管理が面倒になる 67: // enum値の配列の初期化コードが大きくなるのでクラスを分ける必要がある 68: irpSwitch: 69: switch (XEiJ.regOC >>> 6) { //第1オペコードの上位10ビット。XEiJ.regOCはゼロ拡張されているので0b1111_111_111&を省略 70: 71: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 72: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 73: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 74: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 75: //ORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_000_mmm_rrr-{data} 76: //OR.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_000_mmm_rrr-{data} [ORI.B #<data>,<ea>] 77: //ORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_000_000_111_100-{data} 78: case 0b0000_000_000: 79: irpOriByte (); 80: break irpSwitch; 81: 82: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 83: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 84: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 85: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 86: //ORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_001_mmm_rrr-{data} 87: //OR.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_001_mmm_rrr-{data} [ORI.W #<data>,<ea>] 88: //ORI.W #<data>,SR |-|012346|P|*****|*****| |0000_000_001_111_100-{data} 89: case 0b0000_000_001: 90: irpOriWord (); 91: break irpSwitch; 92: 93: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 94: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 95: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 96: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 97: //ORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_010_mmm_rrr-{data} 98: //OR.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_010_mmm_rrr-{data} [ORI.L #<data>,<ea>] 99: case 0b0000_000_010: 100: irpOriLong (); 101: break irpSwitch; 102: 103: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 104: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 105: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 106: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 107: //BITREV.L Dr |-|------|-|-----|-----|D |0000_000_011_000_rrr (ISA_C) 108: case 0b0000_000_011: 109: irpCmp2Chk2Byte (); 110: break irpSwitch; 111: 112: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 113: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 114: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 115: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 116: //BTST.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_100_000_rrr 117: //MOVEP.W (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_100_001_rrr-{data} 118: //BTST.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZPI|0000_qqq_100_mmm_rrr 119: case 0b0000_000_100: 120: case 0b0000_001_100: 121: case 0b0000_010_100: 122: case 0b0000_011_100: 123: case 0b0000_100_100: 124: case 0b0000_101_100: 125: case 0b0000_110_100: 126: case 0b0000_111_100: 127: irpBtstReg (); 128: break irpSwitch; 129: 130: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 131: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 132: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 133: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 134: //BCHG.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_101_000_rrr 135: //MOVEP.L (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_101_001_rrr-{data} 136: //BCHG.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_101_mmm_rrr 137: case 0b0000_000_101: 138: case 0b0000_001_101: 139: case 0b0000_010_101: 140: case 0b0000_011_101: 141: case 0b0000_100_101: 142: case 0b0000_101_101: 143: case 0b0000_110_101: 144: case 0b0000_111_101: 145: irpBchgReg (); 146: break irpSwitch; 147: 148: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 149: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 150: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 152: //BCLR.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_110_000_rrr 153: //MOVEP.W Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_110_001_rrr-{data} 154: //BCLR.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_110_mmm_rrr 155: case 0b0000_000_110: 156: case 0b0000_001_110: 157: case 0b0000_010_110: 158: case 0b0000_011_110: 159: case 0b0000_100_110: 160: case 0b0000_101_110: 161: case 0b0000_110_110: 162: case 0b0000_111_110: 163: irpBclrReg (); 164: break irpSwitch; 165: 166: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 167: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 168: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 169: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 170: //BSET.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_111_000_rrr 171: //MOVEP.L Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_111_001_rrr-{data} 172: //BSET.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_111_mmm_rrr 173: case 0b0000_000_111: 174: case 0b0000_001_111: 175: case 0b0000_010_111: 176: case 0b0000_011_111: 177: case 0b0000_100_111: 178: case 0b0000_101_111: 179: case 0b0000_110_111: 180: case 0b0000_111_111: 181: irpBsetReg (); 182: break irpSwitch; 183: 184: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 185: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 186: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 187: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 188: //ANDI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_000_mmm_rrr-{data} 189: //AND.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_000_mmm_rrr-{data} [ANDI.B #<data>,<ea>] 190: //ANDI.B #<data>,CCR |-|012346|-|*****|*****| |0000_001_000_111_100-{data} 191: case 0b0000_001_000: 192: irpAndiByte (); 193: break irpSwitch; 194: 195: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 196: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 197: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 198: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 199: //ANDI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_001_mmm_rrr-{data} 200: //AND.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_001_mmm_rrr-{data} [ANDI.W #<data>,<ea>] 201: //ANDI.W #<data>,SR |-|012346|P|*****|*****| |0000_001_001_111_100-{data} 202: case 0b0000_001_001: 203: irpAndiWord (); 204: break irpSwitch; 205: 206: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 207: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 208: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 209: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 210: //ANDI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_010_mmm_rrr-{data} 211: //AND.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_010_mmm_rrr-{data} [ANDI.L #<data>,<ea>] 212: case 0b0000_001_010: 213: irpAndiLong (); 214: break irpSwitch; 215: 216: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 217: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 218: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 219: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 220: //BYTEREV.L Dr |-|------|-|-----|-----|D |0000_001_011_000_rrr (ISA_C) 221: case 0b0000_001_011: 222: irpCmp2Chk2Word (); 223: break irpSwitch; 224: 225: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 226: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 227: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 228: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 229: //SUBI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_000_mmm_rrr-{data} 230: //SUB.B #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_000_mmm_rrr-{data} [SUBI.B #<data>,<ea>] 231: case 0b0000_010_000: 232: irpSubiByte (); 233: break irpSwitch; 234: 235: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 236: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 237: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 238: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 239: //SUBI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_001_mmm_rrr-{data} 240: //SUB.W #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_001_mmm_rrr-{data} [SUBI.W #<data>,<ea>] 241: case 0b0000_010_001: 242: irpSubiWord (); 243: break irpSwitch; 244: 245: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 246: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 247: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 248: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 249: //SUBI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_010_mmm_rrr-{data} 250: //SUB.L #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_010_mmm_rrr-{data} [SUBI.L #<data>,<ea>] 251: case 0b0000_010_010: 252: irpSubiLong (); 253: break irpSwitch; 254: 255: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 256: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 257: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 258: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 259: //FF1.L Dr |-|------|-|-UUUU|-**00|D |0000_010_011_000_rrr (ISA_C) 260: case 0b0000_010_011: 261: irpCmp2Chk2Long (); 262: break irpSwitch; 263: 264: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 265: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 266: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 267: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 268: //ADDI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_000_mmm_rrr-{data} 269: case 0b0000_011_000: 270: irpAddiByte (); 271: break irpSwitch; 272: 273: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 274: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 275: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 276: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 277: //ADDI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_001_mmm_rrr-{data} 278: case 0b0000_011_001: 279: irpAddiWord (); 280: break irpSwitch; 281: 282: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 283: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 284: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 285: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 286: //ADDI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_010_mmm_rrr-{data} 287: case 0b0000_011_010: 288: irpAddiLong (); 289: break irpSwitch; 290: 291: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 292: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 293: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 294: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 295: //BTST.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_000_000_rrr-{data} 296: //BTST.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZP |0000_100_000_mmm_rrr-{data} 297: case 0b0000_100_000: 298: irpBtstImm (); 299: break irpSwitch; 300: 301: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 302: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 303: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 304: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 305: //BCHG.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_001_000_rrr-{data} 306: //BCHG.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_001_mmm_rrr-{data} 307: case 0b0000_100_001: 308: irpBchgImm (); 309: break irpSwitch; 310: 311: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 312: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 313: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 314: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 315: //BCLR.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_010_000_rrr-{data} 316: //BCLR.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_010_mmm_rrr-{data} 317: case 0b0000_100_010: 318: irpBclrImm (); 319: break irpSwitch; 320: 321: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 322: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 323: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 325: //BSET.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_011_000_rrr-{data} 326: //BSET.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_011_mmm_rrr-{data} 327: case 0b0000_100_011: 328: irpBsetImm (); 329: break irpSwitch; 330: 331: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 332: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 333: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 334: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 335: //EORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} 336: //EOR.B #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} [EORI.B #<data>,<ea>] 337: //EORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_101_000_111_100-{data} 338: case 0b0000_101_000: 339: irpEoriByte (); 340: break irpSwitch; 341: 342: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 343: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 344: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 345: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 346: //EORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} 347: //EOR.W #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} [EORI.W #<data>,<ea>] 348: //EORI.W #<data>,SR |-|012346|P|*****|*****| |0000_101_001_111_100-{data} 349: case 0b0000_101_001: 350: irpEoriWord (); 351: break irpSwitch; 352: 353: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 354: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 355: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 356: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 357: //EORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} 358: //EOR.L #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} [EORI.L #<data>,<ea>] 359: case 0b0000_101_010: 360: irpEoriLong (); 361: break irpSwitch; 362: 363: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 364: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 365: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 366: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 367: //CMPI.B #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_000_mmm_rrr-{data} 368: //CMP.B #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_000_mmm_rrr-{data} [CMPI.B #<data>,<ea>] 369: case 0b0000_110_000: 370: irpCmpiByte (); 371: break irpSwitch; 372: 373: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 374: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 375: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 376: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 377: //CMPI.W #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_001_mmm_rrr-{data} 378: //CMP.W #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_001_mmm_rrr-{data} [CMPI.W #<data>,<ea>] 379: case 0b0000_110_001: 380: irpCmpiWord (); 381: break irpSwitch; 382: 383: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 384: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 385: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 387: //CMPI.L #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_010_mmm_rrr-{data} 388: //CMP.L #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_010_mmm_rrr-{data} [CMPI.L #<data>,<ea>] 389: case 0b0000_110_010: 390: irpCmpiLong (); 391: break irpSwitch; 392: 393: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 394: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 395: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 396: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 397: //MOVES.B <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn000000000000 398: //MOVES.B Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn100000000000 399: case 0b0000_111_000: 400: irpMovesByte (); 401: break irpSwitch; 402: 403: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 404: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 405: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 406: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 407: //MOVES.W <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn000000000000 408: //MOVES.W Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn100000000000 409: case 0b0000_111_001: 410: irpMovesWord (); 411: break irpSwitch; 412: 413: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 414: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 415: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 416: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 417: //MOVES.L <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn000000000000 418: //MOVES.L Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn100000000000 419: case 0b0000_111_010: 420: irpMovesLong (); 421: break irpSwitch; 422: 423: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 424: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 425: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 426: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 427: //MOVE.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr 428: case 0b0001_000_000: 429: case 0b0001_001_000: 430: case 0b0001_010_000: 431: case 0b0001_011_000: 432: case 0b0001_100_000: 433: case 0b0001_101_000: 434: case 0b0001_110_000: 435: case 0b0001_111_000: 436: irpMoveToDRByte (); 437: break irpSwitch; 438: 439: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 440: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 441: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 442: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 443: //MOVE.B <ea>,(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr 444: case 0b0001_000_010: 445: case 0b0001_001_010: 446: case 0b0001_010_010: 447: case 0b0001_011_010: 448: case 0b0001_100_010: 449: case 0b0001_101_010: 450: case 0b0001_110_010: 451: case 0b0001_111_010: 452: irpMoveToMMByte (); 453: break irpSwitch; 454: 455: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 456: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 457: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 458: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 459: //MOVE.B <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr 460: case 0b0001_000_011: 461: case 0b0001_001_011: 462: case 0b0001_010_011: 463: case 0b0001_011_011: 464: case 0b0001_100_011: 465: case 0b0001_101_011: 466: case 0b0001_110_011: 467: case 0b0001_111_011: 468: irpMoveToMPByte (); 469: break irpSwitch; 470: 471: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 472: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 473: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 474: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 475: //MOVE.B <ea>,-(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr 476: case 0b0001_000_100: 477: case 0b0001_001_100: 478: case 0b0001_010_100: 479: case 0b0001_011_100: 480: case 0b0001_100_100: 481: case 0b0001_101_100: 482: case 0b0001_110_100: 483: case 0b0001_111_100: 484: irpMoveToMNByte (); 485: break irpSwitch; 486: 487: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 488: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 489: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 491: //MOVE.B <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr 492: case 0b0001_000_101: 493: case 0b0001_001_101: 494: case 0b0001_010_101: 495: case 0b0001_011_101: 496: case 0b0001_100_101: 497: case 0b0001_101_101: 498: case 0b0001_110_101: 499: case 0b0001_111_101: 500: irpMoveToMWByte (); 501: break irpSwitch; 502: 503: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 504: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 505: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 506: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 507: //MOVE.B <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr 508: case 0b0001_000_110: 509: case 0b0001_001_110: 510: case 0b0001_010_110: 511: case 0b0001_011_110: 512: case 0b0001_100_110: 513: case 0b0001_101_110: 514: case 0b0001_110_110: 515: case 0b0001_111_110: 516: irpMoveToMXByte (); 517: break irpSwitch; 518: 519: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 520: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 521: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 522: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 523: //MOVE.B <ea>,(xxx).W |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr 524: case 0b0001_000_111: 525: irpMoveToZWByte (); 526: break irpSwitch; 527: 528: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 529: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 530: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 531: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 532: //MOVE.B <ea>,(xxx).L |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr 533: case 0b0001_001_111: 534: irpMoveToZLByte (); 535: break irpSwitch; 536: 537: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 538: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 539: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 540: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 541: //MOVE.L <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr 542: case 0b0010_000_000: 543: case 0b0010_001_000: 544: case 0b0010_010_000: 545: case 0b0010_011_000: 546: case 0b0010_100_000: 547: case 0b0010_101_000: 548: case 0b0010_110_000: 549: case 0b0010_111_000: 550: irpMoveToDRLong (); 551: break irpSwitch; 552: 553: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 554: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 555: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 556: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 557: //MOVEA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr 558: //MOVE.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq] 559: case 0b0010_000_001: 560: case 0b0010_001_001: 561: case 0b0010_010_001: 562: case 0b0010_011_001: 563: case 0b0010_100_001: 564: case 0b0010_101_001: 565: case 0b0010_110_001: 566: case 0b0010_111_001: 567: irpMoveaLong (); 568: break irpSwitch; 569: 570: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 571: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 572: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 573: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 574: //MOVE.L <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr 575: case 0b0010_000_010: 576: case 0b0010_001_010: 577: case 0b0010_010_010: 578: case 0b0010_011_010: 579: case 0b0010_100_010: 580: case 0b0010_101_010: 581: case 0b0010_110_010: 582: case 0b0010_111_010: 583: irpMoveToMMLong (); 584: break irpSwitch; 585: 586: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 587: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 588: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 589: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 590: //MOVE.L <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr 591: case 0b0010_000_011: 592: case 0b0010_001_011: 593: case 0b0010_010_011: 594: case 0b0010_011_011: 595: case 0b0010_100_011: 596: case 0b0010_101_011: 597: case 0b0010_110_011: 598: case 0b0010_111_011: 599: irpMoveToMPLong (); 600: break irpSwitch; 601: 602: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 603: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 604: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 605: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 606: //MOVE.L <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr 607: case 0b0010_000_100: 608: case 0b0010_001_100: 609: case 0b0010_010_100: 610: case 0b0010_011_100: 611: case 0b0010_100_100: 612: case 0b0010_101_100: 613: case 0b0010_110_100: 614: case 0b0010_111_100: 615: irpMoveToMNLong (); 616: break irpSwitch; 617: 618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 619: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 620: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 622: //MOVE.L <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr 623: case 0b0010_000_101: 624: case 0b0010_001_101: 625: case 0b0010_010_101: 626: case 0b0010_011_101: 627: case 0b0010_100_101: 628: case 0b0010_101_101: 629: case 0b0010_110_101: 630: case 0b0010_111_101: 631: irpMoveToMWLong (); 632: break irpSwitch; 633: 634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 635: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 636: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 637: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 638: //MOVE.L <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr 639: case 0b0010_000_110: 640: case 0b0010_001_110: 641: case 0b0010_010_110: 642: case 0b0010_011_110: 643: case 0b0010_100_110: 644: case 0b0010_101_110: 645: case 0b0010_110_110: 646: case 0b0010_111_110: 647: irpMoveToMXLong (); 648: break irpSwitch; 649: 650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 651: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 652: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 654: //MOVE.L <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr 655: case 0b0010_000_111: 656: irpMoveToZWLong (); 657: break irpSwitch; 658: 659: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 660: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 661: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 662: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 663: //MOVE.L <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr 664: case 0b0010_001_111: 665: irpMoveToZLLong (); 666: break irpSwitch; 667: 668: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 669: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 670: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 671: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 672: //MOVE.W <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr 673: case 0b0011_000_000: 674: case 0b0011_001_000: 675: case 0b0011_010_000: 676: case 0b0011_011_000: 677: case 0b0011_100_000: 678: case 0b0011_101_000: 679: case 0b0011_110_000: 680: case 0b0011_111_000: 681: irpMoveToDRWord (); 682: break irpSwitch; 683: 684: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 685: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 686: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 687: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 688: //MOVEA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr 689: //MOVE.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq] 690: case 0b0011_000_001: 691: case 0b0011_001_001: 692: case 0b0011_010_001: 693: case 0b0011_011_001: 694: case 0b0011_100_001: 695: case 0b0011_101_001: 696: case 0b0011_110_001: 697: case 0b0011_111_001: 698: irpMoveaWord (); 699: break irpSwitch; 700: 701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 702: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 703: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 704: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 705: //MOVE.W <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr 706: case 0b0011_000_010: 707: case 0b0011_001_010: 708: case 0b0011_010_010: 709: case 0b0011_011_010: 710: case 0b0011_100_010: 711: case 0b0011_101_010: 712: case 0b0011_110_010: 713: case 0b0011_111_010: 714: irpMoveToMMWord (); 715: break irpSwitch; 716: 717: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 718: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 719: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 720: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 721: //MOVE.W <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr 722: case 0b0011_000_011: 723: case 0b0011_001_011: 724: case 0b0011_010_011: 725: case 0b0011_011_011: 726: case 0b0011_100_011: 727: case 0b0011_101_011: 728: case 0b0011_110_011: 729: case 0b0011_111_011: 730: irpMoveToMPWord (); 731: break irpSwitch; 732: 733: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 734: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 735: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 736: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 737: //MOVE.W <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr 738: case 0b0011_000_100: 739: case 0b0011_001_100: 740: case 0b0011_010_100: 741: case 0b0011_011_100: 742: case 0b0011_100_100: 743: case 0b0011_101_100: 744: case 0b0011_110_100: 745: case 0b0011_111_100: 746: irpMoveToMNWord (); 747: break irpSwitch; 748: 749: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 750: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 751: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 752: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 753: //MOVE.W <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr 754: case 0b0011_000_101: 755: case 0b0011_001_101: 756: case 0b0011_010_101: 757: case 0b0011_011_101: 758: case 0b0011_100_101: 759: case 0b0011_101_101: 760: case 0b0011_110_101: 761: case 0b0011_111_101: 762: irpMoveToMWWord (); 763: break irpSwitch; 764: 765: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 766: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 767: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 768: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 769: //MOVE.W <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr 770: case 0b0011_000_110: 771: case 0b0011_001_110: 772: case 0b0011_010_110: 773: case 0b0011_011_110: 774: case 0b0011_100_110: 775: case 0b0011_101_110: 776: case 0b0011_110_110: 777: case 0b0011_111_110: 778: irpMoveToMXWord (); 779: break irpSwitch; 780: 781: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 782: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 783: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 784: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 785: //MOVE.W <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr 786: case 0b0011_000_111: 787: irpMoveToZWWord (); 788: break irpSwitch; 789: 790: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 791: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 792: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 793: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 794: //MOVE.W <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr 795: case 0b0011_001_111: 796: irpMoveToZLWord (); 797: break irpSwitch; 798: 799: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 800: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 801: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 802: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 803: //NEGX.B <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_000_mmm_rrr 804: case 0b0100_000_000: 805: irpNegxByte (); 806: break irpSwitch; 807: 808: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 809: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 810: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 812: //NEGX.W <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_001_mmm_rrr 813: case 0b0100_000_001: 814: irpNegxWord (); 815: break irpSwitch; 816: 817: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 818: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 819: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 820: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 821: //NEGX.L <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_010_mmm_rrr 822: case 0b0100_000_010: 823: irpNegxLong (); 824: break irpSwitch; 825: 826: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 827: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 828: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 829: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 830: //MOVE.W SR,<ea> |-|-12346|P|*****|-----|D M+-WXZ |0100_000_011_mmm_rrr 831: case 0b0100_000_011: 832: irpMoveFromSR (); 833: break irpSwitch; 834: 835: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 836: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 837: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 838: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 839: //CHK.W <ea>,Dq |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr 840: case 0b0100_000_110: 841: case 0b0100_001_110: 842: case 0b0100_010_110: 843: case 0b0100_011_110: 844: case 0b0100_100_110: 845: case 0b0100_101_110: 846: case 0b0100_110_110: 847: case 0b0100_111_110: 848: irpChkWord (); 849: break irpSwitch; 850: 851: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 852: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 853: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 854: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 855: //LEA.L <ea>,Aq |-|012346|-|-----|-----| M WXZP |0100_qqq_111_mmm_rrr 856: case 0b0100_000_111: 857: case 0b0100_001_111: 858: case 0b0100_010_111: 859: case 0b0100_011_111: 860: case 0b0100_100_111: 861: case 0b0100_101_111: 862: case 0b0100_110_111: 863: case 0b0100_111_111: 864: irpLea (); 865: break irpSwitch; 866: 867: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 868: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 869: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 870: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 871: //CLR.B <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_000_mmm_rrr (68000 and 68008 read before clear) 872: case 0b0100_001_000: 873: irpClrByte (); 874: break irpSwitch; 875: 876: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 877: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 878: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 879: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 880: //CLR.W <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_001_mmm_rrr (68000 and 68008 read before clear) 881: case 0b0100_001_001: 882: irpClrWord (); 883: break irpSwitch; 884: 885: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 886: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 887: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 888: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 889: //CLR.L <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_010_mmm_rrr (68000 and 68008 read before clear) 890: case 0b0100_001_010: 891: irpClrLong (); 892: break irpSwitch; 893: 894: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 895: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 896: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 897: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 898: //MOVE.W CCR,<ea> |-|-12346|-|*****|-----|D M+-WXZ |0100_001_011_mmm_rrr 899: case 0b0100_001_011: 900: irpMoveFromCCR (); 901: break irpSwitch; 902: 903: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 904: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 905: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 906: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 907: //NEG.B <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_000_mmm_rrr 908: case 0b0100_010_000: 909: irpNegByte (); 910: break irpSwitch; 911: 912: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 913: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 914: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 915: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 916: //NEG.W <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_001_mmm_rrr 917: case 0b0100_010_001: 918: irpNegWord (); 919: break irpSwitch; 920: 921: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 922: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 923: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 924: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 925: //NEG.L <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_010_mmm_rrr 926: case 0b0100_010_010: 927: irpNegLong (); 928: break irpSwitch; 929: 930: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 931: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 932: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 933: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 934: //MOVE.W <ea>,CCR |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr 935: case 0b0100_010_011: 936: irpMoveToCCR (); 937: break irpSwitch; 938: 939: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 940: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 941: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 942: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 943: //NOT.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_000_mmm_rrr 944: case 0b0100_011_000: 945: irpNotByte (); 946: break irpSwitch; 947: 948: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 949: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 950: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 951: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 952: //NOT.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_001_mmm_rrr 953: case 0b0100_011_001: 954: irpNotWord (); 955: break irpSwitch; 956: 957: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 958: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 959: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 960: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 961: //NOT.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_010_mmm_rrr 962: case 0b0100_011_010: 963: irpNotLong (); 964: break irpSwitch; 965: 966: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 967: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 968: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 969: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 970: //MOVE.W <ea>,SR |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr 971: case 0b0100_011_011: 972: irpMoveToSR (); 973: break irpSwitch; 974: 975: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 976: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 977: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 978: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 979: //NBCD.B <ea> |-|012346|-|UUUUU|*U*U*|D M+-WXZ |0100_100_000_mmm_rrr 980: case 0b0100_100_000: 981: irpNbcd (); 982: break irpSwitch; 983: 984: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 985: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 986: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 987: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 988: //SWAP.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_001_000_rrr 989: //BKPT #<data> |-|-12346|-|-----|-----| |0100_100_001_001_ddd 990: //PEA.L <ea> |-|012346|-|-----|-----| M WXZP |0100_100_001_mmm_rrr 991: case 0b0100_100_001: 992: irpPea (); 993: break irpSwitch; 994: 995: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 996: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 997: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 998: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 999: //EXT.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_010_000_rrr 1000: //MOVEM.W <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_010_mmm_rrr-llllllllllllllll 1001: case 0b0100_100_010: 1002: irpMovemToMemWord (); 1003: break irpSwitch; 1004: 1005: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1006: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1007: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1008: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1009: //EXT.L Dr |-|012346|-|-UUUU|-**00|D |0100_100_011_000_rrr 1010: //MOVEM.L <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_011_mmm_rrr-llllllllllllllll 1011: case 0b0100_100_011: 1012: irpMovemToMemLong (); 1013: break irpSwitch; 1014: 1015: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1016: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1017: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1018: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1019: //TST.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_000_mmm_rrr 1020: case 0b0100_101_000: 1021: irpTstByte (); 1022: break irpSwitch; 1023: 1024: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1025: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1026: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1027: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1028: //TST.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_001_mmm_rrr 1029: case 0b0100_101_001: 1030: irpTstWord (); 1031: break irpSwitch; 1032: 1033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1034: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1035: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1036: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1037: //TST.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_010_mmm_rrr 1038: case 0b0100_101_010: 1039: irpTstLong (); 1040: break irpSwitch; 1041: 1042: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1043: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1044: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1045: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1046: //TAS.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_011_mmm_rrr 1047: //ILLEGAL |-|012346|-|-----|-----| |0100_101_011_111_100 1048: case 0b0100_101_011: 1049: irpTas (); 1050: break irpSwitch; 1051: 1052: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1053: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1054: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1055: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1056: //SATS.L Dr |-|------|-|-UUUU|-**00|D |0100_110_010_000_rrr (ISA_B) 1057: //MOVEM.W <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll 1058: case 0b0100_110_010: 1059: irpMovemToRegWord (); 1060: break irpSwitch; 1061: 1062: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1063: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1064: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1065: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1066: //MOVEM.L <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll 1067: case 0b0100_110_011: 1068: irpMovemToRegLong (); 1069: break irpSwitch; 1070: 1071: case 0b0100_111_001: 1072: switch (XEiJ.regOC & 0b111_111) { 1073: 1074: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1075: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1076: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1078: //TRAP #<vector> |-|012346|-|-----|-----| |0100_111_001_00v_vvv 1079: case 0b000_000: 1080: case 0b000_001: 1081: case 0b000_010: 1082: case 0b000_011: 1083: case 0b000_100: 1084: case 0b000_101: 1085: case 0b000_110: 1086: case 0b000_111: 1087: case 0b001_000: 1088: case 0b001_001: 1089: case 0b001_010: 1090: case 0b001_011: 1091: case 0b001_100: 1092: case 0b001_101: 1093: case 0b001_110: 1094: irpTrap (); 1095: break irpSwitch; 1096: case 0b001_111: 1097: irpTrap15 (); 1098: break irpSwitch; 1099: 1100: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1101: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1102: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1103: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1104: //LINK.W Ar,#<data> |-|012346|-|-----|-----| |0100_111_001_010_rrr-{data} 1105: case 0b010_000: 1106: case 0b010_001: 1107: case 0b010_010: 1108: case 0b010_011: 1109: case 0b010_100: 1110: case 0b010_101: 1111: case 0b010_110: 1112: case 0b010_111: 1113: irpLinkWord (); 1114: break irpSwitch; 1115: 1116: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1117: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1118: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1119: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1120: //UNLK Ar |-|012346|-|-----|-----| |0100_111_001_011_rrr 1121: case 0b011_000: 1122: case 0b011_001: 1123: case 0b011_010: 1124: case 0b011_011: 1125: case 0b011_100: 1126: case 0b011_101: 1127: case 0b011_110: 1128: case 0b011_111: 1129: irpUnlk (); 1130: break irpSwitch; 1131: 1132: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1133: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1134: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1135: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1136: //MOVE.L Ar,USP |-|012346|P|-----|-----| |0100_111_001_100_rrr 1137: case 0b100_000: 1138: case 0b100_001: 1139: case 0b100_010: 1140: case 0b100_011: 1141: case 0b100_100: 1142: case 0b100_101: 1143: case 0b100_110: 1144: case 0b100_111: 1145: irpMoveToUsp (); 1146: break irpSwitch; 1147: 1148: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1149: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1150: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1152: //MOVE.L USP,Ar |-|012346|P|-----|-----| |0100_111_001_101_rrr 1153: case 0b101_000: 1154: case 0b101_001: 1155: case 0b101_010: 1156: case 0b101_011: 1157: case 0b101_100: 1158: case 0b101_101: 1159: case 0b101_110: 1160: case 0b101_111: 1161: irpMoveFromUsp (); 1162: break irpSwitch; 1163: 1164: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1165: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1166: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1167: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1168: //RESET |-|012346|P|-----|-----| |0100_111_001_110_000 1169: case 0b110_000: 1170: irpReset (); 1171: break irpSwitch; 1172: 1173: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1174: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1175: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1176: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1177: //NOP |-|012346|-|-----|-----| |0100_111_001_110_001 1178: case 0b110_001: 1179: irpNop (); 1180: break irpSwitch; 1181: 1182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1183: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1184: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1185: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1186: //STOP #<data> |-|012346|P|UUUUU|*****| |0100_111_001_110_010-{data} 1187: case 0b110_010: 1188: irpStop (); 1189: break irpSwitch; 1190: 1191: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1192: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1193: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1194: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1195: //RTE |-|012346|P|UUUUU|*****| |0100_111_001_110_011 1196: case 0b110_011: 1197: irpRte (); 1198: break irpSwitch; 1199: 1200: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1201: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1202: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1203: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1204: //RTD #<data> |-|-12346|-|-----|-----| |0100_111_001_110_100-{data} 1205: case 0b110_100: 1206: irpRtd (); 1207: break irpSwitch; 1208: 1209: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1210: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1211: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1213: //RTS |-|012346|-|-----|-----| |0100_111_001_110_101 1214: case 0b110_101: 1215: irpRts (); 1216: break irpSwitch; 1217: 1218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1219: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1220: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1222: //TRAPV |-|012346|-|---*-|-----| |0100_111_001_110_110 1223: case 0b110_110: 1224: irpTrapv (); 1225: break irpSwitch; 1226: 1227: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1228: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1229: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1230: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1231: //RTR |-|012346|-|UUUUU|*****| |0100_111_001_110_111 1232: case 0b110_111: 1233: irpRtr (); 1234: break irpSwitch; 1235: 1236: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1237: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1238: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1239: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1240: //MOVEC.L Rc,Rn |-|-12346|P|-----|-----| |0100_111_001_111_010-rnnncccccccccccc 1241: case 0b111_010: 1242: irpMovecFromControl (); 1243: break irpSwitch; 1244: 1245: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1246: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1247: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1248: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1249: //MOVEC.L Rn,Rc |-|-12346|P|-----|-----| |0100_111_001_111_011-rnnncccccccccccc 1250: case 0b111_011: 1251: irpMovecToControl (); 1252: break irpSwitch; 1253: 1254: default: 1255: irpIllegal (); 1256: 1257: } //switch XEiJ.regOC & 0b111_111 1258: break irpSwitch; 1259: 1260: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1261: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1262: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1263: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1264: //JSR <ea> |-|012346|-|-----|-----| M WXZP |0100_111_010_mmm_rrr 1265: //JBSR.L <label> |A|012346|-|-----|-----| |0100_111_010_111_001-{address} [JSR <label>] 1266: case 0b0100_111_010: 1267: irpJsr (); 1268: break irpSwitch; 1269: 1270: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1271: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1272: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1273: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1274: //JMP <ea> |-|012346|-|-----|-----| M WXZP |0100_111_011_mmm_rrr 1275: //JBRA.L <label> |A|012346|-|-----|-----| |0100_111_011_111_001-{address} [JMP <label>] 1276: case 0b0100_111_011: 1277: irpJmp (); 1278: break irpSwitch; 1279: 1280: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1281: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1282: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1283: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1284: //ADDQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_000_mmm_rrr 1285: //INC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>] 1286: case 0b0101_000_000: 1287: case 0b0101_001_000: 1288: case 0b0101_010_000: 1289: case 0b0101_011_000: 1290: case 0b0101_100_000: 1291: case 0b0101_101_000: 1292: case 0b0101_110_000: 1293: case 0b0101_111_000: 1294: irpAddqByte (); 1295: break irpSwitch; 1296: 1297: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1298: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1299: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1300: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1301: //ADDQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_001_mmm_rrr 1302: //ADDQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_001_001_rrr 1303: //INC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>] 1304: //INC.W Ar |A|012346|-|-----|-----| A |0101_001_001_001_rrr [ADDQ.W #1,Ar] 1305: case 0b0101_000_001: 1306: case 0b0101_001_001: 1307: case 0b0101_010_001: 1308: case 0b0101_011_001: 1309: case 0b0101_100_001: 1310: case 0b0101_101_001: 1311: case 0b0101_110_001: 1312: case 0b0101_111_001: 1313: irpAddqWord (); 1314: break irpSwitch; 1315: 1316: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1317: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1318: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1319: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1320: //ADDQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_010_mmm_rrr 1321: //ADDQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_010_001_rrr 1322: //INC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>] 1323: //INC.L Ar |A|012346|-|-----|-----| A |0101_001_010_001_rrr [ADDQ.L #1,Ar] 1324: case 0b0101_000_010: 1325: case 0b0101_001_010: 1326: case 0b0101_010_010: 1327: case 0b0101_011_010: 1328: case 0b0101_100_010: 1329: case 0b0101_101_010: 1330: case 0b0101_110_010: 1331: case 0b0101_111_010: 1332: irpAddqLong (); 1333: break irpSwitch; 1334: 1335: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1336: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1337: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1338: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1339: //ST.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr 1340: //SNF.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr [ST.B <ea>] 1341: //DBT.W Dr,<label> |-|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} 1342: //DBNF.W Dr,<label> |A|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} [DBT.W Dr,<label>] 1343: case 0b0101_000_011: 1344: irpSt (); 1345: break irpSwitch; 1346: 1347: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1348: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1349: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1350: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1351: //SUBQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_100_mmm_rrr 1352: //DEC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>] 1353: case 0b0101_000_100: 1354: case 0b0101_001_100: 1355: case 0b0101_010_100: 1356: case 0b0101_011_100: 1357: case 0b0101_100_100: 1358: case 0b0101_101_100: 1359: case 0b0101_110_100: 1360: case 0b0101_111_100: 1361: irpSubqByte (); 1362: break irpSwitch; 1363: 1364: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1365: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1366: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1367: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1368: //SUBQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_101_mmm_rrr 1369: //SUBQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_101_001_rrr 1370: //DEC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>] 1371: //DEC.W Ar |A|012346|-|-----|-----| A |0101_001_101_001_rrr [SUBQ.W #1,Ar] 1372: case 0b0101_000_101: 1373: case 0b0101_001_101: 1374: case 0b0101_010_101: 1375: case 0b0101_011_101: 1376: case 0b0101_100_101: 1377: case 0b0101_101_101: 1378: case 0b0101_110_101: 1379: case 0b0101_111_101: 1380: irpSubqWord (); 1381: break irpSwitch; 1382: 1383: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1384: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1385: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1387: //SUBQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_110_mmm_rrr 1388: //SUBQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_110_001_rrr 1389: //DEC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>] 1390: //DEC.L Ar |A|012346|-|-----|-----| A |0101_001_110_001_rrr [SUBQ.L #1,Ar] 1391: case 0b0101_000_110: 1392: case 0b0101_001_110: 1393: case 0b0101_010_110: 1394: case 0b0101_011_110: 1395: case 0b0101_100_110: 1396: case 0b0101_101_110: 1397: case 0b0101_110_110: 1398: case 0b0101_111_110: 1399: irpSubqLong (); 1400: break irpSwitch; 1401: 1402: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1403: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1404: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1405: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1406: //SF.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr 1407: //SNT.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr [SF.B <ea>] 1408: //DBF.W Dr,<label> |-|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} 1409: //DBNT.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 1410: //DBRA.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 1411: case 0b0101_000_111: 1412: irpSf (); 1413: break irpSwitch; 1414: 1415: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1416: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1417: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1418: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1419: //SHI.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr 1420: //SNLS.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr [SHI.B <ea>] 1421: //DBHI.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} 1422: //DBNLS.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} [DBHI.W Dr,<label>] 1423: case 0b0101_001_011: 1424: irpShi (); 1425: break irpSwitch; 1426: 1427: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1428: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1429: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1430: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1431: //SLS.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr 1432: //SNHI.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr [SLS.B <ea>] 1433: //DBLS.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} 1434: //DBNHI.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} [DBLS.W Dr,<label>] 1435: case 0b0101_001_111: 1436: irpSls (); 1437: break irpSwitch; 1438: 1439: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1440: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1441: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1442: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1443: //SCC.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr 1444: //SHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1445: //SNCS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1446: //SNLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1447: //DBCC.W Dr,<label> |-|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} 1448: //DBHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1449: //DBNCS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1450: //DBNLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1451: case 0b0101_010_011: 1452: irpShs (); 1453: break irpSwitch; 1454: 1455: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1456: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1457: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1458: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1459: //SCS.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr 1460: //SLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1461: //SNCC.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1462: //SNHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1463: //DBCS.W Dr,<label> |-|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} 1464: //DBLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1465: //DBNCC.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1466: //DBNHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1467: case 0b0101_010_111: 1468: irpSlo (); 1469: break irpSwitch; 1470: 1471: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1472: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1473: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1474: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1475: //SNE.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr 1476: //SNEQ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1477: //SNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1478: //SNZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1479: //DBNE.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} 1480: //DBNEQ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1481: //DBNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1482: //DBNZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1483: case 0b0101_011_011: 1484: irpSne (); 1485: break irpSwitch; 1486: 1487: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1488: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1489: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1491: //SEQ.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr 1492: //SNNE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1493: //SNNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1494: //SZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1495: //DBEQ.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} 1496: //DBNNE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1497: //DBNNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1498: //DBZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1499: case 0b0101_011_111: 1500: irpSeq (); 1501: break irpSwitch; 1502: 1503: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1504: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1505: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1506: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1507: //SVC.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr 1508: //SNVS.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr [SVC.B <ea>] 1509: //DBVC.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} 1510: //DBNVS.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} [DBVC.W Dr,<label>] 1511: case 0b0101_100_011: 1512: irpSvc (); 1513: break irpSwitch; 1514: 1515: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1516: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1517: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1518: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1519: //SVS.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr 1520: //SNVC.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr [SVS.B <ea>] 1521: //DBVS.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} 1522: //DBNVC.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} [DBVS.W Dr,<label>] 1523: case 0b0101_100_111: 1524: irpSvs (); 1525: break irpSwitch; 1526: 1527: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1528: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1529: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1530: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1531: //SPL.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr 1532: //SNMI.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr [SPL.B <ea>] 1533: //DBPL.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} 1534: //DBNMI.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} [DBPL.W Dr,<label>] 1535: case 0b0101_101_011: 1536: irpSpl (); 1537: break irpSwitch; 1538: 1539: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1540: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1541: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1542: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1543: //SMI.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr 1544: //SNPL.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr [SMI.B <ea>] 1545: //DBMI.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} 1546: //DBNPL.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} [DBMI.W Dr,<label>] 1547: case 0b0101_101_111: 1548: irpSmi (); 1549: break irpSwitch; 1550: 1551: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1552: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1553: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1554: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1555: //SGE.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr 1556: //SNLT.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr [SGE.B <ea>] 1557: //DBGE.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} 1558: //DBNLT.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} [DBGE.W Dr,<label>] 1559: case 0b0101_110_011: 1560: irpSge (); 1561: break irpSwitch; 1562: 1563: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1564: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1565: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1566: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1567: //SLT.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr 1568: //SNGE.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr [SLT.B <ea>] 1569: //DBLT.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} 1570: //DBNGE.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} [DBLT.W Dr,<label>] 1571: case 0b0101_110_111: 1572: irpSlt (); 1573: break irpSwitch; 1574: 1575: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1576: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1577: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1578: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1579: //SGT.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr 1580: //SNLE.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr [SGT.B <ea>] 1581: //DBGT.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} 1582: //DBNLE.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} [DBGT.W Dr,<label>] 1583: case 0b0101_111_011: 1584: irpSgt (); 1585: break irpSwitch; 1586: 1587: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1588: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1589: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1590: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1591: //SLE.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr 1592: //SNGT.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr [SLE.B <ea>] 1593: //DBLE.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} 1594: //DBNGT.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} [DBLE.W Dr,<label>] 1595: case 0b0101_111_111: 1596: irpSle (); 1597: break irpSwitch; 1598: 1599: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1600: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1601: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1602: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1603: //BRA.W <label> |-|012346|-|-----|-----| |0110_000_000_000_000-{offset} 1604: //JBRA.W <label> |A|012346|-|-----|-----| |0110_000_000_000_000-{offset} [BRA.W <label>] 1605: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) 1606: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) [BRA.S <label>] 1607: case 0b0110_000_000: 1608: irpBrasw (); 1609: break irpSwitch; 1610: 1611: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1612: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1613: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1614: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1615: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_001_sss_sss 1616: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_001_sss_sss [BRA.S <label>] 1617: case 0b0110_000_001: 1618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1619: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1620: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1622: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_010_sss_sss 1623: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_010_sss_sss [BRA.S <label>] 1624: case 0b0110_000_010: 1625: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1626: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1627: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1628: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1629: //BRA.S <label> |-|01----|-|-----|-----| |0110_000_011_sss_sss 1630: //JBRA.S <label> |A|01----|-|-----|-----| |0110_000_011_sss_sss [BRA.S <label>] 1631: case 0b0110_000_011: 1632: irpBras (); 1633: break irpSwitch; 1634: 1635: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1636: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1637: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1638: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1639: //BSR.W <label> |-|012346|-|-----|-----| |0110_000_100_000_000-{offset} 1640: //JBSR.W <label> |A|012346|-|-----|-----| |0110_000_100_000_000-{offset} [BSR.W <label>] 1641: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) 1642: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) [BSR.S <label>] 1643: case 0b0110_000_100: 1644: irpBsrsw (); 1645: break irpSwitch; 1646: 1647: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1648: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1649: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1651: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_101_sss_sss 1652: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_101_sss_sss [BSR.S <label>] 1653: case 0b0110_000_101: 1654: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1655: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1656: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1657: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1658: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_110_sss_sss 1659: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_110_sss_sss [BSR.S <label>] 1660: case 0b0110_000_110: 1661: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1662: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1663: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1664: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1665: //BSR.S <label> |-|01----|-|-----|-----| |0110_000_111_sss_sss 1666: //JBSR.S <label> |A|01----|-|-----|-----| |0110_000_111_sss_sss [BSR.S <label>] 1667: case 0b0110_000_111: 1668: irpBsrs (); 1669: break irpSwitch; 1670: 1671: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1672: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1673: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1674: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1675: //BHI.W <label> |-|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} 1676: //BNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1677: //JBHI.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1678: //JBNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1679: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) 1680: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1681: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1682: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1683: //JBLS.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 1684: //JBNHI.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 1685: case 0b0110_001_000: 1686: irpBhisw (); 1687: break irpSwitch; 1688: 1689: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1690: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1691: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1692: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1693: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_001_sss_sss 1694: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1695: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1696: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1697: case 0b0110_001_001: 1698: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1699: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1700: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1702: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_010_sss_sss 1703: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1704: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1705: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1706: case 0b0110_001_010: 1707: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1708: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1709: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1710: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1711: //BHI.S <label> |-|01----|-|--*-*|-----| |0110_001_011_sss_sss 1712: //BNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1713: //JBHI.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1714: //JBNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1715: case 0b0110_001_011: 1716: irpBhis (); 1717: break irpSwitch; 1718: 1719: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1720: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1721: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1722: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1723: //BLS.W <label> |-|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} 1724: //BNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1725: //JBLS.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1726: //JBNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1727: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) 1728: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1729: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1730: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1731: //JBHI.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 1732: //JBNLS.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 1733: case 0b0110_001_100: 1734: irpBlssw (); 1735: break irpSwitch; 1736: 1737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1738: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1739: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1740: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1741: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_101_sss_sss 1742: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1743: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1744: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1745: case 0b0110_001_101: 1746: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1747: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1748: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1749: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1750: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_110_sss_sss 1751: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1752: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1753: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1754: case 0b0110_001_110: 1755: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1756: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1757: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1758: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1759: //BLS.S <label> |-|01----|-|--*-*|-----| |0110_001_111_sss_sss 1760: //BNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1761: //JBLS.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1762: //JBNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1763: case 0b0110_001_111: 1764: irpBlss (); 1765: break irpSwitch; 1766: 1767: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1768: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1769: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1770: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1771: //BCC.W <label> |-|012346|-|----*|-----| |0110_010_000_000_000-{offset} 1772: //BHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1773: //BNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1774: //BNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1775: //JBCC.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1776: //JBHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1777: //JBNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1778: //JBNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1779: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) 1780: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1781: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1782: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1783: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1784: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1785: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1786: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1787: //JBCS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1788: //JBLO.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1789: //JBNCC.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1790: //JBNHS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1791: case 0b0110_010_000: 1792: irpBhssw (); 1793: break irpSwitch; 1794: 1795: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1796: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1797: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1798: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1799: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_001_sss_sss 1800: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1801: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1802: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1803: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1804: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1805: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1806: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1807: case 0b0110_010_001: 1808: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1809: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1810: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1812: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_010_sss_sss 1813: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1814: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1815: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1816: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1817: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1818: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1819: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1820: case 0b0110_010_010: 1821: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1822: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1823: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1824: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1825: //BCC.S <label> |-|01----|-|----*|-----| |0110_010_011_sss_sss 1826: //BHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1827: //BNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1828: //BNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1829: //JBCC.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1830: //JBHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1831: //JBNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1832: //JBNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1833: case 0b0110_010_011: 1834: irpBhss (); 1835: break irpSwitch; 1836: 1837: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1838: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1839: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1840: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1841: //BCS.W <label> |-|012346|-|----*|-----| |0110_010_100_000_000-{offset} 1842: //BLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1843: //BNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1844: //BNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1845: //JBCS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1846: //JBLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1847: //JBNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1848: //JBNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1849: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) 1850: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1851: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1852: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1853: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1854: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1855: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1856: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1857: //JBCC.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1858: //JBHS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1859: //JBNCS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1860: //JBNLO.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1861: case 0b0110_010_100: 1862: irpBlosw (); 1863: break irpSwitch; 1864: 1865: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1866: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1867: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1868: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1869: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_101_sss_sss 1870: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1871: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1872: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1873: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1874: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1875: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1876: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1877: case 0b0110_010_101: 1878: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1879: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1880: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1881: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1882: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_110_sss_sss 1883: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1884: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1885: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1886: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1887: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1888: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1889: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1890: case 0b0110_010_110: 1891: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1892: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1893: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1894: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1895: //BCS.S <label> |-|01----|-|----*|-----| |0110_010_111_sss_sss 1896: //BLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1897: //BNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1898: //BNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1899: //JBCS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1900: //JBLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1901: //JBNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1902: //JBNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1903: case 0b0110_010_111: 1904: irpBlos (); 1905: break irpSwitch; 1906: 1907: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1908: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1909: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1910: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1911: //BNE.W <label> |-|012346|-|--*--|-----| |0110_011_000_000_000-{offset} 1912: //BNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1913: //BNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1914: //BNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1915: //JBNE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1916: //JBNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1917: //JBNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1918: //JBNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1919: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) 1920: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1921: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1922: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1923: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1924: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1925: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1926: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1927: //JBEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1928: //JBNEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1929: //JBNNE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1930: //JBNNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1931: //JBNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1932: //JBNZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1933: //JBZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1934: case 0b0110_011_000: 1935: irpBnesw (); 1936: break irpSwitch; 1937: 1938: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1939: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1940: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1941: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1942: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_001_sss_sss 1943: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1944: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1945: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1946: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1947: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1948: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1949: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1950: case 0b0110_011_001: 1951: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1952: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1953: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1954: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1955: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_010_sss_sss 1956: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1957: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1958: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1959: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1960: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1961: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1962: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1963: case 0b0110_011_010: 1964: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1965: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1966: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1967: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1968: //BNE.S <label> |-|01----|-|--*--|-----| |0110_011_011_sss_sss 1969: //BNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1970: //BNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1971: //BNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1972: //JBNE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1973: //JBNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1974: //JBNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1975: //JBNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1976: case 0b0110_011_011: 1977: irpBnes (); 1978: break irpSwitch; 1979: 1980: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1981: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1982: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1983: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1984: //BEQ.W <label> |-|012346|-|--*--|-----| |0110_011_100_000_000-{offset} 1985: //BNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1986: //BNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1987: //BZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1988: //JBEQ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1989: //JBNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1990: //JBNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1991: //JBZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1992: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) 1993: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1994: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1995: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1996: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1997: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1998: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1999: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 2000: //JBNE.L <label> |A|012346|-|--*--|-----| |0110_011_100_000_110-0100111011111001-{address} [BEQ.S (*)+8;JMP <label>] 2001: case 0b0110_011_100: 2002: irpBeqsw (); 2003: break irpSwitch; 2004: 2005: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2006: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2007: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2008: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2009: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_101_sss_sss 2010: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2011: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2012: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2013: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2014: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2015: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2016: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2017: case 0b0110_011_101: 2018: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2019: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2020: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2021: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2022: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_110_sss_sss 2023: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2024: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2025: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2026: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2027: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2028: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2029: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2030: case 0b0110_011_110: 2031: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2032: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2033: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2034: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2035: //BEQ.S <label> |-|01----|-|--*--|-----| |0110_011_111_sss_sss 2036: //BNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2037: //BNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2038: //BZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2039: //JBEQ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2040: //JBNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2041: //JBNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2042: //JBZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2043: case 0b0110_011_111: 2044: irpBeqs (); 2045: break irpSwitch; 2046: 2047: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2048: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2049: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2050: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2051: //BVC.W <label> |-|012346|-|---*-|-----| |0110_100_000_000_000-{offset} 2052: //BNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 2053: //JBNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 2054: //JBVC.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 2055: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) 2056: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 2057: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 2058: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 2059: //JBNVC.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 2060: //JBVS.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 2061: case 0b0110_100_000: 2062: irpBvcsw (); 2063: break irpSwitch; 2064: 2065: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2066: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2067: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2068: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2069: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_001_sss_sss 2070: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2071: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2072: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2073: case 0b0110_100_001: 2074: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2075: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2076: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2078: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_010_sss_sss 2079: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2080: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2081: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2082: case 0b0110_100_010: 2083: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2084: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2085: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2086: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2087: //BVC.S <label> |-|01----|-|---*-|-----| |0110_100_011_sss_sss 2088: //BNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2089: //JBNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2090: //JBVC.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2091: case 0b0110_100_011: 2092: irpBvcs (); 2093: break irpSwitch; 2094: 2095: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2096: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2097: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2098: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2099: //BVS.W <label> |-|012346|-|---*-|-----| |0110_100_100_000_000-{offset} 2100: //BNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2101: //JBNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2102: //JBVS.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2103: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) 2104: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2105: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2106: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2107: //JBNVS.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 2108: //JBVC.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 2109: case 0b0110_100_100: 2110: irpBvssw (); 2111: break irpSwitch; 2112: 2113: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2114: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2115: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2116: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2117: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_101_sss_sss 2118: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2119: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2120: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2121: case 0b0110_100_101: 2122: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2123: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2124: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2125: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2126: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_110_sss_sss 2127: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2128: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2129: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2130: case 0b0110_100_110: 2131: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2132: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2133: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2134: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2135: //BVS.S <label> |-|01----|-|---*-|-----| |0110_100_111_sss_sss 2136: //BNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2137: //JBNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2138: //JBVS.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2139: case 0b0110_100_111: 2140: irpBvss (); 2141: break irpSwitch; 2142: 2143: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2144: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2145: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2146: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2147: //BPL.W <label> |-|012346|-|-*---|-----| |0110_101_000_000_000-{offset} 2148: //BNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2149: //JBNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2150: //JBPL.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2151: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) 2152: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2153: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2154: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2155: //JBMI.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 2156: //JBNPL.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 2157: case 0b0110_101_000: 2158: irpBplsw (); 2159: break irpSwitch; 2160: 2161: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2162: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2163: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2164: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2165: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_001_sss_sss 2166: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2167: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2168: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2169: case 0b0110_101_001: 2170: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2171: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2172: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2173: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2174: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_010_sss_sss 2175: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2176: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2177: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2178: case 0b0110_101_010: 2179: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2180: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2181: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2183: //BPL.S <label> |-|01----|-|-*---|-----| |0110_101_011_sss_sss 2184: //BNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2185: //JBNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2186: //JBPL.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2187: case 0b0110_101_011: 2188: irpBpls (); 2189: break irpSwitch; 2190: 2191: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2192: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2193: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2194: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2195: //BMI.W <label> |-|012346|-|-*---|-----| |0110_101_100_000_000-{offset} 2196: //BNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2197: //JBMI.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2198: //JBNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2199: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) 2200: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2201: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2202: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2203: //JBNMI.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 2204: //JBPL.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 2205: case 0b0110_101_100: 2206: irpBmisw (); 2207: break irpSwitch; 2208: 2209: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2210: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2211: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2213: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_101_sss_sss 2214: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2215: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2216: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2217: case 0b0110_101_101: 2218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2219: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2220: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2222: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_110_sss_sss 2223: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2224: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2225: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2226: case 0b0110_101_110: 2227: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2228: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2229: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2230: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2231: //BMI.S <label> |-|01----|-|-*---|-----| |0110_101_111_sss_sss 2232: //BNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2233: //JBMI.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2234: //JBNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2235: case 0b0110_101_111: 2236: irpBmis (); 2237: break irpSwitch; 2238: 2239: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2240: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2241: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2242: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2243: //BGE.W <label> |-|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} 2244: //BNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2245: //JBGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2246: //JBNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2247: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) 2248: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2249: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2250: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2251: //JBLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 2252: //JBNGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 2253: case 0b0110_110_000: 2254: irpBgesw (); 2255: break irpSwitch; 2256: 2257: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2258: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2259: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2260: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2261: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_001_sss_sss 2262: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2263: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2264: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2265: case 0b0110_110_001: 2266: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2267: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2268: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2269: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2270: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_010_sss_sss 2271: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2272: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2273: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2274: case 0b0110_110_010: 2275: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2276: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2277: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2278: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2279: //BGE.S <label> |-|01----|-|-*-*-|-----| |0110_110_011_sss_sss 2280: //BNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2281: //JBGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2282: //JBNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2283: case 0b0110_110_011: 2284: irpBges (); 2285: break irpSwitch; 2286: 2287: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2288: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2289: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2290: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2291: //BLT.W <label> |-|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} 2292: //BNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2293: //JBLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2294: //JBNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2295: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) 2296: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2297: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2298: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2299: //JBGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 2300: //JBNLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 2301: case 0b0110_110_100: 2302: irpBltsw (); 2303: break irpSwitch; 2304: 2305: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2306: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2307: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2308: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2309: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_101_sss_sss 2310: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2311: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2312: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2313: case 0b0110_110_101: 2314: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2315: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2316: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2317: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2318: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_110_sss_sss 2319: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2320: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2321: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2322: case 0b0110_110_110: 2323: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2324: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2325: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2326: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2327: //BLT.S <label> |-|01----|-|-*-*-|-----| |0110_110_111_sss_sss 2328: //BNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2329: //JBLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2330: //JBNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2331: case 0b0110_110_111: 2332: irpBlts (); 2333: break irpSwitch; 2334: 2335: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2336: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2337: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2338: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2339: //BGT.W <label> |-|012346|-|-***-|-----| |0110_111_000_000_000-{offset} 2340: //BNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2341: //JBGT.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2342: //JBNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2343: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) 2344: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2345: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2346: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2347: //JBLE.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 2348: //JBNGT.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 2349: case 0b0110_111_000: 2350: irpBgtsw (); 2351: break irpSwitch; 2352: 2353: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2354: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2355: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2356: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2357: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_001_sss_sss 2358: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2359: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2360: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2361: case 0b0110_111_001: 2362: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2363: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2364: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2365: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2366: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_010_sss_sss 2367: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2368: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2369: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2370: case 0b0110_111_010: 2371: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2372: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2373: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2374: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2375: //BGT.S <label> |-|01----|-|-***-|-----| |0110_111_011_sss_sss 2376: //BNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2377: //JBGT.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2378: //JBNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2379: case 0b0110_111_011: 2380: irpBgts (); 2381: break irpSwitch; 2382: 2383: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2384: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2385: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2387: //BLE.W <label> |-|012346|-|-***-|-----| |0110_111_100_000_000-{offset} 2388: //BNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2389: //JBLE.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2390: //JBNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2391: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) 2392: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2393: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2394: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2395: //JBGT.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 2396: //JBNLE.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 2397: case 0b0110_111_100: 2398: irpBlesw (); 2399: break irpSwitch; 2400: 2401: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2402: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2403: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2404: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2405: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_101_sss_sss 2406: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2407: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2408: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2409: case 0b0110_111_101: 2410: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2411: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2412: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2413: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2414: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_110_sss_sss 2415: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2416: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2417: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2418: case 0b0110_111_110: 2419: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2420: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2421: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2422: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2423: //BLE.S <label> |-|01----|-|-***-|-----| |0110_111_111_sss_sss 2424: //BNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2425: //JBLE.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2426: //JBNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2427: case 0b0110_111_111: 2428: irpBles (); 2429: break irpSwitch; 2430: 2431: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2432: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2433: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2434: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2435: //IOCS <name> |A|012346|-|UUUUU|UUUUU| |0111_000_0dd_ddd_ddd-0100111001001111 [MOVEQ.L #<data>,D0;TRAP #15] 2436: //MOVEQ.L #<data>,Dq |-|012346|-|-UUUU|-**00| |0111_qqq_0dd_ddd_ddd 2437: case 0b0111_000_000: 2438: case 0b0111_000_001: 2439: case 0b0111_000_010: 2440: case 0b0111_000_011: 2441: case 0b0111_001_000: 2442: case 0b0111_001_001: 2443: case 0b0111_001_010: 2444: case 0b0111_001_011: 2445: case 0b0111_010_000: 2446: case 0b0111_010_001: 2447: case 0b0111_010_010: 2448: case 0b0111_010_011: 2449: case 0b0111_011_000: 2450: case 0b0111_011_001: 2451: case 0b0111_011_010: 2452: case 0b0111_011_011: 2453: case 0b0111_100_000: 2454: case 0b0111_100_001: 2455: case 0b0111_100_010: 2456: case 0b0111_100_011: 2457: case 0b0111_101_000: 2458: case 0b0111_101_001: 2459: case 0b0111_101_010: 2460: case 0b0111_101_011: 2461: case 0b0111_110_000: 2462: case 0b0111_110_001: 2463: case 0b0111_110_010: 2464: case 0b0111_110_011: 2465: case 0b0111_111_000: 2466: case 0b0111_111_001: 2467: case 0b0111_111_010: 2468: case 0b0111_111_011: 2469: irpMoveq (); 2470: break irpSwitch; 2471: 2472: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2473: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2474: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2475: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2476: //MVS.B <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B) 2477: case 0b0111_000_100: 2478: case 0b0111_001_100: 2479: case 0b0111_010_100: 2480: case 0b0111_011_100: 2481: case 0b0111_100_100: 2482: case 0b0111_101_100: 2483: case 0b0111_110_100: 2484: case 0b0111_111_100: 2485: irpMvsByte (); 2486: break irpSwitch; 2487: 2488: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2489: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2490: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2491: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2492: //MVS.W <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B) 2493: case 0b0111_000_101: 2494: case 0b0111_001_101: 2495: case 0b0111_010_101: 2496: case 0b0111_011_101: 2497: case 0b0111_100_101: 2498: case 0b0111_101_101: 2499: case 0b0111_110_101: 2500: case 0b0111_111_101: 2501: irpMvsWord (); 2502: break irpSwitch; 2503: 2504: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2505: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2506: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2507: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2508: //MVZ.B <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B) 2509: case 0b0111_000_110: 2510: case 0b0111_001_110: 2511: case 0b0111_010_110: 2512: case 0b0111_011_110: 2513: case 0b0111_100_110: 2514: case 0b0111_101_110: 2515: case 0b0111_110_110: 2516: case 0b0111_111_110: 2517: irpMvzByte (); 2518: break irpSwitch; 2519: 2520: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2521: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2522: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2523: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2524: //MVZ.W <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B) 2525: case 0b0111_000_111: 2526: case 0b0111_001_111: 2527: case 0b0111_010_111: 2528: case 0b0111_011_111: 2529: case 0b0111_100_111: 2530: case 0b0111_101_111: 2531: case 0b0111_110_111: 2532: case 0b0111_111_111: 2533: irpMvzWord (); 2534: break irpSwitch; 2535: 2536: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2537: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2538: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2539: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2540: //OR.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr 2541: case 0b1000_000_000: 2542: case 0b1000_001_000: 2543: case 0b1000_010_000: 2544: case 0b1000_011_000: 2545: case 0b1000_100_000: 2546: case 0b1000_101_000: 2547: case 0b1000_110_000: 2548: case 0b1000_111_000: 2549: irpOrToRegByte (); 2550: break irpSwitch; 2551: 2552: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2553: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2554: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2555: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2556: //OR.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr 2557: case 0b1000_000_001: 2558: case 0b1000_001_001: 2559: case 0b1000_010_001: 2560: case 0b1000_011_001: 2561: case 0b1000_100_001: 2562: case 0b1000_101_001: 2563: case 0b1000_110_001: 2564: case 0b1000_111_001: 2565: irpOrToRegWord (); 2566: break irpSwitch; 2567: 2568: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2569: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2570: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2571: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2572: //OR.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr 2573: case 0b1000_000_010: 2574: case 0b1000_001_010: 2575: case 0b1000_010_010: 2576: case 0b1000_011_010: 2577: case 0b1000_100_010: 2578: case 0b1000_101_010: 2579: case 0b1000_110_010: 2580: case 0b1000_111_010: 2581: irpOrToRegLong (); 2582: break irpSwitch; 2583: 2584: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2585: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2586: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2587: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2588: //DIVU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr 2589: case 0b1000_000_011: 2590: case 0b1000_001_011: 2591: case 0b1000_010_011: 2592: case 0b1000_011_011: 2593: case 0b1000_100_011: 2594: case 0b1000_101_011: 2595: case 0b1000_110_011: 2596: case 0b1000_111_011: 2597: irpDivuWord (); 2598: break irpSwitch; 2599: 2600: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2601: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2602: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2603: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2604: //SBCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_000_rrr 2605: //SBCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_001_rrr 2606: //OR.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_100_mmm_rrr 2607: case 0b1000_000_100: 2608: case 0b1000_001_100: 2609: case 0b1000_010_100: 2610: case 0b1000_011_100: 2611: case 0b1000_100_100: 2612: case 0b1000_101_100: 2613: case 0b1000_110_100: 2614: case 0b1000_111_100: 2615: irpOrToMemByte (); 2616: break irpSwitch; 2617: 2618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2619: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2620: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2622: //OR.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_101_mmm_rrr 2623: case 0b1000_000_101: 2624: case 0b1000_001_101: 2625: case 0b1000_010_101: 2626: case 0b1000_011_101: 2627: case 0b1000_100_101: 2628: case 0b1000_101_101: 2629: case 0b1000_110_101: 2630: case 0b1000_111_101: 2631: irpOrToMemWord (); 2632: break irpSwitch; 2633: 2634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2635: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2636: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2637: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2638: //OR.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_110_mmm_rrr 2639: case 0b1000_000_110: 2640: case 0b1000_001_110: 2641: case 0b1000_010_110: 2642: case 0b1000_011_110: 2643: case 0b1000_100_110: 2644: case 0b1000_101_110: 2645: case 0b1000_110_110: 2646: case 0b1000_111_110: 2647: irpOrToMemLong (); 2648: break irpSwitch; 2649: 2650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2651: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2652: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2654: //DIVS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr 2655: case 0b1000_000_111: 2656: case 0b1000_001_111: 2657: case 0b1000_010_111: 2658: case 0b1000_011_111: 2659: case 0b1000_100_111: 2660: case 0b1000_101_111: 2661: case 0b1000_110_111: 2662: case 0b1000_111_111: 2663: irpDivsWord (); 2664: break irpSwitch; 2665: 2666: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2667: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2668: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2669: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2670: //SUB.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr 2671: case 0b1001_000_000: 2672: case 0b1001_001_000: 2673: case 0b1001_010_000: 2674: case 0b1001_011_000: 2675: case 0b1001_100_000: 2676: case 0b1001_101_000: 2677: case 0b1001_110_000: 2678: case 0b1001_111_000: 2679: irpSubToRegByte (); 2680: break irpSwitch; 2681: 2682: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2683: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2684: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2685: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2686: //SUB.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr 2687: case 0b1001_000_001: 2688: case 0b1001_001_001: 2689: case 0b1001_010_001: 2690: case 0b1001_011_001: 2691: case 0b1001_100_001: 2692: case 0b1001_101_001: 2693: case 0b1001_110_001: 2694: case 0b1001_111_001: 2695: irpSubToRegWord (); 2696: break irpSwitch; 2697: 2698: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2699: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2700: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2702: //SUB.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr 2703: case 0b1001_000_010: 2704: case 0b1001_001_010: 2705: case 0b1001_010_010: 2706: case 0b1001_011_010: 2707: case 0b1001_100_010: 2708: case 0b1001_101_010: 2709: case 0b1001_110_010: 2710: case 0b1001_111_010: 2711: irpSubToRegLong (); 2712: break irpSwitch; 2713: 2714: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2715: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2716: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2717: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2718: //SUBA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr 2719: //SUB.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq] 2720: //CLR.W Ar |A|012346|-|-----|-----| A |1001_rrr_011_001_rrr [SUBA.W Ar,Ar] 2721: case 0b1001_000_011: 2722: case 0b1001_001_011: 2723: case 0b1001_010_011: 2724: case 0b1001_011_011: 2725: case 0b1001_100_011: 2726: case 0b1001_101_011: 2727: case 0b1001_110_011: 2728: case 0b1001_111_011: 2729: irpSubaWord (); 2730: break irpSwitch; 2731: 2732: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2733: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2734: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2735: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2736: //SUBX.B Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_100_000_rrr 2737: //SUBX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_100_001_rrr 2738: //SUB.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_100_mmm_rrr 2739: case 0b1001_000_100: 2740: case 0b1001_001_100: 2741: case 0b1001_010_100: 2742: case 0b1001_011_100: 2743: case 0b1001_100_100: 2744: case 0b1001_101_100: 2745: case 0b1001_110_100: 2746: case 0b1001_111_100: 2747: irpSubToMemByte (); 2748: break irpSwitch; 2749: 2750: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2751: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2752: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2753: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2754: //SUBX.W Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_101_000_rrr 2755: //SUBX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_101_001_rrr 2756: //SUB.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_101_mmm_rrr 2757: case 0b1001_000_101: 2758: case 0b1001_001_101: 2759: case 0b1001_010_101: 2760: case 0b1001_011_101: 2761: case 0b1001_100_101: 2762: case 0b1001_101_101: 2763: case 0b1001_110_101: 2764: case 0b1001_111_101: 2765: irpSubToMemWord (); 2766: break irpSwitch; 2767: 2768: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2769: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2770: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2771: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2772: //SUBX.L Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_110_000_rrr 2773: //SUBX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_110_001_rrr 2774: //SUB.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_110_mmm_rrr 2775: case 0b1001_000_110: 2776: case 0b1001_001_110: 2777: case 0b1001_010_110: 2778: case 0b1001_011_110: 2779: case 0b1001_100_110: 2780: case 0b1001_101_110: 2781: case 0b1001_110_110: 2782: case 0b1001_111_110: 2783: irpSubToMemLong (); 2784: break irpSwitch; 2785: 2786: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2787: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2788: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2789: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2790: //SUBA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr 2791: //SUB.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq] 2792: //CLR.L Ar |A|012346|-|-----|-----| A |1001_rrr_111_001_rrr [SUBA.L Ar,Ar] 2793: case 0b1001_000_111: 2794: case 0b1001_001_111: 2795: case 0b1001_010_111: 2796: case 0b1001_011_111: 2797: case 0b1001_100_111: 2798: case 0b1001_101_111: 2799: case 0b1001_110_111: 2800: case 0b1001_111_111: 2801: irpSubaLong (); 2802: break irpSwitch; 2803: 2804: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2805: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2806: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2807: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2808: //SXCALL <name> |A|012346|-|UUUUU|*****| |1010_0dd_ddd_ddd_ddd [ALINE #<data>] 2809: case 0b1010_000_000: 2810: case 0b1010_000_001: 2811: case 0b1010_000_010: 2812: case 0b1010_000_011: 2813: case 0b1010_000_100: 2814: case 0b1010_000_101: 2815: case 0b1010_000_110: 2816: case 0b1010_000_111: 2817: case 0b1010_001_000: 2818: case 0b1010_001_001: 2819: case 0b1010_001_010: 2820: case 0b1010_001_011: 2821: case 0b1010_001_100: 2822: case 0b1010_001_101: 2823: case 0b1010_001_110: 2824: case 0b1010_001_111: 2825: case 0b1010_010_000: 2826: case 0b1010_010_001: 2827: case 0b1010_010_010: 2828: case 0b1010_010_011: 2829: case 0b1010_010_100: 2830: case 0b1010_010_101: 2831: case 0b1010_010_110: 2832: case 0b1010_010_111: 2833: case 0b1010_011_000: 2834: case 0b1010_011_001: 2835: case 0b1010_011_010: 2836: case 0b1010_011_011: 2837: case 0b1010_011_100: 2838: case 0b1010_011_101: 2839: case 0b1010_011_110: 2840: case 0b1010_011_111: 2841: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2842: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2843: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2844: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2845: //ALINE #<data> |-|012346|-|UUUUU|*****| |1010_ddd_ddd_ddd_ddd (line 1010 emulator) 2846: case 0b1010_100_000: 2847: case 0b1010_100_001: 2848: case 0b1010_100_010: 2849: case 0b1010_100_011: 2850: case 0b1010_100_100: 2851: case 0b1010_100_101: 2852: case 0b1010_100_110: 2853: case 0b1010_100_111: 2854: case 0b1010_101_000: 2855: case 0b1010_101_001: 2856: case 0b1010_101_010: 2857: case 0b1010_101_011: 2858: case 0b1010_101_100: 2859: case 0b1010_101_101: 2860: case 0b1010_101_110: 2861: case 0b1010_101_111: 2862: case 0b1010_110_000: 2863: case 0b1010_110_001: 2864: case 0b1010_110_010: 2865: case 0b1010_110_011: 2866: case 0b1010_110_100: 2867: case 0b1010_110_101: 2868: case 0b1010_110_110: 2869: case 0b1010_110_111: 2870: case 0b1010_111_000: 2871: case 0b1010_111_001: 2872: case 0b1010_111_010: 2873: case 0b1010_111_011: 2874: case 0b1010_111_100: 2875: case 0b1010_111_101: 2876: case 0b1010_111_110: 2877: case 0b1010_111_111: 2878: irpAline (); 2879: break irpSwitch; 2880: 2881: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2882: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2883: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2884: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2885: //CMP.B <ea>,Dq |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr 2886: case 0b1011_000_000: 2887: case 0b1011_001_000: 2888: case 0b1011_010_000: 2889: case 0b1011_011_000: 2890: case 0b1011_100_000: 2891: case 0b1011_101_000: 2892: case 0b1011_110_000: 2893: case 0b1011_111_000: 2894: irpCmpByte (); 2895: break irpSwitch; 2896: 2897: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2898: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2899: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2900: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2901: //CMP.W <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr 2902: case 0b1011_000_001: 2903: case 0b1011_001_001: 2904: case 0b1011_010_001: 2905: case 0b1011_011_001: 2906: case 0b1011_100_001: 2907: case 0b1011_101_001: 2908: case 0b1011_110_001: 2909: case 0b1011_111_001: 2910: irpCmpWord (); 2911: break irpSwitch; 2912: 2913: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2914: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2915: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2916: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2917: //CMP.L <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr 2918: case 0b1011_000_010: 2919: case 0b1011_001_010: 2920: case 0b1011_010_010: 2921: case 0b1011_011_010: 2922: case 0b1011_100_010: 2923: case 0b1011_101_010: 2924: case 0b1011_110_010: 2925: case 0b1011_111_010: 2926: irpCmpLong (); 2927: break irpSwitch; 2928: 2929: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2930: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2931: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2932: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2933: //CMPA.W <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr 2934: //CMP.W <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq] 2935: case 0b1011_000_011: 2936: case 0b1011_001_011: 2937: case 0b1011_010_011: 2938: case 0b1011_011_011: 2939: case 0b1011_100_011: 2940: case 0b1011_101_011: 2941: case 0b1011_110_011: 2942: case 0b1011_111_011: 2943: irpCmpaWord (); 2944: break irpSwitch; 2945: 2946: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2947: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2948: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2949: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2950: //EOR.B Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_100_mmm_rrr 2951: //CMPM.B (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_100_001_rrr 2952: case 0b1011_000_100: 2953: case 0b1011_001_100: 2954: case 0b1011_010_100: 2955: case 0b1011_011_100: 2956: case 0b1011_100_100: 2957: case 0b1011_101_100: 2958: case 0b1011_110_100: 2959: case 0b1011_111_100: 2960: irpEorByte (); 2961: break irpSwitch; 2962: 2963: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2964: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2965: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2966: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2967: //EOR.W Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_101_mmm_rrr 2968: //CMPM.W (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_101_001_rrr 2969: case 0b1011_000_101: 2970: case 0b1011_001_101: 2971: case 0b1011_010_101: 2972: case 0b1011_011_101: 2973: case 0b1011_100_101: 2974: case 0b1011_101_101: 2975: case 0b1011_110_101: 2976: case 0b1011_111_101: 2977: irpEorWord (); 2978: break irpSwitch; 2979: 2980: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2981: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2982: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2983: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2984: //EOR.L Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_110_mmm_rrr 2985: //CMPM.L (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_110_001_rrr 2986: case 0b1011_000_110: 2987: case 0b1011_001_110: 2988: case 0b1011_010_110: 2989: case 0b1011_011_110: 2990: case 0b1011_100_110: 2991: case 0b1011_101_110: 2992: case 0b1011_110_110: 2993: case 0b1011_111_110: 2994: irpEorLong (); 2995: break irpSwitch; 2996: 2997: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2998: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2999: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3000: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3001: //CMPA.L <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr 3002: //CMP.L <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq] 3003: case 0b1011_000_111: 3004: case 0b1011_001_111: 3005: case 0b1011_010_111: 3006: case 0b1011_011_111: 3007: case 0b1011_100_111: 3008: case 0b1011_101_111: 3009: case 0b1011_110_111: 3010: case 0b1011_111_111: 3011: irpCmpaLong (); 3012: break irpSwitch; 3013: 3014: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3015: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3016: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3017: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3018: //AND.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr 3019: case 0b1100_000_000: 3020: case 0b1100_001_000: 3021: case 0b1100_010_000: 3022: case 0b1100_011_000: 3023: case 0b1100_100_000: 3024: case 0b1100_101_000: 3025: case 0b1100_110_000: 3026: case 0b1100_111_000: 3027: irpAndToRegByte (); 3028: break irpSwitch; 3029: 3030: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3031: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3032: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3034: //AND.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr 3035: case 0b1100_000_001: 3036: case 0b1100_001_001: 3037: case 0b1100_010_001: 3038: case 0b1100_011_001: 3039: case 0b1100_100_001: 3040: case 0b1100_101_001: 3041: case 0b1100_110_001: 3042: case 0b1100_111_001: 3043: irpAndToRegWord (); 3044: break irpSwitch; 3045: 3046: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3047: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3048: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3049: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3050: //AND.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr 3051: case 0b1100_000_010: 3052: case 0b1100_001_010: 3053: case 0b1100_010_010: 3054: case 0b1100_011_010: 3055: case 0b1100_100_010: 3056: case 0b1100_101_010: 3057: case 0b1100_110_010: 3058: case 0b1100_111_010: 3059: irpAndToRegLong (); 3060: break irpSwitch; 3061: 3062: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3063: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3064: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3065: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3066: //MULU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr 3067: case 0b1100_000_011: 3068: case 0b1100_001_011: 3069: case 0b1100_010_011: 3070: case 0b1100_011_011: 3071: case 0b1100_100_011: 3072: case 0b1100_101_011: 3073: case 0b1100_110_011: 3074: case 0b1100_111_011: 3075: irpMuluWord (); 3076: break irpSwitch; 3077: 3078: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3079: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3080: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3081: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3082: //ABCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_000_rrr 3083: //ABCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_001_rrr 3084: //AND.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_100_mmm_rrr 3085: case 0b1100_000_100: 3086: case 0b1100_001_100: 3087: case 0b1100_010_100: 3088: case 0b1100_011_100: 3089: case 0b1100_100_100: 3090: case 0b1100_101_100: 3091: case 0b1100_110_100: 3092: case 0b1100_111_100: 3093: irpAndToMemByte (); 3094: break irpSwitch; 3095: 3096: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3097: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3098: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3099: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3100: //EXG.L Dq,Dr |-|012346|-|-----|-----| |1100_qqq_101_000_rrr 3101: //EXG.L Aq,Ar |-|012346|-|-----|-----| |1100_qqq_101_001_rrr 3102: //AND.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_101_mmm_rrr 3103: case 0b1100_000_101: 3104: case 0b1100_001_101: 3105: case 0b1100_010_101: 3106: case 0b1100_011_101: 3107: case 0b1100_100_101: 3108: case 0b1100_101_101: 3109: case 0b1100_110_101: 3110: case 0b1100_111_101: 3111: irpAndToMemWord (); 3112: break irpSwitch; 3113: 3114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3115: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3116: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3117: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3118: //EXG.L Dq,Ar |-|012346|-|-----|-----| |1100_qqq_110_001_rrr 3119: //AND.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_110_mmm_rrr 3120: case 0b1100_000_110: 3121: case 0b1100_001_110: 3122: case 0b1100_010_110: 3123: case 0b1100_011_110: 3124: case 0b1100_100_110: 3125: case 0b1100_101_110: 3126: case 0b1100_110_110: 3127: case 0b1100_111_110: 3128: irpAndToMemLong (); 3129: break irpSwitch; 3130: 3131: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3132: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3133: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3134: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3135: //MULS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr 3136: case 0b1100_000_111: 3137: case 0b1100_001_111: 3138: case 0b1100_010_111: 3139: case 0b1100_011_111: 3140: case 0b1100_100_111: 3141: case 0b1100_101_111: 3142: case 0b1100_110_111: 3143: case 0b1100_111_111: 3144: irpMulsWord (); 3145: break irpSwitch; 3146: 3147: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3148: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3149: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3150: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3151: //ADD.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr 3152: case 0b1101_000_000: 3153: case 0b1101_001_000: 3154: case 0b1101_010_000: 3155: case 0b1101_011_000: 3156: case 0b1101_100_000: 3157: case 0b1101_101_000: 3158: case 0b1101_110_000: 3159: case 0b1101_111_000: 3160: irpAddToRegByte (); 3161: break irpSwitch; 3162: 3163: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3164: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3165: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3166: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3167: //ADD.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr 3168: case 0b1101_000_001: 3169: case 0b1101_001_001: 3170: case 0b1101_010_001: 3171: case 0b1101_011_001: 3172: case 0b1101_100_001: 3173: case 0b1101_101_001: 3174: case 0b1101_110_001: 3175: case 0b1101_111_001: 3176: irpAddToRegWord (); 3177: break irpSwitch; 3178: 3179: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3180: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3181: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3183: //ADD.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr 3184: case 0b1101_000_010: 3185: case 0b1101_001_010: 3186: case 0b1101_010_010: 3187: case 0b1101_011_010: 3188: case 0b1101_100_010: 3189: case 0b1101_101_010: 3190: case 0b1101_110_010: 3191: case 0b1101_111_010: 3192: irpAddToRegLong (); 3193: break irpSwitch; 3194: 3195: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3196: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3197: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3198: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3199: //ADDA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr 3200: //ADD.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq] 3201: case 0b1101_000_011: 3202: case 0b1101_001_011: 3203: case 0b1101_010_011: 3204: case 0b1101_011_011: 3205: case 0b1101_100_011: 3206: case 0b1101_101_011: 3207: case 0b1101_110_011: 3208: case 0b1101_111_011: 3209: irpAddaWord (); 3210: break irpSwitch; 3211: 3212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3213: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3214: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3215: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3216: //ADDX.B Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_100_000_rrr 3217: //ADDX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_100_001_rrr 3218: //ADD.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_100_mmm_rrr 3219: case 0b1101_000_100: 3220: case 0b1101_001_100: 3221: case 0b1101_010_100: 3222: case 0b1101_011_100: 3223: case 0b1101_100_100: 3224: case 0b1101_101_100: 3225: case 0b1101_110_100: 3226: case 0b1101_111_100: 3227: irpAddToMemByte (); 3228: break irpSwitch; 3229: 3230: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3231: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3232: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3233: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3234: //ADDX.W Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_101_000_rrr 3235: //ADDX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_101_001_rrr 3236: //ADD.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_101_mmm_rrr 3237: case 0b1101_000_101: 3238: case 0b1101_001_101: 3239: case 0b1101_010_101: 3240: case 0b1101_011_101: 3241: case 0b1101_100_101: 3242: case 0b1101_101_101: 3243: case 0b1101_110_101: 3244: case 0b1101_111_101: 3245: irpAddToMemWord (); 3246: break irpSwitch; 3247: 3248: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3249: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3250: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3251: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3252: //ADDX.L Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_110_000_rrr 3253: //ADDX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_110_001_rrr 3254: //ADD.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_110_mmm_rrr 3255: case 0b1101_000_110: 3256: case 0b1101_001_110: 3257: case 0b1101_010_110: 3258: case 0b1101_011_110: 3259: case 0b1101_100_110: 3260: case 0b1101_101_110: 3261: case 0b1101_110_110: 3262: case 0b1101_111_110: 3263: irpAddToMemLong (); 3264: break irpSwitch; 3265: 3266: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3267: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3268: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3269: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3270: //ADDA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr 3271: //ADD.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq] 3272: case 0b1101_000_111: 3273: case 0b1101_001_111: 3274: case 0b1101_010_111: 3275: case 0b1101_011_111: 3276: case 0b1101_100_111: 3277: case 0b1101_101_111: 3278: case 0b1101_110_111: 3279: case 0b1101_111_111: 3280: irpAddaLong (); 3281: break irpSwitch; 3282: 3283: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3284: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3285: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3286: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3287: //ASR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_000_rrr 3288: //LSR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_001_rrr 3289: //ROXR.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_010_rrr 3290: //ROR.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_011_rrr 3291: //ASR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_100_rrr 3292: //LSR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_101_rrr 3293: //ROXR.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_110_rrr 3294: //ROR.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_111_rrr 3295: //ASR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_000_rrr [ASR.B #1,Dr] 3296: //LSR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_001_rrr [LSR.B #1,Dr] 3297: //ROXR.B Dr |A|012346|-|*UUUU|***0*| |1110_001_000_010_rrr [ROXR.B #1,Dr] 3298: //ROR.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_000_011_rrr [ROR.B #1,Dr] 3299: case 0b1110_000_000: 3300: case 0b1110_001_000: 3301: case 0b1110_010_000: 3302: case 0b1110_011_000: 3303: case 0b1110_100_000: 3304: case 0b1110_101_000: 3305: case 0b1110_110_000: 3306: case 0b1110_111_000: 3307: irpXxrToRegByte (); 3308: break irpSwitch; 3309: 3310: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3311: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3312: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3313: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3314: //ASR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_000_rrr 3315: //LSR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_001_rrr 3316: //ROXR.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_010_rrr 3317: //ROR.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_011_rrr 3318: //ASR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_100_rrr 3319: //LSR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_101_rrr 3320: //ROXR.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_110_rrr 3321: //ROR.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_111_rrr 3322: //ASR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_000_rrr [ASR.W #1,Dr] 3323: //LSR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_001_rrr [LSR.W #1,Dr] 3324: //ROXR.W Dr |A|012346|-|*UUUU|***0*| |1110_001_001_010_rrr [ROXR.W #1,Dr] 3325: //ROR.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_001_011_rrr [ROR.W #1,Dr] 3326: case 0b1110_000_001: 3327: case 0b1110_001_001: 3328: case 0b1110_010_001: 3329: case 0b1110_011_001: 3330: case 0b1110_100_001: 3331: case 0b1110_101_001: 3332: case 0b1110_110_001: 3333: case 0b1110_111_001: 3334: irpXxrToRegWord (); 3335: break irpSwitch; 3336: 3337: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3338: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3339: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3340: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3341: //ASR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_000_rrr 3342: //LSR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_001_rrr 3343: //ROXR.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_010_rrr 3344: //ROR.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_011_rrr 3345: //ASR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_100_rrr 3346: //LSR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_101_rrr 3347: //ROXR.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_110_rrr 3348: //ROR.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_111_rrr 3349: //ASR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_000_rrr [ASR.L #1,Dr] 3350: //LSR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_001_rrr [LSR.L #1,Dr] 3351: //ROXR.L Dr |A|012346|-|*UUUU|***0*| |1110_001_010_010_rrr [ROXR.L #1,Dr] 3352: //ROR.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_010_011_rrr [ROR.L #1,Dr] 3353: case 0b1110_000_010: 3354: case 0b1110_001_010: 3355: case 0b1110_010_010: 3356: case 0b1110_011_010: 3357: case 0b1110_100_010: 3358: case 0b1110_101_010: 3359: case 0b1110_110_010: 3360: case 0b1110_111_010: 3361: irpXxrToRegLong (); 3362: break irpSwitch; 3363: 3364: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3365: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3366: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3367: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3368: //ASR.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_000_011_mmm_rrr 3369: case 0b1110_000_011: 3370: irpAsrToMem (); 3371: break irpSwitch; 3372: 3373: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3374: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3375: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3376: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3377: //ASL.B #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_000_rrr 3378: //LSL.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_001_rrr 3379: //ROXL.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_010_rrr 3380: //ROL.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_011_rrr 3381: //ASL.B Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_100_rrr 3382: //LSL.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_101_rrr 3383: //ROXL.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_110_rrr 3384: //ROL.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_111_rrr 3385: //ASL.B Dr |A|012346|-|UUUUU|*****| |1110_001_100_000_rrr [ASL.B #1,Dr] 3386: //LSL.B Dr |A|012346|-|UUUUU|***0*| |1110_001_100_001_rrr [LSL.B #1,Dr] 3387: //ROXL.B Dr |A|012346|-|*UUUU|***0*| |1110_001_100_010_rrr [ROXL.B #1,Dr] 3388: //ROL.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_100_011_rrr [ROL.B #1,Dr] 3389: case 0b1110_000_100: 3390: case 0b1110_001_100: 3391: case 0b1110_010_100: 3392: case 0b1110_011_100: 3393: case 0b1110_100_100: 3394: case 0b1110_101_100: 3395: case 0b1110_110_100: 3396: case 0b1110_111_100: 3397: irpXxlToRegByte (); 3398: break irpSwitch; 3399: 3400: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3401: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3402: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3403: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3404: //ASL.W #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_000_rrr 3405: //LSL.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_001_rrr 3406: //ROXL.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_010_rrr 3407: //ROL.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_011_rrr 3408: //ASL.W Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_100_rrr 3409: //LSL.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_101_rrr 3410: //ROXL.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_110_rrr 3411: //ROL.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_111_rrr 3412: //ASL.W Dr |A|012346|-|UUUUU|*****| |1110_001_101_000_rrr [ASL.W #1,Dr] 3413: //LSL.W Dr |A|012346|-|UUUUU|***0*| |1110_001_101_001_rrr [LSL.W #1,Dr] 3414: //ROXL.W Dr |A|012346|-|*UUUU|***0*| |1110_001_101_010_rrr [ROXL.W #1,Dr] 3415: //ROL.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_101_011_rrr [ROL.W #1,Dr] 3416: case 0b1110_000_101: 3417: case 0b1110_001_101: 3418: case 0b1110_010_101: 3419: case 0b1110_011_101: 3420: case 0b1110_100_101: 3421: case 0b1110_101_101: 3422: case 0b1110_110_101: 3423: case 0b1110_111_101: 3424: irpXxlToRegWord (); 3425: break irpSwitch; 3426: 3427: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3428: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3429: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3430: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3431: //ASL.L #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_000_rrr 3432: //LSL.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_001_rrr 3433: //ROXL.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_010_rrr 3434: //ROL.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_011_rrr 3435: //ASL.L Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_100_rrr 3436: //LSL.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_101_rrr 3437: //ROXL.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_110_rrr 3438: //ROL.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_111_rrr 3439: //ASL.L Dr |A|012346|-|UUUUU|*****| |1110_001_110_000_rrr [ASL.L #1,Dr] 3440: //LSL.L Dr |A|012346|-|UUUUU|***0*| |1110_001_110_001_rrr [LSL.L #1,Dr] 3441: //ROXL.L Dr |A|012346|-|*UUUU|***0*| |1110_001_110_010_rrr [ROXL.L #1,Dr] 3442: //ROL.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_110_011_rrr [ROL.L #1,Dr] 3443: case 0b1110_000_110: 3444: case 0b1110_001_110: 3445: case 0b1110_010_110: 3446: case 0b1110_011_110: 3447: case 0b1110_100_110: 3448: case 0b1110_101_110: 3449: case 0b1110_110_110: 3450: case 0b1110_111_110: 3451: irpXxlToRegLong (); 3452: break irpSwitch; 3453: 3454: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3455: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3456: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3457: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3458: //ASL.W <ea> |-|012346|-|UUUUU|*****| M+-WXZ |1110_000_111_mmm_rrr 3459: case 0b1110_000_111: 3460: irpAslToMem (); 3461: break irpSwitch; 3462: 3463: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3464: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3465: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3466: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3467: //LSR.W <ea> |-|012346|-|UUUUU|*0*0*| M+-WXZ |1110_001_011_mmm_rrr 3468: case 0b1110_001_011: 3469: irpLsrToMem (); 3470: break irpSwitch; 3471: 3472: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3473: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3474: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3475: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3476: //LSL.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_001_111_mmm_rrr 3477: case 0b1110_001_111: 3478: irpLslToMem (); 3479: break irpSwitch; 3480: 3481: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3482: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3483: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3484: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3485: //ROXR.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_011_mmm_rrr 3486: case 0b1110_010_011: 3487: irpRoxrToMem (); 3488: break irpSwitch; 3489: 3490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3491: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3492: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3493: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3494: //ROXL.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_111_mmm_rrr 3495: case 0b1110_010_111: 3496: irpRoxlToMem (); 3497: break irpSwitch; 3498: 3499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3500: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3501: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3502: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3503: //ROR.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_011_mmm_rrr 3504: case 0b1110_011_011: 3505: irpRorToMem (); 3506: break irpSwitch; 3507: 3508: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3509: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3510: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3511: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3512: //ROL.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_111_mmm_rrr 3513: case 0b1110_011_111: 3514: irpRolToMem (); 3515: break irpSwitch; 3516: 3517: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3518: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3519: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3520: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3521: //FPACK <data> |A|012346|-|UUUUU|*****| |1111_111_0dd_ddd_ddd [FLINE #<data>] 3522: case 0b1111_111_000: 3523: case 0b1111_111_001: 3524: case 0b1111_111_010: 3525: case 0b1111_111_011: 3526: irpFpack (); 3527: break irpSwitch; 3528: 3529: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3530: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3531: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3532: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3533: //DOS <data> |A|012346|-|UUUUU|UUUUU| |1111_111_1dd_ddd_ddd [FLINE #<data>] 3534: case 0b1111_111_100: 3535: case 0b1111_111_101: 3536: case 0b1111_111_110: 3537: case 0b1111_111_111: 3538: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3539: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3540: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3541: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3542: //FLINE #<data> |-|012346|-|UUUUU|UUUUU| |1111_ddd_ddd_ddd_ddd (line 1111 emulator) 3543: case 0b1111_000_000: 3544: case 0b1111_000_001: 3545: case 0b1111_000_010: 3546: case 0b1111_000_011: 3547: case 0b1111_000_100: 3548: case 0b1111_000_101: 3549: case 0b1111_000_110: 3550: case 0b1111_000_111: 3551: case 0b1111_001_000: 3552: case 0b1111_001_001: 3553: case 0b1111_001_010: 3554: case 0b1111_001_011: 3555: case 0b1111_001_100: 3556: case 0b1111_001_101: 3557: case 0b1111_001_110: 3558: case 0b1111_001_111: 3559: case 0b1111_010_000: 3560: case 0b1111_010_001: 3561: case 0b1111_010_010: 3562: case 0b1111_010_011: 3563: case 0b1111_010_100: 3564: case 0b1111_010_101: 3565: case 0b1111_010_110: 3566: case 0b1111_010_111: 3567: case 0b1111_011_000: 3568: case 0b1111_011_001: 3569: case 0b1111_011_010: 3570: case 0b1111_011_011: 3571: case 0b1111_011_100: 3572: case 0b1111_011_101: 3573: case 0b1111_011_110: 3574: case 0b1111_011_111: 3575: case 0b1111_100_000: 3576: case 0b1111_100_001: 3577: case 0b1111_100_010: 3578: case 0b1111_100_011: 3579: case 0b1111_100_100: 3580: case 0b1111_100_101: 3581: case 0b1111_100_110: 3582: case 0b1111_100_111: 3583: case 0b1111_101_000: 3584: case 0b1111_101_001: 3585: case 0b1111_101_010: 3586: case 0b1111_101_011: 3587: case 0b1111_101_100: 3588: case 0b1111_101_101: 3589: case 0b1111_101_110: 3590: case 0b1111_101_111: 3591: case 0b1111_110_000: 3592: case 0b1111_110_001: 3593: case 0b1111_110_010: 3594: case 0b1111_110_011: 3595: case 0b1111_110_100: 3596: case 0b1111_110_101: 3597: case 0b1111_110_110: 3598: case 0b1111_110_111: 3599: irpFline (); 3600: break irpSwitch; 3601: 3602: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3603: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3604: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3605: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3606: //HFSBOOT |-|012346|-|-----|-----| |0100_111_000_000_000 3607: //HFSINST |-|012346|-|-----|-----| |0100_111_000_000_001 3608: //HFSSTR |-|012346|-|-----|-----| |0100_111_000_000_010 3609: //HFSINT |-|012346|-|-----|-----| |0100_111_000_000_011 3610: //EMXNOP |-|012346|-|-----|-----| |0100_111_000_000_100 3611: case 0b0100_111_000: 3612: irpEmx (); 3613: break; 3614: 3615: default: 3616: irpIllegal (); 3617: 3618: } //switch XEiJ.regOC >>> 6 3619: 3620: //トレース例外 3621: // 命令実行前にsrのTビットがセットされていたとき命令実行後にトレース例外が発生する 3622: // トレース例外の発動は命令の機能拡張であり、他の例外処理で命令が中断されたときはトレース例外は発生しない 3623: // 命令例外はトレース例外の前に、割り込み例外はトレース例外の後に処理される 3624: // 未実装命令のエミュレーションルーチンはrteの直前にsrのTビットを復元することで未実装命令が1個の命令としてトレースされたように見せる 3625: // ;DOSコールの終了 3626: // ~008616: 3627: // btst.b #$07,(sp) 3628: // bne.s ~00861E 3629: // rte 3630: // ~00861E: 3631: // ori.w #$8000,sr 3632: // rte 3633: if (XEiJ.mpuTraceFlag != 0) { //命令実行前にsrのTビットがセットされていた 3634: XEiJ.mpuCycleCount += 34; 3635: irpException (M68kException.M6E_TRACE, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 3636: } 3637: //クロックをカウントアップする 3638: // オペランドをアクセスした時点ではまだXEiJ.mpuClockTimeが更新されていないのでXEiJ.mpuClockTime<xxxClock 3639: // xxxTickを呼び出すときはXEiJ.mpuClockTime>=xxxClock 3640: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount; 3641: //デバイスを呼び出す 3642: TickerQueue.tkqRun (XEiJ.mpuClockTime); 3643: //割り込みを受け付ける 3644: if ((t = XEiJ.mpuIMR & XEiJ.mpuIRR) != 0) { //マスクされているレベルよりも高くて受け付けていない割り込みがあるとき 3645: if (XEiJ.MPU_INTERRUPT_SWITCH) { 3646: switch (t) { 3647: case 0b00000001: 3648: case 0b00000011: 3649: case 0b00000101: 3650: case 0b00000111: 3651: case 0b00001001: 3652: case 0b00001011: 3653: case 0b00001101: 3654: case 0b00001111: 3655: case 0b00010001: 3656: case 0b00010011: 3657: case 0b00010101: 3658: case 0b00010111: 3659: case 0b00011001: 3660: case 0b00011011: 3661: case 0b00011101: 3662: case 0b00011111: 3663: case 0b00100001: 3664: case 0b00100011: 3665: case 0b00100101: 3666: case 0b00100111: 3667: case 0b00101001: 3668: case 0b00101011: 3669: case 0b00101101: 3670: case 0b00101111: 3671: case 0b00110001: 3672: case 0b00110011: 3673: case 0b00110101: 3674: case 0b00110111: 3675: case 0b00111001: 3676: case 0b00111011: 3677: case 0b00111101: 3678: case 0b00111111: 3679: case 0b01000001: 3680: case 0b01000011: 3681: case 0b01000101: 3682: case 0b01000111: 3683: case 0b01001001: 3684: case 0b01001011: 3685: case 0b01001101: 3686: case 0b01001111: 3687: case 0b01010001: 3688: case 0b01010011: 3689: case 0b01010101: 3690: case 0b01010111: 3691: case 0b01011001: 3692: case 0b01011011: 3693: case 0b01011101: 3694: case 0b01011111: 3695: case 0b01100001: 3696: case 0b01100011: 3697: case 0b01100101: 3698: case 0b01100111: 3699: case 0b01101001: 3700: case 0b01101011: 3701: case 0b01101101: 3702: case 0b01101111: 3703: case 0b01110001: 3704: case 0b01110011: 3705: case 0b01110101: 3706: case 0b01110111: 3707: case 0b01111001: 3708: case 0b01111011: 3709: case 0b01111101: 3710: case 0b01111111: 3711: case 0b10000001: 3712: case 0b10000011: 3713: case 0b10000101: 3714: case 0b10000111: 3715: case 0b10001001: 3716: case 0b10001011: 3717: case 0b10001101: 3718: case 0b10001111: 3719: case 0b10010001: 3720: case 0b10010011: 3721: case 0b10010101: 3722: case 0b10010111: 3723: case 0b10011001: 3724: case 0b10011011: 3725: case 0b10011101: 3726: case 0b10011111: 3727: case 0b10100001: 3728: case 0b10100011: 3729: case 0b10100101: 3730: case 0b10100111: 3731: case 0b10101001: 3732: case 0b10101011: 3733: case 0b10101101: 3734: case 0b10101111: 3735: case 0b10110001: 3736: case 0b10110011: 3737: case 0b10110101: 3738: case 0b10110111: 3739: case 0b10111001: 3740: case 0b10111011: 3741: case 0b10111101: 3742: case 0b10111111: 3743: case 0b11000001: 3744: case 0b11000011: 3745: case 0b11000101: 3746: case 0b11000111: 3747: case 0b11001001: 3748: case 0b11001011: 3749: case 0b11001101: 3750: case 0b11001111: 3751: case 0b11010001: 3752: case 0b11010011: 3753: case 0b11010101: 3754: case 0b11010111: 3755: case 0b11011001: 3756: case 0b11011011: 3757: case 0b11011101: 3758: case 0b11011111: 3759: case 0b11100001: 3760: case 0b11100011: 3761: case 0b11100101: 3762: case 0b11100111: 3763: case 0b11101001: 3764: case 0b11101011: 3765: case 0b11101101: 3766: case 0b11101111: 3767: case 0b11110001: 3768: case 0b11110011: 3769: case 0b11110101: 3770: case 0b11110111: 3771: case 0b11111001: 3772: case 0b11111011: 3773: case 0b11111101: 3774: case 0b11111111: 3775: //レベル7 3776: XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みを受け付ける 3777: if ((t = XEiJ.sysAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3778: irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL); //割り込み処理を開始する 3779: } 3780: break; 3781: case 0b00000010: 3782: case 0b00000110: 3783: case 0b00001010: 3784: case 0b00001110: 3785: case 0b00010010: 3786: case 0b00010110: 3787: case 0b00011010: 3788: case 0b00011110: 3789: case 0b00100010: 3790: case 0b00100110: 3791: case 0b00101010: 3792: case 0b00101110: 3793: case 0b00110010: 3794: case 0b00110110: 3795: case 0b00111010: 3796: case 0b00111110: 3797: case 0b01000010: 3798: case 0b01000110: 3799: case 0b01001010: 3800: case 0b01001110: 3801: case 0b01010010: 3802: case 0b01010110: 3803: case 0b01011010: 3804: case 0b01011110: 3805: case 0b01100010: 3806: case 0b01100110: 3807: case 0b01101010: 3808: case 0b01101110: 3809: case 0b01110010: 3810: case 0b01110110: 3811: case 0b01111010: 3812: case 0b01111110: 3813: case 0b10000010: 3814: case 0b10000110: 3815: case 0b10001010: 3816: case 0b10001110: 3817: case 0b10010010: 3818: case 0b10010110: 3819: case 0b10011010: 3820: case 0b10011110: 3821: case 0b10100010: 3822: case 0b10100110: 3823: case 0b10101010: 3824: case 0b10101110: 3825: case 0b10110010: 3826: case 0b10110110: 3827: case 0b10111010: 3828: case 0b10111110: 3829: case 0b11000010: 3830: case 0b11000110: 3831: case 0b11001010: 3832: case 0b11001110: 3833: case 0b11010010: 3834: case 0b11010110: 3835: case 0b11011010: 3836: case 0b11011110: 3837: case 0b11100010: 3838: case 0b11100110: 3839: case 0b11101010: 3840: case 0b11101110: 3841: case 0b11110010: 3842: case 0b11110110: 3843: case 0b11111010: 3844: case 0b11111110: 3845: //レベル6 3846: XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK; //割り込みを受け付ける 3847: if ((t = MC68901.mfpAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3848: irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL); //割り込み処理を開始する 3849: } 3850: break; 3851: case 0b00000100: 3852: case 0b00001100: 3853: case 0b00010100: 3854: case 0b00011100: 3855: case 0b00100100: 3856: case 0b00101100: 3857: case 0b00110100: 3858: case 0b00111100: 3859: case 0b01000100: 3860: case 0b01001100: 3861: case 0b01010100: 3862: case 0b01011100: 3863: case 0b01100100: 3864: case 0b01101100: 3865: case 0b01110100: 3866: case 0b01111100: 3867: case 0b10000100: 3868: case 0b10001100: 3869: case 0b10010100: 3870: case 0b10011100: 3871: case 0b10100100: 3872: case 0b10101100: 3873: case 0b10110100: 3874: case 0b10111100: 3875: case 0b11000100: 3876: case 0b11001100: 3877: case 0b11010100: 3878: case 0b11011100: 3879: case 0b11100100: 3880: case 0b11101100: 3881: case 0b11110100: 3882: case 0b11111100: 3883: //レベル5 3884: XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK; //割り込みを受け付ける 3885: if ((t = Z8530.sccAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3886: irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL); //割り込み処理を開始する 3887: } 3888: break; 3889: case 0b00010000: 3890: case 0b00110000: 3891: case 0b01010000: 3892: case 0b01110000: 3893: case 0b10010000: 3894: case 0b10110000: 3895: case 0b11010000: 3896: case 0b11110000: 3897: //レベル3 3898: XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK; //割り込みを受け付ける 3899: if ((t = HD63450.dmaAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3900: irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL); //割り込み処理を開始する 3901: } 3902: break; 3903: case 0b00100000: 3904: case 0b01100000: 3905: case 0b10100000: 3906: case 0b11100000: 3907: //レベル2 3908: XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK; //割り込みを受け付ける 3909: if ((t = XEiJ.eb2Acknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3910: irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL); //割り込み処理を開始する 3911: } 3912: break; 3913: case 0b01000000: 3914: case 0b11000000: 3915: //レベル1 3916: XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK; //割り込みを受け付ける 3917: if ((t = IOInterrupt.ioiAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3918: irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL); //割り込み処理を開始する 3919: } 3920: break; 3921: } 3922: } else { 3923: t &= -t; 3924: // x&=-xはxの最下位の1のビットだけを残す演算 3925: // すなわちマスクされているレベルよりも高くて受け付けていない割り込みの中で最高レベルの割り込みのビットだけが残る 3926: // 最高レベルの割り込みのビットしか残っていないので、割り込みの有無をレベルの高い順ではなく使用頻度の高い順に調べられる 3927: // MFPやDMAの割り込みがかかる度にそれより優先度の高いインタラプトスイッチが押されていないかどうかを確かめる必要がない 3928: if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) { 3929: XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK; //割り込みを受け付ける 3930: if ((t = MC68901.mfpAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3931: irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL); //割り込み処理を開始する 3932: } 3933: } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) { 3934: XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK; //割り込みを受け付ける 3935: if ((t = HD63450.dmaAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3936: irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL); //割り込み処理を開始する 3937: } 3938: } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) { 3939: XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK; //割り込みを受け付ける 3940: if ((t = Z8530.sccAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3941: irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL); //割り込み処理を開始する 3942: } 3943: } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) { 3944: XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK; //割り込みを受け付ける 3945: if ((t = IOInterrupt.ioiAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3946: irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL); //割り込み処理を開始する 3947: } 3948: } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) { 3949: XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK; //割り込みを受け付ける 3950: if ((t = XEiJ.eb2Acknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3951: irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL); //割り込み処理を開始する 3952: } 3953: } else if (t == XEiJ.MPU_SYS_INTERRUPT_MASK) { 3954: XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みを受け付ける 3955: if ((t = XEiJ.sysAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3956: irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL); //割り込み処理を開始する 3957: } 3958: } 3959: } 3960: } //if t!=0 3961: if (MC68901.MFP_DELAYED_INTERRUPT) { 3962: XEiJ.mpuIRR |= XEiJ.mpuDIRR; //遅延割り込み要求 3963: XEiJ.mpuDIRR = 0; 3964: } 3965: } //命令ループ 3966: } catch (M68kException e) { 3967: if (M68kException.m6eNumber == M68kException.M6E_WAIT_EXCEPTION) { //待機例外 3968: if (irpWaitException ()) { 3969: continue; 3970: } else { 3971: break errorLoop; 3972: } 3973: } 3974: if (M68kException.m6eNumber == M68kException.M6E_INSTRUCTION_BREAK_POINT) { //命令ブレークポイントによる停止 3975: XEiJ.regPC = XEiJ.regPC0; 3976: XEiJ.mpuStop1 (null); //"Instruction Break Point" 3977: break errorLoop; 3978: } 3979: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount; 3980: //例外処理 3981: // ここで処理するのはベクタ番号が2~31の例外に限る。TRAP #n命令はインライン展開する 3982: // 使用頻度が高いと思われる例外はインライン展開するのでここには来ない 3983: // 例外処理をインライン展開する場合はMC68000とMC68030のコードを分けなければならずコードが冗長になる 3984: // 使用頻度が低いと思われる例外はインライン展開しない 3985: // セーブされるpcは以下の例外は命令の先頭、これ以外は次の命令 3986: // 2 BUS_ERROR 3987: // 3 ADDRESS_ERROR 3988: // 4 ILLEGAL_INSTRUCTION 3989: // 8 PRIVILEGE_VIOLATION 3990: // 10 LINE_1010_EMULATOR 3991: // 11 LINE_1111_EMULATOR 3992: // fedcba9876543210fedcba9876543210 3993: //if ((1 << M68kException.m6eNumber & 0b00000000000000000000110100011100) != 0) { 3994: // 0123456789abcdef0123456789abcdef 3995: if (0b00111000101100000000000000000000 << M68kException.m6eNumber < 0) { 3996: XEiJ.regPC = XEiJ.regPC0; //セーブされるpcは命令の先頭 3997: } 3998: try { 3999: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 4000: int sp = XEiJ.regRn[15]; 4001: XEiJ.regSRT1 = 0; //srのTビットを消す 4002: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4003: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 4004: XEiJ.mpuUSP = sp; //USPを保存 4005: sp = XEiJ.mpuISP; //SSPを復元 4006: if (DataBreakPoint.DBP_ON) { 4007: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 4008: } else { 4009: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 4010: } 4011: if (InstructionBreakPoint.IBP_ON) { 4012: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 4013: } 4014: } 4015: int vectorOffset = M68kException.m6eNumber << 2; //vector offset 4016: if (M68kException.m6eNumber <= M68kException.M6E_ADDRESS_ERROR) { //バスエラーまたはアドレスエラー 4017: //ホストファイルシステムのデバイスコマンドを強制終了させる 4018: HFS.hfsState = HFS.HFS_STATE_IDLE; 4019: XEiJ.mpuClockTime += 50 * XEiJ.mpuModifiedUnit; 4020: //long format stack frame (bus error/address error) 4021: // $0000 .w status register 4022: // $0002 .l program counter 4023: // $0006 .w format and vector offset. $8008=bus error, $800C=address error 4024: // $0008 .w special status word 4025: // $000A .l fault address 4026: // $000E .w unused, reserved 4027: // $0010 .w data output buffer 4028: // $0012 .w unused, reserved 4029: // $0014 .w data input buffer 4030: // $0016 .w unused, reserved 4031: // $0018 .w instruction input buffer 4032: // $001A .w[16] internal information, 16 words 4033: // 29 words, 58 bytes 4034: //special status word 4035: // bit15 RR Rerun flag; 0=processor rerun (default), 1=software rerun 4036: // bit14 * These bits are reserved for future use by Motorola and will be zero when written by the MC68010. 4037: // bit13 IF Instruction fetch to the instruction input buffer 4038: // bit12 DF Data fetch to the data input buffer 4039: // bit11 RM Read-modify-write cycle 4040: // bit10 HB High-byte transfer from the data output buffer or to the data input buffer 4041: // bit9 BY Byte-transfer flag; HB selects the high or low byte of the transfer register. 4042: // If BY is clear, the transfer is word. 4043: // bit8 RW Read/write flag; 0=write, 1=read 4044: // bit7-3 * 4045: // bit2-0 FC2-FC0 The function code used during the faulted access 4046: XEiJ.regRn[15] = sp -= 58; //long format 4047: XEiJ.busWl (sp + 10, M68kException.m6eAddress); //fault address 4048: XEiJ.busWw (sp + 8, 4049: (M68kException.m6eSize == XEiJ.MPU_SS_BYTE ? 0x0200 : 0x0000) | //BY 4050: (M68kException.m6eDirection == XEiJ.MPU_WR_READ ? 0x0100 : 0x0000) //RW 4051: //!!! 他のフラグをセットしていない 4052: ); //special status word 4053: XEiJ.busWw (sp + 6, 0x8000 | vectorOffset); //format and vector offset 4054: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 4055: XEiJ.busWw (sp, save_sr); //status register 4056: } else { 4057: //short format stack frame 4058: // $0000 .w status register 4059: // $0002 .l program counter 4060: // $0006 .w format and vector offset 4061: // 4 words, 8 bytes 4062: XEiJ.regRn[15] = sp -= 8; //short format 4063: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 4064: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 4065: XEiJ.busWw (sp, save_sr); //status register 4066: } 4067: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 4068: if (XEiJ.dbgStopOnError) { //エラーで停止する場合 4069: if (XEiJ.dbgDoStopOnError ()) { 4070: break errorLoop; 4071: } 4072: } 4073: } catch (M68kException ee) { //ダブルバスフォルト 4074: XEiJ.dbgDoubleBusFault (); 4075: break errorLoop; 4076: } 4077: } //catch M68kException 4078: } //例外ループ 4079: 4080: // 通常 4081: // pc0 最後に実行した命令 4082: // pc 次に実行する命令 4083: // バスエラー、アドレスエラー、不当命令、特権違反で停止したとき 4084: // pc0 エラーを発生させた命令 4085: // pc 例外処理ルーチンの先頭 4086: // ダブルバスフォルトで停止したとき 4087: // pc0 エラーを発生させた命令 4088: // pc エラーを発生させた命令 4089: // 命令ブレークポイントで停止したとき 4090: // pc0 命令ブレークポイントが設定された、次に実行する命令 4091: // pc 命令ブレークポイントが設定された、次に実行する命令 4092: // データブレークポイントで停止したとき 4093: // pc0 データを書き換えた、最後に実行した命令 4094: // pc 次に実行する命令 4095: 4096: //分岐ログに停止レコードを記録する 4097: if (BranchLog.BLG_ON) { 4098: BranchLog.blgStop (); 4099: } 4100: 4101: } //mpuCore() 4102: 4103: 4104: 4105: //cont = irpWaitException () 4106: // 待機例外をキャッチしたとき 4107: public static boolean irpWaitException () { 4108: XEiJ.regPC = XEiJ.regPC0; //PCを巻き戻す 4109: XEiJ.regRn[8 + (XEiJ.regOC & 7)] += WaitInstruction.REWIND_AR[XEiJ.regOC >> 3]; //(Ar)+|-(Ar)で変化したArを巻き戻す 4110: try { 4111: //トレース例外を処理する 4112: if (XEiJ.mpuTraceFlag != 0) { //命令実行前にsrのTビットがセットされていた 4113: XEiJ.mpuCycleCount += 34; 4114: irpException (M68kException.M6E_TRACE, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 4115: } 4116: //デバイスを呼び出す 4117: TickerQueue.tkqRun (XEiJ.mpuClockTime); 4118: //割り込みを受け付ける 4119: int t; 4120: if ((t = XEiJ.mpuIMR & XEiJ.mpuIRR) != 0) { //マスクされているレベルよりも高くて受け付けていない割り込みがあるとき 4121: t &= -t; 4122: // x&=-xはxの最下位の1のビットだけを残す演算 4123: // すなわちマスクされているレベルよりも高くて受け付けていない割り込みの中で最高レベルの割り込みのビットだけが残る 4124: // 最高レベルの割り込みのビットしか残っていないので、割り込みの有無をレベルの高い順ではなく使用頻度の高い順に調べられる 4125: // MFPやDMAの割り込みがかかる度にそれより優先度の高いインタラプトスイッチが押されていないかどうかを確かめる必要がない 4126: if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) { 4127: XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK; //割り込みを受け付ける 4128: if ((t = MC68901.mfpAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 4129: irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL); //割り込み処理を開始する 4130: } 4131: } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) { 4132: XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK; //割り込みを受け付ける 4133: if ((t = HD63450.dmaAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 4134: irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL); //割り込み処理を開始する 4135: } 4136: } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) { 4137: XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK; //割り込みを受け付ける 4138: if ((t = Z8530.sccAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 4139: irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL); //割り込み処理を開始する 4140: } 4141: } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) { 4142: XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK; //割り込みを受け付ける 4143: if ((t = IOInterrupt.ioiAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 4144: irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL); //割り込み処理を開始する 4145: } 4146: } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) { 4147: XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK; //割り込みを受け付ける 4148: if ((t = XEiJ.eb2Acknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 4149: irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL); //割り込み処理を開始する 4150: } 4151: } else if (t == XEiJ.MPU_SYS_INTERRUPT_MASK) { 4152: XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みを受け付ける 4153: if ((t = XEiJ.sysAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 4154: irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL); //割り込み処理を開始する 4155: } 4156: } 4157: } //if t!=0 4158: if (MC68901.MFP_DELAYED_INTERRUPT) { 4159: XEiJ.mpuIRR |= XEiJ.mpuDIRR; //遅延割り込み要求 4160: XEiJ.mpuDIRR = 0; 4161: } 4162: } catch (M68kException e) { 4163: //!!! 待機例外処理中のバスエラーの処理は省略 4164: XEiJ.dbgDoubleBusFault (); 4165: return false; 4166: } //catch M68kException 4167: return true; 4168: } //irpWaitException 4169: 4170: 4171: 4172: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4173: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4174: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4175: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4176: //ORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_000_mmm_rrr-{data} 4177: //OR.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_000_mmm_rrr-{data} [ORI.B #<data>,<ea>] 4178: //ORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_000_000_111_100-{data} 4179: public static void irpOriByte () throws M68kException { 4180: int ea = XEiJ.regOC & 63; 4181: int z; 4182: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4183: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4184: } else { 4185: z = XEiJ.regPC; 4186: XEiJ.regPC = z + 2; 4187: z = XEiJ.busRbs (z + 1); //pcbs 4188: } 4189: if (ea < XEiJ.EA_AR) { //ORI.B #<data>,Dr 4190: if (XEiJ.DBG_ORI_BYTE_ZERO_D0) { 4191: if (z == 0 && ea == 0 && XEiJ.dbgOriByteZeroD0) { //ORI.B #$00,D0 4192: XEiJ.mpuCycleCount += 34; 4193: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4194: throw M68kException.m6eSignal; 4195: } 4196: } 4197: XEiJ.mpuCycleCount += 8; 4198: z = XEiJ.regRn[ea] |= 255 & z; //0拡張してからOR 4199: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4200: } else if (ea == XEiJ.EA_IM) { //ORI.B #<data>,CCR 4201: XEiJ.mpuCycleCount += 20; 4202: XEiJ.regCCR |= XEiJ.REG_CCR_MASK & z; 4203: } else { //ORI.B #<data>,<mem> 4204: XEiJ.mpuCycleCount += 12; 4205: int a = efaMltByte (ea); 4206: XEiJ.busWb (a, z |= XEiJ.busRbs (a)); 4207: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4208: } 4209: } //irpOriByte 4210: 4211: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4212: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4213: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4214: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4215: //ORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_001_mmm_rrr-{data} 4216: //OR.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_001_mmm_rrr-{data} [ORI.W #<data>,<ea>] 4217: //ORI.W #<data>,SR |-|012346|P|*****|*****| |0000_000_001_111_100-{data} 4218: public static void irpOriWord () throws M68kException { 4219: int ea = XEiJ.regOC & 63; 4220: if (ea < XEiJ.EA_AR) { //ORI.W #<data>,Dr 4221: int z; 4222: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4223: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4224: } else { 4225: z = XEiJ.regPC; 4226: XEiJ.regPC = z + 2; 4227: z = XEiJ.busRwse (z); //pcws 4228: } 4229: XEiJ.mpuCycleCount += 8; 4230: z = XEiJ.regRn[ea] |= (char) z; //0拡張してからOR 4231: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4232: } else if (ea == XEiJ.EA_IM) { //ORI.W #<data>,SR 4233: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4234: XEiJ.mpuCycleCount += 34; 4235: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4236: throw M68kException.m6eSignal; 4237: } 4238: //以下はスーパーバイザモード 4239: XEiJ.mpuCycleCount += 20; 4240: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4241: irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4242: } else { 4243: int t = XEiJ.regPC; 4244: XEiJ.regPC = t + 2; 4245: irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4246: } 4247: } else { //ORI.W #<data>,<mem> 4248: int z; 4249: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4250: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4251: } else { 4252: z = XEiJ.regPC; 4253: XEiJ.regPC = z + 2; 4254: z = XEiJ.busRwse (z); //pcws 4255: } 4256: XEiJ.mpuCycleCount += 12; 4257: int a = efaMltWord (ea); 4258: XEiJ.busWw (a, z |= XEiJ.busRws (a)); 4259: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4260: } 4261: } //irpOriWord 4262: 4263: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4264: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4265: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4266: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4267: //ORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_010_mmm_rrr-{data} 4268: //OR.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_010_mmm_rrr-{data} [ORI.L #<data>,<ea>] 4269: public static void irpOriLong () throws M68kException { 4270: int ea = XEiJ.regOC & 63; 4271: int y; 4272: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4273: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4274: } else { 4275: y = XEiJ.regPC; 4276: XEiJ.regPC = y + 4; 4277: y = XEiJ.busRlse (y); //pcls 4278: } 4279: int z; 4280: if (ea < XEiJ.EA_AR) { //ORI.L #<data>,Dr 4281: XEiJ.mpuCycleCount += 16; 4282: z = XEiJ.regRn[ea] |= y; 4283: } else { //ORI.L #<data>,<mem> 4284: XEiJ.mpuCycleCount += 20; 4285: int a = efaMltLong (ea); 4286: XEiJ.busWl (a, z = XEiJ.busRls (a) | y); 4287: } 4288: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 4289: } //irpOriLong 4290: 4291: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4292: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4293: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4294: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4295: //BITREV.L Dr |-|------|-|-----|-----|D |0000_000_011_000_rrr (ISA_C) 4296: // 4297: //BITREV.L Dr 4298: // Drのビットの並びを逆順にする。CCRは変化しない 4299: public static void irpCmp2Chk2Byte () throws M68kException { 4300: int ea = XEiJ.regOC & 63; 4301: if (ea < XEiJ.EA_AR) { //BITREV.L Dr 4302: XEiJ.mpuCycleCount += 4; 4303: if (XEiJ.IRP_BITREV_REVERSE) { //2.83ns 0x0f801f3c 4304: XEiJ.regRn[ea] = Integer.reverse (XEiJ.regRn[ea]); 4305: } else if (XEiJ.IRP_BITREV_SHIFT) { //2.57ns 0x0f801f3c 4306: int x = XEiJ.regRn[ea]; 4307: x = x << 16 | x >>> 16; 4308: x = x << 8 & 0xff00ff00 | x >>> 8 & 0x00ff00ff; 4309: x = x << 4 & 0xf0f0f0f0 | x >>> 4 & 0x0f0f0f0f; 4310: x = x << 2 & 0xcccccccc | x >>> 2 & 0x33333333; 4311: XEiJ.regRn[ea] = x << 1 & 0xaaaaaaaa | x >>> 1 & 0x55555555; 4312: } else if (XEiJ.IRP_BITREV_TABLE) { //1.57ns 0x0f801f3c 4313: int x = XEiJ.regRn[ea]; 4314: XEiJ.regRn[ea] = XEiJ.MPU_BITREV_TABLE_0[x & 2047] | XEiJ.MPU_BITREV_TABLE_1[x << 10 >>> 21] | XEiJ.MPU_BITREV_TABLE_2[x >>> 22]; 4315: } 4316: } else { //CMP2/CHK2.B <ea>,Rn 4317: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4318: XEiJ.mpuCycleCount += 34; 4319: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4320: throw M68kException.m6eSignal; 4321: } 4322: } //irpCmp2Chk2Byte 4323: 4324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4325: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4326: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4327: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4328: //BTST.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_100_000_rrr 4329: //MOVEP.W (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_100_001_rrr-{data} 4330: //BTST.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZPI|0000_qqq_100_mmm_rrr 4331: public static void irpBtstReg () throws M68kException { 4332: int ea = XEiJ.regOC & 63; 4333: int qqq = XEiJ.regOC >> 9; //qqq 4334: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.W (d16,Ar),Dq 4335: XEiJ.mpuCycleCount += 16; 4336: int a; 4337: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4338: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4339: } else { 4340: a = XEiJ.regPC; 4341: XEiJ.regPC = a + 2; 4342: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4343: } 4344: XEiJ.regRn[qqq] = ~0xffff & XEiJ.regRn[qqq] | XEiJ.busRbz (a) << 8 | XEiJ.busRbz (a + 2); //Javaは評価順序が保証されている 4345: } else { //BTST.L Dq,Dr/<ea> 4346: int y = XEiJ.regRn[qqq]; 4347: if (ea < XEiJ.EA_AR) { //BTST.L Dq,Dr 4348: XEiJ.mpuCycleCount += 6; 4349: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.regRn[ea] >>> y & 1) << 2; //ccr_btst。intのシフトは5bitでマスクされるので&31を省略 4350: } else { //BTST.B Dq,<ea> 4351: XEiJ.mpuCycleCount += 4; 4352: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.busRbs (efaAnyByte (ea)) >>> (y & 7) & 1) << 2; //ccr_btst 4353: } 4354: } 4355: } //irpBtstReg 4356: 4357: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4358: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4359: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4360: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4361: //BCHG.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_101_000_rrr 4362: //MOVEP.L (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_101_001_rrr-{data} 4363: //BCHG.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_101_mmm_rrr 4364: public static void irpBchgReg () throws M68kException { 4365: int ea = XEiJ.regOC & 63; 4366: int qqq = XEiJ.regOC >> 9; //qqq 4367: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.L (d16,Ar),Dq 4368: XEiJ.mpuCycleCount += 24; 4369: int a; 4370: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4371: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4372: } else { 4373: a = XEiJ.regPC; 4374: XEiJ.regPC = a + 2; 4375: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4376: } 4377: XEiJ.regRn[qqq] = XEiJ.busRbs (a) << 24 | XEiJ.busRbz (a + 2) << 16 | XEiJ.busRbz (a + 4) << 8 | XEiJ.busRbz (a + 6); //Javaは評価順序が保証されている 4378: } else { //BCHG.L Dq,Dr/<ea> 4379: int x; 4380: int y = XEiJ.regRn[qqq]; 4381: if (ea < XEiJ.EA_AR) { //BCHG.L Dq,Dr 4382: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4383: XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8; //(0xffff&y)!=0 4384: } else { //BCHG.B Dq,<ea> 4385: XEiJ.mpuCycleCount += 8; 4386: int a = efaMltByte (ea); 4387: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7))); 4388: } 4389: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4390: } 4391: } //irpBchgReg 4392: 4393: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4394: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4395: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4396: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4397: //BCLR.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_110_000_rrr 4398: //MOVEP.W Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_110_001_rrr-{data} 4399: //BCLR.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_110_mmm_rrr 4400: public static void irpBclrReg () throws M68kException { 4401: int ea = XEiJ.regOC & 63; 4402: int y = XEiJ.regRn[XEiJ.regOC >> 9]; //qqq 4403: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.W Dq,(d16,Ar) 4404: XEiJ.mpuCycleCount += 16; 4405: int a; 4406: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4407: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4408: } else { 4409: a = XEiJ.regPC; 4410: XEiJ.regPC = a + 2; 4411: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4412: } 4413: XEiJ.busWb (a, y >> 8); 4414: XEiJ.busWb (a + 2, y); 4415: } else { //BCLR.L Dq,Dr/<ea> 4416: int x; 4417: if (ea < XEiJ.EA_AR) { //BCLR.L Dq,Dr 4418: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4419: XEiJ.mpuCycleCount += (char) y != 0 ? 8 : 10; //(0xffff&y)!=0 4420: } else { //BCLR.B Dq,<ea> 4421: XEiJ.mpuCycleCount += 8; 4422: int a = efaMltByte (ea); 4423: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7))); 4424: } 4425: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4426: } 4427: } //irpBclrReg 4428: 4429: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4430: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4431: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4432: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4433: //BSET.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_111_000_rrr 4434: //MOVEP.L Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_111_001_rrr-{data} 4435: //BSET.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_111_mmm_rrr 4436: public static void irpBsetReg () throws M68kException { 4437: int ea = XEiJ.regOC & 63; 4438: int y = XEiJ.regRn[XEiJ.regOC >> 9]; //qqq 4439: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.L Dq,(d16,Ar) 4440: XEiJ.mpuCycleCount += 24; 4441: int a; 4442: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4443: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4444: } else { 4445: a = XEiJ.regPC; 4446: XEiJ.regPC = a + 2; 4447: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4448: } 4449: XEiJ.busWb (a, y >> 24); 4450: XEiJ.busWb (a + 2, y >> 16); 4451: XEiJ.busWb (a + 4, y >> 8); 4452: XEiJ.busWb (a + 6, y); 4453: } else { //BSET.L Dq,Dr/<ea> 4454: int x; 4455: if (ea < XEiJ.EA_AR) { //BSET.L Dq,Dr 4456: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4457: XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8; //(0xffff&y)!=0 4458: } else { //BSET.B Dq,<ea> 4459: XEiJ.mpuCycleCount += 8; 4460: int a = efaMltByte (ea); 4461: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7))); 4462: } 4463: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4464: } 4465: } //irpBsetReg 4466: 4467: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4468: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4469: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4470: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4471: //ANDI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_000_mmm_rrr-{data} 4472: //AND.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_000_mmm_rrr-{data} [ANDI.B #<data>,<ea>] 4473: //ANDI.B #<data>,CCR |-|012346|-|*****|*****| |0000_001_000_111_100-{data} 4474: public static void irpAndiByte () throws M68kException { 4475: int ea = XEiJ.regOC & 63; 4476: int z; 4477: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4478: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4479: } else { 4480: z = XEiJ.regPC; 4481: XEiJ.regPC = z + 2; 4482: z = XEiJ.busRbs (z + 1); //pcbs 4483: } 4484: if (ea < XEiJ.EA_AR) { //ANDI.B #<data>,Dr 4485: XEiJ.mpuCycleCount += 8; 4486: z = XEiJ.regRn[ea] &= ~255 | z; //1拡張してからAND 4487: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4488: } else if (ea == XEiJ.EA_IM) { //ANDI.B #<data>,CCR 4489: XEiJ.mpuCycleCount += 20; 4490: XEiJ.regCCR &= z; 4491: } else { //ANDI.B #<data>,<mem> 4492: XEiJ.mpuCycleCount += 12; 4493: int a = efaMltByte (ea); 4494: XEiJ.busWb (a, z &= XEiJ.busRbs (a)); 4495: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4496: } 4497: } //irpAndiByte 4498: 4499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4500: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4501: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4502: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4503: //ANDI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_001_mmm_rrr-{data} 4504: //AND.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_001_mmm_rrr-{data} [ANDI.W #<data>,<ea>] 4505: //ANDI.W #<data>,SR |-|012346|P|*****|*****| |0000_001_001_111_100-{data} 4506: public static void irpAndiWord () throws M68kException { 4507: int ea = XEiJ.regOC & 63; 4508: if (ea < XEiJ.EA_AR) { //ANDI.W #<data>,Dr 4509: int z; 4510: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4511: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4512: } else { 4513: z = XEiJ.regPC; 4514: XEiJ.regPC = z + 2; 4515: z = XEiJ.busRwse (z); //pcws 4516: } 4517: XEiJ.mpuCycleCount += 8; 4518: z = XEiJ.regRn[ea] &= ~65535 | z; //1拡張してからAND 4519: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4520: } else if (ea == XEiJ.EA_IM) { //ANDI.W #<data>,SR 4521: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4522: XEiJ.mpuCycleCount += 34; 4523: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4524: throw M68kException.m6eSignal; 4525: } 4526: //以下はスーパーバイザモード 4527: XEiJ.mpuCycleCount += 20; 4528: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4529: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4530: } else { 4531: int t = XEiJ.regPC; 4532: XEiJ.regPC = t + 2; 4533: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4534: } 4535: } else { //ANDI.W #<data>,<mem> 4536: int z; 4537: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4538: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4539: } else { 4540: z = XEiJ.regPC; 4541: XEiJ.regPC = z + 2; 4542: z = XEiJ.busRwse (z); //pcws 4543: } 4544: XEiJ.mpuCycleCount += 12; 4545: int a = efaMltWord (ea); 4546: XEiJ.busWw (a, z &= XEiJ.busRws (a)); 4547: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4548: } 4549: } //irpAndiWord 4550: 4551: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4552: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4553: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4554: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4555: //ANDI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_010_mmm_rrr-{data} 4556: //AND.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_010_mmm_rrr-{data} [ANDI.L #<data>,<ea>] 4557: public static void irpAndiLong () throws M68kException { 4558: int ea = XEiJ.regOC & 63; 4559: int y; 4560: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4561: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4562: } else { 4563: y = XEiJ.regPC; 4564: XEiJ.regPC = y + 4; 4565: y = XEiJ.busRlse (y); //pcls 4566: } 4567: int z; 4568: if (ea < XEiJ.EA_AR) { //ANDI.L #<data>,Dr 4569: XEiJ.mpuCycleCount += 16; 4570: z = XEiJ.regRn[ea] &= y; 4571: } else { //ANDI.L #<data>,<mem> 4572: XEiJ.mpuCycleCount += 20; 4573: int a = efaMltLong (ea); 4574: XEiJ.busWl (a, z = XEiJ.busRls (a) & y); 4575: } 4576: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 4577: } //irpAndiLong 4578: 4579: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4580: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4581: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4582: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4583: //BYTEREV.L Dr |-|------|-|-----|-----|D |0000_001_011_000_rrr (ISA_C) 4584: // 4585: //BYTEREV.L Dr 4586: // Drのバイトの並びを逆順にする。CCRは変化しない 4587: public static void irpCmp2Chk2Word () throws M68kException { 4588: int ea = XEiJ.regOC & 63; 4589: if (ea < XEiJ.EA_AR) { //BYTEREV.L Dr 4590: XEiJ.mpuCycleCount += 4; 4591: if (true) { //0.10ns-0.18ns 0x782750ec 4592: XEiJ.regRn[ea] = Integer.reverseBytes (XEiJ.regRn[ea]); 4593: } else { //1.06ns 0x782750ec 4594: int x = XEiJ.regRn[ea]; 4595: XEiJ.regRn[ea] = x << 24 | x << 8 & 0x00ff0000 | x >>> 8 & 0x0000ff00 | x >>> 24; 4596: } 4597: } else { //CMP2/CHK2.W <ea>,Rn 4598: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4599: XEiJ.mpuCycleCount += 34; 4600: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4601: throw M68kException.m6eSignal; 4602: } 4603: } //irpCmp2Chk2Word 4604: 4605: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4606: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4607: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4608: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4609: //SUBI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_000_mmm_rrr-{data} 4610: //SUB.B #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_000_mmm_rrr-{data} [SUBI.B #<data>,<ea>] 4611: public static void irpSubiByte () throws M68kException { 4612: int ea = XEiJ.regOC & 63; 4613: int x; 4614: int y; 4615: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4616: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4617: } else { 4618: y = XEiJ.regPC; 4619: XEiJ.regPC = y + 2; 4620: y = XEiJ.busRbs (y + 1); //pcbs 4621: } 4622: int z; 4623: if (ea < XEiJ.EA_AR) { //SUBI.B #<data>,Dr 4624: XEiJ.mpuCycleCount += 8; 4625: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y); 4626: } else { //SUBI.B #<data>,<mem> 4627: XEiJ.mpuCycleCount += 12; 4628: int a = efaMltByte (ea); 4629: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y)); 4630: } 4631: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4632: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4633: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4634: } //irpSubiByte 4635: 4636: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4637: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4638: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4639: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4640: //SUBI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_001_mmm_rrr-{data} 4641: //SUB.W #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_001_mmm_rrr-{data} [SUBI.W #<data>,<ea>] 4642: public static void irpSubiWord () throws M68kException { 4643: int ea = XEiJ.regOC & 63; 4644: int x; 4645: int y; 4646: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4647: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4648: } else { 4649: y = XEiJ.regPC; 4650: XEiJ.regPC = y + 2; 4651: y = XEiJ.busRwse (y); //pcws 4652: } 4653: int z; 4654: if (ea < XEiJ.EA_AR) { //SUBI.W #<data>,Dr 4655: XEiJ.mpuCycleCount += 8; 4656: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y)); 4657: } else { //SUBI.W #<data>,<mem> 4658: XEiJ.mpuCycleCount += 12; 4659: int a = efaMltWord (ea); 4660: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y)); 4661: } 4662: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4663: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4664: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4665: } //irpSubiWord 4666: 4667: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4668: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4669: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4670: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4671: //SUBI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_010_mmm_rrr-{data} 4672: //SUB.L #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_010_mmm_rrr-{data} [SUBI.L #<data>,<ea>] 4673: public static void irpSubiLong () throws M68kException { 4674: int ea = XEiJ.regOC & 63; 4675: int x; 4676: int y; 4677: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4678: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4679: } else { 4680: y = XEiJ.regPC; 4681: XEiJ.regPC = y + 4; 4682: y = XEiJ.busRlse (y); //pcls 4683: } 4684: int z; 4685: if (ea < XEiJ.EA_AR) { //SUBI.L #<data>,Dr 4686: XEiJ.mpuCycleCount += 16; 4687: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y; 4688: } else { //SUBI.L #<data>,<mem> 4689: XEiJ.mpuCycleCount += 20; 4690: int a = efaMltLong (ea); 4691: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y); 4692: } 4693: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4694: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4695: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4696: } //irpSubiLong 4697: 4698: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4699: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4700: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4702: //FF1.L Dr |-|------|-|-UUUU|-**00|D |0000_010_011_000_rrr (ISA_C) 4703: // 4704: //FF1.L Dr 4705: // Drの最上位の1のbit31からのオフセットをDrに格納する 4706: // Drが0のときは32になる 4707: public static void irpCmp2Chk2Long () throws M68kException { 4708: int ea = XEiJ.regOC & 63; 4709: if (ea < XEiJ.EA_AR) { //FF1.L Dr 4710: XEiJ.mpuCycleCount += 4; 4711: int z = XEiJ.regRn[ea]; 4712: if (true) { 4713: XEiJ.regRn[ea] = Integer.numberOfLeadingZeros (z); 4714: } else { 4715: if (z == 0) { 4716: XEiJ.regRn[ea] = 32; 4717: } else { 4718: int k = -(z >>> 16) >> 16 & 16; 4719: k += -(z >>> k + 8) >> 8 & 8; 4720: k += -(z >>> k + 4) >> 4 & 4; 4721: // bit3 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4722: // bit2 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 4723: // bit1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 4724: // bit0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 4725: XEiJ.regRn[ea] = ((0b11_11_11_11_11_11_11_11_10_10_10_10_01_01_00_00 >>> (z >>> k << 1)) & 3) + k; //intのシフトカウントは下位5bitだけが使用される 4726: } 4727: } 4728: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 4729: } else { //CMP2/CHK2.L <ea>,Rn 4730: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4731: XEiJ.mpuCycleCount += 34; 4732: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4733: throw M68kException.m6eSignal; 4734: } 4735: } //irpCmp2Chk2Long 4736: 4737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4738: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4739: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4740: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4741: //ADDI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_000_mmm_rrr-{data} 4742: public static void irpAddiByte () throws M68kException { 4743: int ea = XEiJ.regOC & 63; 4744: int x; 4745: int y; 4746: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4747: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4748: } else { 4749: y = XEiJ.regPC; 4750: XEiJ.regPC = y + 2; 4751: y = XEiJ.busRbs (y + 1); //pcbs 4752: } 4753: int z; 4754: if (ea < XEiJ.EA_AR) { //ADDI.B #<data>,Dr 4755: XEiJ.mpuCycleCount += 8; 4756: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y); 4757: } else { //ADDI.B #<data>,<mem> 4758: XEiJ.mpuCycleCount += 12; 4759: int a = efaMltByte (ea); 4760: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y)); 4761: } 4762: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4763: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4764: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4765: } //irpAddiByte 4766: 4767: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4768: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4769: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4770: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4771: //ADDI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_001_mmm_rrr-{data} 4772: public static void irpAddiWord () throws M68kException { 4773: int ea = XEiJ.regOC & 63; 4774: int x; 4775: int y; 4776: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4777: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4778: } else { 4779: y = XEiJ.regPC; 4780: XEiJ.regPC = y + 2; 4781: y = XEiJ.busRwse (y); //pcws 4782: } 4783: int z; 4784: if (ea < XEiJ.EA_AR) { //ADDI.W #<data>,Dr 4785: XEiJ.mpuCycleCount += 8; 4786: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y)); 4787: } else { //ADDI.W #<data>,<mem> 4788: XEiJ.mpuCycleCount += 12; 4789: int a = efaMltWord (ea); 4790: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y)); 4791: } 4792: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4793: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4794: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4795: } //irpAddiWord 4796: 4797: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4798: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4799: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4800: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4801: //ADDI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_010_mmm_rrr-{data} 4802: public static void irpAddiLong () throws M68kException { 4803: int ea = XEiJ.regOC & 63; 4804: int x; 4805: int y; 4806: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4807: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4808: } else { 4809: y = XEiJ.regPC; 4810: XEiJ.regPC = y + 4; 4811: y = XEiJ.busRlse (y); //pcls 4812: } 4813: int z; 4814: if (ea < XEiJ.EA_AR) { //ADDI.L #<data>,Dr 4815: XEiJ.mpuCycleCount += 16; 4816: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y; 4817: } else { //ADDI.L #<data>,<mem> 4818: XEiJ.mpuCycleCount += 20; 4819: int a = efaMltLong (ea); 4820: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y); 4821: } 4822: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4823: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4824: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4825: } //irpAddiLong 4826: 4827: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4828: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4829: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4830: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4831: //BTST.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_000_000_rrr-{data} 4832: //BTST.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZP |0000_100_000_mmm_rrr-{data} 4833: public static void irpBtstImm () throws M68kException { 4834: int ea = XEiJ.regOC & 63; 4835: int y; 4836: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4837: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4838: } else { 4839: y = XEiJ.regPC; 4840: XEiJ.regPC = y + 2; 4841: y = XEiJ.busRbs (y + 1); //pcbs 4842: } 4843: if (ea < XEiJ.EA_AR) { //BTST.L #<data>,Dr 4844: XEiJ.mpuCycleCount += 10; 4845: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.regRn[ea] >>> y & 1) << 2; //ccr_btst。intのシフトは5bitでマスクされるので&31を省略 4846: } else { //BTST.B #<data>,<ea> 4847: XEiJ.mpuCycleCount += 8; 4848: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.busRbs (efaMemByte (ea)) >>> (y & 7) & 1) << 2; //ccr_btst 4849: } 4850: } //irpBtstImm 4851: 4852: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4853: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4854: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4855: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4856: //BCHG.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_001_000_rrr-{data} 4857: //BCHG.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_001_mmm_rrr-{data} 4858: public static void irpBchgImm () throws M68kException { 4859: int ea = XEiJ.regOC & 63; 4860: int x; 4861: int y; 4862: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4863: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4864: } else { 4865: y = XEiJ.regPC; 4866: XEiJ.regPC = y + 2; 4867: y = XEiJ.busRbs (y + 1); //pcbs 4868: } 4869: if (ea < XEiJ.EA_AR) { //BCHG.L #<data>,Dr 4870: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4871: XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12; //(0xffff&y)!=0 4872: } else { //BCHG.B #<data>,<ea> 4873: XEiJ.mpuCycleCount += 12; 4874: int a = efaMltByte (ea); 4875: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7))); 4876: } 4877: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4878: } //irpBchgImm 4879: 4880: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4881: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4882: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4883: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4884: //BCLR.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_010_000_rrr-{data} 4885: //BCLR.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_010_mmm_rrr-{data} 4886: public static void irpBclrImm () throws M68kException { 4887: int ea = XEiJ.regOC & 63; 4888: int x; 4889: int y; 4890: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4891: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4892: } else { 4893: y = XEiJ.regPC; 4894: XEiJ.regPC = y + 2; 4895: y = XEiJ.busRbs (y + 1); //pcbs 4896: } 4897: if (ea < XEiJ.EA_AR) { //BCLR.L #<data>,Dr 4898: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4899: XEiJ.mpuCycleCount += (char) y != 0 ? 12 : 14; //(0xffff&y)!=0 4900: } else { //BCLR.B #<data>,<ea> 4901: XEiJ.mpuCycleCount += 12; 4902: int a = efaMltByte (ea); 4903: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7))); 4904: } 4905: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4906: } //irpBclrImm 4907: 4908: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4909: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4910: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4911: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4912: //BSET.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_011_000_rrr-{data} 4913: //BSET.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_011_mmm_rrr-{data} 4914: public static void irpBsetImm () throws M68kException { 4915: int ea = XEiJ.regOC & 63; 4916: int x; 4917: int y; 4918: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4919: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4920: } else { 4921: y = XEiJ.regPC; 4922: XEiJ.regPC = y + 2; 4923: y = XEiJ.busRbs (y + 1); //pcbs 4924: } 4925: if (ea < XEiJ.EA_AR) { //BSET.L #<data>,Dr 4926: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4927: XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12; //(0xffff&y)!=0 4928: } else { //BSET.B #<data>,<ea> 4929: XEiJ.mpuCycleCount += 12; 4930: int a = efaMltByte (ea); 4931: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7))); 4932: } 4933: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4934: } //irpBsetImm 4935: 4936: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4937: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4938: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4939: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4940: //EORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} 4941: //EOR.B #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} [EORI.B #<data>,<ea>] 4942: //EORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_101_000_111_100-{data} 4943: public static void irpEoriByte () throws M68kException { 4944: int ea = XEiJ.regOC & 63; 4945: int z; 4946: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4947: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4948: } else { 4949: z = XEiJ.regPC; 4950: XEiJ.regPC = z + 2; 4951: z = XEiJ.busRbs (z + 1); //pcbs 4952: } 4953: if (ea < XEiJ.EA_AR) { //EORI.B #<data>,Dr 4954: XEiJ.mpuCycleCount += 8; 4955: z = XEiJ.regRn[ea] ^= 255 & z; //0拡張してからEOR 4956: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4957: } else if (ea == XEiJ.EA_IM) { //EORI.B #<data>,CCR 4958: XEiJ.mpuCycleCount += 20; 4959: XEiJ.regCCR ^= XEiJ.REG_CCR_MASK & z; 4960: } else { //EORI.B #<data>,<mem> 4961: XEiJ.mpuCycleCount += 12; 4962: int a = efaMltByte (ea); 4963: XEiJ.busWb (a, z ^= XEiJ.busRbs (a)); 4964: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4965: } 4966: } //irpEoriByte 4967: 4968: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4969: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4970: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4971: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4972: //EORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} 4973: //EOR.W #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} [EORI.W #<data>,<ea>] 4974: //EORI.W #<data>,SR |-|012346|P|*****|*****| |0000_101_001_111_100-{data} 4975: public static void irpEoriWord () throws M68kException { 4976: int ea = XEiJ.regOC & 63; 4977: if (ea < XEiJ.EA_AR) { //EORI.W #<data>,Dr 4978: int z; 4979: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4980: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4981: } else { 4982: z = XEiJ.regPC; 4983: XEiJ.regPC = z + 2; 4984: z = XEiJ.busRwse (z); //pcws 4985: } 4986: XEiJ.mpuCycleCount += 8; 4987: z = XEiJ.regRn[ea] ^= (char) z; //0拡張してからEOR 4988: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4989: } else if (ea == XEiJ.EA_IM) { //EORI.W #<data>,SR 4990: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4991: XEiJ.mpuCycleCount += 34; 4992: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4993: throw M68kException.m6eSignal; 4994: } 4995: //以下はスーパーバイザモード 4996: XEiJ.mpuCycleCount += 20; 4997: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4998: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4999: } else { 5000: int t = XEiJ.regPC; 5001: XEiJ.regPC = t + 2; 5002: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse (t)); //pcws。特権違反チェックが先 5003: } 5004: } else { //EORI.W #<data>,<mem> 5005: int z; 5006: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5007: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 5008: } else { 5009: z = XEiJ.regPC; 5010: XEiJ.regPC = z + 2; 5011: z = XEiJ.busRwse (z); //pcws 5012: } 5013: XEiJ.mpuCycleCount += 12; 5014: int a = efaMltWord (ea); 5015: XEiJ.busWw (a, z ^= XEiJ.busRws (a)); 5016: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5017: } 5018: } //irpEoriWord 5019: 5020: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5021: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5022: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5023: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5024: //EORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} 5025: //EOR.L #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} [EORI.L #<data>,<ea>] 5026: public static void irpEoriLong () throws M68kException { 5027: int ea = XEiJ.regOC & 63; 5028: int y; 5029: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5030: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 5031: } else { 5032: y = XEiJ.regPC; 5033: XEiJ.regPC = y + 4; 5034: y = XEiJ.busRlse (y); //pcls 5035: } 5036: int z; 5037: if (ea < XEiJ.EA_AR) { //EORI.L #<data>,Dr 5038: XEiJ.mpuCycleCount += 16; 5039: z = XEiJ.regRn[ea] ^= y; 5040: } else { //EORI.L #<data>,<mem> 5041: XEiJ.mpuCycleCount += 20; 5042: int a = efaMltLong (ea); 5043: XEiJ.busWl (a, z = XEiJ.busRls (a) ^ y); 5044: } 5045: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5046: } //irpEoriLong 5047: 5048: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5049: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5050: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5051: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5052: //CMPI.B #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_000_mmm_rrr-{data} 5053: //CMP.B #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_000_mmm_rrr-{data} [CMPI.B #<data>,<ea>] 5054: public static void irpCmpiByte () throws M68kException { 5055: XEiJ.mpuCycleCount += 8; 5056: int ea = XEiJ.regOC & 63; 5057: int x; 5058: int y; 5059: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5060: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 5061: } else { 5062: y = XEiJ.regPC; 5063: XEiJ.regPC = y + 2; 5064: y = XEiJ.busRbs (y + 1); //pcbs 5065: } 5066: int z = (byte) ((x = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea))) - y); //アドレッシングモードに注意 5067: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 5068: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5069: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 5070: } //irpCmpiByte 5071: 5072: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5073: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5074: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5075: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5076: //CMPI.W #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_001_mmm_rrr-{data} 5077: //CMP.W #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_001_mmm_rrr-{data} [CMPI.W #<data>,<ea>] 5078: public static void irpCmpiWord () throws M68kException { 5079: XEiJ.mpuCycleCount += 8; 5080: int ea = XEiJ.regOC & 63; 5081: int x; 5082: int y; 5083: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5084: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 5085: } else { 5086: y = XEiJ.regPC; 5087: XEiJ.regPC = y + 2; 5088: y = XEiJ.busRwse (y); //pcws 5089: } 5090: int z = (short) ((x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea))) - y); //アドレッシングモードに注意 5091: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 5092: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5093: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 5094: } //irpCmpiWord 5095: 5096: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5097: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5098: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5099: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5100: //CMPI.L #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_010_mmm_rrr-{data} 5101: //CMP.L #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_010_mmm_rrr-{data} [CMPI.L #<data>,<ea>] 5102: public static void irpCmpiLong () throws M68kException { 5103: int ea = XEiJ.regOC & 63; 5104: int x; 5105: int y; 5106: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5107: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 5108: } else { 5109: y = XEiJ.regPC; 5110: XEiJ.regPC = y + 4; 5111: y = XEiJ.busRlse (y); //pcls 5112: } 5113: int z; 5114: if (ea < XEiJ.EA_AR) { //CMPI.L #<data>,Dr 5115: XEiJ.mpuCycleCount += 14; 5116: z = (x = XEiJ.regRn[ea]) - y; 5117: } else { //CMPI.L #<data>,<mem> 5118: XEiJ.mpuCycleCount += 12; 5119: z = (x = XEiJ.busRls (efaMltLong (ea))) - y; //アドレッシングモードに注意 5120: } 5121: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 5122: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5123: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 5124: } //irpCmpiLong 5125: 5126: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5127: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5128: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5129: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5130: //MOVES.B <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn000000000000 5131: //MOVES.B Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn100000000000 5132: // 5133: //MOVES.B <ea>,Rn 5134: // MOVES.B <ea>,DnはDnの最下位バイトだけ更新する 5135: // MOVES.B <ea>,Anはバイトデータをロングに符号拡張してAnの全体を更新する 5136: // SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、 5137: // SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5138: // 5139: //MOVES.B Rn,<ea> 5140: // DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、 5141: // DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5142: public static void irpMovesByte () throws M68kException { 5143: int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz 5144: if (w << -11 != 0) { 5145: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 5146: throw M68kException.m6eSignal; 5147: } 5148: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5149: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5150: throw M68kException.m6eSignal; 5151: } 5152: //以下はスーパーバイザモード 5153: XEiJ.mpuCycleCount += 4; 5154: int a = efaMltByte (XEiJ.regOC & 63); 5155: int n = w >>> 12; //n 5156: if (w << 31 - 11 >= 0) { //MOVES.B <ea>,Rn。リード 5157: MemoryMappedDevice[] mm; 5158: if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) { //ユーザモード 5159: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5160: } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) { //スーパーバイザモード 5161: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5162: } else { //CPU空間などは不可 5163: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5164: M68kException.m6eAddress = a; 5165: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5166: M68kException.m6eSize = XEiJ.MPU_SS_BYTE; 5167: throw M68kException.m6eSignal; 5168: } 5169: if (n < 8) { //MOVES.B <ea>,Dn 5170: XEiJ.regRn[n] = XEiJ.regRn[n] & ~255 | mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbz (a); 5171: } else { //MOVES.B <ea>,An 5172: XEiJ.regRn[n] = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbs (a); 5173: } 5174: } else { //MOVES.B Rn,<ea>。ライト 5175: MemoryMappedDevice[] mm; 5176: if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) { //ユーザモード 5177: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5178: } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) { //スーパーバイザモード 5179: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5180: } else { //CPU空間などは不可 5181: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5182: M68kException.m6eAddress = a; 5183: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5184: M68kException.m6eSize = XEiJ.MPU_SS_BYTE; 5185: throw M68kException.m6eSignal; 5186: } 5187: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWb (a, XEiJ.regRn[n]); 5188: } 5189: } //irpMovesByte 5190: 5191: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5192: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5193: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5194: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5195: //MOVES.W <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn000000000000 5196: //MOVES.W Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn100000000000 5197: // 5198: //MOVES.W <ea>,Rn 5199: // MOVES.W <ea>,DnはDnの下位ワードだけ更新する 5200: // MOVES.W <ea>,Anはワードデータをロングに符号拡張してAnの全体を更新する 5201: // SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、 5202: // SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5203: // 5204: //MOVES.W Rn,<ea> 5205: // DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、 5206: // DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5207: public static void irpMovesWord () throws M68kException { 5208: int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz 5209: if (w << -11 != 0) { 5210: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 5211: throw M68kException.m6eSignal; 5212: } 5213: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5214: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5215: throw M68kException.m6eSignal; 5216: } 5217: //以下はスーパーバイザモード 5218: XEiJ.mpuCycleCount += 4; 5219: int a = efaMltWord (XEiJ.regOC & 63); 5220: int n = w >>> 12; //n 5221: if (w << 31 - 11 >= 0) { //MOVES.W <ea>,Rn。リード 5222: MemoryMappedDevice[] mm; 5223: if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) { //ユーザモード 5224: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5225: } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) { //スーパーバイザモード 5226: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5227: } else { //CPU空間などは不可 5228: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5229: M68kException.m6eAddress = a; 5230: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5231: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5232: throw M68kException.m6eSignal; 5233: } 5234: int z; 5235: if ((a & 1) == 0) { //偶数 5236: z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a); 5237: } else { //奇数 5238: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5239: M68kException.m6eAddress = a; 5240: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5241: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5242: throw M68kException.m6eSignal; 5243: } 5244: if (n < 8) { //MOVES.W <ea>,Dn 5245: XEiJ.regRn[n] = XEiJ.regRn[n] & ~65535 | z; 5246: } else { //MOVES.W <ea>,An 5247: XEiJ.regRn[n] = (short) z; 5248: } 5249: } else { //MOVES.W Rn,<ea>。ライト 5250: MemoryMappedDevice[] mm; 5251: if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) { //ユーザモード 5252: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5253: } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) { //スーパーバイザモード 5254: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5255: } else { //CPU空間などは不可 5256: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5257: M68kException.m6eAddress = a; 5258: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5259: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5260: throw M68kException.m6eSignal; 5261: } 5262: int z = XEiJ.regRn[n]; 5263: if ((a & 1) == 0) { //偶数 5264: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z); 5265: } else { //奇数 5266: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5267: M68kException.m6eAddress = a; 5268: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5269: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5270: throw M68kException.m6eSignal; 5271: } 5272: } 5273: } //irpMovesWord 5274: 5275: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5276: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5277: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5278: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5279: //MOVES.L <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn000000000000 5280: //MOVES.L Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn100000000000 5281: // 5282: //MOVES.L <ea>,Rn 5283: // SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、 5284: // SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5285: // 5286: //MOVES.L Rn,<ea> 5287: // DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、 5288: // DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5289: public static void irpMovesLong () throws M68kException { 5290: int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz 5291: if (w << -11 != 0) { 5292: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 5293: throw M68kException.m6eSignal; 5294: } 5295: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5296: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5297: throw M68kException.m6eSignal; 5298: } 5299: //以下はスーパーバイザモード 5300: XEiJ.mpuCycleCount += 4; 5301: int a = efaMltLong (XEiJ.regOC & 63); 5302: int n = w >>> 12; //n 5303: if (w << 31 - 11 >= 0) { //MOVES.L <ea>,Rn。リード 5304: MemoryMappedDevice[] mm; 5305: if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) { //ユーザモード 5306: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5307: } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) { //スーパーバイザモード 5308: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5309: } else { //CPU空間などは不可 5310: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5311: M68kException.m6eAddress = a; 5312: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5313: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5314: throw M68kException.m6eSignal; 5315: } 5316: int z; 5317: if ((a & 3) == 0) { //4の倍数 5318: z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRls (a); 5319: } else if ((a & 1) == 0) { //4の倍数+2 5320: z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRws (a) << 16; 5321: a += 2; 5322: z |= mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a); 5323: } else { //奇数 5324: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5325: M68kException.m6eAddress = a; 5326: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5327: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5328: throw M68kException.m6eSignal; 5329: } 5330: XEiJ.regRn[n] = z; 5331: } else { //MOVES.L Rn,<ea>。ライト 5332: MemoryMappedDevice[] mm; 5333: if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) { //ユーザモード 5334: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5335: } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) { //スーパーバイザモード 5336: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5337: } else { //CPU空間などは不可 5338: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5339: M68kException.m6eAddress = a; 5340: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5341: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5342: throw M68kException.m6eSignal; 5343: } 5344: int z = XEiJ.regRn[n]; 5345: if ((a & 3) == 0) { //4の倍数 5346: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWl (a, z); 5347: } else if ((a & 1) == 0) { //4の倍数+2 5348: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z >> 16); 5349: a += 2; 5350: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z); 5351: } else { //奇数 5352: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5353: M68kException.m6eAddress = a; 5354: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5355: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5356: throw M68kException.m6eSignal; 5357: } 5358: } 5359: } //irpMovesLong 5360: 5361: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5362: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5363: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5364: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5365: //MOVE.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr 5366: public static void irpMoveToDRByte () throws M68kException { 5367: XEiJ.mpuCycleCount += 4; 5368: int ea = XEiJ.regOC & 63; 5369: int qqq = XEiJ.regOC >> 9 & 7; 5370: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5371: XEiJ.regRn[qqq] = ~255 & XEiJ.regRn[qqq] | 255 & z; 5372: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5373: } //irpMoveToDRByte 5374: 5375: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5376: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5377: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5378: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5379: //MOVE.B <ea>,(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr 5380: public static void irpMoveToMMByte () throws M68kException { 5381: XEiJ.mpuCycleCount += 8; 5382: int ea = XEiJ.regOC & 63; 5383: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5384: XEiJ.busWb (XEiJ.regRn[XEiJ.regOC >> 9], z); //1qqq=aqq 5385: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5386: } //irpMoveToMMByte 5387: 5388: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5389: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5390: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5391: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5392: //MOVE.B <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr 5393: public static void irpMoveToMPByte () throws M68kException { 5394: XEiJ.mpuCycleCount += 8; 5395: int ea = XEiJ.regOC & 63; 5396: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5397: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5398: XEiJ.busWb (aqq < 15 ? XEiJ.regRn[aqq]++ : (XEiJ.regRn[15] += 2) - 2, z); 5399: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5400: } //irpMoveToMPByte 5401: 5402: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5403: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5404: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5405: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5406: //MOVE.B <ea>,-(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr 5407: public static void irpMoveToMNByte () throws M68kException { 5408: XEiJ.mpuCycleCount += 8; 5409: int ea = XEiJ.regOC & 63; 5410: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5411: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5412: XEiJ.busWb (aqq < 15 ? --XEiJ.regRn[aqq] : (XEiJ.regRn[15] -= 2), z); 5413: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5414: } //irpMoveToMNByte 5415: 5416: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5417: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5418: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5419: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5420: //MOVE.B <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr 5421: public static void irpMoveToMWByte () throws M68kException { 5422: XEiJ.mpuCycleCount += 12; 5423: int ea = XEiJ.regOC & 63; 5424: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5425: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5426: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5427: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5428: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5429: z); 5430: } else { 5431: int t = XEiJ.regPC; 5432: XEiJ.regPC = t + 2; 5433: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5434: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5435: z); 5436: } 5437: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5438: } //irpMoveToMWByte 5439: 5440: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5441: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5442: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5443: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5444: //MOVE.B <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr 5445: public static void irpMoveToMXByte () throws M68kException { 5446: XEiJ.mpuCycleCount += 14; 5447: int ea = XEiJ.regOC & 63; 5448: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5449: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5450: int w; 5451: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5452: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5453: } else { 5454: w = XEiJ.regPC; 5455: XEiJ.regPC = w + 2; 5456: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5457: } 5458: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5459: + (byte) w //バイトディスプレースメント 5460: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5461: XEiJ.regRn[w >> 12]), //ロングインデックス 5462: z); 5463: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5464: } //irpMoveToMXByte 5465: 5466: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5467: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5468: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5469: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5470: //MOVE.B <ea>,(xxx).W |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr 5471: public static void irpMoveToZWByte () throws M68kException { 5472: XEiJ.mpuCycleCount += 12; 5473: int ea = XEiJ.regOC & 63; 5474: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5475: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5476: XEiJ.busWb (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5477: z); 5478: } else { 5479: int t = XEiJ.regPC; 5480: XEiJ.regPC = t + 2; 5481: XEiJ.busWb (XEiJ.busRwse (t), //pcws 5482: z); 5483: } 5484: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5485: } //irpMoveToZWByte 5486: 5487: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5488: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5489: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5491: //MOVE.B <ea>,(xxx).L |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr 5492: public static void irpMoveToZLByte () throws M68kException { 5493: XEiJ.mpuCycleCount += 16; 5494: int ea = XEiJ.regOC & 63; 5495: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5496: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5497: XEiJ.busWb (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5498: z); 5499: } else { 5500: int t = XEiJ.regPC; 5501: XEiJ.regPC = t + 4; 5502: XEiJ.busWb (XEiJ.busRlse (t), //pcls 5503: z); 5504: } 5505: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5506: } //irpMoveToZLByte 5507: 5508: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5509: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5510: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5511: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5512: //MOVE.L <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr 5513: public static void irpMoveToDRLong () throws M68kException { 5514: XEiJ.mpuCycleCount += 4; 5515: int ea = XEiJ.regOC & 63; 5516: int z; 5517: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5518: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5519: } //irpMoveToDRLong 5520: 5521: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5522: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5523: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5524: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5525: //MOVEA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr 5526: //MOVE.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq] 5527: public static void irpMoveaLong () throws M68kException { 5528: XEiJ.mpuCycleCount += 4; 5529: int ea = XEiJ.regOC & 63; 5530: XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意 5531: } //irpMoveaLong 5532: 5533: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5534: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5535: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5536: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5537: //MOVE.L <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr 5538: public static void irpMoveToMMLong () throws M68kException { 5539: XEiJ.mpuCycleCount += 12; 5540: int ea = XEiJ.regOC & 63; 5541: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5542: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)], z); 5543: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5544: } //irpMoveToMMLong 5545: 5546: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5547: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5548: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5549: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5550: //MOVE.L <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr 5551: public static void irpMoveToMPLong () throws M68kException { 5552: XEiJ.mpuCycleCount += 12; 5553: int ea = XEiJ.regOC & 63; 5554: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5555: XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] += 4) - 4, z); 5556: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5557: } //irpMoveToMPLong 5558: 5559: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5560: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5561: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5562: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5563: //MOVE.L <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr 5564: public static void irpMoveToMNLong () throws M68kException { 5565: XEiJ.mpuCycleCount += 12; 5566: int ea = XEiJ.regOC & 63; 5567: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5568: XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] -= 4), z); 5569: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5570: } //irpMoveToMNLong 5571: 5572: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5573: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5574: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5575: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5576: //MOVE.L <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr 5577: public static void irpMoveToMWLong () throws M68kException { 5578: XEiJ.mpuCycleCount += 16; 5579: int ea = XEiJ.regOC & 63; 5580: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5581: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5582: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] //ベースレジスタ 5583: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5584: z); 5585: } else { 5586: int t = XEiJ.regPC; 5587: XEiJ.regPC = t + 2; 5588: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] //ベースレジスタ 5589: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5590: z); 5591: } 5592: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5593: } //irpMoveToMWLong 5594: 5595: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5596: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5597: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5598: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5599: //MOVE.L <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr 5600: public static void irpMoveToMXLong () throws M68kException { 5601: XEiJ.mpuCycleCount += 18; 5602: int ea = XEiJ.regOC & 63; 5603: int aqq = (XEiJ.regOC >> 9) - (16 - 8); 5604: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5605: int w; 5606: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5607: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5608: } else { 5609: w = XEiJ.regPC; 5610: XEiJ.regPC = w + 2; 5611: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5612: } 5613: XEiJ.busWl (XEiJ.regRn[aqq] //ベースレジスタ 5614: + (byte) w //バイトディスプレースメント 5615: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5616: XEiJ.regRn[w >> 12]), //ロングインデックス 5617: z); 5618: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5619: } //irpMoveToMXLong 5620: 5621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5622: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5623: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5624: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5625: //MOVE.L <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr 5626: public static void irpMoveToZWLong () throws M68kException { 5627: XEiJ.mpuCycleCount += 16; 5628: int ea = XEiJ.regOC & 63; 5629: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5630: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5631: XEiJ.busWl (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5632: z); 5633: } else { 5634: int t = XEiJ.regPC; 5635: XEiJ.regPC = t + 2; 5636: XEiJ.busWl (XEiJ.busRwse (t), //pcws 5637: z); 5638: } 5639: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5640: } //irpMoveToZWLong 5641: 5642: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5643: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5644: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5645: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5646: //MOVE.L <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr 5647: public static void irpMoveToZLLong () throws M68kException { 5648: XEiJ.mpuCycleCount += 20; 5649: int ea = XEiJ.regOC & 63; 5650: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5651: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5652: XEiJ.busWl (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5653: z); 5654: } else { 5655: int t = XEiJ.regPC; 5656: XEiJ.regPC = t + 4; 5657: XEiJ.busWl (XEiJ.busRlse (t), //pcls 5658: z); 5659: } 5660: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5661: } //irpMoveToZLLong 5662: 5663: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5664: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5665: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5666: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5667: //MOVE.W <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr 5668: public static void irpMoveToDRWord () throws M68kException { 5669: XEiJ.mpuCycleCount += 4; 5670: int ea = XEiJ.regOC & 63; 5671: int qqq = XEiJ.regOC >> 9 & 7; 5672: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5673: XEiJ.regRn[qqq] = ~65535 & XEiJ.regRn[qqq] | (char) z; 5674: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5675: } //irpMoveToDRWord 5676: 5677: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5678: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5679: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5680: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5681: //MOVEA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr 5682: //MOVE.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq] 5683: // 5684: //MOVEA.W <ea>,Aq 5685: // ワードデータをロングに符号拡張してAqの全体を更新する 5686: public static void irpMoveaWord () throws M68kException { 5687: XEiJ.mpuCycleCount += 4; 5688: int ea = XEiJ.regOC & 63; 5689: XEiJ.regRn[XEiJ.regOC >> 9 & 15] = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //符号拡張して32bit全部書き換える。このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意 5690: } //irpMoveaWord 5691: 5692: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5693: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5694: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5695: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5696: //MOVE.W <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr 5697: public static void irpMoveToMMWord () throws M68kException { 5698: XEiJ.mpuCycleCount += 8; 5699: int ea = XEiJ.regOC & 63; 5700: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5701: XEiJ.busWw (XEiJ.regRn[XEiJ.regOC >> 9 & 15], z); 5702: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5703: } //irpMoveToMMWord 5704: 5705: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5706: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5707: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5708: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5709: //MOVE.W <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr 5710: public static void irpMoveToMPWord () throws M68kException { 5711: XEiJ.mpuCycleCount += 8; 5712: int ea = XEiJ.regOC & 63; 5713: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5714: XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2, z); 5715: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5716: } //irpMoveToMPWord 5717: 5718: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5719: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5720: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5721: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5722: //MOVE.W <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr 5723: public static void irpMoveToMNWord () throws M68kException { 5724: XEiJ.mpuCycleCount += 8; 5725: int ea = XEiJ.regOC & 63; 5726: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5727: XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2), z); 5728: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5729: } //irpMoveToMNWord 5730: 5731: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5732: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5733: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5734: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5735: //MOVE.W <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr 5736: public static void irpMoveToMWWord () throws M68kException { 5737: XEiJ.mpuCycleCount += 12; 5738: int ea = XEiJ.regOC & 63; 5739: int aqq = XEiJ.regOC >> 9 & 15; 5740: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5741: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5742: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5743: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5744: z); 5745: } else { 5746: int t = XEiJ.regPC; 5747: XEiJ.regPC = t + 2; 5748: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5749: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5750: z); 5751: } 5752: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5753: } //irpMoveToMWWord 5754: 5755: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5756: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5757: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5758: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5759: //MOVE.W <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr 5760: public static void irpMoveToMXWord () throws M68kException { 5761: XEiJ.mpuCycleCount += 14; 5762: int ea = XEiJ.regOC & 63; 5763: int aqq = XEiJ.regOC >> 9 & 15; 5764: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5765: int w; 5766: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5767: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5768: } else { 5769: w = XEiJ.regPC; 5770: XEiJ.regPC = w + 2; 5771: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5772: } 5773: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5774: + (byte) w //バイトディスプレースメント 5775: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5776: XEiJ.regRn[w >> 12]), //ロングインデックス 5777: z); 5778: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5779: } //irpMoveToMXWord 5780: 5781: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5782: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5783: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5784: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5785: //MOVE.W <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr 5786: public static void irpMoveToZWWord () throws M68kException { 5787: XEiJ.mpuCycleCount += 12; 5788: int ea = XEiJ.regOC & 63; 5789: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5790: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5791: XEiJ.busWw (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5792: z); 5793: } else { 5794: int t = XEiJ.regPC; 5795: XEiJ.regPC = t + 2; 5796: XEiJ.busWw (XEiJ.busRwse (t), //pcws 5797: z); 5798: } 5799: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5800: } //irpMoveToZWWord 5801: 5802: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5803: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5804: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5805: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5806: //MOVE.W <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr 5807: public static void irpMoveToZLWord () throws M68kException { 5808: XEiJ.mpuCycleCount += 16; 5809: int ea = XEiJ.regOC & 63; 5810: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5811: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5812: XEiJ.busWw (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5813: z); 5814: } else { 5815: int t = XEiJ.regPC; 5816: XEiJ.regPC = t + 4; 5817: XEiJ.busWw (XEiJ.busRlse (t), //pcls 5818: z); 5819: } 5820: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5821: } //irpMoveToZLWord 5822: 5823: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5824: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5825: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5826: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5827: //NEGX.B <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_000_mmm_rrr 5828: public static void irpNegxByte () throws M68kException { 5829: int ea = XEiJ.regOC & 63; 5830: int y; 5831: int z; 5832: if (ea < XEiJ.EA_AR) { //NEGX.B Dr 5833: XEiJ.mpuCycleCount += 4; 5834: z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y) - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 5835: } else { //NEGX.B <mem> 5836: XEiJ.mpuCycleCount += 8; 5837: int a = efaMltByte (ea); 5838: XEiJ.busWb (a, z = (byte) (-(y = XEiJ.busRbs (a)) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5839: } 5840: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5841: (y & z) >>> 31 << 1 | 5842: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5843: } //irpNegxByte 5844: 5845: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5846: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5847: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5848: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5849: //NEGX.W <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_001_mmm_rrr 5850: public static void irpNegxWord () throws M68kException { 5851: int ea = XEiJ.regOC & 63; 5852: int y; 5853: int z; 5854: if (ea < XEiJ.EA_AR) { //NEGX.W Dr 5855: XEiJ.mpuCycleCount += 4; 5856: z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) (-(y = (short) y) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5857: } else { //NEGX.W <mem> 5858: XEiJ.mpuCycleCount += 8; 5859: int a = efaMltWord (ea); 5860: XEiJ.busWw (a, z = (short) (-(y = XEiJ.busRws (a)) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5861: } 5862: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5863: (y & z) >>> 31 << 1 | 5864: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5865: } //irpNegxWord 5866: 5867: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5868: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5869: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5870: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5871: //NEGX.L <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_010_mmm_rrr 5872: public static void irpNegxLong () throws M68kException { 5873: int ea = XEiJ.regOC & 63; 5874: int y; 5875: int z; 5876: if (ea < XEiJ.EA_AR) { //NEGX.L Dr 5877: XEiJ.mpuCycleCount += 6; 5878: XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 5879: } else { //NEGX.L <mem> 5880: XEiJ.mpuCycleCount += 12; 5881: int a = efaMltLong (ea); 5882: XEiJ.busWl (a, z = -(y = XEiJ.busRls (a)) - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 5883: } 5884: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5885: (y & z) >>> 31 << 1 | 5886: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5887: } //irpNegxLong 5888: 5889: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5890: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5891: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5892: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5893: //MOVE.W SR,<ea> |-|-12346|P|*****|-----|D M+-WXZ |0100_000_011_mmm_rrr 5894: public static void irpMoveFromSR () throws M68kException { 5895: //MC68010以上では特権命令 5896: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5897: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5898: throw M68kException.m6eSignal; 5899: } 5900: //以下はスーパーバイザモード 5901: int ea = XEiJ.regOC & 63; 5902: if (ea < XEiJ.EA_AR) { //MOVE.W SR,Dr 5903: XEiJ.mpuCycleCount += 6; 5904: XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 5905: } else { //MOVE.W SR,<mem> 5906: //! 軽量化。MOVE from SRによる直後の命令のイミディエイトオペランドの自己書き換えが直後に反映されてしまう 5907: // MC68000でFEファンクションコールやSXコールのようなCCRを変化させる例外処理ルーチンの出口を次のように書くと、 5908: // 自己書き換えが直後に反映されずイミディエイトオペランドの領域がバッファになって前回の結果を返すことになるので期待通りに動作しない 5909: // move.w sr,@f+2 5910: // @@: move.b #0,(1,sp) 5911: // rte 5912: // これが期待通りに動作してしまったらMC68000を正しくエミュレートできていないということになる 5913: // https://stdkmd.net/bbs/page2.htm#comment134 5914: XEiJ.mpuCycleCount += 8; 5915: int a = efaMltWord (ea); 5916: if (XEiJ.MPU_OMIT_EXTRA_READ) { 5917: //! 軽量化。MC68000では書き込む前にリードが入るが省略する 5918: } else { 5919: XEiJ.busRws (a); 5920: } 5921: XEiJ.busWw (a, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); 5922: } 5923: } //irpMoveFromSR 5924: 5925: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5926: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5927: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5928: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5929: //CHK.W <ea>,Dq |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr 5930: public static void irpChkWord () throws M68kException { 5931: XEiJ.mpuCycleCount += 10; 5932: int ea = XEiJ.regOC & 63; 5933: int x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 5934: int y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 5935: int z = (short) (x - y); 5936: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | 5937: (y < 0 ? XEiJ.REG_CCR_N : 0) | 5938: (y == 0 ? XEiJ.REG_CCR_Z : 0) | 5939: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5940: (x & (y ^ z) ^ (y | z)) >>> 31); 5941: if (y < 0 || x < y) { 5942: XEiJ.mpuCycleCount += 38 - 10; 5943: M68kException.m6eNumber = M68kException.M6E_CHK_INSTRUCTION; 5944: throw M68kException.m6eSignal; 5945: } 5946: } //irpChkWord 5947: 5948: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5949: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5950: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5951: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5952: //LEA.L <ea>,Aq |-|012346|-|-----|-----| M WXZP |0100_qqq_111_mmm_rrr 5953: public static void irpLea () throws M68kException { 5954: //XEiJ.mpuCycleCount += 4 - 4; 5955: XEiJ.regRn[(XEiJ.regOC >> 9) - (32 - 8)] = efaLeaPea (XEiJ.regOC & 63); 5956: } //irpLea 5957: 5958: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5959: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5960: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5961: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5962: //CLR.B <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_000_mmm_rrr (68000 and 68008 read before clear) 5963: public static void irpClrByte () throws M68kException { 5964: int ea = XEiJ.regOC & 63; 5965: if (ea < XEiJ.EA_AR) { //CLR.B Dr 5966: XEiJ.mpuCycleCount += 4; 5967: XEiJ.regRn[ea] &= ~0xff; 5968: } else { //CLR.B <mem> 5969: //MC68010はリードしない 5970: XEiJ.mpuCycleCount += 8; 5971: XEiJ.busWb (efaMltByte (ea), 0); 5972: } 5973: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5974: } //irpClrByte 5975: 5976: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5977: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5978: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5979: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5980: //CLR.W <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_001_mmm_rrr (68000 and 68008 read before clear) 5981: public static void irpClrWord () throws M68kException { 5982: int ea = XEiJ.regOC & 63; 5983: if (ea < XEiJ.EA_AR) { //CLR.W Dr 5984: XEiJ.mpuCycleCount += 4; 5985: XEiJ.regRn[ea] &= ~0xffff; 5986: } else { //CLR.W <mem> 5987: //MC68010はリードしない 5988: XEiJ.mpuCycleCount += 8; 5989: XEiJ.busWw (efaMltWord (ea), 0); 5990: } 5991: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5992: } //irpClrWord 5993: 5994: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5995: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5996: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5997: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5998: //CLR.L <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_010_mmm_rrr (68000 and 68008 read before clear) 5999: public static void irpClrLong () throws M68kException { 6000: int ea = XEiJ.regOC & 63; 6001: if (ea < XEiJ.EA_AR) { //CLR.L Dr 6002: XEiJ.mpuCycleCount += 6; 6003: XEiJ.regRn[ea] = 0; 6004: } else { //CLR.L <mem> 6005: //MC68010はリードしない 6006: XEiJ.mpuCycleCount += 12; 6007: XEiJ.busWl (efaMltLong (ea), 0); 6008: } 6009: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 6010: } //irpClrLong 6011: 6012: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6013: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6014: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6015: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6016: //MOVE.W CCR,<ea> |-|-12346|-|*****|-----|D M+-WXZ |0100_001_011_mmm_rrr 6017: public static void irpMoveFromCCR () throws M68kException { 6018: int ea = XEiJ.regOC & 63; 6019: if (ea < XEiJ.EA_AR) { //MOVE.W CCR,Dr 6020: XEiJ.mpuCycleCount += 4; 6021: XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regCCR; 6022: } else { //MOVE.W CCR,<mem> 6023: XEiJ.mpuCycleCount += 8; 6024: XEiJ.busWw (efaMltWord (ea), XEiJ.regCCR); 6025: } 6026: } //irpMoveFromCCR 6027: 6028: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6029: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6030: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6031: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6032: //NEG.B <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_000_mmm_rrr 6033: public static void irpNegByte () throws M68kException { 6034: int ea = XEiJ.regOC & 63; 6035: int y; 6036: int z; 6037: if (ea < XEiJ.EA_AR) { //NEG.B Dr 6038: XEiJ.mpuCycleCount += 4; 6039: z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y)); 6040: } else { //NEG.B <mem> 6041: XEiJ.mpuCycleCount += 8; 6042: int a = efaMltByte (ea); 6043: XEiJ.busWb (a, z = (byte) -(y = XEiJ.busRbs (a))); 6044: } 6045: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 6046: (y & z) >>> 31 << 1 | 6047: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 6048: } //irpNegByte 6049: 6050: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6051: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6052: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6053: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6054: //NEG.W <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_001_mmm_rrr 6055: public static void irpNegWord () throws M68kException { 6056: int ea = XEiJ.regOC & 63; 6057: int y; 6058: int z; 6059: if (ea < XEiJ.EA_AR) { //NEG.W Dr 6060: XEiJ.mpuCycleCount += 4; 6061: z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) -(y = (short) y)); 6062: } else { //NEG.W <mem> 6063: XEiJ.mpuCycleCount += 8; 6064: int a = efaMltWord (ea); 6065: XEiJ.busWw (a, z = (short) -(y = XEiJ.busRws (a))); 6066: } 6067: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 6068: (y & z) >>> 31 << 1 | 6069: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 6070: } //irpNegWord 6071: 6072: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6073: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6074: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6075: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6076: //NEG.L <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_010_mmm_rrr 6077: public static void irpNegLong () throws M68kException { 6078: int ea = XEiJ.regOC & 63; 6079: int y; 6080: int z; 6081: if (ea < XEiJ.EA_AR) { //NEG.L Dr 6082: XEiJ.mpuCycleCount += 6; 6083: XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]); 6084: } else { //NEG.L <mem> 6085: XEiJ.mpuCycleCount += 12; 6086: int a = efaMltLong (ea); 6087: XEiJ.busWl (a, z = -(y = XEiJ.busRls (a))); 6088: } 6089: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 6090: (y & z) >>> 31 << 1 | 6091: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 6092: } //irpNegLong 6093: 6094: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6095: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6096: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6097: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6098: //MOVE.W <ea>,CCR |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr 6099: public static void irpMoveToCCR () throws M68kException { 6100: XEiJ.mpuCycleCount += 12; 6101: int ea = XEiJ.regOC & 63; 6102: XEiJ.regCCR = XEiJ.REG_CCR_MASK & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea))); 6103: } //irpMoveToCCR 6104: 6105: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6106: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6107: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6108: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6109: //NOT.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_000_mmm_rrr 6110: public static void irpNotByte () throws M68kException { 6111: int ea = XEiJ.regOC & 63; 6112: int z; 6113: if (ea < XEiJ.EA_AR) { //NOT.B Dr 6114: XEiJ.mpuCycleCount += 4; 6115: z = XEiJ.regRn[ea] ^= 255; //0拡張してからEOR 6116: } else { //NOT.B <mem> 6117: XEiJ.mpuCycleCount += 8; 6118: int a = efaMltByte (ea); 6119: XEiJ.busWb (a, z = ~XEiJ.busRbs (a)); 6120: } 6121: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 6122: } //irpNotByte 6123: 6124: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6125: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6126: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6127: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6128: //NOT.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_001_mmm_rrr 6129: public static void irpNotWord () throws M68kException { 6130: int ea = XEiJ.regOC & 63; 6131: int z; 6132: if (ea < XEiJ.EA_AR) { //NOT.W Dr 6133: XEiJ.mpuCycleCount += 4; 6134: z = XEiJ.regRn[ea] ^= 65535; //0拡張してからEOR 6135: } else { //NOT.W <mem> 6136: XEiJ.mpuCycleCount += 8; 6137: int a = efaMltWord (ea); 6138: XEiJ.busWw (a, z = ~XEiJ.busRws (a)); 6139: } 6140: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 6141: } //irpNotWord 6142: 6143: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6144: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6145: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6146: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6147: //NOT.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_010_mmm_rrr 6148: public static void irpNotLong () throws M68kException { 6149: int ea = XEiJ.regOC & 63; 6150: int z; 6151: if (ea < XEiJ.EA_AR) { //NOT.L Dr 6152: XEiJ.mpuCycleCount += 6; 6153: z = XEiJ.regRn[ea] ^= 0xffffffff; 6154: } else { //NOT.L <mem> 6155: XEiJ.mpuCycleCount += 12; 6156: int a = efaMltLong (ea); 6157: XEiJ.busWl (a, z = ~XEiJ.busRls (a)); 6158: } 6159: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6160: } //irpNotLong 6161: 6162: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6163: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6164: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6165: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6166: //MOVE.W <ea>,SR |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr 6167: public static void irpMoveToSR () throws M68kException { 6168: if (XEiJ.regSRS == 0) { //ユーザモードのとき 6169: XEiJ.mpuCycleCount += 34; 6170: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 6171: throw M68kException.m6eSignal; 6172: } 6173: //以下はスーパーバイザモード 6174: XEiJ.mpuCycleCount += 12; 6175: int ea = XEiJ.regOC & 63; 6176: irpSetSR (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea))); //特権違反チェックが先 6177: } //irpMoveToSR 6178: 6179: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6180: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6181: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6183: //NBCD.B <ea> |-|012346|-|UUUUU|*U*U*|D M+-WXZ |0100_100_000_mmm_rrr 6184: public static void irpNbcd () throws M68kException { 6185: int ea = XEiJ.regOC & 63; 6186: if (ea < XEiJ.EA_AR) { //NBCD.B Dr 6187: XEiJ.mpuCycleCount += 6; 6188: XEiJ.regRn[ea] = ~0xff & XEiJ.regRn[ea] | irpSbcd (0, XEiJ.regRn[ea]); 6189: } else { //NBCD.B <mem> 6190: XEiJ.mpuCycleCount += 8; 6191: int a = efaMltByte (ea); 6192: XEiJ.busWb (a, irpSbcd (0, XEiJ.busRbs (a))); 6193: } 6194: } //irpNbcd 6195: 6196: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6197: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6198: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6199: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6200: //SWAP.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_001_000_rrr 6201: //BKPT #<data> |-|-12346|-|-----|-----| |0100_100_001_001_ddd 6202: //PEA.L <ea> |-|012346|-|-----|-----| M WXZP |0100_100_001_mmm_rrr 6203: public static void irpPea () throws M68kException { 6204: int ea = XEiJ.regOC & 63; 6205: if (ea < XEiJ.EA_AR) { //SWAP.W Dr 6206: XEiJ.mpuCycleCount += 4; 6207: int x; 6208: int z; 6209: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) << 16 | x >>> 16; 6210: //上位ワードと下位ワードを入れ替えた後のDrをロングでテストする 6211: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6212: } else { //PEA.L <ea> 6213: XEiJ.mpuCycleCount += 12 - 4; 6214: int a = efaLeaPea (ea); //BKPT #<data>はここでillegal instructionになる 6215: XEiJ.busWl (XEiJ.regRn[15] -= 4, a); //pushl。評価順序に注意。wl(r[15]-=4,eaz_leapea(ea))は不可 6216: } 6217: } //irpPea 6218: 6219: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6220: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6221: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6222: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6223: //EXT.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_010_000_rrr 6224: //MOVEM.W <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_010_mmm_rrr-llllllllllllllll 6225: public static void irpMovemToMemWord () throws M68kException { 6226: int ea = XEiJ.regOC & 63; 6227: if (ea < XEiJ.EA_AR) { //EXT.W Dr 6228: XEiJ.mpuCycleCount += 4; 6229: int z; 6230: XEiJ.regRn[ea] = ~0xffff & (z = XEiJ.regRn[ea]) | (char) (z = (byte) z); 6231: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6232: } else { //MOVEM.W <list>,<ea> 6233: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 6234: XEiJ.regPC += 2; 6235: if (ea >> 3 == XEiJ.MMM_MN) { //-(Ar) 6236: //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む 6237: //転送するレジスタが0個のときArは変化しない 6238: int arr = ea - (XEiJ.EA_MN - 8); 6239: int a = XEiJ.regRn[arr]; 6240: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6241: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6242: M68kException.m6eAddress = a; 6243: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6244: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 6245: throw M68kException.m6eSignal; 6246: } 6247: int t = a; 6248: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6249: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 2 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6250: 2 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) { //16個転送してもページを跨がない 6251: a &= XEiJ.BUS_MOTHER_MASK; 6252: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6253: if ((l & 0x0001) != 0) { 6254: a -= 2; 6255: int x = XEiJ.regRn[15]; 6256: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6257: MainMemory.mmrM8[a + 1] = (byte) x; 6258: } 6259: if ((l & 0x0002) != 0) { 6260: a -= 2; 6261: int x = XEiJ.regRn[14]; 6262: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6263: MainMemory.mmrM8[a + 1] = (byte) x; 6264: } 6265: if ((l & 0x0004) != 0) { 6266: a -= 2; 6267: int x = XEiJ.regRn[13]; 6268: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6269: MainMemory.mmrM8[a + 1] = (byte) x; 6270: } 6271: if ((l & 0x0008) != 0) { 6272: a -= 2; 6273: int x = XEiJ.regRn[12]; 6274: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6275: MainMemory.mmrM8[a + 1] = (byte) x; 6276: } 6277: if ((l & 0x0010) != 0) { 6278: a -= 2; 6279: int x = XEiJ.regRn[11]; 6280: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6281: MainMemory.mmrM8[a + 1] = (byte) x; 6282: } 6283: if ((l & 0x0020) != 0) { 6284: a -= 2; 6285: int x = XEiJ.regRn[10]; 6286: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6287: MainMemory.mmrM8[a + 1] = (byte) x; 6288: } 6289: if ((l & 0x0040) != 0) { 6290: a -= 2; 6291: int x = XEiJ.regRn[ 9]; 6292: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6293: MainMemory.mmrM8[a + 1] = (byte) x; 6294: } 6295: if ((byte) l < 0) { //(l & 0x0080) != 0 6296: a -= 2; 6297: int x = XEiJ.regRn[ 8]; 6298: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6299: MainMemory.mmrM8[a + 1] = (byte) x; 6300: } 6301: if ((l & 0x0100) != 0) { 6302: a -= 2; 6303: int x = XEiJ.regRn[ 7]; 6304: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6305: MainMemory.mmrM8[a + 1] = (byte) x; 6306: } 6307: if ((l & 0x0200) != 0) { 6308: a -= 2; 6309: int x = XEiJ.regRn[ 6]; 6310: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6311: MainMemory.mmrM8[a + 1] = (byte) x; 6312: } 6313: if ((l & 0x0400) != 0) { 6314: a -= 2; 6315: int x = XEiJ.regRn[ 5]; 6316: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6317: MainMemory.mmrM8[a + 1] = (byte) x; 6318: } 6319: if ((l & 0x0800) != 0) { 6320: a -= 2; 6321: int x = XEiJ.regRn[ 4]; 6322: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6323: MainMemory.mmrM8[a + 1] = (byte) x; 6324: } 6325: if ((l & 0x1000) != 0) { 6326: a -= 2; 6327: int x = XEiJ.regRn[ 3]; 6328: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6329: MainMemory.mmrM8[a + 1] = (byte) x; 6330: } 6331: if ((l & 0x2000) != 0) { 6332: a -= 2; 6333: int x = XEiJ.regRn[ 2]; 6334: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6335: MainMemory.mmrM8[a + 1] = (byte) x; 6336: } 6337: if ((l & 0x4000) != 0) { 6338: a -= 2; 6339: int x = XEiJ.regRn[ 1]; 6340: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6341: MainMemory.mmrM8[a + 1] = (byte) x; 6342: } 6343: if ((short) l < 0) { //(l & 0x8000) != 0 6344: a -= 2; 6345: int x = XEiJ.regRn[ 0]; 6346: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6347: MainMemory.mmrM8[a + 1] = (byte) x; 6348: } 6349: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6350: for (int i = 15; i >= 0; i--) { 6351: if ((l & 0x8000 >>> i) != 0) { 6352: a -= 2; 6353: int x = XEiJ.regRn[i]; 6354: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6355: MainMemory.mmrM8[a + 1] = (byte) x; 6356: } 6357: } 6358: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6359: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6360: for (int i = 15; l != 0; i--, l <<= 1) { 6361: if (l < 0) { 6362: a -= 2; 6363: int x = XEiJ.regRn[i]; 6364: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6365: MainMemory.mmrM8[a + 1] = (byte) x; 6366: } 6367: } 6368: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6369: for (int i = 15; l != 0; i--, l >>>= 1) { 6370: if ((l & 1) != 0) { 6371: a -= 2; 6372: int x = XEiJ.regRn[i]; 6373: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6374: MainMemory.mmrM8[a + 1] = (byte) x; 6375: } 6376: } 6377: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6378: for (int i = 15; l != 0; ) { 6379: int k = Integer.numberOfTrailingZeros (l); 6380: a -= 2; 6381: int x = XEiJ.regRn[i -= k]; 6382: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6383: MainMemory.mmrM8[a + 1] = (byte) x; 6384: l = l >>> k & ~1; 6385: } 6386: } 6387: a = t - (short) (t - a); 6388: } else { //メインメモリでないかページを跨ぐ可能性がある 6389: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6390: if ((l & 0x0001) != 0) { 6391: XEiJ.busWwe (a -= 2, XEiJ.regRn[15]); 6392: } 6393: if ((l & 0x0002) != 0) { 6394: XEiJ.busWwe (a -= 2, XEiJ.regRn[14]); 6395: } 6396: if ((l & 0x0004) != 0) { 6397: XEiJ.busWwe (a -= 2, XEiJ.regRn[13]); 6398: } 6399: if ((l & 0x0008) != 0) { 6400: XEiJ.busWwe (a -= 2, XEiJ.regRn[12]); 6401: } 6402: if ((l & 0x0010) != 0) { 6403: XEiJ.busWwe (a -= 2, XEiJ.regRn[11]); 6404: } 6405: if ((l & 0x0020) != 0) { 6406: XEiJ.busWwe (a -= 2, XEiJ.regRn[10]); 6407: } 6408: if ((l & 0x0040) != 0) { 6409: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 9]); 6410: } 6411: if ((byte) l < 0) { //(l & 0x0080) != 0 6412: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 8]); 6413: } 6414: if ((l & 0x0100) != 0) { 6415: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 7]); 6416: } 6417: if ((l & 0x0200) != 0) { 6418: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 6]); 6419: } 6420: if ((l & 0x0400) != 0) { 6421: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 5]); 6422: } 6423: if ((l & 0x0800) != 0) { 6424: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 4]); 6425: } 6426: if ((l & 0x1000) != 0) { 6427: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 3]); 6428: } 6429: if ((l & 0x2000) != 0) { 6430: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 2]); 6431: } 6432: if ((l & 0x4000) != 0) { 6433: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 1]); 6434: } 6435: if ((short) l < 0) { //(l & 0x8000) != 0 6436: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 0]); 6437: } 6438: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6439: for (int i = 15; i >= 0; i--) { 6440: if ((l & 0x8000 >>> i) != 0) { 6441: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6442: } 6443: } 6444: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6445: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6446: for (int i = 15; l != 0; i--, l <<= 1) { 6447: if (l < 0) { 6448: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6449: } 6450: } 6451: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6452: for (int i = 15; l != 0; i--, l >>>= 1) { 6453: if ((l & 1) != 0) { 6454: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6455: } 6456: } 6457: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6458: for (int i = 15; l != 0; ) { 6459: int k = Integer.numberOfTrailingZeros (l); 6460: XEiJ.busWwe (a -= 2, XEiJ.regRn[i -= k]); 6461: l = l >>> k & ~1; 6462: } 6463: } 6464: } 6465: XEiJ.regRn[arr] = a; 6466: XEiJ.mpuCycleCount += 8 + (t - a << 1); //2バイト/個→4サイクル/個 6467: } else { //-(Ar)以外 6468: int a = efaCltWord (ea); 6469: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6470: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6471: M68kException.m6eAddress = a; 6472: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6473: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 6474: throw M68kException.m6eSignal; 6475: } 6476: int t = a; 6477: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6478: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6479: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) { //16個転送してもページを跨がない 6480: a &= XEiJ.BUS_MOTHER_MASK; 6481: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6482: if ((l & 0x0001) != 0) { 6483: int x = XEiJ.regRn[ 0]; 6484: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6485: MainMemory.mmrM8[a + 1] = (byte) x; 6486: a += 2; 6487: } 6488: if ((l & 0x0002) != 0) { 6489: int x = XEiJ.regRn[ 1]; 6490: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6491: MainMemory.mmrM8[a + 1] = (byte) x; 6492: a += 2; 6493: } 6494: if ((l & 0x0004) != 0) { 6495: int x = XEiJ.regRn[ 2]; 6496: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6497: MainMemory.mmrM8[a + 1] = (byte) x; 6498: a += 2; 6499: } 6500: if ((l & 0x0008) != 0) { 6501: int x = XEiJ.regRn[ 3]; 6502: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6503: MainMemory.mmrM8[a + 1] = (byte) x; 6504: a += 2; 6505: } 6506: if ((l & 0x0010) != 0) { 6507: int x = XEiJ.regRn[ 4]; 6508: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6509: MainMemory.mmrM8[a + 1] = (byte) x; 6510: a += 2; 6511: } 6512: if ((l & 0x0020) != 0) { 6513: int x = XEiJ.regRn[ 5]; 6514: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6515: MainMemory.mmrM8[a + 1] = (byte) x; 6516: a += 2; 6517: } 6518: if ((l & 0x0040) != 0) { 6519: int x = XEiJ.regRn[ 6]; 6520: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6521: MainMemory.mmrM8[a + 1] = (byte) x; 6522: a += 2; 6523: } 6524: if ((byte) l < 0) { //(l & 0x0080) != 0 6525: int x = XEiJ.regRn[ 7]; 6526: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6527: MainMemory.mmrM8[a + 1] = (byte) x; 6528: a += 2; 6529: } 6530: if ((l & 0x0100) != 0) { 6531: int x = XEiJ.regRn[ 8]; 6532: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6533: MainMemory.mmrM8[a + 1] = (byte) x; 6534: a += 2; 6535: } 6536: if ((l & 0x0200) != 0) { 6537: int x = XEiJ.regRn[ 9]; 6538: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6539: MainMemory.mmrM8[a + 1] = (byte) x; 6540: a += 2; 6541: } 6542: if ((l & 0x0400) != 0) { 6543: int x = XEiJ.regRn[10]; 6544: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6545: MainMemory.mmrM8[a + 1] = (byte) x; 6546: a += 2; 6547: } 6548: if ((l & 0x0800) != 0) { 6549: int x = XEiJ.regRn[11]; 6550: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6551: MainMemory.mmrM8[a + 1] = (byte) x; 6552: a += 2; 6553: } 6554: if ((l & 0x1000) != 0) { 6555: int x = XEiJ.regRn[12]; 6556: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6557: MainMemory.mmrM8[a + 1] = (byte) x; 6558: a += 2; 6559: } 6560: if ((l & 0x2000) != 0) { 6561: int x = XEiJ.regRn[13]; 6562: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6563: MainMemory.mmrM8[a + 1] = (byte) x; 6564: a += 2; 6565: } 6566: if ((l & 0x4000) != 0) { 6567: int x = XEiJ.regRn[14]; 6568: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6569: MainMemory.mmrM8[a + 1] = (byte) x; 6570: a += 2; 6571: } 6572: if ((short) l < 0) { //(l & 0x8000) != 0 6573: int x = XEiJ.regRn[15]; 6574: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6575: MainMemory.mmrM8[a + 1] = (byte) x; 6576: a += 2; 6577: } 6578: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6579: for (int i = 0; i <= 15; i++) { 6580: if ((l & 0x0001 << i) != 0) { 6581: int x = XEiJ.regRn[i]; 6582: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6583: MainMemory.mmrM8[a + 1] = (byte) x; 6584: a += 2; 6585: } 6586: } 6587: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6588: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6589: for (int i = 0; l != 0; i++, l <<= 1) { 6590: if (l < 0) { 6591: int x = XEiJ.regRn[i]; 6592: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6593: MainMemory.mmrM8[a + 1] = (byte) x; 6594: a += 2; 6595: } 6596: } 6597: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6598: for (int i = 0; l != 0; i++, l >>>= 1) { 6599: if ((l & 1) != 0) { 6600: int x = XEiJ.regRn[i]; 6601: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6602: MainMemory.mmrM8[a + 1] = (byte) x; 6603: a += 2; 6604: } 6605: } 6606: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6607: for (int i = 0; l != 0; ) { 6608: int k = Integer.numberOfTrailingZeros (l); 6609: int x = XEiJ.regRn[i += k]; 6610: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6611: MainMemory.mmrM8[a + 1] = (byte) x; 6612: a += 2; 6613: l = l >>> k & ~1; 6614: } 6615: } 6616: a = t + (short) (a - t); 6617: } else { //メインメモリでないかページを跨ぐ可能性がある 6618: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6619: if ((l & 0x0001) != 0) { 6620: XEiJ.busWwe (a, XEiJ.regRn[ 0]); 6621: a += 2; 6622: } 6623: if ((l & 0x0002) != 0) { 6624: XEiJ.busWwe (a, XEiJ.regRn[ 1]); 6625: a += 2; 6626: } 6627: if ((l & 0x0004) != 0) { 6628: XEiJ.busWwe (a, XEiJ.regRn[ 2]); 6629: a += 2; 6630: } 6631: if ((l & 0x0008) != 0) { 6632: XEiJ.busWwe (a, XEiJ.regRn[ 3]); 6633: a += 2; 6634: } 6635: if ((l & 0x0010) != 0) { 6636: XEiJ.busWwe (a, XEiJ.regRn[ 4]); 6637: a += 2; 6638: } 6639: if ((l & 0x0020) != 0) { 6640: XEiJ.busWwe (a, XEiJ.regRn[ 5]); 6641: a += 2; 6642: } 6643: if ((l & 0x0040) != 0) { 6644: XEiJ.busWwe (a, XEiJ.regRn[ 6]); 6645: a += 2; 6646: } 6647: if ((byte) l < 0) { //(l & 0x0080) != 0 6648: XEiJ.busWwe (a, XEiJ.regRn[ 7]); 6649: a += 2; 6650: } 6651: if ((l & 0x0100) != 0) { 6652: XEiJ.busWwe (a, XEiJ.regRn[ 8]); 6653: a += 2; 6654: } 6655: if ((l & 0x0200) != 0) { 6656: XEiJ.busWwe (a, XEiJ.regRn[ 9]); 6657: a += 2; 6658: } 6659: if ((l & 0x0400) != 0) { 6660: XEiJ.busWwe (a, XEiJ.regRn[10]); 6661: a += 2; 6662: } 6663: if ((l & 0x0800) != 0) { 6664: XEiJ.busWwe (a, XEiJ.regRn[11]); 6665: a += 2; 6666: } 6667: if ((l & 0x1000) != 0) { 6668: XEiJ.busWwe (a, XEiJ.regRn[12]); 6669: a += 2; 6670: } 6671: if ((l & 0x2000) != 0) { 6672: XEiJ.busWwe (a, XEiJ.regRn[13]); 6673: a += 2; 6674: } 6675: if ((l & 0x4000) != 0) { 6676: XEiJ.busWwe (a, XEiJ.regRn[14]); 6677: a += 2; 6678: } 6679: if ((short) l < 0) { //(l & 0x8000) != 0 6680: XEiJ.busWwe (a, XEiJ.regRn[15]); 6681: a += 2; 6682: } 6683: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6684: for (int i = 0; i <= 15; i++) { 6685: if ((l & 0x0001 << i) != 0) { 6686: XEiJ.busWwe (a, XEiJ.regRn[i]); 6687: a += 2; 6688: } 6689: } 6690: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6691: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6692: for (int i = 0; l != 0; i++, l <<= 1) { 6693: if (l < 0) { 6694: XEiJ.busWwe (a, XEiJ.regRn[i]); 6695: a += 2; 6696: } 6697: } 6698: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6699: for (int i = 0; l != 0; i++, l >>>= 1) { 6700: if ((l & 1) != 0) { 6701: XEiJ.busWwe (a, XEiJ.regRn[i]); 6702: a += 2; 6703: } 6704: } 6705: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6706: for (int i = 0; l != 0; ) { 6707: int k = Integer.numberOfTrailingZeros (l); 6708: XEiJ.busWwe (a, XEiJ.regRn[i += k]); 6709: a += 2; 6710: l = l >>> k & ~1; 6711: } 6712: } 6713: } 6714: XEiJ.mpuCycleCount += 4 + (a - t << 1); //2バイト/個→4サイクル/個 6715: } 6716: } 6717: } //irpMovemToMemWord 6718: 6719: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6720: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6721: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6722: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6723: //EXT.L Dr |-|012346|-|-UUUU|-**00|D |0100_100_011_000_rrr 6724: //MOVEM.L <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_011_mmm_rrr-llllllllllllllll 6725: public static void irpMovemToMemLong () throws M68kException { 6726: int ea = XEiJ.regOC & 63; 6727: if (ea < XEiJ.EA_AR) { //EXT.L Dr 6728: XEiJ.mpuCycleCount += 4; 6729: int z; 6730: XEiJ.regRn[ea] = z = (short) XEiJ.regRn[ea]; 6731: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6732: } else { //MOVEM.L <list>,<ea> 6733: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 6734: XEiJ.regPC += 2; 6735: if (ea >> 3 == XEiJ.MMM_MN) { //-(Ar) 6736: //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む 6737: //転送するレジスタが0個のときArは変化しない 6738: int arr = ea - (XEiJ.EA_MN - 8); 6739: int a = XEiJ.regRn[arr]; 6740: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6741: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6742: M68kException.m6eAddress = a; 6743: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6744: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 6745: throw M68kException.m6eSignal; 6746: } 6747: int t = a; 6748: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6749: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 4 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6750: 4 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) { //16個転送してもページを跨がない 6751: a &= XEiJ.BUS_MOTHER_MASK; 6752: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6753: if ((l & 0x0001) != 0) { 6754: a -= 4; 6755: int x = XEiJ.regRn[15]; 6756: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6757: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6758: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6759: MainMemory.mmrM8[a + 3] = (byte) x; 6760: } 6761: if ((l & 0x0002) != 0) { 6762: a -= 4; 6763: int x = XEiJ.regRn[14]; 6764: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6765: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6766: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6767: MainMemory.mmrM8[a + 3] = (byte) x; 6768: } 6769: if ((l & 0x0004) != 0) { 6770: a -= 4; 6771: int x = XEiJ.regRn[13]; 6772: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6773: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6774: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6775: MainMemory.mmrM8[a + 3] = (byte) x; 6776: } 6777: if ((l & 0x0008) != 0) { 6778: a -= 4; 6779: int x = XEiJ.regRn[12]; 6780: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6781: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6782: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6783: MainMemory.mmrM8[a + 3] = (byte) x; 6784: } 6785: if ((l & 0x0010) != 0) { 6786: a -= 4; 6787: int x = XEiJ.regRn[11]; 6788: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6789: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6790: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6791: MainMemory.mmrM8[a + 3] = (byte) x; 6792: } 6793: if ((l & 0x0020) != 0) { 6794: a -= 4; 6795: int x = XEiJ.regRn[10]; 6796: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6797: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6798: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6799: MainMemory.mmrM8[a + 3] = (byte) x; 6800: } 6801: if ((l & 0x0040) != 0) { 6802: a -= 4; 6803: int x = XEiJ.regRn[ 9]; 6804: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6805: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6806: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6807: MainMemory.mmrM8[a + 3] = (byte) x; 6808: } 6809: if ((byte) l < 0) { //(l & 0x0080) != 0 6810: a -= 4; 6811: int x = XEiJ.regRn[ 8]; 6812: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6813: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6814: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6815: MainMemory.mmrM8[a + 3] = (byte) x; 6816: } 6817: if ((l & 0x0100) != 0) { 6818: a -= 4; 6819: int x = XEiJ.regRn[ 7]; 6820: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6821: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6822: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6823: MainMemory.mmrM8[a + 3] = (byte) x; 6824: } 6825: if ((l & 0x0200) != 0) { 6826: a -= 4; 6827: int x = XEiJ.regRn[ 6]; 6828: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6829: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6830: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6831: MainMemory.mmrM8[a + 3] = (byte) x; 6832: } 6833: if ((l & 0x0400) != 0) { 6834: a -= 4; 6835: int x = XEiJ.regRn[ 5]; 6836: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6837: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6838: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6839: MainMemory.mmrM8[a + 3] = (byte) x; 6840: } 6841: if ((l & 0x0800) != 0) { 6842: a -= 4; 6843: int x = XEiJ.regRn[ 4]; 6844: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6845: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6846: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6847: MainMemory.mmrM8[a + 3] = (byte) x; 6848: } 6849: if ((l & 0x1000) != 0) { 6850: a -= 4; 6851: int x = XEiJ.regRn[ 3]; 6852: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6853: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6854: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6855: MainMemory.mmrM8[a + 3] = (byte) x; 6856: } 6857: if ((l & 0x2000) != 0) { 6858: a -= 4; 6859: int x = XEiJ.regRn[ 2]; 6860: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6861: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6862: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6863: MainMemory.mmrM8[a + 3] = (byte) x; 6864: } 6865: if ((l & 0x4000) != 0) { 6866: a -= 4; 6867: int x = XEiJ.regRn[ 1]; 6868: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6869: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6870: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6871: MainMemory.mmrM8[a + 3] = (byte) x; 6872: } 6873: if ((short) l < 0) { //(l & 0x8000) != 0 6874: a -= 4; 6875: int x = XEiJ.regRn[ 0]; 6876: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6877: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6878: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6879: MainMemory.mmrM8[a + 3] = (byte) x; 6880: } 6881: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6882: for (int i = 15; i >= 0; i--) { 6883: if ((l & 0x8000 >>> i) != 0) { 6884: a -= 4; 6885: int x = XEiJ.regRn[i]; 6886: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6887: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6888: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6889: MainMemory.mmrM8[a + 3] = (byte) x; 6890: } 6891: } 6892: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6893: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6894: for (int i = 15; l != 0; i--, l <<= 1) { 6895: if (l < 0) { 6896: a -= 4; 6897: int x = XEiJ.regRn[i]; 6898: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6899: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6900: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6901: MainMemory.mmrM8[a + 3] = (byte) x; 6902: } 6903: } 6904: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6905: for (int i = 15; l != 0; i--, l >>>= 1) { 6906: if ((l & 1) != 0) { 6907: a -= 4; 6908: int x = XEiJ.regRn[i]; 6909: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6910: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6911: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6912: MainMemory.mmrM8[a + 3] = (byte) x; 6913: } 6914: } 6915: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6916: for (int i = 15; l != 0; ) { 6917: int k = Integer.numberOfTrailingZeros (l); 6918: a -= 4; 6919: int x = XEiJ.regRn[i -= k]; 6920: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6921: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6922: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6923: MainMemory.mmrM8[a + 3] = (byte) x; 6924: l = l >>> k & ~1; 6925: } 6926: } 6927: a = t - (short) (t - a); 6928: } else { //メインメモリでないかページを跨ぐ可能性がある 6929: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6930: if ((l & 0x0001) != 0) { 6931: XEiJ.busWle (a -= 4, XEiJ.regRn[15]); 6932: } 6933: if ((l & 0x0002) != 0) { 6934: XEiJ.busWle (a -= 4, XEiJ.regRn[14]); 6935: } 6936: if ((l & 0x0004) != 0) { 6937: XEiJ.busWle (a -= 4, XEiJ.regRn[13]); 6938: } 6939: if ((l & 0x0008) != 0) { 6940: XEiJ.busWle (a -= 4, XEiJ.regRn[12]); 6941: } 6942: if ((l & 0x0010) != 0) { 6943: XEiJ.busWle (a -= 4, XEiJ.regRn[11]); 6944: } 6945: if ((l & 0x0020) != 0) { 6946: XEiJ.busWle (a -= 4, XEiJ.regRn[10]); 6947: } 6948: if ((l & 0x0040) != 0) { 6949: XEiJ.busWle (a -= 4, XEiJ.regRn[ 9]); 6950: } 6951: if ((byte) l < 0) { //(l & 0x0080) != 0 6952: XEiJ.busWle (a -= 4, XEiJ.regRn[ 8]); 6953: } 6954: if ((l & 0x0100) != 0) { 6955: XEiJ.busWle (a -= 4, XEiJ.regRn[ 7]); 6956: } 6957: if ((l & 0x0200) != 0) { 6958: XEiJ.busWle (a -= 4, XEiJ.regRn[ 6]); 6959: } 6960: if ((l & 0x0400) != 0) { 6961: XEiJ.busWle (a -= 4, XEiJ.regRn[ 5]); 6962: } 6963: if ((l & 0x0800) != 0) { 6964: XEiJ.busWle (a -= 4, XEiJ.regRn[ 4]); 6965: } 6966: if ((l & 0x1000) != 0) { 6967: XEiJ.busWle (a -= 4, XEiJ.regRn[ 3]); 6968: } 6969: if ((l & 0x2000) != 0) { 6970: XEiJ.busWle (a -= 4, XEiJ.regRn[ 2]); 6971: } 6972: if ((l & 0x4000) != 0) { 6973: XEiJ.busWle (a -= 4, XEiJ.regRn[ 1]); 6974: } 6975: if ((short) l < 0) { //(l & 0x8000) != 0 6976: XEiJ.busWle (a -= 4, XEiJ.regRn[ 0]); 6977: } 6978: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6979: for (int i = 15; i >= 0; i--) { 6980: if ((l & 0x8000 >>> i) != 0) { 6981: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6982: } 6983: } 6984: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6985: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6986: for (int i = 15; l != 0; i--, l <<= 1) { 6987: if (l < 0) { 6988: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6989: } 6990: } 6991: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6992: for (int i = 15; l != 0; i--, l >>>= 1) { 6993: if ((l & 1) != 0) { 6994: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6995: } 6996: } 6997: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6998: for (int i = 15; l != 0; ) { 6999: int k = Integer.numberOfTrailingZeros (l); 7000: XEiJ.busWle (a -= 4, XEiJ.regRn[i -= k]); 7001: l = l >>> k & ~1; 7002: } 7003: } 7004: } 7005: XEiJ.regRn[arr] = a; 7006: XEiJ.mpuCycleCount += 8 + (t - a << 1); //4バイト/個→8サイクル/個 7007: } else { //-(Ar)以外 7008: int a = efaCltLong (ea); 7009: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 7010: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 7011: M68kException.m6eAddress = a; 7012: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 7013: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 7014: throw M68kException.m6eSignal; 7015: } 7016: int t = a; 7017: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 7018: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 7019: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) { //16個転送してもページを跨がない 7020: a &= XEiJ.BUS_MOTHER_MASK; 7021: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7022: if ((l & 0x0001) != 0) { 7023: int x = XEiJ.regRn[ 0]; 7024: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7025: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7026: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7027: MainMemory.mmrM8[a + 3] = (byte) x; 7028: a += 4; 7029: } 7030: if ((l & 0x0002) != 0) { 7031: int x = XEiJ.regRn[ 1]; 7032: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7033: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7034: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7035: MainMemory.mmrM8[a + 3] = (byte) x; 7036: a += 4; 7037: } 7038: if ((l & 0x0004) != 0) { 7039: int x = XEiJ.regRn[ 2]; 7040: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7041: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7042: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7043: MainMemory.mmrM8[a + 3] = (byte) x; 7044: a += 4; 7045: } 7046: if ((l & 0x0008) != 0) { 7047: int x = XEiJ.regRn[ 3]; 7048: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7049: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7050: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7051: MainMemory.mmrM8[a + 3] = (byte) x; 7052: a += 4; 7053: } 7054: if ((l & 0x0010) != 0) { 7055: int x = XEiJ.regRn[ 4]; 7056: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7057: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7058: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7059: MainMemory.mmrM8[a + 3] = (byte) x; 7060: a += 4; 7061: } 7062: if ((l & 0x0020) != 0) { 7063: int x = XEiJ.regRn[ 5]; 7064: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7065: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7066: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7067: MainMemory.mmrM8[a + 3] = (byte) x; 7068: a += 4; 7069: } 7070: if ((l & 0x0040) != 0) { 7071: int x = XEiJ.regRn[ 6]; 7072: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7073: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7074: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7075: MainMemory.mmrM8[a + 3] = (byte) x; 7076: a += 4; 7077: } 7078: if ((byte) l < 0) { //(l & 0x0080) != 0 7079: int x = XEiJ.regRn[ 7]; 7080: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7081: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7082: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7083: MainMemory.mmrM8[a + 3] = (byte) x; 7084: a += 4; 7085: } 7086: if ((l & 0x0100) != 0) { 7087: int x = XEiJ.regRn[ 8]; 7088: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7089: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7090: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7091: MainMemory.mmrM8[a + 3] = (byte) x; 7092: a += 4; 7093: } 7094: if ((l & 0x0200) != 0) { 7095: int x = XEiJ.regRn[ 9]; 7096: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7097: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7098: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7099: MainMemory.mmrM8[a + 3] = (byte) x; 7100: a += 4; 7101: } 7102: if ((l & 0x0400) != 0) { 7103: int x = XEiJ.regRn[10]; 7104: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7105: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7106: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7107: MainMemory.mmrM8[a + 3] = (byte) x; 7108: a += 4; 7109: } 7110: if ((l & 0x0800) != 0) { 7111: int x = XEiJ.regRn[11]; 7112: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7113: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7114: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7115: MainMemory.mmrM8[a + 3] = (byte) x; 7116: a += 4; 7117: } 7118: if ((l & 0x1000) != 0) { 7119: int x = XEiJ.regRn[12]; 7120: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7121: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7122: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7123: MainMemory.mmrM8[a + 3] = (byte) x; 7124: a += 4; 7125: } 7126: if ((l & 0x2000) != 0) { 7127: int x = XEiJ.regRn[13]; 7128: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7129: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7130: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7131: MainMemory.mmrM8[a + 3] = (byte) x; 7132: a += 4; 7133: } 7134: if ((l & 0x4000) != 0) { 7135: int x = XEiJ.regRn[14]; 7136: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7137: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7138: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7139: MainMemory.mmrM8[a + 3] = (byte) x; 7140: a += 4; 7141: } 7142: if ((short) l < 0) { //(l & 0x8000) != 0 7143: int x = XEiJ.regRn[15]; 7144: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7145: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7146: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7147: MainMemory.mmrM8[a + 3] = (byte) x; 7148: a += 4; 7149: } 7150: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7151: for (int i = 0; i <= 15; i++) { 7152: if ((l & 0x0001 << i) != 0) { 7153: int x = XEiJ.regRn[i]; 7154: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7155: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7156: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7157: MainMemory.mmrM8[a + 3] = (byte) x; 7158: a += 4; 7159: } 7160: } 7161: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7162: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7163: for (int i = 0; l != 0; i++, l <<= 1) { 7164: if (l < 0) { 7165: int x = XEiJ.regRn[i]; 7166: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7167: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7168: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7169: MainMemory.mmrM8[a + 3] = (byte) x; 7170: a += 4; 7171: } 7172: } 7173: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7174: for (int i = 0; l != 0; i++, l >>>= 1) { 7175: if ((l & 1) != 0) { 7176: int x = XEiJ.regRn[i]; 7177: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7178: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7179: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7180: MainMemory.mmrM8[a + 3] = (byte) x; 7181: a += 4; 7182: } 7183: } 7184: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7185: for (int i = 0; l != 0; ) { 7186: int k = Integer.numberOfTrailingZeros (l); 7187: int x = XEiJ.regRn[i += k]; 7188: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7189: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7190: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7191: MainMemory.mmrM8[a + 3] = (byte) x; 7192: a += 4; 7193: l = l >>> k & ~1; 7194: } 7195: } 7196: a = t + (short) (a - t); 7197: } else { //メインメモリでないかページを跨ぐ可能性がある 7198: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7199: if ((l & 0x0001) != 0) { 7200: XEiJ.busWle (a, XEiJ.regRn[ 0]); 7201: a += 4; 7202: } 7203: if ((l & 0x0002) != 0) { 7204: XEiJ.busWle (a, XEiJ.regRn[ 1]); 7205: a += 4; 7206: } 7207: if ((l & 0x0004) != 0) { 7208: XEiJ.busWle (a, XEiJ.regRn[ 2]); 7209: a += 4; 7210: } 7211: if ((l & 0x0008) != 0) { 7212: XEiJ.busWle (a, XEiJ.regRn[ 3]); 7213: a += 4; 7214: } 7215: if ((l & 0x0010) != 0) { 7216: XEiJ.busWle (a, XEiJ.regRn[ 4]); 7217: a += 4; 7218: } 7219: if ((l & 0x0020) != 0) { 7220: XEiJ.busWle (a, XEiJ.regRn[ 5]); 7221: a += 4; 7222: } 7223: if ((l & 0x0040) != 0) { 7224: XEiJ.busWle (a, XEiJ.regRn[ 6]); 7225: a += 4; 7226: } 7227: if ((byte) l < 0) { //(l & 0x0080) != 0 7228: XEiJ.busWle (a, XEiJ.regRn[ 7]); 7229: a += 4; 7230: } 7231: if ((l & 0x0100) != 0) { 7232: XEiJ.busWle (a, XEiJ.regRn[ 8]); 7233: a += 4; 7234: } 7235: if ((l & 0x0200) != 0) { 7236: XEiJ.busWle (a, XEiJ.regRn[ 9]); 7237: a += 4; 7238: } 7239: if ((l & 0x0400) != 0) { 7240: XEiJ.busWle (a, XEiJ.regRn[10]); 7241: a += 4; 7242: } 7243: if ((l & 0x0800) != 0) { 7244: XEiJ.busWle (a, XEiJ.regRn[11]); 7245: a += 4; 7246: } 7247: if ((l & 0x1000) != 0) { 7248: XEiJ.busWle (a, XEiJ.regRn[12]); 7249: a += 4; 7250: } 7251: if ((l & 0x2000) != 0) { 7252: XEiJ.busWle (a, XEiJ.regRn[13]); 7253: a += 4; 7254: } 7255: if ((l & 0x4000) != 0) { 7256: XEiJ.busWle (a, XEiJ.regRn[14]); 7257: a += 4; 7258: } 7259: if ((short) l < 0) { //(l & 0x8000) != 0 7260: XEiJ.busWle (a, XEiJ.regRn[15]); 7261: a += 4; 7262: } 7263: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7264: for (int i = 0; i <= 15; i++) { 7265: if ((l & 0x0001 << i) != 0) { 7266: XEiJ.busWle (a, XEiJ.regRn[i]); 7267: a += 4; 7268: } 7269: } 7270: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7271: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7272: for (int i = 0; l != 0; i++, l <<= 1) { 7273: if (l < 0) { 7274: XEiJ.busWle (a, XEiJ.regRn[i]); 7275: a += 4; 7276: } 7277: } 7278: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7279: for (int i = 0; l != 0; i++, l >>>= 1) { 7280: if ((l & 1) != 0) { 7281: XEiJ.busWle (a, XEiJ.regRn[i]); 7282: a += 4; 7283: } 7284: } 7285: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7286: for (int i = 0; l != 0; ) { 7287: int k = Integer.numberOfTrailingZeros (l); 7288: XEiJ.busWle (a, XEiJ.regRn[i += k]); 7289: a += 4; 7290: l = l >>> k & ~1; 7291: } 7292: } 7293: } 7294: XEiJ.mpuCycleCount += 0 + (a - t << 1); //4バイト/個→8サイクル/個 7295: } 7296: } 7297: } //irpMovemToMemLong 7298: 7299: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7300: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7301: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7302: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7303: //TST.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_000_mmm_rrr 7304: public static void irpTstByte () throws M68kException { 7305: XEiJ.mpuCycleCount += 4; 7306: int ea = XEiJ.regOC & 63; 7307: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea)))]; //ccr_tst_byte。アドレッシングモードに注意 7308: } //irpTstByte 7309: 7310: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7311: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7312: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7313: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7314: //TST.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_001_mmm_rrr 7315: public static void irpTstWord () throws M68kException { 7316: XEiJ.mpuCycleCount += 4; 7317: int ea = XEiJ.regOC & 63; 7318: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea)); //アドレッシングモードに注意 7319: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 7320: } //irpTstWord 7321: 7322: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7323: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7324: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7325: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7326: //TST.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_010_mmm_rrr 7327: public static void irpTstLong () throws M68kException { 7328: XEiJ.mpuCycleCount += 4; 7329: int ea = XEiJ.regOC & 63; 7330: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRls (efaMltLong (ea)); //アドレッシングモードに注意 7331: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 7332: } //irpTstLong 7333: 7334: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7335: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7336: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7337: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7338: //TAS.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_011_mmm_rrr 7339: //ILLEGAL |-|012346|-|-----|-----| |0100_101_011_111_100 7340: public static void irpTas () throws M68kException { 7341: int ea = XEiJ.regOC & 63; 7342: int z; 7343: if (ea < XEiJ.EA_AR) { //TAS.B Dr 7344: XEiJ.mpuCycleCount += 4; 7345: XEiJ.regRn[ea] = 0x80 | (z = XEiJ.regRn[ea]); 7346: } else if (ea == XEiJ.EA_IM) { //ILLEGAL 7347: XEiJ.mpuCycleCount += 34; 7348: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 7349: throw M68kException.m6eSignal; 7350: } else { //TAS.B <mem> 7351: XEiJ.mpuCycleCount += 10; 7352: int a = efaMltByte (ea); 7353: XEiJ.busWb (a, 0x80 | (z = XEiJ.busRbs (a))); 7354: } 7355: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 7356: } //irpTas 7357: 7358: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7359: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7360: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7361: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7362: //SATS.L Dr |-|------|-|-UUUU|-**00|D |0100_110_010_000_rrr (ISA_B) 7363: //MOVEM.W <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll 7364: // 7365: //SATS.L Dr 7366: // VがセットされていたらDrを符号が逆で絶対値が最大の値にする(直前のDrに対する演算を飽和演算にする) 7367: public static void irpMovemToRegWord () throws M68kException { 7368: int ea = XEiJ.regOC & 63; 7369: if (ea < XEiJ.EA_AR) { //SATS.L Dr 7370: XEiJ.mpuCycleCount += 4; 7371: int z = XEiJ.regRn[ea]; 7372: if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 < 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) != 0) { //Vがセットされているとき 7373: XEiJ.regRn[ea] = z = z >> 31 ^ 0x80000000; //符号が逆で絶対値が最大の値にする 7374: } 7375: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 7376: } else { //MOVEM.W <ea>,<list> 7377: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 7378: XEiJ.regPC += 2; 7379: int arr, a; 7380: if (ea >> 3 == XEiJ.MMM_MP) { //(Ar)+ 7381: XEiJ.mpuCycleCount += 12; 7382: arr = ea - (XEiJ.EA_MP - 8); 7383: a = XEiJ.regRn[arr]; 7384: } else { //(Ar)+以外 7385: XEiJ.mpuCycleCount += 8; 7386: arr = 16; 7387: a = efaCntWord (ea); 7388: } 7389: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 7390: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 7391: M68kException.m6eAddress = a; 7392: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 7393: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 7394: throw M68kException.m6eSignal; 7395: } 7396: int t = a; 7397: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 7398: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 7399: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) { //16個転送してもページを跨がない 7400: a &= XEiJ.BUS_MOTHER_MASK; 7401: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7402: if ((l & 0x0001) != 0) { 7403: XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7404: a += 2; 7405: } 7406: if ((l & 0x0002) != 0) { 7407: XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7408: a += 2; 7409: } 7410: if ((l & 0x0004) != 0) { 7411: XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7412: a += 2; 7413: } 7414: if ((l & 0x0008) != 0) { 7415: XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7416: a += 2; 7417: } 7418: if ((l & 0x0010) != 0) { 7419: XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7420: a += 2; 7421: } 7422: if ((l & 0x0020) != 0) { 7423: XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7424: a += 2; 7425: } 7426: if ((l & 0x0040) != 0) { 7427: XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7428: a += 2; 7429: } 7430: if ((byte) l < 0) { //(l & 0x0080) != 0 7431: XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7432: a += 2; 7433: } 7434: if ((l & 0x0100) != 0) { 7435: XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7436: a += 2; 7437: } 7438: if ((l & 0x0200) != 0) { 7439: XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7440: a += 2; 7441: } 7442: if ((l & 0x0400) != 0) { 7443: XEiJ.regRn[10] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7444: a += 2; 7445: } 7446: if ((l & 0x0800) != 0) { 7447: XEiJ.regRn[11] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7448: a += 2; 7449: } 7450: if ((l & 0x1000) != 0) { 7451: XEiJ.regRn[12] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7452: a += 2; 7453: } 7454: if ((l & 0x2000) != 0) { 7455: XEiJ.regRn[13] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7456: a += 2; 7457: } 7458: if ((l & 0x4000) != 0) { 7459: XEiJ.regRn[14] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7460: a += 2; 7461: } 7462: if ((short) l < 0) { //(l & 0x8000) != 0 7463: XEiJ.regRn[15] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7464: a += 2; 7465: } 7466: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7467: for (int i = 0; i <= 15; i++) { 7468: if ((l & 0x0001 << i) != 0) { 7469: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7470: a += 2; 7471: } 7472: } 7473: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7474: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7475: for (int i = 0; l != 0; i++, l <<= 1) { 7476: if (l < 0) { 7477: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7478: a += 2; 7479: } 7480: } 7481: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7482: for (int i = 0; l != 0; i++, l >>>= 1) { 7483: if ((l & 1) != 0) { 7484: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7485: a += 2; 7486: } 7487: } 7488: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7489: for (int i = 0; l != 0; ) { 7490: int k = Integer.numberOfTrailingZeros (l); 7491: XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7492: a += 2; 7493: l = l >>> k & ~1; 7494: } 7495: } 7496: a = t + (short) (a - t); 7497: } else { //メインメモリでないかページを跨ぐ可能性がある 7498: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7499: if ((l & 0x0001) != 0) { 7500: XEiJ.regRn[ 0] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7501: a += 2; 7502: } 7503: if ((l & 0x0002) != 0) { 7504: XEiJ.regRn[ 1] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7505: a += 2; 7506: } 7507: if ((l & 0x0004) != 0) { 7508: XEiJ.regRn[ 2] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7509: a += 2; 7510: } 7511: if ((l & 0x0008) != 0) { 7512: XEiJ.regRn[ 3] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7513: a += 2; 7514: } 7515: if ((l & 0x0010) != 0) { 7516: XEiJ.regRn[ 4] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7517: a += 2; 7518: } 7519: if ((l & 0x0020) != 0) { 7520: XEiJ.regRn[ 5] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7521: a += 2; 7522: } 7523: if ((l & 0x0040) != 0) { 7524: XEiJ.regRn[ 6] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7525: a += 2; 7526: } 7527: if ((byte) l < 0) { //(l & 0x0080) != 0 7528: XEiJ.regRn[ 7] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7529: a += 2; 7530: } 7531: if ((l & 0x0100) != 0) { 7532: XEiJ.regRn[ 8] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7533: a += 2; 7534: } 7535: if ((l & 0x0200) != 0) { 7536: XEiJ.regRn[ 9] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7537: a += 2; 7538: } 7539: if ((l & 0x0400) != 0) { 7540: XEiJ.regRn[10] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7541: a += 2; 7542: } 7543: if ((l & 0x0800) != 0) { 7544: XEiJ.regRn[11] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7545: a += 2; 7546: } 7547: if ((l & 0x1000) != 0) { 7548: XEiJ.regRn[12] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7549: a += 2; 7550: } 7551: if ((l & 0x2000) != 0) { 7552: XEiJ.regRn[13] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7553: a += 2; 7554: } 7555: if ((l & 0x4000) != 0) { 7556: XEiJ.regRn[14] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7557: a += 2; 7558: } 7559: if ((short) l < 0) { //(l & 0x8000) != 0 7560: XEiJ.regRn[15] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7561: a += 2; 7562: } 7563: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7564: for (int i = 0; i <= 15; i++) { 7565: if ((l & 0x0001 << i) != 0) { 7566: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7567: a += 2; 7568: } 7569: } 7570: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7571: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7572: for (int i = 0; l != 0; i++, l <<= 1) { 7573: if (l < 0) { 7574: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7575: a += 2; 7576: } 7577: } 7578: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7579: for (int i = 0; l != 0; i++, l >>>= 1) { 7580: if ((l & 1) != 0) { 7581: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7582: a += 2; 7583: } 7584: } 7585: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7586: for (int i = 0; l != 0; ) { 7587: int k = Integer.numberOfTrailingZeros (l); 7588: XEiJ.regRn[i += k] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7589: a += 2; 7590: l = l >>> k & ~1; 7591: } 7592: } 7593: } 7594: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7595: //! 軽量化。MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするが省略する 7596: // MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する 7597: // RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、 7598: // 12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因 7599: } else { 7600: XEiJ.busRws (a); 7601: } 7602: //MOVEM.W (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする 7603: XEiJ.regRn[arr] = a; 7604: XEiJ.mpuCycleCount += a - t << 1; //2バイト/個→4サイクル/個 7605: } 7606: } //irpMovemToRegWord 7607: 7608: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7609: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7610: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7611: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7612: //MOVEM.L <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll 7613: public static void irpMovemToRegLong () throws M68kException { 7614: int ea = XEiJ.regOC & 63; 7615: { 7616: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 7617: XEiJ.regPC += 2; 7618: int arr, a; 7619: if (ea >> 3 == XEiJ.MMM_MP) { //(Ar)+ 7620: XEiJ.mpuCycleCount += 8; 7621: arr = ea - (XEiJ.EA_MP - 8); 7622: a = XEiJ.regRn[arr]; 7623: } else { //(Ar)+以外 7624: XEiJ.mpuCycleCount += 4; 7625: arr = 16; 7626: a = efaCntLong (ea); 7627: } 7628: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 7629: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 7630: M68kException.m6eAddress = a; 7631: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 7632: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 7633: throw M68kException.m6eSignal; 7634: } 7635: int t = a; 7636: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 7637: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 7638: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) { //16個転送してもページを跨がない 7639: a &= XEiJ.BUS_MOTHER_MASK; 7640: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7641: if ((l & 0x0001) != 0) { 7642: XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7643: a += 4; 7644: } 7645: if ((l & 0x0002) != 0) { 7646: XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7647: a += 4; 7648: } 7649: if ((l & 0x0004) != 0) { 7650: XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7651: a += 4; 7652: } 7653: if ((l & 0x0008) != 0) { 7654: XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7655: a += 4; 7656: } 7657: if ((l & 0x0010) != 0) { 7658: XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7659: a += 4; 7660: } 7661: if ((l & 0x0020) != 0) { 7662: XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7663: a += 4; 7664: } 7665: if ((l & 0x0040) != 0) { 7666: XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7667: a += 4; 7668: } 7669: if ((byte) l < 0) { //(l & 0x0080) != 0 7670: XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7671: a += 4; 7672: } 7673: if ((l & 0x0100) != 0) { 7674: XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7675: a += 4; 7676: } 7677: if ((l & 0x0200) != 0) { 7678: XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7679: a += 4; 7680: } 7681: if ((l & 0x0400) != 0) { 7682: XEiJ.regRn[10] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7683: a += 4; 7684: } 7685: if ((l & 0x0800) != 0) { 7686: XEiJ.regRn[11] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7687: a += 4; 7688: } 7689: if ((l & 0x1000) != 0) { 7690: XEiJ.regRn[12] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7691: a += 4; 7692: } 7693: if ((l & 0x2000) != 0) { 7694: XEiJ.regRn[13] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7695: a += 4; 7696: } 7697: if ((l & 0x4000) != 0) { 7698: XEiJ.regRn[14] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7699: a += 4; 7700: } 7701: if ((short) l < 0) { //(l & 0x8000) != 0 7702: XEiJ.regRn[15] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7703: a += 4; 7704: } 7705: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7706: for (int i = 0; i <= 15; i++) { 7707: if ((l & 0x0001 << i) != 0) { 7708: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7709: a += 4; 7710: } 7711: } 7712: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7713: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7714: for (int i = 0; l != 0; i++, l <<= 1) { 7715: if (l < 0) { 7716: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7717: a += 4; 7718: } 7719: } 7720: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7721: for (int i = 0; l != 0; i++, l >>>= 1) { 7722: if ((l & 1) != 0) { 7723: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7724: a += 4; 7725: } 7726: } 7727: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7728: for (int i = 0; l != 0; ) { 7729: int k = Integer.numberOfTrailingZeros (l); 7730: XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7731: a += 4; 7732: l = l >>> k & ~1; 7733: } 7734: } 7735: a = t + (short) (a - t); 7736: } else { //メインメモリでないかページを跨ぐ可能性がある 7737: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7738: if ((l & 0x0001) != 0) { 7739: XEiJ.regRn[ 0] = XEiJ.busRlse (a); 7740: a += 4; 7741: } 7742: if ((l & 0x0002) != 0) { 7743: XEiJ.regRn[ 1] = XEiJ.busRlse (a); 7744: a += 4; 7745: } 7746: if ((l & 0x0004) != 0) { 7747: XEiJ.regRn[ 2] = XEiJ.busRlse (a); 7748: a += 4; 7749: } 7750: if ((l & 0x0008) != 0) { 7751: XEiJ.regRn[ 3] = XEiJ.busRlse (a); 7752: a += 4; 7753: } 7754: if ((l & 0x0010) != 0) { 7755: XEiJ.regRn[ 4] = XEiJ.busRlse (a); 7756: a += 4; 7757: } 7758: if ((l & 0x0020) != 0) { 7759: XEiJ.regRn[ 5] = XEiJ.busRlse (a); 7760: a += 4; 7761: } 7762: if ((l & 0x0040) != 0) { 7763: XEiJ.regRn[ 6] = XEiJ.busRlse (a); 7764: a += 4; 7765: } 7766: if ((byte) l < 0) { //(l & 0x0080) != 0 7767: XEiJ.regRn[ 7] = XEiJ.busRlse (a); 7768: a += 4; 7769: } 7770: if ((l & 0x0100) != 0) { 7771: XEiJ.regRn[ 8] = XEiJ.busRlse (a); 7772: a += 4; 7773: } 7774: if ((l & 0x0200) != 0) { 7775: XEiJ.regRn[ 9] = XEiJ.busRlse (a); 7776: a += 4; 7777: } 7778: if ((l & 0x0400) != 0) { 7779: XEiJ.regRn[10] = XEiJ.busRlse (a); 7780: a += 4; 7781: } 7782: if ((l & 0x0800) != 0) { 7783: XEiJ.regRn[11] = XEiJ.busRlse (a); 7784: a += 4; 7785: } 7786: if ((l & 0x1000) != 0) { 7787: XEiJ.regRn[12] = XEiJ.busRlse (a); 7788: a += 4; 7789: } 7790: if ((l & 0x2000) != 0) { 7791: XEiJ.regRn[13] = XEiJ.busRlse (a); 7792: a += 4; 7793: } 7794: if ((l & 0x4000) != 0) { 7795: XEiJ.regRn[14] = XEiJ.busRlse (a); 7796: a += 4; 7797: } 7798: if ((short) l < 0) { //(l & 0x8000) != 0 7799: XEiJ.regRn[15] = XEiJ.busRlse (a); 7800: a += 4; 7801: } 7802: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7803: for (int i = 0; i <= 15; i++) { 7804: if ((l & 0x0001 << i) != 0) { 7805: XEiJ.regRn[i] = XEiJ.busRlse (a); 7806: a += 4; 7807: } 7808: } 7809: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7810: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7811: for (int i = 0; l != 0; i++, l <<= 1) { 7812: if (l < 0) { 7813: XEiJ.regRn[i] = XEiJ.busRlse (a); 7814: a += 4; 7815: } 7816: } 7817: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7818: for (int i = 0; l != 0; i++, l >>>= 1) { 7819: if ((l & 1) != 0) { 7820: XEiJ.regRn[i] = XEiJ.busRlse (a); 7821: a += 4; 7822: } 7823: } 7824: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7825: for (int i = 0; l != 0; ) { 7826: int k = Integer.numberOfTrailingZeros (l); 7827: XEiJ.regRn[i += k] = XEiJ.busRlse (a); 7828: a += 4; 7829: l = l >>> k & ~1; 7830: } 7831: } 7832: } 7833: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7834: //! 軽量化。MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするが省略する 7835: // MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する 7836: // RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、 7837: // 12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因 7838: } else { 7839: XEiJ.busRws (a); 7840: } 7841: //MOVEM.L (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする 7842: XEiJ.regRn[arr] = a; //XEiJ.regRn[arr]は破壊されているのでXEiJ.regRn[arr]+=a-=tは不可 7843: XEiJ.mpuCycleCount += a - t << 1; //4バイト/個→8サイクル/個 7844: } 7845: } //irpMovemToRegLong 7846: 7847: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7848: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7849: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7850: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7851: //TRAP #<vector> |-|012346|-|-----|-----| |0100_111_001_00v_vvv 7852: public static void irpTrap () throws M68kException { 7853: XEiJ.mpuCycleCount += 34; 7854: if (XEiJ.MPU_INLINE_EXCEPTION) { 7855: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 7856: int sp = XEiJ.regRn[15]; 7857: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 7858: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7859: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 7860: XEiJ.mpuUSP = sp; //USPを保存 7861: sp = XEiJ.mpuISP; //SSPを復元 7862: if (DataBreakPoint.DBP_ON) { 7863: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 7864: } else { 7865: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 7866: } 7867: if (InstructionBreakPoint.IBP_ON) { 7868: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 7869: } 7870: } 7871: int vectorOffset = XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR) << 2; //vector offset 7872: XEiJ.regRn[15] = sp -= 8; //short format 7873: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 7874: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 7875: XEiJ.busWw (sp, save_sr); //status register 7876: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 7877: } else { 7878: irpException (XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR), XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 7879: } 7880: } //irpTrap 7881: public static void irpTrap15 () throws M68kException { 7882: if ((XEiJ.regRn[0] & 255) == 0x8e) { //IOCS _BOOTINF 7883: MainMemory.mmrCheckHuman (); 7884: } 7885: XEiJ.mpuCycleCount += 34; 7886: if (XEiJ.MPU_INLINE_EXCEPTION) { 7887: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 7888: int sp = XEiJ.regRn[15]; 7889: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 7890: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7891: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 7892: XEiJ.mpuUSP = sp; //USPを保存 7893: sp = XEiJ.mpuISP; //SSPを復元 7894: if (DataBreakPoint.DBP_ON) { 7895: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 7896: } else { 7897: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 7898: } 7899: if (InstructionBreakPoint.IBP_ON) { 7900: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 7901: } 7902: } 7903: int vectorOffset = M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR << 2; //vector offset 7904: XEiJ.regRn[15] = sp -= 8; //short format 7905: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 7906: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 7907: XEiJ.busWw (sp, save_sr); //status register 7908: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 7909: } else { 7910: irpException (M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 7911: } 7912: } //irpTrap15 7913: 7914: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7915: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7916: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7917: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7918: //LINK.W Ar,#<data> |-|012346|-|-----|-----| |0100_111_001_010_rrr-{data} 7919: // 7920: //LINK.W Ar,#<data> 7921: // PEA.L (Ar);MOVEA.L A7,Ar;ADDA.W #<data>,A7と同じ 7922: // LINK.W A7,#<data>はA7をデクリメントする前の値がプッシュされ、A7に#<data>が加算される 7923: public static void irpLinkWord () throws M68kException { 7924: XEiJ.mpuCycleCount += 16; 7925: int arr = XEiJ.regOC - (0b0100_111_001_010_000 - 8); 7926: //評価順序に注意 7927: // wl(r[15]-=4,r[8+rrr])は不可 7928: int sp = XEiJ.regRn[15] - 4; 7929: XEiJ.busWl (sp, XEiJ.regRn[arr]); //pushl 7930: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 7931: XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 7932: } else { 7933: int t = XEiJ.regPC; 7934: XEiJ.regPC = t + 2; 7935: XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse (t); //pcws 7936: } 7937: } //irpLinkWord 7938: 7939: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7940: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7941: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7942: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7943: //UNLK Ar |-|012346|-|-----|-----| |0100_111_001_011_rrr 7944: // 7945: //UNLK Ar 7946: // MOVEA.L Ar,A7;MOVEA.L (A7)+,Arと同じ 7947: // UNLK A7はMOVEA.L A7,A7;MOVEA.L (A7)+,A7すなわちMOVEA.L (A7),A7と同じ 7948: // ソースオペランドのポストインクリメントはデスティネーションオペランドが評価される前に完了しているとみなされる 7949: // 例えばMOVE.L (A0)+,(A0)+はMOVE.L (A0),(4,A0);ADDQ.L #8,A0と同じ 7950: // MOVEA.L (A0)+,A0はポストインクリメントされたA0が(A0)から読み出された値で上書きされるのでMOVEA.L (A0),A0と同じ 7951: // M68000PRMにUNLK Anの動作はAn→SP;(SP)→An;SP+4→SPだと書かれているがこれはn=7の場合に当てはまらない 7952: // 余談だが68040の初期のマスクセットはUNLK A7を実行すると固まるらしい 7953: public static void irpUnlk () throws M68kException { 7954: XEiJ.mpuCycleCount += 12; 7955: int arr = XEiJ.regOC - (0b0100_111_001_011_000 - 8); 7956: //評価順序に注意 7957: int sp = XEiJ.regRn[arr]; 7958: XEiJ.regRn[15] = sp + 4; 7959: XEiJ.regRn[arr] = XEiJ.busRls (sp); //popls 7960: } //irpUnlk 7961: 7962: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7963: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7964: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7965: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7966: //MOVE.L Ar,USP |-|012346|P|-----|-----| |0100_111_001_100_rrr 7967: public static void irpMoveToUsp () throws M68kException { 7968: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7969: XEiJ.mpuCycleCount += 34; 7970: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7971: throw M68kException.m6eSignal; 7972: } 7973: //以下はスーパーバイザモード 7974: XEiJ.mpuCycleCount += 4; 7975: XEiJ.mpuUSP = XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_100_000 - 8)]; 7976: } //irpMoveToUsp 7977: 7978: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7979: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7980: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7981: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7982: //MOVE.L USP,Ar |-|012346|P|-----|-----| |0100_111_001_101_rrr 7983: public static void irpMoveFromUsp () throws M68kException { 7984: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7985: XEiJ.mpuCycleCount += 34; 7986: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7987: throw M68kException.m6eSignal; 7988: } 7989: //以下はスーパーバイザモード 7990: XEiJ.mpuCycleCount += 4; 7991: XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_101_000 - 8)] = XEiJ.mpuUSP; 7992: } //irpMoveFromUsp 7993: 7994: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7995: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7996: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7997: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7998: //RESET |-|012346|P|-----|-----| |0100_111_001_110_000 7999: public static void irpReset () throws M68kException { 8000: if (XEiJ.regSRS == 0) { //ユーザモードのとき 8001: XEiJ.mpuCycleCount += 34; 8002: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 8003: throw M68kException.m6eSignal; 8004: } 8005: //以下はスーパーバイザモード 8006: XEiJ.mpuCycleCount += 132; 8007: XEiJ.irpReset (); 8008: } //irpReset 8009: 8010: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8011: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8012: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8013: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8014: //NOP |-|012346|-|-----|-----| |0100_111_001_110_001 8015: public static void irpNop () throws M68kException { 8016: XEiJ.mpuCycleCount += 4; 8017: //何もしない 8018: } //irpNop 8019: 8020: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8021: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8022: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8023: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8024: //STOP #<data> |-|012346|P|UUUUU|*****| |0100_111_001_110_010-{data} 8025: // 8026: //STOP #<data> 8027: // 1. #<data>をsrに設定する 8028: // 2. pcを進める 8029: // 3. 以下のいずれかの条件が成立するまで停止する 8030: // 3a. トレース 8031: // 3b. マスクされているレベルよりも高い割り込み要求 8032: // 3c. リセット 8033: // コアと一緒にデバイスを止めるわけにいかないので、ここでは条件が成立するまで同じ命令を繰り返すループ命令として実装する 8034: public static void irpStop () throws M68kException { 8035: if (XEiJ.regSRS == 0) { //ユーザモードのとき 8036: XEiJ.mpuCycleCount += 34; 8037: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 8038: throw M68kException.m6eSignal; 8039: } 8040: //以下はスーパーバイザモード 8041: XEiJ.mpuCycleCount += 4; 8042: irpSetSR (XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 8043: if (XEiJ.mpuTraceFlag == 0) { //トレースまたはマスクされているレベルよりも高い割り込み要求がない 8044: XEiJ.regPC = XEiJ.regPC0; //ループ 8045: //任意の負荷率を100%に設定しているときSTOP命令が軽すぎると動作周波数が大きくなりすぎて割り込みがかかったとき次に進めなくなる 8046: //負荷率の計算にSTOP命令で止まっていた時間を含めないことにする 8047: XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000; //4μs。10MHzのとき40clk 8048: XEiJ.mpuLastNano += 4000L; 8049: } 8050: } //irpStop 8051: 8052: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8053: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8054: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8055: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8056: //RTE |-|012346|P|UUUUU|*****| |0100_111_001_110_011 8057: public static void irpRte () throws M68kException { 8058: if (XEiJ.regSRS == 0) { //ユーザモードのとき 8059: XEiJ.mpuCycleCount += 34; 8060: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 8061: throw M68kException.m6eSignal; 8062: } 8063: //以下はスーパーバイザモード 8064: XEiJ.mpuCycleCount += 20; 8065: int sp = XEiJ.regRn[15]; 8066: int format = XEiJ.busRws (sp + 6) >>> 12; 8067: int frameSize; 8068: if (format == 0x0) { //010,020,030,040,060 8069: frameSize = 8; 8070: } else if (format == 0x8) { //010 8071: frameSize = 58; 8072: } else { 8073: M68kException.m6eNumber = M68kException.M6E_FORMAT_ERROR; 8074: throw M68kException.m6eSignal; 8075: } 8076: XEiJ.regRn[15] = sp + frameSize; 8077: int newSR = XEiJ.busRwz (sp); //popwz。ここでバスエラーが生じる可能性がある 8078: int newPC = XEiJ.busRls (sp + 2); //popls 8079: //irpSetSRでモードが切り替わる場合があるのでその前にr[15]を更新しておくこと 8080: irpSetSR (newSR); //ここでユーザモードに戻る場合がある。特権違反チェックが先 8081: irpSetPC (newPC); //分岐ログが新しいsrを使う。順序に注意 8082: } //irpRte 8083: 8084: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8085: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8086: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8087: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8088: //RTD #<data> |-|-12346|-|-----|-----| |0100_111_001_110_100-{data} 8089: public static void irpRtd () throws M68kException { 8090: XEiJ.mpuCycleCount += 20; 8091: int sp = XEiJ.regRn[15]; 8092: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 8093: XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 8094: } else { 8095: int t = XEiJ.regPC; 8096: XEiJ.regPC = t + 2; 8097: XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse (t); //pcws 8098: } 8099: irpSetPC (XEiJ.busRls (sp)); //popls 8100: } //irpRtd 8101: 8102: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8103: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8104: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8105: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8106: //RTS |-|012346|-|-----|-----| |0100_111_001_110_101 8107: public static void irpRts () throws M68kException { 8108: XEiJ.mpuCycleCount += 16; 8109: int sp = XEiJ.regRn[15]; 8110: XEiJ.regRn[15] = sp + 4; 8111: irpSetPC (XEiJ.busRls (sp)); //popls 8112: } //irpRts 8113: 8114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8115: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8116: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8117: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8118: //TRAPV |-|012346|-|---*-|-----| |0100_111_001_110_110 8119: public static void irpTrapv () throws M68kException { 8120: if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 >= 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) == 0) { //通過 8121: XEiJ.mpuCycleCount += 4; 8122: } else { 8123: XEiJ.mpuCycleCount += 34; 8124: M68kException.m6eNumber = M68kException.M6E_TRAPV_INSTRUCTION; 8125: throw M68kException.m6eSignal; 8126: } 8127: } //irpTrapv 8128: 8129: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8130: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8131: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8132: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8133: //RTR |-|012346|-|UUUUU|*****| |0100_111_001_110_111 8134: public static void irpRtr () throws M68kException { 8135: XEiJ.mpuCycleCount += 20; 8136: int sp = XEiJ.regRn[15]; 8137: XEiJ.regRn[15] = sp + 6; 8138: XEiJ.regCCR = XEiJ.REG_CCR_MASK & XEiJ.busRwz (sp); //popwz 8139: irpSetPC (XEiJ.busRlse (sp + 2)); //popls。ccrを読めたのだからspは奇数ではない 8140: } //irpRtr 8141: 8142: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8143: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8144: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8145: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8146: //MOVEC.L Rc,Rn |-|-12346|P|-----|-----| |0100_111_001_111_010-rnnncccccccccccc 8147: public static void irpMovecFromControl () throws M68kException { 8148: if (XEiJ.regSRS == 0) { //ユーザモードのとき 8149: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 8150: throw M68kException.m6eSignal; 8151: } 8152: //以下はスーパーバイザモード 8153: XEiJ.mpuCycleCount += 10; 8154: int w; 8155: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 8156: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 8157: } else { 8158: w = XEiJ.regPC; 8159: XEiJ.regPC = w + 2; 8160: w = XEiJ.busRwze (w); //pcwz。拡張ワード 8161: } 8162: switch (w & 0x0fff) { 8163: case 0x000: //SFC 8164: XEiJ.regRn[w >> 12] = XEiJ.mpuSFC; 8165: break; 8166: case 0x001: //DFC 8167: XEiJ.regRn[w >> 12] = XEiJ.mpuDFC; 8168: break; 8169: case 0x801: //VBR 8170: XEiJ.regRn[w >> 12] = XEiJ.mpuVBR; 8171: break; 8172: default: 8173: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 8174: throw M68kException.m6eSignal; 8175: } 8176: } //irpMovecFromControl 8177: 8178: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8179: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8180: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8181: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8182: //MOVEC.L Rn,Rc |-|-12346|P|-----|-----| |0100_111_001_111_011-rnnncccccccccccc 8183: public static void irpMovecToControl () throws M68kException { 8184: if (XEiJ.regSRS == 0) { //ユーザモードのとき 8185: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 8186: throw M68kException.m6eSignal; 8187: } 8188: //以下はスーパーバイザモード 8189: XEiJ.mpuCycleCount += 12; 8190: int w; 8191: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 8192: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 8193: } else { 8194: w = XEiJ.regPC; 8195: XEiJ.regPC = w + 2; 8196: w = XEiJ.busRwze (w); //pcwz。拡張ワード 8197: } 8198: int d = XEiJ.regRn[w >> 12]; 8199: switch (w & 0x0fff) { 8200: case 0x000: //SFC 8201: XEiJ.mpuSFC = d & 0x00000007; 8202: break; 8203: case 0x001: //DFC 8204: XEiJ.mpuDFC = d & 0x00000007; 8205: break; 8206: case 0x801: //VBR 8207: XEiJ.mpuVBR = d & -4; //4の倍数でないと困る 8208: break; 8209: default: 8210: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 8211: throw M68kException.m6eSignal; 8212: } 8213: } //irpMovecToControl 8214: 8215: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8216: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8217: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8219: //JSR <ea> |-|012346|-|-----|-----| M WXZP |0100_111_010_mmm_rrr 8220: //JBSR.L <label> |A|012346|-|-----|-----| |0100_111_010_111_001-{address} [JSR <label>] 8221: public static void irpJsr () throws M68kException { 8222: XEiJ.mpuCycleCount += 16 - 8; 8223: int a = efaJmpJsr (XEiJ.regOC & 63); //プッシュする前に実効アドレスを計算する 8224: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 8225: irpSetPC (a); 8226: } //irpJsr 8227: 8228: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8229: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8230: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8231: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8232: //JMP <ea> |-|012346|-|-----|-----| M WXZP |0100_111_011_mmm_rrr 8233: //JBRA.L <label> |A|012346|-|-----|-----| |0100_111_011_111_001-{address} [JMP <label>] 8234: public static void irpJmp () throws M68kException { 8235: //XEiJ.mpuCycleCount += 8 - 8; 8236: irpSetPC (efaJmpJsr (XEiJ.regOC & 63)); 8237: } //irpJmp 8238: 8239: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8240: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8241: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8242: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8243: //ADDQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_000_mmm_rrr 8244: //INC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>] 8245: public static void irpAddqByte () throws M68kException { 8246: int ea = XEiJ.regOC & 63; 8247: int x; 8248: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8249: int z; 8250: if (ea < XEiJ.EA_AR) { //ADDQ.B #<data>,Dr 8251: XEiJ.mpuCycleCount += 4; 8252: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y); 8253: } else { //ADDQ.B #<data>,<mem> 8254: XEiJ.mpuCycleCount += 8; 8255: int a = efaMltByte (ea); 8256: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y)); 8257: } 8258: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8259: (~x & z) >>> 31 << 1 | 8260: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 8261: } //irpAddqByte 8262: 8263: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8264: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8265: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8266: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8267: //ADDQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_001_mmm_rrr 8268: //ADDQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_001_001_rrr 8269: //INC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>] 8270: //INC.W Ar |A|012346|-|-----|-----| A |0101_001_001_001_rrr [ADDQ.W #1,Ar] 8271: // 8272: //ADDQ.W #<data>,Ar 8273: // ソースを符号拡張してロングで加算する 8274: public static void irpAddqWord () throws M68kException { 8275: int ea = XEiJ.regOC & 63; 8276: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8277: if (ea >> 3 == XEiJ.MMM_AR) { //ADDQ.W #<data>,Ar 8278: XEiJ.mpuCycleCount += 8; //MC68000 User's Manualに4と書いてあるのは8の間違い 8279: XEiJ.regRn[ea] += y; //ロングで計算する。このr[ea]はアドレスレジスタ 8280: //ccrは操作しない 8281: } else { 8282: int x; 8283: int z; 8284: if (ea < XEiJ.EA_AR) { //ADDQ.W #<data>,Dr 8285: XEiJ.mpuCycleCount += 4; 8286: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y)); 8287: } else { //ADDQ.W #<data>,<mem> 8288: XEiJ.mpuCycleCount += 8; 8289: int a = efaMltWord (ea); 8290: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y)); 8291: } 8292: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8293: (~x & z) >>> 31 << 1 | 8294: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 8295: } 8296: } //irpAddqWord 8297: 8298: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8299: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8300: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8301: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8302: //ADDQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_010_mmm_rrr 8303: //ADDQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_010_001_rrr 8304: //INC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>] 8305: //INC.L Ar |A|012346|-|-----|-----| A |0101_001_010_001_rrr [ADDQ.L #1,Ar] 8306: public static void irpAddqLong () throws M68kException { 8307: int ea = XEiJ.regOC & 63; 8308: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8309: if (ea >> 3 == XEiJ.MMM_AR) { //ADDQ.L #<data>,Ar 8310: XEiJ.mpuCycleCount += 8; 8311: XEiJ.regRn[ea] += y; //このr[ea]はアドレスレジスタ 8312: //ccrは操作しない 8313: } else { 8314: int x; 8315: int z; 8316: if (ea < XEiJ.EA_AR) { //ADDQ.L #<data>,Dr 8317: XEiJ.mpuCycleCount += 8; 8318: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y; 8319: } else { //ADDQ.L #<data>,<mem> 8320: XEiJ.mpuCycleCount += 12; 8321: int a = efaMltLong (ea); 8322: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y); 8323: } 8324: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8325: (~x & z) >>> 31 << 1 | 8326: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 8327: } 8328: } //irpAddqLong 8329: 8330: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8331: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8332: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8333: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8334: //ST.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr 8335: //SNF.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr [ST.B <ea>] 8336: //DBT.W Dr,<label> |-|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} 8337: //DBNF.W Dr,<label> |A|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} [DBT.W Dr,<label>] 8338: public static void irpSt () throws M68kException { 8339: int ea = XEiJ.regOC & 63; 8340: //DBT.W Dr,<label>よりもST.B Drを優先する 8341: if (ea < XEiJ.EA_AR) { //ST.B Dr 8342: XEiJ.mpuCycleCount += 6; 8343: XEiJ.regRn[ea] |= 0xff; 8344: } else if (ea < XEiJ.EA_MM) { //DBT.W Dr,<label> 8345: //条件が成立しているので通過 8346: XEiJ.mpuCycleCount += 12; 8347: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8348: //リードを省略する 8349: } else { 8350: XEiJ.busRws (XEiJ.regPC); 8351: } 8352: XEiJ.regPC += 2; 8353: } else { //ST.B <mem> 8354: XEiJ.mpuCycleCount += 8; 8355: XEiJ.busWb (efaMltByte (ea), 0xff); 8356: } 8357: } //irpSt 8358: 8359: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8360: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8361: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8362: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8363: //SUBQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_100_mmm_rrr 8364: //DEC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>] 8365: public static void irpSubqByte () throws M68kException { 8366: int ea = XEiJ.regOC & 63; 8367: int x; 8368: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8369: int z; 8370: if (ea < XEiJ.EA_AR) { //SUBQ.B #<data>,Dr 8371: XEiJ.mpuCycleCount += 4; 8372: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y); 8373: } else { //SUBQ.B #<data>,<mem> 8374: XEiJ.mpuCycleCount += 8; 8375: int a = efaMltByte (ea); 8376: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y)); 8377: } 8378: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8379: (x & ~z) >>> 31 << 1 | 8380: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 8381: } //irpSubqByte 8382: 8383: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8384: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8385: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8387: //SUBQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_101_mmm_rrr 8388: //SUBQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_101_001_rrr 8389: //DEC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>] 8390: //DEC.W Ar |A|012346|-|-----|-----| A |0101_001_101_001_rrr [SUBQ.W #1,Ar] 8391: // 8392: //SUBQ.W #<data>,Ar 8393: // ソースを符号拡張してロングで減算する 8394: public static void irpSubqWord () throws M68kException { 8395: int ea = XEiJ.regOC & 63; 8396: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8397: if (ea >> 3 == XEiJ.MMM_AR) { //SUBQ.W #<data>,Ar 8398: XEiJ.mpuCycleCount += 8; 8399: XEiJ.regRn[ea] -= y; //ロングで計算する。このr[ea]はアドレスレジスタ 8400: //ccrは操作しない 8401: } else { 8402: int x; 8403: int z; 8404: if (ea < XEiJ.EA_AR) { //SUBQ.W #<data>,Dr 8405: XEiJ.mpuCycleCount += 4; 8406: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y)); 8407: } else { //SUBQ.W #<data>,<mem> 8408: XEiJ.mpuCycleCount += 8; 8409: int a = efaMltWord (ea); 8410: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y)); 8411: } 8412: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8413: (x & ~z) >>> 31 << 1 | 8414: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 8415: } 8416: } //irpSubqWord 8417: 8418: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8419: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8420: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8421: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8422: //SUBQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_110_mmm_rrr 8423: //SUBQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_110_001_rrr 8424: //DEC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>] 8425: //DEC.L Ar |A|012346|-|-----|-----| A |0101_001_110_001_rrr [SUBQ.L #1,Ar] 8426: public static void irpSubqLong () throws M68kException { 8427: int ea = XEiJ.regOC & 63; 8428: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8429: if (ea >> 3 == XEiJ.MMM_AR) { //SUBQ.L #<data>,Ar 8430: XEiJ.mpuCycleCount += 8; 8431: XEiJ.regRn[ea] -= y; //このr[ea]はアドレスレジスタ 8432: //ccrは操作しない 8433: } else { 8434: int x; 8435: int z; 8436: if (ea < XEiJ.EA_AR) { //SUBQ.L #<data>,Dr 8437: XEiJ.mpuCycleCount += 8; 8438: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y; 8439: } else { //SUBQ.L #<data>,<mem> 8440: XEiJ.mpuCycleCount += 12; 8441: int a = efaMltLong (ea); 8442: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y); 8443: } 8444: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8445: (x & ~z) >>> 31 << 1 | 8446: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 8447: } 8448: } //irpSubqLong 8449: 8450: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8451: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8452: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8453: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8454: //SF.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr 8455: //SNT.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr [SF.B <ea>] 8456: //DBF.W Dr,<label> |-|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} 8457: //DBNT.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 8458: //DBRA.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 8459: public static void irpSf () throws M68kException { 8460: int ea = XEiJ.regOC & 63; 8461: //DBRA.W Dr,<label>よりもSF.B Drを優先する 8462: if (ea < XEiJ.EA_AR) { //SF.B Dr 8463: XEiJ.mpuCycleCount += 4; 8464: XEiJ.regRn[ea] &= ~0xff; 8465: } else if (ea < XEiJ.EA_MM) { //DBRA.W Dr,<label> 8466: //条件が成立していないのでデクリメント 8467: int rrr = XEiJ.regOC & 7; 8468: int t = XEiJ.regRn[rrr]; 8469: if ((short) t == 0) { //Drの下位16bitが0なので通過 8470: XEiJ.mpuCycleCount += 14; 8471: XEiJ.regRn[rrr] = t + 65535; 8472: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8473: //リードを省略する 8474: } else { 8475: XEiJ.busRws (XEiJ.regPC); 8476: } 8477: XEiJ.regPC += 2; 8478: } else { //Drの下位16bitが0でないのでジャンプ 8479: XEiJ.mpuCycleCount += 10; 8480: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8481: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8482: } 8483: } else { //SF.B <mem> 8484: XEiJ.mpuCycleCount += 8; 8485: XEiJ.busWb (efaMltByte (ea), 0x00); 8486: } 8487: } //irpSf 8488: 8489: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8490: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8491: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8492: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8493: //SHI.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr 8494: //SNLS.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr [SHI.B <ea>] 8495: //DBHI.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} 8496: //DBNLS.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} [DBHI.W Dr,<label>] 8497: public static void irpShi () throws M68kException { 8498: int ea = XEiJ.regOC & 63; 8499: if (ea >> 3 == XEiJ.MMM_AR) { //DBHI.W Dr,<label> 8500: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { 8501: //条件が成立しているので通過 8502: XEiJ.mpuCycleCount += 12; 8503: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8504: //リードを省略する 8505: } else { 8506: XEiJ.busRws (XEiJ.regPC); 8507: } 8508: XEiJ.regPC += 2; 8509: } else { 8510: //条件が成立していないのでデクリメント 8511: int rrr = XEiJ.regOC & 7; 8512: int t = XEiJ.regRn[rrr]; 8513: if ((short) t == 0) { //Drの下位16bitが0なので通過 8514: XEiJ.mpuCycleCount += 14; 8515: XEiJ.regRn[rrr] = t + 65535; 8516: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8517: //リードを省略する 8518: } else { 8519: XEiJ.busRws (XEiJ.regPC); 8520: } 8521: XEiJ.regPC += 2; 8522: } else { //Drの下位16bitが0でないのでジャンプ 8523: XEiJ.mpuCycleCount += 10; 8524: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8525: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8526: } 8527: } 8528: } else if (ea < XEiJ.EA_AR) { //SHI.B Dr 8529: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //セット 8530: XEiJ.mpuCycleCount += 6; 8531: XEiJ.regRn[ea] |= 0xff; 8532: } else { //クリア 8533: XEiJ.mpuCycleCount += 4; 8534: XEiJ.regRn[ea] &= ~0xff; 8535: } 8536: } else { //SHI.B <mem> 8537: XEiJ.mpuCycleCount += 8; 8538: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HI << XEiJ.regCCR >> 31); 8539: } 8540: } //irpShi 8541: 8542: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8543: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8544: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8545: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8546: //SLS.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr 8547: //SNHI.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr [SLS.B <ea>] 8548: //DBLS.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} 8549: //DBNHI.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} [DBLS.W Dr,<label>] 8550: public static void irpSls () throws M68kException { 8551: int ea = XEiJ.regOC & 63; 8552: if (ea >> 3 == XEiJ.MMM_AR) { //DBLS.W Dr,<label> 8553: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { 8554: //条件が成立しているので通過 8555: XEiJ.mpuCycleCount += 12; 8556: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8557: //リードを省略する 8558: } else { 8559: XEiJ.busRws (XEiJ.regPC); 8560: } 8561: XEiJ.regPC += 2; 8562: } else { 8563: //条件が成立していないのでデクリメント 8564: int rrr = XEiJ.regOC & 7; 8565: int t = XEiJ.regRn[rrr]; 8566: if ((short) t == 0) { //Drの下位16bitが0なので通過 8567: XEiJ.mpuCycleCount += 14; 8568: XEiJ.regRn[rrr] = t + 65535; 8569: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8570: //リードを省略する 8571: } else { 8572: XEiJ.busRws (XEiJ.regPC); 8573: } 8574: XEiJ.regPC += 2; 8575: } else { //Drの下位16bitが0でないのでジャンプ 8576: XEiJ.mpuCycleCount += 10; 8577: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8578: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8579: } 8580: } 8581: } else if (ea < XEiJ.EA_AR) { //SLS.B Dr 8582: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //セット 8583: XEiJ.mpuCycleCount += 6; 8584: XEiJ.regRn[ea] |= 0xff; 8585: } else { //クリア 8586: XEiJ.mpuCycleCount += 4; 8587: XEiJ.regRn[ea] &= ~0xff; 8588: } 8589: } else { //SLS.B <mem> 8590: XEiJ.mpuCycleCount += 8; 8591: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LS << XEiJ.regCCR >> 31); 8592: } 8593: } //irpSls 8594: 8595: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8596: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8597: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8598: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8599: //SCC.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr 8600: //SHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8601: //SNCS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8602: //SNLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8603: //DBCC.W Dr,<label> |-|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} 8604: //DBHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8605: //DBNCS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8606: //DBNLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8607: public static void irpShs () throws M68kException { 8608: int ea = XEiJ.regOC & 63; 8609: if (ea >> 3 == XEiJ.MMM_AR) { //DBHS.W Dr,<label> 8610: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { 8611: //条件が成立しているので通過 8612: XEiJ.mpuCycleCount += 12; 8613: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8614: //リードを省略する 8615: } else { 8616: XEiJ.busRws (XEiJ.regPC); 8617: } 8618: XEiJ.regPC += 2; 8619: } else { 8620: //条件が成立していないのでデクリメント 8621: int rrr = XEiJ.regOC & 7; 8622: int t = XEiJ.regRn[rrr]; 8623: if ((short) t == 0) { //Drの下位16bitが0なので通過 8624: XEiJ.mpuCycleCount += 14; 8625: XEiJ.regRn[rrr] = t + 65535; 8626: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8627: //リードを省略する 8628: } else { 8629: XEiJ.busRws (XEiJ.regPC); 8630: } 8631: XEiJ.regPC += 2; 8632: } else { //Drの下位16bitが0でないのでジャンプ 8633: XEiJ.mpuCycleCount += 10; 8634: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8635: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8636: } 8637: } 8638: } else if (ea < XEiJ.EA_AR) { //SHS.B Dr 8639: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //セット 8640: XEiJ.mpuCycleCount += 6; 8641: XEiJ.regRn[ea] |= 0xff; 8642: } else { //クリア 8643: XEiJ.mpuCycleCount += 4; 8644: XEiJ.regRn[ea] &= ~0xff; 8645: } 8646: } else { //SHS.B <mem> 8647: XEiJ.mpuCycleCount += 8; 8648: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HS << XEiJ.regCCR >> 31); 8649: } 8650: } //irpShs 8651: 8652: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8653: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8654: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8655: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8656: //SCS.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr 8657: //SLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8658: //SNCC.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8659: //SNHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8660: //DBCS.W Dr,<label> |-|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} 8661: //DBLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8662: //DBNCC.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8663: //DBNHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8664: public static void irpSlo () throws M68kException { 8665: int ea = XEiJ.regOC & 63; 8666: if (ea >> 3 == XEiJ.MMM_AR) { //DBLO.W Dr,<label> 8667: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { 8668: //条件が成立しているので通過 8669: XEiJ.mpuCycleCount += 12; 8670: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8671: //リードを省略する 8672: } else { 8673: XEiJ.busRws (XEiJ.regPC); 8674: } 8675: XEiJ.regPC += 2; 8676: } else { 8677: //条件が成立していないのでデクリメント 8678: int rrr = XEiJ.regOC & 7; 8679: int t = XEiJ.regRn[rrr]; 8680: if ((short) t == 0) { //Drの下位16bitが0なので通過 8681: XEiJ.mpuCycleCount += 14; 8682: XEiJ.regRn[rrr] = t + 65535; 8683: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8684: //リードを省略する 8685: } else { 8686: XEiJ.busRws (XEiJ.regPC); 8687: } 8688: XEiJ.regPC += 2; 8689: } else { //Drの下位16bitが0でないのでジャンプ 8690: XEiJ.mpuCycleCount += 10; 8691: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8692: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8693: } 8694: } 8695: } else if (ea < XEiJ.EA_AR) { //SLO.B Dr 8696: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //セット 8697: XEiJ.mpuCycleCount += 6; 8698: XEiJ.regRn[ea] |= 0xff; 8699: } else { //クリア 8700: XEiJ.mpuCycleCount += 4; 8701: XEiJ.regRn[ea] &= ~0xff; 8702: } 8703: } else { //SLO.B <mem> 8704: XEiJ.mpuCycleCount += 8; 8705: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LO << XEiJ.regCCR >> 31); 8706: } 8707: } //irpSlo 8708: 8709: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8710: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8711: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8712: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8713: //SNE.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr 8714: //SNEQ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8715: //SNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8716: //SNZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8717: //DBNE.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} 8718: //DBNEQ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8719: //DBNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8720: //DBNZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8721: public static void irpSne () throws M68kException { 8722: int ea = XEiJ.regOC & 63; 8723: if (ea >> 3 == XEiJ.MMM_AR) { //DBNE.W Dr,<label> 8724: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { 8725: //条件が成立しているので通過 8726: XEiJ.mpuCycleCount += 12; 8727: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8728: //リードを省略する 8729: } else { 8730: XEiJ.busRws (XEiJ.regPC); 8731: } 8732: XEiJ.regPC += 2; 8733: } else { 8734: //条件が成立していないのでデクリメント 8735: int rrr = XEiJ.regOC & 7; 8736: int t = XEiJ.regRn[rrr]; 8737: if ((short) t == 0) { //Drの下位16bitが0なので通過 8738: XEiJ.mpuCycleCount += 14; 8739: XEiJ.regRn[rrr] = t + 65535; 8740: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8741: //リードを省略する 8742: } else { 8743: XEiJ.busRws (XEiJ.regPC); 8744: } 8745: XEiJ.regPC += 2; 8746: } else { //Drの下位16bitが0でないのでジャンプ 8747: XEiJ.mpuCycleCount += 10; 8748: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8749: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8750: } 8751: } 8752: } else if (ea < XEiJ.EA_AR) { //SNE.B Dr 8753: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //セット 8754: XEiJ.mpuCycleCount += 6; 8755: XEiJ.regRn[ea] |= 0xff; 8756: } else { //クリア 8757: XEiJ.mpuCycleCount += 4; 8758: XEiJ.regRn[ea] &= ~0xff; 8759: } 8760: } else { //SNE.B <mem> 8761: XEiJ.mpuCycleCount += 8; 8762: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_NE << XEiJ.regCCR >> 31); 8763: } 8764: } //irpSne 8765: 8766: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8767: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8768: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8769: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8770: //SEQ.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr 8771: //SNNE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8772: //SNNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8773: //SZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8774: //DBEQ.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} 8775: //DBNNE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8776: //DBNNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8777: //DBZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8778: public static void irpSeq () throws M68kException { 8779: int ea = XEiJ.regOC & 63; 8780: if (ea >> 3 == XEiJ.MMM_AR) { //DBEQ.W Dr,<label> 8781: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { 8782: //条件が成立しているので通過 8783: XEiJ.mpuCycleCount += 12; 8784: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8785: //リードを省略する 8786: } else { 8787: XEiJ.busRws (XEiJ.regPC); 8788: } 8789: XEiJ.regPC += 2; 8790: } else { 8791: //条件が成立していないのでデクリメント 8792: int rrr = XEiJ.regOC & 7; 8793: int t = XEiJ.regRn[rrr]; 8794: if ((short) t == 0) { //Drの下位16bitが0なので通過 8795: XEiJ.mpuCycleCount += 14; 8796: XEiJ.regRn[rrr] = t + 65535; 8797: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8798: //リードを省略する 8799: } else { 8800: XEiJ.busRws (XEiJ.regPC); 8801: } 8802: XEiJ.regPC += 2; 8803: } else { //Drの下位16bitが0でないのでジャンプ 8804: XEiJ.mpuCycleCount += 10; 8805: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8806: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8807: } 8808: } 8809: } else if (ea < XEiJ.EA_AR) { //SEQ.B Dr 8810: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //セット 8811: XEiJ.mpuCycleCount += 6; 8812: XEiJ.regRn[ea] |= 0xff; 8813: } else { //クリア 8814: XEiJ.mpuCycleCount += 4; 8815: XEiJ.regRn[ea] &= ~0xff; 8816: } 8817: } else { //SEQ.B <mem> 8818: XEiJ.mpuCycleCount += 8; 8819: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_EQ << XEiJ.regCCR >> 31); 8820: } 8821: } //irpSeq 8822: 8823: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8824: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8825: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8826: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8827: //SVC.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr 8828: //SNVS.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr [SVC.B <ea>] 8829: //DBVC.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} 8830: //DBNVS.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} [DBVC.W Dr,<label>] 8831: public static void irpSvc () throws M68kException { 8832: int ea = XEiJ.regOC & 63; 8833: if (ea >> 3 == XEiJ.MMM_AR) { //DBVC.W Dr,<label> 8834: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { 8835: //条件が成立しているので通過 8836: XEiJ.mpuCycleCount += 12; 8837: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8838: //リードを省略する 8839: } else { 8840: XEiJ.busRws (XEiJ.regPC); 8841: } 8842: XEiJ.regPC += 2; 8843: } else { 8844: //条件が成立していないのでデクリメント 8845: int rrr = XEiJ.regOC & 7; 8846: int t = XEiJ.regRn[rrr]; 8847: if ((short) t == 0) { //Drの下位16bitが0なので通過 8848: XEiJ.mpuCycleCount += 14; 8849: XEiJ.regRn[rrr] = t + 65535; 8850: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8851: //リードを省略する 8852: } else { 8853: XEiJ.busRws (XEiJ.regPC); 8854: } 8855: XEiJ.regPC += 2; 8856: } else { //Drの下位16bitが0でないのでジャンプ 8857: XEiJ.mpuCycleCount += 10; 8858: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8859: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8860: } 8861: } 8862: } else if (ea < XEiJ.EA_AR) { //SVC.B Dr 8863: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //セット 8864: XEiJ.mpuCycleCount += 6; 8865: XEiJ.regRn[ea] |= 0xff; 8866: } else { //クリア 8867: XEiJ.mpuCycleCount += 4; 8868: XEiJ.regRn[ea] &= ~0xff; 8869: } 8870: } else { //SVC.B <mem> 8871: XEiJ.mpuCycleCount += 8; 8872: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VC << XEiJ.regCCR >> 31); 8873: } 8874: } //irpSvc 8875: 8876: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8877: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8878: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8879: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8880: //SVS.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr 8881: //SNVC.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr [SVS.B <ea>] 8882: //DBVS.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} 8883: //DBNVC.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} [DBVS.W Dr,<label>] 8884: public static void irpSvs () throws M68kException { 8885: int ea = XEiJ.regOC & 63; 8886: if (ea >> 3 == XEiJ.MMM_AR) { //DBVS.W Dr,<label> 8887: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { 8888: //条件が成立しているので通過 8889: XEiJ.mpuCycleCount += 12; 8890: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8891: //リードを省略する 8892: } else { 8893: XEiJ.busRws (XEiJ.regPC); 8894: } 8895: XEiJ.regPC += 2; 8896: } else { 8897: //条件が成立していないのでデクリメント 8898: int rrr = XEiJ.regOC & 7; 8899: int t = XEiJ.regRn[rrr]; 8900: if ((short) t == 0) { //Drの下位16bitが0なので通過 8901: XEiJ.mpuCycleCount += 14; 8902: XEiJ.regRn[rrr] = t + 65535; 8903: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8904: //リードを省略する 8905: } else { 8906: XEiJ.busRws (XEiJ.regPC); 8907: } 8908: XEiJ.regPC += 2; 8909: } else { //Drの下位16bitが0でないのでジャンプ 8910: XEiJ.mpuCycleCount += 10; 8911: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8912: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8913: } 8914: } 8915: } else if (ea < XEiJ.EA_AR) { //SVS.B Dr 8916: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //セット 8917: XEiJ.mpuCycleCount += 6; 8918: XEiJ.regRn[ea] |= 0xff; 8919: } else { //クリア 8920: XEiJ.mpuCycleCount += 4; 8921: XEiJ.regRn[ea] &= ~0xff; 8922: } 8923: } else { //SVS.B <mem> 8924: XEiJ.mpuCycleCount += 8; 8925: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VS << XEiJ.regCCR >> 31); 8926: } 8927: } //irpSvs 8928: 8929: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8930: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8931: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8932: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8933: //SPL.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr 8934: //SNMI.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr [SPL.B <ea>] 8935: //DBPL.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} 8936: //DBNMI.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} [DBPL.W Dr,<label>] 8937: public static void irpSpl () throws M68kException { 8938: int ea = XEiJ.regOC & 63; 8939: if (ea >> 3 == XEiJ.MMM_AR) { //DBPL.W Dr,<label> 8940: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { 8941: //条件が成立しているので通過 8942: XEiJ.mpuCycleCount += 12; 8943: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8944: //リードを省略する 8945: } else { 8946: XEiJ.busRws (XEiJ.regPC); 8947: } 8948: XEiJ.regPC += 2; 8949: } else { 8950: //条件が成立していないのでデクリメント 8951: int rrr = XEiJ.regOC & 7; 8952: int t = XEiJ.regRn[rrr]; 8953: if ((short) t == 0) { //Drの下位16bitが0なので通過 8954: XEiJ.mpuCycleCount += 14; 8955: XEiJ.regRn[rrr] = t + 65535; 8956: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8957: //リードを省略する 8958: } else { 8959: XEiJ.busRws (XEiJ.regPC); 8960: } 8961: XEiJ.regPC += 2; 8962: } else { //Drの下位16bitが0でないのでジャンプ 8963: XEiJ.mpuCycleCount += 10; 8964: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8965: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8966: } 8967: } 8968: } else if (ea < XEiJ.EA_AR) { //SPL.B Dr 8969: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //セット 8970: XEiJ.mpuCycleCount += 6; 8971: XEiJ.regRn[ea] |= 0xff; 8972: } else { //クリア 8973: XEiJ.mpuCycleCount += 4; 8974: XEiJ.regRn[ea] &= ~0xff; 8975: } 8976: } else { //SPL.B <mem> 8977: XEiJ.mpuCycleCount += 8; 8978: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_PL << XEiJ.regCCR >> 31); 8979: } 8980: } //irpSpl 8981: 8982: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8983: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8984: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8985: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8986: //SMI.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr 8987: //SNPL.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr [SMI.B <ea>] 8988: //DBMI.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} 8989: //DBNPL.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} [DBMI.W Dr,<label>] 8990: public static void irpSmi () throws M68kException { 8991: int ea = XEiJ.regOC & 63; 8992: if (ea >> 3 == XEiJ.MMM_AR) { //DBMI.W Dr,<label> 8993: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { 8994: //条件が成立しているので通過 8995: XEiJ.mpuCycleCount += 12; 8996: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8997: //リードを省略する 8998: } else { 8999: XEiJ.busRws (XEiJ.regPC); 9000: } 9001: XEiJ.regPC += 2; 9002: } else { 9003: //条件が成立していないのでデクリメント 9004: int rrr = XEiJ.regOC & 7; 9005: int t = XEiJ.regRn[rrr]; 9006: if ((short) t == 0) { //Drの下位16bitが0なので通過 9007: XEiJ.mpuCycleCount += 14; 9008: XEiJ.regRn[rrr] = t + 65535; 9009: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9010: //リードを省略する 9011: } else { 9012: XEiJ.busRws (XEiJ.regPC); 9013: } 9014: XEiJ.regPC += 2; 9015: } else { //Drの下位16bitが0でないのでジャンプ 9016: XEiJ.mpuCycleCount += 10; 9017: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9018: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9019: } 9020: } 9021: } else if (ea < XEiJ.EA_AR) { //SMI.B Dr 9022: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //セット 9023: XEiJ.mpuCycleCount += 6; 9024: XEiJ.regRn[ea] |= 0xff; 9025: } else { //クリア 9026: XEiJ.mpuCycleCount += 4; 9027: XEiJ.regRn[ea] &= ~0xff; 9028: } 9029: } else { //SMI.B <mem> 9030: XEiJ.mpuCycleCount += 8; 9031: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_MI << XEiJ.regCCR >> 31); 9032: } 9033: } //irpSmi 9034: 9035: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9036: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9037: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9038: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9039: //SGE.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr 9040: //SNLT.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr [SGE.B <ea>] 9041: //DBGE.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} 9042: //DBNLT.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} [DBGE.W Dr,<label>] 9043: public static void irpSge () throws M68kException { 9044: int ea = XEiJ.regOC & 63; 9045: if (ea >> 3 == XEiJ.MMM_AR) { //DBGE.W Dr,<label> 9046: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { 9047: //条件が成立しているので通過 9048: XEiJ.mpuCycleCount += 12; 9049: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9050: //リードを省略する 9051: } else { 9052: XEiJ.busRws (XEiJ.regPC); 9053: } 9054: XEiJ.regPC += 2; 9055: } else { 9056: //条件が成立していないのでデクリメント 9057: int rrr = XEiJ.regOC & 7; 9058: int t = XEiJ.regRn[rrr]; 9059: if ((short) t == 0) { //Drの下位16bitが0なので通過 9060: XEiJ.mpuCycleCount += 14; 9061: XEiJ.regRn[rrr] = t + 65535; 9062: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9063: //リードを省略する 9064: } else { 9065: XEiJ.busRws (XEiJ.regPC); 9066: } 9067: XEiJ.regPC += 2; 9068: } else { //Drの下位16bitが0でないのでジャンプ 9069: XEiJ.mpuCycleCount += 10; 9070: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9071: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9072: } 9073: } 9074: } else if (ea < XEiJ.EA_AR) { //SGE.B Dr 9075: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //セット 9076: XEiJ.mpuCycleCount += 6; 9077: XEiJ.regRn[ea] |= 0xff; 9078: } else { //クリア 9079: XEiJ.mpuCycleCount += 4; 9080: XEiJ.regRn[ea] &= ~0xff; 9081: } 9082: } else { //SGE.B <mem> 9083: XEiJ.mpuCycleCount += 8; 9084: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GE << XEiJ.regCCR >> 31); 9085: } 9086: } //irpSge 9087: 9088: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9089: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9090: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9091: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9092: //SLT.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr 9093: //SNGE.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr [SLT.B <ea>] 9094: //DBLT.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} 9095: //DBNGE.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} [DBLT.W Dr,<label>] 9096: public static void irpSlt () throws M68kException { 9097: int ea = XEiJ.regOC & 63; 9098: if (ea >> 3 == XEiJ.MMM_AR) { //DBLT.W Dr,<label> 9099: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { 9100: //条件が成立しているので通過 9101: XEiJ.mpuCycleCount += 12; 9102: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9103: //リードを省略する 9104: } else { 9105: XEiJ.busRws (XEiJ.regPC); 9106: } 9107: XEiJ.regPC += 2; 9108: } else { 9109: //条件が成立していないのでデクリメント 9110: int rrr = XEiJ.regOC & 7; 9111: int t = XEiJ.regRn[rrr]; 9112: if ((short) t == 0) { //Drの下位16bitが0なので通過 9113: XEiJ.mpuCycleCount += 14; 9114: XEiJ.regRn[rrr] = t + 65535; 9115: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9116: //リードを省略する 9117: } else { 9118: XEiJ.busRws (XEiJ.regPC); 9119: } 9120: XEiJ.regPC += 2; 9121: } else { //Drの下位16bitが0でないのでジャンプ 9122: XEiJ.mpuCycleCount += 10; 9123: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9124: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9125: } 9126: } 9127: } else if (ea < XEiJ.EA_AR) { //SLT.B Dr 9128: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //セット 9129: XEiJ.mpuCycleCount += 6; 9130: XEiJ.regRn[ea] |= 0xff; 9131: } else { //クリア 9132: XEiJ.mpuCycleCount += 4; 9133: XEiJ.regRn[ea] &= ~0xff; 9134: } 9135: } else { //SLT.B <mem> 9136: XEiJ.mpuCycleCount += 8; 9137: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LT << XEiJ.regCCR >> 31); 9138: } 9139: } //irpSlt 9140: 9141: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9142: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9143: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9144: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9145: //SGT.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr 9146: //SNLE.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr [SGT.B <ea>] 9147: //DBGT.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} 9148: //DBNLE.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} [DBGT.W Dr,<label>] 9149: public static void irpSgt () throws M68kException { 9150: int ea = XEiJ.regOC & 63; 9151: if (ea >> 3 == XEiJ.MMM_AR) { //DBGT.W Dr,<label> 9152: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { 9153: //条件が成立しているので通過 9154: XEiJ.mpuCycleCount += 12; 9155: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9156: //リードを省略する 9157: } else { 9158: XEiJ.busRws (XEiJ.regPC); 9159: } 9160: XEiJ.regPC += 2; 9161: } else { 9162: //条件が成立していないのでデクリメント 9163: int rrr = XEiJ.regOC & 7; 9164: int t = XEiJ.regRn[rrr]; 9165: if ((short) t == 0) { //Drの下位16bitが0なので通過 9166: XEiJ.mpuCycleCount += 14; 9167: XEiJ.regRn[rrr] = t + 65535; 9168: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9169: //リードを省略する 9170: } else { 9171: XEiJ.busRws (XEiJ.regPC); 9172: } 9173: XEiJ.regPC += 2; 9174: } else { //Drの下位16bitが0でないのでジャンプ 9175: XEiJ.mpuCycleCount += 10; 9176: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9177: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9178: } 9179: } 9180: } else if (ea < XEiJ.EA_AR) { //SGT.B Dr 9181: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //セット 9182: XEiJ.mpuCycleCount += 6; 9183: XEiJ.regRn[ea] |= 0xff; 9184: } else { //クリア 9185: XEiJ.mpuCycleCount += 4; 9186: XEiJ.regRn[ea] &= ~0xff; 9187: } 9188: } else { //SGT.B <mem> 9189: XEiJ.mpuCycleCount += 8; 9190: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GT << XEiJ.regCCR >> 31); 9191: } 9192: } //irpSgt 9193: 9194: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9195: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9196: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9197: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9198: //SLE.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr 9199: //SNGT.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr [SLE.B <ea>] 9200: //DBLE.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} 9201: //DBNGT.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} [DBLE.W Dr,<label>] 9202: public static void irpSle () throws M68kException { 9203: int ea = XEiJ.regOC & 63; 9204: if (ea >> 3 == XEiJ.MMM_AR) { //DBLE.W Dr,<label> 9205: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { 9206: //条件が成立しているので通過 9207: XEiJ.mpuCycleCount += 12; 9208: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9209: //リードを省略する 9210: } else { 9211: XEiJ.busRws (XEiJ.regPC); 9212: } 9213: XEiJ.regPC += 2; 9214: } else { 9215: //条件が成立していないのでデクリメント 9216: int rrr = XEiJ.regOC & 7; 9217: int t = XEiJ.regRn[rrr]; 9218: if ((short) t == 0) { //Drの下位16bitが0なので通過 9219: XEiJ.mpuCycleCount += 14; 9220: XEiJ.regRn[rrr] = t + 65535; 9221: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9222: //リードを省略する 9223: } else { 9224: XEiJ.busRws (XEiJ.regPC); 9225: } 9226: XEiJ.regPC += 2; 9227: } else { //Drの下位16bitが0でないのでジャンプ 9228: XEiJ.mpuCycleCount += 10; 9229: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9230: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9231: } 9232: } 9233: } else if (ea < XEiJ.EA_AR) { //SLE.B Dr 9234: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //セット 9235: XEiJ.mpuCycleCount += 6; 9236: XEiJ.regRn[ea] |= 0xff; 9237: } else { //クリア 9238: XEiJ.mpuCycleCount += 4; 9239: XEiJ.regRn[ea] &= ~0xff; 9240: } 9241: } else { //SLE.B <mem> 9242: XEiJ.mpuCycleCount += 8; 9243: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LE << XEiJ.regCCR >> 31); 9244: } 9245: } //irpSle 9246: 9247: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9248: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9249: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9250: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9251: //BRA.W <label> |-|012346|-|-----|-----| |0110_000_000_000_000-{offset} 9252: //JBRA.W <label> |A|012346|-|-----|-----| |0110_000_000_000_000-{offset} [BRA.W <label>] 9253: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) 9254: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) [BRA.S <label>] 9255: public static void irpBrasw () throws M68kException { 9256: XEiJ.mpuCycleCount += 10; 9257: int t = XEiJ.regPC; //pc0+2 9258: int s = (byte) XEiJ.regOC; //オフセット 9259: if (s == 0) { //BRA.W 9260: XEiJ.regPC = t + 2; 9261: s = XEiJ.busRwse (t); //pcws 9262: } else { //BRA.S 9263: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9264: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9265: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9266: //! 軽量化。リードを省略する 9267: } else { 9268: XEiJ.busRwse (t); //pcws 9269: } 9270: } 9271: irpSetPC (t + s); //pc0+2+オフセット 9272: } //irpBrasw 9273: 9274: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9275: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9276: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9277: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9278: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_001_sss_sss 9279: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_001_sss_sss [BRA.S <label>] 9280: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9281: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9282: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9283: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9284: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_010_sss_sss 9285: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_010_sss_sss [BRA.S <label>] 9286: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9287: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9288: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9289: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9290: //BRA.S <label> |-|01----|-|-----|-----| |0110_000_011_sss_sss 9291: //JBRA.S <label> |A|01----|-|-----|-----| |0110_000_011_sss_sss [BRA.S <label>] 9292: public static void irpBras () throws M68kException { 9293: XEiJ.mpuCycleCount += 10; 9294: int t = XEiJ.regPC; //pc0+2 9295: int s = (byte) XEiJ.regOC; //オフセット 9296: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9297: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9298: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9299: //! 軽量化。リードを省略する 9300: } else { 9301: XEiJ.busRwse (t); //pcws 9302: } 9303: irpSetPC (t + s); //pc0+2+オフセット 9304: } //irpBras 9305: 9306: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9307: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9308: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9309: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9310: //BSR.W <label> |-|012346|-|-----|-----| |0110_000_100_000_000-{offset} 9311: //JBSR.W <label> |A|012346|-|-----|-----| |0110_000_100_000_000-{offset} [BSR.W <label>] 9312: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) 9313: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) [BSR.S <label>] 9314: public static void irpBsrsw () throws M68kException { 9315: XEiJ.mpuCycleCount += 18; 9316: int t = XEiJ.regPC; //pc0+2 9317: int s = (byte) XEiJ.regOC; //オフセット 9318: if (s == 0) { //BSR.W 9319: XEiJ.regPC = t + 2; 9320: s = XEiJ.busRwse (t); //pcws 9321: } else { //BSR.S 9322: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9323: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9324: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9325: //! 軽量化。リードを省略する 9326: } else { 9327: XEiJ.busRwse (t); //pcws 9328: } 9329: } 9330: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 9331: irpSetPC (t + s); //pc0+2+オフセット 9332: } //irpBsrsw 9333: 9334: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9335: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9336: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9337: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9338: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_101_sss_sss 9339: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_101_sss_sss [BSR.S <label>] 9340: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9341: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9342: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9343: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9344: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_110_sss_sss 9345: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_110_sss_sss [BSR.S <label>] 9346: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9347: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9348: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9349: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9350: //BSR.S <label> |-|01----|-|-----|-----| |0110_000_111_sss_sss 9351: //JBSR.S <label> |A|01----|-|-----|-----| |0110_000_111_sss_sss [BSR.S <label>] 9352: public static void irpBsrs () throws M68kException { 9353: XEiJ.mpuCycleCount += 18; 9354: int t = XEiJ.regPC; //pc0+2 9355: int s = (byte) XEiJ.regOC; //オフセット 9356: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9357: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9358: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9359: //! 軽量化。リードを省略する 9360: } else { 9361: XEiJ.busRwse (t); //pcws 9362: } 9363: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 9364: irpSetPC (t + s); //pc0+2+オフセット 9365: } //irpBsrs 9366: 9367: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9368: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9369: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9370: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9371: //BHI.W <label> |-|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} 9372: //BNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 9373: //JBHI.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 9374: //JBNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 9375: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) 9376: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 9377: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 9378: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 9379: //JBLS.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 9380: //JBNHI.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 9381: public static void irpBhisw () throws M68kException { 9382: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //Bccでジャンプ 9383: XEiJ.mpuCycleCount += 10; 9384: int t = XEiJ.regPC; //pc0+2 9385: int s = (byte) XEiJ.regOC; //オフセット 9386: if (s == 0) { //Bcc.Wでジャンプ 9387: XEiJ.regPC = t + 2; 9388: s = XEiJ.busRwse (t); //pcws 9389: } else { //Bcc.Sでジャンプ 9390: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9391: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9392: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9393: //! 軽量化。リードを省略する 9394: } else { 9395: XEiJ.busRwse (t); //pcws 9396: } 9397: } 9398: irpSetPC (t + s); //pc0+2+オフセット 9399: } else if (XEiJ.regOC == 0x6200) { //Bcc.Wで通過 9400: XEiJ.mpuCycleCount += 12; 9401: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9402: //リードを省略する 9403: } else { 9404: XEiJ.busRws (XEiJ.regPC); 9405: } 9406: XEiJ.regPC += 2; 9407: } else { //Bcc.Sで通過 9408: XEiJ.mpuCycleCount += 8; 9409: } 9410: } //irpBhisw 9411: 9412: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9413: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9414: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9415: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9416: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_001_sss_sss 9417: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9418: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9419: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9420: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9421: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9422: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9423: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9424: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_010_sss_sss 9425: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9426: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9427: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9428: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9429: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9430: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9431: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9432: //BHI.S <label> |-|01----|-|--*-*|-----| |0110_001_011_sss_sss 9433: //BNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9434: //JBHI.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9435: //JBNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9436: public static void irpBhis () throws M68kException { 9437: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9438: XEiJ.mpuCycleCount += 10; 9439: int t = XEiJ.regPC; //pc0+2 9440: int s = (byte) XEiJ.regOC; //オフセット 9441: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9442: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9443: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9444: //! 軽量化。リードを省略する 9445: } else { 9446: XEiJ.busRwse (t); //pcws 9447: } 9448: irpSetPC (t + s); //pc0+2+オフセット 9449: } else { //Bcc.Sで通過 9450: XEiJ.mpuCycleCount += 8; 9451: } 9452: } //irpBhis 9453: 9454: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9455: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9456: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9457: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9458: //BLS.W <label> |-|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} 9459: //BNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9460: //JBLS.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9461: //JBNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9462: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) 9463: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9464: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9465: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9466: //JBHI.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 9467: //JBNLS.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 9468: public static void irpBlssw () throws M68kException { 9469: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //Bccでジャンプ 9470: XEiJ.mpuCycleCount += 10; 9471: int t = XEiJ.regPC; //pc0+2 9472: int s = (byte) XEiJ.regOC; //オフセット 9473: if (s == 0) { //Bcc.Wでジャンプ 9474: XEiJ.regPC = t + 2; 9475: s = XEiJ.busRwse (t); //pcws 9476: } else { //Bcc.Sでジャンプ 9477: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9478: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9479: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9480: //! 軽量化。リードを省略する 9481: } else { 9482: XEiJ.busRwse (t); //pcws 9483: } 9484: } 9485: irpSetPC (t + s); //pc0+2+オフセット 9486: } else if (XEiJ.regOC == 0x6300) { //Bcc.Wで通過 9487: XEiJ.mpuCycleCount += 12; 9488: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9489: //リードを省略する 9490: } else { 9491: XEiJ.busRws (XEiJ.regPC); 9492: } 9493: XEiJ.regPC += 2; 9494: } else { //Bcc.Sで通過 9495: XEiJ.mpuCycleCount += 8; 9496: } 9497: } //irpBlssw 9498: 9499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9500: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9501: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9502: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9503: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_101_sss_sss 9504: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9505: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9506: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9507: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9508: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9509: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9510: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9511: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_110_sss_sss 9512: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9513: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9514: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9515: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9516: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9517: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9518: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9519: //BLS.S <label> |-|01----|-|--*-*|-----| |0110_001_111_sss_sss 9520: //BNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9521: //JBLS.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9522: //JBNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9523: public static void irpBlss () throws M68kException { 9524: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9525: XEiJ.mpuCycleCount += 10; 9526: int t = XEiJ.regPC; //pc0+2 9527: int s = (byte) XEiJ.regOC; //オフセット 9528: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9529: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9530: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9531: //! 軽量化。リードを省略する 9532: } else { 9533: XEiJ.busRwse (t); //pcws 9534: } 9535: irpSetPC (t + s); //pc0+2+オフセット 9536: } else { //Bcc.Sで通過 9537: XEiJ.mpuCycleCount += 8; 9538: } 9539: } //irpBlss 9540: 9541: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9542: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9543: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9544: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9545: //BCC.W <label> |-|012346|-|----*|-----| |0110_010_000_000_000-{offset} 9546: //BHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9547: //BNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9548: //BNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9549: //JBCC.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9550: //JBHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9551: //JBNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9552: //JBNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9553: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) 9554: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9555: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9556: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9557: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9558: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9559: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9560: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9561: //JBCS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9562: //JBLO.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9563: //JBNCC.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9564: //JBNHS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9565: public static void irpBhssw () throws M68kException { 9566: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //Bccでジャンプ 9567: XEiJ.mpuCycleCount += 10; 9568: int t = XEiJ.regPC; //pc0+2 9569: int s = (byte) XEiJ.regOC; //オフセット 9570: if (s == 0) { //Bcc.Wでジャンプ 9571: XEiJ.regPC = t + 2; 9572: s = XEiJ.busRwse (t); //pcws 9573: } else { //Bcc.Sでジャンプ 9574: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9575: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9576: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9577: //! 軽量化。リードを省略する 9578: } else { 9579: XEiJ.busRwse (t); //pcws 9580: } 9581: } 9582: irpSetPC (t + s); //pc0+2+オフセット 9583: } else if (XEiJ.regOC == 0x6400) { //Bcc.Wで通過 9584: XEiJ.mpuCycleCount += 12; 9585: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9586: //リードを省略する 9587: } else { 9588: XEiJ.busRws (XEiJ.regPC); 9589: } 9590: XEiJ.regPC += 2; 9591: } else { //Bcc.Sで通過 9592: XEiJ.mpuCycleCount += 8; 9593: } 9594: } //irpBhssw 9595: 9596: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9597: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9598: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9599: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9600: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_001_sss_sss 9601: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9602: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9603: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9604: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9605: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9606: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9607: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9608: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9609: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9610: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9611: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9612: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_010_sss_sss 9613: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9614: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9615: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9616: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9617: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9618: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9619: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9620: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9621: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9622: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9623: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9624: //BCC.S <label> |-|01----|-|----*|-----| |0110_010_011_sss_sss 9625: //BHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9626: //BNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9627: //BNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9628: //JBCC.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9629: //JBHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9630: //JBNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9631: //JBNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9632: public static void irpBhss () throws M68kException { 9633: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9634: XEiJ.mpuCycleCount += 10; 9635: int t = XEiJ.regPC; //pc0+2 9636: int s = (byte) XEiJ.regOC; //オフセット 9637: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9638: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9639: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9640: //! 軽量化。リードを省略する 9641: } else { 9642: XEiJ.busRwse (t); //pcws 9643: } 9644: irpSetPC (t + s); //pc0+2+オフセット 9645: } else { //Bcc.Sで通過 9646: XEiJ.mpuCycleCount += 8; 9647: } 9648: } //irpBhss 9649: 9650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9651: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9652: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9654: //BCS.W <label> |-|012346|-|----*|-----| |0110_010_100_000_000-{offset} 9655: //BLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9656: //BNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9657: //BNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9658: //JBCS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9659: //JBLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9660: //JBNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9661: //JBNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9662: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) 9663: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9664: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9665: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9666: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9667: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9668: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9669: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9670: //JBCC.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9671: //JBHS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9672: //JBNCS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9673: //JBNLO.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9674: public static void irpBlosw () throws M68kException { 9675: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //Bccでジャンプ 9676: XEiJ.mpuCycleCount += 10; 9677: int t = XEiJ.regPC; //pc0+2 9678: int s = (byte) XEiJ.regOC; //オフセット 9679: if (s == 0) { //Bcc.Wでジャンプ 9680: XEiJ.regPC = t + 2; 9681: s = XEiJ.busRwse (t); //pcws 9682: } else { //Bcc.Sでジャンプ 9683: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9684: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9685: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9686: //! 軽量化。リードを省略する 9687: } else { 9688: XEiJ.busRwse (t); //pcws 9689: } 9690: } 9691: irpSetPC (t + s); //pc0+2+オフセット 9692: } else if (XEiJ.regOC == 0x6500) { //Bcc.Wで通過 9693: XEiJ.mpuCycleCount += 12; 9694: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9695: //リードを省略する 9696: } else { 9697: XEiJ.busRws (XEiJ.regPC); 9698: } 9699: XEiJ.regPC += 2; 9700: } else { //Bcc.Sで通過 9701: XEiJ.mpuCycleCount += 8; 9702: } 9703: } //irpBlosw 9704: 9705: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9706: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9707: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9708: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9709: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_101_sss_sss 9710: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9711: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9712: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9713: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9714: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9715: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9716: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9717: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9718: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9719: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9720: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9721: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_110_sss_sss 9722: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9723: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9724: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9725: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9726: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9727: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9728: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9729: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9730: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9731: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9732: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9733: //BCS.S <label> |-|01----|-|----*|-----| |0110_010_111_sss_sss 9734: //BLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9735: //BNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9736: //BNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9737: //JBCS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9738: //JBLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9739: //JBNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9740: //JBNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9741: public static void irpBlos () throws M68kException { 9742: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //Bccでジャンプ 9743: XEiJ.mpuCycleCount += 10; 9744: int t = XEiJ.regPC; //pc0+2 9745: int s = (byte) XEiJ.regOC; //オフセット 9746: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9747: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9748: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9749: //! 軽量化。リードを省略する 9750: } else { 9751: XEiJ.busRwse (t); //pcws 9752: } 9753: irpSetPC (t + s); //pc0+2+オフセット 9754: } else { //Bcc.Sで通過 9755: XEiJ.mpuCycleCount += 8; 9756: } 9757: } //irpBlos 9758: 9759: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9760: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9761: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9762: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9763: //BNE.W <label> |-|012346|-|--*--|-----| |0110_011_000_000_000-{offset} 9764: //BNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9765: //BNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9766: //BNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9767: //JBNE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9768: //JBNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9769: //JBNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9770: //JBNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9771: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) 9772: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9773: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9774: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9775: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9776: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9777: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9778: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9779: //JBEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9780: //JBNEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9781: //JBNNE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9782: //JBNNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9783: //JBNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9784: //JBNZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9785: //JBZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9786: public static void irpBnesw () throws M68kException { 9787: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //Bccでジャンプ 9788: XEiJ.mpuCycleCount += 10; 9789: int t = XEiJ.regPC; //pc0+2 9790: int s = (byte) XEiJ.regOC; //オフセット 9791: if (s == 0) { //Bcc.Wでジャンプ 9792: XEiJ.regPC = t + 2; 9793: s = XEiJ.busRwse (t); //pcws 9794: } else { //Bcc.Sでジャンプ 9795: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9796: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9797: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9798: //! 軽量化。リードを省略する 9799: } else { 9800: XEiJ.busRwse (t); //pcws 9801: } 9802: } 9803: irpSetPC (t + s); //pc0+2+オフセット 9804: } else if (XEiJ.regOC == 0x6600) { //Bcc.Wで通過 9805: XEiJ.mpuCycleCount += 12; 9806: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9807: //リードを省略する 9808: } else { 9809: XEiJ.busRws (XEiJ.regPC); 9810: } 9811: XEiJ.regPC += 2; 9812: } else { //Bcc.Sで通過 9813: XEiJ.mpuCycleCount += 8; 9814: } 9815: } //irpBnesw 9816: 9817: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9818: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9819: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9820: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9821: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_001_sss_sss 9822: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9823: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9824: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9825: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9826: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9827: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9828: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9829: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9830: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9831: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9832: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9833: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_010_sss_sss 9834: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9835: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9836: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9837: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9838: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9839: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9840: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9841: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9842: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9843: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9844: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9845: //BNE.S <label> |-|01----|-|--*--|-----| |0110_011_011_sss_sss 9846: //BNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9847: //BNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9848: //BNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9849: //JBNE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9850: //JBNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9851: //JBNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9852: //JBNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9853: public static void irpBnes () throws M68kException { 9854: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //Bccでジャンプ 9855: XEiJ.mpuCycleCount += 10; 9856: int t = XEiJ.regPC; //pc0+2 9857: int s = (byte) XEiJ.regOC; //オフセット 9858: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9859: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9860: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9861: //! 軽量化。リードを省略する 9862: } else { 9863: XEiJ.busRwse (t); //pcws 9864: } 9865: irpSetPC (t + s); //pc0+2+オフセット 9866: } else { //Bcc.Sで通過 9867: XEiJ.mpuCycleCount += 8; 9868: } 9869: } //irpBnes 9870: 9871: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9872: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9873: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9874: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9875: //BEQ.W <label> |-|012346|-|--*--|-----| |0110_011_100_000_000-{offset} 9876: //BNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9877: //BNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9878: //BZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9879: //JBEQ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9880: //JBNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9881: //JBNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9882: //JBZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9883: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) 9884: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9885: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9886: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9887: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9888: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9889: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9890: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9891: //JBNE.L <label> |A|012346|-|--*--|-----| |0110_011_100_000_110-0100111011111001-{address} [BEQ.S (*)+8;JMP <label>] 9892: public static void irpBeqsw () throws M68kException { 9893: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //Bccでジャンプ 9894: XEiJ.mpuCycleCount += 10; 9895: int t = XEiJ.regPC; //pc0+2 9896: int s = (byte) XEiJ.regOC; //オフセット 9897: if (s == 0) { //Bcc.Wでジャンプ 9898: XEiJ.regPC = t + 2; 9899: s = XEiJ.busRwse (t); //pcws 9900: } else { //Bcc.Sでジャンプ 9901: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9902: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9903: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9904: //! 軽量化。リードを省略する 9905: } else { 9906: XEiJ.busRwse (t); //pcws 9907: } 9908: } 9909: irpSetPC (t + s); //pc0+2+オフセット 9910: } else if (XEiJ.regOC == 0x6700) { //Bcc.Wで通過 9911: XEiJ.mpuCycleCount += 12; 9912: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9913: //リードを省略する 9914: } else { 9915: XEiJ.busRws (XEiJ.regPC); 9916: } 9917: XEiJ.regPC += 2; 9918: } else { //Bcc.Sで通過 9919: XEiJ.mpuCycleCount += 8; 9920: } 9921: } //irpBeqsw 9922: 9923: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9924: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9925: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9926: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9927: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_101_sss_sss 9928: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9929: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9930: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9931: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9932: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9933: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9934: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9935: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9936: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9937: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9938: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9939: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_110_sss_sss 9940: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9941: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9942: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9943: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9944: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9945: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9946: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9947: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9948: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9949: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9950: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9951: //BEQ.S <label> |-|01----|-|--*--|-----| |0110_011_111_sss_sss 9952: //BNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9953: //BNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9954: //BZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9955: //JBEQ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9956: //JBNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9957: //JBNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9958: //JBZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9959: public static void irpBeqs () throws M68kException { 9960: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //Bccでジャンプ 9961: XEiJ.mpuCycleCount += 10; 9962: int t = XEiJ.regPC; //pc0+2 9963: int s = (byte) XEiJ.regOC; //オフセット 9964: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9965: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9966: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9967: //! 軽量化。リードを省略する 9968: } else { 9969: XEiJ.busRwse (t); //pcws 9970: } 9971: irpSetPC (t + s); //pc0+2+オフセット 9972: } else { //Bcc.Sで通過 9973: XEiJ.mpuCycleCount += 8; 9974: } 9975: } //irpBeqs 9976: 9977: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9978: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9979: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9980: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9981: //BVC.W <label> |-|012346|-|---*-|-----| |0110_100_000_000_000-{offset} 9982: //BNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9983: //JBNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9984: //JBVC.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9985: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) 9986: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9987: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9988: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9989: //JBNVC.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 9990: //JBVS.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 9991: public static void irpBvcsw () throws M68kException { 9992: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //Bccでジャンプ 9993: XEiJ.mpuCycleCount += 10; 9994: int t = XEiJ.regPC; //pc0+2 9995: int s = (byte) XEiJ.regOC; //オフセット 9996: if (s == 0) { //Bcc.Wでジャンプ 9997: XEiJ.regPC = t + 2; 9998: s = XEiJ.busRwse (t); //pcws 9999: } else { //Bcc.Sでジャンプ 10000: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10001: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10002: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10003: //! 軽量化。リードを省略する 10004: } else { 10005: XEiJ.busRwse (t); //pcws 10006: } 10007: } 10008: irpSetPC (t + s); //pc0+2+オフセット 10009: } else if (XEiJ.regOC == 0x6800) { //Bcc.Wで通過 10010: XEiJ.mpuCycleCount += 12; 10011: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10012: //リードを省略する 10013: } else { 10014: XEiJ.busRws (XEiJ.regPC); 10015: } 10016: XEiJ.regPC += 2; 10017: } else { //Bcc.Sで通過 10018: XEiJ.mpuCycleCount += 8; 10019: } 10020: } //irpBvcsw 10021: 10022: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10023: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10024: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10025: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10026: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_001_sss_sss 10027: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 10028: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 10029: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 10030: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10031: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10032: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10034: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_010_sss_sss 10035: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 10036: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 10037: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 10038: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10039: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10040: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10041: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10042: //BVC.S <label> |-|01----|-|---*-|-----| |0110_100_011_sss_sss 10043: //BNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 10044: //JBNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 10045: //JBVC.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 10046: public static void irpBvcs () throws M68kException { 10047: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //Bccでジャンプ 10048: XEiJ.mpuCycleCount += 10; 10049: int t = XEiJ.regPC; //pc0+2 10050: int s = (byte) XEiJ.regOC; //オフセット 10051: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10052: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10053: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10054: //! 軽量化。リードを省略する 10055: } else { 10056: XEiJ.busRwse (t); //pcws 10057: } 10058: irpSetPC (t + s); //pc0+2+オフセット 10059: } else { //Bcc.Sで通過 10060: XEiJ.mpuCycleCount += 8; 10061: } 10062: } //irpBvcs 10063: 10064: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10065: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10066: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10067: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10068: //BVS.W <label> |-|012346|-|---*-|-----| |0110_100_100_000_000-{offset} 10069: //BNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 10070: //JBNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 10071: //JBVS.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 10072: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) 10073: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 10074: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 10075: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 10076: //JBNVS.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 10077: //JBVC.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 10078: public static void irpBvssw () throws M68kException { 10079: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //Bccでジャンプ 10080: XEiJ.mpuCycleCount += 10; 10081: int t = XEiJ.regPC; //pc0+2 10082: int s = (byte) XEiJ.regOC; //オフセット 10083: if (s == 0) { //Bcc.Wでジャンプ 10084: XEiJ.regPC = t + 2; 10085: s = XEiJ.busRwse (t); //pcws 10086: } else { //Bcc.Sでジャンプ 10087: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10088: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10089: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10090: //! 軽量化。リードを省略する 10091: } else { 10092: XEiJ.busRwse (t); //pcws 10093: } 10094: } 10095: irpSetPC (t + s); //pc0+2+オフセット 10096: } else if (XEiJ.regOC == 0x6900) { //Bcc.Wで通過 10097: XEiJ.mpuCycleCount += 12; 10098: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10099: //リードを省略する 10100: } else { 10101: XEiJ.busRws (XEiJ.regPC); 10102: } 10103: XEiJ.regPC += 2; 10104: } else { //Bcc.Sで通過 10105: XEiJ.mpuCycleCount += 8; 10106: } 10107: } //irpBvssw 10108: 10109: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10110: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10111: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10112: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10113: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_101_sss_sss 10114: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 10115: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 10116: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 10117: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10118: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10119: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10120: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10121: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_110_sss_sss 10122: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 10123: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 10124: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 10125: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10126: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10127: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10128: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10129: //BVS.S <label> |-|01----|-|---*-|-----| |0110_100_111_sss_sss 10130: //BNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 10131: //JBNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 10132: //JBVS.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 10133: public static void irpBvss () throws M68kException { 10134: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //Bccでジャンプ 10135: XEiJ.mpuCycleCount += 10; 10136: int t = XEiJ.regPC; //pc0+2 10137: int s = (byte) XEiJ.regOC; //オフセット 10138: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10139: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10140: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10141: //! 軽量化。リードを省略する 10142: } else { 10143: XEiJ.busRwse (t); //pcws 10144: } 10145: irpSetPC (t + s); //pc0+2+オフセット 10146: } else { //Bcc.Sで通過 10147: XEiJ.mpuCycleCount += 8; 10148: } 10149: } //irpBvss 10150: 10151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10152: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10153: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10154: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10155: //BPL.W <label> |-|012346|-|-*---|-----| |0110_101_000_000_000-{offset} 10156: //BNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 10157: //JBNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 10158: //JBPL.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 10159: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) 10160: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 10161: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 10162: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 10163: //JBMI.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 10164: //JBNPL.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 10165: public static void irpBplsw () throws M68kException { 10166: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //Bccでジャンプ 10167: XEiJ.mpuCycleCount += 10; 10168: int t = XEiJ.regPC; //pc0+2 10169: int s = (byte) XEiJ.regOC; //オフセット 10170: if (s == 0) { //Bcc.Wでジャンプ 10171: XEiJ.regPC = t + 2; 10172: s = XEiJ.busRwse (t); //pcws 10173: } else { //Bcc.Sでジャンプ 10174: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10175: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10176: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10177: //! 軽量化。リードを省略する 10178: } else { 10179: XEiJ.busRwse (t); //pcws 10180: } 10181: } 10182: irpSetPC (t + s); //pc0+2+オフセット 10183: } else if (XEiJ.regOC == 0x6a00) { //Bcc.Wで通過 10184: XEiJ.mpuCycleCount += 12; 10185: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10186: //リードを省略する 10187: } else { 10188: XEiJ.busRws (XEiJ.regPC); 10189: } 10190: XEiJ.regPC += 2; 10191: } else { //Bcc.Sで通過 10192: XEiJ.mpuCycleCount += 8; 10193: } 10194: } //irpBplsw 10195: 10196: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10197: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10198: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10199: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10200: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_001_sss_sss 10201: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 10202: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 10203: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 10204: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10205: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10206: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10207: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10208: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_010_sss_sss 10209: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 10210: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 10211: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 10212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10213: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10214: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10215: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10216: //BPL.S <label> |-|01----|-|-*---|-----| |0110_101_011_sss_sss 10217: //BNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 10218: //JBNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 10219: //JBPL.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 10220: public static void irpBpls () throws M68kException { 10221: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //Bccでジャンプ 10222: XEiJ.mpuCycleCount += 10; 10223: int t = XEiJ.regPC; //pc0+2 10224: int s = (byte) XEiJ.regOC; //オフセット 10225: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10226: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10227: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10228: //! 軽量化。リードを省略する 10229: } else { 10230: XEiJ.busRwse (t); //pcws 10231: } 10232: irpSetPC (t + s); //pc0+2+オフセット 10233: } else { //Bcc.Sで通過 10234: XEiJ.mpuCycleCount += 8; 10235: } 10236: } //irpBpls 10237: 10238: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10239: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10240: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10241: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10242: //BMI.W <label> |-|012346|-|-*---|-----| |0110_101_100_000_000-{offset} 10243: //BNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 10244: //JBMI.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 10245: //JBNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 10246: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) 10247: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 10248: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 10249: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 10250: //JBNMI.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 10251: //JBPL.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 10252: public static void irpBmisw () throws M68kException { 10253: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //Bccでジャンプ 10254: XEiJ.mpuCycleCount += 10; 10255: int t = XEiJ.regPC; //pc0+2 10256: int s = (byte) XEiJ.regOC; //オフセット 10257: if (s == 0) { //Bcc.Wでジャンプ 10258: XEiJ.regPC = t + 2; 10259: s = XEiJ.busRwse (t); //pcws 10260: } else { //Bcc.Sでジャンプ 10261: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10262: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10263: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10264: //! 軽量化。リードを省略する 10265: } else { 10266: XEiJ.busRwse (t); //pcws 10267: } 10268: } 10269: irpSetPC (t + s); //pc0+2+オフセット 10270: } else if (XEiJ.regOC == 0x6b00) { //Bcc.Wで通過 10271: XEiJ.mpuCycleCount += 12; 10272: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10273: //リードを省略する 10274: } else { 10275: XEiJ.busRws (XEiJ.regPC); 10276: } 10277: XEiJ.regPC += 2; 10278: } else { //Bcc.Sで通過 10279: XEiJ.mpuCycleCount += 8; 10280: } 10281: } //irpBmisw 10282: 10283: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10284: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10285: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10286: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10287: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_101_sss_sss 10288: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 10289: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 10290: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 10291: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10292: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10293: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10294: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10295: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_110_sss_sss 10296: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 10297: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 10298: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 10299: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10300: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10301: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10302: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10303: //BMI.S <label> |-|01----|-|-*---|-----| |0110_101_111_sss_sss 10304: //BNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 10305: //JBMI.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 10306: //JBNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 10307: public static void irpBmis () throws M68kException { 10308: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //Bccでジャンプ 10309: XEiJ.mpuCycleCount += 10; 10310: int t = XEiJ.regPC; //pc0+2 10311: int s = (byte) XEiJ.regOC; //オフセット 10312: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10313: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10314: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10315: //! 軽量化。リードを省略する 10316: } else { 10317: XEiJ.busRwse (t); //pcws 10318: } 10319: irpSetPC (t + s); //pc0+2+オフセット 10320: } else { //Bcc.Sで通過 10321: XEiJ.mpuCycleCount += 8; 10322: } 10323: } //irpBmis 10324: 10325: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10326: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10327: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10328: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10329: //BGE.W <label> |-|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} 10330: //BNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 10331: //JBGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 10332: //JBNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 10333: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) 10334: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 10335: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 10336: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 10337: //JBLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 10338: //JBNGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 10339: public static void irpBgesw () throws M68kException { 10340: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //Bccでジャンプ 10341: XEiJ.mpuCycleCount += 10; 10342: int t = XEiJ.regPC; //pc0+2 10343: int s = (byte) XEiJ.regOC; //オフセット 10344: if (s == 0) { //Bcc.Wでジャンプ 10345: XEiJ.regPC = t + 2; 10346: s = XEiJ.busRwse (t); //pcws 10347: } else { //Bcc.Sでジャンプ 10348: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10349: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10350: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10351: //! 軽量化。リードを省略する 10352: } else { 10353: XEiJ.busRwse (t); //pcws 10354: } 10355: } 10356: irpSetPC (t + s); //pc0+2+オフセット 10357: } else if (XEiJ.regOC == 0x6c00) { //Bcc.Wで通過 10358: XEiJ.mpuCycleCount += 12; 10359: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10360: //リードを省略する 10361: } else { 10362: XEiJ.busRws (XEiJ.regPC); 10363: } 10364: XEiJ.regPC += 2; 10365: } else { //Bcc.Sで通過 10366: XEiJ.mpuCycleCount += 8; 10367: } 10368: } //irpBgesw 10369: 10370: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10371: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10372: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10373: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10374: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_001_sss_sss 10375: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 10376: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 10377: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 10378: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10379: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10380: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10381: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10382: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_010_sss_sss 10383: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 10384: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 10385: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 10386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10387: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10388: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10389: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10390: //BGE.S <label> |-|01----|-|-*-*-|-----| |0110_110_011_sss_sss 10391: //BNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10392: //JBGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10393: //JBNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10394: public static void irpBges () throws M68kException { 10395: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //Bccでジャンプ 10396: XEiJ.mpuCycleCount += 10; 10397: int t = XEiJ.regPC; //pc0+2 10398: int s = (byte) XEiJ.regOC; //オフセット 10399: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10400: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10401: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10402: //! 軽量化。リードを省略する 10403: } else { 10404: XEiJ.busRwse (t); //pcws 10405: } 10406: irpSetPC (t + s); //pc0+2+オフセット 10407: } else { //Bcc.Sで通過 10408: XEiJ.mpuCycleCount += 8; 10409: } 10410: } //irpBges 10411: 10412: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10413: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10414: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10415: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10416: //BLT.W <label> |-|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} 10417: //BNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10418: //JBLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10419: //JBNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10420: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) 10421: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10422: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10423: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10424: //JBGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 10425: //JBNLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 10426: public static void irpBltsw () throws M68kException { 10427: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //Bccでジャンプ 10428: XEiJ.mpuCycleCount += 10; 10429: int t = XEiJ.regPC; //pc0+2 10430: int s = (byte) XEiJ.regOC; //オフセット 10431: if (s == 0) { //Bcc.Wでジャンプ 10432: XEiJ.regPC = t + 2; 10433: s = XEiJ.busRwse (t); //pcws 10434: } else { //Bcc.Sでジャンプ 10435: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10436: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10437: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10438: //! 軽量化。リードを省略する 10439: } else { 10440: XEiJ.busRwse (t); //pcws 10441: } 10442: } 10443: irpSetPC (t + s); //pc0+2+オフセット 10444: } else if (XEiJ.regOC == 0x6d00) { //Bcc.Wで通過 10445: XEiJ.mpuCycleCount += 12; 10446: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10447: //リードを省略する 10448: } else { 10449: XEiJ.busRws (XEiJ.regPC); 10450: } 10451: XEiJ.regPC += 2; 10452: } else { //Bcc.Sで通過 10453: XEiJ.mpuCycleCount += 8; 10454: } 10455: } //irpBltsw 10456: 10457: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10458: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10459: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10460: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10461: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_101_sss_sss 10462: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10463: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10464: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10465: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10466: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10467: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10468: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10469: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_110_sss_sss 10470: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10471: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10472: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10473: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10474: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10475: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10476: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10477: //BLT.S <label> |-|01----|-|-*-*-|-----| |0110_110_111_sss_sss 10478: //BNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10479: //JBLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10480: //JBNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10481: public static void irpBlts () throws M68kException { 10482: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //Bccでジャンプ 10483: XEiJ.mpuCycleCount += 10; 10484: int t = XEiJ.regPC; //pc0+2 10485: int s = (byte) XEiJ.regOC; //オフセット 10486: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10487: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10488: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10489: //! 軽量化。リードを省略する 10490: } else { 10491: XEiJ.busRwse (t); //pcws 10492: } 10493: irpSetPC (t + s); //pc0+2+オフセット 10494: } else { //Bcc.Sで通過 10495: XEiJ.mpuCycleCount += 8; 10496: } 10497: } //irpBlts 10498: 10499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10500: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10501: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10502: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10503: //BGT.W <label> |-|012346|-|-***-|-----| |0110_111_000_000_000-{offset} 10504: //BNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10505: //JBGT.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10506: //JBNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10507: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) 10508: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10509: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10510: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10511: //JBLE.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 10512: //JBNGT.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 10513: public static void irpBgtsw () throws M68kException { 10514: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //Bccでジャンプ 10515: XEiJ.mpuCycleCount += 10; 10516: int t = XEiJ.regPC; //pc0+2 10517: int s = (byte) XEiJ.regOC; //オフセット 10518: if (s == 0) { //Bcc.Wでジャンプ 10519: XEiJ.regPC = t + 2; 10520: s = XEiJ.busRwse (t); //pcws 10521: } else { //Bcc.Sでジャンプ 10522: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10523: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10524: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10525: //! 軽量化。リードを省略する 10526: } else { 10527: XEiJ.busRwse (t); //pcws 10528: } 10529: } 10530: irpSetPC (t + s); //pc0+2+オフセット 10531: } else if (XEiJ.regOC == 0x6e00) { //Bcc.Wで通過 10532: XEiJ.mpuCycleCount += 12; 10533: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10534: //リードを省略する 10535: } else { 10536: XEiJ.busRws (XEiJ.regPC); 10537: } 10538: XEiJ.regPC += 2; 10539: } else { //Bcc.Sで通過 10540: XEiJ.mpuCycleCount += 8; 10541: } 10542: } //irpBgtsw 10543: 10544: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10545: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10546: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10547: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10548: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_001_sss_sss 10549: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10550: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10551: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10552: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10553: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10554: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10555: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10556: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_010_sss_sss 10557: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10558: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10559: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10560: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10561: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10562: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10563: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10564: //BGT.S <label> |-|01----|-|-***-|-----| |0110_111_011_sss_sss 10565: //BNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10566: //JBGT.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10567: //JBNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10568: public static void irpBgts () throws M68kException { 10569: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //Bccでジャンプ 10570: XEiJ.mpuCycleCount += 10; 10571: int t = XEiJ.regPC; //pc0+2 10572: int s = (byte) XEiJ.regOC; //オフセット 10573: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10574: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10575: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10576: //! 軽量化。リードを省略する 10577: } else { 10578: XEiJ.busRwse (t); //pcws 10579: } 10580: irpSetPC (t + s); //pc0+2+オフセット 10581: } else { //Bcc.Sで通過 10582: XEiJ.mpuCycleCount += 8; 10583: } 10584: } //irpBgts 10585: 10586: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10587: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10588: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10589: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10590: //BLE.W <label> |-|012346|-|-***-|-----| |0110_111_100_000_000-{offset} 10591: //BNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10592: //JBLE.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10593: //JBNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10594: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) 10595: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10596: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10597: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10598: //JBGT.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 10599: //JBNLE.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 10600: public static void irpBlesw () throws M68kException { 10601: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //Bccでジャンプ 10602: XEiJ.mpuCycleCount += 10; 10603: int t = XEiJ.regPC; //pc0+2 10604: int s = (byte) XEiJ.regOC; //オフセット 10605: if (s == 0) { //Bcc.Wでジャンプ 10606: XEiJ.regPC = t + 2; 10607: s = XEiJ.busRwse (t); //pcws 10608: } else { //Bcc.Sでジャンプ 10609: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10610: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10611: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10612: //! 軽量化。リードを省略する 10613: } else { 10614: XEiJ.busRwse (t); //pcws 10615: } 10616: } 10617: irpSetPC (t + s); //pc0+2+オフセット 10618: } else if (XEiJ.regOC == 0x6f00) { //Bcc.Wで通過 10619: XEiJ.mpuCycleCount += 12; 10620: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10621: //リードを省略する 10622: } else { 10623: XEiJ.busRws (XEiJ.regPC); 10624: } 10625: XEiJ.regPC += 2; 10626: } else { //Bcc.Sで通過 10627: XEiJ.mpuCycleCount += 8; 10628: } 10629: } //irpBlesw 10630: 10631: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10632: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10633: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10635: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_101_sss_sss 10636: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10637: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10638: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10639: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10640: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10641: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10642: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10643: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_110_sss_sss 10644: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10645: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10646: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10647: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10648: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10649: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10651: //BLE.S <label> |-|01----|-|-***-|-----| |0110_111_111_sss_sss 10652: //BNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10653: //JBLE.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10654: //JBNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10655: public static void irpBles () throws M68kException { 10656: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //Bccでジャンプ 10657: XEiJ.mpuCycleCount += 10; 10658: int t = XEiJ.regPC; //pc0+2 10659: int s = (byte) XEiJ.regOC; //オフセット 10660: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10661: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10662: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10663: //! 軽量化。リードを省略する 10664: } else { 10665: XEiJ.busRwse (t); //pcws 10666: } 10667: irpSetPC (t + s); //pc0+2+オフセット 10668: } else { //Bcc.Sで通過 10669: XEiJ.mpuCycleCount += 8; 10670: } 10671: } //irpBles 10672: 10673: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10674: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10675: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10676: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10677: //IOCS <name> |A|012346|-|UUUUU|UUUUU| |0111_000_0dd_ddd_ddd-0100111001001111 [MOVEQ.L #<data>,D0;TRAP #15] 10678: //MOVEQ.L #<data>,Dq |-|012346|-|-UUUU|-**00| |0111_qqq_0dd_ddd_ddd 10679: public static void irpMoveq () throws M68kException { 10680: XEiJ.mpuCycleCount += 4; 10681: int z; 10682: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = (byte) XEiJ.regOC; 10683: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10684: } //irpMoveq 10685: 10686: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10687: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10688: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10689: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10690: //MVS.B <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B) 10691: // 10692: //MVS.B <ea>,Dq 10693: // バイトデータをロングに符号拡張してDqの全体を更新する 10694: public static void irpMvsByte () throws M68kException { 10695: XEiJ.mpuCycleCount += 4; 10696: int ea = XEiJ.regOC & 63; 10697: int z; 10698: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 10699: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10700: } //irpMvsByte 10701: 10702: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10703: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10704: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10705: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10706: //MVS.W <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B) 10707: // 10708: //MVS.W <ea>,Dq 10709: // ワードデータをロングに符号拡張してDqの全体を更新する 10710: public static void irpMvsWord () throws M68kException { 10711: XEiJ.mpuCycleCount += 4; 10712: int ea = XEiJ.regOC & 63; 10713: int z; 10714: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 10715: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10716: } //irpMvsWord 10717: 10718: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10719: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10720: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10721: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10722: //MVZ.B <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B) 10723: // 10724: //MVZ.B <ea>,Dq 10725: // バイトデータをロングにゼロ拡張してDqの全体を更新する 10726: public static void irpMvzByte () throws M68kException { 10727: XEiJ.mpuCycleCount += 4; 10728: int ea = XEiJ.regOC & 63; 10729: int z; 10730: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? 0xff & XEiJ.regRn[ea] : XEiJ.busRbz (efaAnyByte (ea)); 10731: XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0); 10732: } //irpMvzByte 10733: 10734: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10735: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10736: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10738: //MVZ.W <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B) 10739: // 10740: //MVZ.W <ea>,Dq 10741: // ワードデータをロングにゼロ拡張してDqの全体を更新する 10742: public static void irpMvzWord () throws M68kException { 10743: XEiJ.mpuCycleCount += 4; 10744: int ea = XEiJ.regOC & 63; 10745: int z; 10746: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); 10747: XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0); 10748: } //irpMvzWord 10749: 10750: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10751: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10752: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10753: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10754: //OR.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr 10755: public static void irpOrToRegByte () throws M68kException { 10756: XEiJ.mpuCycleCount += 4; 10757: int ea = XEiJ.regOC & 63; 10758: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= 255 & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))))]; //ccr_tst_byte。0拡張してからOR 10759: } //irpOrToRegByte 10760: 10761: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10762: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10763: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10764: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10765: //OR.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr 10766: public static void irpOrToRegWord () throws M68kException { 10767: XEiJ.mpuCycleCount += 4; 10768: int ea = XEiJ.regOC & 63; 10769: int z = (short) (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea))); //0拡張してからOR 10770: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10771: } //irpOrToRegWord 10772: 10773: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10774: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10775: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10776: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10777: //OR.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr 10778: public static void irpOrToRegLong () throws M68kException { 10779: int ea = XEiJ.regOC & 63; 10780: int qqq = XEiJ.regOC >> 9 & 7; 10781: int z; 10782: if (ea < XEiJ.EA_AR) { //OR.L Dr,Dq 10783: XEiJ.mpuCycleCount += 8; 10784: XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.regRn[ea]; 10785: } else { //OR.L <mem>,Dq 10786: XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 10787: XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.busRls (efaAnyLong (ea)); 10788: } 10789: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10790: } //irpOrToRegLong 10791: 10792: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10793: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10794: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10795: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10796: //DIVU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr 10797: // 10798: //DIVU.W <ea>,Dq 10799: // M68000PRMでDIVU.Wのオーバーフローの条件が16bit符号あり整数と書かれているのは16bit符号なし整数の間違い 10800: public static void irpDivuWord () throws M68kException { 10801: // X 変化しない 10802: // N ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア 10803: // Z ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア 10804: // V ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア 10805: // C 常にクリア 10806: int ea = XEiJ.regOC & 63; 10807: int qqq = XEiJ.regOC >> 9 & 7; 10808: int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); //除数 10809: int x = XEiJ.regRn[qqq]; //被除数 10810: XEiJ.mpuCycleCount += irpDivuCyclesModified (x, y); 10811: if (y == 0) { //ゼロ除算 10812: //Dqは変化しない 10813: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10814: (x < 0 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が負のときセット、さもなくばクリア 10815: (x >> 16 == 0 ? XEiJ.REG_CCR_Z : 0) | //Zは被除数が$0000xxxxのときセット、さもなくばクリア 10816: XEiJ.REG_CCR_V //Vは常にセット 10817: ); //Cは常にクリア 10818: M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO; 10819: throw M68kException.m6eSignal; 10820: } 10821: //無理にintで符号なし除算をやろうとするよりもdoubleにキャストしてから割ったほうが速い 10822: // intの除算をdoubleの除算器で行うプロセッサならばなおさら 10823: //被除数を符号なし32ビットとみなすためlongを経由してdoubleに変換する 10824: //doubleからlongやintへのキャストは小数点以下が切り捨てられ、オーバーフローは表現できる絶対値最大の値になる 10825: //doubleから直接intに戻しているので0xffffffff/0x0001=0xffffffffが絶対値最大の0x7fffffffになってしまうが、 10826: //DIVU.Wではオーバーフローになることに変わりはないのでよいことにする 10827: // 符号なし32ビットの0xffffffffにしたいときは戻すときもlongを経由すればよい 10828: int z = (int) ((double) ((long) x & 0xffffffffL) / (double) y); //商 10829: if (z >>> 16 != 0) { //オーバーフローあり 10830: //Dqは変化しない 10831: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10832: (x < 0 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が負のときセット、さもなくばクリア 10833: //Zは常にクリア 10834: XEiJ.REG_CCR_V //Vは常にセット 10835: ); //Cは常にクリア 10836: } else { //オーバーフローなし 10837: XEiJ.regRn[qqq] = x - y * z << 16 | z; //余り<<16|商 10838: z = (short) z; 10839: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10840: (z < 0 ? XEiJ.REG_CCR_N : 0) | //Nは商が負のときセット、さもなくばクリア 10841: (z == 0 ? XEiJ.REG_CCR_Z : 0) //Zは商が0のときセット、さもなくばクリア 10842: //Vは常にクリア 10843: ); //Cは常にクリア 10844: } //if オーバーフローあり/オーバーフローなし 10845: } //irpDivuWord 10846: 10847: //DIVUの実行時間 10848: // 以下に実効アドレスの時間を加える 10849: // ゼロ除算のとき38 10850: // オーバーフローのとき10 10851: // 正常終了のとき76+ 10852: // 商のビット15~1について 10853: // 被除数のビット16が1で商が1のとき0 10854: // 被除数のビット16が0で商が1のとき2 10855: // 被除数のビット16が0で商が0のとき4 10856: // 補足 10857: // 商のビット0を計算に含めると最大140になりマニュアルと一致する 10858: // 参考 10859: // https://www.atari-forum.com/viewtopic.php?t=6484 10860: public static int irpDivuCyclesModified (int x, int y) { 10861: y &= 0xffff; //ゼロ拡張 10862: if (y == 0) { //ゼロ除算 10863: return 38; 10864: } 10865: int r = x >>> 16; //余り。符号なし右シフト 10866: if (y <= r) { //オーバーフロー 10867: return 10; 10868: } 10869: int c = 76; 10870: for (int i = 15; 0 < i; i--) { //ビット0を含まない 10871: r = r << 1 | ((x >> i) & 1); 10872: if (0x10000 <= r) { //被除数のビット16が1で商が1 10873: r -= y; 10874: } else if (y <= r) { //被除数のビット16が0で商が1 10875: r -= y; 10876: c += 2; 10877: } else { //被除数のビット16が0で商が0 10878: c += 4; 10879: } 10880: } 10881: return c; 10882: } 10883: 10884: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10885: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10886: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10887: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10888: //SBCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_000_rrr 10889: //SBCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_001_rrr 10890: //OR.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_100_mmm_rrr 10891: public static void irpOrToMemByte () throws M68kException { 10892: int ea = XEiJ.regOC & 63; 10893: if (ea >= XEiJ.EA_MM) { //OR.B Dq,<ea> 10894: XEiJ.mpuCycleCount += 8; 10895: int a = efaMltByte (ea); 10896: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRbs (a); 10897: XEiJ.busWb (a, z); 10898: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 10899: } else if (ea < XEiJ.EA_AR) { //SBCD.B Dr,Dq 10900: int qqq = XEiJ.regOC >> 9 & 7; 10901: XEiJ.mpuCycleCount += 6; 10902: int x; 10903: XEiJ.regRn[qqq] = ~0xff & (x = XEiJ.regRn[qqq]) | irpSbcd (x, XEiJ.regRn[ea]); 10904: } else { //SBCD.B -(Ar),-(Aq) 10905: XEiJ.mpuCycleCount += 18; 10906: int y = XEiJ.busRbz (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 10907: int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (64 - 8)]; 10908: XEiJ.busWb (a, irpSbcd (XEiJ.busRbz (a), y)); 10909: } 10910: } //irpOrToMemByte 10911: 10912: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10913: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10914: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10915: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10916: //OR.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_101_mmm_rrr 10917: public static void irpOrToMemWord () throws M68kException { 10918: XEiJ.mpuCycleCount += 8; 10919: int ea = XEiJ.regOC & 63; 10920: int a = efaMltWord (ea); 10921: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRws (a); 10922: XEiJ.busWw (a, z); 10923: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 10924: } //irpOrToMemWord 10925: 10926: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10927: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10928: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10929: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10930: //OR.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_110_mmm_rrr 10931: public static void irpOrToMemLong () throws M68kException { 10932: XEiJ.mpuCycleCount += 12; 10933: int ea = XEiJ.regOC & 63; 10934: int a = efaMltLong (ea); 10935: int z; 10936: XEiJ.busWl (a, z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRls (a)); 10937: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10938: } //irpOrToMemLong 10939: 10940: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10941: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10942: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10943: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10944: //DIVS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr 10945: // 10946: //DIVS.W <ea>,Dq 10947: // DIVSの余りの符号は被除数と一致 10948: // M68000PRMでDIVS.Wのアドレッシングモードがデータ可変と書かれているのはデータの間違い 10949: public static void irpDivsWord () throws M68kException { 10950: // X 変化しない 10951: // N ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア 10952: // Z ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア 10953: // V ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア 10954: // C 常にクリア 10955: //divsの余りの符号は被除数と一致 10956: //Javaの除算演算子の挙動 10957: // 10 / 3 == 3 10 % 3 == 1 10 = 3 * 3 + 1 10958: // 10 / -3 == -3 10 % -3 == 1 10 = -3 * -3 + 1 10959: // -10 / 3 == -3 -10 % 3 == -1 -10 = 3 * -3 + -1 10960: // -10 / -3 == 3 -10 % -3 == -1 -10 = -3 * 3 + -1 10961: int ea = XEiJ.regOC & 63; 10962: int qqq = XEiJ.regOC >> 9 & 7; 10963: int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //除数 10964: int x = XEiJ.regRn[qqq]; //被除数 10965: XEiJ.mpuCycleCount += irpDivsCycles (x, y); 10966: if (y == 0) { //ゼロ除算 10967: //Dqは変化しない 10968: //!!! MC68030はゼロ除算のときオペランド以外の要因でZとVが変化する。その要因がわからないとZとVを正確に再現することができない 10969: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10970: //Nは常にクリア 10971: XEiJ.REG_CCR_Z | //Zは常にセット 10972: (x == 0x00008000 ? ~XEiJ.regCCR & XEiJ.REG_CCR_V : (0 <= x && x != 0x7fffffff) || x == 0x80000000 ? XEiJ.REG_CCR_V : XEiJ.regCCR & XEiJ.REG_CCR_V) //Vは被除数が$00008000のとき反転、被除数が$7fffffffを除く正または$80000000のときセット、さもなくば変化しない 10973: ); //Cは常にクリア 10974: M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO; 10975: throw M68kException.m6eSignal; 10976: } 10977: int z = x / y; //商 10978: if ((short) z != z) { //オーバーフローあり 10979: //Dqは変化しない 10980: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10981: (x == 0x80000000 || (z & 0xffff0080) == 0x00000080 || (z & 0xffff0080) == 0xffff0080 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が$80000000または商が$0000xxyyまたは$ffffxxyyでyyが負のときセット、さもなくばクリア 10982: (z == 0x00008000 || (((z & 0xffff00ff) == 0x00000000 || (z & 0xffff00ff) == 0xffff0000) && (z & 0x0000ff00) != 0) ? XEiJ.REG_CCR_Z : 0) | //Zは商が$00008000または商が$0000xxyyまたは$ffffxxyyでxxが0でなくてyyが0のときセット、さもなくばクリア 10983: XEiJ.REG_CCR_V //Vは常にセット 10984: ); //Cは常にクリア 10985: } else { //オーバーフローなし 10986: XEiJ.regRn[qqq] = x - y * z << 16 | (char) z; //Dqは余り<<16|商&$ffff 10987: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10988: (z < 0 ? XEiJ.REG_CCR_N : 0) | //Nは商が負のときセット、さもなくばクリア 10989: (z == 0 ? XEiJ.REG_CCR_Z : 0) //Zは商が0のときセット、さもなくばクリア 10990: //Vは常にクリア 10991: ); //Cは常にクリア 10992: } //if オーバーフローあり/オーバーフローなし 10993: } //irpDivsWord 10994: 10995: //DIVSの実行時間 10996: // 以下に実効アドレスの時間を加える 10997: // ゼロ除算のとき38 10998: // 符号なしオーバーフローのとき 10999: // 被除数が正のとき16 11000: // 被除数が負のとき18 11001: // 正常終了または符号ありオーバーフローのとき 11002: // 被除数が正で除数が正のとき120+ 11003: // 被除数が正で除数が負のとき122+ 11004: // 被除数が負で除数が正のとき126+ 11005: // 被除数が負で除数が負のとき124+ 11006: // 符号なし商のビット15~1について 11007: // 符号なし商が1のとき0 11008: // 符号なし商が0のとき2 11009: // 補足 11010: // 符号なし商のビット0を計算に含めると最大158になりマニュアルと一致する 11011: // 参考 11012: // https://www.atari-forum.com/viewtopic.php?t=6484 11013: public static int irpDivsCycles (int x, int y) { 11014: y = (short) y; //符号拡張 11015: if (y == 0) { //ゼロ除算 11016: return 38; 11017: } 11018: //符号あり除算だと0x80000000/0xffffffffが0x00000000になる環境があるので 11019: //符号なし除算を用いる。JavaはInteger.divideUnsigned 11020: //符号なし商に0x80000000が含まれることに注意 11021: int q = Integer.divideUnsigned ((x < 0 ? -x : x), (y < 0 ? -y : y)); 11022: if ((q & 0xffff0000) != 0) { //符号なしオーバーフロー。0xffff<qは不可 11023: return x < 0 ? 18 : 16; 11024: } 11025: int t = ~q; 11026: t = (t & 0x5554) + ((t >> 1) & 0x5555); //0x5554に注意。ビット0を含まない 11027: t = (t & 0x3333) + ((t >> 2) & 0x3333); 11028: t = (t & 0x0F0F) + ((t >> 4) & 0x0F0F); 11029: t = (t & 0x00FF) + ((t >> 8) & 0x00FF); 11030: return (x < 0 ? y < 0 ? 124 : 126 : y < 0 ? 122 : 120) + (t << 1); 11031: } 11032: 11033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11034: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11035: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11036: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11037: //SUB.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr 11038: public static void irpSubToRegByte () throws M68kException { 11039: XEiJ.mpuCycleCount += 4; 11040: int ea = XEiJ.regOC & 63; 11041: int qqq = XEiJ.regOC >> 9 & 7; 11042: int x, y, z; 11043: y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 11044: x = XEiJ.regRn[qqq]; 11045: z = x - y; 11046: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11047: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11048: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 11049: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_byte 11050: } //irpSubToRegByte 11051: 11052: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11053: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11054: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11055: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11056: //SUB.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr 11057: public static void irpSubToRegWord () throws M68kException { 11058: XEiJ.mpuCycleCount += 4; 11059: int ea = XEiJ.regOC & 63; 11060: int qqq = XEiJ.regOC >> 9 & 7; 11061: int x, y, z; 11062: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11063: x = XEiJ.regRn[qqq]; 11064: z = x - y; 11065: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11066: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11067: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 11068: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_word 11069: } //irpSubToRegWord 11070: 11071: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11072: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11073: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11074: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11075: //SUB.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr 11076: public static void irpSubToRegLong () throws M68kException { 11077: int ea = XEiJ.regOC & 63; 11078: int qqq = XEiJ.regOC >> 9 & 7; 11079: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11080: int x, y, z; 11081: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11082: x = XEiJ.regRn[qqq]; 11083: z = x - y; 11084: XEiJ.regRn[qqq] = z; 11085: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11086: ((x ^ y) & (x ^ z)) >> 30 & XEiJ.REG_CCR_V | 11087: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 11088: } //irpSubToRegLong 11089: 11090: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11091: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11092: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11093: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11094: //SUBA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr 11095: //SUB.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq] 11096: //CLR.W Ar |A|012346|-|-----|-----| A |1001_rrr_011_001_rrr [SUBA.W Ar,Ar] 11097: // 11098: //SUBA.W <ea>,Aq 11099: // ソースを符号拡張してロングで減算する 11100: public static void irpSubaWord () throws M68kException { 11101: XEiJ.mpuCycleCount += 8; 11102: int ea = XEiJ.regOC & 63; 11103: int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11104: XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z; //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可 11105: //ccrは変化しない 11106: } //irpSubaWord 11107: 11108: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11109: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11110: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11111: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11112: //SUBX.B Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_100_000_rrr 11113: //SUBX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_100_001_rrr 11114: //SUB.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_100_mmm_rrr 11115: public static void irpSubToMemByte () throws M68kException { 11116: int ea = XEiJ.regOC & 63; 11117: int a, x, y, z; 11118: if (ea < XEiJ.EA_MM) { 11119: if (ea < XEiJ.EA_AR) { //SUBX.B Dr,Dq 11120: int qqq = XEiJ.regOC >> 9 & 7; 11121: XEiJ.mpuCycleCount += 4; 11122: y = XEiJ.regRn[ea]; 11123: x = XEiJ.regRn[qqq]; 11124: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11125: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11126: } else { //SUBX.B -(Ar),-(Aq) 11127: XEiJ.mpuCycleCount += 18; 11128: y = XEiJ.busRbs (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11129: a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15]; //1qqq=aqq 11130: x = XEiJ.busRbs (a); 11131: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11132: XEiJ.busWb (a, z); 11133: } 11134: XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //SUBXはZをクリアすることはあるがセットすることはない 11135: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 11136: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx_byte 11137: } else { //SUB.B Dq,<ea> 11138: XEiJ.mpuCycleCount += 8; 11139: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11140: a = efaMltByte (ea); 11141: x = XEiJ.busRbs (a); 11142: z = x - y; 11143: XEiJ.busWb (a, z); 11144: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11145: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 11146: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_byte 11147: } 11148: } //irpSubToMemByte 11149: 11150: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11151: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11152: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11153: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11154: //SUBX.W Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_101_000_rrr 11155: //SUBX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_101_001_rrr 11156: //SUB.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_101_mmm_rrr 11157: public static void irpSubToMemWord () throws M68kException { 11158: int ea = XEiJ.regOC & 63; 11159: int a, x, y, z; 11160: if (ea < XEiJ.EA_MM) { 11161: if (ea < XEiJ.EA_AR) { //SUBX.W Dr,Dq 11162: int qqq = XEiJ.regOC >> 9 & 7; 11163: XEiJ.mpuCycleCount += 4; 11164: y = XEiJ.regRn[ea]; 11165: x = XEiJ.regRn[qqq]; 11166: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11167: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11168: } else { //SUBX.W -(Ar),-(Aq) 11169: XEiJ.mpuCycleCount += 18; 11170: y = XEiJ.busRws (XEiJ.regRn[ea] -= 2); //このr[ea]はアドレスレジスタ 11171: a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2; 11172: x = XEiJ.busRws (a); 11173: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11174: XEiJ.busWw (a, z); 11175: } 11176: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11177: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 11178: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx_word 11179: } else { //SUB.W Dq,<ea> 11180: XEiJ.mpuCycleCount += 8; 11181: y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11182: a = efaMltWord (ea); 11183: x = XEiJ.busRws (a); 11184: z = x - y; 11185: XEiJ.busWw (a, z); 11186: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11187: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 11188: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_word 11189: } 11190: } //irpSubToMemWord 11191: 11192: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11193: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11194: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11195: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11196: //SUBX.L Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_110_000_rrr 11197: //SUBX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_110_001_rrr 11198: //SUB.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_110_mmm_rrr 11199: public static void irpSubToMemLong () throws M68kException { 11200: int ea = XEiJ.regOC & 63; 11201: if (ea < XEiJ.EA_MM) { 11202: int x; 11203: int y; 11204: int z; 11205: if (ea < XEiJ.EA_AR) { //SUBX.L Dr,Dq 11206: int qqq = XEiJ.regOC >> 9 & 7; 11207: XEiJ.mpuCycleCount += 8; 11208: XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) - (y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11209: } else { //SUBX.L -(Ar),-(Aq) 11210: XEiJ.mpuCycleCount += 30; 11211: y = XEiJ.busRls (XEiJ.regRn[ea] -= 4); //このr[ea]はアドレスレジスタ 11212: int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4; 11213: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 11214: } 11215: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 11216: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11217: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx 11218: } else { //SUB.L Dq,<ea> 11219: XEiJ.mpuCycleCount += 12; 11220: int a = efaMltLong (ea); 11221: int x; 11222: int y; 11223: int z; 11224: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7])); 11225: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11226: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11227: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 11228: } 11229: } //irpSubToMemLong 11230: 11231: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11232: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11233: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11234: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11235: //SUBA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr 11236: //SUB.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq] 11237: //CLR.L Ar |A|012346|-|-----|-----| A |1001_rrr_111_001_rrr [SUBA.L Ar,Ar] 11238: public static void irpSubaLong () throws M68kException { 11239: int ea = XEiJ.regOC & 63; 11240: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //Dr/Ar/#<data>のとき8+、それ以外は6+ 11241: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11242: XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z; //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可 11243: //ccrは変化しない 11244: } //irpSubaLong 11245: 11246: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11247: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11248: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11249: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11250: //SXCALL <name> |A|012346|-|UUUUU|*****| |1010_0dd_ddd_ddd_ddd [ALINE #<data>] 11251: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11252: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11253: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11254: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11255: //ALINE #<data> |-|012346|-|UUUUU|*****| |1010_ddd_ddd_ddd_ddd (line 1010 emulator) 11256: public static void irpAline () throws M68kException { 11257: XEiJ.mpuCycleCount += 34; 11258: if (XEiJ.MPU_INLINE_EXCEPTION) { 11259: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 11260: int sp = XEiJ.regRn[15]; 11261: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 11262: if (XEiJ.regSRS == 0) { //ユーザモードのとき 11263: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 11264: XEiJ.mpuUSP = sp; //USPを保存 11265: sp = XEiJ.mpuISP; //SSPを復元 11266: if (DataBreakPoint.DBP_ON) { 11267: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 11268: } else { 11269: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 11270: } 11271: if (InstructionBreakPoint.IBP_ON) { 11272: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 11273: } 11274: } 11275: int vectorOffset = M68kException.M6E_LINE_1010_EMULATOR << 2; //vector offset 11276: XEiJ.regRn[15] = sp -= 8; //short format 11277: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 11278: XEiJ.busWl (sp + 2, XEiJ.regPC0); //program counter 11279: XEiJ.busWw (sp, save_sr); //status register 11280: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 11281: } else { 11282: irpException (M68kException.M6E_LINE_1010_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは命令の先頭 11283: } 11284: } //irpAline 11285: 11286: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11287: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11288: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11289: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11290: //CMP.B <ea>,Dq |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr 11291: public static void irpCmpByte () throws M68kException { 11292: XEiJ.mpuCycleCount += 4; 11293: int ea = XEiJ.regOC & 63; 11294: int x; 11295: int y; 11296: int z = (byte) ((x = (byte) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)))); 11297: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11298: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11299: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11300: } //irpCmpByte 11301: 11302: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11303: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11304: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11305: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11306: //CMP.W <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr 11307: public static void irpCmpWord () throws M68kException { 11308: XEiJ.mpuCycleCount += 4; 11309: int ea = XEiJ.regOC & 63; 11310: int x; 11311: int y; 11312: int z = (short) ((x = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)))); //このr[ea]はデータレジスタまたはアドレスレジスタ 11313: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11314: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11315: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11316: } //irpCmpWord 11317: 11318: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11319: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11320: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11321: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11322: //CMP.L <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr 11323: public static void irpCmpLong () throws M68kException { 11324: XEiJ.mpuCycleCount += 6; 11325: int ea = XEiJ.regOC & 63; 11326: int x; 11327: int y; 11328: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea))); //このr[ea]はデータレジスタまたはアドレスレジスタ 11329: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11330: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11331: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11332: } //irpCmpLong 11333: 11334: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11335: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11336: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11337: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11338: //CMPA.W <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr 11339: //CMP.W <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq] 11340: // 11341: //CMPA.W <ea>,Aq 11342: // ソースを符号拡張してロングで比較する 11343: public static void irpCmpaWord () throws M68kException { 11344: XEiJ.mpuCycleCount += 6; 11345: int ea = XEiJ.regOC & 63; 11346: //ソースを符号拡張してからロングで比較する 11347: int y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11348: int x; 11349: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y; 11350: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11351: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11352: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11353: } //irpCmpaWord 11354: 11355: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11356: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11357: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11358: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11359: //EOR.B Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_100_mmm_rrr 11360: //CMPM.B (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_100_001_rrr 11361: public static void irpEorByte () throws M68kException { 11362: int ea = XEiJ.regOC & 63; 11363: if (ea >> 3 == XEiJ.MMM_AR) { //CMPM.B (Ar)+,(Aq)+ 11364: XEiJ.mpuCycleCount += 12; 11365: int y = XEiJ.busRbs (XEiJ.regRn[ea]++); //このr[ea]はアドレスレジスタ 11366: int x; 11367: int z = (byte) ((x = XEiJ.busRbs (XEiJ.regRn[XEiJ.regOC >> 9 & 15]++)) - y); 11368: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11369: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11370: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11371: } else { 11372: int qqq = XEiJ.regOC >> 9 & 7; 11373: int z; 11374: if (ea < XEiJ.EA_AR) { //EOR.B Dq,Dr 11375: XEiJ.mpuCycleCount += 4; 11376: z = XEiJ.regRn[ea] ^= 255 & XEiJ.regRn[qqq]; //0拡張してからEOR 11377: } else { //EOR.B Dq,<mem> 11378: XEiJ.mpuCycleCount += 8; 11379: int a = efaMltByte (ea); 11380: XEiJ.busWb (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRbs (a)); 11381: } 11382: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 11383: } 11384: } //irpEorByte 11385: 11386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11387: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11388: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11389: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11390: //EOR.W Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_101_mmm_rrr 11391: //CMPM.W (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_101_001_rrr 11392: public static void irpEorWord () throws M68kException { 11393: int ea = XEiJ.regOC & 63; 11394: int rrr = XEiJ.regOC & 7; 11395: int mmm = ea >> 3; 11396: if (mmm == XEiJ.MMM_AR) { //CMPM.W (Ar)+,(Aq)+ 11397: XEiJ.mpuCycleCount += 12; 11398: int y = XEiJ.busRws ((XEiJ.regRn[ea] += 2) - 2); //このr[ea]はアドレスレジスタ 11399: int x; 11400: int z = (short) ((x = XEiJ.busRws ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2)) - y); 11401: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11402: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11403: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11404: } else { 11405: int qqq = XEiJ.regOC >> 9 & 7; 11406: int z; 11407: if (ea < XEiJ.EA_AR) { //EOR.W Dq,Dr 11408: XEiJ.mpuCycleCount += 4; 11409: z = XEiJ.regRn[rrr] ^= (char) XEiJ.regRn[qqq]; //0拡張してからEOR 11410: } else { //EOR.W Dq,<mem> 11411: XEiJ.mpuCycleCount += 8; 11412: int a = efaMltWord (ea); 11413: XEiJ.busWw (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRws (a)); 11414: } 11415: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 11416: } 11417: } //irpEorWord 11418: 11419: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11420: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11421: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11422: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11423: //EOR.L Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_110_mmm_rrr 11424: //CMPM.L (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_110_001_rrr 11425: public static void irpEorLong () throws M68kException { 11426: int ea = XEiJ.regOC & 63; 11427: if (ea >> 3 == XEiJ.MMM_AR) { //CMPM.L (Ar)+,(Aq)+ 11428: XEiJ.mpuCycleCount += 20; 11429: int y = XEiJ.busRls ((XEiJ.regRn[ea] += 4) - 4); //このr[ea]はアドレスレジスタ 11430: int x; 11431: int z = (x = XEiJ.busRls ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 4) - 4)) - y; 11432: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11433: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11434: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11435: } else { 11436: int qqq = XEiJ.regOC >> 9 & 7; 11437: int z; 11438: if (ea < XEiJ.EA_AR) { //EOR.L Dq,Dr 11439: XEiJ.mpuCycleCount += 8; 11440: XEiJ.regRn[ea] = z = XEiJ.regRn[ea] ^ XEiJ.regRn[qqq]; 11441: } else { //EOR.L Dq,<mem> 11442: XEiJ.mpuCycleCount += 12; 11443: int a = efaMltLong (ea); 11444: XEiJ.busWl (a, z = XEiJ.busRls (a) ^ XEiJ.regRn[qqq]); 11445: } 11446: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11447: } 11448: } //irpEorLong 11449: 11450: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11451: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11452: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11453: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11454: //CMPA.L <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr 11455: //CMP.L <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq] 11456: public static void irpCmpaLong () throws M68kException { 11457: XEiJ.mpuCycleCount += 6; 11458: int ea = XEiJ.regOC & 63; 11459: int y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11460: int x; 11461: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y; 11462: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11463: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11464: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11465: } //irpCmpaLong 11466: 11467: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11468: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11469: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11470: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11471: //AND.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr 11472: public static void irpAndToRegByte () throws M68kException { 11473: XEiJ.mpuCycleCount += 4; 11474: int ea = XEiJ.regOC & 63; 11475: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~255 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))))]; //ccr_tst_byte。1拡張してからAND 11476: } //irpAndToRegByte 11477: 11478: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11479: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11480: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11481: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11482: //AND.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr 11483: public static void irpAndToRegWord () throws M68kException { 11484: XEiJ.mpuCycleCount += 4; 11485: int ea = XEiJ.regOC & 63; 11486: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~65535 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea))); //1拡張してからAND 11487: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 11488: } //irpAndToRegWord 11489: 11490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11491: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11492: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11493: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11494: //AND.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr 11495: public static void irpAndToRegLong () throws M68kException { 11496: int ea = XEiJ.regOC & 63; 11497: int qqq = XEiJ.regOC >> 9 & 7; 11498: int z; 11499: if (ea < XEiJ.EA_AR) { //AND.L Dr,Dq 11500: XEiJ.mpuCycleCount += 8; 11501: z = XEiJ.regRn[qqq] &= XEiJ.regRn[ea]; 11502: } else { //AND.L <mem>,Dq 11503: XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11504: z = XEiJ.regRn[qqq] &= XEiJ.busRls (efaAnyLong (ea)); 11505: } 11506: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11507: } //irpAndToRegLong 11508: 11509: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11510: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11511: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11512: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11513: //MULU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr 11514: public static void irpMuluWord () throws M68kException { 11515: int ea = XEiJ.regOC & 63; 11516: int qqq = XEiJ.regOC >> 9 & 7; 11517: int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); 11518: //muluの所要サイクル数は38+2n 11519: //nはソースに含まれる1の数 11520: int s = y & 0x5555; 11521: s += y - s >> 1; 11522: int t = s & 0x3333; 11523: t += s - t >> 2; 11524: t += t >> 4; 11525: XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1); //38+2n 11526: //XEiJ.mpuCycleCount += 38 + (Integer.bitCount (y) << 1); //少し遅くなる 11527: int z; 11528: XEiJ.regRn[qqq] = z = (char) XEiJ.regRn[qqq] * y; //積の下位32ビット。オーバーフローは無視 11529: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11530: } //irpMuluWord 11531: 11532: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11533: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11534: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11535: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11536: //ABCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_000_rrr 11537: //ABCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_001_rrr 11538: //AND.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_100_mmm_rrr 11539: public static void irpAndToMemByte () throws M68kException { 11540: int ea = XEiJ.regOC & 63; 11541: if (ea >= XEiJ.EA_MM) { //AND.B Dq,<ea> 11542: XEiJ.mpuCycleCount += 8; 11543: int a = efaMltByte (ea); 11544: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRbs (a); 11545: XEiJ.busWb (a, z); 11546: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 11547: } else if (ea < XEiJ.EA_AR) { //ABCD.B Dr,Dq 11548: int qqq = XEiJ.regOC >> 9 & 7; 11549: XEiJ.mpuCycleCount += 6; 11550: XEiJ.regRn[qqq] = ~0xff & XEiJ.regRn[qqq] | irpAbcd (XEiJ.regRn[qqq], XEiJ.regRn[ea]); 11551: } else { //ABCD.B -(Ar),-(Aq) 11552: XEiJ.mpuCycleCount += 18; 11553: int y = XEiJ.busRbz (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11554: int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (96 - 8)]; 11555: XEiJ.busWb (a, irpAbcd (XEiJ.busRbz (a), y)); 11556: } 11557: } //irpAndToMemByte 11558: 11559: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11560: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11561: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11562: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11563: //EXG.L Dq,Dr |-|012346|-|-----|-----| |1100_qqq_101_000_rrr 11564: //EXG.L Aq,Ar |-|012346|-|-----|-----| |1100_qqq_101_001_rrr 11565: //AND.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_101_mmm_rrr 11566: public static void irpAndToMemWord () throws M68kException { 11567: int ea = XEiJ.regOC & 63; 11568: if (ea < XEiJ.EA_MM) { //EXG 11569: XEiJ.mpuCycleCount += 6; 11570: if (ea < XEiJ.EA_AR) { //EXG.L Dq,Dr 11571: int qqq = XEiJ.regOC >> 9 & 7; 11572: int t = XEiJ.regRn[qqq]; 11573: XEiJ.regRn[qqq] = XEiJ.regRn[ea]; 11574: XEiJ.regRn[ea] = t; 11575: } else { //EXG.L Aq,Ar 11576: int aqq = (XEiJ.regOC >> 9) - (96 - 8); 11577: int t = XEiJ.regRn[aqq]; 11578: XEiJ.regRn[aqq] = XEiJ.regRn[ea]; //このr[ea]アドレスレジスタ 11579: XEiJ.regRn[ea] = t; //このr[ea]はアドレスレジスタ 11580: } 11581: } else { //AND.W Dq,<ea> 11582: XEiJ.mpuCycleCount += 8; 11583: int a = efaMltWord (ea); 11584: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRws (a); 11585: XEiJ.busWw (a, z); 11586: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 11587: } 11588: } //irpAndToMemWord 11589: 11590: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11591: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11592: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11593: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11594: //EXG.L Dq,Ar |-|012346|-|-----|-----| |1100_qqq_110_001_rrr 11595: //AND.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_110_mmm_rrr 11596: public static void irpAndToMemLong () throws M68kException { 11597: int ea = XEiJ.regOC & 63; 11598: int qqq = XEiJ.regOC >> 9 & 7; 11599: if (ea >> 3 == XEiJ.MMM_AR) { //EXG.L Dq,Ar 11600: XEiJ.mpuCycleCount += 6; 11601: int t = XEiJ.regRn[qqq]; 11602: XEiJ.regRn[qqq] = XEiJ.regRn[ea]; //このr[ea]はアドレスレジスタ 11603: XEiJ.regRn[ea] = t; //このr[ea]はアドレスレジスタ 11604: } else { //AND.L Dq,<ea> 11605: XEiJ.mpuCycleCount += 12; 11606: int a = efaMltLong (ea); 11607: int z; 11608: XEiJ.busWl (a, z = XEiJ.busRls (a) & XEiJ.regRn[qqq]); 11609: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11610: } 11611: } //irpAndToMemLong 11612: 11613: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11614: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11615: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11616: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11617: //MULS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr 11618: public static void irpMulsWord () throws M68kException { 11619: int ea = XEiJ.regOC & 63; 11620: int qqq = XEiJ.regOC >> 9 & 7; 11621: int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 11622: int t = y << 1 ^ y; //右側が1である0と右側が0または末尾である1は1、それ以外は0。ソースは符号拡張されているので上位16ビットはすべて0 11623: //mulsの所要サイクル数は38+2n 11624: //nはソースの末尾に0を付け加えた17ビットに含まれる10または01の数 11625: int s = t & 0x5555; 11626: s += t - s >> 1; 11627: t = s & 0x3333; 11628: t += s - t >> 2; 11629: t += t >> 4; 11630: XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1); //38+2n 11631: int z; 11632: XEiJ.regRn[qqq] = z = (short) XEiJ.regRn[qqq] * y; //積の下位32ビット。オーバーフローは無視 11633: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11634: } //irpMulsWord 11635: 11636: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11637: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11638: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11639: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11640: //ADD.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr 11641: public static void irpAddToRegByte () throws M68kException { 11642: XEiJ.mpuCycleCount += 4; 11643: int ea = XEiJ.regOC & 63; 11644: int qqq = XEiJ.regOC >> 9 & 7; 11645: int x, y, z; 11646: y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 11647: x = XEiJ.regRn[qqq]; 11648: z = x + y; 11649: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11650: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11651: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11652: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_byte 11653: } //irpAddToRegByte 11654: 11655: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11656: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11657: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11658: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11659: //ADD.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr 11660: public static void irpAddToRegWord () throws M68kException { 11661: XEiJ.mpuCycleCount += 4; 11662: int ea = XEiJ.regOC & 63; 11663: int qqq = XEiJ.regOC >> 9 & 7; 11664: int x, y, z; 11665: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11666: x = XEiJ.regRn[qqq]; 11667: z = x + y; 11668: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11669: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11670: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11671: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_word 11672: } //irpAddToRegWord 11673: 11674: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11675: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11676: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11677: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11678: //ADD.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr 11679: public static void irpAddToRegLong () throws M68kException { 11680: int ea = XEiJ.regOC & 63; 11681: int qqq = XEiJ.regOC >> 9 & 7; 11682: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11683: int x, y, z; 11684: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11685: x = XEiJ.regRn[qqq]; 11686: z = x + y; 11687: XEiJ.regRn[qqq] = z; 11688: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11689: ((x ^ z) & (y ^ z)) >> 30 & XEiJ.REG_CCR_V | 11690: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 11691: } //irpAddToRegLong 11692: 11693: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11694: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11695: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11696: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11697: //ADDA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr 11698: //ADD.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq] 11699: // 11700: //ADDA.W <ea>,Aq 11701: // ソースを符号拡張してロングで加算する 11702: public static void irpAddaWord () throws M68kException { 11703: XEiJ.mpuCycleCount += 8; 11704: int ea = XEiJ.regOC & 63; 11705: int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11706: XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z; //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可 11707: //ccrは変化しない 11708: } //irpAddaWord 11709: 11710: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11711: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11712: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11713: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11714: //ADDX.B Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_100_000_rrr 11715: //ADDX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_100_001_rrr 11716: //ADD.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_100_mmm_rrr 11717: public static void irpAddToMemByte () throws M68kException { 11718: int ea = XEiJ.regOC & 63; 11719: int a, x, y, z; 11720: if (ea < XEiJ.EA_MM) { 11721: if (ea < XEiJ.EA_AR) { //ADDX.B Dr,Dq 11722: int qqq = XEiJ.regOC >> 9 & 7; 11723: XEiJ.mpuCycleCount += 4; 11724: y = XEiJ.regRn[ea]; 11725: x = XEiJ.regRn[qqq]; 11726: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11727: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11728: } else { //ADDX.B -(Ar),-(Aq) 11729: XEiJ.mpuCycleCount += 18; 11730: y = XEiJ.busRbs (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11731: a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15]; //1qqq=aqq 11732: x = XEiJ.busRbs (a); 11733: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11734: XEiJ.busWb (a, z); 11735: } 11736: XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11737: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11738: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx_byte 11739: } else { //ADD.B Dq,<ea> 11740: XEiJ.mpuCycleCount += 8; 11741: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11742: a = efaMltByte (ea); 11743: x = XEiJ.busRbs (a); 11744: z = x + y; 11745: XEiJ.busWb (a, z); 11746: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11747: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11748: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_byte 11749: } 11750: } //irpAddToMemByte 11751: 11752: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11753: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11754: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11755: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11756: //ADDX.W Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_101_000_rrr 11757: //ADDX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_101_001_rrr 11758: //ADD.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_101_mmm_rrr 11759: public static void irpAddToMemWord () throws M68kException { 11760: int ea = XEiJ.regOC & 63; 11761: int a, x, y, z; 11762: if (ea < XEiJ.EA_MM) { 11763: if (ea < XEiJ.EA_AR) { //ADDX.W Dr,Dq 11764: int qqq = XEiJ.regOC >> 9 & 7; 11765: XEiJ.mpuCycleCount += 4; 11766: y = XEiJ.regRn[ea]; 11767: x = XEiJ.regRn[qqq]; 11768: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11769: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11770: } else { //ADDX.W -(Ar),-(Aq) 11771: XEiJ.mpuCycleCount += 18; 11772: y = XEiJ.busRws (XEiJ.regRn[ea] -= 2); //このr[ea]はアドレスレジスタ 11773: a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2; 11774: x = XEiJ.busRws (a); 11775: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11776: XEiJ.busWw (a, z); 11777: } 11778: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11779: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11780: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx_word 11781: } else { //ADD.W Dq,<ea> 11782: XEiJ.mpuCycleCount += 8; 11783: a = efaMltWord (ea); 11784: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11785: x = XEiJ.busRws (a); 11786: z = x + y; 11787: XEiJ.busWw (a, z); 11788: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11789: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11790: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_word 11791: } 11792: } //irpAddToMemWord 11793: 11794: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11795: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11796: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11797: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11798: //ADDX.L Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_110_000_rrr 11799: //ADDX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_110_001_rrr 11800: //ADD.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_110_mmm_rrr 11801: public static void irpAddToMemLong () throws M68kException { 11802: int ea = XEiJ.regOC & 63; 11803: if (ea < XEiJ.EA_MM) { 11804: int x; 11805: int y; 11806: int z; 11807: if (ea < XEiJ.EA_AR) { //ADDX.L Dr,Dq 11808: int qqq = XEiJ.regOC >> 9 & 7; 11809: XEiJ.mpuCycleCount += 8; 11810: XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) + (y = XEiJ.regRn[ea]) + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11811: } else { //ADDX.L -(Ar),-(Aq) 11812: XEiJ.mpuCycleCount += 30; 11813: y = XEiJ.busRls (XEiJ.regRn[ea] -= 4); //このr[ea]はアドレスレジスタ 11814: int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4; 11815: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y + (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 11816: } 11817: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 11818: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 11819: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx 11820: } else { //ADD.L Dq,<ea> 11821: XEiJ.mpuCycleCount += 12; 11822: int a = efaMltLong (ea); 11823: int x; 11824: int y; 11825: int z; 11826: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7])); 11827: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11828: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 11829: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 11830: } 11831: } //irpAddToMemLong 11832: 11833: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11834: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11835: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11836: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11837: //ADDA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr 11838: //ADD.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq] 11839: public static void irpAddaLong () throws M68kException { 11840: int ea = XEiJ.regOC & 63; 11841: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //Dr/Ar/#<data>のとき8+、それ以外は6+ 11842: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11843: XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z; //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可 11844: //ccrは変化しない 11845: } //irpAddaLong 11846: 11847: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11848: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11849: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11850: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11851: //ASR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_000_rrr 11852: //LSR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_001_rrr 11853: //ROXR.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_010_rrr 11854: //ROR.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_011_rrr 11855: //ASR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_100_rrr 11856: //LSR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_101_rrr 11857: //ROXR.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_110_rrr 11858: //ROR.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_111_rrr 11859: //ASR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_000_rrr [ASR.B #1,Dr] 11860: //LSR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_001_rrr [LSR.B #1,Dr] 11861: //ROXR.B Dr |A|012346|-|*UUUU|***0*| |1110_001_000_010_rrr [ROXR.B #1,Dr] 11862: //ROR.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_000_011_rrr [ROR.B #1,Dr] 11863: // 11864: //ASR.B #<data>,Dr 11865: //ASR.B Dq,Dr 11866: // 算術右シフトバイト 11867: // ........................アイウエオカキク XNZVC 11868: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11869: // 1 ........................アアイウエオカキ クア*0ク Z=アイウエオカキ==0 11870: // 2 ........................アアアイウエオカ キア*0キ Z=アイウエオカ==0 11871: // 3 ........................アアアアイウエオ カア*0カ Z=アイウエオ==0 11872: // 4 ........................アアアアアイウエ オア*0オ Z=アイウエ==0 11873: // 5 ........................アアアアアアイウ エア*0エ Z=アイウ==0 11874: // 6 ........................アアアアアアアイ ウア*0ウ Z=アイ==0 11875: // 7 ........................アアアアアアアア イア*0イ Z=ア==0 11876: // 8 ........................アアアアアアアア アア*0ア Z=ア==0 11877: // CCR 11878: // X countが0のとき変化しない。他は最後に押し出されたビット 11879: // N 結果の最上位ビット 11880: // Z 結果が0のときセット。他はクリア 11881: // V 常にクリア 11882: // C countが0のときクリア。他は最後に押し出されたビット 11883: // 11884: //LSR.B #<data>,Dr 11885: //LSR.B Dq,Dr 11886: // 論理右シフトバイト 11887: // ........................アイウエオカキク XNZVC 11888: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11889: // 1 ........................0アイウエオカキ ク0*0ク Z=アイウエオカキ==0 11890: // 2 ........................00アイウエオカ キ0*0キ Z=アイウエオカ==0 11891: // 3 ........................000アイウエオ カ0*0カ Z=アイウエオ==0 11892: // 4 ........................0000アイウエ オ0*0オ Z=アイウエ==0 11893: // 5 ........................00000アイウ エ0*0エ Z=アイウ==0 11894: // 6 ........................000000アイ ウ0*0ウ Z=アイ==0 11895: // 7 ........................0000000ア イ0*0イ Z=ア==0 11896: // 8 ........................00000000 ア010ア 11897: // 9 ........................00000000 00100 11898: // CCR 11899: // X countが0のとき変化しない。他は最後に押し出されたビット 11900: // N 結果の最上位ビット 11901: // Z 結果が0のときセット。他はクリア 11902: // V 常にクリア 11903: // C countが0のときクリア。他は最後に押し出されたビット 11904: // 11905: //ROR.B #<data>,Dr 11906: //ROR.B Dq,Dr 11907: // 右ローテートバイト 11908: // ........................アイウエオカキク XNZVC 11909: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11910: // 1 ........................クアイウエオカキ Xク*0ク Z=アイウエオカキク==0 11911: // : 11912: // 7 ........................イウエオカキクア Xイ*0イ Z=アイウエオカキク==0 11913: // 8 ........................アイウエオカキク Xア*0ア Z=アイウエオカキク==0 11914: // CCR 11915: // X 常に変化しない 11916: // N 結果の最上位ビット 11917: // Z 結果が0のときセット。他はクリア 11918: // V 常にクリア 11919: // C countが0のときクリア。他は結果の最上位ビット 11920: // 11921: //ROXR.B #<data>,Dr 11922: //ROXR.B Dq,Dr 11923: // 拡張右ローテートバイト 11924: // ........................アイウエオカキク XNZVC 11925: // 0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 11926: // 1 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0 11927: // 2 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0 11928: // 3 ........................キクXアイウエオ カキ*0カ Z=アイウエオキクX==0 11929: // 4 ........................カキクXアイウエ オカ*0オ Z=アイウエカキクX==0 11930: // 5 ........................オカキクXアイウ エオ*0エ Z=アイウオカキクX==0 11931: // 6 ........................エオカキクXアイ ウエ*0ウ Z=アイエオカキクX==0 11932: // 7 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0 11933: // 8 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0 11934: // 9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 11935: // CCR 11936: // X countが0のとき変化しない。他は最後に押し出されたビット 11937: // N 結果の最上位ビット 11938: // Z 結果が0のときセット。他はクリア 11939: // V 常にクリア 11940: // C countが0のときXのコピー。他は最後に押し出されたビット 11941: public static void irpXxrToRegByte () throws M68kException { 11942: int rrr; 11943: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 11944: int y; 11945: int z; 11946: int t; 11947: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 11948: case 0b000_000 >> 3: //ASR.B #<data>,Dr 11949: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11950: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> y) >> 1); 11951: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11952: break; 11953: case 0b001_000 >> 3: //LSR.B #<data>,Dr 11954: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11955: XEiJ.regRn[rrr] = ~0xff & x | (z = (t = (0xff & x) >>> y) >>> 1); 11956: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11957: break; 11958: case 0b010_000 >> 3: //ROXR.B #<data>,Dr 11959: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11960: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1; 11961: if (y == 1 - 1) { //y=data-1=1-1 11962: t = x; 11963: } else { //y=data-1=2-1~8-1 11964: z = x << 9 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1; 11965: } 11966: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 11967: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11968: break; 11969: case 0b011_000 >> 3: //ROR.B #<data>,Dr 11970: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11971: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 7 - y | (0xff & x) >>> y + 1)); 11972: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 7 & 1; //Xは変化しない。Cは結果の最上位ビット 11973: break; 11974: case 0b100_000 >> 3: //ASR.B Dq,Dr 11975: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11976: XEiJ.mpuCycleCount += 6 + (y << 1); 11977: if (y == 0) { //y=data=0 11978: z = (byte) x; 11979: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 11980: } else { //y=data=1~63 11981: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> (y <= 8 ? y - 1 : 7)) >> 1); 11982: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11983: } 11984: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11985: break; 11986: case 0b101_000 >> 3: //LSR.B Dq,Dr 11987: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11988: XEiJ.mpuCycleCount += 6 + (y << 1); 11989: if (y == 0) { //y=data=0 11990: z = (byte) x; 11991: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 11992: } else { //y=data=1~63 11993: XEiJ.regRn[rrr] = ~0xff & x | (z = (t = y <= 8 ? (0xff & x) >>> y - 1 : 0) >>> 1); 11994: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11995: } 11996: break; 11997: case 0b110_000 >> 3: //ROXR.B Dq,Dr 11998: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11999: XEiJ.mpuCycleCount += 6 + (y << 1); 12000: //y %= 9; 12001: y = (y & 7) - (y >> 3); //y=data=-7~7 12002: y += y >> 3 & 9; //y=data=0~8 12003: if (y == 0) { //y=data=0 12004: z = (byte) x; 12005: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12006: } else { //y=data=1~8 12007: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1; 12008: if (y == 1) { //y=data=1 12009: t = x; //Cは最後に押し出されたビット 12010: } else { //y=data=2~8 12011: z = x << 9 - y | (t = z >>> y - 2) >>> 1; 12012: } 12013: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 12014: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12015: } 12016: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12017: break; 12018: case 0b111_000 >> 3: //ROR.B Dq,Dr 12019: default: 12020: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12021: XEiJ.mpuCycleCount += 6 + (y << 1); 12022: if (y == 0) { 12023: z = (byte) x; 12024: t = 0; //Cはクリア 12025: } else { 12026: y &= 7; //y=data=0~7 12027: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 8 - y | (0xff & x) >>> y)); 12028: t = z >>> 7 & 1; //Cは結果の最上位ビット 12029: } 12030: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12031: } 12032: } //irpXxrToRegByte 12033: 12034: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12035: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12036: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12037: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12038: //ASR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_000_rrr 12039: //LSR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_001_rrr 12040: //ROXR.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_010_rrr 12041: //ROR.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_011_rrr 12042: //ASR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_100_rrr 12043: //LSR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_101_rrr 12044: //ROXR.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_110_rrr 12045: //ROR.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_111_rrr 12046: //ASR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_000_rrr [ASR.W #1,Dr] 12047: //LSR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_001_rrr [LSR.W #1,Dr] 12048: //ROXR.W Dr |A|012346|-|*UUUU|***0*| |1110_001_001_010_rrr [ROXR.W #1,Dr] 12049: //ROR.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_001_011_rrr [ROR.W #1,Dr] 12050: // 12051: //ASR.W #<data>,Dr 12052: //ASR.W Dq,Dr 12053: //ASR.W <ea> 12054: // 算術右シフトワード 12055: // ................アイウエオカキクケコサシスセソタ XNZVC 12056: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12057: // 1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0 12058: // : 12059: // 15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0 12060: // 16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0 12061: // CCR 12062: // X countが0のとき変化しない。他は最後に押し出されたビット 12063: // N 結果の最上位ビット 12064: // Z 結果が0のときセット。他はクリア 12065: // V 常にクリア 12066: // C countが0のときクリア。他は最後に押し出されたビット 12067: // 12068: //LSR.W #<data>,Dr 12069: //LSR.W Dq,Dr 12070: //LSR.W <ea> 12071: // 論理右シフトワード 12072: // ................アイウエオカキクケコサシスセソタ XNZVC 12073: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12074: // 1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0 12075: // : 12076: // 15 ................000000000000000ア イ0*0イ Z=ア==0 12077: // 16 ................0000000000000000 ア010ア 12078: // 17 ................0000000000000000 00100 12079: // CCR 12080: // X countが0のとき変化しない。他は最後に押し出されたビット 12081: // N 結果の最上位ビット 12082: // Z 結果が0のときセット。他はクリア 12083: // V 常にクリア 12084: // C countが0のときクリア。他は最後に押し出されたビット 12085: // 12086: //ROR.W #<data>,Dr 12087: //ROR.W Dq,Dr 12088: //ROR.W <ea> 12089: // 右ローテートワード 12090: // ................アイウエオカキクケコサシスセソタ XNZVC 12091: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12092: // 1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0 12093: // : 12094: // 15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0 12095: // 16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0 12096: // CCR 12097: // X 常に変化しない 12098: // N 結果の最上位ビット 12099: // Z 結果が0のときセット。他はクリア 12100: // V 常にクリア 12101: // C countが0のときクリア。他は結果の最上位ビット 12102: // 12103: //ROXR.W #<data>,Dr 12104: //ROXR.W Dq,Dr 12105: //ROXR.W <ea> 12106: // 拡張右ローテートワード 12107: // ................アイウエオカキクケコサシスセソタ XNZVC 12108: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12109: // 1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 12110: // 2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 12111: // : 12112: // 15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 12113: // 16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 12114: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12115: // CCR 12116: // X countが0のとき変化しない。他は最後に押し出されたビット 12117: // N 結果の最上位ビット 12118: // Z 結果が0のときセット。他はクリア 12119: // V 常にクリア 12120: // C countが0のときXのコピー。他は最後に押し出されたビット 12121: public static void irpXxrToRegWord () throws M68kException { 12122: int rrr; 12123: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12124: int y; 12125: int z; 12126: int t; 12127: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12128: case 0b000_000 >> 3: //ASR.W #<data>,Dr 12129: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12130: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> y) >> 1); 12131: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12132: break; 12133: case 0b001_000 >> 3: //LSR.W #<data>,Dr 12134: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12135: XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = (char) x >>> y) >>> 1); 12136: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12137: break; 12138: case 0b010_000 >> 3: //ROXR.W #<data>,Dr 12139: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12140: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1; 12141: if (y == 1 - 1) { //y=data-1=1-1 12142: t = x; 12143: } else { //y=data-1=2-1~8-1 12144: z = x << 17 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1; 12145: } 12146: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12147: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12148: break; 12149: case 0b011_000 >> 3: //ROR.W #<data>,Dr 12150: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12151: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - 1 - y | (char) x >>> y + 1)); 12152: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 15 & 1; //Xは変化しない。Cは結果の最上位ビット 12153: break; 12154: case 0b100_000 >> 3: //ASR.W Dq,Dr 12155: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12156: XEiJ.mpuCycleCount += 6 + (y << 1); 12157: if (y == 0) { //y=data=0 12158: z = (short) x; 12159: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12160: } else { //y=data=1~63 12161: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> (y <= 16 ? y - 1 : 15)) >> 1); 12162: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12163: } 12164: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12165: break; 12166: case 0b101_000 >> 3: //LSR.W Dq,Dr 12167: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12168: XEiJ.mpuCycleCount += 6 + (y << 1); 12169: if (y == 0) { //y=data=0 12170: z = (short) x; 12171: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 12172: } else { //y=data=1~63 12173: XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = y <= 16 ? (char) x >>> y - 1 : 0) >>> 1); 12174: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12175: } 12176: break; 12177: case 0b110_000 >> 3: //ROXR.W Dq,Dr 12178: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12179: XEiJ.mpuCycleCount += 6 + (y << 1); 12180: //y %= 17; 12181: y = (y & 15) - (y >> 4); //y=data=-3~15 12182: y += y >> 4 & 17; //y=data=0~16 12183: if (y == 0) { //y=data=0 12184: z = (short) x; 12185: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12186: } else { //y=data=1~16 12187: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1; 12188: if (y == 1) { //y=data=1 12189: t = x; //Cは最後に押し出されたビット 12190: } else { //y=data=2~16 12191: z = x << 17 - y | (t = z >>> y - 2) >>> 1; 12192: } 12193: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12194: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12195: } 12196: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12197: break; 12198: case 0b111_000 >> 3: //ROR.W Dq,Dr 12199: default: 12200: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12201: XEiJ.mpuCycleCount += 6 + (y << 1); 12202: if (y == 0) { 12203: z = (short) x; 12204: t = 0; //Cはクリア 12205: } else { 12206: y &= 15; //y=data=0~15 12207: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - y | (char) x >>> y)); 12208: t = z >>> 15 & 1; //Cは結果の最上位ビット 12209: } 12210: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12211: } 12212: } //irpXxrToRegWord 12213: 12214: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12215: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12216: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12217: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12218: //ASR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_000_rrr 12219: //LSR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_001_rrr 12220: //ROXR.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_010_rrr 12221: //ROR.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_011_rrr 12222: //ASR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_100_rrr 12223: //LSR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_101_rrr 12224: //ROXR.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_110_rrr 12225: //ROR.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_111_rrr 12226: //ASR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_000_rrr [ASR.L #1,Dr] 12227: //LSR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_001_rrr [LSR.L #1,Dr] 12228: //ROXR.L Dr |A|012346|-|*UUUU|***0*| |1110_001_010_010_rrr [ROXR.L #1,Dr] 12229: //ROR.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_010_011_rrr [ROR.L #1,Dr] 12230: // 12231: //ASR.L #<data>,Dr 12232: //ASR.L Dq,Dr 12233: // 算術右シフトロング 12234: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12235: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12236: // 1 アアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0 12237: // : 12238: // 31 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア イア*0イ Z=ア==0 12239: // 32 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア アア*0ア Z=ア==0 12240: // CCR 12241: // X countが0のとき変化しない。他は最後に押し出されたビット 12242: // N 結果の最上位ビット 12243: // Z 結果が0のときセット。他はクリア 12244: // V 常にクリア 12245: // C countが0のときクリア。他は最後に押し出されたビット 12246: // 12247: //LSR.L #<data>,Dr 12248: //LSR.L Dq,Dr 12249: // 論理右シフトロング 12250: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12251: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12252: // 1 0アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミ0*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0 12253: // : 12254: // 31 0000000000000000000000000000000ア イ0*0イ Z=ア==0 12255: // 32 00000000000000000000000000000000 ア010ア 12256: // 33 00000000000000000000000000000000 00100 12257: // CCR 12258: // X countが0のとき変化しない。他は最後に押し出されたビット 12259: // N 結果の最上位ビット 12260: // Z 結果が0のときセット。他はクリア 12261: // V 常にクリア 12262: // C countが0のときクリア。他は最後に押し出されたビット 12263: // 12264: //ROR.L #<data>,Dr 12265: //ROR.L Dq,Dr 12266: // 右ローテートロング 12267: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12268: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12269: // 1 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12270: // : 12271: // 31 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0イ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12272: // 32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12273: // CCR 12274: // X 常に変化しない 12275: // N 結果の最上位ビット 12276: // Z 結果が0のときセット。他はクリア 12277: // V 常にクリア 12278: // C countが0のときクリア。他は結果の最上位ビット 12279: // 12280: //ROXR.L #<data>,Dr 12281: //ROXR.L Dq,Dr 12282: // 拡張右ローテートロング 12283: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12284: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12285: // 1 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0 12286: // 2 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0 12287: // : 12288: // 31 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12289: // 32 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12290: // 33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12291: // CCR 12292: // X countが0のとき変化しない。他は最後に押し出されたビット 12293: // N 結果の最上位ビット 12294: // Z 結果が0のときセット。他はクリア 12295: // V 常にクリア 12296: // C countが0のときXのコピー。他は最後に押し出されたビット 12297: public static void irpXxrToRegLong () throws M68kException { 12298: int rrr; 12299: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12300: int y; 12301: int z; 12302: int t; 12303: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12304: case 0b000_000 >> 3: //ASR.L #<data>,Dr 12305: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12306: XEiJ.regRn[rrr] = z = (t = x >> y) >> 1; 12307: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12308: break; 12309: case 0b001_000 >> 3: //LSR.L #<data>,Dr 12310: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12311: XEiJ.regRn[rrr] = z = (t = x >>> y) >>> 1; 12312: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12313: break; 12314: case 0b010_000 >> 3: //ROXR.L #<data>,Dr 12315: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12316: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1; 12317: if (y == 1 - 1) { //y=data-1=1-1 12318: t = x; 12319: } else { //y=data-1=2-1~8-1 12320: z = x << -y | (t = z >>> y - (2 - 1)) >>> 1; //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略 12321: } 12322: XEiJ.regRn[rrr] = z; 12323: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12324: break; 12325: case 0b011_000 >> 3: //ROR.L #<data>,Dr 12326: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12327: XEiJ.regRn[rrr] = z = x << ~y | x >>> y + 1; //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略 12328: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 31; //Xは変化しない。Cは結果の最上位ビット 12329: break; 12330: case 0b100_000 >> 3: //ASR.L Dq,Dr 12331: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12332: XEiJ.mpuCycleCount += 8 + (y << 1); 12333: if (y == 0) { //y=data=0 12334: z = x; 12335: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12336: } else { //y=data=1~63 12337: XEiJ.regRn[rrr] = z = (t = x >> (y <= 32 ? y - 1 : 31)) >> 1; 12338: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12339: } 12340: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12341: break; 12342: case 0b101_000 >> 3: //LSR.L Dq,Dr 12343: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12344: XEiJ.mpuCycleCount += 8 + (y << 1); 12345: if (y == 0) { //y=data=0 12346: z = x; 12347: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 12348: } else { //y=data=1~63 12349: XEiJ.regRn[rrr] = z = (t = y <= 32 ? x >>> y - 1 : 0) >>> 1; 12350: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12351: } 12352: break; 12353: case 0b110_000 >> 3: //ROXR.L Dq,Dr 12354: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12355: XEiJ.mpuCycleCount += 8 + (y << 1); 12356: //y %= 33; 12357: y -= 32 - y >> 6 & 33; //y=data=0~32 12358: if (y == 0) { //y=data=0 12359: z = x; 12360: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12361: } else { //y=data=1~32 12362: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1; 12363: if (y == 1) { //y=data=1 12364: t = x; //Cは最後に押し出されたビット 12365: } else { //y=data=2~32 12366: z = x << 33 - y | (t = z >>> y - 2) >>> 1; 12367: } 12368: XEiJ.regRn[rrr] = z; 12369: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12370: } 12371: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12372: break; 12373: case 0b111_000 >> 3: //ROR.L Dq,Dr 12374: default: 12375: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12376: XEiJ.mpuCycleCount += 8 + (y << 1); 12377: if (y == 0) { 12378: z = x; 12379: t = 0; //Cはクリア 12380: } else { 12381: y &= 31; //y=data=0~31 12382: XEiJ.regRn[rrr] = z = x << -y | x >>> y; //Javaのシフト演算子は5ビットでマスクされるので32-yを-yに省略。y=32のときx|xになるが問題ない 12383: t = z >>> 31; //Cは結果の最上位ビット 12384: } 12385: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12386: } 12387: } //irpXxrToRegLong 12388: 12389: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12390: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12391: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12392: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12393: //ASR.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_000_011_mmm_rrr 12394: // 12395: //ASR.W #<data>,Dr 12396: //ASR.W Dq,Dr 12397: //ASR.W <ea> 12398: // 算術右シフトワード 12399: // ................アイウエオカキクケコサシスセソタ XNZVC 12400: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12401: // 1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0 12402: // : 12403: // 15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0 12404: // 16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0 12405: // CCR 12406: // X countが0のとき変化しない。他は最後に押し出されたビット 12407: // N 結果の最上位ビット 12408: // Z 結果が0のときセット。他はクリア 12409: // V 常にクリア 12410: // C countが0のときクリア。他は最後に押し出されたビット 12411: public static void irpAsrToMem () throws M68kException { 12412: XEiJ.mpuCycleCount += 8; 12413: int ea = XEiJ.regOC & 63; 12414: int a = efaMltWord (ea); 12415: int x = XEiJ.busRws (a); 12416: int z = x >> 1; 12417: XEiJ.busWw (a, z); 12418: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12419: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12420: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12421: } //irpAsrToMem 12422: 12423: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12424: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12425: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12426: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12427: //ASL.B #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_000_rrr 12428: //LSL.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_001_rrr 12429: //ROXL.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_010_rrr 12430: //ROL.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_011_rrr 12431: //ASL.B Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_100_rrr 12432: //LSL.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_101_rrr 12433: //ROXL.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_110_rrr 12434: //ROL.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_111_rrr 12435: //ASL.B Dr |A|012346|-|UUUUU|*****| |1110_001_100_000_rrr [ASL.B #1,Dr] 12436: //LSL.B Dr |A|012346|-|UUUUU|***0*| |1110_001_100_001_rrr [LSL.B #1,Dr] 12437: //ROXL.B Dr |A|012346|-|*UUUU|***0*| |1110_001_100_010_rrr [ROXL.B #1,Dr] 12438: //ROL.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_100_011_rrr [ROL.B #1,Dr] 12439: // 12440: //ASL.B #<data>,Dr 12441: //ASL.B Dq,Dr 12442: // 算術左シフトバイト 12443: // ........................アイウエオカキク XNZVC 12444: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12445: // 1 ........................イウエオカキク0 アイ**ア Z=イウエオカキク==0,V=アイ!=0/-1 12446: // : 12447: // 7 ........................ク0000000 キク**キ Z=ク==0,V=アイウエオカキク!=0/-1 12448: // 8 ........................00000000 ク01*ク V=アイウエオカキク!=0 12449: // 9 ........................00000000 001*0 V=アイウエオカキク!=0 12450: // CCR 12451: // X countが0のとき変化しない。他は最後に押し出されたビット 12452: // N 結果の最上位ビット 12453: // Z 結果が0のときセット。他はクリア 12454: // V ASRで元に戻せないときセット。他はクリア 12455: // C countが0のときクリア。他は最後に押し出されたビット 12456: // 12457: //LSL.B #<data>,Dr 12458: //LSL.B Dq,Dr 12459: // 論理左シフトバイト 12460: // ........................アイウエオカキク XNZVC 12461: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12462: // 1 ........................イウエオカキク0 アイ*0ア Z=イウエオカキク==0 12463: // : 12464: // 7 ........................ク0000000 キク*0キ Z=ク==0 12465: // 8 ........................00000000 ク010ク 12466: // 9 ........................00000000 00100 12467: // CCR 12468: // X countが0のとき変化しない。他は最後に押し出されたビット 12469: // N 結果の最上位ビット 12470: // Z 結果が0のときセット。他はクリア 12471: // V 常にクリア 12472: // C countが0のときクリア。他は最後に押し出されたビット 12473: // 12474: //ROL.B #<data>,Dr 12475: //ROL.B Dq,Dr 12476: // 左ローテートバイト 12477: // ........................アイウエオカキク XNZVC 12478: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12479: // 1 ........................イウエオカキクア Xイ*0ア Z=アイウエオカキク==0 12480: // : 12481: // 7 ........................クアイウエオカキ Xク*0キ Z=アイウエオカキク==0 12482: // 8 ........................アイウエオカキク Xア*0ク Z=アイウエオカキク==0 12483: // CCR 12484: // X 常に変化しない 12485: // N 結果の最上位ビット 12486: // Z 結果が0のときセット。他はクリア 12487: // V 常にクリア 12488: // C countが0のときクリア。他は結果の最下位ビット 12489: // 12490: //ROXL.B #<data>,Dr 12491: //ROXL.B Dq,Dr 12492: // 拡張左ローテートバイト 12493: // ........................アイウエオカキク XNZVC 12494: // 0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 12495: // 1 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0 12496: // 2 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0 12497: // : 12498: // 7 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0 12499: // 8 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0 12500: // 9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 12501: // CCR 12502: // X countが0のとき変化しない。他は最後に押し出されたビット 12503: // N 結果の最上位ビット 12504: // Z 結果が0のときセット。他はクリア 12505: // V 常にクリア 12506: // C countが0のときXのコピー。他は最後に押し出されたビット 12507: public static void irpXxlToRegByte () throws M68kException { 12508: int rrr; 12509: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12510: int y; 12511: int z; 12512: int t; 12513: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12514: case 0b000_000 >> 3: //ASL.B #<data>,Dr 12515: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12516: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1)); 12517: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != (byte) x ? XEiJ.REG_CCR_V : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12518: break; 12519: case 0b001_000 >> 3: //LSL.B #<data>,Dr 12520: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12521: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1)); 12522: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12523: break; 12524: case 0b010_000 >> 3: //ROXL.B #<data>,Dr 12525: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12526: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12527: if (y == 1 - 1) { //y=data-1=1-1 12528: t = x; 12529: } else { //y=data-1=2-1~8-1 12530: z = (t = z << y - (2 - 1)) << 1 | (0xff & x) >>> 9 - 1 - y; 12531: } 12532: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 12533: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12534: break; 12535: case 0b011_000 >> 3: //ROL.B #<data>,Dr 12536: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12537: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y + 1 | (0xff & x) >>> 7 - y)); 12538: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1; //Xは変化しない。Cは結果の最下位ビット 12539: break; 12540: case 0b100_000 >> 3: //ASL.B Dq,Dr 12541: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12542: XEiJ.mpuCycleCount += 6 + (y << 1); 12543: if (y <= 7) { //y=data=0~7 12544: if (y == 0) { //y=data=0 12545: z = (byte) x; 12546: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12547: } else { //y=data=1~7 12548: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y - 1) << 1)); 12549: t = (z >> y != (byte) x ? XEiJ.REG_CCR_V : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12550: } 12551: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12552: } else { //y=data=8~63 12553: XEiJ.regRn[rrr] = ~0xff & x; 12554: XEiJ.regCCR = XEiJ.REG_CCR_Z | ((byte) x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 8 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0); 12555: } 12556: break; 12557: case 0b101_000 >> 3: //LSL.B Dq,Dr 12558: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12559: XEiJ.mpuCycleCount += 6 + (y << 1); 12560: if (y == 0) { //y=data=0 12561: z = (byte) x; 12562: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12563: } else { //y=data=1~63 12564: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = y <= 8 ? x << y - 1 : 0) << 1)); 12565: t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12566: } 12567: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12568: break; 12569: case 0b110_000 >> 3: //ROXL.B Dq,Dr 12570: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12571: XEiJ.mpuCycleCount += 6 + (y << 1); 12572: //y %= 9; 12573: y = (y & 7) - (y >> 3); //y=data=-7~7 12574: y += y >> 3 & 9; //y=data=0~8 12575: if (y == 0) { //y=data=0 12576: z = (byte) x; 12577: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12578: } else { //y=data=1~8 12579: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12580: if (y == 1) { //y=data=1 12581: t = x; //Cは最後に押し出されたビット 12582: } else { //y=data=2~8 12583: z = (t = z << y - 2) << 1 | (0xff & x) >>> 9 - y; 12584: } 12585: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 12586: t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12587: } 12588: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12589: break; 12590: case 0b111_000 >> 3: //ROL.B Dq,Dr 12591: default: 12592: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12593: XEiJ.mpuCycleCount += 6 + (y << 1); 12594: if (y == 0) { 12595: z = (byte) x; 12596: t = 0; //Cはクリア 12597: } else { 12598: y &= 7; //y=data=0~7 12599: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y | (0xff & x) >>> 8 - y)); 12600: t = z & 1; //Cは結果の最下位ビット 12601: } 12602: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12603: } 12604: } //irpXxlToRegByte 12605: 12606: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12607: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12608: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12609: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12610: //ASL.W #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_000_rrr 12611: //LSL.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_001_rrr 12612: //ROXL.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_010_rrr 12613: //ROL.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_011_rrr 12614: //ASL.W Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_100_rrr 12615: //LSL.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_101_rrr 12616: //ROXL.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_110_rrr 12617: //ROL.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_111_rrr 12618: //ASL.W Dr |A|012346|-|UUUUU|*****| |1110_001_101_000_rrr [ASL.W #1,Dr] 12619: //LSL.W Dr |A|012346|-|UUUUU|***0*| |1110_001_101_001_rrr [LSL.W #1,Dr] 12620: //ROXL.W Dr |A|012346|-|*UUUU|***0*| |1110_001_101_010_rrr [ROXL.W #1,Dr] 12621: //ROL.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_101_011_rrr [ROL.W #1,Dr] 12622: // 12623: //ASL.W #<data>,Dr 12624: //ASL.W Dq,Dr 12625: //ASL.W <ea> 12626: // 算術左シフトワード 12627: // ................アイウエオカキクケコサシスセソタ XNZVC 12628: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12629: // 1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1 12630: // : 12631: // 15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1 12632: // 16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0 12633: // 17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0 12634: // CCR 12635: // X countが0のとき変化しない。他は最後に押し出されたビット 12636: // N 結果の最上位ビット 12637: // Z 結果が0のときセット。他はクリア 12638: // V ASRで元に戻せないときセット。他はクリア 12639: // C countが0のときクリア。他は最後に押し出されたビット 12640: // 12641: //LSL.W #<data>,Dr 12642: //LSL.W Dq,Dr 12643: //LSL.W <ea> 12644: // 論理左シフトワード 12645: // ................アイウエオカキクケコサシスセソタ XNZVC 12646: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12647: // 1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0 12648: // : 12649: // 15 ................タ000000000000000 ソタ*0ソ Z=タ==0 12650: // 16 ................0000000000000000 タ010タ 12651: // 17 ................0000000000000000 00100 12652: // CCR 12653: // X countが0のとき変化しない。他は最後に押し出されたビット 12654: // N 結果の最上位ビット 12655: // Z 結果が0のときセット。他はクリア 12656: // V 常にクリア 12657: // C countが0のときクリア。他は最後に押し出されたビット 12658: // 12659: //ROL.W #<data>,Dr 12660: //ROL.W Dq,Dr 12661: //ROL.W <ea> 12662: // 左ローテートワード 12663: // ................アイウエオカキクケコサシスセソタ XNZVC 12664: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12665: // 1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0 12666: // : 12667: // 15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0 12668: // 16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0 12669: // CCR 12670: // X 常に変化しない 12671: // N 結果の最上位ビット 12672: // Z 結果が0のときセット。他はクリア 12673: // V 常にクリア 12674: // C countが0のときクリア。他は結果の最下位ビット 12675: // 12676: //ROXL.W #<data>,Dr 12677: //ROXL.W Dq,Dr 12678: //ROXL.W <ea> 12679: // 拡張左ローテートワード 12680: // ................アイウエオカキクケコサシスセソタ XNZVC 12681: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12682: // 1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 12683: // 2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 12684: // : 12685: // 15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 12686: // 16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 12687: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12688: // CCR 12689: // X countが0のとき変化しない。他は最後に押し出されたビット 12690: // N 結果の最上位ビット 12691: // Z 結果が0のときセット。他はクリア 12692: // V 常にクリア 12693: // C countが0のときXのコピー。他は最後に押し出されたビット 12694: public static void irpXxlToRegWord () throws M68kException { 12695: int rrr; 12696: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12697: int y; 12698: int z; 12699: int t; 12700: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12701: case 0b000_000 >> 3: //ASL.W #<data>,Dr 12702: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12703: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1)); 12704: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != (short) x ? XEiJ.REG_CCR_V : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12705: break; 12706: case 0b001_000 >> 3: //LSL.W #<data>,Dr 12707: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12708: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1)); 12709: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12710: break; 12711: case 0b010_000 >> 3: //ROXL.W #<data>,Dr 12712: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12713: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12714: if (y == 1 - 1) { //y=data-1=1-1 12715: t = x; 12716: } else { //y=data-1=2-1~8-1 12717: z = (t = z << y - (2 - 1)) << 1 | (char) x >>> 17 - 1 - y; 12718: } 12719: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12720: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12721: break; 12722: case 0b011_000 >> 3: //ROL.W #<data>,Dr 12723: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12724: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y + 1 | (char) x >>> 16 - 1 - y)); 12725: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1; //Xは変化しない。Cは結果の最下位ビット 12726: break; 12727: case 0b100_000 >> 3: //ASL.W Dq,Dr 12728: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12729: XEiJ.mpuCycleCount += 6 + (y << 1); 12730: if (y <= 15) { //y=data=0~15 12731: if (y == 0) { //y=data=0 12732: z = (short) x; 12733: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12734: } else { //y=data=1~15 12735: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y - 1) << 1)); 12736: t = (z >> y != (short) x ? XEiJ.REG_CCR_V : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12737: } 12738: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12739: } else { //y=data=16~63 12740: XEiJ.regRn[rrr] = ~0xffff & x; 12741: XEiJ.regCCR = XEiJ.REG_CCR_Z | ((short) x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 16 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0); 12742: } 12743: break; 12744: case 0b101_000 >> 3: //LSL.W Dq,Dr 12745: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12746: XEiJ.mpuCycleCount += 6 + (y << 1); 12747: if (y == 0) { //y=data=0 12748: z = (short) x; 12749: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12750: } else { //y=data=1~63 12751: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = y <= 16 ? x << y - 1 : 0) << 1)); 12752: t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12753: } 12754: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12755: break; 12756: case 0b110_000 >> 3: //ROXL.W Dq,Dr 12757: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12758: XEiJ.mpuCycleCount += 6 + (y << 1); 12759: //y %= 17; 12760: y = (y & 15) - (y >> 4); //y=data=-3~15 12761: y += y >> 4 & 17; //y=data=0~16 12762: if (y == 0) { //y=data=0 12763: z = (short) x; 12764: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12765: } else { //y=data=1~16 12766: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12767: if (y == 1) { //y=data=1 12768: t = x; //Cは最後に押し出されたビット 12769: } else { //y=data=2~16 12770: z = (t = z << y - 2) << 1 | (char) x >>> 17 - y; 12771: } 12772: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12773: t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12774: } 12775: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12776: break; 12777: case 0b111_000 >> 3: //ROL.W Dq,Dr 12778: default: 12779: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12780: XEiJ.mpuCycleCount += 6 + (y << 1); 12781: if (y == 0) { 12782: z = (short) x; 12783: t = 0; //Cはクリア 12784: } else { 12785: y &= 15; //y=data=0~15 12786: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y | (char) x >>> 16 - y)); 12787: t = z & 1; //Cは結果の最下位ビット 12788: } 12789: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12790: } 12791: } //irpXxlToRegWord 12792: 12793: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12794: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12795: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12796: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12797: //ASL.L #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_000_rrr 12798: //LSL.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_001_rrr 12799: //ROXL.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_010_rrr 12800: //ROL.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_011_rrr 12801: //ASL.L Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_100_rrr 12802: //LSL.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_101_rrr 12803: //ROXL.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_110_rrr 12804: //ROL.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_111_rrr 12805: //ASL.L Dr |A|012346|-|UUUUU|*****| |1110_001_110_000_rrr [ASL.L #1,Dr] 12806: //LSL.L Dr |A|012346|-|UUUUU|***0*| |1110_001_110_001_rrr [LSL.L #1,Dr] 12807: //ROXL.L Dr |A|012346|-|*UUUU|***0*| |1110_001_110_010_rrr [ROXL.L #1,Dr] 12808: //ROL.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_110_011_rrr [ROL.L #1,Dr] 12809: // 12810: //ASL.L #<data>,Dr 12811: //ASL.L Dq,Dr 12812: // 算術左シフトロング 12813: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12814: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア**0 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12815: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ**ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0,V=アイ!=0/-1 12816: // : 12817: // 31 ミ0000000000000000000000000000000 マミ**マ Z=ミ==0,V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0/-1 12818: // 32 00000000000000000000000000000000 ミ01*ミ V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0 12819: // 33 00000000000000000000000000000000 001*0 V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0 12820: // CCR 12821: // X countが0のとき変化しない。他は最後に押し出されたビット 12822: // N 結果の最上位ビット 12823: // Z 結果が0のときセット。他はクリア 12824: // V ASRで元に戻せないときセット。他はクリア 12825: // C countが0のときクリア。他は最後に押し出されたビット 12826: // 12827: //LSL.L #<data>,Dr 12828: //LSL.L Dq,Dr 12829: // 論理左シフトロング 12830: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12831: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12832: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12833: // : 12834: // 31 ミ0000000000000000000000000000000 マミ*0マ Z=ミ==0 12835: // 32 00000000000000000000000000000000 ミ010ミ 12836: // 33 00000000000000000000000000000000 00100 12837: // CCR 12838: // X countが0のとき変化しない。他は最後に押し出されたビット 12839: // N 結果の最上位ビット 12840: // Z 結果が0のときセット。他はクリア 12841: // V 常にクリア 12842: // C countが0のときクリア。他は最後に押し出されたビット 12843: // 12844: //ROL.L #<data>,Dr 12845: //ROL.L Dq,Dr 12846: // 左ローテートロング 12847: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12848: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12849: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12850: // : 12851: // 31 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12852: // 32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12853: // CCR 12854: // X 常に変化しない 12855: // N 結果の最上位ビット 12856: // Z 結果が0のときセット。他はクリア 12857: // V 常にクリア 12858: // C countが0のときクリア。他は結果の最下位ビット 12859: // 12860: //ROXL.L #<data>,Dr 12861: //ROXL.L Dq,Dr 12862: // 拡張左ローテートロング 12863: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12864: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12865: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12866: // 2 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12867: // : 12868: // 31 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0 12869: // 32 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0 12870: // 33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12871: // CCR 12872: // X countが0のとき変化しない。他は最後に押し出されたビット 12873: // N 結果の最上位ビット 12874: // Z 結果が0のときセット。他はクリア 12875: // V 常にクリア 12876: // C countが0のときXのコピー。他は最後に押し出されたビット 12877: public static void irpXxlToRegLong () throws M68kException { 12878: int rrr; 12879: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12880: int y; 12881: int z; 12882: int t; 12883: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12884: case 0b000_000 >> 3: //ASL.L #<data>,Dr 12885: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12886: XEiJ.regRn[rrr] = z = (t = x << y) << 1; 12887: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12888: break; 12889: case 0b001_000 >> 3: //LSL.L #<data>,Dr 12890: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12891: XEiJ.regRn[rrr] = z = (t = x << y) << 1; 12892: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12893: break; 12894: case 0b010_000 >> 3: //ROXL.L #<data>,Dr 12895: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12896: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12897: if (y == 1 - 1) { //y=data-1=1-1 12898: t = x; 12899: } else { //y=data-1=2-1~8-1 12900: z = (t = z << y - (2 - 1)) << 1 | x >>> -y; //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略 12901: } 12902: XEiJ.regRn[rrr] = z; 12903: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12904: break; 12905: case 0b011_000 >> 3: //ROL.L #<data>,Dr 12906: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12907: XEiJ.regRn[rrr] = z = x << y + 1 | x >>> ~y; //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略 12908: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1; //Xは変化しない。Cは結果の最下位ビット 12909: break; 12910: case 0b100_000 >> 3: //ASL.L Dq,Dr 12911: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12912: XEiJ.mpuCycleCount += 8 + (y << 1); 12913: if (y <= 31) { //y=data=0~31 12914: if (y == 0) { //y=data=0 12915: z = x; 12916: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12917: } else { //y=data=1~31 12918: XEiJ.regRn[rrr] = z = (t = x << y - 1) << 1; 12919: t = (z >> y != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12920: } 12921: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12922: } else { //y=data=32~63 12923: XEiJ.regRn[rrr] = 0; 12924: XEiJ.regCCR = XEiJ.REG_CCR_Z | (x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 32 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0); 12925: } 12926: break; 12927: case 0b101_000 >> 3: //LSL.L Dq,Dr 12928: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12929: XEiJ.mpuCycleCount += 8 + (y << 1); 12930: if (y == 0) { //y=data=0 12931: z = x; 12932: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12933: } else { //y=data=1~63 12934: XEiJ.regRn[rrr] = z = (t = y <= 32 ? x << y - 1 : 0) << 1; 12935: t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12936: } 12937: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12938: break; 12939: case 0b110_000 >> 3: //ROXL.L Dq,Dr 12940: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12941: XEiJ.mpuCycleCount += 8 + (y << 1); 12942: //y %= 33; 12943: y -= 32 - y >> 6 & 33; //y=data=0~32 12944: if (y == 0) { //y=data=0 12945: z = x; 12946: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12947: } else { //y=data=1~32 12948: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12949: if (y == 1) { //y=data=1 12950: t = x; //Cは最後に押し出されたビット 12951: } else { //y=data=2~32 12952: z = (t = z << y - 2) << 1 | x >>> 33 - y; 12953: } 12954: XEiJ.regRn[rrr] = z; 12955: t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12956: } 12957: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12958: break; 12959: case 0b111_000 >> 3: //ROL.L Dq,Dr 12960: default: 12961: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12962: XEiJ.mpuCycleCount += 8 + (y << 1); 12963: if (y == 0) { 12964: z = x; 12965: t = 0; //Cはクリア 12966: } else { 12967: XEiJ.regRn[rrr] = z = x << y | x >>> -y; //Javaのシフト演算子は5ビットでマスクされるのでy&31をyに、32-(y&31)を-yに省略。y=32のときx|xになるが問題ない 12968: t = z & 1; 12969: } 12970: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12971: } 12972: } //irpXxlToRegLong 12973: 12974: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12975: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12976: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12977: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12978: //ASL.W <ea> |-|012346|-|UUUUU|*****| M+-WXZ |1110_000_111_mmm_rrr 12979: // 12980: //ASL.W #<data>,Dr 12981: //ASL.W Dq,Dr 12982: //ASL.W <ea> 12983: // 算術左シフトワード 12984: // ................アイウエオカキクケコサシスセソタ XNZVC 12985: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12986: // 1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1 12987: // : 12988: // 15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1 12989: // 16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0 12990: // 17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0 12991: // CCR 12992: // X countが0のとき変化しない。他は最後に押し出されたビット 12993: // N 結果の最上位ビット 12994: // Z 結果が0のときセット。他はクリア 12995: // V ASRで元に戻せないときセット。他はクリア 12996: // C countが0のときクリア。他は最後に押し出されたビット 12997: public static void irpAslToMem () throws M68kException { 12998: XEiJ.mpuCycleCount += 8; 12999: int ea = XEiJ.regOC & 63; 13000: int a = efaMltWord (ea); 13001: int x = XEiJ.busRws (a); 13002: int z = (short) (x << 1); 13003: XEiJ.busWw (a, z); 13004: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 13005: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13006: (x ^ z) >>> 31 << 1 | //Vは最上位ビットが変化したときセット 13007: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13008: } //irpAslToMem 13009: 13010: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13011: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13012: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13013: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13014: //LSR.W <ea> |-|012346|-|UUUUU|*0*0*| M+-WXZ |1110_001_011_mmm_rrr 13015: // 13016: //LSR.W #<data>,Dr 13017: //LSR.W Dq,Dr 13018: //LSR.W <ea> 13019: // 論理右シフトワード 13020: // ................アイウエオカキクケコサシスセソタ XNZVC 13021: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 13022: // 1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0 13023: // : 13024: // 15 ................000000000000000ア イ0*0イ Z=ア==0 13025: // 16 ................0000000000000000 ア010ア 13026: // 17 ................0000000000000000 00100 13027: // CCR 13028: // X countが0のとき変化しない。他は最後に押し出されたビット 13029: // N 結果の最上位ビット 13030: // Z 結果が0のときセット。他はクリア 13031: // V 常にクリア 13032: // C countが0のときクリア。他は最後に押し出されたビット 13033: public static void irpLsrToMem () throws M68kException { 13034: XEiJ.mpuCycleCount += 8; 13035: int ea = XEiJ.regOC & 63; 13036: int a = efaMltWord (ea); 13037: int x = XEiJ.busRwz (a); 13038: int z = x >>> 1; 13039: XEiJ.busWw (a, z); 13040: XEiJ.regCCR = ((z == 0 ? XEiJ.REG_CCR_Z : 0) | 13041: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13042: } //irpLsrToMem 13043: 13044: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13045: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13046: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13047: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13048: //LSL.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_001_111_mmm_rrr 13049: // 13050: //LSL.W #<data>,Dr 13051: //LSL.W Dq,Dr 13052: //LSL.W <ea> 13053: // 論理左シフトワード 13054: // ................アイウエオカキクケコサシスセソタ XNZVC 13055: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 13056: // 1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0 13057: // : 13058: // 15 ................タ000000000000000 ソタ*0ソ Z=タ==0 13059: // 16 ................0000000000000000 タ010タ 13060: // 17 ................0000000000000000 00100 13061: // CCR 13062: // X countが0のとき変化しない。他は最後に押し出されたビット 13063: // N 結果の最上位ビット 13064: // Z 結果が0のときセット。他はクリア 13065: // V 常にクリア 13066: // C countが0のときクリア。他は最後に押し出されたビット 13067: public static void irpLslToMem () throws M68kException { 13068: XEiJ.mpuCycleCount += 8; 13069: int ea = XEiJ.regOC & 63; 13070: int a = efaMltWord (ea); 13071: int x = XEiJ.busRws (a); 13072: int z = (short) (x << 1); 13073: XEiJ.busWw (a, z); 13074: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 13075: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13076: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13077: } //irpLslToMem 13078: 13079: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13080: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13081: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13082: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13083: //ROXR.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_011_mmm_rrr 13084: // 13085: //ROXR.W #<data>,Dr 13086: //ROXR.W Dq,Dr 13087: //ROXR.W <ea> 13088: // 拡張右ローテートワード 13089: // ................アイウエオカキクケコサシスセソタ XNZVC 13090: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13091: // 1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 13092: // 2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 13093: // : 13094: // 15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 13095: // 16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 13096: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13097: // CCR 13098: // X countが0のとき変化しない。他は最後に押し出されたビット 13099: // N 結果の最上位ビット 13100: // Z 結果が0のときセット。他はクリア 13101: // V 常にクリア 13102: // C countが0のときXのコピー。他は最後に押し出されたビット 13103: public static void irpRoxrToMem () throws M68kException { 13104: XEiJ.mpuCycleCount += 8; 13105: int ea = XEiJ.regOC & 63; 13106: int a = efaMltWord (ea); 13107: int x = XEiJ.busRwz (a); 13108: int z = -(XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | x >>> 1; 13109: XEiJ.busWw (a, z); 13110: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 13111: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13112: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13113: } //irpRoxrToMem 13114: 13115: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13116: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13117: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13118: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13119: //ROXL.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_111_mmm_rrr 13120: // 13121: //ROXL.W #<data>,Dr 13122: //ROXL.W Dq,Dr 13123: //ROXL.W <ea> 13124: // 拡張左ローテートワード 13125: // ................アイウエオカキクケコサシスセソタ XNZVC 13126: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13127: // 1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 13128: // 2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 13129: // : 13130: // 15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 13131: // 16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 13132: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13133: // CCR 13134: // X countが0のとき変化しない。他は最後に押し出されたビット 13135: // N 結果の最上位ビット 13136: // Z 結果が0のときセット。他はクリア 13137: // V 常にクリア 13138: // C countが0のときXのコピー。他は最後に押し出されたビット 13139: public static void irpRoxlToMem () throws M68kException { 13140: XEiJ.mpuCycleCount += 8; 13141: int ea = XEiJ.regOC & 63; 13142: int a = efaMltWord (ea); 13143: int x = XEiJ.busRws (a); 13144: int z = (short) (x << 1 | XEiJ.regCCR >> 4 & 1); 13145: XEiJ.busWw (a, z); 13146: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 13147: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13148: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13149: } //irpRoxlToMem 13150: 13151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13152: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13153: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13154: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13155: //ROR.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_011_mmm_rrr 13156: // 13157: //ROR.W #<data>,Dr 13158: //ROR.W Dq,Dr 13159: //ROR.W <ea> 13160: // 右ローテートワード 13161: // ................アイウエオカキクケコサシスセソタ XNZVC 13162: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 13163: // 1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0 13164: // : 13165: // 15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0 13166: // 16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0 13167: // CCR 13168: // X 常に変化しない 13169: // N 結果の最上位ビット 13170: // Z 結果が0のときセット。他はクリア 13171: // V 常にクリア 13172: // C countが0のときクリア。他は結果の最上位ビット 13173: public static void irpRorToMem () throws M68kException { 13174: XEiJ.mpuCycleCount += 8; 13175: int ea = XEiJ.regOC & 63; 13176: int a = efaMltWord (ea); 13177: int x = XEiJ.busRwz (a); 13178: int z = (short) (x << 15 | x >>> 1); 13179: XEiJ.busWw (a, z); 13180: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 13181: (z < 0 ? XEiJ.REG_CCR_N : 0) | 13182: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13183: z >>> 31); //Cは結果の最上位ビット 13184: } //irpRorToMem 13185: 13186: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13187: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13188: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13189: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13190: //ROL.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_111_mmm_rrr 13191: // 13192: //ROL.W #<data>,Dr 13193: //ROL.W Dq,Dr 13194: //ROL.W <ea> 13195: // 左ローテートワード 13196: // ................アイウエオカキクケコサシスセソタ XNZVC 13197: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 13198: // 1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0 13199: // : 13200: // 15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0 13201: // 16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0 13202: // CCR 13203: // X 常に変化しない 13204: // N 結果の最上位ビット 13205: // Z 結果が0のときセット。他はクリア 13206: // V 常にクリア 13207: // C countが0のときクリア。他は結果の最下位ビット 13208: public static void irpRolToMem () throws M68kException { 13209: XEiJ.mpuCycleCount += 8; 13210: int ea = XEiJ.regOC & 63; 13211: int a = efaMltWord (ea); 13212: int x = XEiJ.busRwz (a); 13213: int z = (short) (x << 1 | x >>> 15); 13214: XEiJ.busWw (a, z); 13215: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 13216: (z < 0 ? XEiJ.REG_CCR_N : 0) | 13217: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13218: z & 1); //Cは結果の最下位ビット 13219: } //irpRolToMem 13220: 13221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13222: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13223: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13224: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13225: //FPACK <data> |A|012346|-|UUUUU|*****| |1111_111_0dd_ddd_ddd [FLINE #<data>] 13226: public static void irpFpack () throws M68kException { 13227: if (!MainMemory.mmrFEfuncActivated) { 13228: irpFline (); 13229: return; 13230: } 13231: StringBuilder sb; 13232: int a0; 13233: if (FEFunction.FPK_DEBUG_TRACE) { 13234: sb = new StringBuilder (); 13235: String name = Disassembler.DIS_FPACK_NAME[XEiJ.regOC & 255]; 13236: if (name.length () == 0) { 13237: XEiJ.fmtHex4 (sb.append ('$'), XEiJ.regOC); 13238: } else { 13239: sb.append (name); 13240: } 13241: sb.append ('\n'); 13242: XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (sb.append (" D0="), XEiJ.regRn[0]).append (" D1="), XEiJ.regRn[1]).append (" D2="), XEiJ.regRn[2]).append (" D3="), XEiJ.regRn[3]); 13243: a0 = XEiJ.regRn[8]; 13244: MainMemory.mmrRstr (sb.append (" (A0)=\""), a0, MainMemory.mmrStrlen (a0, 20)).append ("\"\n"); 13245: } 13246: XEiJ.mpuCycleCount += FEFunction.FPK_CLOCK; //一律にFEFunction.FPK_CLOCKサイクルかかることにする 13247: switch (XEiJ.regOC & 255) { 13248: case 0x00: FEFunction.fpkLMUL (); break; 13249: case 0x01: FEFunction.fpkLDIV (); break; 13250: case 0x02: FEFunction.fpkLMOD (); break; 13251: //case 0x03: break; 13252: case 0x04: FEFunction.fpkUMUL (); break; 13253: case 0x05: FEFunction.fpkUDIV (); break; 13254: case 0x06: FEFunction.fpkUMOD (); break; 13255: //case 0x07: break; 13256: case 0x08: FEFunction.fpkIMUL (); break; 13257: case 0x09: FEFunction.fpkIDIV (); break; 13258: //case 0x0a: break; 13259: //case 0x0b: break; 13260: case 0x0c: FEFunction.fpkRANDOMIZE (); break; 13261: case 0x0d: FEFunction.fpkSRAND (); break; 13262: case 0x0e: FEFunction.fpkRAND (); break; 13263: //case 0x0f: break; 13264: case 0x10: FEFunction.fpkSTOL (); break; 13265: case 0x11: FEFunction.fpkLTOS (); break; 13266: case 0x12: FEFunction.fpkSTOH (); break; 13267: case 0x13: FEFunction.fpkHTOS (); break; 13268: case 0x14: FEFunction.fpkSTOO (); break; 13269: case 0x15: FEFunction.fpkOTOS (); break; 13270: case 0x16: FEFunction.fpkSTOB (); break; 13271: case 0x17: FEFunction.fpkBTOS (); break; 13272: case 0x18: FEFunction.fpkIUSING (); break; 13273: //case 0x19: break; 13274: case 0x1a: FEFunction.fpkLTOD (); break; 13275: case 0x1b: FEFunction.fpkDTOL (); break; 13276: case 0x1c: FEFunction.fpkLTOF (); break; 13277: case 0x1d: FEFunction.fpkFTOL (); break; 13278: case 0x1e: FEFunction.fpkFTOD (); break; 13279: case 0x1f: FEFunction.fpkDTOF (); break; 13280: case 0x20: FEFunction.fpkVAL (); break; 13281: case 0x21: FEFunction.fpkUSING (); break; 13282: case 0x22: FEFunction.fpkSTOD (); break; 13283: case 0x23: FEFunction.fpkDTOS (); break; 13284: case 0x24: FEFunction.fpkECVT (); break; 13285: case 0x25: FEFunction.fpkFCVT (); break; 13286: case 0x26: FEFunction.fpkGCVT (); break; 13287: //case 0x27: break; 13288: case 0x28: FEFunction.fpkDTST (); break; 13289: case 0x29: FEFunction.fpkDCMP (); break; 13290: case 0x2a: FEFunction.fpkDNEG (); break; 13291: case 0x2b: FEFunction.fpkDADD (); break; 13292: case 0x2c: FEFunction.fpkDSUB (); break; 13293: case 0x2d: FEFunction.fpkDMUL (); break; 13294: case 0x2e: FEFunction.fpkDDIV (); break; 13295: case 0x2f: FEFunction.fpkDMOD (); break; 13296: case 0x30: FEFunction.fpkDABS (); break; 13297: case 0x31: FEFunction.fpkDCEIL (); break; 13298: case 0x32: FEFunction.fpkDFIX (); break; 13299: case 0x33: FEFunction.fpkDFLOOR (); break; 13300: case 0x34: FEFunction.fpkDFRAC (); break; 13301: case 0x35: FEFunction.fpkDSGN (); break; 13302: case 0x36: FEFunction.fpkSIN (); break; 13303: case 0x37: FEFunction.fpkCOS (); break; 13304: case 0x38: FEFunction.fpkTAN (); break; 13305: case 0x39: FEFunction.fpkATAN (); break; 13306: case 0x3a: FEFunction.fpkLOG (); break; 13307: case 0x3b: FEFunction.fpkEXP (); break; 13308: case 0x3c: FEFunction.fpkSQR (); break; 13309: case 0x3d: FEFunction.fpkPI (); break; 13310: case 0x3e: FEFunction.fpkNPI (); break; 13311: case 0x3f: FEFunction.fpkPOWER (); break; 13312: case 0x40: FEFunction.fpkRND (); break; 13313: case 0x41: FEFunction.fpkSINH (); break; 13314: case 0x42: FEFunction.fpkCOSH (); break; 13315: case 0x43: FEFunction.fpkTANH (); break; 13316: case 0x44: FEFunction.fpkATANH (); break; 13317: case 0x45: FEFunction.fpkASIN (); break; 13318: case 0x46: FEFunction.fpkACOS (); break; 13319: case 0x47: FEFunction.fpkLOG10 (); break; 13320: case 0x48: FEFunction.fpkLOG2 (); break; 13321: case 0x49: FEFunction.fpkDFREXP (); break; 13322: case 0x4a: FEFunction.fpkDLDEXP (); break; 13323: case 0x4b: FEFunction.fpkDADDONE (); break; 13324: case 0x4c: FEFunction.fpkDSUBONE (); break; 13325: case 0x4d: FEFunction.fpkDDIVTWO (); break; 13326: case 0x4e: FEFunction.fpkDIEECNV (); break; 13327: case 0x4f: FEFunction.fpkIEEDCNV (); break; 13328: case 0x50: FEFunction.fpkFVAL (); break; 13329: case 0x51: FEFunction.fpkFUSING (); break; 13330: case 0x52: FEFunction.fpkSTOF (); break; 13331: case 0x53: FEFunction.fpkFTOS (); break; 13332: case 0x54: FEFunction.fpkFECVT (); break; 13333: case 0x55: FEFunction.fpkFFCVT (); break; 13334: case 0x56: FEFunction.fpkFGCVT (); break; 13335: //case 0x57: break; 13336: case 0x58: FEFunction.fpkFTST (); break; 13337: case 0x59: FEFunction.fpkFCMP (); break; 13338: case 0x5a: FEFunction.fpkFNEG (); break; 13339: case 0x5b: FEFunction.fpkFADD (); break; 13340: case 0x5c: FEFunction.fpkFSUB (); break; 13341: case 0x5d: FEFunction.fpkFMUL (); break; 13342: case 0x5e: FEFunction.fpkFDIV (); break; 13343: case 0x5f: FEFunction.fpkFMOD (); break; 13344: case 0x60: FEFunction.fpkFABS (); break; 13345: case 0x61: FEFunction.fpkFCEIL (); break; 13346: case 0x62: FEFunction.fpkFFIX (); break; 13347: case 0x63: FEFunction.fpkFFLOOR (); break; 13348: case 0x64: FEFunction.fpkFFRAC (); break; 13349: case 0x65: FEFunction.fpkFSGN (); break; 13350: case 0x66: FEFunction.fpkFSIN (); break; 13351: case 0x67: FEFunction.fpkFCOS (); break; 13352: case 0x68: FEFunction.fpkFTAN (); break; 13353: case 0x69: FEFunction.fpkFATAN (); break; 13354: case 0x6a: FEFunction.fpkFLOG (); break; 13355: case 0x6b: FEFunction.fpkFEXP (); break; 13356: case 0x6c: FEFunction.fpkFSQR (); break; 13357: case 0x6d: FEFunction.fpkFPI (); break; 13358: case 0x6e: FEFunction.fpkFNPI (); break; 13359: case 0x6f: FEFunction.fpkFPOWER (); break; 13360: case 0x70: FEFunction.fpkFRND (); break; 13361: case 0x71: FEFunction.fpkFSINH (); break; 13362: case 0x72: FEFunction.fpkFCOSH (); break; 13363: case 0x73: FEFunction.fpkFTANH (); break; 13364: case 0x74: FEFunction.fpkFATANH (); break; 13365: case 0x75: FEFunction.fpkFASIN (); break; 13366: case 0x76: FEFunction.fpkFACOS (); break; 13367: case 0x77: FEFunction.fpkFLOG10 (); break; 13368: case 0x78: FEFunction.fpkFLOG2 (); break; 13369: case 0x79: FEFunction.fpkFFREXP (); break; 13370: case 0x7a: FEFunction.fpkFLDEXP (); break; 13371: case 0x7b: FEFunction.fpkFADDONE (); break; 13372: case 0x7c: FEFunction.fpkFSUBONE (); break; 13373: case 0x7d: FEFunction.fpkFDIVTWO (); break; 13374: case 0x7e: FEFunction.fpkFIEECNV (); break; 13375: case 0x7f: FEFunction.fpkIEEFCNV (); break; 13376: //case 0x80: break; 13377: //case 0x81: break; 13378: //case 0x82: break; 13379: //case 0x83: break; 13380: //case 0x84: break; 13381: //case 0x85: break; 13382: //case 0x86: break; 13383: //case 0x87: break; 13384: //case 0x88: break; 13385: //case 0x89: break; 13386: //case 0x8a: break; 13387: //case 0x8b: break; 13388: //case 0x8c: break; 13389: //case 0x8d: break; 13390: //case 0x8e: break; 13391: //case 0x8f: break; 13392: //case 0x90: break; 13393: //case 0x91: break; 13394: //case 0x92: break; 13395: //case 0x93: break; 13396: //case 0x94: break; 13397: //case 0x95: break; 13398: //case 0x96: break; 13399: //case 0x97: break; 13400: //case 0x98: break; 13401: //case 0x99: break; 13402: //case 0x9a: break; 13403: //case 0x9b: break; 13404: //case 0x9c: break; 13405: //case 0x9d: break; 13406: //case 0x9e: break; 13407: //case 0x9f: break; 13408: //case 0xa0: break; 13409: //case 0xa1: break; 13410: //case 0xa2: break; 13411: //case 0xa3: break; 13412: //case 0xa4: break; 13413: //case 0xa5: break; 13414: //case 0xa6: break; 13415: //case 0xa7: break; 13416: //case 0xa8: break; 13417: //case 0xa9: break; 13418: //case 0xaa: break; 13419: //case 0xab: break; 13420: //case 0xac: break; 13421: //case 0xad: break; 13422: //case 0xae: break; 13423: //case 0xaf: break; 13424: //case 0xb0: break; 13425: //case 0xb1: break; 13426: //case 0xb2: break; 13427: //case 0xb3: break; 13428: //case 0xb4: break; 13429: //case 0xb5: break; 13430: //case 0xb6: break; 13431: //case 0xb7: break; 13432: //case 0xb8: break; 13433: //case 0xb9: break; 13434: //case 0xba: break; 13435: //case 0xbb: break; 13436: //case 0xbc: break; 13437: //case 0xbd: break; 13438: //case 0xbe: break; 13439: //case 0xbf: break; 13440: //case 0xc0: break; 13441: //case 0xc1: break; 13442: //case 0xc2: break; 13443: //case 0xc3: break; 13444: //case 0xc4: break; 13445: //case 0xc5: break; 13446: //case 0xc6: break; 13447: //case 0xc7: break; 13448: //case 0xc8: break; 13449: //case 0xc9: break; 13450: //case 0xca: break; 13451: //case 0xcb: break; 13452: //case 0xcc: break; 13453: //case 0xcd: break; 13454: //case 0xce: break; 13455: //case 0xcf: break; 13456: //case 0xd0: break; 13457: //case 0xd1: break; 13458: //case 0xd2: break; 13459: //case 0xd3: break; 13460: //case 0xd4: break; 13461: //case 0xd5: break; 13462: //case 0xd6: break; 13463: //case 0xd7: break; 13464: //case 0xd8: break; 13465: //case 0xd9: break; 13466: //case 0xda: break; 13467: //case 0xdb: break; 13468: //case 0xdc: break; 13469: //case 0xdd: break; 13470: //case 0xde: break; 13471: //case 0xdf: break; 13472: case 0xe0: FEFunction.fpkCLMUL (); break; 13473: case 0xe1: FEFunction.fpkCLDIV (); break; 13474: case 0xe2: FEFunction.fpkCLMOD (); break; 13475: case 0xe3: FEFunction.fpkCUMUL (); break; 13476: case 0xe4: FEFunction.fpkCUDIV (); break; 13477: case 0xe5: FEFunction.fpkCUMOD (); break; 13478: case 0xe6: FEFunction.fpkCLTOD (); break; 13479: case 0xe7: FEFunction.fpkCDTOL (); break; 13480: case 0xe8: FEFunction.fpkCLTOF (); break; 13481: case 0xe9: FEFunction.fpkCFTOL (); break; 13482: case 0xea: FEFunction.fpkCFTOD (); break; 13483: case 0xeb: FEFunction.fpkCDTOF (); break; 13484: case 0xec: FEFunction.fpkCDCMP (); break; 13485: case 0xed: FEFunction.fpkCDADD (); break; 13486: case 0xee: FEFunction.fpkCDSUB (); break; 13487: case 0xef: FEFunction.fpkCDMUL (); break; 13488: case 0xf0: FEFunction.fpkCDDIV (); break; 13489: case 0xf1: FEFunction.fpkCDMOD (); break; 13490: case 0xf2: FEFunction.fpkCFCMP (); break; 13491: case 0xf3: FEFunction.fpkCFADD (); break; 13492: case 0xf4: FEFunction.fpkCFSUB (); break; 13493: case 0xf5: FEFunction.fpkCFMUL (); break; 13494: case 0xf6: FEFunction.fpkCFDIV (); break; 13495: case 0xf7: FEFunction.fpkCFMOD (); break; 13496: case 0xf8: FEFunction.fpkCDTST (); break; 13497: case 0xf9: FEFunction.fpkCFTST (); break; 13498: case 0xfa: FEFunction.fpkCDINC (); break; 13499: case 0xfb: FEFunction.fpkCFINC (); break; 13500: case 0xfc: FEFunction.fpkCDDEC (); break; 13501: case 0xfd: FEFunction.fpkCFDEC (); break; 13502: case 0xfe: FEFunction.fpkFEVARG (); break; 13503: //case 0xff: FEFunction.fpkFEVECS (); break; //FLOATn.Xに処理させる 13504: default: 13505: XEiJ.mpuCycleCount -= FEFunction.FPK_CLOCK; //戻す 13506: irpFline (); 13507: } 13508: if (FEFunction.FPK_DEBUG_TRACE) { 13509: int i = sb.length (); 13510: XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (sb.append (" D0="), XEiJ.regRn[0]).append (" D1="), XEiJ.regRn[1]).append (" D2="), XEiJ.regRn[2]).append (" D3="), XEiJ.regRn[3]); 13511: int l = MainMemory.mmrStrlen (a0, 20); 13512: sb.append (" (A0)=\""); 13513: i = sb.length () - i; 13514: MainMemory.mmrRstr (sb, a0, l).append ("\"\n"); 13515: if (a0 <= XEiJ.regRn[8] && XEiJ.regRn[8] <= a0 + l) { 13516: for (i += sb.length () + XEiJ.regRn[8] - a0; sb.length () < i; ) { 13517: sb.append (' '); 13518: } 13519: sb.append ('^'); 13520: } 13521: System.out.println (sb.toString ()); 13522: } 13523: } //irpFpack 13524: 13525: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13526: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13527: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13528: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13529: //DOS <data> |A|012346|-|UUUUU|UUUUU| |1111_111_1dd_ddd_ddd [FLINE #<data>] 13530: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13531: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13532: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13533: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13534: //FLINE #<data> |-|012346|-|UUUUU|UUUUU| |1111_ddd_ddd_ddd_ddd (line 1111 emulator) 13535: public static void irpFline () throws M68kException { 13536: XEiJ.mpuCycleCount += 34; 13537: if (XEiJ.MPU_INLINE_EXCEPTION) { 13538: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 13539: int sp = XEiJ.regRn[15]; 13540: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 13541: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13542: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13543: XEiJ.mpuUSP = sp; //USPを保存 13544: sp = XEiJ.mpuISP; //SSPを復元 13545: if (DataBreakPoint.DBP_ON) { 13546: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13547: } else { 13548: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13549: } 13550: if (InstructionBreakPoint.IBP_ON) { 13551: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13552: } 13553: } 13554: int vectorOffset = M68kException.M6E_LINE_1111_EMULATOR << 2; //vector offset 13555: XEiJ.regRn[15] = sp -= 8; //short format 13556: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 13557: XEiJ.busWl (sp + 2, XEiJ.regPC0); //program counter 13558: XEiJ.busWw (sp, save_sr); //status register 13559: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 13560: } else { 13561: irpException (M68kException.M6E_LINE_1111_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは命令の先頭 13562: } 13563: } //irpFline 13564: 13565: //irpIllegal () 13566: // オペコードの上位10bitで分類されなかった未実装命令 13567: // 0x4afcのILLEGAL命令はここには来ない 13568: public static void irpIllegal () throws M68kException { 13569: if (true) { 13570: XEiJ.mpuCycleCount += 34; 13571: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13572: throw M68kException.m6eSignal; 13573: } 13574: } //irpIllegal 13575: 13576: //z = irpAbcd (x, y) 13577: // ABCD 13578: public static int irpAbcd (int x, int y) { 13579: int c = XEiJ.regCCR >> 4; 13580: int t = (x & 0xff) + (y & 0xff) + c; //仮の結果 13581: int z = t; //結果 13582: if (0x0a <= (x & 0x0f) + (y & 0x0f) + c) { //ハーフキャリー 13583: z += 0x10 - 0x0a; 13584: } 13585: //XとCはキャリーがあるときセット、さもなくばクリア 13586: if (0xa0 <= z) { //キャリー 13587: z += 0x100 - 0xa0; 13588: XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C; 13589: } else { 13590: XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); 13591: } 13592: //Zは結果が0でないときクリア、さもなくば変化しない 13593: z &= 0xff; 13594: if (z != 0x00) { 13595: XEiJ.regCCR &= ~XEiJ.REG_CCR_Z; 13596: } 13597: if (true) { 13598: //000/030のときNは結果の最上位ビット 13599: if ((z & 0x80) != 0) { 13600: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13601: } else { 13602: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13603: } 13604: //000のときVは補正値の加算でオーバーフローしたときセット、さもなくばクリア 13605: int a = z - t; //補正値 13606: if ((((t ^ z) & (a ^ z)) & 0x80) != 0) { 13607: XEiJ.regCCR |= XEiJ.REG_CCR_V; 13608: } else { 13609: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13610: } 13611: } else if (false) { 13612: //000/030のときNは結果の最上位ビット 13613: if ((z & 0x80) != 0) { 13614: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13615: } else { 13616: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13617: } 13618: //030のときVはクリア 13619: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13620: } else { 13621: //060のときNとVは変化しない 13622: } 13623: return z; 13624: } //irpAbcd 13625: 13626: //z = irpSbcd (x, y) 13627: // SBCD 13628: public static int irpSbcd (int x, int y) { 13629: int b = XEiJ.regCCR >> 4; 13630: int t = (x & 0xff) - (y & 0xff) - b; //仮の結果 13631: int z = t; //結果 13632: if ((x & 0x0f) - (y & 0x0f) - b < 0) { //ハーフボロー 13633: z -= 0x10 - 0x0a; 13634: } 13635: //XとCはボローがあるときセット、さもなくばクリア 13636: if (z < 0) { //ボロー 13637: if (t < 0) { 13638: z -= 0x100 - 0xa0; 13639: } 13640: XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C; 13641: } else { 13642: XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); 13643: } 13644: //Zは結果が0でないときクリア、さもなくば変化しない 13645: z &= 0xff; 13646: if (z != 0x00) { 13647: XEiJ.regCCR &= ~XEiJ.REG_CCR_Z; 13648: } 13649: if (true) { 13650: //000/030のときNは結果の最上位ビット 13651: if ((z & 0x80) != 0) { 13652: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13653: } else { 13654: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13655: } 13656: //000のときVは補正値の加算でオーバーフローしたときセット、さもなくばクリア 13657: int a = z - t; //補正値 13658: if ((((t ^ z) & (a ^ z)) & 0x80) != 0) { 13659: XEiJ.regCCR |= XEiJ.REG_CCR_V; 13660: } else { 13661: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13662: } 13663: } else if (false) { 13664: //000/030のときNは結果の最上位ビット 13665: if ((z & 0x80) != 0) { 13666: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13667: } else { 13668: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13669: } 13670: //030のときVはクリア 13671: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13672: } else { 13673: //060のときNとVは変化しない 13674: } 13675: return z; 13676: } //irpSbcd 13677: 13678: 13679: 13680: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13681: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13682: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13683: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13684: //HFSBOOT |-|012346|-|-----|-----| |0100_111_000_000_000 13685: //HFSINST |-|012346|-|-----|-----| |0100_111_000_000_001 13686: //HFSSTR |-|012346|-|-----|-----| |0100_111_000_000_010 13687: //HFSINT |-|012346|-|-----|-----| |0100_111_000_000_011 13688: //EMXNOP |-|012346|-|-----|-----| |0100_111_000_000_100 13689: // エミュレータ拡張命令 13690: public static void irpEmx () throws M68kException { 13691: switch (XEiJ.regOC & 63) { 13692: case XEiJ.EMX_OPCODE_HFSBOOT & 63: 13693: XEiJ.mpuCycleCount += 40; 13694: if (HFS.hfsIPLBoot ()) { 13695: //JMP $6800.W 13696: irpSetPC (0x00006800); 13697: } 13698: break; 13699: case XEiJ.EMX_OPCODE_HFSINST & 63: 13700: XEiJ.mpuCycleCount += 40; 13701: HFS.hfsInstall (); 13702: break; 13703: case XEiJ.EMX_OPCODE_HFSSTR & 63: 13704: XEiJ.mpuCycleCount += 40; 13705: HFS.hfsStrategy (); 13706: break; 13707: case XEiJ.EMX_OPCODE_HFSINT & 63: 13708: XEiJ.mpuCycleCount += 40; 13709: //XEiJ.mpuClockTime += (int) (TMR_FREQ / 100000L); //0.01ms 13710: if (HFS.hfsInterrupt ()) { 13711: //WAIT 13712: XEiJ.mpuTraceFlag = 0; //トレース例外を発生させない 13713: XEiJ.regPC = XEiJ.regPC0; //ループ 13714: XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000; //4μs。10MHzのとき40clk 13715: XEiJ.mpuLastNano += 4000L; 13716: } 13717: break; 13718: case XEiJ.EMX_OPCODE_EMXNOP & 63: 13719: XEiJ.emxNop (); 13720: break; 13721: case XEiJ.EMX_OPCODE_EMXWAIT & 63: 13722: WaitInstruction.execute (); //待機命令を実行する 13723: break; 13724: default: 13725: XEiJ.mpuCycleCount += 34; 13726: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13727: throw M68kException.m6eSignal; 13728: } 13729: } //irpEmx 13730: 13731: 13732: 13733: //irpSetPC (a) 13734: // pcへデータを書き込む 13735: // 奇数のときはアドレスエラーが発生する 13736: public static void irpSetPC (int a) throws M68kException { 13737: if (XEiJ.TEST_BIT_0_SHIFT ? a << 31 - 0 < 0 : (a & 1) != 0) { 13738: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 13739: M68kException.m6eAddress = a; 13740: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 13741: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 13742: throw M68kException.m6eSignal; 13743: } 13744: if (BranchLog.BLG_ON) { 13745: BranchLog.blgJump (a); //分岐ログに分岐レコードを追加する 13746: } else { 13747: XEiJ.regPC = a; 13748: } 13749: } //irpSetPC 13750: 13751: //irpSetSR (newSr) 13752: // srへデータを書き込む 13753: // ori to sr/andi to sr/eori to sr/move to sr/stop/rteで使用される 13754: // スーパーバイザモードになっていることを確認してから呼び出すこと 13755: // rteではr[15]が指すアドレスからsrとpcを取り出してr[15]を更新してから呼び出すこと 13756: // スーパーバイザモード→ユーザモードのときは移行のための処理を行う 13757: // 新しい割り込みマスクレベルよりも高い割り込み処理の終了をデバイスに通知する 13758: public static void irpSetSR (int newSr) { 13759: XEiJ.regSRT1 = XEiJ.REG_SR_T1 & newSr; 13760: if ((XEiJ.regSRS = XEiJ.REG_SR_S & newSr) == 0) { //スーパーバイザモード→ユーザモード 13761: XEiJ.mpuISP = XEiJ.regRn[15]; //XEiJ.mpuISPを保存 13762: XEiJ.regRn[15] = XEiJ.mpuUSP; //XEiJ.mpuUSPを復元 13763: if (DataBreakPoint.DBP_ON) { 13764: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpUserMap; //ユーザメモリマップに切り替える 13765: } else { 13766: XEiJ.busMemoryMap = XEiJ.busUserMap; //ユーザメモリマップに切り替える 13767: } 13768: if (InstructionBreakPoint.IBP_ON) { 13769: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1UserMap; 13770: } 13771: } 13772: int t = (XEiJ.mpuIMR = 0x7f >> ((XEiJ.regSRI = XEiJ.REG_SR_I & newSr) >> 8)) & XEiJ.mpuISR; //XEiJ.mpuISRで1→0とするビット 13773: if (t != 0) { //終了する割り込みがあるとき 13774: XEiJ.mpuISR ^= t; 13775: //デバイスに割り込み処理の終了を通知する 13776: if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) { //MFPのみ 13777: MC68901.mfpDone (); 13778: } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) { //DMAのみ 13779: HD63450.dmaDone (); 13780: } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) { //SCCのみ 13781: Z8530.sccDone (); 13782: } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) { //IOIのみ 13783: IOInterrupt.ioiDone (); 13784: } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) { //EB2のみ 13785: XEiJ.eb2Done (); 13786: } else { //SYSのみまたは複数 13787: if (XEiJ.TEST_BIT_1_SHIFT ? t << 24 + XEiJ.MPU_MFP_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_MFP_INTERRUPT_MASK) != 0) { 13788: MC68901.mfpDone (); 13789: } 13790: if (t << 24 + XEiJ.MPU_DMA_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_DMA_INTERRUPT_MASK) != 0 13791: HD63450.dmaDone (); 13792: } 13793: if (XEiJ.TEST_BIT_2_SHIFT ? t << 24 + XEiJ.MPU_SCC_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SCC_INTERRUPT_MASK) != 0) { 13794: Z8530.sccDone (); 13795: } 13796: if (t << 24 + XEiJ.MPU_IOI_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_IOI_INTERRUPT_MASK) != 0 13797: IOInterrupt.ioiDone (); 13798: } 13799: if (t << 24 + XEiJ.MPU_EB2_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_EB2_INTERRUPT_MASK) != 0 13800: XEiJ.eb2Done (); 13801: } 13802: if (XEiJ.TEST_BIT_0_SHIFT ? t << 24 + XEiJ.MPU_SYS_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SYS_INTERRUPT_MASK) != 0) { 13803: XEiJ.sysDone (); 13804: } 13805: } 13806: } 13807: XEiJ.mpuIMR |= ~XEiJ.mpuISR & XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みマスクレベルが7のときレベル7割り込みの処理中でなければレベル7割り込みを許可する 13808: XEiJ.regCCR = XEiJ.REG_CCR_MASK & newSr; 13809: } //irpSetSR 13810: 13811: //irpInterrupt (vectorNumber, level) 13812: // 割り込み処理を開始する 13813: public static void irpInterrupt (int vectorNumber, int level) throws M68kException { 13814: if (XEiJ.regOC == 0b0100_111_001_110_010) { //最後に実行した命令はSTOP命令 13815: XEiJ.regPC = XEiJ.regPC0 + 4; //次の命令に進む 13816: } 13817: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * 44; 13818: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 13819: XEiJ.regSRI = level << 8; //割り込みマスクを要求されたレベルに変更する 13820: XEiJ.mpuIMR = 0x7f >> level; 13821: XEiJ.mpuISR |= 0x80 >> level; 13822: int sp = XEiJ.regRn[15]; 13823: XEiJ.regSRT1 = 0; //srのTビットを消す 13824: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13825: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13826: XEiJ.mpuUSP = sp; //USPを保存 13827: sp = XEiJ.mpuISP; //SSPを復元 13828: if (DataBreakPoint.DBP_ON) { 13829: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13830: } else { 13831: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13832: } 13833: if (InstructionBreakPoint.IBP_ON) { 13834: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13835: } 13836: } 13837: int vectorOffset = vectorNumber << 2; //vector offset 13838: XEiJ.regRn[15] = sp -= 8; //short format 13839: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 13840: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 13841: XEiJ.busWw (sp, save_sr); //status register 13842: if (BranchLog.BLG_ON) { 13843: XEiJ.regPC0 = XEiJ.regPC; //rteによる割り込み終了と同時に次の割り込みを受け付けたとき間でpc0を更新しないと2番目の分岐レコードの終了アドレスが1番目と同じになっておかしな分岐レコードができてしまう 13844: } 13845: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 13846: } //irpInterrupt 13847: 13848: //irpException (vectorNumber, save_pc, save_sr) 13849: // 例外処理を開始する 13850: // スタックへのプッシュ、ベクタの取り出し、ジャンプのいずれかでバスエラーまたはアドレスエラーが発生する場合がある 13851: public static void irpException (int vectorNumber, int save_pc, int save_sr) throws M68kException { 13852: int sp = XEiJ.regRn[15]; 13853: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 13854: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13855: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13856: XEiJ.mpuUSP = sp; //USPを保存 13857: sp = XEiJ.mpuISP; //SSPを復元 13858: if (DataBreakPoint.DBP_ON) { 13859: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13860: } else { 13861: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13862: } 13863: if (InstructionBreakPoint.IBP_ON) { 13864: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13865: } 13866: } 13867: int vectorOffset = vectorNumber << 2; //vector offset 13868: XEiJ.regRn[15] = sp -= 8; //short format 13869: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 13870: XEiJ.busWl (sp + 2, save_pc); //program counter 13871: XEiJ.busWw (sp, save_sr); //status register 13872: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 13873: } //irpException 13874: 13875: 13876: 13877: //a = efaAnyByte (ea) //| M+-WXZPI| 13878: // 任意のモードのバイトオペランドの実効アドレスを求める 13879: // (A7)+と-(A7)はA7を奇偶に関わらず2変化させ、跨いだワードの上位バイト(アドレスの小さい方)を参照する 13880: // #<data>はオペコードに続くワードの下位バイトを参照する。上位バイトは不定なので参照してはならない 13881: @SuppressWarnings ("fallthrough") public static int efaAnyByte (int ea) throws M68kException { 13882: int t, w; 13883: switch (ea) { 13884: case 0b010_000: //(A0) 13885: if (XEiJ.EFA_SEPARATE_AR) { 13886: XEiJ.mpuCycleCount += 4; 13887: return XEiJ.regRn[ 8]; 13888: } 13889: //fallthrough 13890: case 0b010_001: //(A1) 13891: if (XEiJ.EFA_SEPARATE_AR) { 13892: XEiJ.mpuCycleCount += 4; 13893: return XEiJ.regRn[ 9]; 13894: } 13895: //fallthrough 13896: case 0b010_010: //(A2) 13897: if (XEiJ.EFA_SEPARATE_AR) { 13898: XEiJ.mpuCycleCount += 4; 13899: return XEiJ.regRn[10]; 13900: } 13901: //fallthrough 13902: case 0b010_011: //(A3) 13903: if (XEiJ.EFA_SEPARATE_AR) { 13904: XEiJ.mpuCycleCount += 4; 13905: return XEiJ.regRn[11]; 13906: } 13907: //fallthrough 13908: case 0b010_100: //(A4) 13909: if (XEiJ.EFA_SEPARATE_AR) { 13910: XEiJ.mpuCycleCount += 4; 13911: return XEiJ.regRn[12]; 13912: } 13913: //fallthrough 13914: case 0b010_101: //(A5) 13915: if (XEiJ.EFA_SEPARATE_AR) { 13916: XEiJ.mpuCycleCount += 4; 13917: return XEiJ.regRn[13]; 13918: } 13919: //fallthrough 13920: case 0b010_110: //(A6) 13921: if (XEiJ.EFA_SEPARATE_AR) { 13922: XEiJ.mpuCycleCount += 4; 13923: return XEiJ.regRn[14]; 13924: } 13925: //fallthrough 13926: case 0b010_111: //(A7) 13927: if (XEiJ.EFA_SEPARATE_AR) { 13928: XEiJ.mpuCycleCount += 4; 13929: return XEiJ.regRn[15]; 13930: } else { 13931: XEiJ.mpuCycleCount += 4; 13932: return XEiJ.regRn[ea - (0b010_000 - 8)]; 13933: } 13934: case 0b011_000: //(A0)+ 13935: if (XEiJ.EFA_SEPARATE_AR) { 13936: XEiJ.mpuCycleCount += 4; 13937: return XEiJ.regRn[ 8]++; 13938: } 13939: //fallthrough 13940: case 0b011_001: //(A1)+ 13941: if (XEiJ.EFA_SEPARATE_AR) { 13942: XEiJ.mpuCycleCount += 4; 13943: return XEiJ.regRn[ 9]++; 13944: } 13945: //fallthrough 13946: case 0b011_010: //(A2)+ 13947: if (XEiJ.EFA_SEPARATE_AR) { 13948: XEiJ.mpuCycleCount += 4; 13949: return XEiJ.regRn[10]++; 13950: } 13951: //fallthrough 13952: case 0b011_011: //(A3)+ 13953: if (XEiJ.EFA_SEPARATE_AR) { 13954: XEiJ.mpuCycleCount += 4; 13955: return XEiJ.regRn[11]++; 13956: } 13957: //fallthrough 13958: case 0b011_100: //(A4)+ 13959: if (XEiJ.EFA_SEPARATE_AR) { 13960: XEiJ.mpuCycleCount += 4; 13961: return XEiJ.regRn[12]++; 13962: } 13963: //fallthrough 13964: case 0b011_101: //(A5)+ 13965: if (XEiJ.EFA_SEPARATE_AR) { 13966: XEiJ.mpuCycleCount += 4; 13967: return XEiJ.regRn[13]++; 13968: } 13969: //fallthrough 13970: case 0b011_110: //(A6)+ 13971: if (XEiJ.EFA_SEPARATE_AR) { 13972: XEiJ.mpuCycleCount += 4; 13973: return XEiJ.regRn[14]++; 13974: } else { 13975: XEiJ.mpuCycleCount += 4; 13976: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 13977: } 13978: case 0b011_111: //(A7)+ 13979: XEiJ.mpuCycleCount += 4; 13980: return (XEiJ.regRn[15] += 2) - 2; 13981: case 0b100_000: //-(A0) 13982: if (XEiJ.EFA_SEPARATE_AR) { 13983: XEiJ.mpuCycleCount += 6; 13984: return --XEiJ.regRn[ 8]; 13985: } 13986: //fallthrough 13987: case 0b100_001: //-(A1) 13988: if (XEiJ.EFA_SEPARATE_AR) { 13989: XEiJ.mpuCycleCount += 6; 13990: return --XEiJ.regRn[ 9]; 13991: } 13992: //fallthrough 13993: case 0b100_010: //-(A2) 13994: if (XEiJ.EFA_SEPARATE_AR) { 13995: XEiJ.mpuCycleCount += 6; 13996: return --XEiJ.regRn[10]; 13997: } 13998: //fallthrough 13999: case 0b100_011: //-(A3) 14000: if (XEiJ.EFA_SEPARATE_AR) { 14001: XEiJ.mpuCycleCount += 6; 14002: return --XEiJ.regRn[11]; 14003: } 14004: //fallthrough 14005: case 0b100_100: //-(A4) 14006: if (XEiJ.EFA_SEPARATE_AR) { 14007: XEiJ.mpuCycleCount += 6; 14008: return --XEiJ.regRn[12]; 14009: } 14010: //fallthrough 14011: case 0b100_101: //-(A5) 14012: if (XEiJ.EFA_SEPARATE_AR) { 14013: XEiJ.mpuCycleCount += 6; 14014: return --XEiJ.regRn[13]; 14015: } 14016: //fallthrough 14017: case 0b100_110: //-(A6) 14018: if (XEiJ.EFA_SEPARATE_AR) { 14019: XEiJ.mpuCycleCount += 6; 14020: return --XEiJ.regRn[14]; 14021: } else { 14022: XEiJ.mpuCycleCount += 6; 14023: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 14024: } 14025: case 0b100_111: //-(A7) 14026: XEiJ.mpuCycleCount += 6; 14027: return XEiJ.regRn[15] -= 2; 14028: case 0b101_000: //(d16,A0) 14029: case 0b101_001: //(d16,A1) 14030: case 0b101_010: //(d16,A2) 14031: case 0b101_011: //(d16,A3) 14032: case 0b101_100: //(d16,A4) 14033: case 0b101_101: //(d16,A5) 14034: case 0b101_110: //(d16,A6) 14035: case 0b101_111: //(d16,A7) 14036: XEiJ.mpuCycleCount += 8; 14037: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14038: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14039: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14040: } else { 14041: t = XEiJ.regPC; 14042: XEiJ.regPC = t + 2; 14043: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14044: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14045: } 14046: case 0b110_000: //(d8,A0,Rn.wl) 14047: case 0b110_001: //(d8,A1,Rn.wl) 14048: case 0b110_010: //(d8,A2,Rn.wl) 14049: case 0b110_011: //(d8,A3,Rn.wl) 14050: case 0b110_100: //(d8,A4,Rn.wl) 14051: case 0b110_101: //(d8,A5,Rn.wl) 14052: case 0b110_110: //(d8,A6,Rn.wl) 14053: case 0b110_111: //(d8,A7,Rn.wl) 14054: XEiJ.mpuCycleCount += 10; 14055: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14056: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14057: } else { 14058: w = XEiJ.regPC; 14059: XEiJ.regPC = w + 2; 14060: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14061: } 14062: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14063: + (byte) w //バイトディスプレースメント 14064: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14065: XEiJ.regRn[w >> 12])); //ロングインデックス 14066: case 0b111_000: //(xxx).W 14067: XEiJ.mpuCycleCount += 8; 14068: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14069: case 0b111_001: //(xxx).L 14070: XEiJ.mpuCycleCount += 12; 14071: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14072: case 0b111_010: //(d16,PC) 14073: XEiJ.mpuCycleCount += 8; 14074: t = XEiJ.regPC; 14075: XEiJ.regPC = t + 2; 14076: return (t //ベースレジスタ 14077: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14078: case 0b111_011: //(d8,PC,Rn.wl) 14079: XEiJ.mpuCycleCount += 10; 14080: t = XEiJ.regPC; 14081: XEiJ.regPC = t + 2; 14082: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14083: return (t //ベースレジスタ 14084: + (byte) w //バイトディスプレースメント 14085: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14086: XEiJ.regRn[w >> 12])); //ロングインデックス 14087: case 0b111_100: //#<data> 14088: XEiJ.mpuCycleCount += 4; 14089: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14090: return (XEiJ.regPC += 2) - 1; //下位バイト 14091: } else { 14092: t = XEiJ.regPC; 14093: XEiJ.regPC = t + 2; 14094: return t + 1; //下位バイト 14095: } 14096: } //switch 14097: XEiJ.mpuCycleCount += 34; 14098: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14099: throw M68kException.m6eSignal; 14100: } //efaAnyByte 14101: 14102: //a = efaMemByte (ea) //| M+-WXZP | 14103: // メモリモードのバイトオペランドの実効アドレスを求める 14104: // efaAnyByteとの違いは#<data>がないこと 14105: @SuppressWarnings ("fallthrough") public static int efaMemByte (int ea) throws M68kException { 14106: int t, w; 14107: switch (ea) { 14108: case 0b010_000: //(A0) 14109: if (XEiJ.EFA_SEPARATE_AR) { 14110: XEiJ.mpuCycleCount += 4; 14111: return XEiJ.regRn[ 8]; 14112: } 14113: //fallthrough 14114: case 0b010_001: //(A1) 14115: if (XEiJ.EFA_SEPARATE_AR) { 14116: XEiJ.mpuCycleCount += 4; 14117: return XEiJ.regRn[ 9]; 14118: } 14119: //fallthrough 14120: case 0b010_010: //(A2) 14121: if (XEiJ.EFA_SEPARATE_AR) { 14122: XEiJ.mpuCycleCount += 4; 14123: return XEiJ.regRn[10]; 14124: } 14125: //fallthrough 14126: case 0b010_011: //(A3) 14127: if (XEiJ.EFA_SEPARATE_AR) { 14128: XEiJ.mpuCycleCount += 4; 14129: return XEiJ.regRn[11]; 14130: } 14131: //fallthrough 14132: case 0b010_100: //(A4) 14133: if (XEiJ.EFA_SEPARATE_AR) { 14134: XEiJ.mpuCycleCount += 4; 14135: return XEiJ.regRn[12]; 14136: } 14137: //fallthrough 14138: case 0b010_101: //(A5) 14139: if (XEiJ.EFA_SEPARATE_AR) { 14140: XEiJ.mpuCycleCount += 4; 14141: return XEiJ.regRn[13]; 14142: } 14143: //fallthrough 14144: case 0b010_110: //(A6) 14145: if (XEiJ.EFA_SEPARATE_AR) { 14146: XEiJ.mpuCycleCount += 4; 14147: return XEiJ.regRn[14]; 14148: } 14149: //fallthrough 14150: case 0b010_111: //(A7) 14151: if (XEiJ.EFA_SEPARATE_AR) { 14152: XEiJ.mpuCycleCount += 4; 14153: return XEiJ.regRn[15]; 14154: } else { 14155: XEiJ.mpuCycleCount += 4; 14156: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14157: } 14158: case 0b011_000: //(A0)+ 14159: if (XEiJ.EFA_SEPARATE_AR) { 14160: XEiJ.mpuCycleCount += 4; 14161: return XEiJ.regRn[ 8]++; 14162: } 14163: //fallthrough 14164: case 0b011_001: //(A1)+ 14165: if (XEiJ.EFA_SEPARATE_AR) { 14166: XEiJ.mpuCycleCount += 4; 14167: return XEiJ.regRn[ 9]++; 14168: } 14169: //fallthrough 14170: case 0b011_010: //(A2)+ 14171: if (XEiJ.EFA_SEPARATE_AR) { 14172: XEiJ.mpuCycleCount += 4; 14173: return XEiJ.regRn[10]++; 14174: } 14175: //fallthrough 14176: case 0b011_011: //(A3)+ 14177: if (XEiJ.EFA_SEPARATE_AR) { 14178: XEiJ.mpuCycleCount += 4; 14179: return XEiJ.regRn[11]++; 14180: } 14181: //fallthrough 14182: case 0b011_100: //(A4)+ 14183: if (XEiJ.EFA_SEPARATE_AR) { 14184: XEiJ.mpuCycleCount += 4; 14185: return XEiJ.regRn[12]++; 14186: } 14187: //fallthrough 14188: case 0b011_101: //(A5)+ 14189: if (XEiJ.EFA_SEPARATE_AR) { 14190: XEiJ.mpuCycleCount += 4; 14191: return XEiJ.regRn[13]++; 14192: } 14193: //fallthrough 14194: case 0b011_110: //(A6)+ 14195: if (XEiJ.EFA_SEPARATE_AR) { 14196: XEiJ.mpuCycleCount += 4; 14197: return XEiJ.regRn[14]++; 14198: } else { 14199: XEiJ.mpuCycleCount += 4; 14200: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 14201: } 14202: case 0b011_111: //(A7)+ 14203: XEiJ.mpuCycleCount += 4; 14204: return (XEiJ.regRn[15] += 2) - 2; 14205: case 0b100_000: //-(A0) 14206: if (XEiJ.EFA_SEPARATE_AR) { 14207: XEiJ.mpuCycleCount += 6; 14208: return --XEiJ.regRn[ 8]; 14209: } 14210: //fallthrough 14211: case 0b100_001: //-(A1) 14212: if (XEiJ.EFA_SEPARATE_AR) { 14213: XEiJ.mpuCycleCount += 6; 14214: return --XEiJ.regRn[ 9]; 14215: } 14216: //fallthrough 14217: case 0b100_010: //-(A2) 14218: if (XEiJ.EFA_SEPARATE_AR) { 14219: XEiJ.mpuCycleCount += 6; 14220: return --XEiJ.regRn[10]; 14221: } 14222: //fallthrough 14223: case 0b100_011: //-(A3) 14224: if (XEiJ.EFA_SEPARATE_AR) { 14225: XEiJ.mpuCycleCount += 6; 14226: return --XEiJ.regRn[11]; 14227: } 14228: //fallthrough 14229: case 0b100_100: //-(A4) 14230: if (XEiJ.EFA_SEPARATE_AR) { 14231: XEiJ.mpuCycleCount += 6; 14232: return --XEiJ.regRn[12]; 14233: } 14234: //fallthrough 14235: case 0b100_101: //-(A5) 14236: if (XEiJ.EFA_SEPARATE_AR) { 14237: XEiJ.mpuCycleCount += 6; 14238: return --XEiJ.regRn[13]; 14239: } 14240: //fallthrough 14241: case 0b100_110: //-(A6) 14242: if (XEiJ.EFA_SEPARATE_AR) { 14243: XEiJ.mpuCycleCount += 6; 14244: return --XEiJ.regRn[14]; 14245: } else { 14246: XEiJ.mpuCycleCount += 6; 14247: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 14248: } 14249: case 0b100_111: //-(A7) 14250: XEiJ.mpuCycleCount += 6; 14251: return XEiJ.regRn[15] -= 2; 14252: case 0b101_000: //(d16,A0) 14253: case 0b101_001: //(d16,A1) 14254: case 0b101_010: //(d16,A2) 14255: case 0b101_011: //(d16,A3) 14256: case 0b101_100: //(d16,A4) 14257: case 0b101_101: //(d16,A5) 14258: case 0b101_110: //(d16,A6) 14259: case 0b101_111: //(d16,A7) 14260: XEiJ.mpuCycleCount += 8; 14261: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14262: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14263: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14264: } else { 14265: t = XEiJ.regPC; 14266: XEiJ.regPC = t + 2; 14267: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14268: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14269: } 14270: case 0b110_000: //(d8,A0,Rn.wl) 14271: case 0b110_001: //(d8,A1,Rn.wl) 14272: case 0b110_010: //(d8,A2,Rn.wl) 14273: case 0b110_011: //(d8,A3,Rn.wl) 14274: case 0b110_100: //(d8,A4,Rn.wl) 14275: case 0b110_101: //(d8,A5,Rn.wl) 14276: case 0b110_110: //(d8,A6,Rn.wl) 14277: case 0b110_111: //(d8,A7,Rn.wl) 14278: XEiJ.mpuCycleCount += 10; 14279: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14280: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14281: } else { 14282: w = XEiJ.regPC; 14283: XEiJ.regPC = w + 2; 14284: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14285: } 14286: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14287: + (byte) w //バイトディスプレースメント 14288: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14289: XEiJ.regRn[w >> 12])); //ロングインデックス 14290: case 0b111_000: //(xxx).W 14291: XEiJ.mpuCycleCount += 8; 14292: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14293: case 0b111_001: //(xxx).L 14294: XEiJ.mpuCycleCount += 12; 14295: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14296: case 0b111_010: //(d16,PC) 14297: XEiJ.mpuCycleCount += 8; 14298: t = XEiJ.regPC; 14299: XEiJ.regPC = t + 2; 14300: return (t //ベースレジスタ 14301: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14302: case 0b111_011: //(d8,PC,Rn.wl) 14303: XEiJ.mpuCycleCount += 10; 14304: t = XEiJ.regPC; 14305: XEiJ.regPC = t + 2; 14306: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14307: return (t //ベースレジスタ 14308: + (byte) w //バイトディスプレースメント 14309: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14310: XEiJ.regRn[w >> 12])); //ロングインデックス 14311: } //switch 14312: XEiJ.mpuCycleCount += 34; 14313: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14314: throw M68kException.m6eSignal; 14315: } //efaMemByte 14316: 14317: //a = efaMltByte (ea) //| M+-WXZ | 14318: // メモリ可変モードのバイトオペランドの実効アドレスを求める 14319: // efaMemByteとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 14320: @SuppressWarnings ("fallthrough") public static int efaMltByte (int ea) throws M68kException { 14321: int t, w; 14322: switch (ea) { 14323: case 0b010_000: //(A0) 14324: if (XEiJ.EFA_SEPARATE_AR) { 14325: XEiJ.mpuCycleCount += 4; 14326: return XEiJ.regRn[ 8]; 14327: } 14328: //fallthrough 14329: case 0b010_001: //(A1) 14330: if (XEiJ.EFA_SEPARATE_AR) { 14331: XEiJ.mpuCycleCount += 4; 14332: return XEiJ.regRn[ 9]; 14333: } 14334: //fallthrough 14335: case 0b010_010: //(A2) 14336: if (XEiJ.EFA_SEPARATE_AR) { 14337: XEiJ.mpuCycleCount += 4; 14338: return XEiJ.regRn[10]; 14339: } 14340: //fallthrough 14341: case 0b010_011: //(A3) 14342: if (XEiJ.EFA_SEPARATE_AR) { 14343: XEiJ.mpuCycleCount += 4; 14344: return XEiJ.regRn[11]; 14345: } 14346: //fallthrough 14347: case 0b010_100: //(A4) 14348: if (XEiJ.EFA_SEPARATE_AR) { 14349: XEiJ.mpuCycleCount += 4; 14350: return XEiJ.regRn[12]; 14351: } 14352: //fallthrough 14353: case 0b010_101: //(A5) 14354: if (XEiJ.EFA_SEPARATE_AR) { 14355: XEiJ.mpuCycleCount += 4; 14356: return XEiJ.regRn[13]; 14357: } 14358: //fallthrough 14359: case 0b010_110: //(A6) 14360: if (XEiJ.EFA_SEPARATE_AR) { 14361: XEiJ.mpuCycleCount += 4; 14362: return XEiJ.regRn[14]; 14363: } 14364: //fallthrough 14365: case 0b010_111: //(A7) 14366: if (XEiJ.EFA_SEPARATE_AR) { 14367: XEiJ.mpuCycleCount += 4; 14368: return XEiJ.regRn[15]; 14369: } else { 14370: XEiJ.mpuCycleCount += 4; 14371: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14372: } 14373: case 0b011_000: //(A0)+ 14374: if (XEiJ.EFA_SEPARATE_AR) { 14375: XEiJ.mpuCycleCount += 4; 14376: return XEiJ.regRn[ 8]++; 14377: } 14378: //fallthrough 14379: case 0b011_001: //(A1)+ 14380: if (XEiJ.EFA_SEPARATE_AR) { 14381: XEiJ.mpuCycleCount += 4; 14382: return XEiJ.regRn[ 9]++; 14383: } 14384: //fallthrough 14385: case 0b011_010: //(A2)+ 14386: if (XEiJ.EFA_SEPARATE_AR) { 14387: XEiJ.mpuCycleCount += 4; 14388: return XEiJ.regRn[10]++; 14389: } 14390: //fallthrough 14391: case 0b011_011: //(A3)+ 14392: if (XEiJ.EFA_SEPARATE_AR) { 14393: XEiJ.mpuCycleCount += 4; 14394: return XEiJ.regRn[11]++; 14395: } 14396: //fallthrough 14397: case 0b011_100: //(A4)+ 14398: if (XEiJ.EFA_SEPARATE_AR) { 14399: XEiJ.mpuCycleCount += 4; 14400: return XEiJ.regRn[12]++; 14401: } 14402: //fallthrough 14403: case 0b011_101: //(A5)+ 14404: if (XEiJ.EFA_SEPARATE_AR) { 14405: XEiJ.mpuCycleCount += 4; 14406: return XEiJ.regRn[13]++; 14407: } 14408: //fallthrough 14409: case 0b011_110: //(A6)+ 14410: if (XEiJ.EFA_SEPARATE_AR) { 14411: XEiJ.mpuCycleCount += 4; 14412: return XEiJ.regRn[14]++; 14413: } else { 14414: XEiJ.mpuCycleCount += 4; 14415: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 14416: } 14417: case 0b011_111: //(A7)+ 14418: XEiJ.mpuCycleCount += 4; 14419: return (XEiJ.regRn[15] += 2) - 2; 14420: case 0b100_000: //-(A0) 14421: if (XEiJ.EFA_SEPARATE_AR) { 14422: XEiJ.mpuCycleCount += 6; 14423: return --XEiJ.regRn[ 8]; 14424: } 14425: //fallthrough 14426: case 0b100_001: //-(A1) 14427: if (XEiJ.EFA_SEPARATE_AR) { 14428: XEiJ.mpuCycleCount += 6; 14429: return --XEiJ.regRn[ 9]; 14430: } 14431: //fallthrough 14432: case 0b100_010: //-(A2) 14433: if (XEiJ.EFA_SEPARATE_AR) { 14434: XEiJ.mpuCycleCount += 6; 14435: return --XEiJ.regRn[10]; 14436: } 14437: //fallthrough 14438: case 0b100_011: //-(A3) 14439: if (XEiJ.EFA_SEPARATE_AR) { 14440: XEiJ.mpuCycleCount += 6; 14441: return --XEiJ.regRn[11]; 14442: } 14443: //fallthrough 14444: case 0b100_100: //-(A4) 14445: if (XEiJ.EFA_SEPARATE_AR) { 14446: XEiJ.mpuCycleCount += 6; 14447: return --XEiJ.regRn[12]; 14448: } 14449: //fallthrough 14450: case 0b100_101: //-(A5) 14451: if (XEiJ.EFA_SEPARATE_AR) { 14452: XEiJ.mpuCycleCount += 6; 14453: return --XEiJ.regRn[13]; 14454: } 14455: //fallthrough 14456: case 0b100_110: //-(A6) 14457: if (XEiJ.EFA_SEPARATE_AR) { 14458: XEiJ.mpuCycleCount += 6; 14459: return --XEiJ.regRn[14]; 14460: } else { 14461: XEiJ.mpuCycleCount += 6; 14462: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 14463: } 14464: case 0b100_111: //-(A7) 14465: XEiJ.mpuCycleCount += 6; 14466: return XEiJ.regRn[15] -= 2; 14467: case 0b101_000: //(d16,A0) 14468: case 0b101_001: //(d16,A1) 14469: case 0b101_010: //(d16,A2) 14470: case 0b101_011: //(d16,A3) 14471: case 0b101_100: //(d16,A4) 14472: case 0b101_101: //(d16,A5) 14473: case 0b101_110: //(d16,A6) 14474: case 0b101_111: //(d16,A7) 14475: XEiJ.mpuCycleCount += 8; 14476: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14477: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14478: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14479: } else { 14480: t = XEiJ.regPC; 14481: XEiJ.regPC = t + 2; 14482: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14483: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14484: } 14485: case 0b110_000: //(d8,A0,Rn.wl) 14486: case 0b110_001: //(d8,A1,Rn.wl) 14487: case 0b110_010: //(d8,A2,Rn.wl) 14488: case 0b110_011: //(d8,A3,Rn.wl) 14489: case 0b110_100: //(d8,A4,Rn.wl) 14490: case 0b110_101: //(d8,A5,Rn.wl) 14491: case 0b110_110: //(d8,A6,Rn.wl) 14492: case 0b110_111: //(d8,A7,Rn.wl) 14493: XEiJ.mpuCycleCount += 10; 14494: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14495: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14496: } else { 14497: w = XEiJ.regPC; 14498: XEiJ.regPC = w + 2; 14499: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14500: } 14501: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14502: + (byte) w //バイトディスプレースメント 14503: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14504: XEiJ.regRn[w >> 12])); //ロングインデックス 14505: case 0b111_000: //(xxx).W 14506: XEiJ.mpuCycleCount += 8; 14507: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14508: case 0b111_001: //(xxx).L 14509: XEiJ.mpuCycleCount += 12; 14510: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14511: } //switch 14512: XEiJ.mpuCycleCount += 34; 14513: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14514: throw M68kException.m6eSignal; 14515: } //efaMltByte 14516: 14517: //a = efaCntByte (ea) //| M WXZP | 14518: // 制御モードのロングオペランドの実効アドレスを求める 14519: // efaMemByteとの違いは(Ar)+と-(Ar)がないこと 14520: @SuppressWarnings ("fallthrough") public static int efaCntByte (int ea) throws M68kException { 14521: int t, w; 14522: switch (ea) { 14523: case 0b010_000: //(A0) 14524: if (XEiJ.EFA_SEPARATE_AR) { 14525: XEiJ.mpuCycleCount += 4; 14526: return XEiJ.regRn[ 8]; 14527: } 14528: //fallthrough 14529: case 0b010_001: //(A1) 14530: if (XEiJ.EFA_SEPARATE_AR) { 14531: XEiJ.mpuCycleCount += 4; 14532: return XEiJ.regRn[ 9]; 14533: } 14534: //fallthrough 14535: case 0b010_010: //(A2) 14536: if (XEiJ.EFA_SEPARATE_AR) { 14537: XEiJ.mpuCycleCount += 4; 14538: return XEiJ.regRn[10]; 14539: } 14540: //fallthrough 14541: case 0b010_011: //(A3) 14542: if (XEiJ.EFA_SEPARATE_AR) { 14543: XEiJ.mpuCycleCount += 4; 14544: return XEiJ.regRn[11]; 14545: } 14546: //fallthrough 14547: case 0b010_100: //(A4) 14548: if (XEiJ.EFA_SEPARATE_AR) { 14549: XEiJ.mpuCycleCount += 4; 14550: return XEiJ.regRn[12]; 14551: } 14552: //fallthrough 14553: case 0b010_101: //(A5) 14554: if (XEiJ.EFA_SEPARATE_AR) { 14555: XEiJ.mpuCycleCount += 4; 14556: return XEiJ.regRn[13]; 14557: } 14558: //fallthrough 14559: case 0b010_110: //(A6) 14560: if (XEiJ.EFA_SEPARATE_AR) { 14561: XEiJ.mpuCycleCount += 4; 14562: return XEiJ.regRn[14]; 14563: } 14564: //fallthrough 14565: case 0b010_111: //(A7) 14566: if (XEiJ.EFA_SEPARATE_AR) { 14567: XEiJ.mpuCycleCount += 4; 14568: return XEiJ.regRn[15]; 14569: } else { 14570: XEiJ.mpuCycleCount += 4; 14571: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14572: } 14573: case 0b101_000: //(d16,A0) 14574: case 0b101_001: //(d16,A1) 14575: case 0b101_010: //(d16,A2) 14576: case 0b101_011: //(d16,A3) 14577: case 0b101_100: //(d16,A4) 14578: case 0b101_101: //(d16,A5) 14579: case 0b101_110: //(d16,A6) 14580: case 0b101_111: //(d16,A7) 14581: XEiJ.mpuCycleCount += 8; 14582: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14583: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14584: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14585: } else { 14586: t = XEiJ.regPC; 14587: XEiJ.regPC = t + 2; 14588: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14589: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14590: } 14591: case 0b110_000: //(d8,A0,Rn.wl) 14592: case 0b110_001: //(d8,A1,Rn.wl) 14593: case 0b110_010: //(d8,A2,Rn.wl) 14594: case 0b110_011: //(d8,A3,Rn.wl) 14595: case 0b110_100: //(d8,A4,Rn.wl) 14596: case 0b110_101: //(d8,A5,Rn.wl) 14597: case 0b110_110: //(d8,A6,Rn.wl) 14598: case 0b110_111: //(d8,A7,Rn.wl) 14599: XEiJ.mpuCycleCount += 10; 14600: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14601: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14602: } else { 14603: w = XEiJ.regPC; 14604: XEiJ.regPC = w + 2; 14605: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14606: } 14607: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14608: + (byte) w //バイトディスプレースメント 14609: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14610: XEiJ.regRn[w >> 12])); //ロングインデックス 14611: case 0b111_000: //(xxx).W 14612: XEiJ.mpuCycleCount += 8; 14613: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14614: case 0b111_001: //(xxx).L 14615: XEiJ.mpuCycleCount += 12; 14616: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14617: case 0b111_010: //(d16,PC) 14618: XEiJ.mpuCycleCount += 8; 14619: t = XEiJ.regPC; 14620: XEiJ.regPC = t + 2; 14621: return (t //ベースレジスタ 14622: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14623: case 0b111_011: //(d8,PC,Rn.wl) 14624: XEiJ.mpuCycleCount += 10; 14625: t = XEiJ.regPC; 14626: XEiJ.regPC = t + 2; 14627: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14628: return (t //ベースレジスタ 14629: + (byte) w //バイトディスプレースメント 14630: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14631: XEiJ.regRn[w >> 12])); //ロングインデックス 14632: } //switch 14633: XEiJ.mpuCycleCount += 34; 14634: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14635: throw M68kException.m6eSignal; 14636: } //efaCntByte 14637: 14638: //a = efaAnyWord (ea) //| M+-WXZPI| 14639: // 任意のモードのワードオペランドの実効アドレスを求める 14640: // efaAnyByteとの違いは(Ar)+と-(Ar)がArを2変化させることと、(A7)+と-(A7)と#<data>の特別な動作がないこと 14641: @SuppressWarnings ("fallthrough") public static int efaAnyWord (int ea) throws M68kException { 14642: int t, w; 14643: switch (ea) { 14644: case 0b010_000: //(A0) 14645: if (XEiJ.EFA_SEPARATE_AR) { 14646: XEiJ.mpuCycleCount += 4; 14647: return XEiJ.regRn[ 8]; 14648: } 14649: //fallthrough 14650: case 0b010_001: //(A1) 14651: if (XEiJ.EFA_SEPARATE_AR) { 14652: XEiJ.mpuCycleCount += 4; 14653: return XEiJ.regRn[ 9]; 14654: } 14655: //fallthrough 14656: case 0b010_010: //(A2) 14657: if (XEiJ.EFA_SEPARATE_AR) { 14658: XEiJ.mpuCycleCount += 4; 14659: return XEiJ.regRn[10]; 14660: } 14661: //fallthrough 14662: case 0b010_011: //(A3) 14663: if (XEiJ.EFA_SEPARATE_AR) { 14664: XEiJ.mpuCycleCount += 4; 14665: return XEiJ.regRn[11]; 14666: } 14667: //fallthrough 14668: case 0b010_100: //(A4) 14669: if (XEiJ.EFA_SEPARATE_AR) { 14670: XEiJ.mpuCycleCount += 4; 14671: return XEiJ.regRn[12]; 14672: } 14673: //fallthrough 14674: case 0b010_101: //(A5) 14675: if (XEiJ.EFA_SEPARATE_AR) { 14676: XEiJ.mpuCycleCount += 4; 14677: return XEiJ.regRn[13]; 14678: } 14679: //fallthrough 14680: case 0b010_110: //(A6) 14681: if (XEiJ.EFA_SEPARATE_AR) { 14682: XEiJ.mpuCycleCount += 4; 14683: return XEiJ.regRn[14]; 14684: } 14685: //fallthrough 14686: case 0b010_111: //(A7) 14687: if (XEiJ.EFA_SEPARATE_AR) { 14688: XEiJ.mpuCycleCount += 4; 14689: return XEiJ.regRn[15]; 14690: } else { 14691: XEiJ.mpuCycleCount += 4; 14692: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14693: } 14694: case 0b011_000: //(A0)+ 14695: if (XEiJ.EFA_SEPARATE_AR) { 14696: XEiJ.mpuCycleCount += 4; 14697: return (XEiJ.regRn[ 8] += 2) - 2; 14698: } 14699: //fallthrough 14700: case 0b011_001: //(A1)+ 14701: if (XEiJ.EFA_SEPARATE_AR) { 14702: XEiJ.mpuCycleCount += 4; 14703: return (XEiJ.regRn[ 9] += 2) - 2; 14704: } 14705: //fallthrough 14706: case 0b011_010: //(A2)+ 14707: if (XEiJ.EFA_SEPARATE_AR) { 14708: XEiJ.mpuCycleCount += 4; 14709: return (XEiJ.regRn[10] += 2) - 2; 14710: } 14711: //fallthrough 14712: case 0b011_011: //(A3)+ 14713: if (XEiJ.EFA_SEPARATE_AR) { 14714: XEiJ.mpuCycleCount += 4; 14715: return (XEiJ.regRn[11] += 2) - 2; 14716: } 14717: //fallthrough 14718: case 0b011_100: //(A4)+ 14719: if (XEiJ.EFA_SEPARATE_AR) { 14720: XEiJ.mpuCycleCount += 4; 14721: return (XEiJ.regRn[12] += 2) - 2; 14722: } 14723: //fallthrough 14724: case 0b011_101: //(A5)+ 14725: if (XEiJ.EFA_SEPARATE_AR) { 14726: XEiJ.mpuCycleCount += 4; 14727: return (XEiJ.regRn[13] += 2) - 2; 14728: } 14729: //fallthrough 14730: case 0b011_110: //(A6)+ 14731: if (XEiJ.EFA_SEPARATE_AR) { 14732: XEiJ.mpuCycleCount += 4; 14733: return (XEiJ.regRn[14] += 2) - 2; 14734: } 14735: //fallthrough 14736: case 0b011_111: //(A7)+ 14737: if (XEiJ.EFA_SEPARATE_AR) { 14738: XEiJ.mpuCycleCount += 4; 14739: return (XEiJ.regRn[15] += 2) - 2; 14740: } else { 14741: XEiJ.mpuCycleCount += 4; 14742: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 14743: } 14744: case 0b100_000: //-(A0) 14745: if (XEiJ.EFA_SEPARATE_AR) { 14746: XEiJ.mpuCycleCount += 6; 14747: return XEiJ.regRn[ 8] -= 2; 14748: } 14749: //fallthrough 14750: case 0b100_001: //-(A1) 14751: if (XEiJ.EFA_SEPARATE_AR) { 14752: XEiJ.mpuCycleCount += 6; 14753: return XEiJ.regRn[ 9] -= 2; 14754: } 14755: //fallthrough 14756: case 0b100_010: //-(A2) 14757: if (XEiJ.EFA_SEPARATE_AR) { 14758: XEiJ.mpuCycleCount += 6; 14759: return XEiJ.regRn[10] -= 2; 14760: } 14761: //fallthrough 14762: case 0b100_011: //-(A3) 14763: if (XEiJ.EFA_SEPARATE_AR) { 14764: XEiJ.mpuCycleCount += 6; 14765: return XEiJ.regRn[11] -= 2; 14766: } 14767: //fallthrough 14768: case 0b100_100: //-(A4) 14769: if (XEiJ.EFA_SEPARATE_AR) { 14770: XEiJ.mpuCycleCount += 6; 14771: return XEiJ.regRn[12] -= 2; 14772: } 14773: //fallthrough 14774: case 0b100_101: //-(A5) 14775: if (XEiJ.EFA_SEPARATE_AR) { 14776: XEiJ.mpuCycleCount += 6; 14777: return XEiJ.regRn[13] -= 2; 14778: } 14779: //fallthrough 14780: case 0b100_110: //-(A6) 14781: if (XEiJ.EFA_SEPARATE_AR) { 14782: XEiJ.mpuCycleCount += 6; 14783: return XEiJ.regRn[14] -= 2; 14784: } 14785: //fallthrough 14786: case 0b100_111: //-(A7) 14787: if (XEiJ.EFA_SEPARATE_AR) { 14788: XEiJ.mpuCycleCount += 6; 14789: return XEiJ.regRn[15] -= 2; 14790: } else { 14791: XEiJ.mpuCycleCount += 6; 14792: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 14793: } 14794: case 0b101_000: //(d16,A0) 14795: case 0b101_001: //(d16,A1) 14796: case 0b101_010: //(d16,A2) 14797: case 0b101_011: //(d16,A3) 14798: case 0b101_100: //(d16,A4) 14799: case 0b101_101: //(d16,A5) 14800: case 0b101_110: //(d16,A6) 14801: case 0b101_111: //(d16,A7) 14802: XEiJ.mpuCycleCount += 8; 14803: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14804: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14805: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14806: } else { 14807: t = XEiJ.regPC; 14808: XEiJ.regPC = t + 2; 14809: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14810: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14811: } 14812: case 0b110_000: //(d8,A0,Rn.wl) 14813: case 0b110_001: //(d8,A1,Rn.wl) 14814: case 0b110_010: //(d8,A2,Rn.wl) 14815: case 0b110_011: //(d8,A3,Rn.wl) 14816: case 0b110_100: //(d8,A4,Rn.wl) 14817: case 0b110_101: //(d8,A5,Rn.wl) 14818: case 0b110_110: //(d8,A6,Rn.wl) 14819: case 0b110_111: //(d8,A7,Rn.wl) 14820: XEiJ.mpuCycleCount += 10; 14821: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14822: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14823: } else { 14824: w = XEiJ.regPC; 14825: XEiJ.regPC = w + 2; 14826: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14827: } 14828: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14829: + (byte) w //バイトディスプレースメント 14830: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14831: XEiJ.regRn[w >> 12])); //ロングインデックス 14832: case 0b111_000: //(xxx).W 14833: XEiJ.mpuCycleCount += 8; 14834: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14835: case 0b111_001: //(xxx).L 14836: XEiJ.mpuCycleCount += 12; 14837: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14838: case 0b111_010: //(d16,PC) 14839: XEiJ.mpuCycleCount += 8; 14840: t = XEiJ.regPC; 14841: XEiJ.regPC = t + 2; 14842: return (t //ベースレジスタ 14843: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14844: case 0b111_011: //(d8,PC,Rn.wl) 14845: XEiJ.mpuCycleCount += 10; 14846: t = XEiJ.regPC; 14847: XEiJ.regPC = t + 2; 14848: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14849: return (t //ベースレジスタ 14850: + (byte) w //バイトディスプレースメント 14851: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14852: XEiJ.regRn[w >> 12])); //ロングインデックス 14853: case 0b111_100: //#<data> 14854: XEiJ.mpuCycleCount += 4; 14855: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14856: return (XEiJ.regPC += 2) - 2; 14857: } else { 14858: t = XEiJ.regPC; 14859: XEiJ.regPC = t + 2; 14860: return t; 14861: } 14862: } //switch 14863: XEiJ.mpuCycleCount += 34; 14864: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14865: throw M68kException.m6eSignal; 14866: } //efaAnyWord 14867: 14868: //a = efaMemWord (ea) //| M+-WXZP | 14869: // メモリモードのワードオペランドの実効アドレスを求める 14870: // efaAnyWordとの違いは#<data>がないこと 14871: @SuppressWarnings ("fallthrough") public static int efaMemWord (int ea) throws M68kException { 14872: int t, w; 14873: switch (ea) { 14874: case 0b010_000: //(A0) 14875: if (XEiJ.EFA_SEPARATE_AR) { 14876: XEiJ.mpuCycleCount += 4; 14877: return XEiJ.regRn[ 8]; 14878: } 14879: //fallthrough 14880: case 0b010_001: //(A1) 14881: if (XEiJ.EFA_SEPARATE_AR) { 14882: XEiJ.mpuCycleCount += 4; 14883: return XEiJ.regRn[ 9]; 14884: } 14885: //fallthrough 14886: case 0b010_010: //(A2) 14887: if (XEiJ.EFA_SEPARATE_AR) { 14888: XEiJ.mpuCycleCount += 4; 14889: return XEiJ.regRn[10]; 14890: } 14891: //fallthrough 14892: case 0b010_011: //(A3) 14893: if (XEiJ.EFA_SEPARATE_AR) { 14894: XEiJ.mpuCycleCount += 4; 14895: return XEiJ.regRn[11]; 14896: } 14897: //fallthrough 14898: case 0b010_100: //(A4) 14899: if (XEiJ.EFA_SEPARATE_AR) { 14900: XEiJ.mpuCycleCount += 4; 14901: return XEiJ.regRn[12]; 14902: } 14903: //fallthrough 14904: case 0b010_101: //(A5) 14905: if (XEiJ.EFA_SEPARATE_AR) { 14906: XEiJ.mpuCycleCount += 4; 14907: return XEiJ.regRn[13]; 14908: } 14909: //fallthrough 14910: case 0b010_110: //(A6) 14911: if (XEiJ.EFA_SEPARATE_AR) { 14912: XEiJ.mpuCycleCount += 4; 14913: return XEiJ.regRn[14]; 14914: } 14915: //fallthrough 14916: case 0b010_111: //(A7) 14917: if (XEiJ.EFA_SEPARATE_AR) { 14918: XEiJ.mpuCycleCount += 4; 14919: return XEiJ.regRn[15]; 14920: } else { 14921: XEiJ.mpuCycleCount += 4; 14922: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14923: } 14924: case 0b011_000: //(A0)+ 14925: if (XEiJ.EFA_SEPARATE_AR) { 14926: XEiJ.mpuCycleCount += 4; 14927: return (XEiJ.regRn[ 8] += 2) - 2; 14928: } 14929: //fallthrough 14930: case 0b011_001: //(A1)+ 14931: if (XEiJ.EFA_SEPARATE_AR) { 14932: XEiJ.mpuCycleCount += 4; 14933: return (XEiJ.regRn[ 9] += 2) - 2; 14934: } 14935: //fallthrough 14936: case 0b011_010: //(A2)+ 14937: if (XEiJ.EFA_SEPARATE_AR) { 14938: XEiJ.mpuCycleCount += 4; 14939: return (XEiJ.regRn[10] += 2) - 2; 14940: } 14941: //fallthrough 14942: case 0b011_011: //(A3)+ 14943: if (XEiJ.EFA_SEPARATE_AR) { 14944: XEiJ.mpuCycleCount += 4; 14945: return (XEiJ.regRn[11] += 2) - 2; 14946: } 14947: //fallthrough 14948: case 0b011_100: //(A4)+ 14949: if (XEiJ.EFA_SEPARATE_AR) { 14950: XEiJ.mpuCycleCount += 4; 14951: return (XEiJ.regRn[12] += 2) - 2; 14952: } 14953: //fallthrough 14954: case 0b011_101: //(A5)+ 14955: if (XEiJ.EFA_SEPARATE_AR) { 14956: XEiJ.mpuCycleCount += 4; 14957: return (XEiJ.regRn[13] += 2) - 2; 14958: } 14959: //fallthrough 14960: case 0b011_110: //(A6)+ 14961: if (XEiJ.EFA_SEPARATE_AR) { 14962: XEiJ.mpuCycleCount += 4; 14963: return (XEiJ.regRn[14] += 2) - 2; 14964: } 14965: //fallthrough 14966: case 0b011_111: //(A7)+ 14967: if (XEiJ.EFA_SEPARATE_AR) { 14968: XEiJ.mpuCycleCount += 4; 14969: return (XEiJ.regRn[15] += 2) - 2; 14970: } else { 14971: XEiJ.mpuCycleCount += 4; 14972: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 14973: } 14974: case 0b100_000: //-(A0) 14975: if (XEiJ.EFA_SEPARATE_AR) { 14976: XEiJ.mpuCycleCount += 6; 14977: return XEiJ.regRn[ 8] -= 2; 14978: } 14979: //fallthrough 14980: case 0b100_001: //-(A1) 14981: if (XEiJ.EFA_SEPARATE_AR) { 14982: XEiJ.mpuCycleCount += 6; 14983: return XEiJ.regRn[ 9] -= 2; 14984: } 14985: //fallthrough 14986: case 0b100_010: //-(A2) 14987: if (XEiJ.EFA_SEPARATE_AR) { 14988: XEiJ.mpuCycleCount += 6; 14989: return XEiJ.regRn[10] -= 2; 14990: } 14991: //fallthrough 14992: case 0b100_011: //-(A3) 14993: if (XEiJ.EFA_SEPARATE_AR) { 14994: XEiJ.mpuCycleCount += 6; 14995: return XEiJ.regRn[11] -= 2; 14996: } 14997: //fallthrough 14998: case 0b100_100: //-(A4) 14999: if (XEiJ.EFA_SEPARATE_AR) { 15000: XEiJ.mpuCycleCount += 6; 15001: return XEiJ.regRn[12] -= 2; 15002: } 15003: //fallthrough 15004: case 0b100_101: //-(A5) 15005: if (XEiJ.EFA_SEPARATE_AR) { 15006: XEiJ.mpuCycleCount += 6; 15007: return XEiJ.regRn[13] -= 2; 15008: } 15009: //fallthrough 15010: case 0b100_110: //-(A6) 15011: if (XEiJ.EFA_SEPARATE_AR) { 15012: XEiJ.mpuCycleCount += 6; 15013: return XEiJ.regRn[14] -= 2; 15014: } 15015: //fallthrough 15016: case 0b100_111: //-(A7) 15017: if (XEiJ.EFA_SEPARATE_AR) { 15018: XEiJ.mpuCycleCount += 6; 15019: return XEiJ.regRn[15] -= 2; 15020: } else { 15021: XEiJ.mpuCycleCount += 6; 15022: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 15023: } 15024: case 0b101_000: //(d16,A0) 15025: case 0b101_001: //(d16,A1) 15026: case 0b101_010: //(d16,A2) 15027: case 0b101_011: //(d16,A3) 15028: case 0b101_100: //(d16,A4) 15029: case 0b101_101: //(d16,A5) 15030: case 0b101_110: //(d16,A6) 15031: case 0b101_111: //(d16,A7) 15032: XEiJ.mpuCycleCount += 8; 15033: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15034: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15035: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15036: } else { 15037: t = XEiJ.regPC; 15038: XEiJ.regPC = t + 2; 15039: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15040: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15041: } 15042: case 0b110_000: //(d8,A0,Rn.wl) 15043: case 0b110_001: //(d8,A1,Rn.wl) 15044: case 0b110_010: //(d8,A2,Rn.wl) 15045: case 0b110_011: //(d8,A3,Rn.wl) 15046: case 0b110_100: //(d8,A4,Rn.wl) 15047: case 0b110_101: //(d8,A5,Rn.wl) 15048: case 0b110_110: //(d8,A6,Rn.wl) 15049: case 0b110_111: //(d8,A7,Rn.wl) 15050: XEiJ.mpuCycleCount += 10; 15051: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15052: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15053: } else { 15054: w = XEiJ.regPC; 15055: XEiJ.regPC = w + 2; 15056: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15057: } 15058: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15059: + (byte) w //バイトディスプレースメント 15060: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15061: XEiJ.regRn[w >> 12])); //ロングインデックス 15062: case 0b111_000: //(xxx).W 15063: XEiJ.mpuCycleCount += 8; 15064: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15065: case 0b111_001: //(xxx).L 15066: XEiJ.mpuCycleCount += 12; 15067: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15068: case 0b111_010: //(d16,PC) 15069: XEiJ.mpuCycleCount += 8; 15070: t = XEiJ.regPC; 15071: XEiJ.regPC = t + 2; 15072: return (t //ベースレジスタ 15073: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15074: case 0b111_011: //(d8,PC,Rn.wl) 15075: XEiJ.mpuCycleCount += 10; 15076: t = XEiJ.regPC; 15077: XEiJ.regPC = t + 2; 15078: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15079: return (t //ベースレジスタ 15080: + (byte) w //バイトディスプレースメント 15081: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15082: XEiJ.regRn[w >> 12])); //ロングインデックス 15083: } //switch 15084: XEiJ.mpuCycleCount += 34; 15085: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15086: throw M68kException.m6eSignal; 15087: } //efaMemWord 15088: 15089: //a = efaMltWord (ea) //| M+-WXZ | 15090: // メモリ可変モードのワードオペランドの実効アドレスを求める 15091: // efaMemWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15092: @SuppressWarnings ("fallthrough") public static int efaMltWord (int ea) throws M68kException { 15093: int t, w; 15094: switch (ea) { 15095: case 0b010_000: //(A0) 15096: if (XEiJ.EFA_SEPARATE_AR) { 15097: XEiJ.mpuCycleCount += 4; 15098: return XEiJ.regRn[ 8]; 15099: } 15100: //fallthrough 15101: case 0b010_001: //(A1) 15102: if (XEiJ.EFA_SEPARATE_AR) { 15103: XEiJ.mpuCycleCount += 4; 15104: return XEiJ.regRn[ 9]; 15105: } 15106: //fallthrough 15107: case 0b010_010: //(A2) 15108: if (XEiJ.EFA_SEPARATE_AR) { 15109: XEiJ.mpuCycleCount += 4; 15110: return XEiJ.regRn[10]; 15111: } 15112: //fallthrough 15113: case 0b010_011: //(A3) 15114: if (XEiJ.EFA_SEPARATE_AR) { 15115: XEiJ.mpuCycleCount += 4; 15116: return XEiJ.regRn[11]; 15117: } 15118: //fallthrough 15119: case 0b010_100: //(A4) 15120: if (XEiJ.EFA_SEPARATE_AR) { 15121: XEiJ.mpuCycleCount += 4; 15122: return XEiJ.regRn[12]; 15123: } 15124: //fallthrough 15125: case 0b010_101: //(A5) 15126: if (XEiJ.EFA_SEPARATE_AR) { 15127: XEiJ.mpuCycleCount += 4; 15128: return XEiJ.regRn[13]; 15129: } 15130: //fallthrough 15131: case 0b010_110: //(A6) 15132: if (XEiJ.EFA_SEPARATE_AR) { 15133: XEiJ.mpuCycleCount += 4; 15134: return XEiJ.regRn[14]; 15135: } 15136: //fallthrough 15137: case 0b010_111: //(A7) 15138: if (XEiJ.EFA_SEPARATE_AR) { 15139: XEiJ.mpuCycleCount += 4; 15140: return XEiJ.regRn[15]; 15141: } else { 15142: XEiJ.mpuCycleCount += 4; 15143: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15144: } 15145: case 0b011_000: //(A0)+ 15146: if (XEiJ.EFA_SEPARATE_AR) { 15147: XEiJ.mpuCycleCount += 4; 15148: return (XEiJ.regRn[ 8] += 2) - 2; 15149: } 15150: //fallthrough 15151: case 0b011_001: //(A1)+ 15152: if (XEiJ.EFA_SEPARATE_AR) { 15153: XEiJ.mpuCycleCount += 4; 15154: return (XEiJ.regRn[ 9] += 2) - 2; 15155: } 15156: //fallthrough 15157: case 0b011_010: //(A2)+ 15158: if (XEiJ.EFA_SEPARATE_AR) { 15159: XEiJ.mpuCycleCount += 4; 15160: return (XEiJ.regRn[10] += 2) - 2; 15161: } 15162: //fallthrough 15163: case 0b011_011: //(A3)+ 15164: if (XEiJ.EFA_SEPARATE_AR) { 15165: XEiJ.mpuCycleCount += 4; 15166: return (XEiJ.regRn[11] += 2) - 2; 15167: } 15168: //fallthrough 15169: case 0b011_100: //(A4)+ 15170: if (XEiJ.EFA_SEPARATE_AR) { 15171: XEiJ.mpuCycleCount += 4; 15172: return (XEiJ.regRn[12] += 2) - 2; 15173: } 15174: //fallthrough 15175: case 0b011_101: //(A5)+ 15176: if (XEiJ.EFA_SEPARATE_AR) { 15177: XEiJ.mpuCycleCount += 4; 15178: return (XEiJ.regRn[13] += 2) - 2; 15179: } 15180: //fallthrough 15181: case 0b011_110: //(A6)+ 15182: if (XEiJ.EFA_SEPARATE_AR) { 15183: XEiJ.mpuCycleCount += 4; 15184: return (XEiJ.regRn[14] += 2) - 2; 15185: } 15186: //fallthrough 15187: case 0b011_111: //(A7)+ 15188: if (XEiJ.EFA_SEPARATE_AR) { 15189: XEiJ.mpuCycleCount += 4; 15190: return (XEiJ.regRn[15] += 2) - 2; 15191: } else { 15192: XEiJ.mpuCycleCount += 4; 15193: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 15194: } 15195: case 0b100_000: //-(A0) 15196: if (XEiJ.EFA_SEPARATE_AR) { 15197: XEiJ.mpuCycleCount += 6; 15198: return XEiJ.regRn[ 8] -= 2; 15199: } 15200: //fallthrough 15201: case 0b100_001: //-(A1) 15202: if (XEiJ.EFA_SEPARATE_AR) { 15203: XEiJ.mpuCycleCount += 6; 15204: return XEiJ.regRn[ 9] -= 2; 15205: } 15206: //fallthrough 15207: case 0b100_010: //-(A2) 15208: if (XEiJ.EFA_SEPARATE_AR) { 15209: XEiJ.mpuCycleCount += 6; 15210: return XEiJ.regRn[10] -= 2; 15211: } 15212: //fallthrough 15213: case 0b100_011: //-(A3) 15214: if (XEiJ.EFA_SEPARATE_AR) { 15215: XEiJ.mpuCycleCount += 6; 15216: return XEiJ.regRn[11] -= 2; 15217: } 15218: //fallthrough 15219: case 0b100_100: //-(A4) 15220: if (XEiJ.EFA_SEPARATE_AR) { 15221: XEiJ.mpuCycleCount += 6; 15222: return XEiJ.regRn[12] -= 2; 15223: } 15224: //fallthrough 15225: case 0b100_101: //-(A5) 15226: if (XEiJ.EFA_SEPARATE_AR) { 15227: XEiJ.mpuCycleCount += 6; 15228: return XEiJ.regRn[13] -= 2; 15229: } 15230: //fallthrough 15231: case 0b100_110: //-(A6) 15232: if (XEiJ.EFA_SEPARATE_AR) { 15233: XEiJ.mpuCycleCount += 6; 15234: return XEiJ.regRn[14] -= 2; 15235: } 15236: //fallthrough 15237: case 0b100_111: //-(A7) 15238: if (XEiJ.EFA_SEPARATE_AR) { 15239: XEiJ.mpuCycleCount += 6; 15240: return XEiJ.regRn[15] -= 2; 15241: } else { 15242: XEiJ.mpuCycleCount += 6; 15243: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 15244: } 15245: case 0b101_000: //(d16,A0) 15246: case 0b101_001: //(d16,A1) 15247: case 0b101_010: //(d16,A2) 15248: case 0b101_011: //(d16,A3) 15249: case 0b101_100: //(d16,A4) 15250: case 0b101_101: //(d16,A5) 15251: case 0b101_110: //(d16,A6) 15252: case 0b101_111: //(d16,A7) 15253: XEiJ.mpuCycleCount += 8; 15254: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15255: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15256: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15257: } else { 15258: t = XEiJ.regPC; 15259: XEiJ.regPC = t + 2; 15260: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15261: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15262: } 15263: case 0b110_000: //(d8,A0,Rn.wl) 15264: case 0b110_001: //(d8,A1,Rn.wl) 15265: case 0b110_010: //(d8,A2,Rn.wl) 15266: case 0b110_011: //(d8,A3,Rn.wl) 15267: case 0b110_100: //(d8,A4,Rn.wl) 15268: case 0b110_101: //(d8,A5,Rn.wl) 15269: case 0b110_110: //(d8,A6,Rn.wl) 15270: case 0b110_111: //(d8,A7,Rn.wl) 15271: XEiJ.mpuCycleCount += 10; 15272: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15273: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15274: } else { 15275: w = XEiJ.regPC; 15276: XEiJ.regPC = w + 2; 15277: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15278: } 15279: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15280: + (byte) w //バイトディスプレースメント 15281: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15282: XEiJ.regRn[w >> 12])); //ロングインデックス 15283: case 0b111_000: //(xxx).W 15284: XEiJ.mpuCycleCount += 8; 15285: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15286: case 0b111_001: //(xxx).L 15287: XEiJ.mpuCycleCount += 12; 15288: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15289: } //switch 15290: XEiJ.mpuCycleCount += 34; 15291: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15292: throw M68kException.m6eSignal; 15293: } //efaMltWord 15294: 15295: //a = efaCntWord (ea) //| M WXZP | 15296: // 制御モードのワードオペランドの実効アドレスを求める 15297: // efaMemWordとの違いは(Ar)+と-(Ar)がないこと 15298: @SuppressWarnings ("fallthrough") public static int efaCntWord (int ea) throws M68kException { 15299: int t, w; 15300: switch (ea) { 15301: case 0b010_000: //(A0) 15302: if (XEiJ.EFA_SEPARATE_AR) { 15303: XEiJ.mpuCycleCount += 4; 15304: return XEiJ.regRn[ 8]; 15305: } 15306: //fallthrough 15307: case 0b010_001: //(A1) 15308: if (XEiJ.EFA_SEPARATE_AR) { 15309: XEiJ.mpuCycleCount += 4; 15310: return XEiJ.regRn[ 9]; 15311: } 15312: //fallthrough 15313: case 0b010_010: //(A2) 15314: if (XEiJ.EFA_SEPARATE_AR) { 15315: XEiJ.mpuCycleCount += 4; 15316: return XEiJ.regRn[10]; 15317: } 15318: //fallthrough 15319: case 0b010_011: //(A3) 15320: if (XEiJ.EFA_SEPARATE_AR) { 15321: XEiJ.mpuCycleCount += 4; 15322: return XEiJ.regRn[11]; 15323: } 15324: //fallthrough 15325: case 0b010_100: //(A4) 15326: if (XEiJ.EFA_SEPARATE_AR) { 15327: XEiJ.mpuCycleCount += 4; 15328: return XEiJ.regRn[12]; 15329: } 15330: //fallthrough 15331: case 0b010_101: //(A5) 15332: if (XEiJ.EFA_SEPARATE_AR) { 15333: XEiJ.mpuCycleCount += 4; 15334: return XEiJ.regRn[13]; 15335: } 15336: //fallthrough 15337: case 0b010_110: //(A6) 15338: if (XEiJ.EFA_SEPARATE_AR) { 15339: XEiJ.mpuCycleCount += 4; 15340: return XEiJ.regRn[14]; 15341: } 15342: //fallthrough 15343: case 0b010_111: //(A7) 15344: if (XEiJ.EFA_SEPARATE_AR) { 15345: XEiJ.mpuCycleCount += 4; 15346: return XEiJ.regRn[15]; 15347: } else { 15348: XEiJ.mpuCycleCount += 4; 15349: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15350: } 15351: case 0b101_000: //(d16,A0) 15352: case 0b101_001: //(d16,A1) 15353: case 0b101_010: //(d16,A2) 15354: case 0b101_011: //(d16,A3) 15355: case 0b101_100: //(d16,A4) 15356: case 0b101_101: //(d16,A5) 15357: case 0b101_110: //(d16,A6) 15358: case 0b101_111: //(d16,A7) 15359: XEiJ.mpuCycleCount += 8; 15360: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15361: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15362: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15363: } else { 15364: t = XEiJ.regPC; 15365: XEiJ.regPC = t + 2; 15366: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15367: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15368: } 15369: case 0b110_000: //(d8,A0,Rn.wl) 15370: case 0b110_001: //(d8,A1,Rn.wl) 15371: case 0b110_010: //(d8,A2,Rn.wl) 15372: case 0b110_011: //(d8,A3,Rn.wl) 15373: case 0b110_100: //(d8,A4,Rn.wl) 15374: case 0b110_101: //(d8,A5,Rn.wl) 15375: case 0b110_110: //(d8,A6,Rn.wl) 15376: case 0b110_111: //(d8,A7,Rn.wl) 15377: XEiJ.mpuCycleCount += 10; 15378: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15379: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15380: } else { 15381: w = XEiJ.regPC; 15382: XEiJ.regPC = w + 2; 15383: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15384: } 15385: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15386: + (byte) w //バイトディスプレースメント 15387: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15388: XEiJ.regRn[w >> 12])); //ロングインデックス 15389: case 0b111_000: //(xxx).W 15390: XEiJ.mpuCycleCount += 8; 15391: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15392: case 0b111_001: //(xxx).L 15393: XEiJ.mpuCycleCount += 12; 15394: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15395: case 0b111_010: //(d16,PC) 15396: XEiJ.mpuCycleCount += 8; 15397: t = XEiJ.regPC; 15398: XEiJ.regPC = t + 2; 15399: return (t //ベースレジスタ 15400: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15401: case 0b111_011: //(d8,PC,Rn.wl) 15402: XEiJ.mpuCycleCount += 10; 15403: t = XEiJ.regPC; 15404: XEiJ.regPC = t + 2; 15405: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15406: return (t //ベースレジスタ 15407: + (byte) w //バイトディスプレースメント 15408: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15409: XEiJ.regRn[w >> 12])); //ロングインデックス 15410: } //switch 15411: XEiJ.mpuCycleCount += 34; 15412: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15413: throw M68kException.m6eSignal; 15414: } //efaCntWord 15415: 15416: //a = efaCltWord (ea) //| M WXZ | 15417: // 制御可変モードのワードオペランドの実効アドレスを求める 15418: // efaCntWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15419: @SuppressWarnings ("fallthrough") public static int efaCltWord (int ea) throws M68kException { 15420: int t, w; 15421: switch (ea) { 15422: case 0b010_000: //(A0) 15423: if (XEiJ.EFA_SEPARATE_AR) { 15424: XEiJ.mpuCycleCount += 4; 15425: return XEiJ.regRn[ 8]; 15426: } 15427: //fallthrough 15428: case 0b010_001: //(A1) 15429: if (XEiJ.EFA_SEPARATE_AR) { 15430: XEiJ.mpuCycleCount += 4; 15431: return XEiJ.regRn[ 9]; 15432: } 15433: //fallthrough 15434: case 0b010_010: //(A2) 15435: if (XEiJ.EFA_SEPARATE_AR) { 15436: XEiJ.mpuCycleCount += 4; 15437: return XEiJ.regRn[10]; 15438: } 15439: //fallthrough 15440: case 0b010_011: //(A3) 15441: if (XEiJ.EFA_SEPARATE_AR) { 15442: XEiJ.mpuCycleCount += 4; 15443: return XEiJ.regRn[11]; 15444: } 15445: //fallthrough 15446: case 0b010_100: //(A4) 15447: if (XEiJ.EFA_SEPARATE_AR) { 15448: XEiJ.mpuCycleCount += 4; 15449: return XEiJ.regRn[12]; 15450: } 15451: //fallthrough 15452: case 0b010_101: //(A5) 15453: if (XEiJ.EFA_SEPARATE_AR) { 15454: XEiJ.mpuCycleCount += 4; 15455: return XEiJ.regRn[13]; 15456: } 15457: //fallthrough 15458: case 0b010_110: //(A6) 15459: if (XEiJ.EFA_SEPARATE_AR) { 15460: XEiJ.mpuCycleCount += 4; 15461: return XEiJ.regRn[14]; 15462: } 15463: //fallthrough 15464: case 0b010_111: //(A7) 15465: if (XEiJ.EFA_SEPARATE_AR) { 15466: XEiJ.mpuCycleCount += 4; 15467: return XEiJ.regRn[15]; 15468: } else { 15469: XEiJ.mpuCycleCount += 4; 15470: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15471: } 15472: case 0b101_000: //(d16,A0) 15473: case 0b101_001: //(d16,A1) 15474: case 0b101_010: //(d16,A2) 15475: case 0b101_011: //(d16,A3) 15476: case 0b101_100: //(d16,A4) 15477: case 0b101_101: //(d16,A5) 15478: case 0b101_110: //(d16,A6) 15479: case 0b101_111: //(d16,A7) 15480: XEiJ.mpuCycleCount += 8; 15481: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15482: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15483: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15484: } else { 15485: t = XEiJ.regPC; 15486: XEiJ.regPC = t + 2; 15487: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15488: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15489: } 15490: case 0b110_000: //(d8,A0,Rn.wl) 15491: case 0b110_001: //(d8,A1,Rn.wl) 15492: case 0b110_010: //(d8,A2,Rn.wl) 15493: case 0b110_011: //(d8,A3,Rn.wl) 15494: case 0b110_100: //(d8,A4,Rn.wl) 15495: case 0b110_101: //(d8,A5,Rn.wl) 15496: case 0b110_110: //(d8,A6,Rn.wl) 15497: case 0b110_111: //(d8,A7,Rn.wl) 15498: XEiJ.mpuCycleCount += 10; 15499: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15500: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15501: } else { 15502: w = XEiJ.regPC; 15503: XEiJ.regPC = w + 2; 15504: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15505: } 15506: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15507: + (byte) w //バイトディスプレースメント 15508: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15509: XEiJ.regRn[w >> 12])); //ロングインデックス 15510: case 0b111_000: //(xxx).W 15511: XEiJ.mpuCycleCount += 8; 15512: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15513: case 0b111_001: //(xxx).L 15514: XEiJ.mpuCycleCount += 12; 15515: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15516: } //switch 15517: XEiJ.mpuCycleCount += 34; 15518: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15519: throw M68kException.m6eSignal; 15520: } //efaCltWord 15521: 15522: //a = efaAnyLong (ea) //| M+-WXZPI| 15523: // 任意のモードのロングオペランドの実効アドレスを求める 15524: // efaAnyWordとの違いは(Ar)+と-(Ar)がArを4変化させることと、#<data>がPCを4変化させることと、 15525: // オペランドのアクセスが1ワード増える分の4サイクルが追加されていること 15526: @SuppressWarnings ("fallthrough") public static int efaAnyLong (int ea) throws M68kException { 15527: int t, w; 15528: switch (ea) { 15529: case 0b010_000: //(A0) 15530: if (XEiJ.EFA_SEPARATE_AR) { 15531: XEiJ.mpuCycleCount += 8; 15532: return XEiJ.regRn[ 8]; 15533: } 15534: //fallthrough 15535: case 0b010_001: //(A1) 15536: if (XEiJ.EFA_SEPARATE_AR) { 15537: XEiJ.mpuCycleCount += 8; 15538: return XEiJ.regRn[ 9]; 15539: } 15540: //fallthrough 15541: case 0b010_010: //(A2) 15542: if (XEiJ.EFA_SEPARATE_AR) { 15543: XEiJ.mpuCycleCount += 8; 15544: return XEiJ.regRn[10]; 15545: } 15546: //fallthrough 15547: case 0b010_011: //(A3) 15548: if (XEiJ.EFA_SEPARATE_AR) { 15549: XEiJ.mpuCycleCount += 8; 15550: return XEiJ.regRn[11]; 15551: } 15552: //fallthrough 15553: case 0b010_100: //(A4) 15554: if (XEiJ.EFA_SEPARATE_AR) { 15555: XEiJ.mpuCycleCount += 8; 15556: return XEiJ.regRn[12]; 15557: } 15558: //fallthrough 15559: case 0b010_101: //(A5) 15560: if (XEiJ.EFA_SEPARATE_AR) { 15561: XEiJ.mpuCycleCount += 8; 15562: return XEiJ.regRn[13]; 15563: } 15564: //fallthrough 15565: case 0b010_110: //(A6) 15566: if (XEiJ.EFA_SEPARATE_AR) { 15567: XEiJ.mpuCycleCount += 8; 15568: return XEiJ.regRn[14]; 15569: } 15570: //fallthrough 15571: case 0b010_111: //(A7) 15572: if (XEiJ.EFA_SEPARATE_AR) { 15573: XEiJ.mpuCycleCount += 8; 15574: return XEiJ.regRn[15]; 15575: } else { 15576: XEiJ.mpuCycleCount += 8; 15577: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15578: } 15579: case 0b011_000: //(A0)+ 15580: if (XEiJ.EFA_SEPARATE_AR) { 15581: XEiJ.mpuCycleCount += 8; 15582: return (XEiJ.regRn[ 8] += 4) - 4; 15583: } 15584: //fallthrough 15585: case 0b011_001: //(A1)+ 15586: if (XEiJ.EFA_SEPARATE_AR) { 15587: XEiJ.mpuCycleCount += 8; 15588: return (XEiJ.regRn[ 9] += 4) - 4; 15589: } 15590: //fallthrough 15591: case 0b011_010: //(A2)+ 15592: if (XEiJ.EFA_SEPARATE_AR) { 15593: XEiJ.mpuCycleCount += 8; 15594: return (XEiJ.regRn[10] += 4) - 4; 15595: } 15596: //fallthrough 15597: case 0b011_011: //(A3)+ 15598: if (XEiJ.EFA_SEPARATE_AR) { 15599: XEiJ.mpuCycleCount += 8; 15600: return (XEiJ.regRn[11] += 4) - 4; 15601: } 15602: //fallthrough 15603: case 0b011_100: //(A4)+ 15604: if (XEiJ.EFA_SEPARATE_AR) { 15605: XEiJ.mpuCycleCount += 8; 15606: return (XEiJ.regRn[12] += 4) - 4; 15607: } 15608: //fallthrough 15609: case 0b011_101: //(A5)+ 15610: if (XEiJ.EFA_SEPARATE_AR) { 15611: XEiJ.mpuCycleCount += 8; 15612: return (XEiJ.regRn[13] += 4) - 4; 15613: } 15614: //fallthrough 15615: case 0b011_110: //(A6)+ 15616: if (XEiJ.EFA_SEPARATE_AR) { 15617: XEiJ.mpuCycleCount += 8; 15618: return (XEiJ.regRn[14] += 4) - 4; 15619: } 15620: //fallthrough 15621: case 0b011_111: //(A7)+ 15622: if (XEiJ.EFA_SEPARATE_AR) { 15623: XEiJ.mpuCycleCount += 8; 15624: return (XEiJ.regRn[15] += 4) - 4; 15625: } else { 15626: XEiJ.mpuCycleCount += 8; 15627: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 15628: } 15629: case 0b100_000: //-(A0) 15630: if (XEiJ.EFA_SEPARATE_AR) { 15631: XEiJ.mpuCycleCount += 10; 15632: return XEiJ.regRn[ 8] -= 4; 15633: } 15634: //fallthrough 15635: case 0b100_001: //-(A1) 15636: if (XEiJ.EFA_SEPARATE_AR) { 15637: XEiJ.mpuCycleCount += 10; 15638: return XEiJ.regRn[ 9] -= 4; 15639: } 15640: //fallthrough 15641: case 0b100_010: //-(A2) 15642: if (XEiJ.EFA_SEPARATE_AR) { 15643: XEiJ.mpuCycleCount += 10; 15644: return XEiJ.regRn[10] -= 4; 15645: } 15646: //fallthrough 15647: case 0b100_011: //-(A3) 15648: if (XEiJ.EFA_SEPARATE_AR) { 15649: XEiJ.mpuCycleCount += 10; 15650: return XEiJ.regRn[11] -= 4; 15651: } 15652: //fallthrough 15653: case 0b100_100: //-(A4) 15654: if (XEiJ.EFA_SEPARATE_AR) { 15655: XEiJ.mpuCycleCount += 10; 15656: return XEiJ.regRn[12] -= 4; 15657: } 15658: //fallthrough 15659: case 0b100_101: //-(A5) 15660: if (XEiJ.EFA_SEPARATE_AR) { 15661: XEiJ.mpuCycleCount += 10; 15662: return XEiJ.regRn[13] -= 4; 15663: } 15664: //fallthrough 15665: case 0b100_110: //-(A6) 15666: if (XEiJ.EFA_SEPARATE_AR) { 15667: XEiJ.mpuCycleCount += 10; 15668: return XEiJ.regRn[14] -= 4; 15669: } 15670: //fallthrough 15671: case 0b100_111: //-(A7) 15672: if (XEiJ.EFA_SEPARATE_AR) { 15673: XEiJ.mpuCycleCount += 10; 15674: return XEiJ.regRn[15] -= 4; 15675: } else { 15676: XEiJ.mpuCycleCount += 10; 15677: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 15678: } 15679: case 0b101_000: //(d16,A0) 15680: case 0b101_001: //(d16,A1) 15681: case 0b101_010: //(d16,A2) 15682: case 0b101_011: //(d16,A3) 15683: case 0b101_100: //(d16,A4) 15684: case 0b101_101: //(d16,A5) 15685: case 0b101_110: //(d16,A6) 15686: case 0b101_111: //(d16,A7) 15687: XEiJ.mpuCycleCount += 12; 15688: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15689: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15690: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15691: } else { 15692: t = XEiJ.regPC; 15693: XEiJ.regPC = t + 2; 15694: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15695: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15696: } 15697: case 0b110_000: //(d8,A0,Rn.wl) 15698: case 0b110_001: //(d8,A1,Rn.wl) 15699: case 0b110_010: //(d8,A2,Rn.wl) 15700: case 0b110_011: //(d8,A3,Rn.wl) 15701: case 0b110_100: //(d8,A4,Rn.wl) 15702: case 0b110_101: //(d8,A5,Rn.wl) 15703: case 0b110_110: //(d8,A6,Rn.wl) 15704: case 0b110_111: //(d8,A7,Rn.wl) 15705: XEiJ.mpuCycleCount += 14; 15706: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15707: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15708: } else { 15709: w = XEiJ.regPC; 15710: XEiJ.regPC = w + 2; 15711: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15712: } 15713: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15714: + (byte) w //バイトディスプレースメント 15715: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15716: XEiJ.regRn[w >> 12])); //ロングインデックス 15717: case 0b111_000: //(xxx).W 15718: XEiJ.mpuCycleCount += 12; 15719: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15720: case 0b111_001: //(xxx).L 15721: XEiJ.mpuCycleCount += 16; 15722: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15723: case 0b111_010: //(d16,PC) 15724: XEiJ.mpuCycleCount += 12; 15725: t = XEiJ.regPC; 15726: XEiJ.regPC = t + 2; 15727: return (t //ベースレジスタ 15728: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15729: case 0b111_011: //(d8,PC,Rn.wl) 15730: XEiJ.mpuCycleCount += 14; 15731: t = XEiJ.regPC; 15732: XEiJ.regPC = t + 2; 15733: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15734: return (t //ベースレジスタ 15735: + (byte) w //バイトディスプレースメント 15736: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15737: XEiJ.regRn[w >> 12])); //ロングインデックス 15738: case 0b111_100: //#<data> 15739: XEiJ.mpuCycleCount += 8; 15740: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15741: return (XEiJ.regPC += 4) - 4; 15742: } else { 15743: t = XEiJ.regPC; 15744: XEiJ.regPC = t + 4; 15745: return t; 15746: } 15747: } //switch 15748: XEiJ.mpuCycleCount += 34; 15749: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15750: throw M68kException.m6eSignal; 15751: } //efaAnyLong 15752: 15753: //a = efaMemLong (ea) //| M+-WXZP | 15754: // メモリモードのロングオペランドの実効アドレスを求める 15755: // efaAnyLongとの違いは#<data>がないこと 15756: @SuppressWarnings ("fallthrough") public static int efaMemLong (int ea) throws M68kException { 15757: int t, w; 15758: switch (ea) { 15759: case 0b010_000: //(A0) 15760: if (XEiJ.EFA_SEPARATE_AR) { 15761: XEiJ.mpuCycleCount += 8; 15762: return XEiJ.regRn[ 8]; 15763: } 15764: //fallthrough 15765: case 0b010_001: //(A1) 15766: if (XEiJ.EFA_SEPARATE_AR) { 15767: XEiJ.mpuCycleCount += 8; 15768: return XEiJ.regRn[ 9]; 15769: } 15770: //fallthrough 15771: case 0b010_010: //(A2) 15772: if (XEiJ.EFA_SEPARATE_AR) { 15773: XEiJ.mpuCycleCount += 8; 15774: return XEiJ.regRn[10]; 15775: } 15776: //fallthrough 15777: case 0b010_011: //(A3) 15778: if (XEiJ.EFA_SEPARATE_AR) { 15779: XEiJ.mpuCycleCount += 8; 15780: return XEiJ.regRn[11]; 15781: } 15782: //fallthrough 15783: case 0b010_100: //(A4) 15784: if (XEiJ.EFA_SEPARATE_AR) { 15785: XEiJ.mpuCycleCount += 8; 15786: return XEiJ.regRn[12]; 15787: } 15788: //fallthrough 15789: case 0b010_101: //(A5) 15790: if (XEiJ.EFA_SEPARATE_AR) { 15791: XEiJ.mpuCycleCount += 8; 15792: return XEiJ.regRn[13]; 15793: } 15794: //fallthrough 15795: case 0b010_110: //(A6) 15796: if (XEiJ.EFA_SEPARATE_AR) { 15797: XEiJ.mpuCycleCount += 8; 15798: return XEiJ.regRn[14]; 15799: } 15800: //fallthrough 15801: case 0b010_111: //(A7) 15802: if (XEiJ.EFA_SEPARATE_AR) { 15803: XEiJ.mpuCycleCount += 8; 15804: return XEiJ.regRn[15]; 15805: } else { 15806: XEiJ.mpuCycleCount += 8; 15807: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15808: } 15809: case 0b011_000: //(A0)+ 15810: if (XEiJ.EFA_SEPARATE_AR) { 15811: XEiJ.mpuCycleCount += 8; 15812: return (XEiJ.regRn[ 8] += 4) - 4; 15813: } 15814: //fallthrough 15815: case 0b011_001: //(A1)+ 15816: if (XEiJ.EFA_SEPARATE_AR) { 15817: XEiJ.mpuCycleCount += 8; 15818: return (XEiJ.regRn[ 9] += 4) - 4; 15819: } 15820: //fallthrough 15821: case 0b011_010: //(A2)+ 15822: if (XEiJ.EFA_SEPARATE_AR) { 15823: XEiJ.mpuCycleCount += 8; 15824: return (XEiJ.regRn[10] += 4) - 4; 15825: } 15826: //fallthrough 15827: case 0b011_011: //(A3)+ 15828: if (XEiJ.EFA_SEPARATE_AR) { 15829: XEiJ.mpuCycleCount += 8; 15830: return (XEiJ.regRn[11] += 4) - 4; 15831: } 15832: //fallthrough 15833: case 0b011_100: //(A4)+ 15834: if (XEiJ.EFA_SEPARATE_AR) { 15835: XEiJ.mpuCycleCount += 8; 15836: return (XEiJ.regRn[12] += 4) - 4; 15837: } 15838: //fallthrough 15839: case 0b011_101: //(A5)+ 15840: if (XEiJ.EFA_SEPARATE_AR) { 15841: XEiJ.mpuCycleCount += 8; 15842: return (XEiJ.regRn[13] += 4) - 4; 15843: } 15844: //fallthrough 15845: case 0b011_110: //(A6)+ 15846: if (XEiJ.EFA_SEPARATE_AR) { 15847: XEiJ.mpuCycleCount += 8; 15848: return (XEiJ.regRn[14] += 4) - 4; 15849: } 15850: //fallthrough 15851: case 0b011_111: //(A7)+ 15852: if (XEiJ.EFA_SEPARATE_AR) { 15853: XEiJ.mpuCycleCount += 8; 15854: return (XEiJ.regRn[15] += 4) - 4; 15855: } else { 15856: XEiJ.mpuCycleCount += 8; 15857: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 15858: } 15859: case 0b100_000: //-(A0) 15860: if (XEiJ.EFA_SEPARATE_AR) { 15861: XEiJ.mpuCycleCount += 10; 15862: return XEiJ.regRn[ 8] -= 4; 15863: } 15864: //fallthrough 15865: case 0b100_001: //-(A1) 15866: if (XEiJ.EFA_SEPARATE_AR) { 15867: XEiJ.mpuCycleCount += 10; 15868: return XEiJ.regRn[ 9] -= 4; 15869: } 15870: //fallthrough 15871: case 0b100_010: //-(A2) 15872: if (XEiJ.EFA_SEPARATE_AR) { 15873: XEiJ.mpuCycleCount += 10; 15874: return XEiJ.regRn[10] -= 4; 15875: } 15876: //fallthrough 15877: case 0b100_011: //-(A3) 15878: if (XEiJ.EFA_SEPARATE_AR) { 15879: XEiJ.mpuCycleCount += 10; 15880: return XEiJ.regRn[11] -= 4; 15881: } 15882: //fallthrough 15883: case 0b100_100: //-(A4) 15884: if (XEiJ.EFA_SEPARATE_AR) { 15885: XEiJ.mpuCycleCount += 10; 15886: return XEiJ.regRn[12] -= 4; 15887: } 15888: //fallthrough 15889: case 0b100_101: //-(A5) 15890: if (XEiJ.EFA_SEPARATE_AR) { 15891: XEiJ.mpuCycleCount += 10; 15892: return XEiJ.regRn[13] -= 4; 15893: } 15894: //fallthrough 15895: case 0b100_110: //-(A6) 15896: if (XEiJ.EFA_SEPARATE_AR) { 15897: XEiJ.mpuCycleCount += 10; 15898: return XEiJ.regRn[14] -= 4; 15899: } 15900: //fallthrough 15901: case 0b100_111: //-(A7) 15902: if (XEiJ.EFA_SEPARATE_AR) { 15903: XEiJ.mpuCycleCount += 10; 15904: return XEiJ.regRn[15] -= 4; 15905: } else { 15906: XEiJ.mpuCycleCount += 10; 15907: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 15908: } 15909: case 0b101_000: //(d16,A0) 15910: case 0b101_001: //(d16,A1) 15911: case 0b101_010: //(d16,A2) 15912: case 0b101_011: //(d16,A3) 15913: case 0b101_100: //(d16,A4) 15914: case 0b101_101: //(d16,A5) 15915: case 0b101_110: //(d16,A6) 15916: case 0b101_111: //(d16,A7) 15917: XEiJ.mpuCycleCount += 12; 15918: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15919: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15920: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15921: } else { 15922: t = XEiJ.regPC; 15923: XEiJ.regPC = t + 2; 15924: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15925: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15926: } 15927: case 0b110_000: //(d8,A0,Rn.wl) 15928: case 0b110_001: //(d8,A1,Rn.wl) 15929: case 0b110_010: //(d8,A2,Rn.wl) 15930: case 0b110_011: //(d8,A3,Rn.wl) 15931: case 0b110_100: //(d8,A4,Rn.wl) 15932: case 0b110_101: //(d8,A5,Rn.wl) 15933: case 0b110_110: //(d8,A6,Rn.wl) 15934: case 0b110_111: //(d8,A7,Rn.wl) 15935: XEiJ.mpuCycleCount += 14; 15936: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15937: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15938: } else { 15939: w = XEiJ.regPC; 15940: XEiJ.regPC = w + 2; 15941: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15942: } 15943: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15944: + (byte) w //バイトディスプレースメント 15945: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15946: XEiJ.regRn[w >> 12])); //ロングインデックス 15947: case 0b111_000: //(xxx).W 15948: XEiJ.mpuCycleCount += 12; 15949: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15950: case 0b111_001: //(xxx).L 15951: XEiJ.mpuCycleCount += 16; 15952: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15953: case 0b111_010: //(d16,PC) 15954: XEiJ.mpuCycleCount += 12; 15955: t = XEiJ.regPC; 15956: XEiJ.regPC = t + 2; 15957: return (t //ベースレジスタ 15958: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15959: case 0b111_011: //(d8,PC,Rn.wl) 15960: XEiJ.mpuCycleCount += 14; 15961: t = XEiJ.regPC; 15962: XEiJ.regPC = t + 2; 15963: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15964: return (t //ベースレジスタ 15965: + (byte) w //バイトディスプレースメント 15966: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15967: XEiJ.regRn[w >> 12])); //ロングインデックス 15968: } //switch 15969: XEiJ.mpuCycleCount += 34; 15970: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15971: throw M68kException.m6eSignal; 15972: } //efaMemLong 15973: 15974: //a = efaMltLong (ea) //| M+-WXZ | 15975: // メモリ可変モードのロングオペランドの実効アドレスを求める 15976: // efaMemLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15977: @SuppressWarnings ("fallthrough") public static int efaMltLong (int ea) throws M68kException { 15978: int t, w; 15979: switch (ea) { 15980: case 0b010_000: //(A0) 15981: if (XEiJ.EFA_SEPARATE_AR) { 15982: XEiJ.mpuCycleCount += 8; 15983: return XEiJ.regRn[ 8]; 15984: } 15985: //fallthrough 15986: case 0b010_001: //(A1) 15987: if (XEiJ.EFA_SEPARATE_AR) { 15988: XEiJ.mpuCycleCount += 8; 15989: return XEiJ.regRn[ 9]; 15990: } 15991: //fallthrough 15992: case 0b010_010: //(A2) 15993: if (XEiJ.EFA_SEPARATE_AR) { 15994: XEiJ.mpuCycleCount += 8; 15995: return XEiJ.regRn[10]; 15996: } 15997: //fallthrough 15998: case 0b010_011: //(A3) 15999: if (XEiJ.EFA_SEPARATE_AR) { 16000: XEiJ.mpuCycleCount += 8; 16001: return XEiJ.regRn[11]; 16002: } 16003: //fallthrough 16004: case 0b010_100: //(A4) 16005: if (XEiJ.EFA_SEPARATE_AR) { 16006: XEiJ.mpuCycleCount += 8; 16007: return XEiJ.regRn[12]; 16008: } 16009: //fallthrough 16010: case 0b010_101: //(A5) 16011: if (XEiJ.EFA_SEPARATE_AR) { 16012: XEiJ.mpuCycleCount += 8; 16013: return XEiJ.regRn[13]; 16014: } 16015: //fallthrough 16016: case 0b010_110: //(A6) 16017: if (XEiJ.EFA_SEPARATE_AR) { 16018: XEiJ.mpuCycleCount += 8; 16019: return XEiJ.regRn[14]; 16020: } 16021: //fallthrough 16022: case 0b010_111: //(A7) 16023: if (XEiJ.EFA_SEPARATE_AR) { 16024: XEiJ.mpuCycleCount += 8; 16025: return XEiJ.regRn[15]; 16026: } else { 16027: XEiJ.mpuCycleCount += 8; 16028: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16029: } 16030: case 0b011_000: //(A0)+ 16031: if (XEiJ.EFA_SEPARATE_AR) { 16032: XEiJ.mpuCycleCount += 8; 16033: return (XEiJ.regRn[ 8] += 4) - 4; 16034: } 16035: //fallthrough 16036: case 0b011_001: //(A1)+ 16037: if (XEiJ.EFA_SEPARATE_AR) { 16038: XEiJ.mpuCycleCount += 8; 16039: return (XEiJ.regRn[ 9] += 4) - 4; 16040: } 16041: //fallthrough 16042: case 0b011_010: //(A2)+ 16043: if (XEiJ.EFA_SEPARATE_AR) { 16044: XEiJ.mpuCycleCount += 8; 16045: return (XEiJ.regRn[10] += 4) - 4; 16046: } 16047: //fallthrough 16048: case 0b011_011: //(A3)+ 16049: if (XEiJ.EFA_SEPARATE_AR) { 16050: XEiJ.mpuCycleCount += 8; 16051: return (XEiJ.regRn[11] += 4) - 4; 16052: } 16053: //fallthrough 16054: case 0b011_100: //(A4)+ 16055: if (XEiJ.EFA_SEPARATE_AR) { 16056: XEiJ.mpuCycleCount += 8; 16057: return (XEiJ.regRn[12] += 4) - 4; 16058: } 16059: //fallthrough 16060: case 0b011_101: //(A5)+ 16061: if (XEiJ.EFA_SEPARATE_AR) { 16062: XEiJ.mpuCycleCount += 8; 16063: return (XEiJ.regRn[13] += 4) - 4; 16064: } 16065: //fallthrough 16066: case 0b011_110: //(A6)+ 16067: if (XEiJ.EFA_SEPARATE_AR) { 16068: XEiJ.mpuCycleCount += 8; 16069: return (XEiJ.regRn[14] += 4) - 4; 16070: } 16071: //fallthrough 16072: case 0b011_111: //(A7)+ 16073: if (XEiJ.EFA_SEPARATE_AR) { 16074: XEiJ.mpuCycleCount += 8; 16075: return (XEiJ.regRn[15] += 4) - 4; 16076: } else { 16077: XEiJ.mpuCycleCount += 8; 16078: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 16079: } 16080: case 0b100_000: //-(A0) 16081: if (XEiJ.EFA_SEPARATE_AR) { 16082: XEiJ.mpuCycleCount += 10; 16083: return XEiJ.regRn[ 8] -= 4; 16084: } 16085: //fallthrough 16086: case 0b100_001: //-(A1) 16087: if (XEiJ.EFA_SEPARATE_AR) { 16088: XEiJ.mpuCycleCount += 10; 16089: return XEiJ.regRn[ 9] -= 4; 16090: } 16091: //fallthrough 16092: case 0b100_010: //-(A2) 16093: if (XEiJ.EFA_SEPARATE_AR) { 16094: XEiJ.mpuCycleCount += 10; 16095: return XEiJ.regRn[10] -= 4; 16096: } 16097: //fallthrough 16098: case 0b100_011: //-(A3) 16099: if (XEiJ.EFA_SEPARATE_AR) { 16100: XEiJ.mpuCycleCount += 10; 16101: return XEiJ.regRn[11] -= 4; 16102: } 16103: //fallthrough 16104: case 0b100_100: //-(A4) 16105: if (XEiJ.EFA_SEPARATE_AR) { 16106: XEiJ.mpuCycleCount += 10; 16107: return XEiJ.regRn[12] -= 4; 16108: } 16109: //fallthrough 16110: case 0b100_101: //-(A5) 16111: if (XEiJ.EFA_SEPARATE_AR) { 16112: XEiJ.mpuCycleCount += 10; 16113: return XEiJ.regRn[13] -= 4; 16114: } 16115: //fallthrough 16116: case 0b100_110: //-(A6) 16117: if (XEiJ.EFA_SEPARATE_AR) { 16118: XEiJ.mpuCycleCount += 10; 16119: return XEiJ.regRn[14] -= 4; 16120: } 16121: //fallthrough 16122: case 0b100_111: //-(A7) 16123: if (XEiJ.EFA_SEPARATE_AR) { 16124: XEiJ.mpuCycleCount += 10; 16125: return XEiJ.regRn[15] -= 4; 16126: } else { 16127: XEiJ.mpuCycleCount += 10; 16128: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 16129: } 16130: case 0b101_000: //(d16,A0) 16131: case 0b101_001: //(d16,A1) 16132: case 0b101_010: //(d16,A2) 16133: case 0b101_011: //(d16,A3) 16134: case 0b101_100: //(d16,A4) 16135: case 0b101_101: //(d16,A5) 16136: case 0b101_110: //(d16,A6) 16137: case 0b101_111: //(d16,A7) 16138: XEiJ.mpuCycleCount += 12; 16139: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16140: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16141: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16142: } else { 16143: t = XEiJ.regPC; 16144: XEiJ.regPC = t + 2; 16145: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16146: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16147: } 16148: case 0b110_000: //(d8,A0,Rn.wl) 16149: case 0b110_001: //(d8,A1,Rn.wl) 16150: case 0b110_010: //(d8,A2,Rn.wl) 16151: case 0b110_011: //(d8,A3,Rn.wl) 16152: case 0b110_100: //(d8,A4,Rn.wl) 16153: case 0b110_101: //(d8,A5,Rn.wl) 16154: case 0b110_110: //(d8,A6,Rn.wl) 16155: case 0b110_111: //(d8,A7,Rn.wl) 16156: XEiJ.mpuCycleCount += 14; 16157: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16158: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16159: } else { 16160: w = XEiJ.regPC; 16161: XEiJ.regPC = w + 2; 16162: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16163: } 16164: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16165: + (byte) w //バイトディスプレースメント 16166: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16167: XEiJ.regRn[w >> 12])); //ロングインデックス 16168: case 0b111_000: //(xxx).W 16169: XEiJ.mpuCycleCount += 12; 16170: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16171: case 0b111_001: //(xxx).L 16172: XEiJ.mpuCycleCount += 16; 16173: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16174: } //switch 16175: XEiJ.mpuCycleCount += 34; 16176: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16177: throw M68kException.m6eSignal; 16178: } //efaMltLong 16179: 16180: //a = efaCntLong (ea) //| M WXZP | 16181: // 制御モードのロングオペランドの実効アドレスを求める 16182: // efaMemLongとの違いは(Ar)+と-(Ar)がないこと 16183: @SuppressWarnings ("fallthrough") public static int efaCntLong (int ea) throws M68kException { 16184: int t, w; 16185: switch (ea) { 16186: case 0b010_000: //(A0) 16187: if (XEiJ.EFA_SEPARATE_AR) { 16188: XEiJ.mpuCycleCount += 8; 16189: return XEiJ.regRn[ 8]; 16190: } 16191: //fallthrough 16192: case 0b010_001: //(A1) 16193: if (XEiJ.EFA_SEPARATE_AR) { 16194: XEiJ.mpuCycleCount += 8; 16195: return XEiJ.regRn[ 9]; 16196: } 16197: //fallthrough 16198: case 0b010_010: //(A2) 16199: if (XEiJ.EFA_SEPARATE_AR) { 16200: XEiJ.mpuCycleCount += 8; 16201: return XEiJ.regRn[10]; 16202: } 16203: //fallthrough 16204: case 0b010_011: //(A3) 16205: if (XEiJ.EFA_SEPARATE_AR) { 16206: XEiJ.mpuCycleCount += 8; 16207: return XEiJ.regRn[11]; 16208: } 16209: //fallthrough 16210: case 0b010_100: //(A4) 16211: if (XEiJ.EFA_SEPARATE_AR) { 16212: XEiJ.mpuCycleCount += 8; 16213: return XEiJ.regRn[12]; 16214: } 16215: //fallthrough 16216: case 0b010_101: //(A5) 16217: if (XEiJ.EFA_SEPARATE_AR) { 16218: XEiJ.mpuCycleCount += 8; 16219: return XEiJ.regRn[13]; 16220: } 16221: //fallthrough 16222: case 0b010_110: //(A6) 16223: if (XEiJ.EFA_SEPARATE_AR) { 16224: XEiJ.mpuCycleCount += 8; 16225: return XEiJ.regRn[14]; 16226: } 16227: //fallthrough 16228: case 0b010_111: //(A7) 16229: if (XEiJ.EFA_SEPARATE_AR) { 16230: XEiJ.mpuCycleCount += 8; 16231: return XEiJ.regRn[15]; 16232: } else { 16233: XEiJ.mpuCycleCount += 8; 16234: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16235: } 16236: case 0b101_000: //(d16,A0) 16237: case 0b101_001: //(d16,A1) 16238: case 0b101_010: //(d16,A2) 16239: case 0b101_011: //(d16,A3) 16240: case 0b101_100: //(d16,A4) 16241: case 0b101_101: //(d16,A5) 16242: case 0b101_110: //(d16,A6) 16243: case 0b101_111: //(d16,A7) 16244: XEiJ.mpuCycleCount += 12; 16245: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16246: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16247: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16248: } else { 16249: t = XEiJ.regPC; 16250: XEiJ.regPC = t + 2; 16251: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16252: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16253: } 16254: case 0b110_000: //(d8,A0,Rn.wl) 16255: case 0b110_001: //(d8,A1,Rn.wl) 16256: case 0b110_010: //(d8,A2,Rn.wl) 16257: case 0b110_011: //(d8,A3,Rn.wl) 16258: case 0b110_100: //(d8,A4,Rn.wl) 16259: case 0b110_101: //(d8,A5,Rn.wl) 16260: case 0b110_110: //(d8,A6,Rn.wl) 16261: case 0b110_111: //(d8,A7,Rn.wl) 16262: XEiJ.mpuCycleCount += 14; 16263: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16264: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16265: } else { 16266: w = XEiJ.regPC; 16267: XEiJ.regPC = w + 2; 16268: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16269: } 16270: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16271: + (byte) w //バイトディスプレースメント 16272: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16273: XEiJ.regRn[w >> 12])); //ロングインデックス 16274: case 0b111_000: //(xxx).W 16275: XEiJ.mpuCycleCount += 12; 16276: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16277: case 0b111_001: //(xxx).L 16278: XEiJ.mpuCycleCount += 16; 16279: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16280: case 0b111_010: //(d16,PC) 16281: XEiJ.mpuCycleCount += 12; 16282: t = XEiJ.regPC; 16283: XEiJ.regPC = t + 2; 16284: return (t //ベースレジスタ 16285: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16286: case 0b111_011: //(d8,PC,Rn.wl) 16287: XEiJ.mpuCycleCount += 14; 16288: t = XEiJ.regPC; 16289: XEiJ.regPC = t + 2; 16290: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16291: return (t //ベースレジスタ 16292: + (byte) w //バイトディスプレースメント 16293: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16294: XEiJ.regRn[w >> 12])); //ロングインデックス 16295: } //switch 16296: XEiJ.mpuCycleCount += 34; 16297: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16298: throw M68kException.m6eSignal; 16299: } //efaCntLong 16300: 16301: //a = efaCltLong (ea) //| M WXZ | 16302: // 制御可変モードのワードオペランドの実効アドレスを求める 16303: // efaCntLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 16304: @SuppressWarnings ("fallthrough") public static int efaCltLong (int ea) throws M68kException { 16305: int t, w; 16306: switch (ea) { 16307: case 0b010_000: //(A0) 16308: if (XEiJ.EFA_SEPARATE_AR) { 16309: XEiJ.mpuCycleCount += 8; 16310: return XEiJ.regRn[ 8]; 16311: } 16312: //fallthrough 16313: case 0b010_001: //(A1) 16314: if (XEiJ.EFA_SEPARATE_AR) { 16315: XEiJ.mpuCycleCount += 8; 16316: return XEiJ.regRn[ 9]; 16317: } 16318: //fallthrough 16319: case 0b010_010: //(A2) 16320: if (XEiJ.EFA_SEPARATE_AR) { 16321: XEiJ.mpuCycleCount += 8; 16322: return XEiJ.regRn[10]; 16323: } 16324: //fallthrough 16325: case 0b010_011: //(A3) 16326: if (XEiJ.EFA_SEPARATE_AR) { 16327: XEiJ.mpuCycleCount += 8; 16328: return XEiJ.regRn[11]; 16329: } 16330: //fallthrough 16331: case 0b010_100: //(A4) 16332: if (XEiJ.EFA_SEPARATE_AR) { 16333: XEiJ.mpuCycleCount += 8; 16334: return XEiJ.regRn[12]; 16335: } 16336: //fallthrough 16337: case 0b010_101: //(A5) 16338: if (XEiJ.EFA_SEPARATE_AR) { 16339: XEiJ.mpuCycleCount += 8; 16340: return XEiJ.regRn[13]; 16341: } 16342: //fallthrough 16343: case 0b010_110: //(A6) 16344: if (XEiJ.EFA_SEPARATE_AR) { 16345: XEiJ.mpuCycleCount += 8; 16346: return XEiJ.regRn[14]; 16347: } 16348: //fallthrough 16349: case 0b010_111: //(A7) 16350: if (XEiJ.EFA_SEPARATE_AR) { 16351: XEiJ.mpuCycleCount += 8; 16352: return XEiJ.regRn[15]; 16353: } else { 16354: XEiJ.mpuCycleCount += 8; 16355: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16356: } 16357: case 0b101_000: //(d16,A0) 16358: case 0b101_001: //(d16,A1) 16359: case 0b101_010: //(d16,A2) 16360: case 0b101_011: //(d16,A3) 16361: case 0b101_100: //(d16,A4) 16362: case 0b101_101: //(d16,A5) 16363: case 0b101_110: //(d16,A6) 16364: case 0b101_111: //(d16,A7) 16365: XEiJ.mpuCycleCount += 12; 16366: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16367: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16368: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16369: } else { 16370: t = XEiJ.regPC; 16371: XEiJ.regPC = t + 2; 16372: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16373: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16374: } 16375: case 0b110_000: //(d8,A0,Rn.wl) 16376: case 0b110_001: //(d8,A1,Rn.wl) 16377: case 0b110_010: //(d8,A2,Rn.wl) 16378: case 0b110_011: //(d8,A3,Rn.wl) 16379: case 0b110_100: //(d8,A4,Rn.wl) 16380: case 0b110_101: //(d8,A5,Rn.wl) 16381: case 0b110_110: //(d8,A6,Rn.wl) 16382: case 0b110_111: //(d8,A7,Rn.wl) 16383: XEiJ.mpuCycleCount += 14; 16384: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16385: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16386: } else { 16387: w = XEiJ.regPC; 16388: XEiJ.regPC = w + 2; 16389: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16390: } 16391: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16392: + (byte) w //バイトディスプレースメント 16393: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16394: XEiJ.regRn[w >> 12])); //ロングインデックス 16395: case 0b111_000: //(xxx).W 16396: XEiJ.mpuCycleCount += 12; 16397: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16398: case 0b111_001: //(xxx).L 16399: XEiJ.mpuCycleCount += 16; 16400: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16401: } //switch 16402: XEiJ.mpuCycleCount += 34; 16403: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16404: throw M68kException.m6eSignal; 16405: } //efaCltLong 16406: 16407: //a = efaAnyQuad (ea) //| M+-WXZPI| 16408: // 任意のモードのクワッドオペランドの実効アドレスを求める 16409: // efaAnyLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、 16410: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16411: @SuppressWarnings ("fallthrough") public static int efaAnyQuad (int ea) throws M68kException { 16412: int t, w; 16413: switch (ea) { 16414: case 0b010_000: //(A0) 16415: if (XEiJ.EFA_SEPARATE_AR) { 16416: XEiJ.mpuCycleCount += 16; 16417: return XEiJ.regRn[ 8]; 16418: } 16419: //fallthrough 16420: case 0b010_001: //(A1) 16421: if (XEiJ.EFA_SEPARATE_AR) { 16422: XEiJ.mpuCycleCount += 16; 16423: return XEiJ.regRn[ 9]; 16424: } 16425: //fallthrough 16426: case 0b010_010: //(A2) 16427: if (XEiJ.EFA_SEPARATE_AR) { 16428: XEiJ.mpuCycleCount += 16; 16429: return XEiJ.regRn[10]; 16430: } 16431: //fallthrough 16432: case 0b010_011: //(A3) 16433: if (XEiJ.EFA_SEPARATE_AR) { 16434: XEiJ.mpuCycleCount += 16; 16435: return XEiJ.regRn[11]; 16436: } 16437: //fallthrough 16438: case 0b010_100: //(A4) 16439: if (XEiJ.EFA_SEPARATE_AR) { 16440: XEiJ.mpuCycleCount += 16; 16441: return XEiJ.regRn[12]; 16442: } 16443: //fallthrough 16444: case 0b010_101: //(A5) 16445: if (XEiJ.EFA_SEPARATE_AR) { 16446: XEiJ.mpuCycleCount += 16; 16447: return XEiJ.regRn[13]; 16448: } 16449: //fallthrough 16450: case 0b010_110: //(A6) 16451: if (XEiJ.EFA_SEPARATE_AR) { 16452: XEiJ.mpuCycleCount += 16; 16453: return XEiJ.regRn[14]; 16454: } 16455: //fallthrough 16456: case 0b010_111: //(A7) 16457: if (XEiJ.EFA_SEPARATE_AR) { 16458: XEiJ.mpuCycleCount += 16; 16459: return XEiJ.regRn[15]; 16460: } else { 16461: XEiJ.mpuCycleCount += 16; 16462: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16463: } 16464: case 0b011_000: //(A0)+ 16465: if (XEiJ.EFA_SEPARATE_AR) { 16466: XEiJ.mpuCycleCount += 16; 16467: return (XEiJ.regRn[ 8] += 8) - 8; 16468: } 16469: //fallthrough 16470: case 0b011_001: //(A1)+ 16471: if (XEiJ.EFA_SEPARATE_AR) { 16472: XEiJ.mpuCycleCount += 16; 16473: return (XEiJ.regRn[ 9] += 8) - 8; 16474: } 16475: //fallthrough 16476: case 0b011_010: //(A2)+ 16477: if (XEiJ.EFA_SEPARATE_AR) { 16478: XEiJ.mpuCycleCount += 16; 16479: return (XEiJ.regRn[10] += 8) - 8; 16480: } 16481: //fallthrough 16482: case 0b011_011: //(A3)+ 16483: if (XEiJ.EFA_SEPARATE_AR) { 16484: XEiJ.mpuCycleCount += 16; 16485: return (XEiJ.regRn[11] += 8) - 8; 16486: } 16487: //fallthrough 16488: case 0b011_100: //(A4)+ 16489: if (XEiJ.EFA_SEPARATE_AR) { 16490: XEiJ.mpuCycleCount += 16; 16491: return (XEiJ.regRn[12] += 8) - 8; 16492: } 16493: //fallthrough 16494: case 0b011_101: //(A5)+ 16495: if (XEiJ.EFA_SEPARATE_AR) { 16496: XEiJ.mpuCycleCount += 16; 16497: return (XEiJ.regRn[13] += 8) - 8; 16498: } 16499: //fallthrough 16500: case 0b011_110: //(A6)+ 16501: if (XEiJ.EFA_SEPARATE_AR) { 16502: XEiJ.mpuCycleCount += 16; 16503: return (XEiJ.regRn[14] += 8) - 8; 16504: } 16505: //fallthrough 16506: case 0b011_111: //(A7)+ 16507: if (XEiJ.EFA_SEPARATE_AR) { 16508: XEiJ.mpuCycleCount += 16; 16509: return (XEiJ.regRn[15] += 8) - 8; 16510: } else { 16511: XEiJ.mpuCycleCount += 16; 16512: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8; 16513: } 16514: case 0b100_000: //-(A0) 16515: if (XEiJ.EFA_SEPARATE_AR) { 16516: XEiJ.mpuCycleCount += 18; 16517: return XEiJ.regRn[ 8] -= 8; 16518: } 16519: //fallthrough 16520: case 0b100_001: //-(A1) 16521: if (XEiJ.EFA_SEPARATE_AR) { 16522: XEiJ.mpuCycleCount += 18; 16523: return XEiJ.regRn[ 9] -= 8; 16524: } 16525: //fallthrough 16526: case 0b100_010: //-(A2) 16527: if (XEiJ.EFA_SEPARATE_AR) { 16528: XEiJ.mpuCycleCount += 18; 16529: return XEiJ.regRn[10] -= 8; 16530: } 16531: //fallthrough 16532: case 0b100_011: //-(A3) 16533: if (XEiJ.EFA_SEPARATE_AR) { 16534: XEiJ.mpuCycleCount += 18; 16535: return XEiJ.regRn[11] -= 8; 16536: } 16537: //fallthrough 16538: case 0b100_100: //-(A4) 16539: if (XEiJ.EFA_SEPARATE_AR) { 16540: XEiJ.mpuCycleCount += 18; 16541: return XEiJ.regRn[12] -= 8; 16542: } 16543: //fallthrough 16544: case 0b100_101: //-(A5) 16545: if (XEiJ.EFA_SEPARATE_AR) { 16546: XEiJ.mpuCycleCount += 18; 16547: return XEiJ.regRn[13] -= 8; 16548: } 16549: //fallthrough 16550: case 0b100_110: //-(A6) 16551: if (XEiJ.EFA_SEPARATE_AR) { 16552: XEiJ.mpuCycleCount += 18; 16553: return XEiJ.regRn[14] -= 8; 16554: } 16555: //fallthrough 16556: case 0b100_111: //-(A7) 16557: if (XEiJ.EFA_SEPARATE_AR) { 16558: XEiJ.mpuCycleCount += 18; 16559: return XEiJ.regRn[15] -= 8; 16560: } else { 16561: XEiJ.mpuCycleCount += 18; 16562: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8; 16563: } 16564: case 0b101_000: //(d16,A0) 16565: case 0b101_001: //(d16,A1) 16566: case 0b101_010: //(d16,A2) 16567: case 0b101_011: //(d16,A3) 16568: case 0b101_100: //(d16,A4) 16569: case 0b101_101: //(d16,A5) 16570: case 0b101_110: //(d16,A6) 16571: case 0b101_111: //(d16,A7) 16572: XEiJ.mpuCycleCount += 20; 16573: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16574: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16575: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16576: } else { 16577: t = XEiJ.regPC; 16578: XEiJ.regPC = t + 2; 16579: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16580: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16581: } 16582: case 0b110_000: //(d8,A0,Rn.wl) 16583: case 0b110_001: //(d8,A1,Rn.wl) 16584: case 0b110_010: //(d8,A2,Rn.wl) 16585: case 0b110_011: //(d8,A3,Rn.wl) 16586: case 0b110_100: //(d8,A4,Rn.wl) 16587: case 0b110_101: //(d8,A5,Rn.wl) 16588: case 0b110_110: //(d8,A6,Rn.wl) 16589: case 0b110_111: //(d8,A7,Rn.wl) 16590: XEiJ.mpuCycleCount += 22; 16591: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16592: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16593: } else { 16594: w = XEiJ.regPC; 16595: XEiJ.regPC = w + 2; 16596: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16597: } 16598: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16599: + (byte) w //バイトディスプレースメント 16600: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16601: XEiJ.regRn[w >> 12])); //ロングインデックス 16602: case 0b111_000: //(xxx).W 16603: XEiJ.mpuCycleCount += 20; 16604: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16605: case 0b111_001: //(xxx).L 16606: XEiJ.mpuCycleCount += 24; 16607: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16608: case 0b111_010: //(d16,PC) 16609: XEiJ.mpuCycleCount += 20; 16610: t = XEiJ.regPC; 16611: XEiJ.regPC = t + 2; 16612: return (t //ベースレジスタ 16613: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16614: case 0b111_011: //(d8,PC,Rn.wl) 16615: XEiJ.mpuCycleCount += 22; 16616: t = XEiJ.regPC; 16617: XEiJ.regPC = t + 2; 16618: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16619: return (t //ベースレジスタ 16620: + (byte) w //バイトディスプレースメント 16621: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16622: XEiJ.regRn[w >> 12])); //ロングインデックス 16623: case 0b111_100: //#<data> 16624: XEiJ.mpuCycleCount += 16; 16625: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16626: return (XEiJ.regPC += 8) - 8; 16627: } else { 16628: t = XEiJ.regPC; 16629: XEiJ.regPC = t + 8; 16630: return t; 16631: } 16632: } //switch 16633: XEiJ.mpuCycleCount += 34; 16634: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16635: throw M68kException.m6eSignal; 16636: } //efaAnyQuad 16637: 16638: //a = efaMltQuad (ea) //| M+-WXZ | 16639: // メモリ可変モードのクワッドオペランドの実効アドレスを求める 16640: // efaMltLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、 16641: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16642: @SuppressWarnings ("fallthrough") public static int efaMltQuad (int ea) throws M68kException { 16643: int t, w; 16644: switch (ea) { 16645: case 0b010_000: //(A0) 16646: if (XEiJ.EFA_SEPARATE_AR) { 16647: XEiJ.mpuCycleCount += 16; 16648: return XEiJ.regRn[ 8]; 16649: } 16650: //fallthrough 16651: case 0b010_001: //(A1) 16652: if (XEiJ.EFA_SEPARATE_AR) { 16653: XEiJ.mpuCycleCount += 16; 16654: return XEiJ.regRn[ 9]; 16655: } 16656: //fallthrough 16657: case 0b010_010: //(A2) 16658: if (XEiJ.EFA_SEPARATE_AR) { 16659: XEiJ.mpuCycleCount += 16; 16660: return XEiJ.regRn[10]; 16661: } 16662: //fallthrough 16663: case 0b010_011: //(A3) 16664: if (XEiJ.EFA_SEPARATE_AR) { 16665: XEiJ.mpuCycleCount += 16; 16666: return XEiJ.regRn[11]; 16667: } 16668: //fallthrough 16669: case 0b010_100: //(A4) 16670: if (XEiJ.EFA_SEPARATE_AR) { 16671: XEiJ.mpuCycleCount += 16; 16672: return XEiJ.regRn[12]; 16673: } 16674: //fallthrough 16675: case 0b010_101: //(A5) 16676: if (XEiJ.EFA_SEPARATE_AR) { 16677: XEiJ.mpuCycleCount += 16; 16678: return XEiJ.regRn[13]; 16679: } 16680: //fallthrough 16681: case 0b010_110: //(A6) 16682: if (XEiJ.EFA_SEPARATE_AR) { 16683: XEiJ.mpuCycleCount += 16; 16684: return XEiJ.regRn[14]; 16685: } 16686: //fallthrough 16687: case 0b010_111: //(A7) 16688: if (XEiJ.EFA_SEPARATE_AR) { 16689: XEiJ.mpuCycleCount += 16; 16690: return XEiJ.regRn[15]; 16691: } else { 16692: XEiJ.mpuCycleCount += 16; 16693: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16694: } 16695: case 0b011_000: //(A0)+ 16696: if (XEiJ.EFA_SEPARATE_AR) { 16697: XEiJ.mpuCycleCount += 16; 16698: return (XEiJ.regRn[ 8] += 8) - 8; 16699: } 16700: //fallthrough 16701: case 0b011_001: //(A1)+ 16702: if (XEiJ.EFA_SEPARATE_AR) { 16703: XEiJ.mpuCycleCount += 16; 16704: return (XEiJ.regRn[ 9] += 8) - 8; 16705: } 16706: //fallthrough 16707: case 0b011_010: //(A2)+ 16708: if (XEiJ.EFA_SEPARATE_AR) { 16709: XEiJ.mpuCycleCount += 16; 16710: return (XEiJ.regRn[10] += 8) - 8; 16711: } 16712: //fallthrough 16713: case 0b011_011: //(A3)+ 16714: if (XEiJ.EFA_SEPARATE_AR) { 16715: XEiJ.mpuCycleCount += 16; 16716: return (XEiJ.regRn[11] += 8) - 8; 16717: } 16718: //fallthrough 16719: case 0b011_100: //(A4)+ 16720: if (XEiJ.EFA_SEPARATE_AR) { 16721: XEiJ.mpuCycleCount += 16; 16722: return (XEiJ.regRn[12] += 8) - 8; 16723: } 16724: //fallthrough 16725: case 0b011_101: //(A5)+ 16726: if (XEiJ.EFA_SEPARATE_AR) { 16727: XEiJ.mpuCycleCount += 16; 16728: return (XEiJ.regRn[13] += 8) - 8; 16729: } 16730: //fallthrough 16731: case 0b011_110: //(A6)+ 16732: if (XEiJ.EFA_SEPARATE_AR) { 16733: XEiJ.mpuCycleCount += 16; 16734: return (XEiJ.regRn[14] += 8) - 8; 16735: } 16736: //fallthrough 16737: case 0b011_111: //(A7)+ 16738: if (XEiJ.EFA_SEPARATE_AR) { 16739: XEiJ.mpuCycleCount += 16; 16740: return (XEiJ.regRn[15] += 8) - 8; 16741: } else { 16742: XEiJ.mpuCycleCount += 16; 16743: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8; 16744: } 16745: case 0b100_000: //-(A0) 16746: if (XEiJ.EFA_SEPARATE_AR) { 16747: XEiJ.mpuCycleCount += 18; 16748: return XEiJ.regRn[ 8] -= 8; 16749: } 16750: //fallthrough 16751: case 0b100_001: //-(A1) 16752: if (XEiJ.EFA_SEPARATE_AR) { 16753: XEiJ.mpuCycleCount += 18; 16754: return XEiJ.regRn[ 9] -= 8; 16755: } 16756: //fallthrough 16757: case 0b100_010: //-(A2) 16758: if (XEiJ.EFA_SEPARATE_AR) { 16759: XEiJ.mpuCycleCount += 18; 16760: return XEiJ.regRn[10] -= 8; 16761: } 16762: //fallthrough 16763: case 0b100_011: //-(A3) 16764: if (XEiJ.EFA_SEPARATE_AR) { 16765: XEiJ.mpuCycleCount += 18; 16766: return XEiJ.regRn[11] -= 8; 16767: } 16768: //fallthrough 16769: case 0b100_100: //-(A4) 16770: if (XEiJ.EFA_SEPARATE_AR) { 16771: XEiJ.mpuCycleCount += 18; 16772: return XEiJ.regRn[12] -= 8; 16773: } 16774: //fallthrough 16775: case 0b100_101: //-(A5) 16776: if (XEiJ.EFA_SEPARATE_AR) { 16777: XEiJ.mpuCycleCount += 18; 16778: return XEiJ.regRn[13] -= 8; 16779: } 16780: //fallthrough 16781: case 0b100_110: //-(A6) 16782: if (XEiJ.EFA_SEPARATE_AR) { 16783: XEiJ.mpuCycleCount += 18; 16784: return XEiJ.regRn[14] -= 8; 16785: } 16786: //fallthrough 16787: case 0b100_111: //-(A7) 16788: if (XEiJ.EFA_SEPARATE_AR) { 16789: XEiJ.mpuCycleCount += 18; 16790: return XEiJ.regRn[15] -= 8; 16791: } else { 16792: XEiJ.mpuCycleCount += 18; 16793: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8; 16794: } 16795: case 0b101_000: //(d16,A0) 16796: case 0b101_001: //(d16,A1) 16797: case 0b101_010: //(d16,A2) 16798: case 0b101_011: //(d16,A3) 16799: case 0b101_100: //(d16,A4) 16800: case 0b101_101: //(d16,A5) 16801: case 0b101_110: //(d16,A6) 16802: case 0b101_111: //(d16,A7) 16803: XEiJ.mpuCycleCount += 20; 16804: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16805: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16806: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16807: } else { 16808: t = XEiJ.regPC; 16809: XEiJ.regPC = t + 2; 16810: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16811: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16812: } 16813: case 0b110_000: //(d8,A0,Rn.wl) 16814: case 0b110_001: //(d8,A1,Rn.wl) 16815: case 0b110_010: //(d8,A2,Rn.wl) 16816: case 0b110_011: //(d8,A3,Rn.wl) 16817: case 0b110_100: //(d8,A4,Rn.wl) 16818: case 0b110_101: //(d8,A5,Rn.wl) 16819: case 0b110_110: //(d8,A6,Rn.wl) 16820: case 0b110_111: //(d8,A7,Rn.wl) 16821: XEiJ.mpuCycleCount += 22; 16822: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16823: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16824: } else { 16825: w = XEiJ.regPC; 16826: XEiJ.regPC = w + 2; 16827: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16828: } 16829: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16830: + (byte) w //バイトディスプレースメント 16831: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16832: XEiJ.regRn[w >> 12])); //ロングインデックス 16833: case 0b111_000: //(xxx).W 16834: XEiJ.mpuCycleCount += 20; 16835: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16836: case 0b111_001: //(xxx).L 16837: XEiJ.mpuCycleCount += 24; 16838: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16839: } //switch 16840: XEiJ.mpuCycleCount += 34; 16841: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16842: throw M68kException.m6eSignal; 16843: } //efaMltQuad 16844: 16845: //a = efaAnyExtd (ea) //| M+-WXZPI| 16846: // 任意のモードのエクステンデッドオペランドの実効アドレスを求める 16847: // efaAnyQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、 16848: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16849: @SuppressWarnings ("fallthrough") public static int efaAnyExtd (int ea) throws M68kException { 16850: int t, w; 16851: switch (ea) { 16852: case 0b010_000: //(A0) 16853: if (XEiJ.EFA_SEPARATE_AR) { 16854: XEiJ.mpuCycleCount += 24; 16855: return XEiJ.regRn[ 8]; 16856: } 16857: //fallthrough 16858: case 0b010_001: //(A1) 16859: if (XEiJ.EFA_SEPARATE_AR) { 16860: XEiJ.mpuCycleCount += 24; 16861: return XEiJ.regRn[ 9]; 16862: } 16863: //fallthrough 16864: case 0b010_010: //(A2) 16865: if (XEiJ.EFA_SEPARATE_AR) { 16866: XEiJ.mpuCycleCount += 24; 16867: return XEiJ.regRn[10]; 16868: } 16869: //fallthrough 16870: case 0b010_011: //(A3) 16871: if (XEiJ.EFA_SEPARATE_AR) { 16872: XEiJ.mpuCycleCount += 24; 16873: return XEiJ.regRn[11]; 16874: } 16875: //fallthrough 16876: case 0b010_100: //(A4) 16877: if (XEiJ.EFA_SEPARATE_AR) { 16878: XEiJ.mpuCycleCount += 24; 16879: return XEiJ.regRn[12]; 16880: } 16881: //fallthrough 16882: case 0b010_101: //(A5) 16883: if (XEiJ.EFA_SEPARATE_AR) { 16884: XEiJ.mpuCycleCount += 24; 16885: return XEiJ.regRn[13]; 16886: } 16887: //fallthrough 16888: case 0b010_110: //(A6) 16889: if (XEiJ.EFA_SEPARATE_AR) { 16890: XEiJ.mpuCycleCount += 24; 16891: return XEiJ.regRn[14]; 16892: } 16893: //fallthrough 16894: case 0b010_111: //(A7) 16895: if (XEiJ.EFA_SEPARATE_AR) { 16896: XEiJ.mpuCycleCount += 24; 16897: return XEiJ.regRn[15]; 16898: } else { 16899: XEiJ.mpuCycleCount += 24; 16900: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16901: } 16902: case 0b011_000: //(A0)+ 16903: if (XEiJ.EFA_SEPARATE_AR) { 16904: XEiJ.mpuCycleCount += 24; 16905: return (XEiJ.regRn[ 8] += 12) - 12; 16906: } 16907: //fallthrough 16908: case 0b011_001: //(A1)+ 16909: if (XEiJ.EFA_SEPARATE_AR) { 16910: XEiJ.mpuCycleCount += 24; 16911: return (XEiJ.regRn[ 9] += 12) - 12; 16912: } 16913: //fallthrough 16914: case 0b011_010: //(A2)+ 16915: if (XEiJ.EFA_SEPARATE_AR) { 16916: XEiJ.mpuCycleCount += 24; 16917: return (XEiJ.regRn[10] += 12) - 12; 16918: } 16919: //fallthrough 16920: case 0b011_011: //(A3)+ 16921: if (XEiJ.EFA_SEPARATE_AR) { 16922: XEiJ.mpuCycleCount += 24; 16923: return (XEiJ.regRn[11] += 12) - 12; 16924: } 16925: //fallthrough 16926: case 0b011_100: //(A4)+ 16927: if (XEiJ.EFA_SEPARATE_AR) { 16928: XEiJ.mpuCycleCount += 24; 16929: return (XEiJ.regRn[12] += 12) - 12; 16930: } 16931: //fallthrough 16932: case 0b011_101: //(A5)+ 16933: if (XEiJ.EFA_SEPARATE_AR) { 16934: XEiJ.mpuCycleCount += 24; 16935: return (XEiJ.regRn[13] += 12) - 12; 16936: } 16937: //fallthrough 16938: case 0b011_110: //(A6)+ 16939: if (XEiJ.EFA_SEPARATE_AR) { 16940: XEiJ.mpuCycleCount += 24; 16941: return (XEiJ.regRn[14] += 12) - 12; 16942: } 16943: //fallthrough 16944: case 0b011_111: //(A7)+ 16945: if (XEiJ.EFA_SEPARATE_AR) { 16946: XEiJ.mpuCycleCount += 24; 16947: return (XEiJ.regRn[15] += 12) - 12; 16948: } else { 16949: XEiJ.mpuCycleCount += 24; 16950: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12; 16951: } 16952: case 0b100_000: //-(A0) 16953: if (XEiJ.EFA_SEPARATE_AR) { 16954: XEiJ.mpuCycleCount += 26; 16955: return XEiJ.regRn[ 8] -= 12; 16956: } 16957: //fallthrough 16958: case 0b100_001: //-(A1) 16959: if (XEiJ.EFA_SEPARATE_AR) { 16960: XEiJ.mpuCycleCount += 26; 16961: return XEiJ.regRn[ 9] -= 12; 16962: } 16963: //fallthrough 16964: case 0b100_010: //-(A2) 16965: if (XEiJ.EFA_SEPARATE_AR) { 16966: XEiJ.mpuCycleCount += 26; 16967: return XEiJ.regRn[10] -= 12; 16968: } 16969: //fallthrough 16970: case 0b100_011: //-(A3) 16971: if (XEiJ.EFA_SEPARATE_AR) { 16972: XEiJ.mpuCycleCount += 26; 16973: return XEiJ.regRn[11] -= 12; 16974: } 16975: //fallthrough 16976: case 0b100_100: //-(A4) 16977: if (XEiJ.EFA_SEPARATE_AR) { 16978: XEiJ.mpuCycleCount += 26; 16979: return XEiJ.regRn[12] -= 12; 16980: } 16981: //fallthrough 16982: case 0b100_101: //-(A5) 16983: if (XEiJ.EFA_SEPARATE_AR) { 16984: XEiJ.mpuCycleCount += 26; 16985: return XEiJ.regRn[13] -= 12; 16986: } 16987: //fallthrough 16988: case 0b100_110: //-(A6) 16989: if (XEiJ.EFA_SEPARATE_AR) { 16990: XEiJ.mpuCycleCount += 26; 16991: return XEiJ.regRn[14] -= 12; 16992: } 16993: //fallthrough 16994: case 0b100_111: //-(A7) 16995: if (XEiJ.EFA_SEPARATE_AR) { 16996: XEiJ.mpuCycleCount += 26; 16997: return XEiJ.regRn[15] -= 12; 16998: } else { 16999: XEiJ.mpuCycleCount += 26; 17000: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12; 17001: } 17002: case 0b101_000: //(d16,A0) 17003: case 0b101_001: //(d16,A1) 17004: case 0b101_010: //(d16,A2) 17005: case 0b101_011: //(d16,A3) 17006: case 0b101_100: //(d16,A4) 17007: case 0b101_101: //(d16,A5) 17008: case 0b101_110: //(d16,A6) 17009: case 0b101_111: //(d16,A7) 17010: XEiJ.mpuCycleCount += 28; 17011: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17012: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17013: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17014: } else { 17015: t = XEiJ.regPC; 17016: XEiJ.regPC = t + 2; 17017: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17018: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17019: } 17020: case 0b110_000: //(d8,A0,Rn.wl) 17021: case 0b110_001: //(d8,A1,Rn.wl) 17022: case 0b110_010: //(d8,A2,Rn.wl) 17023: case 0b110_011: //(d8,A3,Rn.wl) 17024: case 0b110_100: //(d8,A4,Rn.wl) 17025: case 0b110_101: //(d8,A5,Rn.wl) 17026: case 0b110_110: //(d8,A6,Rn.wl) 17027: case 0b110_111: //(d8,A7,Rn.wl) 17028: XEiJ.mpuCycleCount += 30; 17029: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17030: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17031: } else { 17032: w = XEiJ.regPC; 17033: XEiJ.regPC = w + 2; 17034: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17035: } 17036: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17037: + (byte) w //バイトディスプレースメント 17038: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17039: XEiJ.regRn[w >> 12])); //ロングインデックス 17040: case 0b111_000: //(xxx).W 17041: XEiJ.mpuCycleCount += 28; 17042: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17043: case 0b111_001: //(xxx).L 17044: XEiJ.mpuCycleCount += 32; 17045: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17046: case 0b111_010: //(d16,PC) 17047: XEiJ.mpuCycleCount += 28; 17048: t = XEiJ.regPC; 17049: XEiJ.regPC = t + 2; 17050: return (t //ベースレジスタ 17051: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17052: case 0b111_011: //(d8,PC,Rn.wl) 17053: XEiJ.mpuCycleCount += 30; 17054: t = XEiJ.regPC; 17055: XEiJ.regPC = t + 2; 17056: w = XEiJ.busRwze (t); //pcwz。拡張ワード 17057: return (t //ベースレジスタ 17058: + (byte) w //バイトディスプレースメント 17059: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17060: XEiJ.regRn[w >> 12])); //ロングインデックス 17061: case 0b111_100: //#<data> 17062: XEiJ.mpuCycleCount += 24; 17063: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17064: return (XEiJ.regPC += 12) - 12; 17065: } else { 17066: t = XEiJ.regPC; 17067: XEiJ.regPC = t + 12; 17068: return t; 17069: } 17070: } //switch 17071: XEiJ.mpuCycleCount += 34; 17072: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17073: throw M68kException.m6eSignal; 17074: } //efaAnyExtd 17075: 17076: //a = efaMltExtd (ea) //| M+-WXZ | 17077: // メモリ可変モードのエクステンデッドオペランドの実効アドレスを求める 17078: // efaMltQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、 17079: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 17080: @SuppressWarnings ("fallthrough") public static int efaMltExtd (int ea) throws M68kException { 17081: int t, w; 17082: switch (ea) { 17083: case 0b010_000: //(A0) 17084: if (XEiJ.EFA_SEPARATE_AR) { 17085: XEiJ.mpuCycleCount += 24; 17086: return XEiJ.regRn[ 8]; 17087: } 17088: //fallthrough 17089: case 0b010_001: //(A1) 17090: if (XEiJ.EFA_SEPARATE_AR) { 17091: XEiJ.mpuCycleCount += 24; 17092: return XEiJ.regRn[ 9]; 17093: } 17094: //fallthrough 17095: case 0b010_010: //(A2) 17096: if (XEiJ.EFA_SEPARATE_AR) { 17097: XEiJ.mpuCycleCount += 24; 17098: return XEiJ.regRn[10]; 17099: } 17100: //fallthrough 17101: case 0b010_011: //(A3) 17102: if (XEiJ.EFA_SEPARATE_AR) { 17103: XEiJ.mpuCycleCount += 24; 17104: return XEiJ.regRn[11]; 17105: } 17106: //fallthrough 17107: case 0b010_100: //(A4) 17108: if (XEiJ.EFA_SEPARATE_AR) { 17109: XEiJ.mpuCycleCount += 24; 17110: return XEiJ.regRn[12]; 17111: } 17112: //fallthrough 17113: case 0b010_101: //(A5) 17114: if (XEiJ.EFA_SEPARATE_AR) { 17115: XEiJ.mpuCycleCount += 24; 17116: return XEiJ.regRn[13]; 17117: } 17118: //fallthrough 17119: case 0b010_110: //(A6) 17120: if (XEiJ.EFA_SEPARATE_AR) { 17121: XEiJ.mpuCycleCount += 24; 17122: return XEiJ.regRn[14]; 17123: } 17124: //fallthrough 17125: case 0b010_111: //(A7) 17126: if (XEiJ.EFA_SEPARATE_AR) { 17127: XEiJ.mpuCycleCount += 24; 17128: return XEiJ.regRn[15]; 17129: } else { 17130: XEiJ.mpuCycleCount += 24; 17131: return XEiJ.regRn[ea - (0b010_000 - 8)]; 17132: } 17133: case 0b011_000: //(A0)+ 17134: if (XEiJ.EFA_SEPARATE_AR) { 17135: XEiJ.mpuCycleCount += 24; 17136: return (XEiJ.regRn[ 8] += 12) - 12; 17137: } 17138: //fallthrough 17139: case 0b011_001: //(A1)+ 17140: if (XEiJ.EFA_SEPARATE_AR) { 17141: XEiJ.mpuCycleCount += 24; 17142: return (XEiJ.regRn[ 9] += 12) - 12; 17143: } 17144: //fallthrough 17145: case 0b011_010: //(A2)+ 17146: if (XEiJ.EFA_SEPARATE_AR) { 17147: XEiJ.mpuCycleCount += 24; 17148: return (XEiJ.regRn[10] += 12) - 12; 17149: } 17150: //fallthrough 17151: case 0b011_011: //(A3)+ 17152: if (XEiJ.EFA_SEPARATE_AR) { 17153: XEiJ.mpuCycleCount += 24; 17154: return (XEiJ.regRn[11] += 12) - 12; 17155: } 17156: //fallthrough 17157: case 0b011_100: //(A4)+ 17158: if (XEiJ.EFA_SEPARATE_AR) { 17159: XEiJ.mpuCycleCount += 24; 17160: return (XEiJ.regRn[12] += 12) - 12; 17161: } 17162: //fallthrough 17163: case 0b011_101: //(A5)+ 17164: if (XEiJ.EFA_SEPARATE_AR) { 17165: XEiJ.mpuCycleCount += 24; 17166: return (XEiJ.regRn[13] += 12) - 12; 17167: } 17168: //fallthrough 17169: case 0b011_110: //(A6)+ 17170: if (XEiJ.EFA_SEPARATE_AR) { 17171: XEiJ.mpuCycleCount += 24; 17172: return (XEiJ.regRn[14] += 12) - 12; 17173: } 17174: //fallthrough 17175: case 0b011_111: //(A7)+ 17176: if (XEiJ.EFA_SEPARATE_AR) { 17177: XEiJ.mpuCycleCount += 24; 17178: return (XEiJ.regRn[15] += 12) - 12; 17179: } else { 17180: XEiJ.mpuCycleCount += 24; 17181: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12; 17182: } 17183: case 0b100_000: //-(A0) 17184: case 0b100_001: //-(A1) 17185: case 0b100_010: //-(A2) 17186: case 0b100_011: //-(A3) 17187: case 0b100_100: //-(A4) 17188: case 0b100_101: //-(A5) 17189: case 0b100_110: //-(A6) 17190: case 0b100_111: //-(A7) 17191: XEiJ.mpuCycleCount += 26; 17192: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12; 17193: case 0b101_000: //(d16,A0) 17194: case 0b101_001: //(d16,A1) 17195: case 0b101_010: //(d16,A2) 17196: case 0b101_011: //(d16,A3) 17197: case 0b101_100: //(d16,A4) 17198: case 0b101_101: //(d16,A5) 17199: case 0b101_110: //(d16,A6) 17200: case 0b101_111: //(d16,A7) 17201: XEiJ.mpuCycleCount += 28; 17202: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17203: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17204: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17205: } else { 17206: t = XEiJ.regPC; 17207: XEiJ.regPC = t + 2; 17208: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17209: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17210: } 17211: case 0b110_000: //(d8,A0,Rn.wl) 17212: case 0b110_001: //(d8,A1,Rn.wl) 17213: case 0b110_010: //(d8,A2,Rn.wl) 17214: case 0b110_011: //(d8,A3,Rn.wl) 17215: case 0b110_100: //(d8,A4,Rn.wl) 17216: case 0b110_101: //(d8,A5,Rn.wl) 17217: case 0b110_110: //(d8,A6,Rn.wl) 17218: case 0b110_111: //(d8,A7,Rn.wl) 17219: XEiJ.mpuCycleCount += 30; 17220: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17221: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17222: } else { 17223: w = XEiJ.regPC; 17224: XEiJ.regPC = w + 2; 17225: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17226: } 17227: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17228: + (byte) w //バイトディスプレースメント 17229: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17230: XEiJ.regRn[w >> 12])); //ロングインデックス 17231: case 0b111_000: //(xxx).W 17232: XEiJ.mpuCycleCount += 28; 17233: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17234: case 0b111_001: //(xxx).L 17235: XEiJ.mpuCycleCount += 32; 17236: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17237: } //switch 17238: XEiJ.mpuCycleCount += 34; 17239: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17240: throw M68kException.m6eSignal; 17241: } //efaMltExtd 17242: 17243: //a = efaLeaPea (ea) //| M WXZP | 17244: // LEA命令とPEA命令のオペランドの実効アドレスを求める 17245: // efaCntWordとの違いはサイクル数のみ 17246: // LEA命令のベースサイクル数4を含んでいるのでLEA命令ではベースサイクル数を加えなくてよい 17247: // PEA命令のベースサイクル数は12-4=8 17248: @SuppressWarnings ("fallthrough") public static int efaLeaPea (int ea) throws M68kException { 17249: int t, w; 17250: switch (ea) { 17251: case 0b010_000: //(A0) 17252: if (XEiJ.EFA_SEPARATE_AR) { 17253: XEiJ.mpuCycleCount += 4; 17254: return XEiJ.regRn[ 8]; 17255: } 17256: //fallthrough 17257: case 0b010_001: //(A1) 17258: if (XEiJ.EFA_SEPARATE_AR) { 17259: XEiJ.mpuCycleCount += 4; 17260: return XEiJ.regRn[ 9]; 17261: } 17262: //fallthrough 17263: case 0b010_010: //(A2) 17264: if (XEiJ.EFA_SEPARATE_AR) { 17265: XEiJ.mpuCycleCount += 4; 17266: return XEiJ.regRn[10]; 17267: } 17268: //fallthrough 17269: case 0b010_011: //(A3) 17270: if (XEiJ.EFA_SEPARATE_AR) { 17271: XEiJ.mpuCycleCount += 4; 17272: return XEiJ.regRn[11]; 17273: } 17274: //fallthrough 17275: case 0b010_100: //(A4) 17276: if (XEiJ.EFA_SEPARATE_AR) { 17277: XEiJ.mpuCycleCount += 4; 17278: return XEiJ.regRn[12]; 17279: } 17280: //fallthrough 17281: case 0b010_101: //(A5) 17282: if (XEiJ.EFA_SEPARATE_AR) { 17283: XEiJ.mpuCycleCount += 4; 17284: return XEiJ.regRn[13]; 17285: } 17286: //fallthrough 17287: case 0b010_110: //(A6) 17288: if (XEiJ.EFA_SEPARATE_AR) { 17289: XEiJ.mpuCycleCount += 4; 17290: return XEiJ.regRn[14]; 17291: } 17292: //fallthrough 17293: case 0b010_111: //(A7) 17294: if (XEiJ.EFA_SEPARATE_AR) { 17295: XEiJ.mpuCycleCount += 4; 17296: return XEiJ.regRn[15]; 17297: } else { 17298: XEiJ.mpuCycleCount += 4; 17299: return XEiJ.regRn[ea - (0b010_000 - 8)]; 17300: } 17301: case 0b101_000: //(d16,A0) 17302: case 0b101_001: //(d16,A1) 17303: case 0b101_010: //(d16,A2) 17304: case 0b101_011: //(d16,A3) 17305: case 0b101_100: //(d16,A4) 17306: case 0b101_101: //(d16,A5) 17307: case 0b101_110: //(d16,A6) 17308: case 0b101_111: //(d16,A7) 17309: XEiJ.mpuCycleCount += 8; 17310: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17311: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17312: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17313: } else { 17314: t = XEiJ.regPC; 17315: XEiJ.regPC = t + 2; 17316: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17317: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17318: } 17319: case 0b110_000: //(d8,A0,Rn.wl) 17320: case 0b110_001: //(d8,A1,Rn.wl) 17321: case 0b110_010: //(d8,A2,Rn.wl) 17322: case 0b110_011: //(d8,A3,Rn.wl) 17323: case 0b110_100: //(d8,A4,Rn.wl) 17324: case 0b110_101: //(d8,A5,Rn.wl) 17325: case 0b110_110: //(d8,A6,Rn.wl) 17326: case 0b110_111: //(d8,A7,Rn.wl) 17327: XEiJ.mpuCycleCount += 12; 17328: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17329: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17330: } else { 17331: w = XEiJ.regPC; 17332: XEiJ.regPC = w + 2; 17333: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17334: } 17335: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17336: + (byte) w //バイトディスプレースメント 17337: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17338: XEiJ.regRn[w >> 12])); //ロングインデックス 17339: case 0b111_000: //(xxx).W 17340: XEiJ.mpuCycleCount += 8; 17341: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17342: case 0b111_001: //(xxx).L 17343: XEiJ.mpuCycleCount += 12; 17344: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17345: case 0b111_010: //(d16,PC) 17346: XEiJ.mpuCycleCount += 8; 17347: t = XEiJ.regPC; 17348: XEiJ.regPC = t + 2; 17349: return (t //ベースレジスタ 17350: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17351: case 0b111_011: //(d8,PC,Rn.wl) 17352: XEiJ.mpuCycleCount += 12; 17353: t = XEiJ.regPC; 17354: XEiJ.regPC = t + 2; 17355: w = XEiJ.busRwze (t); //pcwz。拡張ワード 17356: return (t //ベースレジスタ 17357: + (byte) w //バイトディスプレースメント 17358: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17359: XEiJ.regRn[w >> 12])); //ロングインデックス 17360: } //switch 17361: XEiJ.mpuCycleCount += 34; 17362: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17363: throw M68kException.m6eSignal; 17364: } //efaLeaPea 17365: 17366: //a = efaJmpJsr (ea) //| M WXZP | 17367: // JMP命令とJSR命令のオペランドの実効アドレスを求める 17368: // efaCntWordとの違いはサイクル数のみ 17369: // JMP命令のベースサイクル数8を含んでいるのでJMP命令ではベースサイクル数を加えなくてよい 17370: // JSR命令のベースサイクル数は16-8=8 17371: @SuppressWarnings ("fallthrough") public static int efaJmpJsr (int ea) throws M68kException { 17372: int t, w; 17373: switch (ea) { 17374: case 0b010_000: //(A0) 17375: if (XEiJ.EFA_SEPARATE_AR) { 17376: XEiJ.mpuCycleCount += 8; 17377: return XEiJ.regRn[ 8]; 17378: } 17379: //fallthrough 17380: case 0b010_001: //(A1) 17381: if (XEiJ.EFA_SEPARATE_AR) { 17382: XEiJ.mpuCycleCount += 8; 17383: return XEiJ.regRn[ 9]; 17384: } 17385: //fallthrough 17386: case 0b010_010: //(A2) 17387: if (XEiJ.EFA_SEPARATE_AR) { 17388: XEiJ.mpuCycleCount += 8; 17389: return XEiJ.regRn[10]; 17390: } 17391: //fallthrough 17392: case 0b010_011: //(A3) 17393: if (XEiJ.EFA_SEPARATE_AR) { 17394: XEiJ.mpuCycleCount += 8; 17395: return XEiJ.regRn[11]; 17396: } 17397: //fallthrough 17398: case 0b010_100: //(A4) 17399: if (XEiJ.EFA_SEPARATE_AR) { 17400: XEiJ.mpuCycleCount += 8; 17401: return XEiJ.regRn[12]; 17402: } 17403: //fallthrough 17404: case 0b010_101: //(A5) 17405: if (XEiJ.EFA_SEPARATE_AR) { 17406: XEiJ.mpuCycleCount += 8; 17407: return XEiJ.regRn[13]; 17408: } 17409: //fallthrough 17410: case 0b010_110: //(A6) 17411: if (XEiJ.EFA_SEPARATE_AR) { 17412: XEiJ.mpuCycleCount += 8; 17413: return XEiJ.regRn[14]; 17414: } 17415: //fallthrough 17416: case 0b010_111: //(A7) 17417: if (XEiJ.EFA_SEPARATE_AR) { 17418: XEiJ.mpuCycleCount += 8; 17419: return XEiJ.regRn[15]; 17420: } else { 17421: XEiJ.mpuCycleCount += 8; 17422: return XEiJ.regRn[ea - (0b010_000 - 8)]; 17423: } 17424: case 0b101_000: //(d16,A0) 17425: case 0b101_001: //(d16,A1) 17426: case 0b101_010: //(d16,A2) 17427: case 0b101_011: //(d16,A3) 17428: case 0b101_100: //(d16,A4) 17429: case 0b101_101: //(d16,A5) 17430: case 0b101_110: //(d16,A6) 17431: case 0b101_111: //(d16,A7) 17432: XEiJ.mpuCycleCount += 10; 17433: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17434: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17435: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17436: } else { 17437: t = XEiJ.regPC; 17438: XEiJ.regPC = t + 2; 17439: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17440: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17441: } 17442: case 0b110_000: //(d8,A0,Rn.wl) 17443: case 0b110_001: //(d8,A1,Rn.wl) 17444: case 0b110_010: //(d8,A2,Rn.wl) 17445: case 0b110_011: //(d8,A3,Rn.wl) 17446: case 0b110_100: //(d8,A4,Rn.wl) 17447: case 0b110_101: //(d8,A5,Rn.wl) 17448: case 0b110_110: //(d8,A6,Rn.wl) 17449: case 0b110_111: //(d8,A7,Rn.wl) 17450: XEiJ.mpuCycleCount += 14; 17451: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17452: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17453: } else { 17454: w = XEiJ.regPC; 17455: XEiJ.regPC = w + 2; 17456: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17457: } 17458: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17459: + (byte) w //バイトディスプレースメント 17460: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17461: XEiJ.regRn[w >> 12])); //ロングインデックス 17462: case 0b111_000: //(xxx).W 17463: XEiJ.mpuCycleCount += 10; 17464: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17465: case 0b111_001: //(xxx).L 17466: XEiJ.mpuCycleCount += 12; 17467: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17468: case 0b111_010: //(d16,PC) 17469: XEiJ.mpuCycleCount += 10; 17470: t = XEiJ.regPC; 17471: XEiJ.regPC = t + 2; 17472: return (t //ベースレジスタ 17473: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17474: case 0b111_011: //(d8,PC,Rn.wl) 17475: XEiJ.mpuCycleCount += 14; 17476: t = XEiJ.regPC; 17477: XEiJ.regPC = t + 2; 17478: w = XEiJ.busRwze (t); //pcwz。拡張ワード 17479: return (t //ベースレジスタ 17480: + (byte) w //バイトディスプレースメント 17481: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17482: XEiJ.regRn[w >> 12])); //ロングインデックス 17483: } //switch 17484: XEiJ.mpuCycleCount += 34; 17485: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17486: throw M68kException.m6eSignal; 17487: } //efaJmpJsr 17488: 17489: 17490: 17491: } //class MC68010 17492: 17493: 17494: