1: //======================================================================================== 2: // MC68000.java 3: // en:MC68010 core 4: // ja:MC68010コア 5: // Copyright (C) 2003-2023 Makoto Kamada 6: // 7: // This file is part of the XEiJ (X68000 Emulator in Java). 8: // You can use, modify and redistribute the XEiJ if the conditions are met. 9: // Read the XEiJ License for more details. 10: // https://stdkmd.net/xeij/ 11: //======================================================================================== 12: 13: package xeij; 14: 15: import java.lang.*; //Boolean,Character,Class,Comparable,Double,Exception,Float,IllegalArgumentException,Integer,Long,Math,Number,Object,Runnable,SecurityException,String,StringBuilder,System 16: 17: public class MC68010 { 18: 19: public static void mpuCore () { 20: 21: //例外ループ 22: // 別のメソッドで検出された例外を命令ループの外側でcatchすることで命令ループを高速化する 23: errorLoop: 24: while (XEiJ.mpuClockTime < XEiJ.mpuClockLimit) { 25: try { 26: //命令ループ 27: while (XEiJ.mpuClockTime < XEiJ.mpuClockLimit) { 28: int t; 29: //命令を実行する 30: XEiJ.mpuTraceFlag = XEiJ.regSRT1; //命令実行前のsrT1 31: XEiJ.mpuCycleCount = 0; //第1オペコードからROMのアクセスウエイトを有効にする。命令のサイクル数はすべてXEiJ.mpuCycleCount+=~で加えること 32: XEiJ.regPC0 = t = XEiJ.regPC; //命令の先頭アドレス 33: XEiJ.regPC = t + 2; 34: XEiJ.regOC = (InstructionBreakPoint.IBP_ON ? InstructionBreakPoint.ibpOp1MemoryMap : DataBreakPoint.DBP_ON ? XEiJ.regSRS != 0 ? XEiJ.busSuperMap : XEiJ.busUserMap : XEiJ.busMemoryMap)[t >>> XEiJ.BUS_PAGE_BITS].mmdRwz (t); //第1オペコード。必ずゼロ拡張すること。pcに奇数が入っていることはないのでアドレスエラーのチェックを省略する 35: 36: //命令の処理 37: // 第1オペコードの上位10bitで分岐する 38: // 分岐方法 39: // XEiJ.IRP_STATIC 40: // 手順 41: // 命令の処理をstaticメソッドに書く 42: // switch(XEiJ.regOC>>>6)で分岐してirpXXX()で呼び出す 43: // Javaはメソッドのサイズに制限があるためswitch(XEiJ.regOC>>>6)の中にすべての命令の処理を書くことができない 44: // C言語のときはswitchの中にすべての命令の処理を書くことができる 45: // 利点 46: // 速い 47: // XEiJ.IRP_ENUM_DIRECT 48: // 手順 49: // 命令の処理をenum bodyのメソッドに書く 50: // switch(XEiJ.regOC>>>6)で分岐してIRP.XXX.exec()で呼び出す 51: // 欠点 52: // XEiJ.IRP_STATICよりも遅い 53: // staticなメソッドを直接呼び出せることに変わりないはずだが、インライン展開などの最適化が弱くなるのかも知れない 54: // XEiJ.IRP_STATICと共存させようとすると命令の処理を2回書かなければならず管理が面倒になる 55: // XEiJ.IRP_ENUM_INDIRECT 56: // 手順 57: // 命令の処理をenum bodyのメソッドに書く 58: // XEiJ.regOCの上位10bit→enum値の配列を用意する 59: // IRPMAP.IRPMAP0[XEiJ.regOC>>>6].exec()で呼び出す 60: // C言語のときは関数を指すポインタの配列が使えるのでIRPMAP0[XEiJ.regOC>>>6]()で済む 61: // 利点 62: // 命令の処理を動的に組み替えることができる 63: // 欠点 64: // XEiJ.IRP_ENUM_DIRECTよりも遅い 65: // 配列参照による多分岐とenum bodyのメソッドの動的呼び出しによる多分岐の2段階になる 66: // XEiJ.IRP_STATICと共存させようとすると命令の処理を2回書かなければならず管理が面倒になる 67: // enum値の配列の初期化コードが大きくなるのでクラスを分ける必要がある 68: irpSwitch: 69: switch (XEiJ.regOC >>> 6) { //第1オペコードの上位10ビット。XEiJ.regOCはゼロ拡張されているので0b1111_111_111&を省略 70: 71: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 72: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 73: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 74: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 75: //ORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_000_mmm_rrr-{data} 76: //OR.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_000_mmm_rrr-{data} [ORI.B #<data>,<ea>] 77: //ORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_000_000_111_100-{data} 78: case 0b0000_000_000: 79: irpOriByte (); 80: break irpSwitch; 81: 82: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 83: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 84: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 85: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 86: //ORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_001_mmm_rrr-{data} 87: //OR.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_001_mmm_rrr-{data} [ORI.W #<data>,<ea>] 88: //ORI.W #<data>,SR |-|012346|P|*****|*****| |0000_000_001_111_100-{data} 89: case 0b0000_000_001: 90: irpOriWord (); 91: break irpSwitch; 92: 93: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 94: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 95: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 96: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 97: //ORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_010_mmm_rrr-{data} 98: //OR.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_010_mmm_rrr-{data} [ORI.L #<data>,<ea>] 99: case 0b0000_000_010: 100: irpOriLong (); 101: break irpSwitch; 102: 103: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 104: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 105: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 106: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 107: //BITREV.L Dr |-|------|-|-----|-----|D |0000_000_011_000_rrr (ISA_C) 108: case 0b0000_000_011: 109: irpCmp2Chk2Byte (); 110: break irpSwitch; 111: 112: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 113: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 114: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 115: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 116: //BTST.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_100_000_rrr 117: //MOVEP.W (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_100_001_rrr-{data} 118: //BTST.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZPI|0000_qqq_100_mmm_rrr 119: case 0b0000_000_100: 120: case 0b0000_001_100: 121: case 0b0000_010_100: 122: case 0b0000_011_100: 123: case 0b0000_100_100: 124: case 0b0000_101_100: 125: case 0b0000_110_100: 126: case 0b0000_111_100: 127: irpBtstReg (); 128: break irpSwitch; 129: 130: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 131: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 132: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 133: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 134: //BCHG.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_101_000_rrr 135: //MOVEP.L (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_101_001_rrr-{data} 136: //BCHG.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_101_mmm_rrr 137: case 0b0000_000_101: 138: case 0b0000_001_101: 139: case 0b0000_010_101: 140: case 0b0000_011_101: 141: case 0b0000_100_101: 142: case 0b0000_101_101: 143: case 0b0000_110_101: 144: case 0b0000_111_101: 145: irpBchgReg (); 146: break irpSwitch; 147: 148: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 149: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 150: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 152: //BCLR.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_110_000_rrr 153: //MOVEP.W Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_110_001_rrr-{data} 154: //BCLR.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_110_mmm_rrr 155: case 0b0000_000_110: 156: case 0b0000_001_110: 157: case 0b0000_010_110: 158: case 0b0000_011_110: 159: case 0b0000_100_110: 160: case 0b0000_101_110: 161: case 0b0000_110_110: 162: case 0b0000_111_110: 163: irpBclrReg (); 164: break irpSwitch; 165: 166: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 167: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 168: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 169: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 170: //BSET.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_111_000_rrr 171: //MOVEP.L Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_111_001_rrr-{data} 172: //BSET.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_111_mmm_rrr 173: case 0b0000_000_111: 174: case 0b0000_001_111: 175: case 0b0000_010_111: 176: case 0b0000_011_111: 177: case 0b0000_100_111: 178: case 0b0000_101_111: 179: case 0b0000_110_111: 180: case 0b0000_111_111: 181: irpBsetReg (); 182: break irpSwitch; 183: 184: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 185: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 186: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 187: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 188: //ANDI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_000_mmm_rrr-{data} 189: //AND.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_000_mmm_rrr-{data} [ANDI.B #<data>,<ea>] 190: //ANDI.B #<data>,CCR |-|012346|-|*****|*****| |0000_001_000_111_100-{data} 191: case 0b0000_001_000: 192: irpAndiByte (); 193: break irpSwitch; 194: 195: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 196: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 197: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 198: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 199: //ANDI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_001_mmm_rrr-{data} 200: //AND.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_001_mmm_rrr-{data} [ANDI.W #<data>,<ea>] 201: //ANDI.W #<data>,SR |-|012346|P|*****|*****| |0000_001_001_111_100-{data} 202: case 0b0000_001_001: 203: irpAndiWord (); 204: break irpSwitch; 205: 206: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 207: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 208: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 209: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 210: //ANDI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_010_mmm_rrr-{data} 211: //AND.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_010_mmm_rrr-{data} [ANDI.L #<data>,<ea>] 212: case 0b0000_001_010: 213: irpAndiLong (); 214: break irpSwitch; 215: 216: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 217: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 218: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 219: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 220: //BYTEREV.L Dr |-|------|-|-----|-----|D |0000_001_011_000_rrr (ISA_C) 221: case 0b0000_001_011: 222: irpCmp2Chk2Word (); 223: break irpSwitch; 224: 225: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 226: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 227: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 228: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 229: //SUBI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_000_mmm_rrr-{data} 230: //SUB.B #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_000_mmm_rrr-{data} [SUBI.B #<data>,<ea>] 231: case 0b0000_010_000: 232: irpSubiByte (); 233: break irpSwitch; 234: 235: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 236: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 237: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 238: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 239: //SUBI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_001_mmm_rrr-{data} 240: //SUB.W #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_001_mmm_rrr-{data} [SUBI.W #<data>,<ea>] 241: case 0b0000_010_001: 242: irpSubiWord (); 243: break irpSwitch; 244: 245: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 246: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 247: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 248: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 249: //SUBI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_010_mmm_rrr-{data} 250: //SUB.L #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_010_mmm_rrr-{data} [SUBI.L #<data>,<ea>] 251: case 0b0000_010_010: 252: irpSubiLong (); 253: break irpSwitch; 254: 255: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 256: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 257: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 258: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 259: //FF1.L Dr |-|------|-|-UUUU|-**00|D |0000_010_011_000_rrr (ISA_C) 260: case 0b0000_010_011: 261: irpCmp2Chk2Long (); 262: break irpSwitch; 263: 264: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 265: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 266: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 267: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 268: //ADDI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_000_mmm_rrr-{data} 269: case 0b0000_011_000: 270: irpAddiByte (); 271: break irpSwitch; 272: 273: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 274: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 275: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 276: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 277: //ADDI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_001_mmm_rrr-{data} 278: case 0b0000_011_001: 279: irpAddiWord (); 280: break irpSwitch; 281: 282: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 283: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 284: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 285: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 286: //ADDI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_010_mmm_rrr-{data} 287: case 0b0000_011_010: 288: irpAddiLong (); 289: break irpSwitch; 290: 291: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 292: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 293: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 294: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 295: //BTST.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_000_000_rrr-{data} 296: //BTST.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZP |0000_100_000_mmm_rrr-{data} 297: case 0b0000_100_000: 298: irpBtstImm (); 299: break irpSwitch; 300: 301: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 302: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 303: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 304: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 305: //BCHG.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_001_000_rrr-{data} 306: //BCHG.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_001_mmm_rrr-{data} 307: case 0b0000_100_001: 308: irpBchgImm (); 309: break irpSwitch; 310: 311: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 312: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 313: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 314: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 315: //BCLR.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_010_000_rrr-{data} 316: //BCLR.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_010_mmm_rrr-{data} 317: case 0b0000_100_010: 318: irpBclrImm (); 319: break irpSwitch; 320: 321: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 322: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 323: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 325: //BSET.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_011_000_rrr-{data} 326: //BSET.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_011_mmm_rrr-{data} 327: case 0b0000_100_011: 328: irpBsetImm (); 329: break irpSwitch; 330: 331: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 332: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 333: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 334: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 335: //EORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} 336: //EOR.B #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} [EORI.B #<data>,<ea>] 337: //EORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_101_000_111_100-{data} 338: case 0b0000_101_000: 339: irpEoriByte (); 340: break irpSwitch; 341: 342: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 343: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 344: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 345: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 346: //EORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} 347: //EOR.W #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} [EORI.W #<data>,<ea>] 348: //EORI.W #<data>,SR |-|012346|P|*****|*****| |0000_101_001_111_100-{data} 349: case 0b0000_101_001: 350: irpEoriWord (); 351: break irpSwitch; 352: 353: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 354: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 355: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 356: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 357: //EORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} 358: //EOR.L #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} [EORI.L #<data>,<ea>] 359: case 0b0000_101_010: 360: irpEoriLong (); 361: break irpSwitch; 362: 363: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 364: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 365: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 366: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 367: //CMPI.B #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_000_mmm_rrr-{data} 368: //CMP.B #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_000_mmm_rrr-{data} [CMPI.B #<data>,<ea>] 369: case 0b0000_110_000: 370: irpCmpiByte (); 371: break irpSwitch; 372: 373: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 374: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 375: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 376: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 377: //CMPI.W #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_001_mmm_rrr-{data} 378: //CMP.W #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_001_mmm_rrr-{data} [CMPI.W #<data>,<ea>] 379: case 0b0000_110_001: 380: irpCmpiWord (); 381: break irpSwitch; 382: 383: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 384: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 385: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 387: //CMPI.L #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_010_mmm_rrr-{data} 388: //CMP.L #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_010_mmm_rrr-{data} [CMPI.L #<data>,<ea>] 389: case 0b0000_110_010: 390: irpCmpiLong (); 391: break irpSwitch; 392: 393: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 394: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 395: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 396: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 397: //MOVES.B <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn000000000000 398: //MOVES.B Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn100000000000 399: case 0b0000_111_000: 400: irpMovesByte (); 401: break irpSwitch; 402: 403: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 404: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 405: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 406: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 407: //MOVES.W <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn000000000000 408: //MOVES.W Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn100000000000 409: case 0b0000_111_001: 410: irpMovesWord (); 411: break irpSwitch; 412: 413: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 414: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 415: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 416: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 417: //MOVES.L <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn000000000000 418: //MOVES.L Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn100000000000 419: case 0b0000_111_010: 420: irpMovesLong (); 421: break irpSwitch; 422: 423: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 424: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 425: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 426: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 427: //MOVE.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr 428: case 0b0001_000_000: 429: case 0b0001_001_000: 430: case 0b0001_010_000: 431: case 0b0001_011_000: 432: case 0b0001_100_000: 433: case 0b0001_101_000: 434: case 0b0001_110_000: 435: case 0b0001_111_000: 436: irpMoveToDRByte (); 437: break irpSwitch; 438: 439: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 440: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 441: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 442: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 443: //MOVE.B <ea>,(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr 444: case 0b0001_000_010: 445: case 0b0001_001_010: 446: case 0b0001_010_010: 447: case 0b0001_011_010: 448: case 0b0001_100_010: 449: case 0b0001_101_010: 450: case 0b0001_110_010: 451: case 0b0001_111_010: 452: irpMoveToMMByte (); 453: break irpSwitch; 454: 455: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 456: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 457: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 458: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 459: //MOVE.B <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr 460: case 0b0001_000_011: 461: case 0b0001_001_011: 462: case 0b0001_010_011: 463: case 0b0001_011_011: 464: case 0b0001_100_011: 465: case 0b0001_101_011: 466: case 0b0001_110_011: 467: case 0b0001_111_011: 468: irpMoveToMPByte (); 469: break irpSwitch; 470: 471: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 472: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 473: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 474: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 475: //MOVE.B <ea>,-(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr 476: case 0b0001_000_100: 477: case 0b0001_001_100: 478: case 0b0001_010_100: 479: case 0b0001_011_100: 480: case 0b0001_100_100: 481: case 0b0001_101_100: 482: case 0b0001_110_100: 483: case 0b0001_111_100: 484: irpMoveToMNByte (); 485: break irpSwitch; 486: 487: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 488: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 489: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 491: //MOVE.B <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr 492: case 0b0001_000_101: 493: case 0b0001_001_101: 494: case 0b0001_010_101: 495: case 0b0001_011_101: 496: case 0b0001_100_101: 497: case 0b0001_101_101: 498: case 0b0001_110_101: 499: case 0b0001_111_101: 500: irpMoveToMWByte (); 501: break irpSwitch; 502: 503: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 504: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 505: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 506: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 507: //MOVE.B <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr 508: case 0b0001_000_110: 509: case 0b0001_001_110: 510: case 0b0001_010_110: 511: case 0b0001_011_110: 512: case 0b0001_100_110: 513: case 0b0001_101_110: 514: case 0b0001_110_110: 515: case 0b0001_111_110: 516: irpMoveToMXByte (); 517: break irpSwitch; 518: 519: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 520: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 521: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 522: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 523: //MOVE.B <ea>,(xxx).W |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr 524: case 0b0001_000_111: 525: irpMoveToZWByte (); 526: break irpSwitch; 527: 528: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 529: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 530: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 531: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 532: //MOVE.B <ea>,(xxx).L |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr 533: case 0b0001_001_111: 534: irpMoveToZLByte (); 535: break irpSwitch; 536: 537: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 538: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 539: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 540: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 541: //MOVE.L <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr 542: case 0b0010_000_000: 543: case 0b0010_001_000: 544: case 0b0010_010_000: 545: case 0b0010_011_000: 546: case 0b0010_100_000: 547: case 0b0010_101_000: 548: case 0b0010_110_000: 549: case 0b0010_111_000: 550: irpMoveToDRLong (); 551: break irpSwitch; 552: 553: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 554: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 555: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 556: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 557: //MOVEA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr 558: //MOVE.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq] 559: case 0b0010_000_001: 560: case 0b0010_001_001: 561: case 0b0010_010_001: 562: case 0b0010_011_001: 563: case 0b0010_100_001: 564: case 0b0010_101_001: 565: case 0b0010_110_001: 566: case 0b0010_111_001: 567: irpMoveaLong (); 568: break irpSwitch; 569: 570: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 571: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 572: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 573: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 574: //MOVE.L <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr 575: case 0b0010_000_010: 576: case 0b0010_001_010: 577: case 0b0010_010_010: 578: case 0b0010_011_010: 579: case 0b0010_100_010: 580: case 0b0010_101_010: 581: case 0b0010_110_010: 582: case 0b0010_111_010: 583: irpMoveToMMLong (); 584: break irpSwitch; 585: 586: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 587: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 588: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 589: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 590: //MOVE.L <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr 591: case 0b0010_000_011: 592: case 0b0010_001_011: 593: case 0b0010_010_011: 594: case 0b0010_011_011: 595: case 0b0010_100_011: 596: case 0b0010_101_011: 597: case 0b0010_110_011: 598: case 0b0010_111_011: 599: irpMoveToMPLong (); 600: break irpSwitch; 601: 602: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 603: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 604: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 605: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 606: //MOVE.L <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr 607: case 0b0010_000_100: 608: case 0b0010_001_100: 609: case 0b0010_010_100: 610: case 0b0010_011_100: 611: case 0b0010_100_100: 612: case 0b0010_101_100: 613: case 0b0010_110_100: 614: case 0b0010_111_100: 615: irpMoveToMNLong (); 616: break irpSwitch; 617: 618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 619: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 620: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 622: //MOVE.L <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr 623: case 0b0010_000_101: 624: case 0b0010_001_101: 625: case 0b0010_010_101: 626: case 0b0010_011_101: 627: case 0b0010_100_101: 628: case 0b0010_101_101: 629: case 0b0010_110_101: 630: case 0b0010_111_101: 631: irpMoveToMWLong (); 632: break irpSwitch; 633: 634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 635: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 636: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 637: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 638: //MOVE.L <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr 639: case 0b0010_000_110: 640: case 0b0010_001_110: 641: case 0b0010_010_110: 642: case 0b0010_011_110: 643: case 0b0010_100_110: 644: case 0b0010_101_110: 645: case 0b0010_110_110: 646: case 0b0010_111_110: 647: irpMoveToMXLong (); 648: break irpSwitch; 649: 650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 651: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 652: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 654: //MOVE.L <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr 655: case 0b0010_000_111: 656: irpMoveToZWLong (); 657: break irpSwitch; 658: 659: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 660: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 661: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 662: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 663: //MOVE.L <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr 664: case 0b0010_001_111: 665: irpMoveToZLLong (); 666: break irpSwitch; 667: 668: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 669: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 670: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 671: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 672: //MOVE.W <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr 673: case 0b0011_000_000: 674: case 0b0011_001_000: 675: case 0b0011_010_000: 676: case 0b0011_011_000: 677: case 0b0011_100_000: 678: case 0b0011_101_000: 679: case 0b0011_110_000: 680: case 0b0011_111_000: 681: irpMoveToDRWord (); 682: break irpSwitch; 683: 684: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 685: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 686: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 687: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 688: //MOVEA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr 689: //MOVE.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq] 690: case 0b0011_000_001: 691: case 0b0011_001_001: 692: case 0b0011_010_001: 693: case 0b0011_011_001: 694: case 0b0011_100_001: 695: case 0b0011_101_001: 696: case 0b0011_110_001: 697: case 0b0011_111_001: 698: irpMoveaWord (); 699: break irpSwitch; 700: 701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 702: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 703: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 704: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 705: //MOVE.W <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr 706: case 0b0011_000_010: 707: case 0b0011_001_010: 708: case 0b0011_010_010: 709: case 0b0011_011_010: 710: case 0b0011_100_010: 711: case 0b0011_101_010: 712: case 0b0011_110_010: 713: case 0b0011_111_010: 714: irpMoveToMMWord (); 715: break irpSwitch; 716: 717: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 718: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 719: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 720: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 721: //MOVE.W <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr 722: case 0b0011_000_011: 723: case 0b0011_001_011: 724: case 0b0011_010_011: 725: case 0b0011_011_011: 726: case 0b0011_100_011: 727: case 0b0011_101_011: 728: case 0b0011_110_011: 729: case 0b0011_111_011: 730: irpMoveToMPWord (); 731: break irpSwitch; 732: 733: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 734: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 735: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 736: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 737: //MOVE.W <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr 738: case 0b0011_000_100: 739: case 0b0011_001_100: 740: case 0b0011_010_100: 741: case 0b0011_011_100: 742: case 0b0011_100_100: 743: case 0b0011_101_100: 744: case 0b0011_110_100: 745: case 0b0011_111_100: 746: irpMoveToMNWord (); 747: break irpSwitch; 748: 749: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 750: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 751: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 752: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 753: //MOVE.W <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr 754: case 0b0011_000_101: 755: case 0b0011_001_101: 756: case 0b0011_010_101: 757: case 0b0011_011_101: 758: case 0b0011_100_101: 759: case 0b0011_101_101: 760: case 0b0011_110_101: 761: case 0b0011_111_101: 762: irpMoveToMWWord (); 763: break irpSwitch; 764: 765: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 766: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 767: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 768: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 769: //MOVE.W <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr 770: case 0b0011_000_110: 771: case 0b0011_001_110: 772: case 0b0011_010_110: 773: case 0b0011_011_110: 774: case 0b0011_100_110: 775: case 0b0011_101_110: 776: case 0b0011_110_110: 777: case 0b0011_111_110: 778: irpMoveToMXWord (); 779: break irpSwitch; 780: 781: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 782: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 783: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 784: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 785: //MOVE.W <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr 786: case 0b0011_000_111: 787: irpMoveToZWWord (); 788: break irpSwitch; 789: 790: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 791: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 792: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 793: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 794: //MOVE.W <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr 795: case 0b0011_001_111: 796: irpMoveToZLWord (); 797: break irpSwitch; 798: 799: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 800: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 801: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 802: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 803: //NEGX.B <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_000_mmm_rrr 804: case 0b0100_000_000: 805: irpNegxByte (); 806: break irpSwitch; 807: 808: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 809: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 810: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 812: //NEGX.W <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_001_mmm_rrr 813: case 0b0100_000_001: 814: irpNegxWord (); 815: break irpSwitch; 816: 817: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 818: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 819: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 820: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 821: //NEGX.L <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_010_mmm_rrr 822: case 0b0100_000_010: 823: irpNegxLong (); 824: break irpSwitch; 825: 826: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 827: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 828: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 829: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 830: //MOVE.W SR,<ea> |-|-12346|P|*****|-----|D M+-WXZ |0100_000_011_mmm_rrr 831: case 0b0100_000_011: 832: irpMoveFromSR (); 833: break irpSwitch; 834: 835: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 836: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 837: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 838: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 839: //CHK.W <ea>,Dq |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr 840: case 0b0100_000_110: 841: case 0b0100_001_110: 842: case 0b0100_010_110: 843: case 0b0100_011_110: 844: case 0b0100_100_110: 845: case 0b0100_101_110: 846: case 0b0100_110_110: 847: case 0b0100_111_110: 848: irpChkWord (); 849: break irpSwitch; 850: 851: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 852: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 853: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 854: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 855: //LEA.L <ea>,Aq |-|012346|-|-----|-----| M WXZP |0100_qqq_111_mmm_rrr 856: case 0b0100_000_111: 857: case 0b0100_001_111: 858: case 0b0100_010_111: 859: case 0b0100_011_111: 860: case 0b0100_100_111: 861: case 0b0100_101_111: 862: case 0b0100_110_111: 863: case 0b0100_111_111: 864: irpLea (); 865: break irpSwitch; 866: 867: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 868: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 869: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 870: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 871: //CLR.B <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_000_mmm_rrr (68000 and 68008 read before clear) 872: case 0b0100_001_000: 873: irpClrByte (); 874: break irpSwitch; 875: 876: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 877: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 878: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 879: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 880: //CLR.W <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_001_mmm_rrr (68000 and 68008 read before clear) 881: case 0b0100_001_001: 882: irpClrWord (); 883: break irpSwitch; 884: 885: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 886: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 887: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 888: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 889: //CLR.L <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_010_mmm_rrr (68000 and 68008 read before clear) 890: case 0b0100_001_010: 891: irpClrLong (); 892: break irpSwitch; 893: 894: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 895: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 896: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 897: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 898: //MOVE.W CCR,<ea> |-|-12346|-|*****|-----|D M+-WXZ |0100_001_011_mmm_rrr 899: case 0b0100_001_011: 900: irpMoveFromCCR (); 901: break irpSwitch; 902: 903: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 904: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 905: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 906: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 907: //NEG.B <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_000_mmm_rrr 908: case 0b0100_010_000: 909: irpNegByte (); 910: break irpSwitch; 911: 912: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 913: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 914: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 915: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 916: //NEG.W <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_001_mmm_rrr 917: case 0b0100_010_001: 918: irpNegWord (); 919: break irpSwitch; 920: 921: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 922: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 923: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 924: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 925: //NEG.L <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_010_mmm_rrr 926: case 0b0100_010_010: 927: irpNegLong (); 928: break irpSwitch; 929: 930: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 931: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 932: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 933: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 934: //MOVE.W <ea>,CCR |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr 935: case 0b0100_010_011: 936: irpMoveToCCR (); 937: break irpSwitch; 938: 939: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 940: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 941: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 942: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 943: //NOT.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_000_mmm_rrr 944: case 0b0100_011_000: 945: irpNotByte (); 946: break irpSwitch; 947: 948: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 949: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 950: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 951: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 952: //NOT.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_001_mmm_rrr 953: case 0b0100_011_001: 954: irpNotWord (); 955: break irpSwitch; 956: 957: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 958: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 959: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 960: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 961: //NOT.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_010_mmm_rrr 962: case 0b0100_011_010: 963: irpNotLong (); 964: break irpSwitch; 965: 966: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 967: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 968: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 969: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 970: //MOVE.W <ea>,SR |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr 971: case 0b0100_011_011: 972: irpMoveToSR (); 973: break irpSwitch; 974: 975: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 976: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 977: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 978: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 979: //NBCD.B <ea> |-|012346|-|UUUUU|*U*U*|D M+-WXZ |0100_100_000_mmm_rrr 980: case 0b0100_100_000: 981: irpNbcd (); 982: break irpSwitch; 983: 984: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 985: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 986: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 987: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 988: //SWAP.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_001_000_rrr 989: //BKPT #<data> |-|-12346|-|-----|-----| |0100_100_001_001_ddd 990: //PEA.L <ea> |-|012346|-|-----|-----| M WXZP |0100_100_001_mmm_rrr 991: case 0b0100_100_001: 992: irpPea (); 993: break irpSwitch; 994: 995: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 996: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 997: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 998: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 999: //EXT.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_010_000_rrr 1000: //MOVEM.W <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_010_mmm_rrr-llllllllllllllll 1001: case 0b0100_100_010: 1002: irpMovemToMemWord (); 1003: break irpSwitch; 1004: 1005: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1006: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1007: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1008: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1009: //EXT.L Dr |-|012346|-|-UUUU|-**00|D |0100_100_011_000_rrr 1010: //MOVEM.L <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_011_mmm_rrr-llllllllllllllll 1011: case 0b0100_100_011: 1012: irpMovemToMemLong (); 1013: break irpSwitch; 1014: 1015: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1016: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1017: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1018: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1019: //TST.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_000_mmm_rrr 1020: case 0b0100_101_000: 1021: irpTstByte (); 1022: break irpSwitch; 1023: 1024: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1025: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1026: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1027: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1028: //TST.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_001_mmm_rrr 1029: case 0b0100_101_001: 1030: irpTstWord (); 1031: break irpSwitch; 1032: 1033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1034: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1035: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1036: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1037: //TST.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_010_mmm_rrr 1038: case 0b0100_101_010: 1039: irpTstLong (); 1040: break irpSwitch; 1041: 1042: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1043: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1044: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1045: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1046: //TAS.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_011_mmm_rrr 1047: //ILLEGAL |-|012346|-|-----|-----| |0100_101_011_111_100 1048: case 0b0100_101_011: 1049: irpTas (); 1050: break irpSwitch; 1051: 1052: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1053: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1054: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1055: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1056: //SATS.L Dr |-|------|-|-UUUU|-**00|D |0100_110_010_000_rrr (ISA_B) 1057: //MOVEM.W <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll 1058: case 0b0100_110_010: 1059: irpMovemToRegWord (); 1060: break irpSwitch; 1061: 1062: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1063: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1064: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1065: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1066: //MOVEM.L <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll 1067: case 0b0100_110_011: 1068: irpMovemToRegLong (); 1069: break irpSwitch; 1070: 1071: case 0b0100_111_001: 1072: switch (XEiJ.regOC & 0b111_111) { 1073: 1074: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1075: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1076: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1078: //TRAP #<vector> |-|012346|-|-----|-----| |0100_111_001_00v_vvv 1079: case 0b000_000: 1080: case 0b000_001: 1081: case 0b000_010: 1082: case 0b000_011: 1083: case 0b000_100: 1084: case 0b000_101: 1085: case 0b000_110: 1086: case 0b000_111: 1087: case 0b001_000: 1088: case 0b001_001: 1089: case 0b001_010: 1090: case 0b001_011: 1091: case 0b001_100: 1092: case 0b001_101: 1093: case 0b001_110: 1094: irpTrap (); 1095: break irpSwitch; 1096: case 0b001_111: 1097: irpTrap15 (); 1098: break irpSwitch; 1099: 1100: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1101: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1102: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1103: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1104: //LINK.W Ar,#<data> |-|012346|-|-----|-----| |0100_111_001_010_rrr-{data} 1105: case 0b010_000: 1106: case 0b010_001: 1107: case 0b010_010: 1108: case 0b010_011: 1109: case 0b010_100: 1110: case 0b010_101: 1111: case 0b010_110: 1112: case 0b010_111: 1113: irpLinkWord (); 1114: break irpSwitch; 1115: 1116: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1117: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1118: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1119: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1120: //UNLK Ar |-|012346|-|-----|-----| |0100_111_001_011_rrr 1121: case 0b011_000: 1122: case 0b011_001: 1123: case 0b011_010: 1124: case 0b011_011: 1125: case 0b011_100: 1126: case 0b011_101: 1127: case 0b011_110: 1128: case 0b011_111: 1129: irpUnlk (); 1130: break irpSwitch; 1131: 1132: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1133: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1134: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1135: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1136: //MOVE.L Ar,USP |-|012346|P|-----|-----| |0100_111_001_100_rrr 1137: case 0b100_000: 1138: case 0b100_001: 1139: case 0b100_010: 1140: case 0b100_011: 1141: case 0b100_100: 1142: case 0b100_101: 1143: case 0b100_110: 1144: case 0b100_111: 1145: irpMoveToUsp (); 1146: break irpSwitch; 1147: 1148: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1149: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1150: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1151: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1152: //MOVE.L USP,Ar |-|012346|P|-----|-----| |0100_111_001_101_rrr 1153: case 0b101_000: 1154: case 0b101_001: 1155: case 0b101_010: 1156: case 0b101_011: 1157: case 0b101_100: 1158: case 0b101_101: 1159: case 0b101_110: 1160: case 0b101_111: 1161: irpMoveFromUsp (); 1162: break irpSwitch; 1163: 1164: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1165: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1166: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1167: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1168: //RESET |-|012346|P|-----|-----| |0100_111_001_110_000 1169: case 0b110_000: 1170: irpReset (); 1171: break irpSwitch; 1172: 1173: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1174: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1175: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1176: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1177: //NOP |-|012346|-|-----|-----| |0100_111_001_110_001 1178: case 0b110_001: 1179: irpNop (); 1180: break irpSwitch; 1181: 1182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1183: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1184: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1185: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1186: //STOP #<data> |-|012346|P|UUUUU|*****| |0100_111_001_110_010-{data} 1187: case 0b110_010: 1188: irpStop (); 1189: break irpSwitch; 1190: 1191: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1192: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1193: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1194: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1195: //RTE |-|012346|P|UUUUU|*****| |0100_111_001_110_011 1196: case 0b110_011: 1197: irpRte (); 1198: break irpSwitch; 1199: 1200: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1201: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1202: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1203: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1204: //RTD #<data> |-|-12346|-|-----|-----| |0100_111_001_110_100-{data} 1205: case 0b110_100: 1206: irpRtd (); 1207: break irpSwitch; 1208: 1209: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1210: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1211: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1213: //RTS |-|012346|-|-----|-----| |0100_111_001_110_101 1214: case 0b110_101: 1215: irpRts (); 1216: break irpSwitch; 1217: 1218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1219: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1220: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1222: //TRAPV |-|012346|-|---*-|-----| |0100_111_001_110_110 1223: case 0b110_110: 1224: irpTrapv (); 1225: break irpSwitch; 1226: 1227: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1228: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1229: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1230: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1231: //RTR |-|012346|-|UUUUU|*****| |0100_111_001_110_111 1232: case 0b110_111: 1233: irpRtr (); 1234: break irpSwitch; 1235: 1236: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1237: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1238: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1239: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1240: //MOVEC.L Rc,Rn |-|-12346|P|-----|-----| |0100_111_001_111_010-rnnncccccccccccc 1241: case 0b111_010: 1242: irpMovecFromControl (); 1243: break irpSwitch; 1244: 1245: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1246: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1247: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1248: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1249: //MOVEC.L Rn,Rc |-|-12346|P|-----|-----| |0100_111_001_111_011-rnnncccccccccccc 1250: case 0b111_011: 1251: irpMovecToControl (); 1252: break irpSwitch; 1253: 1254: default: 1255: irpIllegal (); 1256: 1257: } //switch XEiJ.regOC & 0b111_111 1258: break irpSwitch; 1259: 1260: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1261: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1262: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1263: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1264: //JSR <ea> |-|012346|-|-----|-----| M WXZP |0100_111_010_mmm_rrr 1265: //JBSR.L <label> |A|012346|-|-----|-----| |0100_111_010_111_001-{address} [JSR <label>] 1266: case 0b0100_111_010: 1267: irpJsr (); 1268: break irpSwitch; 1269: 1270: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1271: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1272: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1273: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1274: //JMP <ea> |-|012346|-|-----|-----| M WXZP |0100_111_011_mmm_rrr 1275: //JBRA.L <label> |A|012346|-|-----|-----| |0100_111_011_111_001-{address} [JMP <label>] 1276: case 0b0100_111_011: 1277: irpJmp (); 1278: break irpSwitch; 1279: 1280: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1281: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1282: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1283: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1284: //ADDQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_000_mmm_rrr 1285: //INC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>] 1286: case 0b0101_000_000: 1287: case 0b0101_001_000: 1288: case 0b0101_010_000: 1289: case 0b0101_011_000: 1290: case 0b0101_100_000: 1291: case 0b0101_101_000: 1292: case 0b0101_110_000: 1293: case 0b0101_111_000: 1294: irpAddqByte (); 1295: break irpSwitch; 1296: 1297: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1298: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1299: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1300: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1301: //ADDQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_001_mmm_rrr 1302: //ADDQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_001_001_rrr 1303: //INC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>] 1304: //INC.W Ar |A|012346|-|-----|-----| A |0101_001_001_001_rrr [ADDQ.W #1,Ar] 1305: case 0b0101_000_001: 1306: case 0b0101_001_001: 1307: case 0b0101_010_001: 1308: case 0b0101_011_001: 1309: case 0b0101_100_001: 1310: case 0b0101_101_001: 1311: case 0b0101_110_001: 1312: case 0b0101_111_001: 1313: irpAddqWord (); 1314: break irpSwitch; 1315: 1316: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1317: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1318: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1319: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1320: //ADDQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_010_mmm_rrr 1321: //ADDQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_010_001_rrr 1322: //INC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>] 1323: //INC.L Ar |A|012346|-|-----|-----| A |0101_001_010_001_rrr [ADDQ.L #1,Ar] 1324: case 0b0101_000_010: 1325: case 0b0101_001_010: 1326: case 0b0101_010_010: 1327: case 0b0101_011_010: 1328: case 0b0101_100_010: 1329: case 0b0101_101_010: 1330: case 0b0101_110_010: 1331: case 0b0101_111_010: 1332: irpAddqLong (); 1333: break irpSwitch; 1334: 1335: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1336: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1337: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1338: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1339: //ST.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr 1340: //SNF.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr [ST.B <ea>] 1341: //DBT.W Dr,<label> |-|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} 1342: //DBNF.W Dr,<label> |A|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} [DBT.W Dr,<label>] 1343: case 0b0101_000_011: 1344: irpSt (); 1345: break irpSwitch; 1346: 1347: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1348: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1349: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1350: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1351: //SUBQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_100_mmm_rrr 1352: //DEC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>] 1353: case 0b0101_000_100: 1354: case 0b0101_001_100: 1355: case 0b0101_010_100: 1356: case 0b0101_011_100: 1357: case 0b0101_100_100: 1358: case 0b0101_101_100: 1359: case 0b0101_110_100: 1360: case 0b0101_111_100: 1361: irpSubqByte (); 1362: break irpSwitch; 1363: 1364: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1365: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1366: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1367: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1368: //SUBQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_101_mmm_rrr 1369: //SUBQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_101_001_rrr 1370: //DEC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>] 1371: //DEC.W Ar |A|012346|-|-----|-----| A |0101_001_101_001_rrr [SUBQ.W #1,Ar] 1372: case 0b0101_000_101: 1373: case 0b0101_001_101: 1374: case 0b0101_010_101: 1375: case 0b0101_011_101: 1376: case 0b0101_100_101: 1377: case 0b0101_101_101: 1378: case 0b0101_110_101: 1379: case 0b0101_111_101: 1380: irpSubqWord (); 1381: break irpSwitch; 1382: 1383: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1384: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1385: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1387: //SUBQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_110_mmm_rrr 1388: //SUBQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_110_001_rrr 1389: //DEC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>] 1390: //DEC.L Ar |A|012346|-|-----|-----| A |0101_001_110_001_rrr [SUBQ.L #1,Ar] 1391: case 0b0101_000_110: 1392: case 0b0101_001_110: 1393: case 0b0101_010_110: 1394: case 0b0101_011_110: 1395: case 0b0101_100_110: 1396: case 0b0101_101_110: 1397: case 0b0101_110_110: 1398: case 0b0101_111_110: 1399: irpSubqLong (); 1400: break irpSwitch; 1401: 1402: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1403: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1404: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1405: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1406: //SF.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr 1407: //SNT.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr [SF.B <ea>] 1408: //DBF.W Dr,<label> |-|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} 1409: //DBNT.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 1410: //DBRA.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 1411: case 0b0101_000_111: 1412: irpSf (); 1413: break irpSwitch; 1414: 1415: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1416: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1417: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1418: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1419: //SHI.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr 1420: //SNLS.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr [SHI.B <ea>] 1421: //DBHI.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} 1422: //DBNLS.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} [DBHI.W Dr,<label>] 1423: case 0b0101_001_011: 1424: irpShi (); 1425: break irpSwitch; 1426: 1427: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1428: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1429: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1430: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1431: //SLS.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr 1432: //SNHI.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr [SLS.B <ea>] 1433: //DBLS.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} 1434: //DBNHI.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} [DBLS.W Dr,<label>] 1435: case 0b0101_001_111: 1436: irpSls (); 1437: break irpSwitch; 1438: 1439: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1440: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1441: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1442: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1443: //SCC.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr 1444: //SHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1445: //SNCS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1446: //SNLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 1447: //DBCC.W Dr,<label> |-|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} 1448: //DBHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1449: //DBNCS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1450: //DBNLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 1451: case 0b0101_010_011: 1452: irpShs (); 1453: break irpSwitch; 1454: 1455: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1456: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1457: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1458: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1459: //SCS.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr 1460: //SLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1461: //SNCC.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1462: //SNHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 1463: //DBCS.W Dr,<label> |-|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} 1464: //DBLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1465: //DBNCC.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1466: //DBNHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 1467: case 0b0101_010_111: 1468: irpSlo (); 1469: break irpSwitch; 1470: 1471: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1472: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1473: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1474: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1475: //SNE.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr 1476: //SNEQ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1477: //SNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1478: //SNZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 1479: //DBNE.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} 1480: //DBNEQ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1481: //DBNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1482: //DBNZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 1483: case 0b0101_011_011: 1484: irpSne (); 1485: break irpSwitch; 1486: 1487: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1488: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1489: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1491: //SEQ.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr 1492: //SNNE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1493: //SNNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1494: //SZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 1495: //DBEQ.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} 1496: //DBNNE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1497: //DBNNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1498: //DBZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 1499: case 0b0101_011_111: 1500: irpSeq (); 1501: break irpSwitch; 1502: 1503: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1504: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1505: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1506: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1507: //SVC.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr 1508: //SNVS.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr [SVC.B <ea>] 1509: //DBVC.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} 1510: //DBNVS.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} [DBVC.W Dr,<label>] 1511: case 0b0101_100_011: 1512: irpSvc (); 1513: break irpSwitch; 1514: 1515: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1516: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1517: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1518: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1519: //SVS.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr 1520: //SNVC.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr [SVS.B <ea>] 1521: //DBVS.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} 1522: //DBNVC.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} [DBVS.W Dr,<label>] 1523: case 0b0101_100_111: 1524: irpSvs (); 1525: break irpSwitch; 1526: 1527: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1528: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1529: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1530: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1531: //SPL.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr 1532: //SNMI.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr [SPL.B <ea>] 1533: //DBPL.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} 1534: //DBNMI.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} [DBPL.W Dr,<label>] 1535: case 0b0101_101_011: 1536: irpSpl (); 1537: break irpSwitch; 1538: 1539: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1540: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1541: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1542: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1543: //SMI.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr 1544: //SNPL.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr [SMI.B <ea>] 1545: //DBMI.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} 1546: //DBNPL.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} [DBMI.W Dr,<label>] 1547: case 0b0101_101_111: 1548: irpSmi (); 1549: break irpSwitch; 1550: 1551: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1552: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1553: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1554: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1555: //SGE.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr 1556: //SNLT.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr [SGE.B <ea>] 1557: //DBGE.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} 1558: //DBNLT.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} [DBGE.W Dr,<label>] 1559: case 0b0101_110_011: 1560: irpSge (); 1561: break irpSwitch; 1562: 1563: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1564: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1565: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1566: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1567: //SLT.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr 1568: //SNGE.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr [SLT.B <ea>] 1569: //DBLT.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} 1570: //DBNGE.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} [DBLT.W Dr,<label>] 1571: case 0b0101_110_111: 1572: irpSlt (); 1573: break irpSwitch; 1574: 1575: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1576: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1577: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1578: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1579: //SGT.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr 1580: //SNLE.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr [SGT.B <ea>] 1581: //DBGT.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} 1582: //DBNLE.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} [DBGT.W Dr,<label>] 1583: case 0b0101_111_011: 1584: irpSgt (); 1585: break irpSwitch; 1586: 1587: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1588: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1589: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1590: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1591: //SLE.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr 1592: //SNGT.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr [SLE.B <ea>] 1593: //DBLE.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} 1594: //DBNGT.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} [DBLE.W Dr,<label>] 1595: case 0b0101_111_111: 1596: irpSle (); 1597: break irpSwitch; 1598: 1599: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1600: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1601: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1602: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1603: //BRA.W <label> |-|012346|-|-----|-----| |0110_000_000_000_000-{offset} 1604: //JBRA.W <label> |A|012346|-|-----|-----| |0110_000_000_000_000-{offset} [BRA.W <label>] 1605: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) 1606: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) [BRA.S <label>] 1607: case 0b0110_000_000: 1608: irpBrasw (); 1609: break irpSwitch; 1610: 1611: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1612: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1613: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1614: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1615: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_001_sss_sss 1616: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_001_sss_sss [BRA.S <label>] 1617: case 0b0110_000_001: 1618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1619: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1620: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1622: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_010_sss_sss 1623: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_010_sss_sss [BRA.S <label>] 1624: case 0b0110_000_010: 1625: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1626: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1627: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1628: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1629: //BRA.S <label> |-|01----|-|-----|-----| |0110_000_011_sss_sss 1630: //JBRA.S <label> |A|01----|-|-----|-----| |0110_000_011_sss_sss [BRA.S <label>] 1631: case 0b0110_000_011: 1632: irpBras (); 1633: break irpSwitch; 1634: 1635: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1636: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1637: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1638: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1639: //BSR.W <label> |-|012346|-|-----|-----| |0110_000_100_000_000-{offset} 1640: //JBSR.W <label> |A|012346|-|-----|-----| |0110_000_100_000_000-{offset} [BSR.W <label>] 1641: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) 1642: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) [BSR.S <label>] 1643: case 0b0110_000_100: 1644: irpBsrsw (); 1645: break irpSwitch; 1646: 1647: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1648: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1649: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1651: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_101_sss_sss 1652: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_101_sss_sss [BSR.S <label>] 1653: case 0b0110_000_101: 1654: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1655: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1656: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1657: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1658: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_110_sss_sss 1659: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_110_sss_sss [BSR.S <label>] 1660: case 0b0110_000_110: 1661: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1662: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1663: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1664: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1665: //BSR.S <label> |-|01----|-|-----|-----| |0110_000_111_sss_sss 1666: //JBSR.S <label> |A|01----|-|-----|-----| |0110_000_111_sss_sss [BSR.S <label>] 1667: case 0b0110_000_111: 1668: irpBsrs (); 1669: break irpSwitch; 1670: 1671: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1672: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1673: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1674: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1675: //BHI.W <label> |-|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} 1676: //BNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1677: //JBHI.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1678: //JBNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 1679: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) 1680: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1681: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1682: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 1683: //JBLS.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 1684: //JBNHI.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 1685: case 0b0110_001_000: 1686: irpBhisw (); 1687: break irpSwitch; 1688: 1689: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1690: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1691: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1692: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1693: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_001_sss_sss 1694: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1695: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1696: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 1697: case 0b0110_001_001: 1698: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1699: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1700: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1702: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_010_sss_sss 1703: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1704: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1705: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 1706: case 0b0110_001_010: 1707: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1708: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1709: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1710: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1711: //BHI.S <label> |-|01----|-|--*-*|-----| |0110_001_011_sss_sss 1712: //BNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1713: //JBHI.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1714: //JBNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 1715: case 0b0110_001_011: 1716: irpBhis (); 1717: break irpSwitch; 1718: 1719: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1720: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1721: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1722: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1723: //BLS.W <label> |-|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} 1724: //BNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1725: //JBLS.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1726: //JBNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 1727: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) 1728: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1729: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1730: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 1731: //JBHI.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 1732: //JBNLS.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 1733: case 0b0110_001_100: 1734: irpBlssw (); 1735: break irpSwitch; 1736: 1737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1738: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1739: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1740: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1741: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_101_sss_sss 1742: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1743: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1744: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 1745: case 0b0110_001_101: 1746: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1747: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1748: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1749: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1750: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_110_sss_sss 1751: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1752: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1753: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 1754: case 0b0110_001_110: 1755: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1756: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1757: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1758: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1759: //BLS.S <label> |-|01----|-|--*-*|-----| |0110_001_111_sss_sss 1760: //BNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1761: //JBLS.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1762: //JBNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 1763: case 0b0110_001_111: 1764: irpBlss (); 1765: break irpSwitch; 1766: 1767: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1768: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1769: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1770: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1771: //BCC.W <label> |-|012346|-|----*|-----| |0110_010_000_000_000-{offset} 1772: //BHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1773: //BNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1774: //BNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1775: //JBCC.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1776: //JBHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1777: //JBNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1778: //JBNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 1779: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) 1780: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1781: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1782: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1783: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1784: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1785: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1786: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 1787: //JBCS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1788: //JBLO.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1789: //JBNCC.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1790: //JBNHS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 1791: case 0b0110_010_000: 1792: irpBhssw (); 1793: break irpSwitch; 1794: 1795: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1796: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1797: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1798: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1799: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_001_sss_sss 1800: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1801: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1802: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1803: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1804: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1805: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1806: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 1807: case 0b0110_010_001: 1808: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1809: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1810: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1812: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_010_sss_sss 1813: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1814: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1815: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1816: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1817: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1818: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1819: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 1820: case 0b0110_010_010: 1821: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1822: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1823: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1824: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1825: //BCC.S <label> |-|01----|-|----*|-----| |0110_010_011_sss_sss 1826: //BHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1827: //BNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1828: //BNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1829: //JBCC.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1830: //JBHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1831: //JBNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1832: //JBNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 1833: case 0b0110_010_011: 1834: irpBhss (); 1835: break irpSwitch; 1836: 1837: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1838: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1839: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1840: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1841: //BCS.W <label> |-|012346|-|----*|-----| |0110_010_100_000_000-{offset} 1842: //BLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1843: //BNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1844: //BNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1845: //JBCS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1846: //JBLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1847: //JBNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1848: //JBNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 1849: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) 1850: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1851: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1852: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1853: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1854: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1855: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1856: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 1857: //JBCC.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1858: //JBHS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1859: //JBNCS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1860: //JBNLO.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 1861: case 0b0110_010_100: 1862: irpBlosw (); 1863: break irpSwitch; 1864: 1865: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1866: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1867: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1868: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1869: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_101_sss_sss 1870: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1871: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1872: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1873: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1874: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1875: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1876: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 1877: case 0b0110_010_101: 1878: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1879: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1880: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1881: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1882: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_110_sss_sss 1883: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1884: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1885: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1886: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1887: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1888: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1889: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 1890: case 0b0110_010_110: 1891: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1892: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1893: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1894: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1895: //BCS.S <label> |-|01----|-|----*|-----| |0110_010_111_sss_sss 1896: //BLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1897: //BNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1898: //BNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1899: //JBCS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1900: //JBLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1901: //JBNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1902: //JBNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 1903: case 0b0110_010_111: 1904: irpBlos (); 1905: break irpSwitch; 1906: 1907: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1908: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1909: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1910: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1911: //BNE.W <label> |-|012346|-|--*--|-----| |0110_011_000_000_000-{offset} 1912: //BNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1913: //BNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1914: //BNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1915: //JBNE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1916: //JBNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1917: //JBNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1918: //JBNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 1919: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) 1920: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1921: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1922: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1923: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1924: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1925: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1926: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 1927: //JBEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1928: //JBNEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1929: //JBNNE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1930: //JBNNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1931: //JBNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1932: //JBNZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1933: //JBZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 1934: case 0b0110_011_000: 1935: irpBnesw (); 1936: break irpSwitch; 1937: 1938: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1939: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1940: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1941: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1942: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_001_sss_sss 1943: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1944: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1945: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1946: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1947: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1948: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1949: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 1950: case 0b0110_011_001: 1951: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1952: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1953: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1954: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1955: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_010_sss_sss 1956: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1957: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1958: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1959: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1960: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1961: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1962: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 1963: case 0b0110_011_010: 1964: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1965: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1966: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1967: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1968: //BNE.S <label> |-|01----|-|--*--|-----| |0110_011_011_sss_sss 1969: //BNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1970: //BNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1971: //BNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1972: //JBNE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1973: //JBNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1974: //JBNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1975: //JBNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 1976: case 0b0110_011_011: 1977: irpBnes (); 1978: break irpSwitch; 1979: 1980: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1981: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 1982: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 1983: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 1984: //BEQ.W <label> |-|012346|-|--*--|-----| |0110_011_100_000_000-{offset} 1985: //BNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1986: //BNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1987: //BZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1988: //JBEQ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1989: //JBNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1990: //JBNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1991: //JBZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 1992: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) 1993: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1994: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1995: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1996: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1997: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1998: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 1999: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 2000: //JBNE.L <label> |A|012346|-|--*--|-----| |0110_011_100_000_110-0100111011111001-{address} [BEQ.S (*)+8;JMP <label>] 2001: case 0b0110_011_100: 2002: irpBeqsw (); 2003: break irpSwitch; 2004: 2005: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2006: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2007: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2008: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2009: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_101_sss_sss 2010: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2011: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2012: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2013: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2014: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2015: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2016: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 2017: case 0b0110_011_101: 2018: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2019: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2020: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2021: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2022: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_110_sss_sss 2023: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2024: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2025: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2026: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2027: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2028: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2029: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 2030: case 0b0110_011_110: 2031: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2032: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2033: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2034: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2035: //BEQ.S <label> |-|01----|-|--*--|-----| |0110_011_111_sss_sss 2036: //BNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2037: //BNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2038: //BZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2039: //JBEQ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2040: //JBNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2041: //JBNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2042: //JBZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 2043: case 0b0110_011_111: 2044: irpBeqs (); 2045: break irpSwitch; 2046: 2047: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2048: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2049: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2050: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2051: //BVC.W <label> |-|012346|-|---*-|-----| |0110_100_000_000_000-{offset} 2052: //BNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 2053: //JBNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 2054: //JBVC.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 2055: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) 2056: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 2057: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 2058: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 2059: //JBNVC.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 2060: //JBVS.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 2061: case 0b0110_100_000: 2062: irpBvcsw (); 2063: break irpSwitch; 2064: 2065: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2066: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2067: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2068: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2069: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_001_sss_sss 2070: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2071: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2072: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 2073: case 0b0110_100_001: 2074: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2075: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2076: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2078: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_010_sss_sss 2079: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2080: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2081: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 2082: case 0b0110_100_010: 2083: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2084: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2085: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2086: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2087: //BVC.S <label> |-|01----|-|---*-|-----| |0110_100_011_sss_sss 2088: //BNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2089: //JBNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2090: //JBVC.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 2091: case 0b0110_100_011: 2092: irpBvcs (); 2093: break irpSwitch; 2094: 2095: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2096: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2097: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2098: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2099: //BVS.W <label> |-|012346|-|---*-|-----| |0110_100_100_000_000-{offset} 2100: //BNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2101: //JBNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2102: //JBVS.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 2103: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) 2104: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2105: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2106: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 2107: //JBNVS.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 2108: //JBVC.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 2109: case 0b0110_100_100: 2110: irpBvssw (); 2111: break irpSwitch; 2112: 2113: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2114: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2115: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2116: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2117: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_101_sss_sss 2118: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2119: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2120: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 2121: case 0b0110_100_101: 2122: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2123: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2124: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2125: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2126: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_110_sss_sss 2127: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2128: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2129: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 2130: case 0b0110_100_110: 2131: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2132: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2133: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2134: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2135: //BVS.S <label> |-|01----|-|---*-|-----| |0110_100_111_sss_sss 2136: //BNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2137: //JBNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2138: //JBVS.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 2139: case 0b0110_100_111: 2140: irpBvss (); 2141: break irpSwitch; 2142: 2143: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2144: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2145: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2146: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2147: //BPL.W <label> |-|012346|-|-*---|-----| |0110_101_000_000_000-{offset} 2148: //BNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2149: //JBNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2150: //JBPL.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 2151: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) 2152: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2153: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2154: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 2155: //JBMI.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 2156: //JBNPL.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 2157: case 0b0110_101_000: 2158: irpBplsw (); 2159: break irpSwitch; 2160: 2161: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2162: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2163: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2164: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2165: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_001_sss_sss 2166: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2167: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2168: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 2169: case 0b0110_101_001: 2170: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2171: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2172: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2173: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2174: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_010_sss_sss 2175: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2176: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2177: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 2178: case 0b0110_101_010: 2179: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2180: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2181: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2183: //BPL.S <label> |-|01----|-|-*---|-----| |0110_101_011_sss_sss 2184: //BNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2185: //JBNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2186: //JBPL.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 2187: case 0b0110_101_011: 2188: irpBpls (); 2189: break irpSwitch; 2190: 2191: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2192: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2193: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2194: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2195: //BMI.W <label> |-|012346|-|-*---|-----| |0110_101_100_000_000-{offset} 2196: //BNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2197: //JBMI.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2198: //JBNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 2199: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) 2200: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2201: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2202: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 2203: //JBNMI.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 2204: //JBPL.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 2205: case 0b0110_101_100: 2206: irpBmisw (); 2207: break irpSwitch; 2208: 2209: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2210: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2211: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2213: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_101_sss_sss 2214: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2215: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2216: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 2217: case 0b0110_101_101: 2218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2219: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2220: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2222: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_110_sss_sss 2223: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2224: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2225: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 2226: case 0b0110_101_110: 2227: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2228: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2229: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2230: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2231: //BMI.S <label> |-|01----|-|-*---|-----| |0110_101_111_sss_sss 2232: //BNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2233: //JBMI.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2234: //JBNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 2235: case 0b0110_101_111: 2236: irpBmis (); 2237: break irpSwitch; 2238: 2239: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2240: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2241: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2242: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2243: //BGE.W <label> |-|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} 2244: //BNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2245: //JBGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2246: //JBNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 2247: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) 2248: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2249: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2250: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 2251: //JBLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 2252: //JBNGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 2253: case 0b0110_110_000: 2254: irpBgesw (); 2255: break irpSwitch; 2256: 2257: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2258: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2259: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2260: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2261: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_001_sss_sss 2262: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2263: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2264: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 2265: case 0b0110_110_001: 2266: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2267: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2268: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2269: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2270: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_010_sss_sss 2271: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2272: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2273: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 2274: case 0b0110_110_010: 2275: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2276: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2277: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2278: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2279: //BGE.S <label> |-|01----|-|-*-*-|-----| |0110_110_011_sss_sss 2280: //BNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2281: //JBGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2282: //JBNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 2283: case 0b0110_110_011: 2284: irpBges (); 2285: break irpSwitch; 2286: 2287: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2288: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2289: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2290: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2291: //BLT.W <label> |-|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} 2292: //BNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2293: //JBLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2294: //JBNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 2295: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) 2296: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2297: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2298: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 2299: //JBGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 2300: //JBNLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 2301: case 0b0110_110_100: 2302: irpBltsw (); 2303: break irpSwitch; 2304: 2305: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2306: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2307: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2308: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2309: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_101_sss_sss 2310: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2311: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2312: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 2313: case 0b0110_110_101: 2314: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2315: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2316: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2317: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2318: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_110_sss_sss 2319: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2320: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2321: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 2322: case 0b0110_110_110: 2323: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2324: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2325: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2326: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2327: //BLT.S <label> |-|01----|-|-*-*-|-----| |0110_110_111_sss_sss 2328: //BNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2329: //JBLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2330: //JBNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 2331: case 0b0110_110_111: 2332: irpBlts (); 2333: break irpSwitch; 2334: 2335: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2336: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2337: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2338: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2339: //BGT.W <label> |-|012346|-|-***-|-----| |0110_111_000_000_000-{offset} 2340: //BNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2341: //JBGT.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2342: //JBNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 2343: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) 2344: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2345: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2346: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 2347: //JBLE.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 2348: //JBNGT.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 2349: case 0b0110_111_000: 2350: irpBgtsw (); 2351: break irpSwitch; 2352: 2353: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2354: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2355: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2356: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2357: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_001_sss_sss 2358: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2359: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2360: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 2361: case 0b0110_111_001: 2362: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2363: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2364: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2365: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2366: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_010_sss_sss 2367: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2368: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2369: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 2370: case 0b0110_111_010: 2371: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2372: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2373: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2374: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2375: //BGT.S <label> |-|01----|-|-***-|-----| |0110_111_011_sss_sss 2376: //BNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2377: //JBGT.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2378: //JBNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 2379: case 0b0110_111_011: 2380: irpBgts (); 2381: break irpSwitch; 2382: 2383: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2384: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2385: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2386: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2387: //BLE.W <label> |-|012346|-|-***-|-----| |0110_111_100_000_000-{offset} 2388: //BNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2389: //JBLE.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2390: //JBNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 2391: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) 2392: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2393: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2394: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 2395: //JBGT.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 2396: //JBNLE.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 2397: case 0b0110_111_100: 2398: irpBlesw (); 2399: break irpSwitch; 2400: 2401: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2402: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2403: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2404: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2405: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_101_sss_sss 2406: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2407: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2408: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 2409: case 0b0110_111_101: 2410: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2411: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2412: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2413: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2414: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_110_sss_sss 2415: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2416: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2417: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 2418: case 0b0110_111_110: 2419: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2420: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2421: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2422: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2423: //BLE.S <label> |-|01----|-|-***-|-----| |0110_111_111_sss_sss 2424: //BNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2425: //JBLE.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2426: //JBNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 2427: case 0b0110_111_111: 2428: irpBles (); 2429: break irpSwitch; 2430: 2431: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2432: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2433: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2434: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2435: //IOCS <name> |A|012346|-|UUUUU|UUUUU| |0111_000_0dd_ddd_ddd-0100111001001111 [MOVEQ.L #<data>,D0;TRAP #15] 2436: //MOVEQ.L #<data>,Dq |-|012346|-|-UUUU|-**00| |0111_qqq_0dd_ddd_ddd 2437: case 0b0111_000_000: 2438: case 0b0111_000_001: 2439: case 0b0111_000_010: 2440: case 0b0111_000_011: 2441: case 0b0111_001_000: 2442: case 0b0111_001_001: 2443: case 0b0111_001_010: 2444: case 0b0111_001_011: 2445: case 0b0111_010_000: 2446: case 0b0111_010_001: 2447: case 0b0111_010_010: 2448: case 0b0111_010_011: 2449: case 0b0111_011_000: 2450: case 0b0111_011_001: 2451: case 0b0111_011_010: 2452: case 0b0111_011_011: 2453: case 0b0111_100_000: 2454: case 0b0111_100_001: 2455: case 0b0111_100_010: 2456: case 0b0111_100_011: 2457: case 0b0111_101_000: 2458: case 0b0111_101_001: 2459: case 0b0111_101_010: 2460: case 0b0111_101_011: 2461: case 0b0111_110_000: 2462: case 0b0111_110_001: 2463: case 0b0111_110_010: 2464: case 0b0111_110_011: 2465: case 0b0111_111_000: 2466: case 0b0111_111_001: 2467: case 0b0111_111_010: 2468: case 0b0111_111_011: 2469: irpMoveq (); 2470: break irpSwitch; 2471: 2472: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2473: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2474: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2475: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2476: //MVS.B <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B) 2477: case 0b0111_000_100: 2478: case 0b0111_001_100: 2479: case 0b0111_010_100: 2480: case 0b0111_011_100: 2481: case 0b0111_100_100: 2482: case 0b0111_101_100: 2483: case 0b0111_110_100: 2484: case 0b0111_111_100: 2485: irpMvsByte (); 2486: break irpSwitch; 2487: 2488: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2489: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2490: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2491: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2492: //MVS.W <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B) 2493: case 0b0111_000_101: 2494: case 0b0111_001_101: 2495: case 0b0111_010_101: 2496: case 0b0111_011_101: 2497: case 0b0111_100_101: 2498: case 0b0111_101_101: 2499: case 0b0111_110_101: 2500: case 0b0111_111_101: 2501: irpMvsWord (); 2502: break irpSwitch; 2503: 2504: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2505: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2506: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2507: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2508: //MVZ.B <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B) 2509: case 0b0111_000_110: 2510: case 0b0111_001_110: 2511: case 0b0111_010_110: 2512: case 0b0111_011_110: 2513: case 0b0111_100_110: 2514: case 0b0111_101_110: 2515: case 0b0111_110_110: 2516: case 0b0111_111_110: 2517: irpMvzByte (); 2518: break irpSwitch; 2519: 2520: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2521: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2522: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2523: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2524: //MVZ.W <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B) 2525: case 0b0111_000_111: 2526: case 0b0111_001_111: 2527: case 0b0111_010_111: 2528: case 0b0111_011_111: 2529: case 0b0111_100_111: 2530: case 0b0111_101_111: 2531: case 0b0111_110_111: 2532: case 0b0111_111_111: 2533: irpMvzWord (); 2534: break irpSwitch; 2535: 2536: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2537: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2538: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2539: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2540: //OR.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr 2541: case 0b1000_000_000: 2542: case 0b1000_001_000: 2543: case 0b1000_010_000: 2544: case 0b1000_011_000: 2545: case 0b1000_100_000: 2546: case 0b1000_101_000: 2547: case 0b1000_110_000: 2548: case 0b1000_111_000: 2549: irpOrToRegByte (); 2550: break irpSwitch; 2551: 2552: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2553: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2554: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2555: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2556: //OR.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr 2557: case 0b1000_000_001: 2558: case 0b1000_001_001: 2559: case 0b1000_010_001: 2560: case 0b1000_011_001: 2561: case 0b1000_100_001: 2562: case 0b1000_101_001: 2563: case 0b1000_110_001: 2564: case 0b1000_111_001: 2565: irpOrToRegWord (); 2566: break irpSwitch; 2567: 2568: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2569: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2570: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2571: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2572: //OR.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr 2573: case 0b1000_000_010: 2574: case 0b1000_001_010: 2575: case 0b1000_010_010: 2576: case 0b1000_011_010: 2577: case 0b1000_100_010: 2578: case 0b1000_101_010: 2579: case 0b1000_110_010: 2580: case 0b1000_111_010: 2581: irpOrToRegLong (); 2582: break irpSwitch; 2583: 2584: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2585: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2586: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2587: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2588: //DIVU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr 2589: case 0b1000_000_011: 2590: case 0b1000_001_011: 2591: case 0b1000_010_011: 2592: case 0b1000_011_011: 2593: case 0b1000_100_011: 2594: case 0b1000_101_011: 2595: case 0b1000_110_011: 2596: case 0b1000_111_011: 2597: irpDivuWord (); 2598: break irpSwitch; 2599: 2600: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2601: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2602: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2603: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2604: //SBCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_000_rrr 2605: //SBCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_001_rrr 2606: //OR.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_100_mmm_rrr 2607: case 0b1000_000_100: 2608: case 0b1000_001_100: 2609: case 0b1000_010_100: 2610: case 0b1000_011_100: 2611: case 0b1000_100_100: 2612: case 0b1000_101_100: 2613: case 0b1000_110_100: 2614: case 0b1000_111_100: 2615: irpOrToMemByte (); 2616: break irpSwitch; 2617: 2618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2619: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2620: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2622: //OR.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_101_mmm_rrr 2623: case 0b1000_000_101: 2624: case 0b1000_001_101: 2625: case 0b1000_010_101: 2626: case 0b1000_011_101: 2627: case 0b1000_100_101: 2628: case 0b1000_101_101: 2629: case 0b1000_110_101: 2630: case 0b1000_111_101: 2631: irpOrToMemWord (); 2632: break irpSwitch; 2633: 2634: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2635: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2636: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2637: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2638: //OR.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_110_mmm_rrr 2639: case 0b1000_000_110: 2640: case 0b1000_001_110: 2641: case 0b1000_010_110: 2642: case 0b1000_011_110: 2643: case 0b1000_100_110: 2644: case 0b1000_101_110: 2645: case 0b1000_110_110: 2646: case 0b1000_111_110: 2647: irpOrToMemLong (); 2648: break irpSwitch; 2649: 2650: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2651: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2652: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2654: //DIVS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr 2655: case 0b1000_000_111: 2656: case 0b1000_001_111: 2657: case 0b1000_010_111: 2658: case 0b1000_011_111: 2659: case 0b1000_100_111: 2660: case 0b1000_101_111: 2661: case 0b1000_110_111: 2662: case 0b1000_111_111: 2663: irpDivsWord (); 2664: break irpSwitch; 2665: 2666: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2667: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2668: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2669: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2670: //SUB.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr 2671: case 0b1001_000_000: 2672: case 0b1001_001_000: 2673: case 0b1001_010_000: 2674: case 0b1001_011_000: 2675: case 0b1001_100_000: 2676: case 0b1001_101_000: 2677: case 0b1001_110_000: 2678: case 0b1001_111_000: 2679: irpSubToRegByte (); 2680: break irpSwitch; 2681: 2682: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2683: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2684: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2685: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2686: //SUB.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr 2687: case 0b1001_000_001: 2688: case 0b1001_001_001: 2689: case 0b1001_010_001: 2690: case 0b1001_011_001: 2691: case 0b1001_100_001: 2692: case 0b1001_101_001: 2693: case 0b1001_110_001: 2694: case 0b1001_111_001: 2695: irpSubToRegWord (); 2696: break irpSwitch; 2697: 2698: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2699: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2700: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2702: //SUB.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr 2703: case 0b1001_000_010: 2704: case 0b1001_001_010: 2705: case 0b1001_010_010: 2706: case 0b1001_011_010: 2707: case 0b1001_100_010: 2708: case 0b1001_101_010: 2709: case 0b1001_110_010: 2710: case 0b1001_111_010: 2711: irpSubToRegLong (); 2712: break irpSwitch; 2713: 2714: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2715: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2716: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2717: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2718: //SUBA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr 2719: //SUB.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq] 2720: //CLR.W Ar |A|012346|-|-----|-----| A |1001_rrr_011_001_rrr [SUBA.W Ar,Ar] 2721: case 0b1001_000_011: 2722: case 0b1001_001_011: 2723: case 0b1001_010_011: 2724: case 0b1001_011_011: 2725: case 0b1001_100_011: 2726: case 0b1001_101_011: 2727: case 0b1001_110_011: 2728: case 0b1001_111_011: 2729: irpSubaWord (); 2730: break irpSwitch; 2731: 2732: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2733: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2734: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2735: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2736: //SUBX.B Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_100_000_rrr 2737: //SUBX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_100_001_rrr 2738: //SUB.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_100_mmm_rrr 2739: case 0b1001_000_100: 2740: case 0b1001_001_100: 2741: case 0b1001_010_100: 2742: case 0b1001_011_100: 2743: case 0b1001_100_100: 2744: case 0b1001_101_100: 2745: case 0b1001_110_100: 2746: case 0b1001_111_100: 2747: irpSubToMemByte (); 2748: break irpSwitch; 2749: 2750: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2751: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2752: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2753: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2754: //SUBX.W Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_101_000_rrr 2755: //SUBX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_101_001_rrr 2756: //SUB.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_101_mmm_rrr 2757: case 0b1001_000_101: 2758: case 0b1001_001_101: 2759: case 0b1001_010_101: 2760: case 0b1001_011_101: 2761: case 0b1001_100_101: 2762: case 0b1001_101_101: 2763: case 0b1001_110_101: 2764: case 0b1001_111_101: 2765: irpSubToMemWord (); 2766: break irpSwitch; 2767: 2768: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2769: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2770: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2771: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2772: //SUBX.L Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_110_000_rrr 2773: //SUBX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_110_001_rrr 2774: //SUB.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_110_mmm_rrr 2775: case 0b1001_000_110: 2776: case 0b1001_001_110: 2777: case 0b1001_010_110: 2778: case 0b1001_011_110: 2779: case 0b1001_100_110: 2780: case 0b1001_101_110: 2781: case 0b1001_110_110: 2782: case 0b1001_111_110: 2783: irpSubToMemLong (); 2784: break irpSwitch; 2785: 2786: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2787: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2788: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2789: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2790: //SUBA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr 2791: //SUB.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq] 2792: //CLR.L Ar |A|012346|-|-----|-----| A |1001_rrr_111_001_rrr [SUBA.L Ar,Ar] 2793: case 0b1001_000_111: 2794: case 0b1001_001_111: 2795: case 0b1001_010_111: 2796: case 0b1001_011_111: 2797: case 0b1001_100_111: 2798: case 0b1001_101_111: 2799: case 0b1001_110_111: 2800: case 0b1001_111_111: 2801: irpSubaLong (); 2802: break irpSwitch; 2803: 2804: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2805: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2806: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2807: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2808: //SXCALL <name> |A|012346|-|UUUUU|*****| |1010_0dd_ddd_ddd_ddd [ALINE #<data>] 2809: case 0b1010_000_000: 2810: case 0b1010_000_001: 2811: case 0b1010_000_010: 2812: case 0b1010_000_011: 2813: case 0b1010_000_100: 2814: case 0b1010_000_101: 2815: case 0b1010_000_110: 2816: case 0b1010_000_111: 2817: case 0b1010_001_000: 2818: case 0b1010_001_001: 2819: case 0b1010_001_010: 2820: case 0b1010_001_011: 2821: case 0b1010_001_100: 2822: case 0b1010_001_101: 2823: case 0b1010_001_110: 2824: case 0b1010_001_111: 2825: case 0b1010_010_000: 2826: case 0b1010_010_001: 2827: case 0b1010_010_010: 2828: case 0b1010_010_011: 2829: case 0b1010_010_100: 2830: case 0b1010_010_101: 2831: case 0b1010_010_110: 2832: case 0b1010_010_111: 2833: case 0b1010_011_000: 2834: case 0b1010_011_001: 2835: case 0b1010_011_010: 2836: case 0b1010_011_011: 2837: case 0b1010_011_100: 2838: case 0b1010_011_101: 2839: case 0b1010_011_110: 2840: case 0b1010_011_111: 2841: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2842: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2843: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2844: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2845: //ALINE #<data> |-|012346|-|UUUUU|*****| |1010_ddd_ddd_ddd_ddd (line 1010 emulator) 2846: case 0b1010_100_000: 2847: case 0b1010_100_001: 2848: case 0b1010_100_010: 2849: case 0b1010_100_011: 2850: case 0b1010_100_100: 2851: case 0b1010_100_101: 2852: case 0b1010_100_110: 2853: case 0b1010_100_111: 2854: case 0b1010_101_000: 2855: case 0b1010_101_001: 2856: case 0b1010_101_010: 2857: case 0b1010_101_011: 2858: case 0b1010_101_100: 2859: case 0b1010_101_101: 2860: case 0b1010_101_110: 2861: case 0b1010_101_111: 2862: case 0b1010_110_000: 2863: case 0b1010_110_001: 2864: case 0b1010_110_010: 2865: case 0b1010_110_011: 2866: case 0b1010_110_100: 2867: case 0b1010_110_101: 2868: case 0b1010_110_110: 2869: case 0b1010_110_111: 2870: case 0b1010_111_000: 2871: case 0b1010_111_001: 2872: case 0b1010_111_010: 2873: case 0b1010_111_011: 2874: case 0b1010_111_100: 2875: case 0b1010_111_101: 2876: case 0b1010_111_110: 2877: case 0b1010_111_111: 2878: irpAline (); 2879: break irpSwitch; 2880: 2881: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2882: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2883: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2884: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2885: //CMP.B <ea>,Dq |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr 2886: case 0b1011_000_000: 2887: case 0b1011_001_000: 2888: case 0b1011_010_000: 2889: case 0b1011_011_000: 2890: case 0b1011_100_000: 2891: case 0b1011_101_000: 2892: case 0b1011_110_000: 2893: case 0b1011_111_000: 2894: irpCmpByte (); 2895: break irpSwitch; 2896: 2897: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2898: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2899: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2900: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2901: //CMP.W <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr 2902: case 0b1011_000_001: 2903: case 0b1011_001_001: 2904: case 0b1011_010_001: 2905: case 0b1011_011_001: 2906: case 0b1011_100_001: 2907: case 0b1011_101_001: 2908: case 0b1011_110_001: 2909: case 0b1011_111_001: 2910: irpCmpWord (); 2911: break irpSwitch; 2912: 2913: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2914: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2915: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2916: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2917: //CMP.L <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr 2918: case 0b1011_000_010: 2919: case 0b1011_001_010: 2920: case 0b1011_010_010: 2921: case 0b1011_011_010: 2922: case 0b1011_100_010: 2923: case 0b1011_101_010: 2924: case 0b1011_110_010: 2925: case 0b1011_111_010: 2926: irpCmpLong (); 2927: break irpSwitch; 2928: 2929: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2930: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2931: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2932: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2933: //CMPA.W <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr 2934: //CMP.W <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq] 2935: case 0b1011_000_011: 2936: case 0b1011_001_011: 2937: case 0b1011_010_011: 2938: case 0b1011_011_011: 2939: case 0b1011_100_011: 2940: case 0b1011_101_011: 2941: case 0b1011_110_011: 2942: case 0b1011_111_011: 2943: irpCmpaWord (); 2944: break irpSwitch; 2945: 2946: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2947: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2948: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2949: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2950: //EOR.B Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_100_mmm_rrr 2951: //CMPM.B (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_100_001_rrr 2952: case 0b1011_000_100: 2953: case 0b1011_001_100: 2954: case 0b1011_010_100: 2955: case 0b1011_011_100: 2956: case 0b1011_100_100: 2957: case 0b1011_101_100: 2958: case 0b1011_110_100: 2959: case 0b1011_111_100: 2960: irpEorByte (); 2961: break irpSwitch; 2962: 2963: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2964: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2965: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2966: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2967: //EOR.W Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_101_mmm_rrr 2968: //CMPM.W (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_101_001_rrr 2969: case 0b1011_000_101: 2970: case 0b1011_001_101: 2971: case 0b1011_010_101: 2972: case 0b1011_011_101: 2973: case 0b1011_100_101: 2974: case 0b1011_101_101: 2975: case 0b1011_110_101: 2976: case 0b1011_111_101: 2977: irpEorWord (); 2978: break irpSwitch; 2979: 2980: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2981: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2982: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 2983: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2984: //EOR.L Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_110_mmm_rrr 2985: //CMPM.L (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_110_001_rrr 2986: case 0b1011_000_110: 2987: case 0b1011_001_110: 2988: case 0b1011_010_110: 2989: case 0b1011_011_110: 2990: case 0b1011_100_110: 2991: case 0b1011_101_110: 2992: case 0b1011_110_110: 2993: case 0b1011_111_110: 2994: irpEorLong (); 2995: break irpSwitch; 2996: 2997: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 2998: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 2999: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3000: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3001: //CMPA.L <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr 3002: //CMP.L <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq] 3003: case 0b1011_000_111: 3004: case 0b1011_001_111: 3005: case 0b1011_010_111: 3006: case 0b1011_011_111: 3007: case 0b1011_100_111: 3008: case 0b1011_101_111: 3009: case 0b1011_110_111: 3010: case 0b1011_111_111: 3011: irpCmpaLong (); 3012: break irpSwitch; 3013: 3014: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3015: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3016: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3017: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3018: //AND.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr 3019: case 0b1100_000_000: 3020: case 0b1100_001_000: 3021: case 0b1100_010_000: 3022: case 0b1100_011_000: 3023: case 0b1100_100_000: 3024: case 0b1100_101_000: 3025: case 0b1100_110_000: 3026: case 0b1100_111_000: 3027: irpAndToRegByte (); 3028: break irpSwitch; 3029: 3030: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3031: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3032: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3033: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3034: //AND.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr 3035: case 0b1100_000_001: 3036: case 0b1100_001_001: 3037: case 0b1100_010_001: 3038: case 0b1100_011_001: 3039: case 0b1100_100_001: 3040: case 0b1100_101_001: 3041: case 0b1100_110_001: 3042: case 0b1100_111_001: 3043: irpAndToRegWord (); 3044: break irpSwitch; 3045: 3046: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3047: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3048: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3049: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3050: //AND.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr 3051: case 0b1100_000_010: 3052: case 0b1100_001_010: 3053: case 0b1100_010_010: 3054: case 0b1100_011_010: 3055: case 0b1100_100_010: 3056: case 0b1100_101_010: 3057: case 0b1100_110_010: 3058: case 0b1100_111_010: 3059: irpAndToRegLong (); 3060: break irpSwitch; 3061: 3062: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3063: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3064: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3065: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3066: //MULU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr 3067: case 0b1100_000_011: 3068: case 0b1100_001_011: 3069: case 0b1100_010_011: 3070: case 0b1100_011_011: 3071: case 0b1100_100_011: 3072: case 0b1100_101_011: 3073: case 0b1100_110_011: 3074: case 0b1100_111_011: 3075: irpMuluWord (); 3076: break irpSwitch; 3077: 3078: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3079: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3080: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3081: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3082: //ABCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_000_rrr 3083: //ABCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_001_rrr 3084: //AND.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_100_mmm_rrr 3085: case 0b1100_000_100: 3086: case 0b1100_001_100: 3087: case 0b1100_010_100: 3088: case 0b1100_011_100: 3089: case 0b1100_100_100: 3090: case 0b1100_101_100: 3091: case 0b1100_110_100: 3092: case 0b1100_111_100: 3093: irpAndToMemByte (); 3094: break irpSwitch; 3095: 3096: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3097: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3098: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3099: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3100: //EXG.L Dq,Dr |-|012346|-|-----|-----| |1100_qqq_101_000_rrr 3101: //EXG.L Aq,Ar |-|012346|-|-----|-----| |1100_qqq_101_001_rrr 3102: //AND.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_101_mmm_rrr 3103: case 0b1100_000_101: 3104: case 0b1100_001_101: 3105: case 0b1100_010_101: 3106: case 0b1100_011_101: 3107: case 0b1100_100_101: 3108: case 0b1100_101_101: 3109: case 0b1100_110_101: 3110: case 0b1100_111_101: 3111: irpAndToMemWord (); 3112: break irpSwitch; 3113: 3114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3115: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3116: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3117: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3118: //EXG.L Dq,Ar |-|012346|-|-----|-----| |1100_qqq_110_001_rrr 3119: //AND.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_110_mmm_rrr 3120: case 0b1100_000_110: 3121: case 0b1100_001_110: 3122: case 0b1100_010_110: 3123: case 0b1100_011_110: 3124: case 0b1100_100_110: 3125: case 0b1100_101_110: 3126: case 0b1100_110_110: 3127: case 0b1100_111_110: 3128: irpAndToMemLong (); 3129: break irpSwitch; 3130: 3131: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3132: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3133: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3134: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3135: //MULS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr 3136: case 0b1100_000_111: 3137: case 0b1100_001_111: 3138: case 0b1100_010_111: 3139: case 0b1100_011_111: 3140: case 0b1100_100_111: 3141: case 0b1100_101_111: 3142: case 0b1100_110_111: 3143: case 0b1100_111_111: 3144: irpMulsWord (); 3145: break irpSwitch; 3146: 3147: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3148: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3149: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3150: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3151: //ADD.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr 3152: case 0b1101_000_000: 3153: case 0b1101_001_000: 3154: case 0b1101_010_000: 3155: case 0b1101_011_000: 3156: case 0b1101_100_000: 3157: case 0b1101_101_000: 3158: case 0b1101_110_000: 3159: case 0b1101_111_000: 3160: irpAddToRegByte (); 3161: break irpSwitch; 3162: 3163: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3164: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3165: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3166: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3167: //ADD.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr 3168: case 0b1101_000_001: 3169: case 0b1101_001_001: 3170: case 0b1101_010_001: 3171: case 0b1101_011_001: 3172: case 0b1101_100_001: 3173: case 0b1101_101_001: 3174: case 0b1101_110_001: 3175: case 0b1101_111_001: 3176: irpAddToRegWord (); 3177: break irpSwitch; 3178: 3179: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3180: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3181: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3183: //ADD.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr 3184: case 0b1101_000_010: 3185: case 0b1101_001_010: 3186: case 0b1101_010_010: 3187: case 0b1101_011_010: 3188: case 0b1101_100_010: 3189: case 0b1101_101_010: 3190: case 0b1101_110_010: 3191: case 0b1101_111_010: 3192: irpAddToRegLong (); 3193: break irpSwitch; 3194: 3195: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3196: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3197: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3198: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3199: //ADDA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr 3200: //ADD.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq] 3201: case 0b1101_000_011: 3202: case 0b1101_001_011: 3203: case 0b1101_010_011: 3204: case 0b1101_011_011: 3205: case 0b1101_100_011: 3206: case 0b1101_101_011: 3207: case 0b1101_110_011: 3208: case 0b1101_111_011: 3209: irpAddaWord (); 3210: break irpSwitch; 3211: 3212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3213: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3214: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3215: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3216: //ADDX.B Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_100_000_rrr 3217: //ADDX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_100_001_rrr 3218: //ADD.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_100_mmm_rrr 3219: case 0b1101_000_100: 3220: case 0b1101_001_100: 3221: case 0b1101_010_100: 3222: case 0b1101_011_100: 3223: case 0b1101_100_100: 3224: case 0b1101_101_100: 3225: case 0b1101_110_100: 3226: case 0b1101_111_100: 3227: irpAddToMemByte (); 3228: break irpSwitch; 3229: 3230: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3231: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3232: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3233: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3234: //ADDX.W Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_101_000_rrr 3235: //ADDX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_101_001_rrr 3236: //ADD.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_101_mmm_rrr 3237: case 0b1101_000_101: 3238: case 0b1101_001_101: 3239: case 0b1101_010_101: 3240: case 0b1101_011_101: 3241: case 0b1101_100_101: 3242: case 0b1101_101_101: 3243: case 0b1101_110_101: 3244: case 0b1101_111_101: 3245: irpAddToMemWord (); 3246: break irpSwitch; 3247: 3248: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3249: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3250: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3251: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3252: //ADDX.L Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_110_000_rrr 3253: //ADDX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_110_001_rrr 3254: //ADD.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_110_mmm_rrr 3255: case 0b1101_000_110: 3256: case 0b1101_001_110: 3257: case 0b1101_010_110: 3258: case 0b1101_011_110: 3259: case 0b1101_100_110: 3260: case 0b1101_101_110: 3261: case 0b1101_110_110: 3262: case 0b1101_111_110: 3263: irpAddToMemLong (); 3264: break irpSwitch; 3265: 3266: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3267: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3268: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3269: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3270: //ADDA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr 3271: //ADD.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq] 3272: case 0b1101_000_111: 3273: case 0b1101_001_111: 3274: case 0b1101_010_111: 3275: case 0b1101_011_111: 3276: case 0b1101_100_111: 3277: case 0b1101_101_111: 3278: case 0b1101_110_111: 3279: case 0b1101_111_111: 3280: irpAddaLong (); 3281: break irpSwitch; 3282: 3283: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3284: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3285: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3286: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3287: //ASR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_000_rrr 3288: //LSR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_001_rrr 3289: //ROXR.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_010_rrr 3290: //ROR.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_011_rrr 3291: //ASR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_100_rrr 3292: //LSR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_101_rrr 3293: //ROXR.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_110_rrr 3294: //ROR.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_111_rrr 3295: //ASR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_000_rrr [ASR.B #1,Dr] 3296: //LSR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_001_rrr [LSR.B #1,Dr] 3297: //ROXR.B Dr |A|012346|-|*UUUU|***0*| |1110_001_000_010_rrr [ROXR.B #1,Dr] 3298: //ROR.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_000_011_rrr [ROR.B #1,Dr] 3299: case 0b1110_000_000: 3300: case 0b1110_001_000: 3301: case 0b1110_010_000: 3302: case 0b1110_011_000: 3303: case 0b1110_100_000: 3304: case 0b1110_101_000: 3305: case 0b1110_110_000: 3306: case 0b1110_111_000: 3307: irpXxrToRegByte (); 3308: break irpSwitch; 3309: 3310: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3311: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3312: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3313: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3314: //ASR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_000_rrr 3315: //LSR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_001_rrr 3316: //ROXR.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_010_rrr 3317: //ROR.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_011_rrr 3318: //ASR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_100_rrr 3319: //LSR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_101_rrr 3320: //ROXR.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_110_rrr 3321: //ROR.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_111_rrr 3322: //ASR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_000_rrr [ASR.W #1,Dr] 3323: //LSR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_001_rrr [LSR.W #1,Dr] 3324: //ROXR.W Dr |A|012346|-|*UUUU|***0*| |1110_001_001_010_rrr [ROXR.W #1,Dr] 3325: //ROR.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_001_011_rrr [ROR.W #1,Dr] 3326: case 0b1110_000_001: 3327: case 0b1110_001_001: 3328: case 0b1110_010_001: 3329: case 0b1110_011_001: 3330: case 0b1110_100_001: 3331: case 0b1110_101_001: 3332: case 0b1110_110_001: 3333: case 0b1110_111_001: 3334: irpXxrToRegWord (); 3335: break irpSwitch; 3336: 3337: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3338: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3339: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3340: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3341: //ASR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_000_rrr 3342: //LSR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_001_rrr 3343: //ROXR.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_010_rrr 3344: //ROR.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_011_rrr 3345: //ASR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_100_rrr 3346: //LSR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_101_rrr 3347: //ROXR.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_110_rrr 3348: //ROR.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_111_rrr 3349: //ASR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_000_rrr [ASR.L #1,Dr] 3350: //LSR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_001_rrr [LSR.L #1,Dr] 3351: //ROXR.L Dr |A|012346|-|*UUUU|***0*| |1110_001_010_010_rrr [ROXR.L #1,Dr] 3352: //ROR.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_010_011_rrr [ROR.L #1,Dr] 3353: case 0b1110_000_010: 3354: case 0b1110_001_010: 3355: case 0b1110_010_010: 3356: case 0b1110_011_010: 3357: case 0b1110_100_010: 3358: case 0b1110_101_010: 3359: case 0b1110_110_010: 3360: case 0b1110_111_010: 3361: irpXxrToRegLong (); 3362: break irpSwitch; 3363: 3364: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3365: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3366: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3367: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3368: //ASR.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_000_011_mmm_rrr 3369: case 0b1110_000_011: 3370: irpAsrToMem (); 3371: break irpSwitch; 3372: 3373: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3374: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3375: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3376: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3377: //ASL.B #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_000_rrr 3378: //LSL.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_001_rrr 3379: //ROXL.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_010_rrr 3380: //ROL.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_011_rrr 3381: //ASL.B Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_100_rrr 3382: //LSL.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_101_rrr 3383: //ROXL.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_110_rrr 3384: //ROL.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_111_rrr 3385: //ASL.B Dr |A|012346|-|UUUUU|*****| |1110_001_100_000_rrr [ASL.B #1,Dr] 3386: //LSL.B Dr |A|012346|-|UUUUU|***0*| |1110_001_100_001_rrr [LSL.B #1,Dr] 3387: //ROXL.B Dr |A|012346|-|*UUUU|***0*| |1110_001_100_010_rrr [ROXL.B #1,Dr] 3388: //ROL.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_100_011_rrr [ROL.B #1,Dr] 3389: case 0b1110_000_100: 3390: case 0b1110_001_100: 3391: case 0b1110_010_100: 3392: case 0b1110_011_100: 3393: case 0b1110_100_100: 3394: case 0b1110_101_100: 3395: case 0b1110_110_100: 3396: case 0b1110_111_100: 3397: irpXxlToRegByte (); 3398: break irpSwitch; 3399: 3400: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3401: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3402: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3403: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3404: //ASL.W #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_000_rrr 3405: //LSL.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_001_rrr 3406: //ROXL.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_010_rrr 3407: //ROL.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_011_rrr 3408: //ASL.W Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_100_rrr 3409: //LSL.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_101_rrr 3410: //ROXL.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_110_rrr 3411: //ROL.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_111_rrr 3412: //ASL.W Dr |A|012346|-|UUUUU|*****| |1110_001_101_000_rrr [ASL.W #1,Dr] 3413: //LSL.W Dr |A|012346|-|UUUUU|***0*| |1110_001_101_001_rrr [LSL.W #1,Dr] 3414: //ROXL.W Dr |A|012346|-|*UUUU|***0*| |1110_001_101_010_rrr [ROXL.W #1,Dr] 3415: //ROL.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_101_011_rrr [ROL.W #1,Dr] 3416: case 0b1110_000_101: 3417: case 0b1110_001_101: 3418: case 0b1110_010_101: 3419: case 0b1110_011_101: 3420: case 0b1110_100_101: 3421: case 0b1110_101_101: 3422: case 0b1110_110_101: 3423: case 0b1110_111_101: 3424: irpXxlToRegWord (); 3425: break irpSwitch; 3426: 3427: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3428: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3429: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3430: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3431: //ASL.L #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_000_rrr 3432: //LSL.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_001_rrr 3433: //ROXL.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_010_rrr 3434: //ROL.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_011_rrr 3435: //ASL.L Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_100_rrr 3436: //LSL.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_101_rrr 3437: //ROXL.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_110_rrr 3438: //ROL.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_111_rrr 3439: //ASL.L Dr |A|012346|-|UUUUU|*****| |1110_001_110_000_rrr [ASL.L #1,Dr] 3440: //LSL.L Dr |A|012346|-|UUUUU|***0*| |1110_001_110_001_rrr [LSL.L #1,Dr] 3441: //ROXL.L Dr |A|012346|-|*UUUU|***0*| |1110_001_110_010_rrr [ROXL.L #1,Dr] 3442: //ROL.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_110_011_rrr [ROL.L #1,Dr] 3443: case 0b1110_000_110: 3444: case 0b1110_001_110: 3445: case 0b1110_010_110: 3446: case 0b1110_011_110: 3447: case 0b1110_100_110: 3448: case 0b1110_101_110: 3449: case 0b1110_110_110: 3450: case 0b1110_111_110: 3451: irpXxlToRegLong (); 3452: break irpSwitch; 3453: 3454: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3455: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3456: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3457: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3458: //ASL.W <ea> |-|012346|-|UUUUU|*****| M+-WXZ |1110_000_111_mmm_rrr 3459: case 0b1110_000_111: 3460: irpAslToMem (); 3461: break irpSwitch; 3462: 3463: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3464: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3465: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3466: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3467: //LSR.W <ea> |-|012346|-|UUUUU|*0*0*| M+-WXZ |1110_001_011_mmm_rrr 3468: case 0b1110_001_011: 3469: irpLsrToMem (); 3470: break irpSwitch; 3471: 3472: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3473: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3474: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3475: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3476: //LSL.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_001_111_mmm_rrr 3477: case 0b1110_001_111: 3478: irpLslToMem (); 3479: break irpSwitch; 3480: 3481: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3482: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3483: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3484: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3485: //ROXR.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_011_mmm_rrr 3486: case 0b1110_010_011: 3487: irpRoxrToMem (); 3488: break irpSwitch; 3489: 3490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3491: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3492: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3493: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3494: //ROXL.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_111_mmm_rrr 3495: case 0b1110_010_111: 3496: irpRoxlToMem (); 3497: break irpSwitch; 3498: 3499: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3500: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3501: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3502: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3503: //ROR.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_011_mmm_rrr 3504: case 0b1110_011_011: 3505: irpRorToMem (); 3506: break irpSwitch; 3507: 3508: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3509: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3510: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3511: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3512: //ROL.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_111_mmm_rrr 3513: case 0b1110_011_111: 3514: irpRolToMem (); 3515: break irpSwitch; 3516: 3517: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3518: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3519: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3520: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3521: //FPACK <data> |A|012346|-|UUUUU|*****| |1111_111_0dd_ddd_ddd [FLINE #<data>] 3522: case 0b1111_111_000: 3523: case 0b1111_111_001: 3524: case 0b1111_111_010: 3525: case 0b1111_111_011: 3526: irpFpack (); 3527: break irpSwitch; 3528: 3529: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3530: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3531: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3532: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3533: //DOS <data> |A|012346|-|UUUUU|UUUUU| |1111_111_1dd_ddd_ddd [FLINE #<data>] 3534: case 0b1111_111_100: 3535: case 0b1111_111_101: 3536: case 0b1111_111_110: 3537: case 0b1111_111_111: 3538: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3539: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3540: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3541: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3542: //FLINE #<data> |-|012346|-|UUUUU|UUUUU| |1111_ddd_ddd_ddd_ddd (line 1111 emulator) 3543: case 0b1111_000_000: 3544: case 0b1111_000_001: 3545: case 0b1111_000_010: 3546: case 0b1111_000_011: 3547: case 0b1111_000_100: 3548: case 0b1111_000_101: 3549: case 0b1111_000_110: 3550: case 0b1111_000_111: 3551: case 0b1111_001_000: 3552: case 0b1111_001_001: 3553: case 0b1111_001_010: 3554: case 0b1111_001_011: 3555: case 0b1111_001_100: 3556: case 0b1111_001_101: 3557: case 0b1111_001_110: 3558: case 0b1111_001_111: 3559: case 0b1111_010_000: 3560: case 0b1111_010_001: 3561: case 0b1111_010_010: 3562: case 0b1111_010_011: 3563: case 0b1111_010_100: 3564: case 0b1111_010_101: 3565: case 0b1111_010_110: 3566: case 0b1111_010_111: 3567: case 0b1111_011_000: 3568: case 0b1111_011_001: 3569: case 0b1111_011_010: 3570: case 0b1111_011_011: 3571: case 0b1111_011_100: 3572: case 0b1111_011_101: 3573: case 0b1111_011_110: 3574: case 0b1111_011_111: 3575: case 0b1111_100_000: 3576: case 0b1111_100_001: 3577: case 0b1111_100_010: 3578: case 0b1111_100_011: 3579: case 0b1111_100_100: 3580: case 0b1111_100_101: 3581: case 0b1111_100_110: 3582: case 0b1111_100_111: 3583: case 0b1111_101_000: 3584: case 0b1111_101_001: 3585: case 0b1111_101_010: 3586: case 0b1111_101_011: 3587: case 0b1111_101_100: 3588: case 0b1111_101_101: 3589: case 0b1111_101_110: 3590: case 0b1111_101_111: 3591: case 0b1111_110_000: 3592: case 0b1111_110_001: 3593: case 0b1111_110_010: 3594: case 0b1111_110_011: 3595: case 0b1111_110_100: 3596: case 0b1111_110_101: 3597: case 0b1111_110_110: 3598: case 0b1111_110_111: 3599: irpFline (); 3600: break irpSwitch; 3601: 3602: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3603: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 3604: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 3605: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 3606: //HFSBOOT |-|012346|-|-----|-----| |0100_111_000_000_000 3607: //HFSINST |-|012346|-|-----|-----| |0100_111_000_000_001 3608: //HFSSTR |-|012346|-|-----|-----| |0100_111_000_000_010 3609: //HFSINT |-|012346|-|-----|-----| |0100_111_000_000_011 3610: //EMXNOP |-|012346|-|-----|-----| |0100_111_000_000_100 3611: case 0b0100_111_000: 3612: irpEmx (); 3613: break; 3614: 3615: default: 3616: irpIllegal (); 3617: 3618: } //switch XEiJ.regOC >>> 6 3619: 3620: //トレース例外 3621: // 命令実行前にsrのTビットがセットされていたとき命令実行後にトレース例外が発生する 3622: // トレース例外の発動は命令の機能拡張であり、他の例外処理で命令が中断されたときはトレース例外は発生しない 3623: // 命令例外はトレース例外の前に、割り込み例外はトレース例外の後に処理される 3624: // 未実装命令のエミュレーションルーチンはrteの直前にsrのTビットを復元することで未実装命令が1個の命令としてトレースされたように見せる 3625: // ;DOSコールの終了 3626: // ~008616: 3627: // btst.b #$07,(sp) 3628: // bne.s ~00861E 3629: // rte 3630: // ~00861E: 3631: // ori.w #$8000,sr 3632: // rte 3633: if (XEiJ.mpuTraceFlag != 0) { //命令実行前にsrのTビットがセットされていた 3634: XEiJ.mpuCycleCount += 34; 3635: irpException (M68kException.M6E_TRACE, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 3636: } 3637: //クロックをカウントアップする 3638: // オペランドをアクセスした時点ではまだXEiJ.mpuClockTimeが更新されていないのでXEiJ.mpuClockTime<xxxClock 3639: // xxxTickを呼び出すときはXEiJ.mpuClockTime>=xxxClock 3640: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount; 3641: //デバイスを呼び出す 3642: TickerQueue.tkqRun (XEiJ.mpuClockTime); 3643: //割り込みを受け付ける 3644: if ((t = XEiJ.mpuIMR & XEiJ.mpuIRR) != 0) { //マスクされているレベルよりも高くて受け付けていない割り込みがあるとき 3645: if (XEiJ.MPU_INTERRUPT_SWITCH) { 3646: switch (t) { 3647: case 0b00000001: 3648: case 0b00000011: 3649: case 0b00000101: 3650: case 0b00000111: 3651: case 0b00001001: 3652: case 0b00001011: 3653: case 0b00001101: 3654: case 0b00001111: 3655: case 0b00010001: 3656: case 0b00010011: 3657: case 0b00010101: 3658: case 0b00010111: 3659: case 0b00011001: 3660: case 0b00011011: 3661: case 0b00011101: 3662: case 0b00011111: 3663: case 0b00100001: 3664: case 0b00100011: 3665: case 0b00100101: 3666: case 0b00100111: 3667: case 0b00101001: 3668: case 0b00101011: 3669: case 0b00101101: 3670: case 0b00101111: 3671: case 0b00110001: 3672: case 0b00110011: 3673: case 0b00110101: 3674: case 0b00110111: 3675: case 0b00111001: 3676: case 0b00111011: 3677: case 0b00111101: 3678: case 0b00111111: 3679: case 0b01000001: 3680: case 0b01000011: 3681: case 0b01000101: 3682: case 0b01000111: 3683: case 0b01001001: 3684: case 0b01001011: 3685: case 0b01001101: 3686: case 0b01001111: 3687: case 0b01010001: 3688: case 0b01010011: 3689: case 0b01010101: 3690: case 0b01010111: 3691: case 0b01011001: 3692: case 0b01011011: 3693: case 0b01011101: 3694: case 0b01011111: 3695: case 0b01100001: 3696: case 0b01100011: 3697: case 0b01100101: 3698: case 0b01100111: 3699: case 0b01101001: 3700: case 0b01101011: 3701: case 0b01101101: 3702: case 0b01101111: 3703: case 0b01110001: 3704: case 0b01110011: 3705: case 0b01110101: 3706: case 0b01110111: 3707: case 0b01111001: 3708: case 0b01111011: 3709: case 0b01111101: 3710: case 0b01111111: 3711: case 0b10000001: 3712: case 0b10000011: 3713: case 0b10000101: 3714: case 0b10000111: 3715: case 0b10001001: 3716: case 0b10001011: 3717: case 0b10001101: 3718: case 0b10001111: 3719: case 0b10010001: 3720: case 0b10010011: 3721: case 0b10010101: 3722: case 0b10010111: 3723: case 0b10011001: 3724: case 0b10011011: 3725: case 0b10011101: 3726: case 0b10011111: 3727: case 0b10100001: 3728: case 0b10100011: 3729: case 0b10100101: 3730: case 0b10100111: 3731: case 0b10101001: 3732: case 0b10101011: 3733: case 0b10101101: 3734: case 0b10101111: 3735: case 0b10110001: 3736: case 0b10110011: 3737: case 0b10110101: 3738: case 0b10110111: 3739: case 0b10111001: 3740: case 0b10111011: 3741: case 0b10111101: 3742: case 0b10111111: 3743: case 0b11000001: 3744: case 0b11000011: 3745: case 0b11000101: 3746: case 0b11000111: 3747: case 0b11001001: 3748: case 0b11001011: 3749: case 0b11001101: 3750: case 0b11001111: 3751: case 0b11010001: 3752: case 0b11010011: 3753: case 0b11010101: 3754: case 0b11010111: 3755: case 0b11011001: 3756: case 0b11011011: 3757: case 0b11011101: 3758: case 0b11011111: 3759: case 0b11100001: 3760: case 0b11100011: 3761: case 0b11100101: 3762: case 0b11100111: 3763: case 0b11101001: 3764: case 0b11101011: 3765: case 0b11101101: 3766: case 0b11101111: 3767: case 0b11110001: 3768: case 0b11110011: 3769: case 0b11110101: 3770: case 0b11110111: 3771: case 0b11111001: 3772: case 0b11111011: 3773: case 0b11111101: 3774: case 0b11111111: 3775: //レベル7 3776: XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みを受け付ける 3777: if ((t = XEiJ.sysAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3778: irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL); //割り込み処理を開始する 3779: } 3780: break; 3781: case 0b00000010: 3782: case 0b00000110: 3783: case 0b00001010: 3784: case 0b00001110: 3785: case 0b00010010: 3786: case 0b00010110: 3787: case 0b00011010: 3788: case 0b00011110: 3789: case 0b00100010: 3790: case 0b00100110: 3791: case 0b00101010: 3792: case 0b00101110: 3793: case 0b00110010: 3794: case 0b00110110: 3795: case 0b00111010: 3796: case 0b00111110: 3797: case 0b01000010: 3798: case 0b01000110: 3799: case 0b01001010: 3800: case 0b01001110: 3801: case 0b01010010: 3802: case 0b01010110: 3803: case 0b01011010: 3804: case 0b01011110: 3805: case 0b01100010: 3806: case 0b01100110: 3807: case 0b01101010: 3808: case 0b01101110: 3809: case 0b01110010: 3810: case 0b01110110: 3811: case 0b01111010: 3812: case 0b01111110: 3813: case 0b10000010: 3814: case 0b10000110: 3815: case 0b10001010: 3816: case 0b10001110: 3817: case 0b10010010: 3818: case 0b10010110: 3819: case 0b10011010: 3820: case 0b10011110: 3821: case 0b10100010: 3822: case 0b10100110: 3823: case 0b10101010: 3824: case 0b10101110: 3825: case 0b10110010: 3826: case 0b10110110: 3827: case 0b10111010: 3828: case 0b10111110: 3829: case 0b11000010: 3830: case 0b11000110: 3831: case 0b11001010: 3832: case 0b11001110: 3833: case 0b11010010: 3834: case 0b11010110: 3835: case 0b11011010: 3836: case 0b11011110: 3837: case 0b11100010: 3838: case 0b11100110: 3839: case 0b11101010: 3840: case 0b11101110: 3841: case 0b11110010: 3842: case 0b11110110: 3843: case 0b11111010: 3844: case 0b11111110: 3845: //レベル6 3846: XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK; //割り込みを受け付ける 3847: if ((t = MC68901.mfpAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3848: irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL); //割り込み処理を開始する 3849: } 3850: break; 3851: case 0b00000100: 3852: case 0b00001100: 3853: case 0b00010100: 3854: case 0b00011100: 3855: case 0b00100100: 3856: case 0b00101100: 3857: case 0b00110100: 3858: case 0b00111100: 3859: case 0b01000100: 3860: case 0b01001100: 3861: case 0b01010100: 3862: case 0b01011100: 3863: case 0b01100100: 3864: case 0b01101100: 3865: case 0b01110100: 3866: case 0b01111100: 3867: case 0b10000100: 3868: case 0b10001100: 3869: case 0b10010100: 3870: case 0b10011100: 3871: case 0b10100100: 3872: case 0b10101100: 3873: case 0b10110100: 3874: case 0b10111100: 3875: case 0b11000100: 3876: case 0b11001100: 3877: case 0b11010100: 3878: case 0b11011100: 3879: case 0b11100100: 3880: case 0b11101100: 3881: case 0b11110100: 3882: case 0b11111100: 3883: //レベル5 3884: XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK; //割り込みを受け付ける 3885: if ((t = Z8530.sccAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3886: irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL); //割り込み処理を開始する 3887: } 3888: break; 3889: case 0b00010000: 3890: case 0b00110000: 3891: case 0b01010000: 3892: case 0b01110000: 3893: case 0b10010000: 3894: case 0b10110000: 3895: case 0b11010000: 3896: case 0b11110000: 3897: //レベル3 3898: XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK; //割り込みを受け付ける 3899: if ((t = HD63450.dmaAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3900: irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL); //割り込み処理を開始する 3901: } 3902: break; 3903: case 0b00100000: 3904: case 0b01100000: 3905: case 0b10100000: 3906: case 0b11100000: 3907: //レベル2 3908: XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK; //割り込みを受け付ける 3909: if ((t = XEiJ.eb2Acknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3910: irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL); //割り込み処理を開始する 3911: } 3912: break; 3913: case 0b01000000: 3914: case 0b11000000: 3915: //レベル1 3916: XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK; //割り込みを受け付ける 3917: if ((t = IOInterrupt.ioiAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3918: irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL); //割り込み処理を開始する 3919: } 3920: break; 3921: } 3922: } else { 3923: t &= -t; 3924: // x&=-xはxの最下位の1のビットだけを残す演算 3925: // すなわちマスクされているレベルよりも高くて受け付けていない割り込みの中で最高レベルの割り込みのビットだけが残る 3926: // 最高レベルの割り込みのビットしか残っていないので、割り込みの有無をレベルの高い順ではなく使用頻度の高い順に調べられる 3927: // MFPやDMAの割り込みがかかる度にそれより優先度の高いインタラプトスイッチが押されていないかどうかを確かめる必要がない 3928: if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) { 3929: XEiJ.mpuIRR &= ~XEiJ.MPU_MFP_INTERRUPT_MASK; //割り込みを受け付ける 3930: if ((t = MC68901.mfpAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3931: irpInterrupt (t, XEiJ.MPU_MFP_INTERRUPT_LEVEL); //割り込み処理を開始する 3932: } 3933: } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) { 3934: XEiJ.mpuIRR &= ~XEiJ.MPU_DMA_INTERRUPT_MASK; //割り込みを受け付ける 3935: if ((t = HD63450.dmaAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3936: irpInterrupt (t, XEiJ.MPU_DMA_INTERRUPT_LEVEL); //割り込み処理を開始する 3937: } 3938: } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) { 3939: XEiJ.mpuIRR &= ~XEiJ.MPU_SCC_INTERRUPT_MASK; //割り込みを受け付ける 3940: if ((t = Z8530.sccAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3941: irpInterrupt (t, XEiJ.MPU_SCC_INTERRUPT_LEVEL); //割り込み処理を開始する 3942: } 3943: } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) { 3944: XEiJ.mpuIRR &= ~XEiJ.MPU_IOI_INTERRUPT_MASK; //割り込みを受け付ける 3945: if ((t = IOInterrupt.ioiAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3946: irpInterrupt (t, XEiJ.MPU_IOI_INTERRUPT_LEVEL); //割り込み処理を開始する 3947: } 3948: } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) { 3949: XEiJ.mpuIRR &= ~XEiJ.MPU_EB2_INTERRUPT_MASK; //割り込みを受け付ける 3950: if ((t = XEiJ.eb2Acknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3951: irpInterrupt (t, XEiJ.MPU_EB2_INTERRUPT_LEVEL); //割り込み処理を開始する 3952: } 3953: } else if (t == XEiJ.MPU_SYS_INTERRUPT_MASK) { 3954: XEiJ.mpuIRR &= ~XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みを受け付ける 3955: if ((t = XEiJ.sysAcknowledge ()) != 0) { //デバイスにベクタ番号を要求して割り込み処理中の状態になったとき 3956: irpInterrupt (t, XEiJ.MPU_SYS_INTERRUPT_LEVEL); //割り込み処理を開始する 3957: } 3958: } 3959: } 3960: } //if t!=0 3961: if (MC68901.MFP_DELAYED_INTERRUPT) { 3962: XEiJ.mpuIRR |= XEiJ.mpuDIRR; //遅延割り込み要求 3963: XEiJ.mpuDIRR = 0; 3964: } 3965: } //命令ループ 3966: } catch (M68kException e) { 3967: if (M68kException.m6eNumber < 0) { //命令ブレークポイントによる停止 3968: XEiJ.regPC = XEiJ.regPC0; 3969: XEiJ.mpuStop1 (null); //"Instruction Break Point" 3970: break errorLoop; 3971: } 3972: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * XEiJ.mpuCycleCount; 3973: //例外処理 3974: // ここで処理するのはベクタ番号が2~31の例外に限る。TRAP #n命令はインライン展開する 3975: // 使用頻度が高いと思われる例外はインライン展開するのでここには来ない 3976: // 例外処理をインライン展開する場合はMC68000とMC68030のコードを分けなければならずコードが冗長になる 3977: // 使用頻度が低いと思われる例外はインライン展開しない 3978: // セーブされるpcは以下の例外は命令の先頭、これ以外は次の命令 3979: // 2 BUS_ERROR 3980: // 3 ADDRESS_ERROR 3981: // 4 ILLEGAL_INSTRUCTION 3982: // 8 PRIVILEGE_VIOLATION 3983: // 10 LINE_1010_EMULATOR 3984: // 11 LINE_1111_EMULATOR 3985: // fedcba9876543210fedcba9876543210 3986: //if ((1 << M68kException.m6eNumber & 0b00000000000000000000110100011100) != 0) { 3987: // 0123456789abcdef0123456789abcdef 3988: if (0b00111000101100000000000000000000 << M68kException.m6eNumber < 0) { 3989: XEiJ.regPC = XEiJ.regPC0; //セーブされるpcは命令の先頭 3990: } 3991: try { 3992: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 3993: int sp = XEiJ.regRn[15]; 3994: XEiJ.regSRT1 = 0; //srのTビットを消す 3995: if (XEiJ.regSRS == 0) { //ユーザモードのとき 3996: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 3997: XEiJ.mpuUSP = sp; //USPを保存 3998: sp = XEiJ.mpuISP; //SSPを復元 3999: if (DataBreakPoint.DBP_ON) { 4000: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 4001: } else { 4002: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 4003: } 4004: if (InstructionBreakPoint.IBP_ON) { 4005: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 4006: } 4007: } 4008: int vectorOffset = M68kException.m6eNumber << 2; //vector offset 4009: if (M68kException.m6eNumber <= M68kException.M6E_ADDRESS_ERROR) { //バスエラーまたはアドレスエラー 4010: //ホストファイルシステムのデバイスコマンドを強制終了させる 4011: HFS.hfsState = HFS.HFS_STATE_IDLE; 4012: XEiJ.mpuClockTime += 50 * XEiJ.mpuModifiedUnit; 4013: //long format stack frame (bus error/address error) 4014: // $0000 .w status register 4015: // $0002 .l program counter 4016: // $0006 .w format and vector offset. $8008=bus error, $800C=address error 4017: // $0008 .w special status word 4018: // $000A .l fault address 4019: // $000E .w unused, reserved 4020: // $0010 .w data output buffer 4021: // $0012 .w unused, reserved 4022: // $0014 .w data input buffer 4023: // $0016 .w unused, reserved 4024: // $0018 .w instruction input buffer 4025: // $001A .w[16] internal information, 16 words 4026: // 29 words, 58 bytes 4027: //special status word 4028: // bit15 RR Rerun flag; 0=processor rerun (default), 1=software rerun 4029: // bit14 * These bits are reserved for future use by Motorola and will be zero when written by the MC68010. 4030: // bit13 IF Instruction fetch to the instruction input buffer 4031: // bit12 DF Data fetch to the data input buffer 4032: // bit11 RM Read-modify-write cycle 4033: // bit10 HB High-byte transfer from the data output buffer or to the data input buffer 4034: // bit9 BY Byte-transfer flag; HB selects the high or low byte of the transfer register. 4035: // If BY is clear, the transfer is word. 4036: // bit8 RW Read/write flag; 0=write, 1=read 4037: // bit7-3 * 4038: // bit2-0 FC2-FC0 The function code used during the faulted access 4039: XEiJ.regRn[15] = sp -= 58; //long format 4040: XEiJ.busWl (sp + 10, M68kException.m6eAddress); //fault address 4041: XEiJ.busWw (sp + 8, 4042: (M68kException.m6eSize == XEiJ.MPU_SS_BYTE ? 0x0200 : 0x0000) | //BY 4043: (M68kException.m6eDirection == XEiJ.MPU_WR_READ ? 0x0100 : 0x0000) //RW 4044: //!!! 他のフラグをセットしていない 4045: ); //special status word 4046: XEiJ.busWw (sp + 6, 0x8000 | vectorOffset); //format and vector offset 4047: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 4048: XEiJ.busWw (sp, save_sr); //status register 4049: } else { 4050: //short format stack frame 4051: // $0000 .w status register 4052: // $0002 .l program counter 4053: // $0006 .w format and vector offset 4054: // 4 words, 8 bytes 4055: XEiJ.regRn[15] = sp -= 8; //short format 4056: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 4057: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 4058: XEiJ.busWw (sp, save_sr); //status register 4059: } 4060: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 4061: if (XEiJ.dbgStopOnError) { //エラーで停止する場合 4062: if (XEiJ.dbgDoStopOnError ()) { 4063: break errorLoop; 4064: } 4065: } 4066: } catch (M68kException ee) { //ダブルバスフォルト 4067: XEiJ.dbgDoubleBusFault (); 4068: break errorLoop; 4069: } 4070: } //catch M68kException 4071: } //例外ループ 4072: 4073: // 通常 4074: // pc0 最後に実行した命令 4075: // pc 次に実行する命令 4076: // バスエラー、アドレスエラー、不当命令、特権違反で停止したとき 4077: // pc0 エラーを発生させた命令 4078: // pc 例外処理ルーチンの先頭 4079: // ダブルバスフォルトで停止したとき 4080: // pc0 エラーを発生させた命令 4081: // pc エラーを発生させた命令 4082: // 命令ブレークポイントで停止したとき 4083: // pc0 命令ブレークポイントが設定された、次に実行する命令 4084: // pc 命令ブレークポイントが設定された、次に実行する命令 4085: // データブレークポイントで停止したとき 4086: // pc0 データを書き換えた、最後に実行した命令 4087: // pc 次に実行する命令 4088: 4089: //分岐ログに停止レコードを記録する 4090: if (BranchLog.BLG_ON) { 4091: //BranchLog.blgStop (); 4092: int i = (char) BranchLog.blgNewestRecord << BranchLog.BLG_RECORD_SHIFT; 4093: BranchLog.blgArray[i] = BranchLog.blgHead | BranchLog.blgSuper; 4094: BranchLog.blgArray[i + 1] = XEiJ.regPC; //次に実行する命令 4095: } 4096: 4097: } //mpuCore() 4098: 4099: 4100: 4101: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4102: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4103: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4104: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4105: //ORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_000_mmm_rrr-{data} 4106: //OR.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_000_mmm_rrr-{data} [ORI.B #<data>,<ea>] 4107: //ORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_000_000_111_100-{data} 4108: public static void irpOriByte () throws M68kException { 4109: int ea = XEiJ.regOC & 63; 4110: int z; 4111: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4112: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4113: } else { 4114: z = XEiJ.regPC; 4115: XEiJ.regPC = z + 2; 4116: z = XEiJ.busRbs (z + 1); //pcbs 4117: } 4118: if (ea < XEiJ.EA_AR) { //ORI.B #<data>,Dr 4119: if (XEiJ.DBG_ORI_BYTE_ZERO_D0) { 4120: if (z == 0 && ea == 0 && XEiJ.dbgOriByteZeroD0) { //ORI.B #$00,D0 4121: XEiJ.mpuCycleCount += 34; 4122: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4123: throw M68kException.m6eSignal; 4124: } 4125: } 4126: XEiJ.mpuCycleCount += 8; 4127: z = XEiJ.regRn[ea] |= 255 & z; //0拡張してからOR 4128: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4129: } else if (ea == XEiJ.EA_IM) { //ORI.B #<data>,CCR 4130: XEiJ.mpuCycleCount += 20; 4131: XEiJ.regCCR |= XEiJ.REG_CCR_MASK & z; 4132: } else { //ORI.B #<data>,<mem> 4133: XEiJ.mpuCycleCount += 12; 4134: int a = efaMltByte (ea); 4135: XEiJ.busWb (a, z |= XEiJ.busRbs (a)); 4136: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4137: } 4138: } //irpOriByte 4139: 4140: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4141: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4142: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4143: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4144: //ORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_001_mmm_rrr-{data} 4145: //OR.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_001_mmm_rrr-{data} [ORI.W #<data>,<ea>] 4146: //ORI.W #<data>,SR |-|012346|P|*****|*****| |0000_000_001_111_100-{data} 4147: public static void irpOriWord () throws M68kException { 4148: int ea = XEiJ.regOC & 63; 4149: if (ea < XEiJ.EA_AR) { //ORI.W #<data>,Dr 4150: int z; 4151: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4152: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4153: } else { 4154: z = XEiJ.regPC; 4155: XEiJ.regPC = z + 2; 4156: z = XEiJ.busRwse (z); //pcws 4157: } 4158: XEiJ.mpuCycleCount += 8; 4159: z = XEiJ.regRn[ea] |= (char) z; //0拡張してからOR 4160: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4161: } else if (ea == XEiJ.EA_IM) { //ORI.W #<data>,SR 4162: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4163: XEiJ.mpuCycleCount += 34; 4164: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4165: throw M68kException.m6eSignal; 4166: } 4167: //以下はスーパーバイザモード 4168: XEiJ.mpuCycleCount += 20; 4169: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4170: irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4171: } else { 4172: int t = XEiJ.regPC; 4173: XEiJ.regPC = t + 2; 4174: irpSetSR (XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR | XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4175: } 4176: } else { //ORI.W #<data>,<mem> 4177: int z; 4178: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4179: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4180: } else { 4181: z = XEiJ.regPC; 4182: XEiJ.regPC = z + 2; 4183: z = XEiJ.busRwse (z); //pcws 4184: } 4185: XEiJ.mpuCycleCount += 12; 4186: int a = efaMltWord (ea); 4187: XEiJ.busWw (a, z |= XEiJ.busRws (a)); 4188: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4189: } 4190: } //irpOriWord 4191: 4192: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4193: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4194: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4195: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4196: //ORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_000_010_mmm_rrr-{data} 4197: //OR.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_000_010_mmm_rrr-{data} [ORI.L #<data>,<ea>] 4198: public static void irpOriLong () throws M68kException { 4199: int ea = XEiJ.regOC & 63; 4200: int y; 4201: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4202: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4203: } else { 4204: y = XEiJ.regPC; 4205: XEiJ.regPC = y + 4; 4206: y = XEiJ.busRlse (y); //pcls 4207: } 4208: int z; 4209: if (ea < XEiJ.EA_AR) { //ORI.L #<data>,Dr 4210: XEiJ.mpuCycleCount += 16; 4211: z = XEiJ.regRn[ea] |= y; 4212: } else { //ORI.L #<data>,<mem> 4213: XEiJ.mpuCycleCount += 20; 4214: int a = efaMltLong (ea); 4215: XEiJ.busWl (a, z = XEiJ.busRls (a) | y); 4216: } 4217: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 4218: } //irpOriLong 4219: 4220: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4221: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4222: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4223: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4224: //BITREV.L Dr |-|------|-|-----|-----|D |0000_000_011_000_rrr (ISA_C) 4225: // 4226: //BITREV.L Dr 4227: // Drのビットの並びを逆順にする。CCRは変化しない 4228: public static void irpCmp2Chk2Byte () throws M68kException { 4229: int ea = XEiJ.regOC & 63; 4230: if (ea < XEiJ.EA_AR) { //BITREV.L Dr 4231: XEiJ.mpuCycleCount += 4; 4232: if (XEiJ.IRP_BITREV_REVERSE) { //2.83ns 0x0f801f3c 4233: XEiJ.regRn[ea] = Integer.reverse (XEiJ.regRn[ea]); 4234: } else if (XEiJ.IRP_BITREV_SHIFT) { //2.57ns 0x0f801f3c 4235: int x = XEiJ.regRn[ea]; 4236: x = x << 16 | x >>> 16; 4237: x = x << 8 & 0xff00ff00 | x >>> 8 & 0x00ff00ff; 4238: x = x << 4 & 0xf0f0f0f0 | x >>> 4 & 0x0f0f0f0f; 4239: x = x << 2 & 0xcccccccc | x >>> 2 & 0x33333333; 4240: XEiJ.regRn[ea] = x << 1 & 0xaaaaaaaa | x >>> 1 & 0x55555555; 4241: } else if (XEiJ.IRP_BITREV_TABLE) { //1.57ns 0x0f801f3c 4242: int x = XEiJ.regRn[ea]; 4243: XEiJ.regRn[ea] = XEiJ.MPU_BITREV_TABLE_0[x & 2047] | XEiJ.MPU_BITREV_TABLE_1[x << 10 >>> 21] | XEiJ.MPU_BITREV_TABLE_2[x >>> 22]; 4244: } 4245: } else { //CMP2/CHK2.B <ea>,Rn 4246: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4247: XEiJ.mpuCycleCount += 34; 4248: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4249: throw M68kException.m6eSignal; 4250: } 4251: } //irpCmp2Chk2Byte 4252: 4253: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4254: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4255: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4256: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4257: //BTST.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_100_000_rrr 4258: //MOVEP.W (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_100_001_rrr-{data} 4259: //BTST.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZPI|0000_qqq_100_mmm_rrr 4260: public static void irpBtstReg () throws M68kException { 4261: int ea = XEiJ.regOC & 63; 4262: int qqq = XEiJ.regOC >> 9; //qqq 4263: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.W (d16,Ar),Dq 4264: XEiJ.mpuCycleCount += 16; 4265: int a; 4266: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4267: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4268: } else { 4269: a = XEiJ.regPC; 4270: XEiJ.regPC = a + 2; 4271: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4272: } 4273: XEiJ.regRn[qqq] = ~0xffff & XEiJ.regRn[qqq] | XEiJ.busRbz (a) << 8 | XEiJ.busRbz (a + 2); //Javaは評価順序が保証されている 4274: } else { //BTST.L Dq,Dr/<ea> 4275: int y = XEiJ.regRn[qqq]; 4276: if (ea < XEiJ.EA_AR) { //BTST.L Dq,Dr 4277: XEiJ.mpuCycleCount += 6; 4278: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.regRn[ea] >>> y & 1) << 2; //ccr_btst。intのシフトは5bitでマスクされるので&31を省略 4279: } else { //BTST.B Dq,<ea> 4280: XEiJ.mpuCycleCount += 4; 4281: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.busRbs (efaAnyByte (ea)) >>> (y & 7) & 1) << 2; //ccr_btst 4282: } 4283: } 4284: } //irpBtstReg 4285: 4286: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4287: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4288: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4289: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4290: //BCHG.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_101_000_rrr 4291: //MOVEP.L (d16,Ar),Dq |-|01234S|-|-----|-----| |0000_qqq_101_001_rrr-{data} 4292: //BCHG.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_101_mmm_rrr 4293: public static void irpBchgReg () throws M68kException { 4294: int ea = XEiJ.regOC & 63; 4295: int qqq = XEiJ.regOC >> 9; //qqq 4296: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.L (d16,Ar),Dq 4297: XEiJ.mpuCycleCount += 24; 4298: int a; 4299: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4300: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4301: } else { 4302: a = XEiJ.regPC; 4303: XEiJ.regPC = a + 2; 4304: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4305: } 4306: XEiJ.regRn[qqq] = XEiJ.busRbs (a) << 24 | XEiJ.busRbz (a + 2) << 16 | XEiJ.busRbz (a + 4) << 8 | XEiJ.busRbz (a + 6); //Javaは評価順序が保証されている 4307: } else { //BCHG.L Dq,Dr/<ea> 4308: int x; 4309: int y = XEiJ.regRn[qqq]; 4310: if (ea < XEiJ.EA_AR) { //BCHG.L Dq,Dr 4311: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4312: XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8; //(0xffff&y)!=0 4313: } else { //BCHG.B Dq,<ea> 4314: XEiJ.mpuCycleCount += 8; 4315: int a = efaMltByte (ea); 4316: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7))); 4317: } 4318: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4319: } 4320: } //irpBchgReg 4321: 4322: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4323: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4324: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4325: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4326: //BCLR.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_110_000_rrr 4327: //MOVEP.W Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_110_001_rrr-{data} 4328: //BCLR.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_110_mmm_rrr 4329: public static void irpBclrReg () throws M68kException { 4330: int ea = XEiJ.regOC & 63; 4331: int y = XEiJ.regRn[XEiJ.regOC >> 9]; //qqq 4332: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.W Dq,(d16,Ar) 4333: XEiJ.mpuCycleCount += 16; 4334: int a; 4335: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4336: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4337: } else { 4338: a = XEiJ.regPC; 4339: XEiJ.regPC = a + 2; 4340: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4341: } 4342: XEiJ.busWb (a, y >> 8); 4343: XEiJ.busWb (a + 2, y); 4344: } else { //BCLR.L Dq,Dr/<ea> 4345: int x; 4346: if (ea < XEiJ.EA_AR) { //BCLR.L Dq,Dr 4347: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4348: XEiJ.mpuCycleCount += (char) y != 0 ? 8 : 10; //(0xffff&y)!=0 4349: } else { //BCLR.B Dq,<ea> 4350: XEiJ.mpuCycleCount += 8; 4351: int a = efaMltByte (ea); 4352: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7))); 4353: } 4354: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4355: } 4356: } //irpBclrReg 4357: 4358: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4359: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4360: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4361: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4362: //BSET.L Dq,Dr |-|012346|-|--U--|--*--|D |0000_qqq_111_000_rrr 4363: //MOVEP.L Dq,(d16,Ar) |-|01234S|-|-----|-----| |0000_qqq_111_001_rrr-{data} 4364: //BSET.B Dq,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_qqq_111_mmm_rrr 4365: public static void irpBsetReg () throws M68kException { 4366: int ea = XEiJ.regOC & 63; 4367: int y = XEiJ.regRn[XEiJ.regOC >> 9]; //qqq 4368: if (ea >> 3 == XEiJ.MMM_AR) { //MOVEP.L Dq,(d16,Ar) 4369: XEiJ.mpuCycleCount += 24; 4370: int a; 4371: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4372: a = XEiJ.regRn[ea] + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws。このr[ea]はアドレスレジスタ 4373: } else { 4374: a = XEiJ.regPC; 4375: XEiJ.regPC = a + 2; 4376: a = XEiJ.regRn[ea] + XEiJ.busRwse (a); //pcws。このr[ea]はアドレスレジスタ 4377: } 4378: XEiJ.busWb (a, y >> 24); 4379: XEiJ.busWb (a + 2, y >> 16); 4380: XEiJ.busWb (a + 4, y >> 8); 4381: XEiJ.busWb (a + 6, y); 4382: } else { //BSET.L Dq,Dr/<ea> 4383: int x; 4384: if (ea < XEiJ.EA_AR) { //BSET.L Dq,Dr 4385: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4386: XEiJ.mpuCycleCount += (char) y != 0 ? 6 : 8; //(0xffff&y)!=0 4387: } else { //BSET.B Dq,<ea> 4388: XEiJ.mpuCycleCount += 8; 4389: int a = efaMltByte (ea); 4390: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7))); 4391: } 4392: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4393: } 4394: } //irpBsetReg 4395: 4396: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4397: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4398: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4399: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4400: //ANDI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_000_mmm_rrr-{data} 4401: //AND.B #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_000_mmm_rrr-{data} [ANDI.B #<data>,<ea>] 4402: //ANDI.B #<data>,CCR |-|012346|-|*****|*****| |0000_001_000_111_100-{data} 4403: public static void irpAndiByte () throws M68kException { 4404: int ea = XEiJ.regOC & 63; 4405: int z; 4406: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4407: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4408: } else { 4409: z = XEiJ.regPC; 4410: XEiJ.regPC = z + 2; 4411: z = XEiJ.busRbs (z + 1); //pcbs 4412: } 4413: if (ea < XEiJ.EA_AR) { //ANDI.B #<data>,Dr 4414: XEiJ.mpuCycleCount += 8; 4415: z = XEiJ.regRn[ea] &= ~255 | z; //1拡張してからAND 4416: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4417: } else if (ea == XEiJ.EA_IM) { //ANDI.B #<data>,CCR 4418: XEiJ.mpuCycleCount += 20; 4419: XEiJ.regCCR &= z; 4420: } else { //ANDI.B #<data>,<mem> 4421: XEiJ.mpuCycleCount += 12; 4422: int a = efaMltByte (ea); 4423: XEiJ.busWb (a, z &= XEiJ.busRbs (a)); 4424: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4425: } 4426: } //irpAndiByte 4427: 4428: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4429: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4430: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4431: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4432: //ANDI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_001_mmm_rrr-{data} 4433: //AND.W #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_001_mmm_rrr-{data} [ANDI.W #<data>,<ea>] 4434: //ANDI.W #<data>,SR |-|012346|P|*****|*****| |0000_001_001_111_100-{data} 4435: public static void irpAndiWord () throws M68kException { 4436: int ea = XEiJ.regOC & 63; 4437: if (ea < XEiJ.EA_AR) { //ANDI.W #<data>,Dr 4438: int z; 4439: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4440: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4441: } else { 4442: z = XEiJ.regPC; 4443: XEiJ.regPC = z + 2; 4444: z = XEiJ.busRwse (z); //pcws 4445: } 4446: XEiJ.mpuCycleCount += 8; 4447: z = XEiJ.regRn[ea] &= ~65535 | z; //1拡張してからAND 4448: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4449: } else if (ea == XEiJ.EA_IM) { //ANDI.W #<data>,SR 4450: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4451: XEiJ.mpuCycleCount += 34; 4452: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4453: throw M68kException.m6eSignal; 4454: } 4455: //以下はスーパーバイザモード 4456: XEiJ.mpuCycleCount += 20; 4457: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4458: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4459: } else { 4460: int t = XEiJ.regPC; 4461: XEiJ.regPC = t + 2; 4462: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) & XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4463: } 4464: } else { //ANDI.W #<data>,<mem> 4465: int z; 4466: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4467: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4468: } else { 4469: z = XEiJ.regPC; 4470: XEiJ.regPC = z + 2; 4471: z = XEiJ.busRwse (z); //pcws 4472: } 4473: XEiJ.mpuCycleCount += 12; 4474: int a = efaMltWord (ea); 4475: XEiJ.busWw (a, z &= XEiJ.busRws (a)); 4476: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4477: } 4478: } //irpAndiWord 4479: 4480: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4481: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4482: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4483: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4484: //ANDI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_001_010_mmm_rrr-{data} 4485: //AND.L #<data>,<ea> |A|012346|-|-UUUU|-**00| M+-WXZ |0000_001_010_mmm_rrr-{data} [ANDI.L #<data>,<ea>] 4486: public static void irpAndiLong () throws M68kException { 4487: int ea = XEiJ.regOC & 63; 4488: int y; 4489: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4490: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4491: } else { 4492: y = XEiJ.regPC; 4493: XEiJ.regPC = y + 4; 4494: y = XEiJ.busRlse (y); //pcls 4495: } 4496: int z; 4497: if (ea < XEiJ.EA_AR) { //ANDI.L #<data>,Dr 4498: XEiJ.mpuCycleCount += 16; 4499: z = XEiJ.regRn[ea] &= y; 4500: } else { //ANDI.L #<data>,<mem> 4501: XEiJ.mpuCycleCount += 20; 4502: int a = efaMltLong (ea); 4503: XEiJ.busWl (a, z = XEiJ.busRls (a) & y); 4504: } 4505: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 4506: } //irpAndiLong 4507: 4508: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4509: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4510: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4511: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4512: //BYTEREV.L Dr |-|------|-|-----|-----|D |0000_001_011_000_rrr (ISA_C) 4513: // 4514: //BYTEREV.L Dr 4515: // Drのバイトの並びを逆順にする。CCRは変化しない 4516: public static void irpCmp2Chk2Word () throws M68kException { 4517: int ea = XEiJ.regOC & 63; 4518: if (ea < XEiJ.EA_AR) { //BYTEREV.L Dr 4519: XEiJ.mpuCycleCount += 4; 4520: if (true) { //0.10ns-0.18ns 0x782750ec 4521: XEiJ.regRn[ea] = Integer.reverseBytes (XEiJ.regRn[ea]); 4522: } else { //1.06ns 0x782750ec 4523: int x = XEiJ.regRn[ea]; 4524: XEiJ.regRn[ea] = x << 24 | x << 8 & 0x00ff0000 | x >>> 8 & 0x0000ff00 | x >>> 24; 4525: } 4526: } else { //CMP2/CHK2.W <ea>,Rn 4527: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4528: XEiJ.mpuCycleCount += 34; 4529: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4530: throw M68kException.m6eSignal; 4531: } 4532: } //irpCmp2Chk2Word 4533: 4534: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4535: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4536: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4537: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4538: //SUBI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_000_mmm_rrr-{data} 4539: //SUB.B #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_000_mmm_rrr-{data} [SUBI.B #<data>,<ea>] 4540: public static void irpSubiByte () throws M68kException { 4541: int ea = XEiJ.regOC & 63; 4542: int x; 4543: int y; 4544: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4545: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4546: } else { 4547: y = XEiJ.regPC; 4548: XEiJ.regPC = y + 2; 4549: y = XEiJ.busRbs (y + 1); //pcbs 4550: } 4551: int z; 4552: if (ea < XEiJ.EA_AR) { //SUBI.B #<data>,Dr 4553: XEiJ.mpuCycleCount += 8; 4554: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y); 4555: } else { //SUBI.B #<data>,<mem> 4556: XEiJ.mpuCycleCount += 12; 4557: int a = efaMltByte (ea); 4558: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y)); 4559: } 4560: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4561: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4562: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4563: } //irpSubiByte 4564: 4565: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4566: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4567: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4568: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4569: //SUBI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_001_mmm_rrr-{data} 4570: //SUB.W #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_001_mmm_rrr-{data} [SUBI.W #<data>,<ea>] 4571: public static void irpSubiWord () throws M68kException { 4572: int ea = XEiJ.regOC & 63; 4573: int x; 4574: int y; 4575: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4576: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4577: } else { 4578: y = XEiJ.regPC; 4579: XEiJ.regPC = y + 2; 4580: y = XEiJ.busRwse (y); //pcws 4581: } 4582: int z; 4583: if (ea < XEiJ.EA_AR) { //SUBI.W #<data>,Dr 4584: XEiJ.mpuCycleCount += 8; 4585: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y)); 4586: } else { //SUBI.W #<data>,<mem> 4587: XEiJ.mpuCycleCount += 12; 4588: int a = efaMltWord (ea); 4589: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y)); 4590: } 4591: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4592: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4593: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4594: } //irpSubiWord 4595: 4596: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4597: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4598: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4599: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4600: //SUBI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_010_010_mmm_rrr-{data} 4601: //SUB.L #<data>,<ea> |A|012346|-|UUUUU|*****| M+-WXZ |0000_010_010_mmm_rrr-{data} [SUBI.L #<data>,<ea>] 4602: public static void irpSubiLong () throws M68kException { 4603: int ea = XEiJ.regOC & 63; 4604: int x; 4605: int y; 4606: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4607: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4608: } else { 4609: y = XEiJ.regPC; 4610: XEiJ.regPC = y + 4; 4611: y = XEiJ.busRlse (y); //pcls 4612: } 4613: int z; 4614: if (ea < XEiJ.EA_AR) { //SUBI.L #<data>,Dr 4615: XEiJ.mpuCycleCount += 16; 4616: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y; 4617: } else { //SUBI.L #<data>,<mem> 4618: XEiJ.mpuCycleCount += 20; 4619: int a = efaMltLong (ea); 4620: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y); 4621: } 4622: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4623: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4624: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 4625: } //irpSubiLong 4626: 4627: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4628: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4629: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4630: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4631: //FF1.L Dr |-|------|-|-UUUU|-**00|D |0000_010_011_000_rrr (ISA_C) 4632: // 4633: //FF1.L Dr 4634: // Drの最上位の1のbit31からのオフセットをDrに格納する 4635: // Drが0のときは32になる 4636: public static void irpCmp2Chk2Long () throws M68kException { 4637: int ea = XEiJ.regOC & 63; 4638: if (ea < XEiJ.EA_AR) { //FF1.L Dr 4639: XEiJ.mpuCycleCount += 4; 4640: int z = XEiJ.regRn[ea]; 4641: if (true) { 4642: XEiJ.regRn[ea] = Integer.numberOfLeadingZeros (z); 4643: } else { 4644: if (z == 0) { 4645: XEiJ.regRn[ea] = 32; 4646: } else { 4647: int k = -(z >>> 16) >> 16 & 16; 4648: k += -(z >>> k + 8) >> 8 & 8; 4649: k += -(z >>> k + 4) >> 4 & 4; 4650: // bit3 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 4651: // bit2 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 4652: // bit1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 4653: // bit0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 4654: XEiJ.regRn[ea] = ((0b11_11_11_11_11_11_11_11_10_10_10_10_01_01_00_00 >>> (z >>> k << 1)) & 3) + k; //intのシフトカウントは下位5bitだけが使用される 4655: } 4656: } 4657: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 4658: } else { //CMP2/CHK2.L <ea>,Rn 4659: //プロセッサの判別に使われることがあるのでMC68000ではCMP2/CHK2をエラーにしなければならない 4660: XEiJ.mpuCycleCount += 34; 4661: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 4662: throw M68kException.m6eSignal; 4663: } 4664: } //irpCmp2Chk2Long 4665: 4666: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4667: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4668: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4669: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4670: //ADDI.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_000_mmm_rrr-{data} 4671: public static void irpAddiByte () throws M68kException { 4672: int ea = XEiJ.regOC & 63; 4673: int x; 4674: int y; 4675: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4676: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4677: } else { 4678: y = XEiJ.regPC; 4679: XEiJ.regPC = y + 2; 4680: y = XEiJ.busRbs (y + 1); //pcbs 4681: } 4682: int z; 4683: if (ea < XEiJ.EA_AR) { //ADDI.B #<data>,Dr 4684: XEiJ.mpuCycleCount += 8; 4685: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y); 4686: } else { //ADDI.B #<data>,<mem> 4687: XEiJ.mpuCycleCount += 12; 4688: int a = efaMltByte (ea); 4689: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y)); 4690: } 4691: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4692: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4693: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4694: } //irpAddiByte 4695: 4696: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4697: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4698: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4699: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4700: //ADDI.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_001_mmm_rrr-{data} 4701: public static void irpAddiWord () throws M68kException { 4702: int ea = XEiJ.regOC & 63; 4703: int x; 4704: int y; 4705: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4706: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4707: } else { 4708: y = XEiJ.regPC; 4709: XEiJ.regPC = y + 2; 4710: y = XEiJ.busRwse (y); //pcws 4711: } 4712: int z; 4713: if (ea < XEiJ.EA_AR) { //ADDI.W #<data>,Dr 4714: XEiJ.mpuCycleCount += 8; 4715: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y)); 4716: } else { //ADDI.W #<data>,<mem> 4717: XEiJ.mpuCycleCount += 12; 4718: int a = efaMltWord (ea); 4719: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y)); 4720: } 4721: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4722: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4723: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4724: } //irpAddiWord 4725: 4726: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4727: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4728: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4729: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4730: //ADDI.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0000_011_010_mmm_rrr-{data} 4731: public static void irpAddiLong () throws M68kException { 4732: int ea = XEiJ.regOC & 63; 4733: int x; 4734: int y; 4735: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4736: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4737: } else { 4738: y = XEiJ.regPC; 4739: XEiJ.regPC = y + 4; 4740: y = XEiJ.busRlse (y); //pcls 4741: } 4742: int z; 4743: if (ea < XEiJ.EA_AR) { //ADDI.L #<data>,Dr 4744: XEiJ.mpuCycleCount += 16; 4745: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y; 4746: } else { //ADDI.L #<data>,<mem> 4747: XEiJ.mpuCycleCount += 20; 4748: int a = efaMltLong (ea); 4749: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y); 4750: } 4751: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 4752: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 4753: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 4754: } //irpAddiLong 4755: 4756: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4757: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4758: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4759: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4760: //BTST.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_000_000_rrr-{data} 4761: //BTST.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZP |0000_100_000_mmm_rrr-{data} 4762: public static void irpBtstImm () throws M68kException { 4763: int ea = XEiJ.regOC & 63; 4764: int y; 4765: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4766: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4767: } else { 4768: y = XEiJ.regPC; 4769: XEiJ.regPC = y + 2; 4770: y = XEiJ.busRbs (y + 1); //pcbs 4771: } 4772: if (ea < XEiJ.EA_AR) { //BTST.L #<data>,Dr 4773: XEiJ.mpuCycleCount += 10; 4774: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.regRn[ea] >>> y & 1) << 2; //ccr_btst。intのシフトは5bitでマスクされるので&31を省略 4775: } else { //BTST.B #<data>,<ea> 4776: XEiJ.mpuCycleCount += 8; 4777: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (~XEiJ.busRbs (efaMemByte (ea)) >>> (y & 7) & 1) << 2; //ccr_btst 4778: } 4779: } //irpBtstImm 4780: 4781: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4782: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4783: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4784: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4785: //BCHG.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_001_000_rrr-{data} 4786: //BCHG.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_001_mmm_rrr-{data} 4787: public static void irpBchgImm () throws M68kException { 4788: int ea = XEiJ.regOC & 63; 4789: int x; 4790: int y; 4791: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4792: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4793: } else { 4794: y = XEiJ.regPC; 4795: XEiJ.regPC = y + 2; 4796: y = XEiJ.busRbs (y + 1); //pcbs 4797: } 4798: if (ea < XEiJ.EA_AR) { //BCHG.L #<data>,Dr 4799: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) ^ (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4800: XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12; //(0xffff&y)!=0 4801: } else { //BCHG.B #<data>,<ea> 4802: XEiJ.mpuCycleCount += 12; 4803: int a = efaMltByte (ea); 4804: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) ^ (y = 1 << (y & 7))); 4805: } 4806: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4807: } //irpBchgImm 4808: 4809: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4810: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4811: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4812: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4813: //BCLR.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_010_000_rrr-{data} 4814: //BCLR.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_010_mmm_rrr-{data} 4815: public static void irpBclrImm () throws M68kException { 4816: int ea = XEiJ.regOC & 63; 4817: int x; 4818: int y; 4819: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4820: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4821: } else { 4822: y = XEiJ.regPC; 4823: XEiJ.regPC = y + 2; 4824: y = XEiJ.busRbs (y + 1); //pcbs 4825: } 4826: if (ea < XEiJ.EA_AR) { //BCLR.L #<data>,Dr 4827: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) & ~(y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4828: XEiJ.mpuCycleCount += (char) y != 0 ? 12 : 14; //(0xffff&y)!=0 4829: } else { //BCLR.B #<data>,<ea> 4830: XEiJ.mpuCycleCount += 12; 4831: int a = efaMltByte (ea); 4832: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) & ~(y = 1 << (y & 7))); 4833: } 4834: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4835: } //irpBclrImm 4836: 4837: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4838: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4839: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4840: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4841: //BSET.L #<data>,Dr |-|012346|-|--U--|--*--|D |0000_100_011_000_rrr-{data} 4842: //BSET.B #<data>,<ea> |-|012346|-|--U--|--*--| M+-WXZ |0000_100_011_mmm_rrr-{data} 4843: public static void irpBsetImm () throws M68kException { 4844: int ea = XEiJ.regOC & 63; 4845: int x; 4846: int y; 4847: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4848: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4849: } else { 4850: y = XEiJ.regPC; 4851: XEiJ.regPC = y + 2; 4852: y = XEiJ.busRbs (y + 1); //pcbs 4853: } 4854: if (ea < XEiJ.EA_AR) { //BSET.L #<data>,Dr 4855: XEiJ.regRn[ea] = (x = XEiJ.regRn[ea]) | (y = 1 << y); //intのシフトは5bitでマスクされるので1<<(y&0x1f)の&0x1fを省略 4856: XEiJ.mpuCycleCount += (char) y != 0 ? 10 : 12; //(0xffff&y)!=0 4857: } else { //BSET.B #<data>,<ea> 4858: XEiJ.mpuCycleCount += 12; 4859: int a = efaMltByte (ea); 4860: XEiJ.busWb (a, (x = XEiJ.busRbs (a)) | (y = 1 << (y & 7))); 4861: } 4862: XEiJ.regCCR = XEiJ.regCCR & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_N | XEiJ.REG_CCR_V | XEiJ.REG_CCR_C) | (x & y) - 1 >>> 31 << 2; //ccr_btst 4863: } //irpBsetImm 4864: 4865: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4866: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4867: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4868: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4869: //EORI.B #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} 4870: //EOR.B #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_000_mmm_rrr-{data} [EORI.B #<data>,<ea>] 4871: //EORI.B #<data>,CCR |-|012346|-|*****|*****| |0000_101_000_111_100-{data} 4872: public static void irpEoriByte () throws M68kException { 4873: int ea = XEiJ.regOC & 63; 4874: int z; 4875: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4876: z = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4877: } else { 4878: z = XEiJ.regPC; 4879: XEiJ.regPC = z + 2; 4880: z = XEiJ.busRbs (z + 1); //pcbs 4881: } 4882: if (ea < XEiJ.EA_AR) { //EORI.B #<data>,Dr 4883: XEiJ.mpuCycleCount += 8; 4884: z = XEiJ.regRn[ea] ^= 255 & z; //0拡張してからEOR 4885: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4886: } else if (ea == XEiJ.EA_IM) { //EORI.B #<data>,CCR 4887: XEiJ.mpuCycleCount += 20; 4888: XEiJ.regCCR ^= XEiJ.REG_CCR_MASK & z; 4889: } else { //EORI.B #<data>,<mem> 4890: XEiJ.mpuCycleCount += 12; 4891: int a = efaMltByte (ea); 4892: XEiJ.busWb (a, z ^= XEiJ.busRbs (a)); 4893: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 4894: } 4895: } //irpEoriByte 4896: 4897: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4898: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4899: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4900: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4901: //EORI.W #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} 4902: //EOR.W #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_001_mmm_rrr-{data} [EORI.W #<data>,<ea>] 4903: //EORI.W #<data>,SR |-|012346|P|*****|*****| |0000_101_001_111_100-{data} 4904: public static void irpEoriWord () throws M68kException { 4905: int ea = XEiJ.regOC & 63; 4906: if (ea < XEiJ.EA_AR) { //EORI.W #<data>,Dr 4907: int z; 4908: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4909: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4910: } else { 4911: z = XEiJ.regPC; 4912: XEiJ.regPC = z + 2; 4913: z = XEiJ.busRwse (z); //pcws 4914: } 4915: XEiJ.mpuCycleCount += 8; 4916: z = XEiJ.regRn[ea] ^= (char) z; //0拡張してからEOR 4917: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4918: } else if (ea == XEiJ.EA_IM) { //EORI.W #<data>,SR 4919: if (XEiJ.regSRS == 0) { //ユーザモードのとき 4920: XEiJ.mpuCycleCount += 34; 4921: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 4922: throw M68kException.m6eSignal; 4923: } 4924: //以下はスーパーバイザモード 4925: XEiJ.mpuCycleCount += 20; 4926: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4927: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 4928: } else { 4929: int t = XEiJ.regPC; 4930: XEiJ.regPC = t + 2; 4931: irpSetSR ((XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR) ^ XEiJ.busRwse (t)); //pcws。特権違反チェックが先 4932: } 4933: } else { //EORI.W #<data>,<mem> 4934: int z; 4935: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4936: z = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 4937: } else { 4938: z = XEiJ.regPC; 4939: XEiJ.regPC = z + 2; 4940: z = XEiJ.busRwse (z); //pcws 4941: } 4942: XEiJ.mpuCycleCount += 12; 4943: int a = efaMltWord (ea); 4944: XEiJ.busWw (a, z ^= XEiJ.busRws (a)); 4945: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 4946: } 4947: } //irpEoriWord 4948: 4949: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4950: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4951: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4952: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4953: //EORI.L #<data>,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} 4954: //EOR.L #<data>,<ea> |A|012346|-|-UUUU|-**00|D M+-WXZ |0000_101_010_mmm_rrr-{data} [EORI.L #<data>,<ea>] 4955: public static void irpEoriLong () throws M68kException { 4956: int ea = XEiJ.regOC & 63; 4957: int y; 4958: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4959: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 4960: } else { 4961: y = XEiJ.regPC; 4962: XEiJ.regPC = y + 4; 4963: y = XEiJ.busRlse (y); //pcls 4964: } 4965: int z; 4966: if (ea < XEiJ.EA_AR) { //EORI.L #<data>,Dr 4967: XEiJ.mpuCycleCount += 16; 4968: z = XEiJ.regRn[ea] ^= y; 4969: } else { //EORI.L #<data>,<mem> 4970: XEiJ.mpuCycleCount += 20; 4971: int a = efaMltLong (ea); 4972: XEiJ.busWl (a, z = XEiJ.busRls (a) ^ y); 4973: } 4974: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 4975: } //irpEoriLong 4976: 4977: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4978: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 4979: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 4980: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 4981: //CMPI.B #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_000_mmm_rrr-{data} 4982: //CMP.B #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_000_mmm_rrr-{data} [CMPI.B #<data>,<ea>] 4983: public static void irpCmpiByte () throws M68kException { 4984: XEiJ.mpuCycleCount += 8; 4985: int ea = XEiJ.regOC & 63; 4986: int x; 4987: int y; 4988: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 4989: y = XEiJ.busRbs ((XEiJ.regPC += 2) - 1); //pcbs 4990: } else { 4991: y = XEiJ.regPC; 4992: XEiJ.regPC = y + 2; 4993: y = XEiJ.busRbs (y + 1); //pcbs 4994: } 4995: int z = (byte) ((x = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea))) - y); //アドレッシングモードに注意 4996: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 4997: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 4998: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 4999: } //irpCmpiByte 5000: 5001: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5002: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5003: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5004: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5005: //CMPI.W #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_001_mmm_rrr-{data} 5006: //CMP.W #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_001_mmm_rrr-{data} [CMPI.W #<data>,<ea>] 5007: public static void irpCmpiWord () throws M68kException { 5008: XEiJ.mpuCycleCount += 8; 5009: int ea = XEiJ.regOC & 63; 5010: int x; 5011: int y; 5012: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5013: y = XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 5014: } else { 5015: y = XEiJ.regPC; 5016: XEiJ.regPC = y + 2; 5017: y = XEiJ.busRwse (y); //pcws 5018: } 5019: int z = (short) ((x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea))) - y); //アドレッシングモードに注意 5020: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 5021: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5022: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 5023: } //irpCmpiWord 5024: 5025: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5026: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5027: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5028: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5029: //CMPI.L #<data>,<ea> |-|01----|-|-UUUU|-****|D M+-WXZ |0000_110_010_mmm_rrr-{data} 5030: //CMP.L #<data>,<ea> |A|01----|-|-UUUU|-****| M+-WXZ |0000_110_010_mmm_rrr-{data} [CMPI.L #<data>,<ea>] 5031: public static void irpCmpiLong () throws M68kException { 5032: int ea = XEiJ.regOC & 63; 5033: int x; 5034: int y; 5035: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5036: y = XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 5037: } else { 5038: y = XEiJ.regPC; 5039: XEiJ.regPC = y + 4; 5040: y = XEiJ.busRlse (y); //pcls 5041: } 5042: int z; 5043: if (ea < XEiJ.EA_AR) { //CMPI.L #<data>,Dr 5044: XEiJ.mpuCycleCount += 14; 5045: z = (x = XEiJ.regRn[ea]) - y; 5046: } else { //CMPI.L #<data>,<mem> 5047: XEiJ.mpuCycleCount += 12; 5048: z = (x = XEiJ.busRls (efaMltLong (ea))) - y; //アドレッシングモードに注意 5049: } 5050: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 5051: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5052: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 5053: } //irpCmpiLong 5054: 5055: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5056: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5057: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5058: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5059: //MOVES.B <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn000000000000 5060: //MOVES.B Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_000_mmm_rrr-rnnn100000000000 5061: // 5062: //MOVES.B <ea>,Rn 5063: // MOVES.B <ea>,DnはDnの最下位バイトだけ更新する 5064: // MOVES.B <ea>,Anはバイトデータをロングに符号拡張してAnの全体を更新する 5065: // SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、 5066: // SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5067: // 5068: //MOVES.B Rn,<ea> 5069: // DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、 5070: // DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5071: public static void irpMovesByte () throws M68kException { 5072: int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz 5073: if (w << -11 != 0) { 5074: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 5075: throw M68kException.m6eSignal; 5076: } 5077: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5078: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5079: throw M68kException.m6eSignal; 5080: } 5081: //以下はスーパーバイザモード 5082: XEiJ.mpuCycleCount += 4; 5083: int a = efaMltByte (XEiJ.regOC & 63); 5084: int n = w >>> 12; //n 5085: if (w << 31 - 11 >= 0) { //MOVES.B <ea>,Rn。リード 5086: MemoryMappedDevice[] mm; 5087: if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) { //ユーザモード 5088: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5089: } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) { //スーパーバイザモード 5090: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5091: } else { //CPU空間などは不可 5092: M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_READ; 5093: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5094: M68kException.m6eAddress = a; 5095: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5096: M68kException.m6eSize = XEiJ.MPU_SS_BYTE; 5097: throw M68kException.m6eSignal; 5098: } 5099: if (n < 8) { //MOVES.B <ea>,Dn 5100: XEiJ.regRn[n] = XEiJ.regRn[n] & ~255 | mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbz (a); 5101: } else { //MOVES.B <ea>,An 5102: XEiJ.regRn[n] = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRbs (a); 5103: } 5104: } else { //MOVES.B Rn,<ea>。ライト 5105: MemoryMappedDevice[] mm; 5106: if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) { //ユーザモード 5107: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5108: } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) { //スーパーバイザモード 5109: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5110: } else { //CPU空間などは不可 5111: M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_WRITE; 5112: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5113: M68kException.m6eAddress = a; 5114: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5115: M68kException.m6eSize = XEiJ.MPU_SS_BYTE; 5116: throw M68kException.m6eSignal; 5117: } 5118: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWb (a, XEiJ.regRn[n]); 5119: } 5120: } //irpMovesByte 5121: 5122: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5123: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5124: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5125: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5126: //MOVES.W <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn000000000000 5127: //MOVES.W Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_001_mmm_rrr-rnnn100000000000 5128: // 5129: //MOVES.W <ea>,Rn 5130: // MOVES.W <ea>,DnはDnの下位ワードだけ更新する 5131: // MOVES.W <ea>,Anはワードデータをロングに符号拡張してAnの全体を更新する 5132: // SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、 5133: // SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5134: // 5135: //MOVES.W Rn,<ea> 5136: // DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、 5137: // DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5138: public static void irpMovesWord () throws M68kException { 5139: int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz 5140: if (w << -11 != 0) { 5141: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 5142: throw M68kException.m6eSignal; 5143: } 5144: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5145: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5146: throw M68kException.m6eSignal; 5147: } 5148: //以下はスーパーバイザモード 5149: XEiJ.mpuCycleCount += 4; 5150: int a = efaMltWord (XEiJ.regOC & 63); 5151: int n = w >>> 12; //n 5152: if (w << 31 - 11 >= 0) { //MOVES.W <ea>,Rn。リード 5153: MemoryMappedDevice[] mm; 5154: if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) { //ユーザモード 5155: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5156: } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) { //スーパーバイザモード 5157: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5158: } else { //CPU空間などは不可 5159: M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_READ; 5160: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5161: M68kException.m6eAddress = a; 5162: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5163: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5164: throw M68kException.m6eSignal; 5165: } 5166: int z; 5167: if ((a & 1) == 0) { //偶数 5168: z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a); 5169: } else { //奇数 5170: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5171: M68kException.m6eAddress = a; 5172: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5173: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5174: throw M68kException.m6eSignal; 5175: } 5176: if (n < 8) { //MOVES.W <ea>,Dn 5177: XEiJ.regRn[n] = XEiJ.regRn[n] & ~65535 | z; 5178: } else { //MOVES.W <ea>,An 5179: XEiJ.regRn[n] = (short) z; 5180: } 5181: } else { //MOVES.W Rn,<ea>。ライト 5182: MemoryMappedDevice[] mm; 5183: if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) { //ユーザモード 5184: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5185: } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) { //スーパーバイザモード 5186: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5187: } else { //CPU空間などは不可 5188: M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_WRITE; 5189: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5190: M68kException.m6eAddress = a; 5191: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5192: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5193: throw M68kException.m6eSignal; 5194: } 5195: int z = XEiJ.regRn[n]; 5196: if ((a & 1) == 0) { //偶数 5197: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z); 5198: } else { //奇数 5199: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5200: M68kException.m6eAddress = a; 5201: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5202: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 5203: throw M68kException.m6eSignal; 5204: } 5205: } 5206: } //irpMovesWord 5207: 5208: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5209: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5210: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5211: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5212: //MOVES.L <ea>,Rn |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn000000000000 5213: //MOVES.L Rn,<ea> |-|-12346|P|-----|-----| M+-WXZ |0000_111_010_mmm_rrr-rnnn100000000000 5214: // 5215: //MOVES.L <ea>,Rn 5216: // SFC=1,2,5,6はアドレス変換あり、SFC=0,3,4はアドレス変換なし、 5217: // SFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5218: // 5219: //MOVES.L Rn,<ea> 5220: // DFC=1,2,5,6はアドレス変換あり、DFC=0,3,4はアドレス変換なし、 5221: // DFC=7はCPU空間なのでコプロセッサが割り当てられている領域以外はバスエラーになる 5222: public static void irpMovesLong () throws M68kException { 5223: int w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz 5224: if (w << -11 != 0) { 5225: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 5226: throw M68kException.m6eSignal; 5227: } 5228: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5229: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5230: throw M68kException.m6eSignal; 5231: } 5232: //以下はスーパーバイザモード 5233: XEiJ.mpuCycleCount += 4; 5234: int a = efaMltLong (XEiJ.regOC & 63); 5235: int n = w >>> 12; //n 5236: if (w << 31 - 11 >= 0) { //MOVES.L <ea>,Rn。リード 5237: MemoryMappedDevice[] mm; 5238: if (XEiJ.mpuSFC == 1 || XEiJ.mpuSFC == 2) { //ユーザモード 5239: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5240: } else if (XEiJ.mpuSFC == 5 || XEiJ.mpuSFC == 6) { //スーパーバイザモード 5241: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5242: } else { //CPU空間などは不可 5243: M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_READ; 5244: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5245: M68kException.m6eAddress = a; 5246: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5247: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5248: throw M68kException.m6eSignal; 5249: } 5250: int z; 5251: if ((a & 3) == 0) { //4の倍数 5252: z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRls (a); 5253: } else if ((a & 1) == 0) { //4の倍数+2 5254: z = mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRws (a) << 16; 5255: a += 2; 5256: z |= mm[a >>> XEiJ.BUS_PAGE_BITS].mmdRwz (a); 5257: } else { //奇数 5258: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5259: M68kException.m6eAddress = a; 5260: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 5261: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5262: throw M68kException.m6eSignal; 5263: } 5264: XEiJ.regRn[n] = z; 5265: } else { //MOVES.L Rn,<ea>。ライト 5266: MemoryMappedDevice[] mm; 5267: if (XEiJ.mpuDFC == 1 || XEiJ.mpuDFC == 2) { //ユーザモード 5268: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpUserMap : XEiJ.busUserMap; 5269: } else if (XEiJ.mpuDFC == 5 || XEiJ.mpuDFC == 6) { //スーパーバイザモード 5270: mm = DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap; 5271: } else { //CPU空間などは不可 5272: M68kException.m6eFSLW |= M68kException.M6E_FSLW_BUS_ERROR_ON_WRITE; 5273: M68kException.m6eNumber = M68kException.M6E_ACCESS_FAULT; 5274: M68kException.m6eAddress = a; 5275: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5276: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5277: throw M68kException.m6eSignal; 5278: } 5279: int z = XEiJ.regRn[n]; 5280: if ((a & 3) == 0) { //4の倍数 5281: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWl (a, z); 5282: } else if ((a & 1) == 0) { //4の倍数+2 5283: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z >> 16); 5284: a += 2; 5285: mm[a >>> XEiJ.BUS_PAGE_BITS].mmdWw (a, z); 5286: } else { //奇数 5287: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 5288: M68kException.m6eAddress = a; 5289: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 5290: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 5291: throw M68kException.m6eSignal; 5292: } 5293: } 5294: } //irpMovesLong 5295: 5296: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5297: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5298: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5299: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5300: //MOVE.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_000_mmm_rrr 5301: public static void irpMoveToDRByte () throws M68kException { 5302: XEiJ.mpuCycleCount += 4; 5303: int ea = XEiJ.regOC & 63; 5304: int qqq = XEiJ.regOC >> 9 & 7; 5305: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5306: XEiJ.regRn[qqq] = ~255 & XEiJ.regRn[qqq] | 255 & z; 5307: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5308: } //irpMoveToDRByte 5309: 5310: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5311: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5312: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5313: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5314: //MOVE.B <ea>,(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_010_mmm_rrr 5315: public static void irpMoveToMMByte () throws M68kException { 5316: XEiJ.mpuCycleCount += 8; 5317: int ea = XEiJ.regOC & 63; 5318: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5319: XEiJ.busWb (XEiJ.regRn[XEiJ.regOC >> 9], z); //1qqq=aqq 5320: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5321: } //irpMoveToMMByte 5322: 5323: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5324: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5325: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5326: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5327: //MOVE.B <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_011_mmm_rrr 5328: public static void irpMoveToMPByte () throws M68kException { 5329: XEiJ.mpuCycleCount += 8; 5330: int ea = XEiJ.regOC & 63; 5331: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5332: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5333: XEiJ.busWb (aqq < 15 ? XEiJ.regRn[aqq]++ : (XEiJ.regRn[15] += 2) - 2, z); 5334: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5335: } //irpMoveToMPByte 5336: 5337: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5338: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5339: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5340: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5341: //MOVE.B <ea>,-(Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_100_mmm_rrr 5342: public static void irpMoveToMNByte () throws M68kException { 5343: XEiJ.mpuCycleCount += 8; 5344: int ea = XEiJ.regOC & 63; 5345: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5346: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5347: XEiJ.busWb (aqq < 15 ? --XEiJ.regRn[aqq] : (XEiJ.regRn[15] -= 2), z); 5348: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5349: } //irpMoveToMNByte 5350: 5351: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5352: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5353: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5354: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5355: //MOVE.B <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_101_mmm_rrr 5356: public static void irpMoveToMWByte () throws M68kException { 5357: XEiJ.mpuCycleCount += 12; 5358: int ea = XEiJ.regOC & 63; 5359: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5360: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5361: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5362: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5363: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5364: z); 5365: } else { 5366: int t = XEiJ.regPC; 5367: XEiJ.regPC = t + 2; 5368: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5369: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5370: z); 5371: } 5372: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5373: } //irpMoveToMWByte 5374: 5375: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5376: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5377: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5378: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5379: //MOVE.B <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_qqq_110_mmm_rrr 5380: public static void irpMoveToMXByte () throws M68kException { 5381: XEiJ.mpuCycleCount += 14; 5382: int ea = XEiJ.regOC & 63; 5383: int aqq = XEiJ.regOC >> 9; //1qqq=aqq 5384: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); //ここでAqが変化する可能性があることに注意 5385: int w; 5386: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5387: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5388: } else { 5389: w = XEiJ.regPC; 5390: XEiJ.regPC = w + 2; 5391: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5392: } 5393: XEiJ.busWb (XEiJ.regRn[aqq] //ベースレジスタ 5394: + (byte) w //バイトディスプレースメント 5395: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5396: XEiJ.regRn[w >> 12]), //ロングインデックス 5397: z); 5398: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5399: } //irpMoveToMXByte 5400: 5401: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5402: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5403: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5404: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5405: //MOVE.B <ea>,(xxx).W |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_000_111_mmm_rrr 5406: public static void irpMoveToZWByte () throws M68kException { 5407: XEiJ.mpuCycleCount += 12; 5408: int ea = XEiJ.regOC & 63; 5409: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5410: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5411: XEiJ.busWb (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5412: z); 5413: } else { 5414: int t = XEiJ.regPC; 5415: XEiJ.regPC = t + 2; 5416: XEiJ.busWb (XEiJ.busRwse (t), //pcws 5417: z); 5418: } 5419: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5420: } //irpMoveToZWByte 5421: 5422: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5423: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5424: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5425: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5426: //MOVE.B <ea>,(xxx).L |-|012346|-|-UUUU|-**00|D M+-WXZPI|0001_001_111_mmm_rrr 5427: public static void irpMoveToZLByte () throws M68kException { 5428: XEiJ.mpuCycleCount += 16; 5429: int ea = XEiJ.regOC & 63; 5430: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 5431: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5432: XEiJ.busWb (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5433: z); 5434: } else { 5435: int t = XEiJ.regPC; 5436: XEiJ.regPC = t + 4; 5437: XEiJ.busWb (XEiJ.busRlse (t), //pcls 5438: z); 5439: } 5440: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 5441: } //irpMoveToZLByte 5442: 5443: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5444: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5445: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5446: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5447: //MOVE.L <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_000_mmm_rrr 5448: public static void irpMoveToDRLong () throws M68kException { 5449: XEiJ.mpuCycleCount += 4; 5450: int ea = XEiJ.regOC & 63; 5451: int z; 5452: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5453: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5454: } //irpMoveToDRLong 5455: 5456: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5457: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5458: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5459: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5460: //MOVEA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr 5461: //MOVE.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0010_qqq_001_mmm_rrr [MOVEA.L <ea>,Aq] 5462: public static void irpMoveaLong () throws M68kException { 5463: XEiJ.mpuCycleCount += 4; 5464: int ea = XEiJ.regOC & 63; 5465: XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意 5466: } //irpMoveaLong 5467: 5468: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5469: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5470: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5471: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5472: //MOVE.L <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_010_mmm_rrr 5473: public static void irpMoveToMMLong () throws M68kException { 5474: XEiJ.mpuCycleCount += 12; 5475: int ea = XEiJ.regOC & 63; 5476: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5477: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)], z); 5478: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5479: } //irpMoveToMMLong 5480: 5481: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5482: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5483: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5484: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5485: //MOVE.L <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_011_mmm_rrr 5486: public static void irpMoveToMPLong () throws M68kException { 5487: XEiJ.mpuCycleCount += 12; 5488: int ea = XEiJ.regOC & 63; 5489: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5490: XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] += 4) - 4, z); 5491: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5492: } //irpMoveToMPLong 5493: 5494: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5495: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5496: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5497: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5498: //MOVE.L <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_100_mmm_rrr 5499: public static void irpMoveToMNLong () throws M68kException { 5500: XEiJ.mpuCycleCount += 12; 5501: int ea = XEiJ.regOC & 63; 5502: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5503: XEiJ.busWl ((XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] -= 4), z); 5504: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5505: } //irpMoveToMNLong 5506: 5507: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5508: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5509: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5510: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5511: //MOVE.L <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_101_mmm_rrr 5512: public static void irpMoveToMWLong () throws M68kException { 5513: XEiJ.mpuCycleCount += 16; 5514: int ea = XEiJ.regOC & 63; 5515: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5516: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5517: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] //ベースレジスタ 5518: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5519: z); 5520: } else { 5521: int t = XEiJ.regPC; 5522: XEiJ.regPC = t + 2; 5523: XEiJ.busWl (XEiJ.regRn[(XEiJ.regOC >> 9) - (16 - 8)] //ベースレジスタ 5524: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5525: z); 5526: } 5527: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5528: } //irpMoveToMWLong 5529: 5530: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5531: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5532: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5533: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5534: //MOVE.L <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_qqq_110_mmm_rrr 5535: public static void irpMoveToMXLong () throws M68kException { 5536: XEiJ.mpuCycleCount += 18; 5537: int ea = XEiJ.regOC & 63; 5538: int aqq = (XEiJ.regOC >> 9) - (16 - 8); 5539: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5540: int w; 5541: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5542: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5543: } else { 5544: w = XEiJ.regPC; 5545: XEiJ.regPC = w + 2; 5546: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5547: } 5548: XEiJ.busWl (XEiJ.regRn[aqq] //ベースレジスタ 5549: + (byte) w //バイトディスプレースメント 5550: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5551: XEiJ.regRn[w >> 12]), //ロングインデックス 5552: z); 5553: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5554: } //irpMoveToMXLong 5555: 5556: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5557: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5558: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5559: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5560: //MOVE.L <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_000_111_mmm_rrr 5561: public static void irpMoveToZWLong () throws M68kException { 5562: XEiJ.mpuCycleCount += 16; 5563: int ea = XEiJ.regOC & 63; 5564: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5565: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5566: XEiJ.busWl (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5567: z); 5568: } else { 5569: int t = XEiJ.regPC; 5570: XEiJ.regPC = t + 2; 5571: XEiJ.busWl (XEiJ.busRwse (t), //pcws 5572: z); 5573: } 5574: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5575: } //irpMoveToZWLong 5576: 5577: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5578: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5579: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5580: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5581: //MOVE.L <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0010_001_111_mmm_rrr 5582: public static void irpMoveToZLLong () throws M68kException { 5583: XEiJ.mpuCycleCount += 20; 5584: int ea = XEiJ.regOC & 63; 5585: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5586: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5587: XEiJ.busWl (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5588: z); 5589: } else { 5590: int t = XEiJ.regPC; 5591: XEiJ.regPC = t + 4; 5592: XEiJ.busWl (XEiJ.busRlse (t), //pcls 5593: z); 5594: } 5595: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 5596: } //irpMoveToZLLong 5597: 5598: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5599: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5600: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5601: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5602: //MOVE.W <ea>,Dq |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_000_mmm_rrr 5603: public static void irpMoveToDRWord () throws M68kException { 5604: XEiJ.mpuCycleCount += 4; 5605: int ea = XEiJ.regOC & 63; 5606: int qqq = XEiJ.regOC >> 9 & 7; 5607: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5608: XEiJ.regRn[qqq] = ~65535 & XEiJ.regRn[qqq] | (char) z; 5609: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5610: } //irpMoveToDRWord 5611: 5612: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5613: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5614: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5615: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5616: //MOVEA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr 5617: //MOVE.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|0011_qqq_001_mmm_rrr [MOVEA.W <ea>,Aq] 5618: // 5619: //MOVEA.W <ea>,Aq 5620: // ワードデータをロングに符号拡張してAqの全体を更新する 5621: public static void irpMoveaWord () throws M68kException { 5622: XEiJ.mpuCycleCount += 4; 5623: int ea = XEiJ.regOC & 63; 5624: XEiJ.regRn[XEiJ.regOC >> 9 & 15] = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //符号拡張して32bit全部書き換える。このr[ea]はデータレジスタまたはアドレスレジスタ。右辺でAqが変化する可能性があることに注意 5625: } //irpMoveaWord 5626: 5627: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5628: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5629: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5630: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5631: //MOVE.W <ea>,(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_010_mmm_rrr 5632: public static void irpMoveToMMWord () throws M68kException { 5633: XEiJ.mpuCycleCount += 8; 5634: int ea = XEiJ.regOC & 63; 5635: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5636: XEiJ.busWw (XEiJ.regRn[XEiJ.regOC >> 9 & 15], z); 5637: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5638: } //irpMoveToMMWord 5639: 5640: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5641: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5642: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5643: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5644: //MOVE.W <ea>,(Aq)+ |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_011_mmm_rrr 5645: public static void irpMoveToMPWord () throws M68kException { 5646: XEiJ.mpuCycleCount += 8; 5647: int ea = XEiJ.regOC & 63; 5648: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5649: XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2, z); 5650: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5651: } //irpMoveToMPWord 5652: 5653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5654: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5655: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5656: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5657: //MOVE.W <ea>,-(Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_100_mmm_rrr 5658: public static void irpMoveToMNWord () throws M68kException { 5659: XEiJ.mpuCycleCount += 8; 5660: int ea = XEiJ.regOC & 63; 5661: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5662: XEiJ.busWw ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2), z); 5663: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5664: } //irpMoveToMNWord 5665: 5666: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5667: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5668: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5669: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5670: //MOVE.W <ea>,(d16,Aq) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_101_mmm_rrr 5671: public static void irpMoveToMWWord () throws M68kException { 5672: XEiJ.mpuCycleCount += 12; 5673: int ea = XEiJ.regOC & 63; 5674: int aqq = XEiJ.regOC >> 9 & 15; 5675: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5676: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5677: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5678: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws。ワードディスプレースメント 5679: z); 5680: } else { 5681: int t = XEiJ.regPC; 5682: XEiJ.regPC = t + 2; 5683: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5684: + XEiJ.busRwse (t), //pcws。ワードディスプレースメント 5685: z); 5686: } 5687: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5688: } //irpMoveToMWWord 5689: 5690: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5691: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5692: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5693: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5694: //MOVE.W <ea>,(d8,Aq,Rn.wl) |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_qqq_110_mmm_rrr 5695: public static void irpMoveToMXWord () throws M68kException { 5696: XEiJ.mpuCycleCount += 14; 5697: int ea = XEiJ.regOC & 63; 5698: int aqq = XEiJ.regOC >> 9 & 15; 5699: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 5700: int w; 5701: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5702: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 5703: } else { 5704: w = XEiJ.regPC; 5705: XEiJ.regPC = w + 2; 5706: w = XEiJ.busRwze (w); //pcwz。拡張ワード 5707: } 5708: XEiJ.busWw (XEiJ.regRn[aqq] //ベースレジスタ 5709: + (byte) w //バイトディスプレースメント 5710: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 5711: XEiJ.regRn[w >> 12]), //ロングインデックス 5712: z); 5713: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5714: } //irpMoveToMXWord 5715: 5716: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5717: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5718: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5719: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5720: //MOVE.W <ea>,(xxx).W |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_000_111_mmm_rrr 5721: public static void irpMoveToZWWord () throws M68kException { 5722: XEiJ.mpuCycleCount += 12; 5723: int ea = XEiJ.regOC & 63; 5724: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5725: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5726: XEiJ.busWw (XEiJ.busRwse ((XEiJ.regPC += 2) - 2), //pcws 5727: z); 5728: } else { 5729: int t = XEiJ.regPC; 5730: XEiJ.regPC = t + 2; 5731: XEiJ.busWw (XEiJ.busRwse (t), //pcws 5732: z); 5733: } 5734: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5735: } //irpMoveToZWWord 5736: 5737: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5738: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5739: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5740: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5741: //MOVE.W <ea>,(xxx).L |-|012346|-|-UUUU|-**00|DAM+-WXZPI|0011_001_111_mmm_rrr 5742: public static void irpMoveToZLWord () throws M68kException { 5743: XEiJ.mpuCycleCount += 16; 5744: int ea = XEiJ.regOC & 63; 5745: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 5746: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 5747: XEiJ.busWw (XEiJ.busRlse ((XEiJ.regPC += 4) - 4), //pcls 5748: z); 5749: } else { 5750: int t = XEiJ.regPC; 5751: XEiJ.regPC = t + 4; 5752: XEiJ.busWw (XEiJ.busRlse (t), //pcls 5753: z); 5754: } 5755: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 5756: } //irpMoveToZLWord 5757: 5758: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5759: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5760: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5761: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5762: //NEGX.B <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_000_mmm_rrr 5763: public static void irpNegxByte () throws M68kException { 5764: int ea = XEiJ.regOC & 63; 5765: int y; 5766: int z; 5767: if (ea < XEiJ.EA_AR) { //NEGX.B Dr 5768: XEiJ.mpuCycleCount += 4; 5769: z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y) - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 5770: } else { //NEGX.B <mem> 5771: XEiJ.mpuCycleCount += 8; 5772: int a = efaMltByte (ea); 5773: XEiJ.busWb (a, z = (byte) (-(y = XEiJ.busRbs (a)) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5774: } 5775: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5776: (y & z) >>> 31 << 1 | 5777: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5778: } //irpNegxByte 5779: 5780: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5781: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5782: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5783: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5784: //NEGX.W <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_001_mmm_rrr 5785: public static void irpNegxWord () throws M68kException { 5786: int ea = XEiJ.regOC & 63; 5787: int y; 5788: int z; 5789: if (ea < XEiJ.EA_AR) { //NEGX.W Dr 5790: XEiJ.mpuCycleCount += 4; 5791: z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) (-(y = (short) y) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5792: } else { //NEGX.W <mem> 5793: XEiJ.mpuCycleCount += 8; 5794: int a = efaMltWord (ea); 5795: XEiJ.busWw (a, z = (short) (-(y = XEiJ.busRws (a)) - (XEiJ.regCCR >> 4))); //Xの左側はすべて0なのでCCR_X&を省略 5796: } 5797: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5798: (y & z) >>> 31 << 1 | 5799: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5800: } //irpNegxWord 5801: 5802: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5803: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5804: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5805: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5806: //NEGX.L <ea> |-|012346|-|*UUUU|*****|D M+-WXZ |0100_000_010_mmm_rrr 5807: public static void irpNegxLong () throws M68kException { 5808: int ea = XEiJ.regOC & 63; 5809: int y; 5810: int z; 5811: if (ea < XEiJ.EA_AR) { //NEGX.L Dr 5812: XEiJ.mpuCycleCount += 6; 5813: XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 5814: } else { //NEGX.L <mem> 5815: XEiJ.mpuCycleCount += 12; 5816: int a = efaMltLong (ea); 5817: XEiJ.busWl (a, z = -(y = XEiJ.busRls (a)) - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 5818: } 5819: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 5820: (y & z) >>> 31 << 1 | 5821: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_negx 5822: } //irpNegxLong 5823: 5824: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5825: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5826: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5827: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5828: //MOVE.W SR,<ea> |-|-12346|P|*****|-----|D M+-WXZ |0100_000_011_mmm_rrr 5829: public static void irpMoveFromSR () throws M68kException { 5830: //MC68010以上では特権命令 5831: if (XEiJ.regSRS == 0) { //ユーザモードのとき 5832: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 5833: throw M68kException.m6eSignal; 5834: } 5835: //以下はスーパーバイザモード 5836: int ea = XEiJ.regOC & 63; 5837: if (ea < XEiJ.EA_AR) { //MOVE.W SR,Dr 5838: XEiJ.mpuCycleCount += 6; 5839: XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 5840: } else { //MOVE.W SR,<mem> 5841: //! 軽量化。MOVE from SRによる直後の命令のイミディエイトオペランドの自己書き換えが直後に反映されてしまう 5842: // MC68000でFEファンクションコールやSXコールのようなCCRを変化させる例外処理ルーチンの出口を次のように書くと、 5843: // 自己書き換えが直後に反映されずイミディエイトオペランドの領域がバッファになって前回の結果を返すことになるので期待通りに動作しない 5844: // move.w sr,@f+2 5845: // @@: move.b #0,(1,sp) 5846: // rte 5847: // これが期待通りに動作してしまったらMC68000を正しくエミュレートできていないということになる 5848: // https://stdkmd.net/bbs/page2.htm#comment134 5849: XEiJ.mpuCycleCount += 8; 5850: int a = efaMltWord (ea); 5851: if (XEiJ.MPU_OMIT_EXTRA_READ) { 5852: //! 軽量化。MC68000では書き込む前にリードが入るが省略する 5853: } else { 5854: XEiJ.busRws (a); 5855: } 5856: XEiJ.busWw (a, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); 5857: } 5858: } //irpMoveFromSR 5859: 5860: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5861: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5862: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5863: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5864: //CHK.W <ea>,Dq |-|012346|-|-UUUU|-*UUU|D M+-WXZPI|0100_qqq_110_mmm_rrr 5865: public static void irpChkWord () throws M68kException { 5866: XEiJ.mpuCycleCount += 10; 5867: int ea = XEiJ.regOC & 63; 5868: int x = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 5869: int y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 5870: int z = (short) (x - y); 5871: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | 5872: (y < 0 ? XEiJ.REG_CCR_N : 0) | 5873: (y == 0 ? XEiJ.REG_CCR_Z : 0) | 5874: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 5875: (x & (y ^ z) ^ (y | z)) >>> 31); 5876: if (y < 0 || x < y) { 5877: XEiJ.mpuCycleCount += 38 - 10; 5878: M68kException.m6eNumber = M68kException.M6E_CHK_INSTRUCTION; 5879: throw M68kException.m6eSignal; 5880: } 5881: } //irpChkWord 5882: 5883: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5884: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5885: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5886: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5887: //LEA.L <ea>,Aq |-|012346|-|-----|-----| M WXZP |0100_qqq_111_mmm_rrr 5888: public static void irpLea () throws M68kException { 5889: //XEiJ.mpuCycleCount += 4 - 4; 5890: XEiJ.regRn[(XEiJ.regOC >> 9) - (32 - 8)] = efaLeaPea (XEiJ.regOC & 63); 5891: } //irpLea 5892: 5893: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5894: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5895: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5896: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5897: //CLR.B <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_000_mmm_rrr (68000 and 68008 read before clear) 5898: public static void irpClrByte () throws M68kException { 5899: int ea = XEiJ.regOC & 63; 5900: if (ea < XEiJ.EA_AR) { //CLR.B Dr 5901: XEiJ.mpuCycleCount += 4; 5902: XEiJ.regRn[ea] &= ~0xff; 5903: } else { //CLR.B <mem> 5904: //MC68010はリードしない 5905: XEiJ.mpuCycleCount += 8; 5906: XEiJ.busWb (efaMltByte (ea), 0); 5907: } 5908: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5909: } //irpClrByte 5910: 5911: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5912: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5913: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5914: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5915: //CLR.W <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_001_mmm_rrr (68000 and 68008 read before clear) 5916: public static void irpClrWord () throws M68kException { 5917: int ea = XEiJ.regOC & 63; 5918: if (ea < XEiJ.EA_AR) { //CLR.W Dr 5919: XEiJ.mpuCycleCount += 4; 5920: XEiJ.regRn[ea] &= ~0xffff; 5921: } else { //CLR.W <mem> 5922: //MC68010はリードしない 5923: XEiJ.mpuCycleCount += 8; 5924: XEiJ.busWw (efaMltWord (ea), 0); 5925: } 5926: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5927: } //irpClrWord 5928: 5929: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5930: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5931: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5932: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5933: //CLR.L <ea> |-|012346|-|-UUUU|-0100|D M+-WXZ |0100_001_010_mmm_rrr (68000 and 68008 read before clear) 5934: public static void irpClrLong () throws M68kException { 5935: int ea = XEiJ.regOC & 63; 5936: if (ea < XEiJ.EA_AR) { //CLR.L Dr 5937: XEiJ.mpuCycleCount += 6; 5938: XEiJ.regRn[ea] = 0; 5939: } else { //CLR.L <mem> 5940: //MC68010はリードしない 5941: XEiJ.mpuCycleCount += 12; 5942: XEiJ.busWl (efaMltLong (ea), 0); 5943: } 5944: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z; //ccr_clr 5945: } //irpClrLong 5946: 5947: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5948: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5949: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5950: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5951: //MOVE.W CCR,<ea> |-|-12346|-|*****|-----|D M+-WXZ |0100_001_011_mmm_rrr 5952: public static void irpMoveFromCCR () throws M68kException { 5953: int ea = XEiJ.regOC & 63; 5954: if (ea < XEiJ.EA_AR) { //MOVE.W CCR,Dr 5955: XEiJ.mpuCycleCount += 4; 5956: XEiJ.regRn[ea] = ~0xffff & XEiJ.regRn[ea] | XEiJ.regCCR; 5957: } else { //MOVE.W CCR,<mem> 5958: XEiJ.mpuCycleCount += 8; 5959: XEiJ.busWw (efaMltWord (ea), XEiJ.regCCR); 5960: } 5961: } //irpMoveFromCCR 5962: 5963: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5964: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5965: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5966: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5967: //NEG.B <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_000_mmm_rrr 5968: public static void irpNegByte () throws M68kException { 5969: int ea = XEiJ.regOC & 63; 5970: int y; 5971: int z; 5972: if (ea < XEiJ.EA_AR) { //NEG.B Dr 5973: XEiJ.mpuCycleCount += 4; 5974: z = (byte) (XEiJ.regRn[ea] = ~0xff & (y = XEiJ.regRn[ea]) | 0xff & -(y = (byte) y)); 5975: } else { //NEG.B <mem> 5976: XEiJ.mpuCycleCount += 8; 5977: int a = efaMltByte (ea); 5978: XEiJ.busWb (a, z = (byte) -(y = XEiJ.busRbs (a))); 5979: } 5980: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 5981: (y & z) >>> 31 << 1 | 5982: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 5983: } //irpNegByte 5984: 5985: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5986: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 5987: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 5988: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 5989: //NEG.W <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_001_mmm_rrr 5990: public static void irpNegWord () throws M68kException { 5991: int ea = XEiJ.regOC & 63; 5992: int y; 5993: int z; 5994: if (ea < XEiJ.EA_AR) { //NEG.W Dr 5995: XEiJ.mpuCycleCount += 4; 5996: z = (short) (XEiJ.regRn[ea] = ~0xffff & (y = XEiJ.regRn[ea]) | (char) -(y = (short) y)); 5997: } else { //NEG.W <mem> 5998: XEiJ.mpuCycleCount += 8; 5999: int a = efaMltWord (ea); 6000: XEiJ.busWw (a, z = (short) -(y = XEiJ.busRws (a))); 6001: } 6002: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 6003: (y & z) >>> 31 << 1 | 6004: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 6005: } //irpNegWord 6006: 6007: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6008: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6009: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6010: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6011: //NEG.L <ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0100_010_010_mmm_rrr 6012: public static void irpNegLong () throws M68kException { 6013: int ea = XEiJ.regOC & 63; 6014: int y; 6015: int z; 6016: if (ea < XEiJ.EA_AR) { //NEG.L Dr 6017: XEiJ.mpuCycleCount += 6; 6018: XEiJ.regRn[ea] = z = -(y = XEiJ.regRn[ea]); 6019: } else { //NEG.L <mem> 6020: XEiJ.mpuCycleCount += 12; 6021: int a = efaMltLong (ea); 6022: XEiJ.busWl (a, z = -(y = XEiJ.busRls (a))); 6023: } 6024: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 6025: (y & z) >>> 31 << 1 | 6026: (y | z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_neg 6027: } //irpNegLong 6028: 6029: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6030: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6031: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6032: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6033: //MOVE.W <ea>,CCR |-|012346|-|UUUUU|*****|D M+-WXZPI|0100_010_011_mmm_rrr 6034: public static void irpMoveToCCR () throws M68kException { 6035: XEiJ.mpuCycleCount += 12; 6036: int ea = XEiJ.regOC & 63; 6037: XEiJ.regCCR = XEiJ.REG_CCR_MASK & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea))); 6038: } //irpMoveToCCR 6039: 6040: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6041: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6042: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6043: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6044: //NOT.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_000_mmm_rrr 6045: public static void irpNotByte () throws M68kException { 6046: int ea = XEiJ.regOC & 63; 6047: int z; 6048: if (ea < XEiJ.EA_AR) { //NOT.B Dr 6049: XEiJ.mpuCycleCount += 4; 6050: z = XEiJ.regRn[ea] ^= 255; //0拡張してからEOR 6051: } else { //NOT.B <mem> 6052: XEiJ.mpuCycleCount += 8; 6053: int a = efaMltByte (ea); 6054: XEiJ.busWb (a, z = ~XEiJ.busRbs (a)); 6055: } 6056: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 6057: } //irpNotByte 6058: 6059: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6060: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6061: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6062: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6063: //NOT.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_001_mmm_rrr 6064: public static void irpNotWord () throws M68kException { 6065: int ea = XEiJ.regOC & 63; 6066: int z; 6067: if (ea < XEiJ.EA_AR) { //NOT.W Dr 6068: XEiJ.mpuCycleCount += 4; 6069: z = XEiJ.regRn[ea] ^= 65535; //0拡張してからEOR 6070: } else { //NOT.W <mem> 6071: XEiJ.mpuCycleCount += 8; 6072: int a = efaMltWord (ea); 6073: XEiJ.busWw (a, z = ~XEiJ.busRws (a)); 6074: } 6075: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 6076: } //irpNotWord 6077: 6078: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6079: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6080: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6081: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6082: //NOT.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_011_010_mmm_rrr 6083: public static void irpNotLong () throws M68kException { 6084: int ea = XEiJ.regOC & 63; 6085: int z; 6086: if (ea < XEiJ.EA_AR) { //NOT.L Dr 6087: XEiJ.mpuCycleCount += 6; 6088: z = XEiJ.regRn[ea] ^= 0xffffffff; 6089: } else { //NOT.L <mem> 6090: XEiJ.mpuCycleCount += 12; 6091: int a = efaMltLong (ea); 6092: XEiJ.busWl (a, z = ~XEiJ.busRls (a)); 6093: } 6094: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6095: } //irpNotLong 6096: 6097: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6098: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6099: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6100: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6101: //MOVE.W <ea>,SR |-|012346|P|UUUUU|*****|D M+-WXZPI|0100_011_011_mmm_rrr 6102: public static void irpMoveToSR () throws M68kException { 6103: if (XEiJ.regSRS == 0) { //ユーザモードのとき 6104: XEiJ.mpuCycleCount += 34; 6105: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 6106: throw M68kException.m6eSignal; 6107: } 6108: //以下はスーパーバイザモード 6109: XEiJ.mpuCycleCount += 12; 6110: int ea = XEiJ.regOC & 63; 6111: irpSetSR (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea))); //特権違反チェックが先 6112: } //irpMoveToSR 6113: 6114: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6115: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6116: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6117: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6118: //NBCD.B <ea> |-|012346|-|UUUUU|*U*U*|D M+-WXZ |0100_100_000_mmm_rrr 6119: public static void irpNbcd () throws M68kException { 6120: int ea = XEiJ.regOC & 63; 6121: if (ea < XEiJ.EA_AR) { //NBCD.B Dr 6122: XEiJ.mpuCycleCount += 6; 6123: XEiJ.regRn[ea] = ~0xff & XEiJ.regRn[ea] | irpSbcd (0, XEiJ.regRn[ea]); 6124: } else { //NBCD.B <mem> 6125: XEiJ.mpuCycleCount += 8; 6126: int a = efaMltByte (ea); 6127: XEiJ.busWb (a, irpSbcd (0, XEiJ.busRbs (a))); 6128: } 6129: } //irpNbcd 6130: 6131: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6132: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6133: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6134: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6135: //SWAP.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_001_000_rrr 6136: //BKPT #<data> |-|-12346|-|-----|-----| |0100_100_001_001_ddd 6137: //PEA.L <ea> |-|012346|-|-----|-----| M WXZP |0100_100_001_mmm_rrr 6138: public static void irpPea () throws M68kException { 6139: int ea = XEiJ.regOC & 63; 6140: if (ea < XEiJ.EA_AR) { //SWAP.W Dr 6141: XEiJ.mpuCycleCount += 4; 6142: int x; 6143: int z; 6144: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) << 16 | x >>> 16; 6145: //上位ワードと下位ワードを入れ替えた後のDrをロングでテストする 6146: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6147: } else { //PEA.L <ea> 6148: XEiJ.mpuCycleCount += 12 - 4; 6149: int a = efaLeaPea (ea); //BKPT #<data>はここでillegal instructionになる 6150: XEiJ.busWl (XEiJ.regRn[15] -= 4, a); //pushl。評価順序に注意。wl(r[15]-=4,eaz_leapea(ea))は不可 6151: } 6152: } //irpPea 6153: 6154: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6155: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6156: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6157: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6158: //EXT.W Dr |-|012346|-|-UUUU|-**00|D |0100_100_010_000_rrr 6159: //MOVEM.W <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_010_mmm_rrr-llllllllllllllll 6160: public static void irpMovemToMemWord () throws M68kException { 6161: int ea = XEiJ.regOC & 63; 6162: if (ea < XEiJ.EA_AR) { //EXT.W Dr 6163: XEiJ.mpuCycleCount += 4; 6164: int z; 6165: XEiJ.regRn[ea] = ~0xffff & (z = XEiJ.regRn[ea]) | (char) (z = (byte) z); 6166: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6167: } else { //MOVEM.W <list>,<ea> 6168: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 6169: XEiJ.regPC += 2; 6170: if (ea >> 3 == XEiJ.MMM_MN) { //-(Ar) 6171: //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む 6172: //転送するレジスタが0個のときArは変化しない 6173: int arr = ea - (XEiJ.EA_MN - 8); 6174: int a = XEiJ.regRn[arr]; 6175: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6176: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6177: M68kException.m6eAddress = a; 6178: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6179: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 6180: throw M68kException.m6eSignal; 6181: } 6182: int t = a; 6183: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6184: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 2 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6185: 2 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) { //16個転送してもページを跨がない 6186: a &= XEiJ.BUS_MOTHER_MASK; 6187: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6188: if ((l & 0x0001) != 0) { 6189: a -= 2; 6190: int x = XEiJ.regRn[15]; 6191: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6192: MainMemory.mmrM8[a + 1] = (byte) x; 6193: } 6194: if ((l & 0x0002) != 0) { 6195: a -= 2; 6196: int x = XEiJ.regRn[14]; 6197: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6198: MainMemory.mmrM8[a + 1] = (byte) x; 6199: } 6200: if ((l & 0x0004) != 0) { 6201: a -= 2; 6202: int x = XEiJ.regRn[13]; 6203: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6204: MainMemory.mmrM8[a + 1] = (byte) x; 6205: } 6206: if ((l & 0x0008) != 0) { 6207: a -= 2; 6208: int x = XEiJ.regRn[12]; 6209: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6210: MainMemory.mmrM8[a + 1] = (byte) x; 6211: } 6212: if ((l & 0x0010) != 0) { 6213: a -= 2; 6214: int x = XEiJ.regRn[11]; 6215: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6216: MainMemory.mmrM8[a + 1] = (byte) x; 6217: } 6218: if ((l & 0x0020) != 0) { 6219: a -= 2; 6220: int x = XEiJ.regRn[10]; 6221: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6222: MainMemory.mmrM8[a + 1] = (byte) x; 6223: } 6224: if ((l & 0x0040) != 0) { 6225: a -= 2; 6226: int x = XEiJ.regRn[ 9]; 6227: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6228: MainMemory.mmrM8[a + 1] = (byte) x; 6229: } 6230: if ((byte) l < 0) { //(l & 0x0080) != 0 6231: a -= 2; 6232: int x = XEiJ.regRn[ 8]; 6233: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6234: MainMemory.mmrM8[a + 1] = (byte) x; 6235: } 6236: if ((l & 0x0100) != 0) { 6237: a -= 2; 6238: int x = XEiJ.regRn[ 7]; 6239: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6240: MainMemory.mmrM8[a + 1] = (byte) x; 6241: } 6242: if ((l & 0x0200) != 0) { 6243: a -= 2; 6244: int x = XEiJ.regRn[ 6]; 6245: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6246: MainMemory.mmrM8[a + 1] = (byte) x; 6247: } 6248: if ((l & 0x0400) != 0) { 6249: a -= 2; 6250: int x = XEiJ.regRn[ 5]; 6251: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6252: MainMemory.mmrM8[a + 1] = (byte) x; 6253: } 6254: if ((l & 0x0800) != 0) { 6255: a -= 2; 6256: int x = XEiJ.regRn[ 4]; 6257: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6258: MainMemory.mmrM8[a + 1] = (byte) x; 6259: } 6260: if ((l & 0x1000) != 0) { 6261: a -= 2; 6262: int x = XEiJ.regRn[ 3]; 6263: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6264: MainMemory.mmrM8[a + 1] = (byte) x; 6265: } 6266: if ((l & 0x2000) != 0) { 6267: a -= 2; 6268: int x = XEiJ.regRn[ 2]; 6269: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6270: MainMemory.mmrM8[a + 1] = (byte) x; 6271: } 6272: if ((l & 0x4000) != 0) { 6273: a -= 2; 6274: int x = XEiJ.regRn[ 1]; 6275: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6276: MainMemory.mmrM8[a + 1] = (byte) x; 6277: } 6278: if ((short) l < 0) { //(l & 0x8000) != 0 6279: a -= 2; 6280: int x = XEiJ.regRn[ 0]; 6281: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6282: MainMemory.mmrM8[a + 1] = (byte) x; 6283: } 6284: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6285: for (int i = 15; i >= 0; i--) { 6286: if ((l & 0x8000 >>> i) != 0) { 6287: a -= 2; 6288: int x = XEiJ.regRn[i]; 6289: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6290: MainMemory.mmrM8[a + 1] = (byte) x; 6291: } 6292: } 6293: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6294: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6295: for (int i = 15; l != 0; i--, l <<= 1) { 6296: if (l < 0) { 6297: a -= 2; 6298: int x = XEiJ.regRn[i]; 6299: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6300: MainMemory.mmrM8[a + 1] = (byte) x; 6301: } 6302: } 6303: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6304: for (int i = 15; l != 0; i--, l >>>= 1) { 6305: if ((l & 1) != 0) { 6306: a -= 2; 6307: int x = XEiJ.regRn[i]; 6308: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6309: MainMemory.mmrM8[a + 1] = (byte) x; 6310: } 6311: } 6312: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6313: for (int i = 15; l != 0; ) { 6314: int k = Integer.numberOfTrailingZeros (l); 6315: a -= 2; 6316: int x = XEiJ.regRn[i -= k]; 6317: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6318: MainMemory.mmrM8[a + 1] = (byte) x; 6319: l = l >>> k & ~1; 6320: } 6321: } 6322: a = t - (short) (t - a); 6323: } else { //メインメモリでないかページを跨ぐ可能性がある 6324: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6325: if ((l & 0x0001) != 0) { 6326: XEiJ.busWwe (a -= 2, XEiJ.regRn[15]); 6327: } 6328: if ((l & 0x0002) != 0) { 6329: XEiJ.busWwe (a -= 2, XEiJ.regRn[14]); 6330: } 6331: if ((l & 0x0004) != 0) { 6332: XEiJ.busWwe (a -= 2, XEiJ.regRn[13]); 6333: } 6334: if ((l & 0x0008) != 0) { 6335: XEiJ.busWwe (a -= 2, XEiJ.regRn[12]); 6336: } 6337: if ((l & 0x0010) != 0) { 6338: XEiJ.busWwe (a -= 2, XEiJ.regRn[11]); 6339: } 6340: if ((l & 0x0020) != 0) { 6341: XEiJ.busWwe (a -= 2, XEiJ.regRn[10]); 6342: } 6343: if ((l & 0x0040) != 0) { 6344: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 9]); 6345: } 6346: if ((byte) l < 0) { //(l & 0x0080) != 0 6347: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 8]); 6348: } 6349: if ((l & 0x0100) != 0) { 6350: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 7]); 6351: } 6352: if ((l & 0x0200) != 0) { 6353: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 6]); 6354: } 6355: if ((l & 0x0400) != 0) { 6356: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 5]); 6357: } 6358: if ((l & 0x0800) != 0) { 6359: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 4]); 6360: } 6361: if ((l & 0x1000) != 0) { 6362: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 3]); 6363: } 6364: if ((l & 0x2000) != 0) { 6365: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 2]); 6366: } 6367: if ((l & 0x4000) != 0) { 6368: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 1]); 6369: } 6370: if ((short) l < 0) { //(l & 0x8000) != 0 6371: XEiJ.busWwe (a -= 2, XEiJ.regRn[ 0]); 6372: } 6373: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6374: for (int i = 15; i >= 0; i--) { 6375: if ((l & 0x8000 >>> i) != 0) { 6376: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6377: } 6378: } 6379: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6380: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6381: for (int i = 15; l != 0; i--, l <<= 1) { 6382: if (l < 0) { 6383: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6384: } 6385: } 6386: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6387: for (int i = 15; l != 0; i--, l >>>= 1) { 6388: if ((l & 1) != 0) { 6389: XEiJ.busWwe (a -= 2, XEiJ.regRn[i]); 6390: } 6391: } 6392: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6393: for (int i = 15; l != 0; ) { 6394: int k = Integer.numberOfTrailingZeros (l); 6395: XEiJ.busWwe (a -= 2, XEiJ.regRn[i -= k]); 6396: l = l >>> k & ~1; 6397: } 6398: } 6399: } 6400: XEiJ.regRn[arr] = a; 6401: XEiJ.mpuCycleCount += 8 + (t - a << 1); //2バイト/個→4サイクル/個 6402: } else { //-(Ar)以外 6403: int a = efaCltWord (ea); 6404: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6405: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6406: M68kException.m6eAddress = a; 6407: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6408: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 6409: throw M68kException.m6eSignal; 6410: } 6411: int t = a; 6412: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6413: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6414: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) { //16個転送してもページを跨がない 6415: a &= XEiJ.BUS_MOTHER_MASK; 6416: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6417: if ((l & 0x0001) != 0) { 6418: int x = XEiJ.regRn[ 0]; 6419: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6420: MainMemory.mmrM8[a + 1] = (byte) x; 6421: a += 2; 6422: } 6423: if ((l & 0x0002) != 0) { 6424: int x = XEiJ.regRn[ 1]; 6425: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6426: MainMemory.mmrM8[a + 1] = (byte) x; 6427: a += 2; 6428: } 6429: if ((l & 0x0004) != 0) { 6430: int x = XEiJ.regRn[ 2]; 6431: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6432: MainMemory.mmrM8[a + 1] = (byte) x; 6433: a += 2; 6434: } 6435: if ((l & 0x0008) != 0) { 6436: int x = XEiJ.regRn[ 3]; 6437: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6438: MainMemory.mmrM8[a + 1] = (byte) x; 6439: a += 2; 6440: } 6441: if ((l & 0x0010) != 0) { 6442: int x = XEiJ.regRn[ 4]; 6443: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6444: MainMemory.mmrM8[a + 1] = (byte) x; 6445: a += 2; 6446: } 6447: if ((l & 0x0020) != 0) { 6448: int x = XEiJ.regRn[ 5]; 6449: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6450: MainMemory.mmrM8[a + 1] = (byte) x; 6451: a += 2; 6452: } 6453: if ((l & 0x0040) != 0) { 6454: int x = XEiJ.regRn[ 6]; 6455: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6456: MainMemory.mmrM8[a + 1] = (byte) x; 6457: a += 2; 6458: } 6459: if ((byte) l < 0) { //(l & 0x0080) != 0 6460: int x = XEiJ.regRn[ 7]; 6461: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6462: MainMemory.mmrM8[a + 1] = (byte) x; 6463: a += 2; 6464: } 6465: if ((l & 0x0100) != 0) { 6466: int x = XEiJ.regRn[ 8]; 6467: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6468: MainMemory.mmrM8[a + 1] = (byte) x; 6469: a += 2; 6470: } 6471: if ((l & 0x0200) != 0) { 6472: int x = XEiJ.regRn[ 9]; 6473: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6474: MainMemory.mmrM8[a + 1] = (byte) x; 6475: a += 2; 6476: } 6477: if ((l & 0x0400) != 0) { 6478: int x = XEiJ.regRn[10]; 6479: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6480: MainMemory.mmrM8[a + 1] = (byte) x; 6481: a += 2; 6482: } 6483: if ((l & 0x0800) != 0) { 6484: int x = XEiJ.regRn[11]; 6485: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6486: MainMemory.mmrM8[a + 1] = (byte) x; 6487: a += 2; 6488: } 6489: if ((l & 0x1000) != 0) { 6490: int x = XEiJ.regRn[12]; 6491: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6492: MainMemory.mmrM8[a + 1] = (byte) x; 6493: a += 2; 6494: } 6495: if ((l & 0x2000) != 0) { 6496: int x = XEiJ.regRn[13]; 6497: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6498: MainMemory.mmrM8[a + 1] = (byte) x; 6499: a += 2; 6500: } 6501: if ((l & 0x4000) != 0) { 6502: int x = XEiJ.regRn[14]; 6503: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6504: MainMemory.mmrM8[a + 1] = (byte) x; 6505: a += 2; 6506: } 6507: if ((short) l < 0) { //(l & 0x8000) != 0 6508: int x = XEiJ.regRn[15]; 6509: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6510: MainMemory.mmrM8[a + 1] = (byte) x; 6511: a += 2; 6512: } 6513: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6514: for (int i = 0; i <= 15; i++) { 6515: if ((l & 0x0001 << i) != 0) { 6516: int x = XEiJ.regRn[i]; 6517: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6518: MainMemory.mmrM8[a + 1] = (byte) x; 6519: a += 2; 6520: } 6521: } 6522: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6523: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6524: for (int i = 0; l != 0; i++, l <<= 1) { 6525: if (l < 0) { 6526: int x = XEiJ.regRn[i]; 6527: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6528: MainMemory.mmrM8[a + 1] = (byte) x; 6529: a += 2; 6530: } 6531: } 6532: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6533: for (int i = 0; l != 0; i++, l >>>= 1) { 6534: if ((l & 1) != 0) { 6535: int x = XEiJ.regRn[i]; 6536: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6537: MainMemory.mmrM8[a + 1] = (byte) x; 6538: a += 2; 6539: } 6540: } 6541: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6542: for (int i = 0; l != 0; ) { 6543: int k = Integer.numberOfTrailingZeros (l); 6544: int x = XEiJ.regRn[i += k]; 6545: MainMemory.mmrM8[a ] = (byte) (x >> 8); 6546: MainMemory.mmrM8[a + 1] = (byte) x; 6547: a += 2; 6548: l = l >>> k & ~1; 6549: } 6550: } 6551: a = t + (short) (a - t); 6552: } else { //メインメモリでないかページを跨ぐ可能性がある 6553: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6554: if ((l & 0x0001) != 0) { 6555: XEiJ.busWwe (a, XEiJ.regRn[ 0]); 6556: a += 2; 6557: } 6558: if ((l & 0x0002) != 0) { 6559: XEiJ.busWwe (a, XEiJ.regRn[ 1]); 6560: a += 2; 6561: } 6562: if ((l & 0x0004) != 0) { 6563: XEiJ.busWwe (a, XEiJ.regRn[ 2]); 6564: a += 2; 6565: } 6566: if ((l & 0x0008) != 0) { 6567: XEiJ.busWwe (a, XEiJ.regRn[ 3]); 6568: a += 2; 6569: } 6570: if ((l & 0x0010) != 0) { 6571: XEiJ.busWwe (a, XEiJ.regRn[ 4]); 6572: a += 2; 6573: } 6574: if ((l & 0x0020) != 0) { 6575: XEiJ.busWwe (a, XEiJ.regRn[ 5]); 6576: a += 2; 6577: } 6578: if ((l & 0x0040) != 0) { 6579: XEiJ.busWwe (a, XEiJ.regRn[ 6]); 6580: a += 2; 6581: } 6582: if ((byte) l < 0) { //(l & 0x0080) != 0 6583: XEiJ.busWwe (a, XEiJ.regRn[ 7]); 6584: a += 2; 6585: } 6586: if ((l & 0x0100) != 0) { 6587: XEiJ.busWwe (a, XEiJ.regRn[ 8]); 6588: a += 2; 6589: } 6590: if ((l & 0x0200) != 0) { 6591: XEiJ.busWwe (a, XEiJ.regRn[ 9]); 6592: a += 2; 6593: } 6594: if ((l & 0x0400) != 0) { 6595: XEiJ.busWwe (a, XEiJ.regRn[10]); 6596: a += 2; 6597: } 6598: if ((l & 0x0800) != 0) { 6599: XEiJ.busWwe (a, XEiJ.regRn[11]); 6600: a += 2; 6601: } 6602: if ((l & 0x1000) != 0) { 6603: XEiJ.busWwe (a, XEiJ.regRn[12]); 6604: a += 2; 6605: } 6606: if ((l & 0x2000) != 0) { 6607: XEiJ.busWwe (a, XEiJ.regRn[13]); 6608: a += 2; 6609: } 6610: if ((l & 0x4000) != 0) { 6611: XEiJ.busWwe (a, XEiJ.regRn[14]); 6612: a += 2; 6613: } 6614: if ((short) l < 0) { //(l & 0x8000) != 0 6615: XEiJ.busWwe (a, XEiJ.regRn[15]); 6616: a += 2; 6617: } 6618: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6619: for (int i = 0; i <= 15; i++) { 6620: if ((l & 0x0001 << i) != 0) { 6621: XEiJ.busWwe (a, XEiJ.regRn[i]); 6622: a += 2; 6623: } 6624: } 6625: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6626: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6627: for (int i = 0; l != 0; i++, l <<= 1) { 6628: if (l < 0) { 6629: XEiJ.busWwe (a, XEiJ.regRn[i]); 6630: a += 2; 6631: } 6632: } 6633: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6634: for (int i = 0; l != 0; i++, l >>>= 1) { 6635: if ((l & 1) != 0) { 6636: XEiJ.busWwe (a, XEiJ.regRn[i]); 6637: a += 2; 6638: } 6639: } 6640: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6641: for (int i = 0; l != 0; ) { 6642: int k = Integer.numberOfTrailingZeros (l); 6643: XEiJ.busWwe (a, XEiJ.regRn[i += k]); 6644: a += 2; 6645: l = l >>> k & ~1; 6646: } 6647: } 6648: } 6649: XEiJ.mpuCycleCount += 4 + (a - t << 1); //2バイト/個→4サイクル/個 6650: } 6651: } 6652: } //irpMovemToMemWord 6653: 6654: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6655: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 6656: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 6657: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 6658: //EXT.L Dr |-|012346|-|-UUUU|-**00|D |0100_100_011_000_rrr 6659: //MOVEM.L <list>,<ea> |-|012346|-|-----|-----| M -WXZ |0100_100_011_mmm_rrr-llllllllllllllll 6660: public static void irpMovemToMemLong () throws M68kException { 6661: int ea = XEiJ.regOC & 63; 6662: if (ea < XEiJ.EA_AR) { //EXT.L Dr 6663: XEiJ.mpuCycleCount += 4; 6664: int z; 6665: XEiJ.regRn[ea] = z = (short) XEiJ.regRn[ea]; 6666: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 6667: } else { //MOVEM.L <list>,<ea> 6668: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 6669: XEiJ.regPC += 2; 6670: if (ea >> 3 == XEiJ.MMM_MN) { //-(Ar) 6671: //MOVEM.wl <list>,-(Ar)で<list>にArが含まれているとき、000/010は命令開始時のArを、020/030/040/060は命令開始時のAr-オペレーションサイズをメモリに書き込む 6672: //転送するレジスタが0個のときArは変化しない 6673: int arr = ea - (XEiJ.EA_MN - 8); 6674: int a = XEiJ.regRn[arr]; 6675: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6676: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6677: M68kException.m6eAddress = a; 6678: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6679: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 6680: throw M68kException.m6eSignal; 6681: } 6682: int t = a; 6683: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6684: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a - 4 >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6685: 4 * 16 <= (a & XEiJ.BUS_PAGE_SIZE - 1)) { //16個転送してもページを跨がない 6686: a &= XEiJ.BUS_MOTHER_MASK; 6687: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6688: if ((l & 0x0001) != 0) { 6689: a -= 4; 6690: int x = XEiJ.regRn[15]; 6691: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6692: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6693: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6694: MainMemory.mmrM8[a + 3] = (byte) x; 6695: } 6696: if ((l & 0x0002) != 0) { 6697: a -= 4; 6698: int x = XEiJ.regRn[14]; 6699: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6700: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6701: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6702: MainMemory.mmrM8[a + 3] = (byte) x; 6703: } 6704: if ((l & 0x0004) != 0) { 6705: a -= 4; 6706: int x = XEiJ.regRn[13]; 6707: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6708: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6709: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6710: MainMemory.mmrM8[a + 3] = (byte) x; 6711: } 6712: if ((l & 0x0008) != 0) { 6713: a -= 4; 6714: int x = XEiJ.regRn[12]; 6715: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6716: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6717: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6718: MainMemory.mmrM8[a + 3] = (byte) x; 6719: } 6720: if ((l & 0x0010) != 0) { 6721: a -= 4; 6722: int x = XEiJ.regRn[11]; 6723: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6724: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6725: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6726: MainMemory.mmrM8[a + 3] = (byte) x; 6727: } 6728: if ((l & 0x0020) != 0) { 6729: a -= 4; 6730: int x = XEiJ.regRn[10]; 6731: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6732: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6733: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6734: MainMemory.mmrM8[a + 3] = (byte) x; 6735: } 6736: if ((l & 0x0040) != 0) { 6737: a -= 4; 6738: int x = XEiJ.regRn[ 9]; 6739: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6740: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6741: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6742: MainMemory.mmrM8[a + 3] = (byte) x; 6743: } 6744: if ((byte) l < 0) { //(l & 0x0080) != 0 6745: a -= 4; 6746: int x = XEiJ.regRn[ 8]; 6747: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6748: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6749: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6750: MainMemory.mmrM8[a + 3] = (byte) x; 6751: } 6752: if ((l & 0x0100) != 0) { 6753: a -= 4; 6754: int x = XEiJ.regRn[ 7]; 6755: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6756: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6757: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6758: MainMemory.mmrM8[a + 3] = (byte) x; 6759: } 6760: if ((l & 0x0200) != 0) { 6761: a -= 4; 6762: int x = XEiJ.regRn[ 6]; 6763: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6764: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6765: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6766: MainMemory.mmrM8[a + 3] = (byte) x; 6767: } 6768: if ((l & 0x0400) != 0) { 6769: a -= 4; 6770: int x = XEiJ.regRn[ 5]; 6771: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6772: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6773: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6774: MainMemory.mmrM8[a + 3] = (byte) x; 6775: } 6776: if ((l & 0x0800) != 0) { 6777: a -= 4; 6778: int x = XEiJ.regRn[ 4]; 6779: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6780: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6781: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6782: MainMemory.mmrM8[a + 3] = (byte) x; 6783: } 6784: if ((l & 0x1000) != 0) { 6785: a -= 4; 6786: int x = XEiJ.regRn[ 3]; 6787: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6788: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6789: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6790: MainMemory.mmrM8[a + 3] = (byte) x; 6791: } 6792: if ((l & 0x2000) != 0) { 6793: a -= 4; 6794: int x = XEiJ.regRn[ 2]; 6795: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6796: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6797: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6798: MainMemory.mmrM8[a + 3] = (byte) x; 6799: } 6800: if ((l & 0x4000) != 0) { 6801: a -= 4; 6802: int x = XEiJ.regRn[ 1]; 6803: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6804: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6805: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6806: MainMemory.mmrM8[a + 3] = (byte) x; 6807: } 6808: if ((short) l < 0) { //(l & 0x8000) != 0 6809: a -= 4; 6810: int x = XEiJ.regRn[ 0]; 6811: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6812: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6813: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6814: MainMemory.mmrM8[a + 3] = (byte) x; 6815: } 6816: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6817: for (int i = 15; i >= 0; i--) { 6818: if ((l & 0x8000 >>> i) != 0) { 6819: a -= 4; 6820: int x = XEiJ.regRn[i]; 6821: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6822: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6823: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6824: MainMemory.mmrM8[a + 3] = (byte) x; 6825: } 6826: } 6827: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6828: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6829: for (int i = 15; l != 0; i--, l <<= 1) { 6830: if (l < 0) { 6831: a -= 4; 6832: int x = XEiJ.regRn[i]; 6833: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6834: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6835: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6836: MainMemory.mmrM8[a + 3] = (byte) x; 6837: } 6838: } 6839: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6840: for (int i = 15; l != 0; i--, l >>>= 1) { 6841: if ((l & 1) != 0) { 6842: a -= 4; 6843: int x = XEiJ.regRn[i]; 6844: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6845: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6846: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6847: MainMemory.mmrM8[a + 3] = (byte) x; 6848: } 6849: } 6850: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6851: for (int i = 15; l != 0; ) { 6852: int k = Integer.numberOfTrailingZeros (l); 6853: a -= 4; 6854: int x = XEiJ.regRn[i -= k]; 6855: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6856: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6857: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6858: MainMemory.mmrM8[a + 3] = (byte) x; 6859: l = l >>> k & ~1; 6860: } 6861: } 6862: a = t - (short) (t - a); 6863: } else { //メインメモリでないかページを跨ぐ可能性がある 6864: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6865: if ((l & 0x0001) != 0) { 6866: XEiJ.busWle (a -= 4, XEiJ.regRn[15]); 6867: } 6868: if ((l & 0x0002) != 0) { 6869: XEiJ.busWle (a -= 4, XEiJ.regRn[14]); 6870: } 6871: if ((l & 0x0004) != 0) { 6872: XEiJ.busWle (a -= 4, XEiJ.regRn[13]); 6873: } 6874: if ((l & 0x0008) != 0) { 6875: XEiJ.busWle (a -= 4, XEiJ.regRn[12]); 6876: } 6877: if ((l & 0x0010) != 0) { 6878: XEiJ.busWle (a -= 4, XEiJ.regRn[11]); 6879: } 6880: if ((l & 0x0020) != 0) { 6881: XEiJ.busWle (a -= 4, XEiJ.regRn[10]); 6882: } 6883: if ((l & 0x0040) != 0) { 6884: XEiJ.busWle (a -= 4, XEiJ.regRn[ 9]); 6885: } 6886: if ((byte) l < 0) { //(l & 0x0080) != 0 6887: XEiJ.busWle (a -= 4, XEiJ.regRn[ 8]); 6888: } 6889: if ((l & 0x0100) != 0) { 6890: XEiJ.busWle (a -= 4, XEiJ.regRn[ 7]); 6891: } 6892: if ((l & 0x0200) != 0) { 6893: XEiJ.busWle (a -= 4, XEiJ.regRn[ 6]); 6894: } 6895: if ((l & 0x0400) != 0) { 6896: XEiJ.busWle (a -= 4, XEiJ.regRn[ 5]); 6897: } 6898: if ((l & 0x0800) != 0) { 6899: XEiJ.busWle (a -= 4, XEiJ.regRn[ 4]); 6900: } 6901: if ((l & 0x1000) != 0) { 6902: XEiJ.busWle (a -= 4, XEiJ.regRn[ 3]); 6903: } 6904: if ((l & 0x2000) != 0) { 6905: XEiJ.busWle (a -= 4, XEiJ.regRn[ 2]); 6906: } 6907: if ((l & 0x4000) != 0) { 6908: XEiJ.busWle (a -= 4, XEiJ.regRn[ 1]); 6909: } 6910: if ((short) l < 0) { //(l & 0x8000) != 0 6911: XEiJ.busWle (a -= 4, XEiJ.regRn[ 0]); 6912: } 6913: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 6914: for (int i = 15; i >= 0; i--) { 6915: if ((l & 0x8000 >>> i) != 0) { 6916: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6917: } 6918: } 6919: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 6920: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 6921: for (int i = 15; l != 0; i--, l <<= 1) { 6922: if (l < 0) { 6923: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6924: } 6925: } 6926: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 6927: for (int i = 15; l != 0; i--, l >>>= 1) { 6928: if ((l & 1) != 0) { 6929: XEiJ.busWle (a -= 4, XEiJ.regRn[i]); 6930: } 6931: } 6932: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 6933: for (int i = 15; l != 0; ) { 6934: int k = Integer.numberOfTrailingZeros (l); 6935: XEiJ.busWle (a -= 4, XEiJ.regRn[i -= k]); 6936: l = l >>> k & ~1; 6937: } 6938: } 6939: } 6940: XEiJ.regRn[arr] = a; 6941: XEiJ.mpuCycleCount += 8 + (t - a << 1); //4バイト/個→8サイクル/個 6942: } else { //-(Ar)以外 6943: int a = efaCltLong (ea); 6944: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 6945: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 6946: M68kException.m6eAddress = a; 6947: M68kException.m6eDirection = XEiJ.MPU_WR_WRITE; 6948: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 6949: throw M68kException.m6eSignal; 6950: } 6951: int t = a; 6952: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 6953: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 6954: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) { //16個転送してもページを跨がない 6955: a &= XEiJ.BUS_MOTHER_MASK; 6956: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 6957: if ((l & 0x0001) != 0) { 6958: int x = XEiJ.regRn[ 0]; 6959: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6960: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6961: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6962: MainMemory.mmrM8[a + 3] = (byte) x; 6963: a += 4; 6964: } 6965: if ((l & 0x0002) != 0) { 6966: int x = XEiJ.regRn[ 1]; 6967: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6968: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6969: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6970: MainMemory.mmrM8[a + 3] = (byte) x; 6971: a += 4; 6972: } 6973: if ((l & 0x0004) != 0) { 6974: int x = XEiJ.regRn[ 2]; 6975: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6976: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6977: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6978: MainMemory.mmrM8[a + 3] = (byte) x; 6979: a += 4; 6980: } 6981: if ((l & 0x0008) != 0) { 6982: int x = XEiJ.regRn[ 3]; 6983: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6984: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6985: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6986: MainMemory.mmrM8[a + 3] = (byte) x; 6987: a += 4; 6988: } 6989: if ((l & 0x0010) != 0) { 6990: int x = XEiJ.regRn[ 4]; 6991: MainMemory.mmrM8[a ] = (byte) (x >> 24); 6992: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 6993: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 6994: MainMemory.mmrM8[a + 3] = (byte) x; 6995: a += 4; 6996: } 6997: if ((l & 0x0020) != 0) { 6998: int x = XEiJ.regRn[ 5]; 6999: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7000: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7001: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7002: MainMemory.mmrM8[a + 3] = (byte) x; 7003: a += 4; 7004: } 7005: if ((l & 0x0040) != 0) { 7006: int x = XEiJ.regRn[ 6]; 7007: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7008: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7009: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7010: MainMemory.mmrM8[a + 3] = (byte) x; 7011: a += 4; 7012: } 7013: if ((byte) l < 0) { //(l & 0x0080) != 0 7014: int x = XEiJ.regRn[ 7]; 7015: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7016: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7017: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7018: MainMemory.mmrM8[a + 3] = (byte) x; 7019: a += 4; 7020: } 7021: if ((l & 0x0100) != 0) { 7022: int x = XEiJ.regRn[ 8]; 7023: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7024: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7025: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7026: MainMemory.mmrM8[a + 3] = (byte) x; 7027: a += 4; 7028: } 7029: if ((l & 0x0200) != 0) { 7030: int x = XEiJ.regRn[ 9]; 7031: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7032: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7033: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7034: MainMemory.mmrM8[a + 3] = (byte) x; 7035: a += 4; 7036: } 7037: if ((l & 0x0400) != 0) { 7038: int x = XEiJ.regRn[10]; 7039: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7040: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7041: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7042: MainMemory.mmrM8[a + 3] = (byte) x; 7043: a += 4; 7044: } 7045: if ((l & 0x0800) != 0) { 7046: int x = XEiJ.regRn[11]; 7047: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7048: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7049: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7050: MainMemory.mmrM8[a + 3] = (byte) x; 7051: a += 4; 7052: } 7053: if ((l & 0x1000) != 0) { 7054: int x = XEiJ.regRn[12]; 7055: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7056: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7057: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7058: MainMemory.mmrM8[a + 3] = (byte) x; 7059: a += 4; 7060: } 7061: if ((l & 0x2000) != 0) { 7062: int x = XEiJ.regRn[13]; 7063: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7064: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7065: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7066: MainMemory.mmrM8[a + 3] = (byte) x; 7067: a += 4; 7068: } 7069: if ((l & 0x4000) != 0) { 7070: int x = XEiJ.regRn[14]; 7071: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7072: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7073: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7074: MainMemory.mmrM8[a + 3] = (byte) x; 7075: a += 4; 7076: } 7077: if ((short) l < 0) { //(l & 0x8000) != 0 7078: int x = XEiJ.regRn[15]; 7079: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7080: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7081: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7082: MainMemory.mmrM8[a + 3] = (byte) x; 7083: a += 4; 7084: } 7085: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7086: for (int i = 0; i <= 15; i++) { 7087: if ((l & 0x0001 << i) != 0) { 7088: int x = XEiJ.regRn[i]; 7089: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7090: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7091: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7092: MainMemory.mmrM8[a + 3] = (byte) x; 7093: a += 4; 7094: } 7095: } 7096: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7097: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7098: for (int i = 0; l != 0; i++, l <<= 1) { 7099: if (l < 0) { 7100: int x = XEiJ.regRn[i]; 7101: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7102: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7103: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7104: MainMemory.mmrM8[a + 3] = (byte) x; 7105: a += 4; 7106: } 7107: } 7108: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7109: for (int i = 0; l != 0; i++, l >>>= 1) { 7110: if ((l & 1) != 0) { 7111: int x = XEiJ.regRn[i]; 7112: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7113: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7114: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7115: MainMemory.mmrM8[a + 3] = (byte) x; 7116: a += 4; 7117: } 7118: } 7119: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7120: for (int i = 0; l != 0; ) { 7121: int k = Integer.numberOfTrailingZeros (l); 7122: int x = XEiJ.regRn[i += k]; 7123: MainMemory.mmrM8[a ] = (byte) (x >> 24); 7124: MainMemory.mmrM8[a + 1] = (byte) (x >> 16); 7125: MainMemory.mmrM8[a + 2] = (byte) (x >> 8); 7126: MainMemory.mmrM8[a + 3] = (byte) x; 7127: a += 4; 7128: l = l >>> k & ~1; 7129: } 7130: } 7131: a = t + (short) (a - t); 7132: } else { //メインメモリでないかページを跨ぐ可能性がある 7133: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7134: if ((l & 0x0001) != 0) { 7135: XEiJ.busWle (a, XEiJ.regRn[ 0]); 7136: a += 4; 7137: } 7138: if ((l & 0x0002) != 0) { 7139: XEiJ.busWle (a, XEiJ.regRn[ 1]); 7140: a += 4; 7141: } 7142: if ((l & 0x0004) != 0) { 7143: XEiJ.busWle (a, XEiJ.regRn[ 2]); 7144: a += 4; 7145: } 7146: if ((l & 0x0008) != 0) { 7147: XEiJ.busWle (a, XEiJ.regRn[ 3]); 7148: a += 4; 7149: } 7150: if ((l & 0x0010) != 0) { 7151: XEiJ.busWle (a, XEiJ.regRn[ 4]); 7152: a += 4; 7153: } 7154: if ((l & 0x0020) != 0) { 7155: XEiJ.busWle (a, XEiJ.regRn[ 5]); 7156: a += 4; 7157: } 7158: if ((l & 0x0040) != 0) { 7159: XEiJ.busWle (a, XEiJ.regRn[ 6]); 7160: a += 4; 7161: } 7162: if ((byte) l < 0) { //(l & 0x0080) != 0 7163: XEiJ.busWle (a, XEiJ.regRn[ 7]); 7164: a += 4; 7165: } 7166: if ((l & 0x0100) != 0) { 7167: XEiJ.busWle (a, XEiJ.regRn[ 8]); 7168: a += 4; 7169: } 7170: if ((l & 0x0200) != 0) { 7171: XEiJ.busWle (a, XEiJ.regRn[ 9]); 7172: a += 4; 7173: } 7174: if ((l & 0x0400) != 0) { 7175: XEiJ.busWle (a, XEiJ.regRn[10]); 7176: a += 4; 7177: } 7178: if ((l & 0x0800) != 0) { 7179: XEiJ.busWle (a, XEiJ.regRn[11]); 7180: a += 4; 7181: } 7182: if ((l & 0x1000) != 0) { 7183: XEiJ.busWle (a, XEiJ.regRn[12]); 7184: a += 4; 7185: } 7186: if ((l & 0x2000) != 0) { 7187: XEiJ.busWle (a, XEiJ.regRn[13]); 7188: a += 4; 7189: } 7190: if ((l & 0x4000) != 0) { 7191: XEiJ.busWle (a, XEiJ.regRn[14]); 7192: a += 4; 7193: } 7194: if ((short) l < 0) { //(l & 0x8000) != 0 7195: XEiJ.busWle (a, XEiJ.regRn[15]); 7196: a += 4; 7197: } 7198: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7199: for (int i = 0; i <= 15; i++) { 7200: if ((l & 0x0001 << i) != 0) { 7201: XEiJ.busWle (a, XEiJ.regRn[i]); 7202: a += 4; 7203: } 7204: } 7205: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7206: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7207: for (int i = 0; l != 0; i++, l <<= 1) { 7208: if (l < 0) { 7209: XEiJ.busWle (a, XEiJ.regRn[i]); 7210: a += 4; 7211: } 7212: } 7213: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7214: for (int i = 0; l != 0; i++, l >>>= 1) { 7215: if ((l & 1) != 0) { 7216: XEiJ.busWle (a, XEiJ.regRn[i]); 7217: a += 4; 7218: } 7219: } 7220: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7221: for (int i = 0; l != 0; ) { 7222: int k = Integer.numberOfTrailingZeros (l); 7223: XEiJ.busWle (a, XEiJ.regRn[i += k]); 7224: a += 4; 7225: l = l >>> k & ~1; 7226: } 7227: } 7228: } 7229: XEiJ.mpuCycleCount += 0 + (a - t << 1); //4バイト/個→8サイクル/個 7230: } 7231: } 7232: } //irpMovemToMemLong 7233: 7234: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7235: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7236: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7237: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7238: //TST.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_000_mmm_rrr 7239: public static void irpTstByte () throws M68kException { 7240: XEiJ.mpuCycleCount += 4; 7241: int ea = XEiJ.regOC & 63; 7242: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaMltByte (ea)))]; //ccr_tst_byte。アドレッシングモードに注意 7243: } //irpTstByte 7244: 7245: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7246: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7247: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7248: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7249: //TST.W <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_001_mmm_rrr 7250: public static void irpTstWord () throws M68kException { 7251: XEiJ.mpuCycleCount += 4; 7252: int ea = XEiJ.regOC & 63; 7253: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaMltWord (ea)); //アドレッシングモードに注意 7254: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 7255: } //irpTstWord 7256: 7257: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7258: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7259: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7260: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7261: //TST.L <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_010_mmm_rrr 7262: public static void irpTstLong () throws M68kException { 7263: XEiJ.mpuCycleCount += 4; 7264: int ea = XEiJ.regOC & 63; 7265: int z = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRls (efaMltLong (ea)); //アドレッシングモードに注意 7266: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 7267: } //irpTstLong 7268: 7269: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7270: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7271: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7272: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7273: //TAS.B <ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |0100_101_011_mmm_rrr 7274: //ILLEGAL |-|012346|-|-----|-----| |0100_101_011_111_100 7275: public static void irpTas () throws M68kException { 7276: int ea = XEiJ.regOC & 63; 7277: int z; 7278: if (ea < XEiJ.EA_AR) { //TAS.B Dr 7279: XEiJ.mpuCycleCount += 4; 7280: XEiJ.regRn[ea] = 0x80 | (z = XEiJ.regRn[ea]); 7281: } else if (ea == XEiJ.EA_IM) { //ILLEGAL 7282: XEiJ.mpuCycleCount += 34; 7283: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 7284: throw M68kException.m6eSignal; 7285: } else { //TAS.B <mem> 7286: XEiJ.mpuCycleCount += 10; 7287: int a = efaMltByte (ea); 7288: XEiJ.busWb (a, 0x80 | (z = XEiJ.busRbs (a))); 7289: } 7290: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 7291: } //irpTas 7292: 7293: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7294: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7295: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7296: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7297: //SATS.L Dr |-|------|-|-UUUU|-**00|D |0100_110_010_000_rrr (ISA_B) 7298: //MOVEM.W <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_010_mmm_rrr-llllllllllllllll 7299: // 7300: //SATS.L Dr 7301: // VがセットされていたらDrを符号が逆で絶対値が最大の値にする(直前のDrに対する演算を飽和演算にする) 7302: public static void irpMovemToRegWord () throws M68kException { 7303: int ea = XEiJ.regOC & 63; 7304: if (ea < XEiJ.EA_AR) { //SATS.L Dr 7305: XEiJ.mpuCycleCount += 4; 7306: int z = XEiJ.regRn[ea]; 7307: if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 < 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) != 0) { //Vがセットされているとき 7308: XEiJ.regRn[ea] = z = z >> 31 ^ 0x80000000; //符号が逆で絶対値が最大の値にする 7309: } 7310: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 7311: } else { //MOVEM.W <ea>,<list> 7312: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 7313: XEiJ.regPC += 2; 7314: int arr, a; 7315: if (ea >> 3 == XEiJ.MMM_MP) { //(Ar)+ 7316: XEiJ.mpuCycleCount += 12; 7317: arr = ea - (XEiJ.EA_MP - 8); 7318: a = XEiJ.regRn[arr]; 7319: } else { //(Ar)+以外 7320: XEiJ.mpuCycleCount += 8; 7321: arr = 16; 7322: a = efaCntWord (ea); 7323: } 7324: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 7325: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 7326: M68kException.m6eAddress = a; 7327: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 7328: M68kException.m6eSize = XEiJ.MPU_SS_WORD; 7329: throw M68kException.m6eSignal; 7330: } 7331: int t = a; 7332: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 7333: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 7334: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 2 * 16) { //16個転送してもページを跨がない 7335: a &= XEiJ.BUS_MOTHER_MASK; 7336: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7337: if ((l & 0x0001) != 0) { 7338: XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7339: a += 2; 7340: } 7341: if ((l & 0x0002) != 0) { 7342: XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7343: a += 2; 7344: } 7345: if ((l & 0x0004) != 0) { 7346: XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7347: a += 2; 7348: } 7349: if ((l & 0x0008) != 0) { 7350: XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7351: a += 2; 7352: } 7353: if ((l & 0x0010) != 0) { 7354: XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7355: a += 2; 7356: } 7357: if ((l & 0x0020) != 0) { 7358: XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7359: a += 2; 7360: } 7361: if ((l & 0x0040) != 0) { 7362: XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7363: a += 2; 7364: } 7365: if ((byte) l < 0) { //(l & 0x0080) != 0 7366: XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //データレジスタも符号拡張して32bit全部書き換える 7367: a += 2; 7368: } 7369: if ((l & 0x0100) != 0) { 7370: XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7371: a += 2; 7372: } 7373: if ((l & 0x0200) != 0) { 7374: XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7375: a += 2; 7376: } 7377: if ((l & 0x0400) != 0) { 7378: XEiJ.regRn[10] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7379: a += 2; 7380: } 7381: if ((l & 0x0800) != 0) { 7382: XEiJ.regRn[11] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7383: a += 2; 7384: } 7385: if ((l & 0x1000) != 0) { 7386: XEiJ.regRn[12] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7387: a += 2; 7388: } 7389: if ((l & 0x2000) != 0) { 7390: XEiJ.regRn[13] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7391: a += 2; 7392: } 7393: if ((l & 0x4000) != 0) { 7394: XEiJ.regRn[14] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7395: a += 2; 7396: } 7397: if ((short) l < 0) { //(l & 0x8000) != 0 7398: XEiJ.regRn[15] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //符号拡張して32bit全部書き換える 7399: a += 2; 7400: } 7401: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7402: for (int i = 0; i <= 15; i++) { 7403: if ((l & 0x0001 << i) != 0) { 7404: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7405: a += 2; 7406: } 7407: } 7408: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7409: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7410: for (int i = 0; l != 0; i++, l <<= 1) { 7411: if (l < 0) { 7412: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7413: a += 2; 7414: } 7415: } 7416: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7417: for (int i = 0; l != 0; i++, l >>>= 1) { 7418: if ((l & 1) != 0) { 7419: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7420: a += 2; 7421: } 7422: } 7423: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7424: for (int i = 0; l != 0; ) { 7425: int k = Integer.numberOfTrailingZeros (l); 7426: XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 8 | MainMemory.mmrM8[a + 1] & 255; //(データレジスタも)符号拡張して32bit全部書き換える 7427: a += 2; 7428: l = l >>> k & ~1; 7429: } 7430: } 7431: a = t + (short) (a - t); 7432: } else { //メインメモリでないかページを跨ぐ可能性がある 7433: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7434: if ((l & 0x0001) != 0) { 7435: XEiJ.regRn[ 0] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7436: a += 2; 7437: } 7438: if ((l & 0x0002) != 0) { 7439: XEiJ.regRn[ 1] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7440: a += 2; 7441: } 7442: if ((l & 0x0004) != 0) { 7443: XEiJ.regRn[ 2] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7444: a += 2; 7445: } 7446: if ((l & 0x0008) != 0) { 7447: XEiJ.regRn[ 3] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7448: a += 2; 7449: } 7450: if ((l & 0x0010) != 0) { 7451: XEiJ.regRn[ 4] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7452: a += 2; 7453: } 7454: if ((l & 0x0020) != 0) { 7455: XEiJ.regRn[ 5] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7456: a += 2; 7457: } 7458: if ((l & 0x0040) != 0) { 7459: XEiJ.regRn[ 6] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7460: a += 2; 7461: } 7462: if ((byte) l < 0) { //(l & 0x0080) != 0 7463: XEiJ.regRn[ 7] = XEiJ.busRwse (a); //データレジスタも符号拡張して32bit全部書き換える 7464: a += 2; 7465: } 7466: if ((l & 0x0100) != 0) { 7467: XEiJ.regRn[ 8] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7468: a += 2; 7469: } 7470: if ((l & 0x0200) != 0) { 7471: XEiJ.regRn[ 9] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7472: a += 2; 7473: } 7474: if ((l & 0x0400) != 0) { 7475: XEiJ.regRn[10] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7476: a += 2; 7477: } 7478: if ((l & 0x0800) != 0) { 7479: XEiJ.regRn[11] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7480: a += 2; 7481: } 7482: if ((l & 0x1000) != 0) { 7483: XEiJ.regRn[12] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7484: a += 2; 7485: } 7486: if ((l & 0x2000) != 0) { 7487: XEiJ.regRn[13] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7488: a += 2; 7489: } 7490: if ((l & 0x4000) != 0) { 7491: XEiJ.regRn[14] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7492: a += 2; 7493: } 7494: if ((short) l < 0) { //(l & 0x8000) != 0 7495: XEiJ.regRn[15] = XEiJ.busRwse (a); //符号拡張して32bit全部書き換える 7496: a += 2; 7497: } 7498: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7499: for (int i = 0; i <= 15; i++) { 7500: if ((l & 0x0001 << i) != 0) { 7501: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7502: a += 2; 7503: } 7504: } 7505: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7506: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7507: for (int i = 0; l != 0; i++, l <<= 1) { 7508: if (l < 0) { 7509: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7510: a += 2; 7511: } 7512: } 7513: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7514: for (int i = 0; l != 0; i++, l >>>= 1) { 7515: if ((l & 1) != 0) { 7516: XEiJ.regRn[i] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7517: a += 2; 7518: } 7519: } 7520: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7521: for (int i = 0; l != 0; ) { 7522: int k = Integer.numberOfTrailingZeros (l); 7523: XEiJ.regRn[i += k] = XEiJ.busRwse (a); //(データレジスタも)符号拡張して32bit全部書き換える 7524: a += 2; 7525: l = l >>> k & ~1; 7526: } 7527: } 7528: } 7529: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7530: //! 軽量化。MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするが省略する 7531: // MC68000のMOVEM.W <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する 7532: // RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、 7533: // 12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因 7534: } else { 7535: XEiJ.busRws (a); 7536: } 7537: //MOVEM.W (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする 7538: XEiJ.regRn[arr] = a; 7539: XEiJ.mpuCycleCount += a - t << 1; //2バイト/個→4サイクル/個 7540: } 7541: } //irpMovemToRegWord 7542: 7543: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7544: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7545: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7546: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7547: //MOVEM.L <ea>,<list> |-|012346|-|-----|-----| M+ WXZP |0100_110_011_mmm_rrr-llllllllllllllll 7548: public static void irpMovemToRegLong () throws M68kException { 7549: int ea = XEiJ.regOC & 63; 7550: { 7551: int l = XEiJ.busRwze (XEiJ.regPC); //pcwze。レジスタリスト。ゼロ拡張 7552: XEiJ.regPC += 2; 7553: int arr, a; 7554: if (ea >> 3 == XEiJ.MMM_MP) { //(Ar)+ 7555: XEiJ.mpuCycleCount += 8; 7556: arr = ea - (XEiJ.EA_MP - 8); 7557: a = XEiJ.regRn[arr]; 7558: } else { //(Ar)+以外 7559: XEiJ.mpuCycleCount += 4; 7560: arr = 16; 7561: a = efaCntLong (ea); 7562: } 7563: if ((a & 1) != 0 && l != 0) { //奇数アドレスで1ワード以上転送する 7564: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 7565: M68kException.m6eAddress = a; 7566: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 7567: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 7568: throw M68kException.m6eSignal; 7569: } 7570: int t = a; 7571: if (XEiJ.IRP_MOVEM_MAINMEMORY && //000のときMOVEMでメインメモリを特別扱いにする 7572: (DataBreakPoint.DBP_ON ? DataBreakPoint.dbpSuperMap : XEiJ.busSuperMap)[a >>> XEiJ.BUS_PAGE_BITS] == MemoryMappedDevice.MMD_MMR && //メインメモリ 7573: (a & XEiJ.BUS_PAGE_SIZE - 1) <= XEiJ.BUS_PAGE_SIZE - 4 * 16) { //16個転送してもページを跨がない 7574: a &= XEiJ.BUS_MOTHER_MASK; 7575: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7576: if ((l & 0x0001) != 0) { 7577: XEiJ.regRn[ 0] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7578: a += 4; 7579: } 7580: if ((l & 0x0002) != 0) { 7581: XEiJ.regRn[ 1] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7582: a += 4; 7583: } 7584: if ((l & 0x0004) != 0) { 7585: XEiJ.regRn[ 2] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7586: a += 4; 7587: } 7588: if ((l & 0x0008) != 0) { 7589: XEiJ.regRn[ 3] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7590: a += 4; 7591: } 7592: if ((l & 0x0010) != 0) { 7593: XEiJ.regRn[ 4] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7594: a += 4; 7595: } 7596: if ((l & 0x0020) != 0) { 7597: XEiJ.regRn[ 5] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7598: a += 4; 7599: } 7600: if ((l & 0x0040) != 0) { 7601: XEiJ.regRn[ 6] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7602: a += 4; 7603: } 7604: if ((byte) l < 0) { //(l & 0x0080) != 0 7605: XEiJ.regRn[ 7] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7606: a += 4; 7607: } 7608: if ((l & 0x0100) != 0) { 7609: XEiJ.regRn[ 8] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7610: a += 4; 7611: } 7612: if ((l & 0x0200) != 0) { 7613: XEiJ.regRn[ 9] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7614: a += 4; 7615: } 7616: if ((l & 0x0400) != 0) { 7617: XEiJ.regRn[10] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7618: a += 4; 7619: } 7620: if ((l & 0x0800) != 0) { 7621: XEiJ.regRn[11] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7622: a += 4; 7623: } 7624: if ((l & 0x1000) != 0) { 7625: XEiJ.regRn[12] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7626: a += 4; 7627: } 7628: if ((l & 0x2000) != 0) { 7629: XEiJ.regRn[13] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7630: a += 4; 7631: } 7632: if ((l & 0x4000) != 0) { 7633: XEiJ.regRn[14] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7634: a += 4; 7635: } 7636: if ((short) l < 0) { //(l & 0x8000) != 0 7637: XEiJ.regRn[15] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7638: a += 4; 7639: } 7640: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7641: for (int i = 0; i <= 15; i++) { 7642: if ((l & 0x0001 << i) != 0) { 7643: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7644: a += 4; 7645: } 7646: } 7647: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7648: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7649: for (int i = 0; l != 0; i++, l <<= 1) { 7650: if (l < 0) { 7651: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7652: a += 4; 7653: } 7654: } 7655: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7656: for (int i = 0; l != 0; i++, l >>>= 1) { 7657: if ((l & 1) != 0) { 7658: XEiJ.regRn[i] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7659: a += 4; 7660: } 7661: } 7662: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7663: for (int i = 0; l != 0; ) { 7664: int k = Integer.numberOfTrailingZeros (l); 7665: XEiJ.regRn[i += k] = MainMemory.mmrM8[a] << 24 | (MainMemory.mmrM8[a + 1] & 255) << 16 | (char) (MainMemory.mmrM8[a + 2] << 8 | MainMemory.mmrM8[a + 3] & 255); 7666: a += 4; 7667: l = l >>> k & ~1; 7668: } 7669: } 7670: a = t + (short) (a - t); 7671: } else { //メインメモリでないかページを跨ぐ可能性がある 7672: if (XEiJ.IRP_MOVEM_EXPAND) { //16回展開する 7673: if ((l & 0x0001) != 0) { 7674: XEiJ.regRn[ 0] = XEiJ.busRlse (a); 7675: a += 4; 7676: } 7677: if ((l & 0x0002) != 0) { 7678: XEiJ.regRn[ 1] = XEiJ.busRlse (a); 7679: a += 4; 7680: } 7681: if ((l & 0x0004) != 0) { 7682: XEiJ.regRn[ 2] = XEiJ.busRlse (a); 7683: a += 4; 7684: } 7685: if ((l & 0x0008) != 0) { 7686: XEiJ.regRn[ 3] = XEiJ.busRlse (a); 7687: a += 4; 7688: } 7689: if ((l & 0x0010) != 0) { 7690: XEiJ.regRn[ 4] = XEiJ.busRlse (a); 7691: a += 4; 7692: } 7693: if ((l & 0x0020) != 0) { 7694: XEiJ.regRn[ 5] = XEiJ.busRlse (a); 7695: a += 4; 7696: } 7697: if ((l & 0x0040) != 0) { 7698: XEiJ.regRn[ 6] = XEiJ.busRlse (a); 7699: a += 4; 7700: } 7701: if ((byte) l < 0) { //(l & 0x0080) != 0 7702: XEiJ.regRn[ 7] = XEiJ.busRlse (a); 7703: a += 4; 7704: } 7705: if ((l & 0x0100) != 0) { 7706: XEiJ.regRn[ 8] = XEiJ.busRlse (a); 7707: a += 4; 7708: } 7709: if ((l & 0x0200) != 0) { 7710: XEiJ.regRn[ 9] = XEiJ.busRlse (a); 7711: a += 4; 7712: } 7713: if ((l & 0x0400) != 0) { 7714: XEiJ.regRn[10] = XEiJ.busRlse (a); 7715: a += 4; 7716: } 7717: if ((l & 0x0800) != 0) { 7718: XEiJ.regRn[11] = XEiJ.busRlse (a); 7719: a += 4; 7720: } 7721: if ((l & 0x1000) != 0) { 7722: XEiJ.regRn[12] = XEiJ.busRlse (a); 7723: a += 4; 7724: } 7725: if ((l & 0x2000) != 0) { 7726: XEiJ.regRn[13] = XEiJ.busRlse (a); 7727: a += 4; 7728: } 7729: if ((l & 0x4000) != 0) { 7730: XEiJ.regRn[14] = XEiJ.busRlse (a); 7731: a += 4; 7732: } 7733: if ((short) l < 0) { //(l & 0x8000) != 0 7734: XEiJ.regRn[15] = XEiJ.busRlse (a); 7735: a += 4; 7736: } 7737: } else if (XEiJ.IRP_MOVEM_LOOP) { //16回ループする。コンパイラが展開する 7738: for (int i = 0; i <= 15; i++) { 7739: if ((l & 0x0001 << i) != 0) { 7740: XEiJ.regRn[i] = XEiJ.busRlse (a); 7741: a += 4; 7742: } 7743: } 7744: } else if (XEiJ.IRP_MOVEM_SHIFT_LEFT) { //0になるまで左にシフトする 7745: l = XEiJ.MPU_BITREV_TABLE_0[l & 2047] | XEiJ.MPU_BITREV_TABLE_1[l << 10 >>> 21]; //Integer.reverse(l) 7746: for (int i = 0; l != 0; i++, l <<= 1) { 7747: if (l < 0) { 7748: XEiJ.regRn[i] = XEiJ.busRlse (a); 7749: a += 4; 7750: } 7751: } 7752: } else if (XEiJ.IRP_MOVEM_SHIFT_RIGHT) { //0になるまで右にシフトする 7753: for (int i = 0; l != 0; i++, l >>>= 1) { 7754: if ((l & 1) != 0) { 7755: XEiJ.regRn[i] = XEiJ.busRlse (a); 7756: a += 4; 7757: } 7758: } 7759: } else if (XEiJ.IRP_MOVEM_ZEROS) { //Integer.numberOfTrailingZerosを使う 7760: for (int i = 0; l != 0; ) { 7761: int k = Integer.numberOfTrailingZeros (l); 7762: XEiJ.regRn[i += k] = XEiJ.busRlse (a); 7763: a += 4; 7764: l = l >>> k & ~1; 7765: } 7766: } 7767: } 7768: if (XEiJ.MPU_OMIT_EXTRA_READ) { 7769: //! 軽量化。MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするが省略する 7770: // MC68000のMOVEM.L <ea>,<list>は1ワード余分にリードするため転送する領域の直後にアクセスできない領域があるとバスエラーが発生する 7771: // RAMDISK.SYSを高速化しようとしてデータ転送ルーチンの転送命令をすべてMOVEMに変更してしまうと、 7772: // 12MBフル実装でないX68000の実機で最後のセクタをアクセスしたときだけバスエラーが出て動かなくなるのはこれが原因 7773: } else { 7774: XEiJ.busRws (a); 7775: } 7776: //MOVEM.L (Ar)+,<list>で<list>にArが含まれているとき、メモリから読み出したデータを捨ててArをインクリメントする 7777: XEiJ.regRn[arr] = a; //XEiJ.regRn[arr]は破壊されているのでXEiJ.regRn[arr]+=a-=tは不可 7778: XEiJ.mpuCycleCount += a - t << 1; //4バイト/個→8サイクル/個 7779: } 7780: } //irpMovemToRegLong 7781: 7782: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7783: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7784: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7785: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7786: //TRAP #<vector> |-|012346|-|-----|-----| |0100_111_001_00v_vvv 7787: public static void irpTrap () throws M68kException { 7788: XEiJ.mpuCycleCount += 34; 7789: if (XEiJ.MPU_INLINE_EXCEPTION) { 7790: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 7791: int sp = XEiJ.regRn[15]; 7792: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 7793: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7794: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 7795: XEiJ.mpuUSP = sp; //USPを保存 7796: sp = XEiJ.mpuISP; //SSPを復元 7797: if (DataBreakPoint.DBP_ON) { 7798: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 7799: } else { 7800: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 7801: } 7802: if (InstructionBreakPoint.IBP_ON) { 7803: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 7804: } 7805: } 7806: int vectorOffset = XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR) << 2; //vector offset 7807: XEiJ.regRn[15] = sp -= 8; //short format 7808: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 7809: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 7810: XEiJ.busWw (sp, save_sr); //status register 7811: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 7812: } else { 7813: irpException (XEiJ.regOC - (0x4e40 - M68kException.M6E_TRAP_0_INSTRUCTION_VECTOR), XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 7814: } 7815: } //irpTrap 7816: public static void irpTrap15 () throws M68kException { 7817: if ((XEiJ.regRn[0] & 255) == 0x8e) { //IOCS _BOOTINF 7818: MainMemory.mmrCheckHuman (); 7819: } 7820: XEiJ.mpuCycleCount += 34; 7821: if (XEiJ.MPU_INLINE_EXCEPTION) { 7822: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 7823: int sp = XEiJ.regRn[15]; 7824: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 7825: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7826: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 7827: XEiJ.mpuUSP = sp; //USPを保存 7828: sp = XEiJ.mpuISP; //SSPを復元 7829: if (DataBreakPoint.DBP_ON) { 7830: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 7831: } else { 7832: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 7833: } 7834: if (InstructionBreakPoint.IBP_ON) { 7835: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 7836: } 7837: } 7838: int vectorOffset = M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR << 2; //vector offset 7839: XEiJ.regRn[15] = sp -= 8; //short format 7840: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 7841: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 7842: XEiJ.busWw (sp, save_sr); //status register 7843: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 7844: } else { 7845: irpException (M68kException.M6E_TRAP_15_INSTRUCTION_VECTOR, XEiJ.regPC, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは次の命令 7846: } 7847: } //irpTrap15 7848: 7849: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7850: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7851: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7852: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7853: //LINK.W Ar,#<data> |-|012346|-|-----|-----| |0100_111_001_010_rrr-{data} 7854: // 7855: //LINK.W Ar,#<data> 7856: // PEA.L (Ar);MOVEA.L A7,Ar;ADDA.W #<data>,A7と同じ 7857: // LINK.W A7,#<data>はA7をデクリメントする前の値がプッシュされ、A7に#<data>が加算される 7858: public static void irpLinkWord () throws M68kException { 7859: XEiJ.mpuCycleCount += 16; 7860: int arr = XEiJ.regOC - (0b0100_111_001_010_000 - 8); 7861: //評価順序に注意 7862: // wl(r[15]-=4,r[8+rrr])は不可 7863: int sp = XEiJ.regRn[15] - 4; 7864: XEiJ.busWl (sp, XEiJ.regRn[arr]); //pushl 7865: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 7866: XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 7867: } else { 7868: int t = XEiJ.regPC; 7869: XEiJ.regPC = t + 2; 7870: XEiJ.regRn[15] = (XEiJ.regRn[arr] = sp) + XEiJ.busRwse (t); //pcws 7871: } 7872: } //irpLinkWord 7873: 7874: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7875: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7876: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7877: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7878: //UNLK Ar |-|012346|-|-----|-----| |0100_111_001_011_rrr 7879: // 7880: //UNLK Ar 7881: // MOVEA.L Ar,A7;MOVEA.L (A7)+,Arと同じ 7882: // UNLK A7はMOVEA.L A7,A7;MOVEA.L (A7)+,A7すなわちMOVEA.L (A7),A7と同じ 7883: // ソースオペランドのポストインクリメントはデスティネーションオペランドが評価される前に完了しているとみなされる 7884: // 例えばMOVE.L (A0)+,(A0)+はMOVE.L (A0),(4,A0);ADDQ.L #8,A0と同じ 7885: // MOVEA.L (A0)+,A0はポストインクリメントされたA0が(A0)から読み出された値で上書きされるのでMOVEA.L (A0),A0と同じ 7886: // M68000PRMにUNLK Anの動作はAn→SP;(SP)→An;SP+4→SPだと書かれているがこれはn=7の場合に当てはまらない 7887: // 余談だが68040の初期のマスクセットはUNLK A7を実行すると固まるらしい 7888: public static void irpUnlk () throws M68kException { 7889: XEiJ.mpuCycleCount += 12; 7890: int arr = XEiJ.regOC - (0b0100_111_001_011_000 - 8); 7891: //評価順序に注意 7892: int sp = XEiJ.regRn[arr]; 7893: XEiJ.regRn[15] = sp + 4; 7894: XEiJ.regRn[arr] = XEiJ.busRls (sp); //popls 7895: } //irpUnlk 7896: 7897: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7898: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7899: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7900: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7901: //MOVE.L Ar,USP |-|012346|P|-----|-----| |0100_111_001_100_rrr 7902: public static void irpMoveToUsp () throws M68kException { 7903: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7904: XEiJ.mpuCycleCount += 34; 7905: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7906: throw M68kException.m6eSignal; 7907: } 7908: //以下はスーパーバイザモード 7909: XEiJ.mpuCycleCount += 4; 7910: XEiJ.mpuUSP = XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_100_000 - 8)]; 7911: } //irpMoveToUsp 7912: 7913: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7914: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7915: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7916: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7917: //MOVE.L USP,Ar |-|012346|P|-----|-----| |0100_111_001_101_rrr 7918: public static void irpMoveFromUsp () throws M68kException { 7919: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7920: XEiJ.mpuCycleCount += 34; 7921: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7922: throw M68kException.m6eSignal; 7923: } 7924: //以下はスーパーバイザモード 7925: XEiJ.mpuCycleCount += 4; 7926: XEiJ.regRn[XEiJ.regOC - (0b0100_111_001_101_000 - 8)] = XEiJ.mpuUSP; 7927: } //irpMoveFromUsp 7928: 7929: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7930: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7931: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7932: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7933: //RESET |-|012346|P|-----|-----| |0100_111_001_110_000 7934: public static void irpReset () throws M68kException { 7935: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7936: XEiJ.mpuCycleCount += 34; 7937: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7938: throw M68kException.m6eSignal; 7939: } 7940: //以下はスーパーバイザモード 7941: XEiJ.mpuCycleCount += 132; 7942: XEiJ.irpReset (); 7943: } //irpReset 7944: 7945: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7946: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7947: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7948: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7949: //NOP |-|012346|-|-----|-----| |0100_111_001_110_001 7950: public static void irpNop () throws M68kException { 7951: XEiJ.mpuCycleCount += 4; 7952: //何もしない 7953: } //irpNop 7954: 7955: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7956: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7957: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7958: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7959: //STOP #<data> |-|012346|P|UUUUU|*****| |0100_111_001_110_010-{data} 7960: // 7961: //STOP #<data> 7962: // 1. #<data>をsrに設定する 7963: // 2. pcを進める 7964: // 3. 以下のいずれかの条件が成立するまで停止する 7965: // 3a. トレース 7966: // 3b. マスクされているレベルよりも高い割り込み要求 7967: // 3c. リセット 7968: // コアと一緒にデバイスを止めるわけにいかないので、ここでは条件が成立するまで同じ命令を繰り返すループ命令として実装する 7969: public static void irpStop () throws M68kException { 7970: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7971: XEiJ.mpuCycleCount += 34; 7972: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7973: throw M68kException.m6eSignal; 7974: } 7975: //以下はスーパーバイザモード 7976: XEiJ.mpuCycleCount += 4; 7977: irpSetSR (XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。特権違反チェックが先 7978: if (XEiJ.mpuTraceFlag == 0) { //トレースまたはマスクされているレベルよりも高い割り込み要求がない 7979: XEiJ.regPC = XEiJ.regPC0; //ループ 7980: //任意の負荷率を100%に設定しているときSTOP命令が軽すぎると動作周波数が大きくなりすぎて割り込みがかかったとき次に進めなくなる 7981: //負荷率の計算にSTOP命令で止まっていた時間を含めないことにする 7982: XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000; //4μs。10MHzのとき40clk 7983: XEiJ.mpuLastNano += 4000L; 7984: } 7985: } //irpStop 7986: 7987: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7988: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 7989: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 7990: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 7991: //RTE |-|012346|P|UUUUU|*****| |0100_111_001_110_011 7992: public static void irpRte () throws M68kException { 7993: if (XEiJ.regSRS == 0) { //ユーザモードのとき 7994: XEiJ.mpuCycleCount += 34; 7995: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 7996: throw M68kException.m6eSignal; 7997: } 7998: //以下はスーパーバイザモード 7999: XEiJ.mpuCycleCount += 20; 8000: int sp = XEiJ.regRn[15]; 8001: int format = XEiJ.busRws (sp + 6) >>> 12; 8002: int frameSize; 8003: if (format == 0x0) { //010,020,030,040,060 8004: frameSize = 8; 8005: } else if (format == 0x8) { //010 8006: frameSize = 58; 8007: } else { 8008: M68kException.m6eNumber = M68kException.M6E_FORMAT_ERROR; 8009: throw M68kException.m6eSignal; 8010: } 8011: XEiJ.regRn[15] = sp + frameSize; 8012: int newSR = XEiJ.busRwz (sp); //popwz。ここでバスエラーが生じる可能性がある 8013: int newPC = XEiJ.busRls (sp + 2); //popls 8014: //irpSetSRでモードが切り替わる場合があるのでその前にr[15]を更新しておくこと 8015: irpSetSR (newSR); //ここでユーザモードに戻る場合がある。特権違反チェックが先 8016: irpSetPC (newPC); //分岐ログが新しいsrを使う。順序に注意 8017: } //irpRte 8018: 8019: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8020: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8021: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8022: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8023: //RTD #<data> |-|-12346|-|-----|-----| |0100_111_001_110_100-{data} 8024: public static void irpRtd () throws M68kException { 8025: XEiJ.mpuCycleCount += 20; 8026: int sp = XEiJ.regRn[15]; 8027: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 8028: XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 8029: } else { 8030: int t = XEiJ.regPC; 8031: XEiJ.regPC = t + 2; 8032: XEiJ.regRn[15] = sp + 4 + XEiJ.busRwse (t); //pcws 8033: } 8034: irpSetPC (XEiJ.busRls (sp)); //popls 8035: } //irpRtd 8036: 8037: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8038: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8039: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8040: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8041: //RTS |-|012346|-|-----|-----| |0100_111_001_110_101 8042: public static void irpRts () throws M68kException { 8043: XEiJ.mpuCycleCount += 16; 8044: int sp = XEiJ.regRn[15]; 8045: XEiJ.regRn[15] = sp + 4; 8046: irpSetPC (XEiJ.busRls (sp)); //popls 8047: } //irpRts 8048: 8049: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8050: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8051: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8052: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8053: //TRAPV |-|012346|-|---*-|-----| |0100_111_001_110_110 8054: public static void irpTrapv () throws M68kException { 8055: if (XEiJ.TEST_BIT_1_SHIFT ? XEiJ.regCCR << 31 - 1 >= 0 : (XEiJ.regCCR & XEiJ.REG_CCR_V) == 0) { //通過 8056: XEiJ.mpuCycleCount += 4; 8057: } else { 8058: XEiJ.mpuCycleCount += 34; 8059: M68kException.m6eNumber = M68kException.M6E_TRAPV_INSTRUCTION; 8060: throw M68kException.m6eSignal; 8061: } 8062: } //irpTrapv 8063: 8064: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8065: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8066: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8067: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8068: //RTR |-|012346|-|UUUUU|*****| |0100_111_001_110_111 8069: public static void irpRtr () throws M68kException { 8070: XEiJ.mpuCycleCount += 20; 8071: int sp = XEiJ.regRn[15]; 8072: XEiJ.regRn[15] = sp + 6; 8073: XEiJ.regCCR = XEiJ.REG_CCR_MASK & XEiJ.busRwz (sp); //popwz 8074: irpSetPC (XEiJ.busRlse (sp + 2)); //popls。ccrを読めたのだからspは奇数ではない 8075: } //irpRtr 8076: 8077: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8078: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8079: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8080: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8081: //MOVEC.L Rc,Rn |-|-12346|P|-----|-----| |0100_111_001_111_010-rnnncccccccccccc 8082: public static void irpMovecFromControl () throws M68kException { 8083: if (XEiJ.regSRS == 0) { //ユーザモードのとき 8084: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 8085: throw M68kException.m6eSignal; 8086: } 8087: //以下はスーパーバイザモード 8088: XEiJ.mpuCycleCount += 10; 8089: int w; 8090: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 8091: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 8092: } else { 8093: w = XEiJ.regPC; 8094: XEiJ.regPC = w + 2; 8095: w = XEiJ.busRwze (w); //pcwz。拡張ワード 8096: } 8097: switch (w & 0x0fff) { 8098: case 0x000: //SFC 8099: XEiJ.regRn[w >> 12] = XEiJ.mpuSFC; 8100: break; 8101: case 0x001: //DFC 8102: XEiJ.regRn[w >> 12] = XEiJ.mpuDFC; 8103: break; 8104: case 0x801: //VBR 8105: XEiJ.regRn[w >> 12] = XEiJ.mpuVBR; 8106: break; 8107: default: 8108: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 8109: throw M68kException.m6eSignal; 8110: } 8111: } //irpMovecFromControl 8112: 8113: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8114: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8115: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8116: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8117: //MOVEC.L Rn,Rc |-|-12346|P|-----|-----| |0100_111_001_111_011-rnnncccccccccccc 8118: public static void irpMovecToControl () throws M68kException { 8119: if (XEiJ.regSRS == 0) { //ユーザモードのとき 8120: M68kException.m6eNumber = M68kException.M6E_PRIVILEGE_VIOLATION; 8121: throw M68kException.m6eSignal; 8122: } 8123: //以下はスーパーバイザモード 8124: XEiJ.mpuCycleCount += 12; 8125: int w; 8126: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 8127: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 8128: } else { 8129: w = XEiJ.regPC; 8130: XEiJ.regPC = w + 2; 8131: w = XEiJ.busRwze (w); //pcwz。拡張ワード 8132: } 8133: int d = XEiJ.regRn[w >> 12]; 8134: switch (w & 0x0fff) { 8135: case 0x000: //SFC 8136: XEiJ.mpuSFC = d & 0x00000007; 8137: break; 8138: case 0x001: //DFC 8139: XEiJ.mpuDFC = d & 0x00000007; 8140: break; 8141: case 0x801: //VBR 8142: XEiJ.mpuVBR = d & -4; //4の倍数でないと困る 8143: break; 8144: default: 8145: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 8146: throw M68kException.m6eSignal; 8147: } 8148: } //irpMovecToControl 8149: 8150: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8151: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8152: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8153: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8154: //JSR <ea> |-|012346|-|-----|-----| M WXZP |0100_111_010_mmm_rrr 8155: //JBSR.L <label> |A|012346|-|-----|-----| |0100_111_010_111_001-{address} [JSR <label>] 8156: public static void irpJsr () throws M68kException { 8157: XEiJ.mpuCycleCount += 16 - 8; 8158: int a = efaJmpJsr (XEiJ.regOC & 63); //プッシュする前に実効アドレスを計算する 8159: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 8160: irpSetPC (a); 8161: } //irpJsr 8162: 8163: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8164: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8165: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8166: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8167: //JMP <ea> |-|012346|-|-----|-----| M WXZP |0100_111_011_mmm_rrr 8168: //JBRA.L <label> |A|012346|-|-----|-----| |0100_111_011_111_001-{address} [JMP <label>] 8169: public static void irpJmp () throws M68kException { 8170: //XEiJ.mpuCycleCount += 8 - 8; 8171: irpSetPC (efaJmpJsr (XEiJ.regOC & 63)); 8172: } //irpJmp 8173: 8174: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8175: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8176: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8177: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8178: //ADDQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_000_mmm_rrr 8179: //INC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_000_mmm_rrr [ADDQ.B #1,<ea>] 8180: public static void irpAddqByte () throws M68kException { 8181: int ea = XEiJ.regOC & 63; 8182: int x; 8183: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8184: int z; 8185: if (ea < XEiJ.EA_AR) { //ADDQ.B #<data>,Dr 8186: XEiJ.mpuCycleCount += 4; 8187: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) + y); 8188: } else { //ADDQ.B #<data>,<mem> 8189: XEiJ.mpuCycleCount += 8; 8190: int a = efaMltByte (ea); 8191: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) + y)); 8192: } 8193: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8194: (~x & z) >>> 31 << 1 | 8195: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 8196: } //irpAddqByte 8197: 8198: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8199: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8200: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8201: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8202: //ADDQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_001_mmm_rrr 8203: //ADDQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_001_001_rrr 8204: //INC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_001_mmm_rrr [ADDQ.W #1,<ea>] 8205: //INC.W Ar |A|012346|-|-----|-----| A |0101_001_001_001_rrr [ADDQ.W #1,Ar] 8206: // 8207: //ADDQ.W #<data>,Ar 8208: // ソースを符号拡張してロングで加算する 8209: public static void irpAddqWord () throws M68kException { 8210: int ea = XEiJ.regOC & 63; 8211: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8212: if (ea >> 3 == XEiJ.MMM_AR) { //ADDQ.W #<data>,Ar 8213: XEiJ.mpuCycleCount += 8; //MC68000 User's Manualに4と書いてあるのは8の間違い 8214: XEiJ.regRn[ea] += y; //ロングで計算する。このr[ea]はアドレスレジスタ 8215: //ccrは操作しない 8216: } else { 8217: int x; 8218: int z; 8219: if (ea < XEiJ.EA_AR) { //ADDQ.W #<data>,Dr 8220: XEiJ.mpuCycleCount += 4; 8221: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) + y)); 8222: } else { //ADDQ.W #<data>,<mem> 8223: XEiJ.mpuCycleCount += 8; 8224: int a = efaMltWord (ea); 8225: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) + y)); 8226: } 8227: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8228: (~x & z) >>> 31 << 1 | 8229: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 8230: } 8231: } //irpAddqWord 8232: 8233: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8234: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8235: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8236: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8237: //ADDQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_010_mmm_rrr 8238: //ADDQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_010_001_rrr 8239: //INC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_010_mmm_rrr [ADDQ.L #1,<ea>] 8240: //INC.L Ar |A|012346|-|-----|-----| A |0101_001_010_001_rrr [ADDQ.L #1,Ar] 8241: public static void irpAddqLong () throws M68kException { 8242: int ea = XEiJ.regOC & 63; 8243: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8244: if (ea >> 3 == XEiJ.MMM_AR) { //ADDQ.L #<data>,Ar 8245: XEiJ.mpuCycleCount += 8; 8246: XEiJ.regRn[ea] += y; //このr[ea]はアドレスレジスタ 8247: //ccrは操作しない 8248: } else { 8249: int x; 8250: int z; 8251: if (ea < XEiJ.EA_AR) { //ADDQ.L #<data>,Dr 8252: XEiJ.mpuCycleCount += 8; 8253: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) + y; 8254: } else { //ADDQ.L #<data>,<mem> 8255: XEiJ.mpuCycleCount += 12; 8256: int a = efaMltLong (ea); 8257: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y); 8258: } 8259: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8260: (~x & z) >>> 31 << 1 | 8261: (x & ~z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addq 8262: } 8263: } //irpAddqLong 8264: 8265: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8266: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8267: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8268: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8269: //ST.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr 8270: //SNF.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_011_mmm_rrr [ST.B <ea>] 8271: //DBT.W Dr,<label> |-|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} 8272: //DBNF.W Dr,<label> |A|012346|-|-----|-----| |0101_000_011_001_rrr-{offset} [DBT.W Dr,<label>] 8273: public static void irpSt () throws M68kException { 8274: int ea = XEiJ.regOC & 63; 8275: //DBT.W Dr,<label>よりもST.B Drを優先する 8276: if (ea < XEiJ.EA_AR) { //ST.B Dr 8277: XEiJ.mpuCycleCount += 6; 8278: XEiJ.regRn[ea] |= 0xff; 8279: } else if (ea < XEiJ.EA_MM) { //DBT.W Dr,<label> 8280: //条件が成立しているので通過 8281: XEiJ.mpuCycleCount += 12; 8282: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8283: //リードを省略する 8284: } else { 8285: XEiJ.busRws (XEiJ.regPC); 8286: } 8287: XEiJ.regPC += 2; 8288: } else { //ST.B <mem> 8289: XEiJ.mpuCycleCount += 8; 8290: XEiJ.busWb (efaMltByte (ea), 0xff); 8291: } 8292: } //irpSt 8293: 8294: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8295: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8296: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8297: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8298: //SUBQ.B #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_100_mmm_rrr 8299: //DEC.B <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_100_mmm_rrr [SUBQ.B #1,<ea>] 8300: public static void irpSubqByte () throws M68kException { 8301: int ea = XEiJ.regOC & 63; 8302: int x; 8303: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8304: int z; 8305: if (ea < XEiJ.EA_AR) { //SUBQ.B #<data>,Dr 8306: XEiJ.mpuCycleCount += 4; 8307: z = (byte) (XEiJ.regRn[ea] = ~0xff & (x = XEiJ.regRn[ea]) | 0xff & (x = (byte) x) - y); 8308: } else { //SUBQ.B #<data>,<mem> 8309: XEiJ.mpuCycleCount += 8; 8310: int a = efaMltByte (ea); 8311: XEiJ.busWb (a, z = (byte) ((x = XEiJ.busRbs (a)) - y)); 8312: } 8313: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8314: (x & ~z) >>> 31 << 1 | 8315: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 8316: } //irpSubqByte 8317: 8318: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8319: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8320: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8321: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8322: //SUBQ.W #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_101_mmm_rrr 8323: //SUBQ.W #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_101_001_rrr 8324: //DEC.W <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_101_mmm_rrr [SUBQ.W #1,<ea>] 8325: //DEC.W Ar |A|012346|-|-----|-----| A |0101_001_101_001_rrr [SUBQ.W #1,Ar] 8326: // 8327: //SUBQ.W #<data>,Ar 8328: // ソースを符号拡張してロングで減算する 8329: public static void irpSubqWord () throws M68kException { 8330: int ea = XEiJ.regOC & 63; 8331: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8332: if (ea >> 3 == XEiJ.MMM_AR) { //SUBQ.W #<data>,Ar 8333: XEiJ.mpuCycleCount += 8; 8334: XEiJ.regRn[ea] -= y; //ロングで計算する。このr[ea]はアドレスレジスタ 8335: //ccrは操作しない 8336: } else { 8337: int x; 8338: int z; 8339: if (ea < XEiJ.EA_AR) { //SUBQ.W #<data>,Dr 8340: XEiJ.mpuCycleCount += 4; 8341: z = (short) (XEiJ.regRn[ea] = ~0xffff & (x = XEiJ.regRn[ea]) | (char) ((x = (short) x) - y)); 8342: } else { //SUBQ.W #<data>,<mem> 8343: XEiJ.mpuCycleCount += 8; 8344: int a = efaMltWord (ea); 8345: XEiJ.busWw (a, z = (short) ((x = XEiJ.busRws (a)) - y)); 8346: } 8347: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8348: (x & ~z) >>> 31 << 1 | 8349: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 8350: } 8351: } //irpSubqWord 8352: 8353: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8354: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8355: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8356: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8357: //SUBQ.L #<data>,<ea> |-|012346|-|UUUUU|*****|D M+-WXZ |0101_qqq_110_mmm_rrr 8358: //SUBQ.L #<data>,Ar |-|012346|-|-----|-----| A |0101_qqq_110_001_rrr 8359: //DEC.L <ea> |A|012346|-|UUUUU|*****|D M+-WXZ |0101_001_110_mmm_rrr [SUBQ.L #1,<ea>] 8360: //DEC.L Ar |A|012346|-|-----|-----| A |0101_001_110_001_rrr [SUBQ.L #1,Ar] 8361: public static void irpSubqLong () throws M68kException { 8362: int ea = XEiJ.regOC & 63; 8363: int y = ((XEiJ.regOC >> 9) - 1 & 7) + 1; //qqq==0?8:qqq 8364: if (ea >> 3 == XEiJ.MMM_AR) { //SUBQ.L #<data>,Ar 8365: XEiJ.mpuCycleCount += 8; 8366: XEiJ.regRn[ea] -= y; //このr[ea]はアドレスレジスタ 8367: //ccrは操作しない 8368: } else { 8369: int x; 8370: int z; 8371: if (ea < XEiJ.EA_AR) { //SUBQ.L #<data>,Dr 8372: XEiJ.mpuCycleCount += 8; 8373: XEiJ.regRn[ea] = z = (x = XEiJ.regRn[ea]) - y; 8374: } else { //SUBQ.L #<data>,<mem> 8375: XEiJ.mpuCycleCount += 12; 8376: int a = efaMltLong (ea); 8377: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y); 8378: } 8379: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 8380: (x & ~z) >>> 31 << 1 | 8381: (~x & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subq 8382: } 8383: } //irpSubqLong 8384: 8385: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8386: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8387: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8388: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8389: //SF.B <ea> |-|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr 8390: //SNT.B <ea> |A|012346|-|-----|-----|D M+-WXZ |0101_000_111_mmm_rrr [SF.B <ea>] 8391: //DBF.W Dr,<label> |-|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} 8392: //DBNT.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 8393: //DBRA.W Dr,<label> |A|012346|-|-----|-----| |0101_000_111_001_rrr-{offset} [DBF.W Dr,<label>] 8394: public static void irpSf () throws M68kException { 8395: int ea = XEiJ.regOC & 63; 8396: //DBRA.W Dr,<label>よりもSF.B Drを優先する 8397: if (ea < XEiJ.EA_AR) { //SF.B Dr 8398: XEiJ.mpuCycleCount += 4; 8399: XEiJ.regRn[ea] &= ~0xff; 8400: } else if (ea < XEiJ.EA_MM) { //DBRA.W Dr,<label> 8401: //条件が成立していないのでデクリメント 8402: int rrr = XEiJ.regOC & 7; 8403: int t = XEiJ.regRn[rrr]; 8404: if ((short) t == 0) { //Drの下位16bitが0なので通過 8405: XEiJ.mpuCycleCount += 14; 8406: XEiJ.regRn[rrr] = t + 65535; 8407: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8408: //リードを省略する 8409: } else { 8410: XEiJ.busRws (XEiJ.regPC); 8411: } 8412: XEiJ.regPC += 2; 8413: } else { //Drの下位16bitが0でないのでジャンプ 8414: XEiJ.mpuCycleCount += 10; 8415: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8416: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8417: } 8418: } else { //SF.B <mem> 8419: XEiJ.mpuCycleCount += 8; 8420: XEiJ.busWb (efaMltByte (ea), 0x00); 8421: } 8422: } //irpSf 8423: 8424: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8425: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8426: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8427: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8428: //SHI.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr 8429: //SNLS.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_011_mmm_rrr [SHI.B <ea>] 8430: //DBHI.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} 8431: //DBNLS.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_011_001_rrr-{offset} [DBHI.W Dr,<label>] 8432: public static void irpShi () throws M68kException { 8433: int ea = XEiJ.regOC & 63; 8434: if (ea >> 3 == XEiJ.MMM_AR) { //DBHI.W Dr,<label> 8435: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { 8436: //条件が成立しているので通過 8437: XEiJ.mpuCycleCount += 12; 8438: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8439: //リードを省略する 8440: } else { 8441: XEiJ.busRws (XEiJ.regPC); 8442: } 8443: XEiJ.regPC += 2; 8444: } else { 8445: //条件が成立していないのでデクリメント 8446: int rrr = XEiJ.regOC & 7; 8447: int t = XEiJ.regRn[rrr]; 8448: if ((short) t == 0) { //Drの下位16bitが0なので通過 8449: XEiJ.mpuCycleCount += 14; 8450: XEiJ.regRn[rrr] = t + 65535; 8451: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8452: //リードを省略する 8453: } else { 8454: XEiJ.busRws (XEiJ.regPC); 8455: } 8456: XEiJ.regPC += 2; 8457: } else { //Drの下位16bitが0でないのでジャンプ 8458: XEiJ.mpuCycleCount += 10; 8459: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8460: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8461: } 8462: } 8463: } else if (ea < XEiJ.EA_AR) { //SHI.B Dr 8464: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //セット 8465: XEiJ.mpuCycleCount += 6; 8466: XEiJ.regRn[ea] |= 0xff; 8467: } else { //クリア 8468: XEiJ.mpuCycleCount += 4; 8469: XEiJ.regRn[ea] &= ~0xff; 8470: } 8471: } else { //SHI.B <mem> 8472: XEiJ.mpuCycleCount += 8; 8473: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HI << XEiJ.regCCR >> 31); 8474: } 8475: } //irpShi 8476: 8477: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8478: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8479: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8480: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8481: //SLS.B <ea> |-|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr 8482: //SNHI.B <ea> |A|012346|-|--*-*|-----|D M+-WXZ |0101_001_111_mmm_rrr [SLS.B <ea>] 8483: //DBLS.W Dr,<label> |-|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} 8484: //DBNHI.W Dr,<label> |A|012346|-|--*-*|-----| |0101_001_111_001_rrr-{offset} [DBLS.W Dr,<label>] 8485: public static void irpSls () throws M68kException { 8486: int ea = XEiJ.regOC & 63; 8487: if (ea >> 3 == XEiJ.MMM_AR) { //DBLS.W Dr,<label> 8488: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { 8489: //条件が成立しているので通過 8490: XEiJ.mpuCycleCount += 12; 8491: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8492: //リードを省略する 8493: } else { 8494: XEiJ.busRws (XEiJ.regPC); 8495: } 8496: XEiJ.regPC += 2; 8497: } else { 8498: //条件が成立していないのでデクリメント 8499: int rrr = XEiJ.regOC & 7; 8500: int t = XEiJ.regRn[rrr]; 8501: if ((short) t == 0) { //Drの下位16bitが0なので通過 8502: XEiJ.mpuCycleCount += 14; 8503: XEiJ.regRn[rrr] = t + 65535; 8504: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8505: //リードを省略する 8506: } else { 8507: XEiJ.busRws (XEiJ.regPC); 8508: } 8509: XEiJ.regPC += 2; 8510: } else { //Drの下位16bitが0でないのでジャンプ 8511: XEiJ.mpuCycleCount += 10; 8512: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8513: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8514: } 8515: } 8516: } else if (ea < XEiJ.EA_AR) { //SLS.B Dr 8517: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //セット 8518: XEiJ.mpuCycleCount += 6; 8519: XEiJ.regRn[ea] |= 0xff; 8520: } else { //クリア 8521: XEiJ.mpuCycleCount += 4; 8522: XEiJ.regRn[ea] &= ~0xff; 8523: } 8524: } else { //SLS.B <mem> 8525: XEiJ.mpuCycleCount += 8; 8526: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LS << XEiJ.regCCR >> 31); 8527: } 8528: } //irpSls 8529: 8530: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8531: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8532: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8533: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8534: //SCC.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr 8535: //SHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8536: //SNCS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8537: //SNLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_011_mmm_rrr [SCC.B <ea>] 8538: //DBCC.W Dr,<label> |-|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} 8539: //DBHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8540: //DBNCS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8541: //DBNLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_011_001_rrr-{offset} [DBCC.W Dr,<label>] 8542: public static void irpShs () throws M68kException { 8543: int ea = XEiJ.regOC & 63; 8544: if (ea >> 3 == XEiJ.MMM_AR) { //DBHS.W Dr,<label> 8545: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { 8546: //条件が成立しているので通過 8547: XEiJ.mpuCycleCount += 12; 8548: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8549: //リードを省略する 8550: } else { 8551: XEiJ.busRws (XEiJ.regPC); 8552: } 8553: XEiJ.regPC += 2; 8554: } else { 8555: //条件が成立していないのでデクリメント 8556: int rrr = XEiJ.regOC & 7; 8557: int t = XEiJ.regRn[rrr]; 8558: if ((short) t == 0) { //Drの下位16bitが0なので通過 8559: XEiJ.mpuCycleCount += 14; 8560: XEiJ.regRn[rrr] = t + 65535; 8561: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8562: //リードを省略する 8563: } else { 8564: XEiJ.busRws (XEiJ.regPC); 8565: } 8566: XEiJ.regPC += 2; 8567: } else { //Drの下位16bitが0でないのでジャンプ 8568: XEiJ.mpuCycleCount += 10; 8569: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8570: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8571: } 8572: } 8573: } else if (ea < XEiJ.EA_AR) { //SHS.B Dr 8574: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //セット 8575: XEiJ.mpuCycleCount += 6; 8576: XEiJ.regRn[ea] |= 0xff; 8577: } else { //クリア 8578: XEiJ.mpuCycleCount += 4; 8579: XEiJ.regRn[ea] &= ~0xff; 8580: } 8581: } else { //SHS.B <mem> 8582: XEiJ.mpuCycleCount += 8; 8583: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_HS << XEiJ.regCCR >> 31); 8584: } 8585: } //irpShs 8586: 8587: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8588: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8589: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8590: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8591: //SCS.B <ea> |-|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr 8592: //SLO.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8593: //SNCC.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8594: //SNHS.B <ea> |A|012346|-|----*|-----|D M+-WXZ |0101_010_111_mmm_rrr [SCS.B <ea>] 8595: //DBCS.W Dr,<label> |-|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} 8596: //DBLO.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8597: //DBNCC.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8598: //DBNHS.W Dr,<label> |A|012346|-|----*|-----| |0101_010_111_001_rrr-{offset} [DBCS.W Dr,<label>] 8599: public static void irpSlo () throws M68kException { 8600: int ea = XEiJ.regOC & 63; 8601: if (ea >> 3 == XEiJ.MMM_AR) { //DBLO.W Dr,<label> 8602: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { 8603: //条件が成立しているので通過 8604: XEiJ.mpuCycleCount += 12; 8605: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8606: //リードを省略する 8607: } else { 8608: XEiJ.busRws (XEiJ.regPC); 8609: } 8610: XEiJ.regPC += 2; 8611: } else { 8612: //条件が成立していないのでデクリメント 8613: int rrr = XEiJ.regOC & 7; 8614: int t = XEiJ.regRn[rrr]; 8615: if ((short) t == 0) { //Drの下位16bitが0なので通過 8616: XEiJ.mpuCycleCount += 14; 8617: XEiJ.regRn[rrr] = t + 65535; 8618: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8619: //リードを省略する 8620: } else { 8621: XEiJ.busRws (XEiJ.regPC); 8622: } 8623: XEiJ.regPC += 2; 8624: } else { //Drの下位16bitが0でないのでジャンプ 8625: XEiJ.mpuCycleCount += 10; 8626: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8627: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8628: } 8629: } 8630: } else if (ea < XEiJ.EA_AR) { //SLO.B Dr 8631: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //セット 8632: XEiJ.mpuCycleCount += 6; 8633: XEiJ.regRn[ea] |= 0xff; 8634: } else { //クリア 8635: XEiJ.mpuCycleCount += 4; 8636: XEiJ.regRn[ea] &= ~0xff; 8637: } 8638: } else { //SLO.B <mem> 8639: XEiJ.mpuCycleCount += 8; 8640: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LO << XEiJ.regCCR >> 31); 8641: } 8642: } //irpSlo 8643: 8644: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8645: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8646: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8647: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8648: //SNE.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr 8649: //SNEQ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8650: //SNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8651: //SNZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_011_mmm_rrr [SNE.B <ea>] 8652: //DBNE.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} 8653: //DBNEQ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8654: //DBNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8655: //DBNZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_011_001_rrr-{offset} [DBNE.W Dr,<label>] 8656: public static void irpSne () throws M68kException { 8657: int ea = XEiJ.regOC & 63; 8658: if (ea >> 3 == XEiJ.MMM_AR) { //DBNE.W Dr,<label> 8659: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { 8660: //条件が成立しているので通過 8661: XEiJ.mpuCycleCount += 12; 8662: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8663: //リードを省略する 8664: } else { 8665: XEiJ.busRws (XEiJ.regPC); 8666: } 8667: XEiJ.regPC += 2; 8668: } else { 8669: //条件が成立していないのでデクリメント 8670: int rrr = XEiJ.regOC & 7; 8671: int t = XEiJ.regRn[rrr]; 8672: if ((short) t == 0) { //Drの下位16bitが0なので通過 8673: XEiJ.mpuCycleCount += 14; 8674: XEiJ.regRn[rrr] = t + 65535; 8675: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8676: //リードを省略する 8677: } else { 8678: XEiJ.busRws (XEiJ.regPC); 8679: } 8680: XEiJ.regPC += 2; 8681: } else { //Drの下位16bitが0でないのでジャンプ 8682: XEiJ.mpuCycleCount += 10; 8683: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8684: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8685: } 8686: } 8687: } else if (ea < XEiJ.EA_AR) { //SNE.B Dr 8688: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //セット 8689: XEiJ.mpuCycleCount += 6; 8690: XEiJ.regRn[ea] |= 0xff; 8691: } else { //クリア 8692: XEiJ.mpuCycleCount += 4; 8693: XEiJ.regRn[ea] &= ~0xff; 8694: } 8695: } else { //SNE.B <mem> 8696: XEiJ.mpuCycleCount += 8; 8697: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_NE << XEiJ.regCCR >> 31); 8698: } 8699: } //irpSne 8700: 8701: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8702: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8703: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8704: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8705: //SEQ.B <ea> |-|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr 8706: //SNNE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8707: //SNNZ.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8708: //SZE.B <ea> |A|012346|-|--*--|-----|D M+-WXZ |0101_011_111_mmm_rrr [SEQ.B <ea>] 8709: //DBEQ.W Dr,<label> |-|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} 8710: //DBNNE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8711: //DBNNZ.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8712: //DBZE.W Dr,<label> |A|012346|-|--*--|-----| |0101_011_111_001_rrr-{offset} [DBEQ.W Dr,<label>] 8713: public static void irpSeq () throws M68kException { 8714: int ea = XEiJ.regOC & 63; 8715: if (ea >> 3 == XEiJ.MMM_AR) { //DBEQ.W Dr,<label> 8716: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { 8717: //条件が成立しているので通過 8718: XEiJ.mpuCycleCount += 12; 8719: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8720: //リードを省略する 8721: } else { 8722: XEiJ.busRws (XEiJ.regPC); 8723: } 8724: XEiJ.regPC += 2; 8725: } else { 8726: //条件が成立していないのでデクリメント 8727: int rrr = XEiJ.regOC & 7; 8728: int t = XEiJ.regRn[rrr]; 8729: if ((short) t == 0) { //Drの下位16bitが0なので通過 8730: XEiJ.mpuCycleCount += 14; 8731: XEiJ.regRn[rrr] = t + 65535; 8732: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8733: //リードを省略する 8734: } else { 8735: XEiJ.busRws (XEiJ.regPC); 8736: } 8737: XEiJ.regPC += 2; 8738: } else { //Drの下位16bitが0でないのでジャンプ 8739: XEiJ.mpuCycleCount += 10; 8740: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8741: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8742: } 8743: } 8744: } else if (ea < XEiJ.EA_AR) { //SEQ.B Dr 8745: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //セット 8746: XEiJ.mpuCycleCount += 6; 8747: XEiJ.regRn[ea] |= 0xff; 8748: } else { //クリア 8749: XEiJ.mpuCycleCount += 4; 8750: XEiJ.regRn[ea] &= ~0xff; 8751: } 8752: } else { //SEQ.B <mem> 8753: XEiJ.mpuCycleCount += 8; 8754: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_EQ << XEiJ.regCCR >> 31); 8755: } 8756: } //irpSeq 8757: 8758: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8759: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8760: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8761: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8762: //SVC.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr 8763: //SNVS.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_011_mmm_rrr [SVC.B <ea>] 8764: //DBVC.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} 8765: //DBNVS.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_011_001_rrr-{offset} [DBVC.W Dr,<label>] 8766: public static void irpSvc () throws M68kException { 8767: int ea = XEiJ.regOC & 63; 8768: if (ea >> 3 == XEiJ.MMM_AR) { //DBVC.W Dr,<label> 8769: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { 8770: //条件が成立しているので通過 8771: XEiJ.mpuCycleCount += 12; 8772: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8773: //リードを省略する 8774: } else { 8775: XEiJ.busRws (XEiJ.regPC); 8776: } 8777: XEiJ.regPC += 2; 8778: } else { 8779: //条件が成立していないのでデクリメント 8780: int rrr = XEiJ.regOC & 7; 8781: int t = XEiJ.regRn[rrr]; 8782: if ((short) t == 0) { //Drの下位16bitが0なので通過 8783: XEiJ.mpuCycleCount += 14; 8784: XEiJ.regRn[rrr] = t + 65535; 8785: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8786: //リードを省略する 8787: } else { 8788: XEiJ.busRws (XEiJ.regPC); 8789: } 8790: XEiJ.regPC += 2; 8791: } else { //Drの下位16bitが0でないのでジャンプ 8792: XEiJ.mpuCycleCount += 10; 8793: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8794: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8795: } 8796: } 8797: } else if (ea < XEiJ.EA_AR) { //SVC.B Dr 8798: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //セット 8799: XEiJ.mpuCycleCount += 6; 8800: XEiJ.regRn[ea] |= 0xff; 8801: } else { //クリア 8802: XEiJ.mpuCycleCount += 4; 8803: XEiJ.regRn[ea] &= ~0xff; 8804: } 8805: } else { //SVC.B <mem> 8806: XEiJ.mpuCycleCount += 8; 8807: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VC << XEiJ.regCCR >> 31); 8808: } 8809: } //irpSvc 8810: 8811: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8812: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8813: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8814: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8815: //SVS.B <ea> |-|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr 8816: //SNVC.B <ea> |A|012346|-|---*-|-----|D M+-WXZ |0101_100_111_mmm_rrr [SVS.B <ea>] 8817: //DBVS.W Dr,<label> |-|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} 8818: //DBNVC.W Dr,<label> |A|012346|-|---*-|-----| |0101_100_111_001_rrr-{offset} [DBVS.W Dr,<label>] 8819: public static void irpSvs () throws M68kException { 8820: int ea = XEiJ.regOC & 63; 8821: if (ea >> 3 == XEiJ.MMM_AR) { //DBVS.W Dr,<label> 8822: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { 8823: //条件が成立しているので通過 8824: XEiJ.mpuCycleCount += 12; 8825: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8826: //リードを省略する 8827: } else { 8828: XEiJ.busRws (XEiJ.regPC); 8829: } 8830: XEiJ.regPC += 2; 8831: } else { 8832: //条件が成立していないのでデクリメント 8833: int rrr = XEiJ.regOC & 7; 8834: int t = XEiJ.regRn[rrr]; 8835: if ((short) t == 0) { //Drの下位16bitが0なので通過 8836: XEiJ.mpuCycleCount += 14; 8837: XEiJ.regRn[rrr] = t + 65535; 8838: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8839: //リードを省略する 8840: } else { 8841: XEiJ.busRws (XEiJ.regPC); 8842: } 8843: XEiJ.regPC += 2; 8844: } else { //Drの下位16bitが0でないのでジャンプ 8845: XEiJ.mpuCycleCount += 10; 8846: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8847: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8848: } 8849: } 8850: } else if (ea < XEiJ.EA_AR) { //SVS.B Dr 8851: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //セット 8852: XEiJ.mpuCycleCount += 6; 8853: XEiJ.regRn[ea] |= 0xff; 8854: } else { //クリア 8855: XEiJ.mpuCycleCount += 4; 8856: XEiJ.regRn[ea] &= ~0xff; 8857: } 8858: } else { //SVS.B <mem> 8859: XEiJ.mpuCycleCount += 8; 8860: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_VS << XEiJ.regCCR >> 31); 8861: } 8862: } //irpSvs 8863: 8864: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8865: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8866: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8867: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8868: //SPL.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr 8869: //SNMI.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_011_mmm_rrr [SPL.B <ea>] 8870: //DBPL.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} 8871: //DBNMI.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_011_001_rrr-{offset} [DBPL.W Dr,<label>] 8872: public static void irpSpl () throws M68kException { 8873: int ea = XEiJ.regOC & 63; 8874: if (ea >> 3 == XEiJ.MMM_AR) { //DBPL.W Dr,<label> 8875: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { 8876: //条件が成立しているので通過 8877: XEiJ.mpuCycleCount += 12; 8878: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8879: //リードを省略する 8880: } else { 8881: XEiJ.busRws (XEiJ.regPC); 8882: } 8883: XEiJ.regPC += 2; 8884: } else { 8885: //条件が成立していないのでデクリメント 8886: int rrr = XEiJ.regOC & 7; 8887: int t = XEiJ.regRn[rrr]; 8888: if ((short) t == 0) { //Drの下位16bitが0なので通過 8889: XEiJ.mpuCycleCount += 14; 8890: XEiJ.regRn[rrr] = t + 65535; 8891: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8892: //リードを省略する 8893: } else { 8894: XEiJ.busRws (XEiJ.regPC); 8895: } 8896: XEiJ.regPC += 2; 8897: } else { //Drの下位16bitが0でないのでジャンプ 8898: XEiJ.mpuCycleCount += 10; 8899: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8900: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8901: } 8902: } 8903: } else if (ea < XEiJ.EA_AR) { //SPL.B Dr 8904: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //セット 8905: XEiJ.mpuCycleCount += 6; 8906: XEiJ.regRn[ea] |= 0xff; 8907: } else { //クリア 8908: XEiJ.mpuCycleCount += 4; 8909: XEiJ.regRn[ea] &= ~0xff; 8910: } 8911: } else { //SPL.B <mem> 8912: XEiJ.mpuCycleCount += 8; 8913: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_PL << XEiJ.regCCR >> 31); 8914: } 8915: } //irpSpl 8916: 8917: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8918: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8919: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8920: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8921: //SMI.B <ea> |-|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr 8922: //SNPL.B <ea> |A|012346|-|-*---|-----|D M+-WXZ |0101_101_111_mmm_rrr [SMI.B <ea>] 8923: //DBMI.W Dr,<label> |-|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} 8924: //DBNPL.W Dr,<label> |A|012346|-|-*---|-----| |0101_101_111_001_rrr-{offset} [DBMI.W Dr,<label>] 8925: public static void irpSmi () throws M68kException { 8926: int ea = XEiJ.regOC & 63; 8927: if (ea >> 3 == XEiJ.MMM_AR) { //DBMI.W Dr,<label> 8928: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { 8929: //条件が成立しているので通過 8930: XEiJ.mpuCycleCount += 12; 8931: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8932: //リードを省略する 8933: } else { 8934: XEiJ.busRws (XEiJ.regPC); 8935: } 8936: XEiJ.regPC += 2; 8937: } else { 8938: //条件が成立していないのでデクリメント 8939: int rrr = XEiJ.regOC & 7; 8940: int t = XEiJ.regRn[rrr]; 8941: if ((short) t == 0) { //Drの下位16bitが0なので通過 8942: XEiJ.mpuCycleCount += 14; 8943: XEiJ.regRn[rrr] = t + 65535; 8944: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8945: //リードを省略する 8946: } else { 8947: XEiJ.busRws (XEiJ.regPC); 8948: } 8949: XEiJ.regPC += 2; 8950: } else { //Drの下位16bitが0でないのでジャンプ 8951: XEiJ.mpuCycleCount += 10; 8952: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 8953: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 8954: } 8955: } 8956: } else if (ea < XEiJ.EA_AR) { //SMI.B Dr 8957: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //セット 8958: XEiJ.mpuCycleCount += 6; 8959: XEiJ.regRn[ea] |= 0xff; 8960: } else { //クリア 8961: XEiJ.mpuCycleCount += 4; 8962: XEiJ.regRn[ea] &= ~0xff; 8963: } 8964: } else { //SMI.B <mem> 8965: XEiJ.mpuCycleCount += 8; 8966: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_MI << XEiJ.regCCR >> 31); 8967: } 8968: } //irpSmi 8969: 8970: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8971: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 8972: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 8973: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 8974: //SGE.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr 8975: //SNLT.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_011_mmm_rrr [SGE.B <ea>] 8976: //DBGE.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} 8977: //DBNLT.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_011_001_rrr-{offset} [DBGE.W Dr,<label>] 8978: public static void irpSge () throws M68kException { 8979: int ea = XEiJ.regOC & 63; 8980: if (ea >> 3 == XEiJ.MMM_AR) { //DBGE.W Dr,<label> 8981: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { 8982: //条件が成立しているので通過 8983: XEiJ.mpuCycleCount += 12; 8984: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8985: //リードを省略する 8986: } else { 8987: XEiJ.busRws (XEiJ.regPC); 8988: } 8989: XEiJ.regPC += 2; 8990: } else { 8991: //条件が成立していないのでデクリメント 8992: int rrr = XEiJ.regOC & 7; 8993: int t = XEiJ.regRn[rrr]; 8994: if ((short) t == 0) { //Drの下位16bitが0なので通過 8995: XEiJ.mpuCycleCount += 14; 8996: XEiJ.regRn[rrr] = t + 65535; 8997: if (XEiJ.MPU_OMIT_OFFSET_READ) { 8998: //リードを省略する 8999: } else { 9000: XEiJ.busRws (XEiJ.regPC); 9001: } 9002: XEiJ.regPC += 2; 9003: } else { //Drの下位16bitが0でないのでジャンプ 9004: XEiJ.mpuCycleCount += 10; 9005: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9006: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9007: } 9008: } 9009: } else if (ea < XEiJ.EA_AR) { //SGE.B Dr 9010: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //セット 9011: XEiJ.mpuCycleCount += 6; 9012: XEiJ.regRn[ea] |= 0xff; 9013: } else { //クリア 9014: XEiJ.mpuCycleCount += 4; 9015: XEiJ.regRn[ea] &= ~0xff; 9016: } 9017: } else { //SGE.B <mem> 9018: XEiJ.mpuCycleCount += 8; 9019: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GE << XEiJ.regCCR >> 31); 9020: } 9021: } //irpSge 9022: 9023: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9024: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9025: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9026: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9027: //SLT.B <ea> |-|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr 9028: //SNGE.B <ea> |A|012346|-|-*-*-|-----|D M+-WXZ |0101_110_111_mmm_rrr [SLT.B <ea>] 9029: //DBLT.W Dr,<label> |-|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} 9030: //DBNGE.W Dr,<label> |A|012346|-|-*-*-|-----| |0101_110_111_001_rrr-{offset} [DBLT.W Dr,<label>] 9031: public static void irpSlt () throws M68kException { 9032: int ea = XEiJ.regOC & 63; 9033: if (ea >> 3 == XEiJ.MMM_AR) { //DBLT.W Dr,<label> 9034: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { 9035: //条件が成立しているので通過 9036: XEiJ.mpuCycleCount += 12; 9037: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9038: //リードを省略する 9039: } else { 9040: XEiJ.busRws (XEiJ.regPC); 9041: } 9042: XEiJ.regPC += 2; 9043: } else { 9044: //条件が成立していないのでデクリメント 9045: int rrr = XEiJ.regOC & 7; 9046: int t = XEiJ.regRn[rrr]; 9047: if ((short) t == 0) { //Drの下位16bitが0なので通過 9048: XEiJ.mpuCycleCount += 14; 9049: XEiJ.regRn[rrr] = t + 65535; 9050: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9051: //リードを省略する 9052: } else { 9053: XEiJ.busRws (XEiJ.regPC); 9054: } 9055: XEiJ.regPC += 2; 9056: } else { //Drの下位16bitが0でないのでジャンプ 9057: XEiJ.mpuCycleCount += 10; 9058: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9059: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9060: } 9061: } 9062: } else if (ea < XEiJ.EA_AR) { //SLT.B Dr 9063: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //セット 9064: XEiJ.mpuCycleCount += 6; 9065: XEiJ.regRn[ea] |= 0xff; 9066: } else { //クリア 9067: XEiJ.mpuCycleCount += 4; 9068: XEiJ.regRn[ea] &= ~0xff; 9069: } 9070: } else { //SLT.B <mem> 9071: XEiJ.mpuCycleCount += 8; 9072: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LT << XEiJ.regCCR >> 31); 9073: } 9074: } //irpSlt 9075: 9076: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9077: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9078: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9079: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9080: //SGT.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr 9081: //SNLE.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_011_mmm_rrr [SGT.B <ea>] 9082: //DBGT.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} 9083: //DBNLE.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_011_001_rrr-{offset} [DBGT.W Dr,<label>] 9084: public static void irpSgt () throws M68kException { 9085: int ea = XEiJ.regOC & 63; 9086: if (ea >> 3 == XEiJ.MMM_AR) { //DBGT.W Dr,<label> 9087: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { 9088: //条件が成立しているので通過 9089: XEiJ.mpuCycleCount += 12; 9090: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9091: //リードを省略する 9092: } else { 9093: XEiJ.busRws (XEiJ.regPC); 9094: } 9095: XEiJ.regPC += 2; 9096: } else { 9097: //条件が成立していないのでデクリメント 9098: int rrr = XEiJ.regOC & 7; 9099: int t = XEiJ.regRn[rrr]; 9100: if ((short) t == 0) { //Drの下位16bitが0なので通過 9101: XEiJ.mpuCycleCount += 14; 9102: XEiJ.regRn[rrr] = t + 65535; 9103: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9104: //リードを省略する 9105: } else { 9106: XEiJ.busRws (XEiJ.regPC); 9107: } 9108: XEiJ.regPC += 2; 9109: } else { //Drの下位16bitが0でないのでジャンプ 9110: XEiJ.mpuCycleCount += 10; 9111: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9112: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9113: } 9114: } 9115: } else if (ea < XEiJ.EA_AR) { //SGT.B Dr 9116: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //セット 9117: XEiJ.mpuCycleCount += 6; 9118: XEiJ.regRn[ea] |= 0xff; 9119: } else { //クリア 9120: XEiJ.mpuCycleCount += 4; 9121: XEiJ.regRn[ea] &= ~0xff; 9122: } 9123: } else { //SGT.B <mem> 9124: XEiJ.mpuCycleCount += 8; 9125: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_GT << XEiJ.regCCR >> 31); 9126: } 9127: } //irpSgt 9128: 9129: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9130: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9131: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9132: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9133: //SLE.B <ea> |-|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr 9134: //SNGT.B <ea> |A|012346|-|-***-|-----|D M+-WXZ |0101_111_111_mmm_rrr [SLE.B <ea>] 9135: //DBLE.W Dr,<label> |-|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} 9136: //DBNGT.W Dr,<label> |A|012346|-|-***-|-----| |0101_111_111_001_rrr-{offset} [DBLE.W Dr,<label>] 9137: public static void irpSle () throws M68kException { 9138: int ea = XEiJ.regOC & 63; 9139: if (ea >> 3 == XEiJ.MMM_AR) { //DBLE.W Dr,<label> 9140: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { 9141: //条件が成立しているので通過 9142: XEiJ.mpuCycleCount += 12; 9143: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9144: //リードを省略する 9145: } else { 9146: XEiJ.busRws (XEiJ.regPC); 9147: } 9148: XEiJ.regPC += 2; 9149: } else { 9150: //条件が成立していないのでデクリメント 9151: int rrr = XEiJ.regOC & 7; 9152: int t = XEiJ.regRn[rrr]; 9153: if ((short) t == 0) { //Drの下位16bitが0なので通過 9154: XEiJ.mpuCycleCount += 14; 9155: XEiJ.regRn[rrr] = t + 65535; 9156: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9157: //リードを省略する 9158: } else { 9159: XEiJ.busRws (XEiJ.regPC); 9160: } 9161: XEiJ.regPC += 2; 9162: } else { //Drの下位16bitが0でないのでジャンプ 9163: XEiJ.mpuCycleCount += 10; 9164: XEiJ.regRn[rrr] = t - 1; //下位16bitが0でないので上位16bitは変化しない 9165: irpSetPC (XEiJ.regPC + XEiJ.busRws (XEiJ.regPC)); //pc==pc0+2 9166: } 9167: } 9168: } else if (ea < XEiJ.EA_AR) { //SLE.B Dr 9169: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //セット 9170: XEiJ.mpuCycleCount += 6; 9171: XEiJ.regRn[ea] |= 0xff; 9172: } else { //クリア 9173: XEiJ.mpuCycleCount += 4; 9174: XEiJ.regRn[ea] &= ~0xff; 9175: } 9176: } else { //SLE.B <mem> 9177: XEiJ.mpuCycleCount += 8; 9178: XEiJ.busWb (efaMltByte (ea), XEiJ.MPU_CC_LE << XEiJ.regCCR >> 31); 9179: } 9180: } //irpSle 9181: 9182: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9183: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9184: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9185: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9186: //BRA.W <label> |-|012346|-|-----|-----| |0110_000_000_000_000-{offset} 9187: //JBRA.W <label> |A|012346|-|-----|-----| |0110_000_000_000_000-{offset} [BRA.W <label>] 9188: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) 9189: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_000_sss_sss (s is not equal to 0) [BRA.S <label>] 9190: public static void irpBrasw () throws M68kException { 9191: XEiJ.mpuCycleCount += 10; 9192: int t = XEiJ.regPC; //pc0+2 9193: int s = (byte) XEiJ.regOC; //オフセット 9194: if (s == 0) { //BRA.W 9195: XEiJ.regPC = t + 2; 9196: s = XEiJ.busRwse (t); //pcws 9197: } else { //BRA.S 9198: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9199: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9200: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9201: //! 軽量化。リードを省略する 9202: } else { 9203: XEiJ.busRwse (t); //pcws 9204: } 9205: } 9206: irpSetPC (t + s); //pc0+2+オフセット 9207: } //irpBrasw 9208: 9209: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9210: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9211: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9212: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9213: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_001_sss_sss 9214: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_001_sss_sss [BRA.S <label>] 9215: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9216: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9217: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9219: //BRA.S <label> |-|012346|-|-----|-----| |0110_000_010_sss_sss 9220: //JBRA.S <label> |A|012346|-|-----|-----| |0110_000_010_sss_sss [BRA.S <label>] 9221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9222: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9223: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9224: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9225: //BRA.S <label> |-|01----|-|-----|-----| |0110_000_011_sss_sss 9226: //JBRA.S <label> |A|01----|-|-----|-----| |0110_000_011_sss_sss [BRA.S <label>] 9227: public static void irpBras () throws M68kException { 9228: XEiJ.mpuCycleCount += 10; 9229: int t = XEiJ.regPC; //pc0+2 9230: int s = (byte) XEiJ.regOC; //オフセット 9231: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9232: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9233: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9234: //! 軽量化。リードを省略する 9235: } else { 9236: XEiJ.busRwse (t); //pcws 9237: } 9238: irpSetPC (t + s); //pc0+2+オフセット 9239: } //irpBras 9240: 9241: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9242: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9243: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9244: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9245: //BSR.W <label> |-|012346|-|-----|-----| |0110_000_100_000_000-{offset} 9246: //JBSR.W <label> |A|012346|-|-----|-----| |0110_000_100_000_000-{offset} [BSR.W <label>] 9247: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) 9248: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_100_sss_sss (s is not equal to 0) [BSR.S <label>] 9249: public static void irpBsrsw () throws M68kException { 9250: XEiJ.mpuCycleCount += 18; 9251: int t = XEiJ.regPC; //pc0+2 9252: int s = (byte) XEiJ.regOC; //オフセット 9253: if (s == 0) { //BSR.W 9254: XEiJ.regPC = t + 2; 9255: s = XEiJ.busRwse (t); //pcws 9256: } else { //BSR.S 9257: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9258: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9259: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9260: //! 軽量化。リードを省略する 9261: } else { 9262: XEiJ.busRwse (t); //pcws 9263: } 9264: } 9265: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 9266: irpSetPC (t + s); //pc0+2+オフセット 9267: } //irpBsrsw 9268: 9269: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9270: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9271: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9272: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9273: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_101_sss_sss 9274: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_101_sss_sss [BSR.S <label>] 9275: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9276: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9277: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9278: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9279: //BSR.S <label> |-|012346|-|-----|-----| |0110_000_110_sss_sss 9280: //JBSR.S <label> |A|012346|-|-----|-----| |0110_000_110_sss_sss [BSR.S <label>] 9281: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9282: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9283: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9284: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9285: //BSR.S <label> |-|01----|-|-----|-----| |0110_000_111_sss_sss 9286: //JBSR.S <label> |A|01----|-|-----|-----| |0110_000_111_sss_sss [BSR.S <label>] 9287: public static void irpBsrs () throws M68kException { 9288: XEiJ.mpuCycleCount += 18; 9289: int t = XEiJ.regPC; //pc0+2 9290: int s = (byte) XEiJ.regOC; //オフセット 9291: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9292: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9293: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9294: //! 軽量化。リードを省略する 9295: } else { 9296: XEiJ.busRwse (t); //pcws 9297: } 9298: XEiJ.busWl (XEiJ.regRn[15] -= 4, XEiJ.regPC); //pushl 9299: irpSetPC (t + s); //pc0+2+オフセット 9300: } //irpBsrs 9301: 9302: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9303: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9304: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9305: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9306: //BHI.W <label> |-|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} 9307: //BNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 9308: //JBHI.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 9309: //JBNLS.W <label> |A|012346|-|--*-*|-----| |0110_001_000_000_000-{offset} [BHI.W <label>] 9310: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) 9311: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 9312: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 9313: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_000_sss_sss (s is not equal to 0) [BHI.S <label>] 9314: //JBLS.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 9315: //JBNHI.L <label> |A|012346|-|--*-*|-----| |0110_001_000_000_110-0100111011111001-{address} [BHI.S (*)+8;JMP <label>] 9316: public static void irpBhisw () throws M68kException { 9317: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //Bccでジャンプ 9318: XEiJ.mpuCycleCount += 10; 9319: int t = XEiJ.regPC; //pc0+2 9320: int s = (byte) XEiJ.regOC; //オフセット 9321: if (s == 0) { //Bcc.Wでジャンプ 9322: XEiJ.regPC = t + 2; 9323: s = XEiJ.busRwse (t); //pcws 9324: } else { //Bcc.Sでジャンプ 9325: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9326: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9327: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9328: //! 軽量化。リードを省略する 9329: } else { 9330: XEiJ.busRwse (t); //pcws 9331: } 9332: } 9333: irpSetPC (t + s); //pc0+2+オフセット 9334: } else if (XEiJ.regOC == 0x6200) { //Bcc.Wで通過 9335: XEiJ.mpuCycleCount += 12; 9336: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9337: //リードを省略する 9338: } else { 9339: XEiJ.busRws (XEiJ.regPC); 9340: } 9341: XEiJ.regPC += 2; 9342: } else { //Bcc.Sで通過 9343: XEiJ.mpuCycleCount += 8; 9344: } 9345: } //irpBhisw 9346: 9347: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9348: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9349: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9350: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9351: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_001_sss_sss 9352: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9353: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9354: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_001_sss_sss [BHI.S <label>] 9355: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9356: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9357: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9358: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9359: //BHI.S <label> |-|012346|-|--*-*|-----| |0110_001_010_sss_sss 9360: //BNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9361: //JBHI.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9362: //JBNLS.S <label> |A|012346|-|--*-*|-----| |0110_001_010_sss_sss [BHI.S <label>] 9363: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9364: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9365: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9366: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9367: //BHI.S <label> |-|01----|-|--*-*|-----| |0110_001_011_sss_sss 9368: //BNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9369: //JBHI.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9370: //JBNLS.S <label> |A|01----|-|--*-*|-----| |0110_001_011_sss_sss [BHI.S <label>] 9371: public static void irpBhis () throws M68kException { 9372: if (XEiJ.MPU_CC_HI << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9373: XEiJ.mpuCycleCount += 10; 9374: int t = XEiJ.regPC; //pc0+2 9375: int s = (byte) XEiJ.regOC; //オフセット 9376: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9377: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9378: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9379: //! 軽量化。リードを省略する 9380: } else { 9381: XEiJ.busRwse (t); //pcws 9382: } 9383: irpSetPC (t + s); //pc0+2+オフセット 9384: } else { //Bcc.Sで通過 9385: XEiJ.mpuCycleCount += 8; 9386: } 9387: } //irpBhis 9388: 9389: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9390: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9391: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9392: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9393: //BLS.W <label> |-|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} 9394: //BNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9395: //JBLS.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9396: //JBNHI.W <label> |A|012346|-|--*-*|-----| |0110_001_100_000_000-{offset} [BLS.W <label>] 9397: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) 9398: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9399: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9400: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_100_sss_sss (s is not equal to 0) [BLS.S <label>] 9401: //JBHI.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 9402: //JBNLS.L <label> |A|012346|-|--*-*|-----| |0110_001_100_000_110-0100111011111001-{address} [BLS.S (*)+8;JMP <label>] 9403: public static void irpBlssw () throws M68kException { 9404: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //Bccでジャンプ 9405: XEiJ.mpuCycleCount += 10; 9406: int t = XEiJ.regPC; //pc0+2 9407: int s = (byte) XEiJ.regOC; //オフセット 9408: if (s == 0) { //Bcc.Wでジャンプ 9409: XEiJ.regPC = t + 2; 9410: s = XEiJ.busRwse (t); //pcws 9411: } else { //Bcc.Sでジャンプ 9412: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9413: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9414: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9415: //! 軽量化。リードを省略する 9416: } else { 9417: XEiJ.busRwse (t); //pcws 9418: } 9419: } 9420: irpSetPC (t + s); //pc0+2+オフセット 9421: } else if (XEiJ.regOC == 0x6300) { //Bcc.Wで通過 9422: XEiJ.mpuCycleCount += 12; 9423: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9424: //リードを省略する 9425: } else { 9426: XEiJ.busRws (XEiJ.regPC); 9427: } 9428: XEiJ.regPC += 2; 9429: } else { //Bcc.Sで通過 9430: XEiJ.mpuCycleCount += 8; 9431: } 9432: } //irpBlssw 9433: 9434: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9435: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9436: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9437: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9438: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_101_sss_sss 9439: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9440: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9441: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_101_sss_sss [BLS.S <label>] 9442: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9443: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9444: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9445: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9446: //BLS.S <label> |-|012346|-|--*-*|-----| |0110_001_110_sss_sss 9447: //BNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9448: //JBLS.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9449: //JBNHI.S <label> |A|012346|-|--*-*|-----| |0110_001_110_sss_sss [BLS.S <label>] 9450: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9451: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9452: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9453: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9454: //BLS.S <label> |-|01----|-|--*-*|-----| |0110_001_111_sss_sss 9455: //BNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9456: //JBLS.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9457: //JBNHI.S <label> |A|01----|-|--*-*|-----| |0110_001_111_sss_sss [BLS.S <label>] 9458: public static void irpBlss () throws M68kException { 9459: if (XEiJ.MPU_CC_LS << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9460: XEiJ.mpuCycleCount += 10; 9461: int t = XEiJ.regPC; //pc0+2 9462: int s = (byte) XEiJ.regOC; //オフセット 9463: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9464: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9465: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9466: //! 軽量化。リードを省略する 9467: } else { 9468: XEiJ.busRwse (t); //pcws 9469: } 9470: irpSetPC (t + s); //pc0+2+オフセット 9471: } else { //Bcc.Sで通過 9472: XEiJ.mpuCycleCount += 8; 9473: } 9474: } //irpBlss 9475: 9476: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9477: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9478: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9479: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9480: //BCC.W <label> |-|012346|-|----*|-----| |0110_010_000_000_000-{offset} 9481: //BHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9482: //BNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9483: //BNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9484: //JBCC.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9485: //JBHS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9486: //JBNCS.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9487: //JBNLO.W <label> |A|012346|-|----*|-----| |0110_010_000_000_000-{offset} [BCC.W <label>] 9488: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) 9489: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9490: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9491: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9492: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9493: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9494: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9495: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_000_sss_sss (s is not equal to 0) [BCC.S <label>] 9496: //JBCS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9497: //JBLO.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9498: //JBNCC.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9499: //JBNHS.L <label> |A|012346|-|----*|-----| |0110_010_000_000_110-0100111011111001-{address} [BCC.S (*)+8;JMP <label>] 9500: public static void irpBhssw () throws M68kException { 9501: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //Bccでジャンプ 9502: XEiJ.mpuCycleCount += 10; 9503: int t = XEiJ.regPC; //pc0+2 9504: int s = (byte) XEiJ.regOC; //オフセット 9505: if (s == 0) { //Bcc.Wでジャンプ 9506: XEiJ.regPC = t + 2; 9507: s = XEiJ.busRwse (t); //pcws 9508: } else { //Bcc.Sでジャンプ 9509: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9510: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9511: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9512: //! 軽量化。リードを省略する 9513: } else { 9514: XEiJ.busRwse (t); //pcws 9515: } 9516: } 9517: irpSetPC (t + s); //pc0+2+オフセット 9518: } else if (XEiJ.regOC == 0x6400) { //Bcc.Wで通過 9519: XEiJ.mpuCycleCount += 12; 9520: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9521: //リードを省略する 9522: } else { 9523: XEiJ.busRws (XEiJ.regPC); 9524: } 9525: XEiJ.regPC += 2; 9526: } else { //Bcc.Sで通過 9527: XEiJ.mpuCycleCount += 8; 9528: } 9529: } //irpBhssw 9530: 9531: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9532: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9533: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9534: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9535: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_001_sss_sss 9536: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9537: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9538: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9539: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9540: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9541: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9542: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_001_sss_sss [BCC.S <label>] 9543: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9544: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9545: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9546: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9547: //BCC.S <label> |-|012346|-|----*|-----| |0110_010_010_sss_sss 9548: //BHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9549: //BNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9550: //BNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9551: //JBCC.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9552: //JBHS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9553: //JBNCS.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9554: //JBNLO.S <label> |A|012346|-|----*|-----| |0110_010_010_sss_sss [BCC.S <label>] 9555: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9556: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9557: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9558: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9559: //BCC.S <label> |-|01----|-|----*|-----| |0110_010_011_sss_sss 9560: //BHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9561: //BNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9562: //BNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9563: //JBCC.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9564: //JBHS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9565: //JBNCS.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9566: //JBNLO.S <label> |A|01----|-|----*|-----| |0110_010_011_sss_sss [BCC.S <label>] 9567: public static void irpBhss () throws M68kException { 9568: if (XEiJ.MPU_CC_HS << XEiJ.regCCR < 0) { //Bcc.Sでジャンプ 9569: XEiJ.mpuCycleCount += 10; 9570: int t = XEiJ.regPC; //pc0+2 9571: int s = (byte) XEiJ.regOC; //オフセット 9572: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9573: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9574: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9575: //! 軽量化。リードを省略する 9576: } else { 9577: XEiJ.busRwse (t); //pcws 9578: } 9579: irpSetPC (t + s); //pc0+2+オフセット 9580: } else { //Bcc.Sで通過 9581: XEiJ.mpuCycleCount += 8; 9582: } 9583: } //irpBhss 9584: 9585: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9586: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9587: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9588: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9589: //BCS.W <label> |-|012346|-|----*|-----| |0110_010_100_000_000-{offset} 9590: //BLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9591: //BNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9592: //BNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9593: //JBCS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9594: //JBLO.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9595: //JBNCC.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9596: //JBNHS.W <label> |A|012346|-|----*|-----| |0110_010_100_000_000-{offset} [BCS.W <label>] 9597: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) 9598: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9599: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9600: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9601: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9602: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9603: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9604: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_100_sss_sss (s is not equal to 0) [BCS.S <label>] 9605: //JBCC.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9606: //JBHS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9607: //JBNCS.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9608: //JBNLO.L <label> |A|012346|-|----*|-----| |0110_010_100_000_110-0100111011111001-{address} [BCS.S (*)+8;JMP <label>] 9609: public static void irpBlosw () throws M68kException { 9610: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //Bccでジャンプ 9611: XEiJ.mpuCycleCount += 10; 9612: int t = XEiJ.regPC; //pc0+2 9613: int s = (byte) XEiJ.regOC; //オフセット 9614: if (s == 0) { //Bcc.Wでジャンプ 9615: XEiJ.regPC = t + 2; 9616: s = XEiJ.busRwse (t); //pcws 9617: } else { //Bcc.Sでジャンプ 9618: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9619: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9620: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9621: //! 軽量化。リードを省略する 9622: } else { 9623: XEiJ.busRwse (t); //pcws 9624: } 9625: } 9626: irpSetPC (t + s); //pc0+2+オフセット 9627: } else if (XEiJ.regOC == 0x6500) { //Bcc.Wで通過 9628: XEiJ.mpuCycleCount += 12; 9629: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9630: //リードを省略する 9631: } else { 9632: XEiJ.busRws (XEiJ.regPC); 9633: } 9634: XEiJ.regPC += 2; 9635: } else { //Bcc.Sで通過 9636: XEiJ.mpuCycleCount += 8; 9637: } 9638: } //irpBlosw 9639: 9640: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9641: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9642: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9643: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9644: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_101_sss_sss 9645: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9646: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9647: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9648: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9649: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9650: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9651: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_101_sss_sss [BCS.S <label>] 9652: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9653: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9654: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9655: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9656: //BCS.S <label> |-|012346|-|----*|-----| |0110_010_110_sss_sss 9657: //BLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9658: //BNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9659: //BNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9660: //JBCS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9661: //JBLO.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9662: //JBNCC.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9663: //JBNHS.S <label> |A|012346|-|----*|-----| |0110_010_110_sss_sss [BCS.S <label>] 9664: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9665: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9666: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9667: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9668: //BCS.S <label> |-|01----|-|----*|-----| |0110_010_111_sss_sss 9669: //BLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9670: //BNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9671: //BNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9672: //JBCS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9673: //JBLO.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9674: //JBNCC.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9675: //JBNHS.S <label> |A|01----|-|----*|-----| |0110_010_111_sss_sss [BCS.S <label>] 9676: public static void irpBlos () throws M68kException { 9677: if (XEiJ.MPU_CC_LO << XEiJ.regCCR < 0) { //Bccでジャンプ 9678: XEiJ.mpuCycleCount += 10; 9679: int t = XEiJ.regPC; //pc0+2 9680: int s = (byte) XEiJ.regOC; //オフセット 9681: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9682: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9683: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9684: //! 軽量化。リードを省略する 9685: } else { 9686: XEiJ.busRwse (t); //pcws 9687: } 9688: irpSetPC (t + s); //pc0+2+オフセット 9689: } else { //Bcc.Sで通過 9690: XEiJ.mpuCycleCount += 8; 9691: } 9692: } //irpBlos 9693: 9694: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9695: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9696: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9697: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9698: //BNE.W <label> |-|012346|-|--*--|-----| |0110_011_000_000_000-{offset} 9699: //BNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9700: //BNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9701: //BNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9702: //JBNE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9703: //JBNEQ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9704: //JBNZ.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9705: //JBNZE.W <label> |A|012346|-|--*--|-----| |0110_011_000_000_000-{offset} [BNE.W <label>] 9706: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) 9707: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9708: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9709: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9710: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9711: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9712: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9713: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_000_sss_sss (s is not equal to 0) [BNE.S <label>] 9714: //JBEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9715: //JBNEQ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9716: //JBNNE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9717: //JBNNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9718: //JBNZ.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9719: //JBNZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9720: //JBZE.L <label> |A|012346|-|--*--|-----| |0110_011_000_000_110-0100111011111001-{address} [BNE.S (*)+8;JMP <label>] 9721: public static void irpBnesw () throws M68kException { 9722: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //Bccでジャンプ 9723: XEiJ.mpuCycleCount += 10; 9724: int t = XEiJ.regPC; //pc0+2 9725: int s = (byte) XEiJ.regOC; //オフセット 9726: if (s == 0) { //Bcc.Wでジャンプ 9727: XEiJ.regPC = t + 2; 9728: s = XEiJ.busRwse (t); //pcws 9729: } else { //Bcc.Sでジャンプ 9730: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9731: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9732: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9733: //! 軽量化。リードを省略する 9734: } else { 9735: XEiJ.busRwse (t); //pcws 9736: } 9737: } 9738: irpSetPC (t + s); //pc0+2+オフセット 9739: } else if (XEiJ.regOC == 0x6600) { //Bcc.Wで通過 9740: XEiJ.mpuCycleCount += 12; 9741: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9742: //リードを省略する 9743: } else { 9744: XEiJ.busRws (XEiJ.regPC); 9745: } 9746: XEiJ.regPC += 2; 9747: } else { //Bcc.Sで通過 9748: XEiJ.mpuCycleCount += 8; 9749: } 9750: } //irpBnesw 9751: 9752: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9753: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9754: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9755: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9756: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_001_sss_sss 9757: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9758: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9759: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9760: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9761: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9762: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9763: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_001_sss_sss [BNE.S <label>] 9764: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9765: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9766: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9767: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9768: //BNE.S <label> |-|012346|-|--*--|-----| |0110_011_010_sss_sss 9769: //BNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9770: //BNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9771: //BNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9772: //JBNE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9773: //JBNEQ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9774: //JBNZ.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9775: //JBNZE.S <label> |A|012346|-|--*--|-----| |0110_011_010_sss_sss [BNE.S <label>] 9776: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9777: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9778: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9779: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9780: //BNE.S <label> |-|01----|-|--*--|-----| |0110_011_011_sss_sss 9781: //BNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9782: //BNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9783: //BNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9784: //JBNE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9785: //JBNEQ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9786: //JBNZ.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9787: //JBNZE.S <label> |A|01----|-|--*--|-----| |0110_011_011_sss_sss [BNE.S <label>] 9788: public static void irpBnes () throws M68kException { 9789: if (XEiJ.MPU_CC_NE << XEiJ.regCCR < 0) { //Bccでジャンプ 9790: XEiJ.mpuCycleCount += 10; 9791: int t = XEiJ.regPC; //pc0+2 9792: int s = (byte) XEiJ.regOC; //オフセット 9793: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9794: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9795: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9796: //! 軽量化。リードを省略する 9797: } else { 9798: XEiJ.busRwse (t); //pcws 9799: } 9800: irpSetPC (t + s); //pc0+2+オフセット 9801: } else { //Bcc.Sで通過 9802: XEiJ.mpuCycleCount += 8; 9803: } 9804: } //irpBnes 9805: 9806: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9807: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9808: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9809: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9810: //BEQ.W <label> |-|012346|-|--*--|-----| |0110_011_100_000_000-{offset} 9811: //BNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9812: //BNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9813: //BZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9814: //JBEQ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9815: //JBNNE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9816: //JBNNZ.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9817: //JBZE.W <label> |A|012346|-|--*--|-----| |0110_011_100_000_000-{offset} [BEQ.W <label>] 9818: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) 9819: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9820: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9821: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9822: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9823: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9824: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9825: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_100_sss_sss (s is not equal to 0) [BEQ.S <label>] 9826: //JBNE.L <label> |A|012346|-|--*--|-----| |0110_011_100_000_110-0100111011111001-{address} [BEQ.S (*)+8;JMP <label>] 9827: public static void irpBeqsw () throws M68kException { 9828: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //Bccでジャンプ 9829: XEiJ.mpuCycleCount += 10; 9830: int t = XEiJ.regPC; //pc0+2 9831: int s = (byte) XEiJ.regOC; //オフセット 9832: if (s == 0) { //Bcc.Wでジャンプ 9833: XEiJ.regPC = t + 2; 9834: s = XEiJ.busRwse (t); //pcws 9835: } else { //Bcc.Sでジャンプ 9836: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9837: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9838: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9839: //! 軽量化。リードを省略する 9840: } else { 9841: XEiJ.busRwse (t); //pcws 9842: } 9843: } 9844: irpSetPC (t + s); //pc0+2+オフセット 9845: } else if (XEiJ.regOC == 0x6700) { //Bcc.Wで通過 9846: XEiJ.mpuCycleCount += 12; 9847: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9848: //リードを省略する 9849: } else { 9850: XEiJ.busRws (XEiJ.regPC); 9851: } 9852: XEiJ.regPC += 2; 9853: } else { //Bcc.Sで通過 9854: XEiJ.mpuCycleCount += 8; 9855: } 9856: } //irpBeqsw 9857: 9858: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9859: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9860: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9861: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9862: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_101_sss_sss 9863: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9864: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9865: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9866: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9867: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9868: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9869: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_101_sss_sss [BEQ.S <label>] 9870: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9871: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9872: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9873: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9874: //BEQ.S <label> |-|012346|-|--*--|-----| |0110_011_110_sss_sss 9875: //BNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9876: //BNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9877: //BZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9878: //JBEQ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9879: //JBNNE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9880: //JBNNZ.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9881: //JBZE.S <label> |A|012346|-|--*--|-----| |0110_011_110_sss_sss [BEQ.S <label>] 9882: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9883: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9884: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9885: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9886: //BEQ.S <label> |-|01----|-|--*--|-----| |0110_011_111_sss_sss 9887: //BNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9888: //BNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9889: //BZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9890: //JBEQ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9891: //JBNNE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9892: //JBNNZ.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9893: //JBZE.S <label> |A|01----|-|--*--|-----| |0110_011_111_sss_sss [BEQ.S <label>] 9894: public static void irpBeqs () throws M68kException { 9895: if (XEiJ.MPU_CC_EQ << XEiJ.regCCR < 0) { //Bccでジャンプ 9896: XEiJ.mpuCycleCount += 10; 9897: int t = XEiJ.regPC; //pc0+2 9898: int s = (byte) XEiJ.regOC; //オフセット 9899: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9900: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9901: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9902: //! 軽量化。リードを省略する 9903: } else { 9904: XEiJ.busRwse (t); //pcws 9905: } 9906: irpSetPC (t + s); //pc0+2+オフセット 9907: } else { //Bcc.Sで通過 9908: XEiJ.mpuCycleCount += 8; 9909: } 9910: } //irpBeqs 9911: 9912: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9913: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9914: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9915: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9916: //BVC.W <label> |-|012346|-|---*-|-----| |0110_100_000_000_000-{offset} 9917: //BNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9918: //JBNVS.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9919: //JBVC.W <label> |A|012346|-|---*-|-----| |0110_100_000_000_000-{offset} [BVC.W <label>] 9920: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) 9921: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9922: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9923: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_000_sss_sss (s is not equal to 0) [BVC.S <label>] 9924: //JBNVC.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 9925: //JBVS.L <label> |A|012346|-|---*-|-----| |0110_100_000_000_110-0100111011111001-{address} [BVC.S (*)+8;JMP <label>] 9926: public static void irpBvcsw () throws M68kException { 9927: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //Bccでジャンプ 9928: XEiJ.mpuCycleCount += 10; 9929: int t = XEiJ.regPC; //pc0+2 9930: int s = (byte) XEiJ.regOC; //オフセット 9931: if (s == 0) { //Bcc.Wでジャンプ 9932: XEiJ.regPC = t + 2; 9933: s = XEiJ.busRwse (t); //pcws 9934: } else { //Bcc.Sでジャンプ 9935: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9936: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9937: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9938: //! 軽量化。リードを省略する 9939: } else { 9940: XEiJ.busRwse (t); //pcws 9941: } 9942: } 9943: irpSetPC (t + s); //pc0+2+オフセット 9944: } else if (XEiJ.regOC == 0x6800) { //Bcc.Wで通過 9945: XEiJ.mpuCycleCount += 12; 9946: if (XEiJ.MPU_OMIT_OFFSET_READ) { 9947: //リードを省略する 9948: } else { 9949: XEiJ.busRws (XEiJ.regPC); 9950: } 9951: XEiJ.regPC += 2; 9952: } else { //Bcc.Sで通過 9953: XEiJ.mpuCycleCount += 8; 9954: } 9955: } //irpBvcsw 9956: 9957: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9958: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9959: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9960: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9961: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_001_sss_sss 9962: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 9963: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 9964: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_001_sss_sss [BVC.S <label>] 9965: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9966: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9967: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9968: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9969: //BVC.S <label> |-|012346|-|---*-|-----| |0110_100_010_sss_sss 9970: //BNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 9971: //JBNVS.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 9972: //JBVC.S <label> |A|012346|-|---*-|-----| |0110_100_010_sss_sss [BVC.S <label>] 9973: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9974: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 9975: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 9976: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 9977: //BVC.S <label> |-|01----|-|---*-|-----| |0110_100_011_sss_sss 9978: //BNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 9979: //JBNVS.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 9980: //JBVC.S <label> |A|01----|-|---*-|-----| |0110_100_011_sss_sss [BVC.S <label>] 9981: public static void irpBvcs () throws M68kException { 9982: if (XEiJ.MPU_CC_VC << XEiJ.regCCR < 0) { //Bccでジャンプ 9983: XEiJ.mpuCycleCount += 10; 9984: int t = XEiJ.regPC; //pc0+2 9985: int s = (byte) XEiJ.regOC; //オフセット 9986: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 9987: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 9988: if (XEiJ.MPU_OMIT_EXTRA_READ) { 9989: //! 軽量化。リードを省略する 9990: } else { 9991: XEiJ.busRwse (t); //pcws 9992: } 9993: irpSetPC (t + s); //pc0+2+オフセット 9994: } else { //Bcc.Sで通過 9995: XEiJ.mpuCycleCount += 8; 9996: } 9997: } //irpBvcs 9998: 9999: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10000: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10001: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10002: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10003: //BVS.W <label> |-|012346|-|---*-|-----| |0110_100_100_000_000-{offset} 10004: //BNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 10005: //JBNVC.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 10006: //JBVS.W <label> |A|012346|-|---*-|-----| |0110_100_100_000_000-{offset} [BVS.W <label>] 10007: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) 10008: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 10009: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 10010: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_100_sss_sss (s is not equal to 0) [BVS.S <label>] 10011: //JBNVS.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 10012: //JBVC.L <label> |A|012346|-|---*-|-----| |0110_100_100_000_110-0100111011111001-{address} [BVS.S (*)+8;JMP <label>] 10013: public static void irpBvssw () throws M68kException { 10014: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //Bccでジャンプ 10015: XEiJ.mpuCycleCount += 10; 10016: int t = XEiJ.regPC; //pc0+2 10017: int s = (byte) XEiJ.regOC; //オフセット 10018: if (s == 0) { //Bcc.Wでジャンプ 10019: XEiJ.regPC = t + 2; 10020: s = XEiJ.busRwse (t); //pcws 10021: } else { //Bcc.Sでジャンプ 10022: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10023: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10024: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10025: //! 軽量化。リードを省略する 10026: } else { 10027: XEiJ.busRwse (t); //pcws 10028: } 10029: } 10030: irpSetPC (t + s); //pc0+2+オフセット 10031: } else if (XEiJ.regOC == 0x6900) { //Bcc.Wで通過 10032: XEiJ.mpuCycleCount += 12; 10033: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10034: //リードを省略する 10035: } else { 10036: XEiJ.busRws (XEiJ.regPC); 10037: } 10038: XEiJ.regPC += 2; 10039: } else { //Bcc.Sで通過 10040: XEiJ.mpuCycleCount += 8; 10041: } 10042: } //irpBvssw 10043: 10044: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10045: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10046: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10047: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10048: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_101_sss_sss 10049: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 10050: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 10051: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_101_sss_sss [BVS.S <label>] 10052: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10053: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10054: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10055: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10056: //BVS.S <label> |-|012346|-|---*-|-----| |0110_100_110_sss_sss 10057: //BNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 10058: //JBNVC.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 10059: //JBVS.S <label> |A|012346|-|---*-|-----| |0110_100_110_sss_sss [BVS.S <label>] 10060: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10061: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10062: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10063: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10064: //BVS.S <label> |-|01----|-|---*-|-----| |0110_100_111_sss_sss 10065: //BNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 10066: //JBNVC.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 10067: //JBVS.S <label> |A|01----|-|---*-|-----| |0110_100_111_sss_sss [BVS.S <label>] 10068: public static void irpBvss () throws M68kException { 10069: if (XEiJ.MPU_CC_VS << XEiJ.regCCR < 0) { //Bccでジャンプ 10070: XEiJ.mpuCycleCount += 10; 10071: int t = XEiJ.regPC; //pc0+2 10072: int s = (byte) XEiJ.regOC; //オフセット 10073: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10074: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10075: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10076: //! 軽量化。リードを省略する 10077: } else { 10078: XEiJ.busRwse (t); //pcws 10079: } 10080: irpSetPC (t + s); //pc0+2+オフセット 10081: } else { //Bcc.Sで通過 10082: XEiJ.mpuCycleCount += 8; 10083: } 10084: } //irpBvss 10085: 10086: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10087: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10088: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10089: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10090: //BPL.W <label> |-|012346|-|-*---|-----| |0110_101_000_000_000-{offset} 10091: //BNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 10092: //JBNMI.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 10093: //JBPL.W <label> |A|012346|-|-*---|-----| |0110_101_000_000_000-{offset} [BPL.W <label>] 10094: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) 10095: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 10096: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 10097: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_000_sss_sss (s is not equal to 0) [BPL.S <label>] 10098: //JBMI.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 10099: //JBNPL.L <label> |A|012346|-|-*---|-----| |0110_101_000_000_110-0100111011111001-{address} [BPL.S (*)+8;JMP <label>] 10100: public static void irpBplsw () throws M68kException { 10101: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //Bccでジャンプ 10102: XEiJ.mpuCycleCount += 10; 10103: int t = XEiJ.regPC; //pc0+2 10104: int s = (byte) XEiJ.regOC; //オフセット 10105: if (s == 0) { //Bcc.Wでジャンプ 10106: XEiJ.regPC = t + 2; 10107: s = XEiJ.busRwse (t); //pcws 10108: } else { //Bcc.Sでジャンプ 10109: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10110: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10111: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10112: //! 軽量化。リードを省略する 10113: } else { 10114: XEiJ.busRwse (t); //pcws 10115: } 10116: } 10117: irpSetPC (t + s); //pc0+2+オフセット 10118: } else if (XEiJ.regOC == 0x6a00) { //Bcc.Wで通過 10119: XEiJ.mpuCycleCount += 12; 10120: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10121: //リードを省略する 10122: } else { 10123: XEiJ.busRws (XEiJ.regPC); 10124: } 10125: XEiJ.regPC += 2; 10126: } else { //Bcc.Sで通過 10127: XEiJ.mpuCycleCount += 8; 10128: } 10129: } //irpBplsw 10130: 10131: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10132: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10133: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10134: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10135: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_001_sss_sss 10136: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 10137: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 10138: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_001_sss_sss [BPL.S <label>] 10139: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10140: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10141: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10142: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10143: //BPL.S <label> |-|012346|-|-*---|-----| |0110_101_010_sss_sss 10144: //BNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 10145: //JBNMI.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 10146: //JBPL.S <label> |A|012346|-|-*---|-----| |0110_101_010_sss_sss [BPL.S <label>] 10147: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10148: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10149: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10150: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10151: //BPL.S <label> |-|01----|-|-*---|-----| |0110_101_011_sss_sss 10152: //BNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 10153: //JBNMI.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 10154: //JBPL.S <label> |A|01----|-|-*---|-----| |0110_101_011_sss_sss [BPL.S <label>] 10155: public static void irpBpls () throws M68kException { 10156: if (XEiJ.MPU_CC_PL << XEiJ.regCCR < 0) { //Bccでジャンプ 10157: XEiJ.mpuCycleCount += 10; 10158: int t = XEiJ.regPC; //pc0+2 10159: int s = (byte) XEiJ.regOC; //オフセット 10160: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10161: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10162: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10163: //! 軽量化。リードを省略する 10164: } else { 10165: XEiJ.busRwse (t); //pcws 10166: } 10167: irpSetPC (t + s); //pc0+2+オフセット 10168: } else { //Bcc.Sで通過 10169: XEiJ.mpuCycleCount += 8; 10170: } 10171: } //irpBpls 10172: 10173: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10174: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10175: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10176: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10177: //BMI.W <label> |-|012346|-|-*---|-----| |0110_101_100_000_000-{offset} 10178: //BNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 10179: //JBMI.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 10180: //JBNPL.W <label> |A|012346|-|-*---|-----| |0110_101_100_000_000-{offset} [BMI.W <label>] 10181: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) 10182: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 10183: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 10184: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_100_sss_sss (s is not equal to 0) [BMI.S <label>] 10185: //JBNMI.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 10186: //JBPL.L <label> |A|012346|-|-*---|-----| |0110_101_100_000_110-0100111011111001-{address} [BMI.S (*)+8;JMP <label>] 10187: public static void irpBmisw () throws M68kException { 10188: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //Bccでジャンプ 10189: XEiJ.mpuCycleCount += 10; 10190: int t = XEiJ.regPC; //pc0+2 10191: int s = (byte) XEiJ.regOC; //オフセット 10192: if (s == 0) { //Bcc.Wでジャンプ 10193: XEiJ.regPC = t + 2; 10194: s = XEiJ.busRwse (t); //pcws 10195: } else { //Bcc.Sでジャンプ 10196: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10197: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10198: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10199: //! 軽量化。リードを省略する 10200: } else { 10201: XEiJ.busRwse (t); //pcws 10202: } 10203: } 10204: irpSetPC (t + s); //pc0+2+オフセット 10205: } else if (XEiJ.regOC == 0x6b00) { //Bcc.Wで通過 10206: XEiJ.mpuCycleCount += 12; 10207: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10208: //リードを省略する 10209: } else { 10210: XEiJ.busRws (XEiJ.regPC); 10211: } 10212: XEiJ.regPC += 2; 10213: } else { //Bcc.Sで通過 10214: XEiJ.mpuCycleCount += 8; 10215: } 10216: } //irpBmisw 10217: 10218: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10219: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10220: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10222: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_101_sss_sss 10223: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 10224: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 10225: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_101_sss_sss [BMI.S <label>] 10226: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10227: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10228: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10229: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10230: //BMI.S <label> |-|012346|-|-*---|-----| |0110_101_110_sss_sss 10231: //BNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 10232: //JBMI.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 10233: //JBNPL.S <label> |A|012346|-|-*---|-----| |0110_101_110_sss_sss [BMI.S <label>] 10234: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10235: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10236: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10237: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10238: //BMI.S <label> |-|01----|-|-*---|-----| |0110_101_111_sss_sss 10239: //BNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 10240: //JBMI.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 10241: //JBNPL.S <label> |A|01----|-|-*---|-----| |0110_101_111_sss_sss [BMI.S <label>] 10242: public static void irpBmis () throws M68kException { 10243: if (XEiJ.MPU_CC_MI << XEiJ.regCCR < 0) { //Bccでジャンプ 10244: XEiJ.mpuCycleCount += 10; 10245: int t = XEiJ.regPC; //pc0+2 10246: int s = (byte) XEiJ.regOC; //オフセット 10247: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10248: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10249: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10250: //! 軽量化。リードを省略する 10251: } else { 10252: XEiJ.busRwse (t); //pcws 10253: } 10254: irpSetPC (t + s); //pc0+2+オフセット 10255: } else { //Bcc.Sで通過 10256: XEiJ.mpuCycleCount += 8; 10257: } 10258: } //irpBmis 10259: 10260: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10261: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10262: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10263: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10264: //BGE.W <label> |-|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} 10265: //BNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 10266: //JBGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 10267: //JBNLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_000-{offset} [BGE.W <label>] 10268: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) 10269: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 10270: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 10271: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_000_sss_sss (s is not equal to 0) [BGE.S <label>] 10272: //JBLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 10273: //JBNGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_000_000_110-0100111011111001-{address} [BGE.S (*)+8;JMP <label>] 10274: public static void irpBgesw () throws M68kException { 10275: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //Bccでジャンプ 10276: XEiJ.mpuCycleCount += 10; 10277: int t = XEiJ.regPC; //pc0+2 10278: int s = (byte) XEiJ.regOC; //オフセット 10279: if (s == 0) { //Bcc.Wでジャンプ 10280: XEiJ.regPC = t + 2; 10281: s = XEiJ.busRwse (t); //pcws 10282: } else { //Bcc.Sでジャンプ 10283: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10284: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10285: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10286: //! 軽量化。リードを省略する 10287: } else { 10288: XEiJ.busRwse (t); //pcws 10289: } 10290: } 10291: irpSetPC (t + s); //pc0+2+オフセット 10292: } else if (XEiJ.regOC == 0x6c00) { //Bcc.Wで通過 10293: XEiJ.mpuCycleCount += 12; 10294: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10295: //リードを省略する 10296: } else { 10297: XEiJ.busRws (XEiJ.regPC); 10298: } 10299: XEiJ.regPC += 2; 10300: } else { //Bcc.Sで通過 10301: XEiJ.mpuCycleCount += 8; 10302: } 10303: } //irpBgesw 10304: 10305: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10306: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10307: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10308: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10309: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_001_sss_sss 10310: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 10311: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 10312: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_001_sss_sss [BGE.S <label>] 10313: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10314: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10315: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10316: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10317: //BGE.S <label> |-|012346|-|-*-*-|-----| |0110_110_010_sss_sss 10318: //BNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 10319: //JBGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 10320: //JBNLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_010_sss_sss [BGE.S <label>] 10321: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10322: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10323: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10325: //BGE.S <label> |-|01----|-|-*-*-|-----| |0110_110_011_sss_sss 10326: //BNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10327: //JBGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10328: //JBNLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_011_sss_sss [BGE.S <label>] 10329: public static void irpBges () throws M68kException { 10330: if (XEiJ.MPU_CC_GE << XEiJ.regCCR < 0) { //Bccでジャンプ 10331: XEiJ.mpuCycleCount += 10; 10332: int t = XEiJ.regPC; //pc0+2 10333: int s = (byte) XEiJ.regOC; //オフセット 10334: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10335: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10336: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10337: //! 軽量化。リードを省略する 10338: } else { 10339: XEiJ.busRwse (t); //pcws 10340: } 10341: irpSetPC (t + s); //pc0+2+オフセット 10342: } else { //Bcc.Sで通過 10343: XEiJ.mpuCycleCount += 8; 10344: } 10345: } //irpBges 10346: 10347: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10348: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10349: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10350: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10351: //BLT.W <label> |-|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} 10352: //BNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10353: //JBLT.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10354: //JBNGE.W <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_000-{offset} [BLT.W <label>] 10355: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) 10356: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10357: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10358: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_100_sss_sss (s is not equal to 0) [BLT.S <label>] 10359: //JBGE.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 10360: //JBNLT.L <label> |A|012346|-|-*-*-|-----| |0110_110_100_000_110-0100111011111001-{address} [BLT.S (*)+8;JMP <label>] 10361: public static void irpBltsw () throws M68kException { 10362: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //Bccでジャンプ 10363: XEiJ.mpuCycleCount += 10; 10364: int t = XEiJ.regPC; //pc0+2 10365: int s = (byte) XEiJ.regOC; //オフセット 10366: if (s == 0) { //Bcc.Wでジャンプ 10367: XEiJ.regPC = t + 2; 10368: s = XEiJ.busRwse (t); //pcws 10369: } else { //Bcc.Sでジャンプ 10370: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10371: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10372: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10373: //! 軽量化。リードを省略する 10374: } else { 10375: XEiJ.busRwse (t); //pcws 10376: } 10377: } 10378: irpSetPC (t + s); //pc0+2+オフセット 10379: } else if (XEiJ.regOC == 0x6d00) { //Bcc.Wで通過 10380: XEiJ.mpuCycleCount += 12; 10381: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10382: //リードを省略する 10383: } else { 10384: XEiJ.busRws (XEiJ.regPC); 10385: } 10386: XEiJ.regPC += 2; 10387: } else { //Bcc.Sで通過 10388: XEiJ.mpuCycleCount += 8; 10389: } 10390: } //irpBltsw 10391: 10392: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10393: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10394: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10395: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10396: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_101_sss_sss 10397: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10398: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10399: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_101_sss_sss [BLT.S <label>] 10400: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10401: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10402: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10403: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10404: //BLT.S <label> |-|012346|-|-*-*-|-----| |0110_110_110_sss_sss 10405: //BNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10406: //JBLT.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10407: //JBNGE.S <label> |A|012346|-|-*-*-|-----| |0110_110_110_sss_sss [BLT.S <label>] 10408: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10409: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10410: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10411: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10412: //BLT.S <label> |-|01----|-|-*-*-|-----| |0110_110_111_sss_sss 10413: //BNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10414: //JBLT.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10415: //JBNGE.S <label> |A|01----|-|-*-*-|-----| |0110_110_111_sss_sss [BLT.S <label>] 10416: public static void irpBlts () throws M68kException { 10417: if (XEiJ.MPU_CC_LT << XEiJ.regCCR < 0) { //Bccでジャンプ 10418: XEiJ.mpuCycleCount += 10; 10419: int t = XEiJ.regPC; //pc0+2 10420: int s = (byte) XEiJ.regOC; //オフセット 10421: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10422: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10423: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10424: //! 軽量化。リードを省略する 10425: } else { 10426: XEiJ.busRwse (t); //pcws 10427: } 10428: irpSetPC (t + s); //pc0+2+オフセット 10429: } else { //Bcc.Sで通過 10430: XEiJ.mpuCycleCount += 8; 10431: } 10432: } //irpBlts 10433: 10434: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10435: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10436: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10437: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10438: //BGT.W <label> |-|012346|-|-***-|-----| |0110_111_000_000_000-{offset} 10439: //BNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10440: //JBGT.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10441: //JBNLE.W <label> |A|012346|-|-***-|-----| |0110_111_000_000_000-{offset} [BGT.W <label>] 10442: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) 10443: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10444: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10445: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_000_sss_sss (s is not equal to 0) [BGT.S <label>] 10446: //JBLE.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 10447: //JBNGT.L <label> |A|012346|-|-***-|-----| |0110_111_000_000_110-0100111011111001-{address} [BGT.S (*)+8;JMP <label>] 10448: public static void irpBgtsw () throws M68kException { 10449: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //Bccでジャンプ 10450: XEiJ.mpuCycleCount += 10; 10451: int t = XEiJ.regPC; //pc0+2 10452: int s = (byte) XEiJ.regOC; //オフセット 10453: if (s == 0) { //Bcc.Wでジャンプ 10454: XEiJ.regPC = t + 2; 10455: s = XEiJ.busRwse (t); //pcws 10456: } else { //Bcc.Sでジャンプ 10457: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10458: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10459: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10460: //! 軽量化。リードを省略する 10461: } else { 10462: XEiJ.busRwse (t); //pcws 10463: } 10464: } 10465: irpSetPC (t + s); //pc0+2+オフセット 10466: } else if (XEiJ.regOC == 0x6e00) { //Bcc.Wで通過 10467: XEiJ.mpuCycleCount += 12; 10468: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10469: //リードを省略する 10470: } else { 10471: XEiJ.busRws (XEiJ.regPC); 10472: } 10473: XEiJ.regPC += 2; 10474: } else { //Bcc.Sで通過 10475: XEiJ.mpuCycleCount += 8; 10476: } 10477: } //irpBgtsw 10478: 10479: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10480: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10481: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10482: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10483: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_001_sss_sss 10484: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10485: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10486: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_001_sss_sss [BGT.S <label>] 10487: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10488: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10489: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10490: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10491: //BGT.S <label> |-|012346|-|-***-|-----| |0110_111_010_sss_sss 10492: //BNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10493: //JBGT.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10494: //JBNLE.S <label> |A|012346|-|-***-|-----| |0110_111_010_sss_sss [BGT.S <label>] 10495: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10496: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10497: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10498: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10499: //BGT.S <label> |-|01----|-|-***-|-----| |0110_111_011_sss_sss 10500: //BNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10501: //JBGT.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10502: //JBNLE.S <label> |A|01----|-|-***-|-----| |0110_111_011_sss_sss [BGT.S <label>] 10503: public static void irpBgts () throws M68kException { 10504: if (XEiJ.MPU_CC_GT << XEiJ.regCCR < 0) { //Bccでジャンプ 10505: XEiJ.mpuCycleCount += 10; 10506: int t = XEiJ.regPC; //pc0+2 10507: int s = (byte) XEiJ.regOC; //オフセット 10508: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10509: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10510: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10511: //! 軽量化。リードを省略する 10512: } else { 10513: XEiJ.busRwse (t); //pcws 10514: } 10515: irpSetPC (t + s); //pc0+2+オフセット 10516: } else { //Bcc.Sで通過 10517: XEiJ.mpuCycleCount += 8; 10518: } 10519: } //irpBgts 10520: 10521: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10522: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10523: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10524: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10525: //BLE.W <label> |-|012346|-|-***-|-----| |0110_111_100_000_000-{offset} 10526: //BNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10527: //JBLE.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10528: //JBNGT.W <label> |A|012346|-|-***-|-----| |0110_111_100_000_000-{offset} [BLE.W <label>] 10529: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) 10530: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10531: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10532: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_100_sss_sss (s is not equal to 0) [BLE.S <label>] 10533: //JBGT.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 10534: //JBNLE.L <label> |A|012346|-|-***-|-----| |0110_111_100_000_110-0100111011111001-{address} [BLE.S (*)+8;JMP <label>] 10535: public static void irpBlesw () throws M68kException { 10536: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //Bccでジャンプ 10537: XEiJ.mpuCycleCount += 10; 10538: int t = XEiJ.regPC; //pc0+2 10539: int s = (byte) XEiJ.regOC; //オフセット 10540: if (s == 0) { //Bcc.Wでジャンプ 10541: XEiJ.regPC = t + 2; 10542: s = XEiJ.busRwse (t); //pcws 10543: } else { //Bcc.Sでジャンプ 10544: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10545: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10546: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10547: //! 軽量化。リードを省略する 10548: } else { 10549: XEiJ.busRwse (t); //pcws 10550: } 10551: } 10552: irpSetPC (t + s); //pc0+2+オフセット 10553: } else if (XEiJ.regOC == 0x6f00) { //Bcc.Wで通過 10554: XEiJ.mpuCycleCount += 12; 10555: if (XEiJ.MPU_OMIT_OFFSET_READ) { 10556: //リードを省略する 10557: } else { 10558: XEiJ.busRws (XEiJ.regPC); 10559: } 10560: XEiJ.regPC += 2; 10561: } else { //Bcc.Sで通過 10562: XEiJ.mpuCycleCount += 8; 10563: } 10564: } //irpBlesw 10565: 10566: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10567: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10568: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10569: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10570: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_101_sss_sss 10571: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10572: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10573: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_101_sss_sss [BLE.S <label>] 10574: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10575: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10576: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10577: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10578: //BLE.S <label> |-|012346|-|-***-|-----| |0110_111_110_sss_sss 10579: //BNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10580: //JBLE.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10581: //JBNGT.S <label> |A|012346|-|-***-|-----| |0110_111_110_sss_sss [BLE.S <label>] 10582: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10583: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10584: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10585: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10586: //BLE.S <label> |-|01----|-|-***-|-----| |0110_111_111_sss_sss 10587: //BNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10588: //JBLE.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10589: //JBNGT.S <label> |A|01----|-|-***-|-----| |0110_111_111_sss_sss [BLE.S <label>] 10590: public static void irpBles () throws M68kException { 10591: if (XEiJ.MPU_CC_LE << XEiJ.regCCR < 0) { //Bccでジャンプ 10592: XEiJ.mpuCycleCount += 10; 10593: int t = XEiJ.regPC; //pc0+2 10594: int s = (byte) XEiJ.regOC; //オフセット 10595: //MC68000のBRA.S/BSR.S/Bcc.Sは分岐するとき分岐しない方の直後のワードをリードする 10596: // 2MB搭載機で$1FFFFEに無限ループ$60FE(BRA.S (*))を書いて飛び込むと$200000でバスエラーが出る 10597: if (XEiJ.MPU_OMIT_EXTRA_READ) { 10598: //! 軽量化。リードを省略する 10599: } else { 10600: XEiJ.busRwse (t); //pcws 10601: } 10602: irpSetPC (t + s); //pc0+2+オフセット 10603: } else { //Bcc.Sで通過 10604: XEiJ.mpuCycleCount += 8; 10605: } 10606: } //irpBles 10607: 10608: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10609: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10610: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10611: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10612: //IOCS <name> |A|012346|-|UUUUU|UUUUU| |0111_000_0dd_ddd_ddd-0100111001001111 [MOVEQ.L #<data>,D0;TRAP #15] 10613: //MOVEQ.L #<data>,Dq |-|012346|-|-UUUU|-**00| |0111_qqq_0dd_ddd_ddd 10614: public static void irpMoveq () throws M68kException { 10615: XEiJ.mpuCycleCount += 4; 10616: int z; 10617: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = (byte) XEiJ.regOC; 10618: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10619: } //irpMoveq 10620: 10621: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10622: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10623: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10624: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10625: //MVS.B <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_100_mmm_rrr (ISA_B) 10626: // 10627: //MVS.B <ea>,Dq 10628: // バイトデータをロングに符号拡張してDqの全体を更新する 10629: public static void irpMvsByte () throws M68kException { 10630: XEiJ.mpuCycleCount += 4; 10631: int ea = XEiJ.regOC & 63; 10632: int z; 10633: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 10634: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10635: } //irpMvsByte 10636: 10637: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10638: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10639: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10640: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10641: //MVS.W <ea>,Dq |-|------|-|-UUUU|-**00|D M+-WXZPI|0111_qqq_101_mmm_rrr (ISA_B) 10642: // 10643: //MVS.W <ea>,Dq 10644: // ワードデータをロングに符号拡張してDqの全体を更新する 10645: public static void irpMvsWord () throws M68kException { 10646: XEiJ.mpuCycleCount += 4; 10647: int ea = XEiJ.regOC & 63; 10648: int z; 10649: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 10650: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10651: } //irpMvsWord 10652: 10653: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10654: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10655: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10656: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10657: //MVZ.B <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_110_mmm_rrr (ISA_B) 10658: // 10659: //MVZ.B <ea>,Dq 10660: // バイトデータをロングにゼロ拡張してDqの全体を更新する 10661: public static void irpMvzByte () throws M68kException { 10662: XEiJ.mpuCycleCount += 4; 10663: int ea = XEiJ.regOC & 63; 10664: int z; 10665: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? 0xff & XEiJ.regRn[ea] : XEiJ.busRbz (efaAnyByte (ea)); 10666: XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0); 10667: } //irpMvzByte 10668: 10669: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10670: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10671: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10672: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10673: //MVZ.W <ea>,Dq |-|------|-|-UUUU|-0*00|D M+-WXZPI|0111_qqq_111_mmm_rrr (ISA_B) 10674: // 10675: //MVZ.W <ea>,Dq 10676: // ワードデータをロングにゼロ拡張してDqの全体を更新する 10677: public static void irpMvzWord () throws M68kException { 10678: XEiJ.mpuCycleCount += 4; 10679: int ea = XEiJ.regOC & 63; 10680: int z; 10681: XEiJ.regRn[XEiJ.regOC >> 9 & 7] = z = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); 10682: XEiJ.regCCR = XEiJ.REG_CCR_X & XEiJ.regCCR | (z == 0 ? XEiJ.REG_CCR_Z : 0); 10683: } //irpMvzWord 10684: 10685: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10686: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10687: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10688: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10689: //OR.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_000_mmm_rrr 10690: public static void irpOrToRegByte () throws M68kException { 10691: XEiJ.mpuCycleCount += 4; 10692: int ea = XEiJ.regOC & 63; 10693: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= 255 & (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))))]; //ccr_tst_byte。0拡張してからOR 10694: } //irpOrToRegByte 10695: 10696: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10697: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10698: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10699: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10700: //OR.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_001_mmm_rrr 10701: public static void irpOrToRegWord () throws M68kException { 10702: XEiJ.mpuCycleCount += 4; 10703: int ea = XEiJ.regOC & 63; 10704: int z = (short) (XEiJ.regRn[XEiJ.regOC >> 9 & 7] |= ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea))); //0拡張してからOR 10705: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10706: } //irpOrToRegWord 10707: 10708: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10709: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10710: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10711: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10712: //OR.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1000_qqq_010_mmm_rrr 10713: public static void irpOrToRegLong () throws M68kException { 10714: int ea = XEiJ.regOC & 63; 10715: int qqq = XEiJ.regOC >> 9 & 7; 10716: int z; 10717: if (ea < XEiJ.EA_AR) { //OR.L Dr,Dq 10718: XEiJ.mpuCycleCount += 8; 10719: XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.regRn[ea]; 10720: } else { //OR.L <mem>,Dq 10721: XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 10722: XEiJ.regRn[qqq] = z = XEiJ.regRn[qqq] | XEiJ.busRls (efaAnyLong (ea)); 10723: } 10724: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10725: } //irpOrToRegLong 10726: 10727: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10728: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10729: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10730: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10731: //DIVU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_011_mmm_rrr 10732: // 10733: //DIVU.W <ea>,Dq 10734: // M68000PRMでDIVU.Wのオーバーフローの条件が16bit符号あり整数と書かれているのは16bit符号なし整数の間違い 10735: public static void irpDivuWord () throws M68kException { 10736: // X 変化しない 10737: // N ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア 10738: // Z ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア 10739: // V ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア 10740: // C 常にクリア 10741: int ea = XEiJ.regOC & 63; 10742: int qqq = XEiJ.regOC >> 9 & 7; 10743: int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); //除数 10744: int x = XEiJ.regRn[qqq]; //被除数 10745: XEiJ.mpuCycleCount += irpDivuCyclesModified (x, y); 10746: if (y == 0) { //ゼロ除算 10747: //Dqは変化しない 10748: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10749: (x < 0 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が負のときセット、さもなくばクリア 10750: (x >> 16 == 0 ? XEiJ.REG_CCR_Z : 0) | //Zは被除数が$0000xxxxのときセット、さもなくばクリア 10751: XEiJ.REG_CCR_V //Vは常にセット 10752: ); //Cは常にクリア 10753: M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO; 10754: throw M68kException.m6eSignal; 10755: } 10756: //無理にintで符号なし除算をやろうとするよりもdoubleにキャストしてから割ったほうが速い 10757: // intの除算をdoubleの除算器で行うプロセッサならばなおさら 10758: //被除数を符号なし32ビットとみなすためlongを経由してdoubleに変換する 10759: //doubleからlongやintへのキャストは小数点以下が切り捨てられ、オーバーフローは表現できる絶対値最大の値になる 10760: //doubleから直接intに戻しているので0xffffffff/0x0001=0xffffffffが絶対値最大の0x7fffffffになってしまうが、 10761: //DIVU.Wではオーバーフローになることに変わりはないのでよいことにする 10762: // 符号なし32ビットの0xffffffffにしたいときは戻すときもlongを経由すればよい 10763: int z = (int) ((double) ((long) x & 0xffffffffL) / (double) y); //商 10764: if (z >>> 16 != 0) { //オーバーフローあり 10765: //Dqは変化しない 10766: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10767: (x < 0 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が負のときセット、さもなくばクリア 10768: //Zは常にクリア 10769: XEiJ.REG_CCR_V //Vは常にセット 10770: ); //Cは常にクリア 10771: } else { //オーバーフローなし 10772: XEiJ.regRn[qqq] = x - y * z << 16 | z; //余り<<16|商 10773: z = (short) z; 10774: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10775: (z < 0 ? XEiJ.REG_CCR_N : 0) | //Nは商が負のときセット、さもなくばクリア 10776: (z == 0 ? XEiJ.REG_CCR_Z : 0) //Zは商が0のときセット、さもなくばクリア 10777: //Vは常にクリア 10778: ); //Cは常にクリア 10779: } //if オーバーフローあり/オーバーフローなし 10780: } //irpDivuWord 10781: 10782: //DIVUの実行時間 10783: // 以下に実効アドレスの時間を加える 10784: // ゼロ除算のとき38 10785: // オーバーフローのとき10 10786: // 正常終了のとき76+ 10787: // 商のビット15~1について 10788: // 被除数のビット16が1で商が1のとき0 10789: // 被除数のビット16が0で商が1のとき2 10790: // 被除数のビット16が0で商が0のとき4 10791: // 補足 10792: // 商のビット0を計算に含めると最大140になりマニュアルと一致する 10793: // 参考 10794: // https://www.atari-forum.com/viewtopic.php?t=6484 10795: public static int irpDivuCyclesModified (int x, int y) { 10796: y &= 0xffff; //ゼロ拡張 10797: if (y == 0) { //ゼロ除算 10798: return 38; 10799: } 10800: int r = x >>> 16; //余り。符号なし右シフト 10801: if (y <= r) { //オーバーフロー 10802: return 10; 10803: } 10804: int c = 76; 10805: for (int i = 15; 0 < i; i--) { //ビット0を含まない 10806: r = r << 1 | ((x >> i) & 1); 10807: if (0x10000 <= r) { //被除数のビット16が1で商が1 10808: r -= y; 10809: } else if (y <= r) { //被除数のビット16が0で商が1 10810: r -= y; 10811: c += 2; 10812: } else { //被除数のビット16が0で商が0 10813: c += 4; 10814: } 10815: } 10816: return c; 10817: } 10818: 10819: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10820: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10821: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10822: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10823: //SBCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_000_rrr 10824: //SBCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1000_qqq_100_001_rrr 10825: //OR.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_100_mmm_rrr 10826: public static void irpOrToMemByte () throws M68kException { 10827: int ea = XEiJ.regOC & 63; 10828: if (ea >= XEiJ.EA_MM) { //OR.B Dq,<ea> 10829: XEiJ.mpuCycleCount += 8; 10830: int a = efaMltByte (ea); 10831: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRbs (a); 10832: XEiJ.busWb (a, z); 10833: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 10834: } else if (ea < XEiJ.EA_AR) { //SBCD.B Dr,Dq 10835: int qqq = XEiJ.regOC >> 9 & 7; 10836: XEiJ.mpuCycleCount += 6; 10837: int x; 10838: XEiJ.regRn[qqq] = ~0xff & (x = XEiJ.regRn[qqq]) | irpSbcd (x, XEiJ.regRn[ea]); 10839: } else { //SBCD.B -(Ar),-(Aq) 10840: XEiJ.mpuCycleCount += 18; 10841: int y = XEiJ.busRbz (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 10842: int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (64 - 8)]; 10843: XEiJ.busWb (a, irpSbcd (XEiJ.busRbz (a), y)); 10844: } 10845: } //irpOrToMemByte 10846: 10847: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10848: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10849: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10850: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10851: //OR.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_101_mmm_rrr 10852: public static void irpOrToMemWord () throws M68kException { 10853: XEiJ.mpuCycleCount += 8; 10854: int ea = XEiJ.regOC & 63; 10855: int a = efaMltWord (ea); 10856: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRws (a); 10857: XEiJ.busWw (a, z); 10858: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 10859: } //irpOrToMemWord 10860: 10861: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10862: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10863: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10864: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10865: //OR.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1000_qqq_110_mmm_rrr 10866: public static void irpOrToMemLong () throws M68kException { 10867: XEiJ.mpuCycleCount += 12; 10868: int ea = XEiJ.regOC & 63; 10869: int a = efaMltLong (ea); 10870: int z; 10871: XEiJ.busWl (a, z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] | XEiJ.busRls (a)); 10872: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 10873: } //irpOrToMemLong 10874: 10875: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10876: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10877: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10878: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10879: //DIVS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1000_qqq_111_mmm_rrr 10880: // 10881: //DIVS.W <ea>,Dq 10882: // DIVSの余りの符号は被除数と一致 10883: // M68000PRMでDIVS.Wのアドレッシングモードがデータ可変と書かれているのはデータの間違い 10884: public static void irpDivsWord () throws M68kException { 10885: // X 変化しない 10886: // N ゼロ除算またはオーバーフローのとき不定。商が負のときセット。それ以外はクリア 10887: // Z ゼロ除算またはオーバーフローのとき不定。商が0のときセット。それ以外はクリア 10888: // V ゼロ除算のとき不定。オーバーフローのときセット。それ以外はクリア 10889: // C 常にクリア 10890: //divsの余りの符号は被除数と一致 10891: //Javaの除算演算子の挙動 10892: // 10 / 3 == 3 10 % 3 == 1 10 = 3 * 3 + 1 10893: // 10 / -3 == -3 10 % -3 == 1 10 = -3 * -3 + 1 10894: // -10 / 3 == -3 -10 % 3 == -1 -10 = 3 * -3 + -1 10895: // -10 / -3 == 3 -10 % -3 == -1 -10 = -3 * 3 + -1 10896: int ea = XEiJ.regOC & 63; 10897: int qqq = XEiJ.regOC >> 9 & 7; 10898: int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //除数 10899: int x = XEiJ.regRn[qqq]; //被除数 10900: XEiJ.mpuCycleCount += irpDivsCycles (x, y); 10901: if (y == 0) { //ゼロ除算 10902: //Dqは変化しない 10903: //!!! MC68030はゼロ除算のときオペランド以外の要因でZとVが変化する。その要因がわからないとZとVを正確に再現することができない 10904: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10905: //Nは常にクリア 10906: XEiJ.REG_CCR_Z | //Zは常にセット 10907: (x == 0x00008000 ? ~XEiJ.regCCR & XEiJ.REG_CCR_V : (0 <= x && x != 0x7fffffff) || x == 0x80000000 ? XEiJ.REG_CCR_V : XEiJ.regCCR & XEiJ.REG_CCR_V) //Vは被除数が$00008000のとき反転、被除数が$7fffffffを除く正または$80000000のときセット、さもなくば変化しない 10908: ); //Cは常にクリア 10909: M68kException.m6eNumber = M68kException.M6E_DIVIDE_BY_ZERO; 10910: throw M68kException.m6eSignal; 10911: } 10912: int z = x / y; //商 10913: if ((short) z != z) { //オーバーフローあり 10914: //Dqは変化しない 10915: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10916: (x == 0x80000000 || (z & 0xffff0080) == 0x00000080 || (z & 0xffff0080) == 0xffff0080 ? XEiJ.REG_CCR_N : 0) | //Nは被除数が$80000000または商が$0000xxyyまたは$ffffxxyyでyyが負のときセット、さもなくばクリア 10917: (z == 0x00008000 || (((z & 0xffff00ff) == 0x00000000 || (z & 0xffff00ff) == 0xffff0000) && (z & 0x0000ff00) != 0) ? XEiJ.REG_CCR_Z : 0) | //Zは商が$00008000または商が$0000xxyyまたは$ffffxxyyでxxが0でなくてyyが0のときセット、さもなくばクリア 10918: XEiJ.REG_CCR_V //Vは常にセット 10919: ); //Cは常にクリア 10920: } else { //オーバーフローなし 10921: XEiJ.regRn[qqq] = x - y * z << 16 | (char) z; //Dqは余り<<16|商&$ffff 10922: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 10923: (z < 0 ? XEiJ.REG_CCR_N : 0) | //Nは商が負のときセット、さもなくばクリア 10924: (z == 0 ? XEiJ.REG_CCR_Z : 0) //Zは商が0のときセット、さもなくばクリア 10925: //Vは常にクリア 10926: ); //Cは常にクリア 10927: } //if オーバーフローあり/オーバーフローなし 10928: } //irpDivsWord 10929: 10930: //DIVSの実行時間 10931: // 以下に実効アドレスの時間を加える 10932: // ゼロ除算のとき38 10933: // 符号なしオーバーフローのとき 10934: // 被除数が正のとき16 10935: // 被除数が負のとき18 10936: // 正常終了または符号ありオーバーフローのとき 10937: // 被除数が正で除数が正のとき120+ 10938: // 被除数が正で除数が負のとき122+ 10939: // 被除数が負で除数が正のとき126+ 10940: // 被除数が負で除数が負のとき124+ 10941: // 符号なし商のビット15~1について 10942: // 符号なし商が1のとき0 10943: // 符号なし商が0のとき2 10944: // 補足 10945: // 符号なし商のビット0を計算に含めると最大158になりマニュアルと一致する 10946: // 参考 10947: // https://www.atari-forum.com/viewtopic.php?t=6484 10948: public static int irpDivsCycles (int x, int y) { 10949: y = (short) y; //符号拡張 10950: if (y == 0) { //ゼロ除算 10951: return 38; 10952: } 10953: //符号あり除算だと0x80000000/0xffffffffが0x00000000になる環境があるので 10954: //符号なし除算を用いる。JavaはInteger.divideUnsigned 10955: //符号なし商に0x80000000が含まれることに注意 10956: int q = Integer.divideUnsigned ((x < 0 ? -x : x), (y < 0 ? -y : y)); 10957: if ((q & 0xffff0000) != 0) { //符号なしオーバーフロー。0xffff<qは不可 10958: return x < 0 ? 18 : 16; 10959: } 10960: int t = ~q; 10961: t = (t & 0x5554) + ((t >> 1) & 0x5555); //0x5554に注意。ビット0を含まない 10962: t = (t & 0x3333) + ((t >> 2) & 0x3333); 10963: t = (t & 0x0F0F) + ((t >> 4) & 0x0F0F); 10964: t = (t & 0x00FF) + ((t >> 8) & 0x00FF); 10965: return (x < 0 ? y < 0 ? 124 : 126 : y < 0 ? 122 : 120) + (t << 1); 10966: } 10967: 10968: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10969: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10970: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10971: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10972: //SUB.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1001_qqq_000_mmm_rrr 10973: public static void irpSubToRegByte () throws M68kException { 10974: XEiJ.mpuCycleCount += 4; 10975: int ea = XEiJ.regOC & 63; 10976: int qqq = XEiJ.regOC >> 9 & 7; 10977: int x, y, z; 10978: y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 10979: x = XEiJ.regRn[qqq]; 10980: z = x - y; 10981: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 10982: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 10983: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 10984: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_byte 10985: } //irpSubToRegByte 10986: 10987: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10988: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 10989: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 10990: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 10991: //SUB.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_001_mmm_rrr 10992: public static void irpSubToRegWord () throws M68kException { 10993: XEiJ.mpuCycleCount += 4; 10994: int ea = XEiJ.regOC & 63; 10995: int qqq = XEiJ.regOC >> 9 & 7; 10996: int x, y, z; 10997: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 10998: x = XEiJ.regRn[qqq]; 10999: z = x - y; 11000: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11001: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11002: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 11003: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_word 11004: } //irpSubToRegWord 11005: 11006: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11007: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11008: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11009: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11010: //SUB.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1001_qqq_010_mmm_rrr 11011: public static void irpSubToRegLong () throws M68kException { 11012: int ea = XEiJ.regOC & 63; 11013: int qqq = XEiJ.regOC >> 9 & 7; 11014: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11015: int x, y, z; 11016: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11017: x = XEiJ.regRn[qqq]; 11018: z = x - y; 11019: XEiJ.regRn[qqq] = z; 11020: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11021: ((x ^ y) & (x ^ z)) >> 30 & XEiJ.REG_CCR_V | 11022: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 11023: } //irpSubToRegLong 11024: 11025: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11026: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11027: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11028: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11029: //SUBA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr 11030: //SUB.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_011_mmm_rrr [SUBA.W <ea>,Aq] 11031: //CLR.W Ar |A|012346|-|-----|-----| A |1001_rrr_011_001_rrr [SUBA.W Ar,Ar] 11032: // 11033: //SUBA.W <ea>,Aq 11034: // ソースを符号拡張してロングで減算する 11035: public static void irpSubaWord () throws M68kException { 11036: XEiJ.mpuCycleCount += 8; 11037: int ea = XEiJ.regOC & 63; 11038: int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11039: XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z; //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可 11040: //ccrは変化しない 11041: } //irpSubaWord 11042: 11043: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11044: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11045: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11046: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11047: //SUBX.B Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_100_000_rrr 11048: //SUBX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_100_001_rrr 11049: //SUB.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_100_mmm_rrr 11050: public static void irpSubToMemByte () throws M68kException { 11051: int ea = XEiJ.regOC & 63; 11052: int a, x, y, z; 11053: if (ea < XEiJ.EA_MM) { 11054: if (ea < XEiJ.EA_AR) { //SUBX.B Dr,Dq 11055: int qqq = XEiJ.regOC >> 9 & 7; 11056: XEiJ.mpuCycleCount += 4; 11057: y = XEiJ.regRn[ea]; 11058: x = XEiJ.regRn[qqq]; 11059: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11060: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11061: } else { //SUBX.B -(Ar),-(Aq) 11062: XEiJ.mpuCycleCount += 18; 11063: y = XEiJ.busRbs (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11064: a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15]; //1qqq=aqq 11065: x = XEiJ.busRbs (a); 11066: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11067: XEiJ.busWb (a, z); 11068: } 11069: XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //SUBXはZをクリアすることはあるがセットすることはない 11070: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 11071: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx_byte 11072: } else { //SUB.B Dq,<ea> 11073: XEiJ.mpuCycleCount += 8; 11074: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11075: a = efaMltByte (ea); 11076: x = XEiJ.busRbs (a); 11077: z = x - y; 11078: XEiJ.busWb (a, z); 11079: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11080: ((x ^ y) & (x ^ z)) >> 6 & XEiJ.REG_CCR_V | 11081: (byte) (x & (y ^ z) ^ (y | z)) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_byte 11082: } 11083: } //irpSubToMemByte 11084: 11085: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11086: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11087: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11088: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11089: //SUBX.W Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_101_000_rrr 11090: //SUBX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_101_001_rrr 11091: //SUB.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_101_mmm_rrr 11092: public static void irpSubToMemWord () throws M68kException { 11093: int ea = XEiJ.regOC & 63; 11094: int a, x, y, z; 11095: if (ea < XEiJ.EA_MM) { 11096: if (ea < XEiJ.EA_AR) { //SUBX.W Dr,Dq 11097: int qqq = XEiJ.regOC >> 9 & 7; 11098: XEiJ.mpuCycleCount += 4; 11099: y = XEiJ.regRn[ea]; 11100: x = XEiJ.regRn[qqq]; 11101: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11102: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11103: } else { //SUBX.W -(Ar),-(Aq) 11104: XEiJ.mpuCycleCount += 18; 11105: y = XEiJ.busRws (XEiJ.regRn[ea] -= 2); //このr[ea]はアドレスレジスタ 11106: a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2; 11107: x = XEiJ.busRws (a); 11108: z = x - y - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11109: XEiJ.busWw (a, z); 11110: } 11111: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11112: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 11113: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx_word 11114: } else { //SUB.W Dq,<ea> 11115: XEiJ.mpuCycleCount += 8; 11116: y = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11117: a = efaMltWord (ea); 11118: x = XEiJ.busRws (a); 11119: z = x - y; 11120: XEiJ.busWw (a, z); 11121: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11122: ((x ^ y) & (x ^ z)) >> 14 & XEiJ.REG_CCR_V | 11123: (short) (x & (y ^ z) ^ (y | z)) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub_word 11124: } 11125: } //irpSubToMemWord 11126: 11127: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11128: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11129: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11130: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11131: //SUBX.L Dr,Dq |-|012346|-|*UUUU|*****| |1001_qqq_110_000_rrr 11132: //SUBX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1001_qqq_110_001_rrr 11133: //SUB.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1001_qqq_110_mmm_rrr 11134: public static void irpSubToMemLong () throws M68kException { 11135: int ea = XEiJ.regOC & 63; 11136: if (ea < XEiJ.EA_MM) { 11137: int x; 11138: int y; 11139: int z; 11140: if (ea < XEiJ.EA_AR) { //SUBX.L Dr,Dq 11141: int qqq = XEiJ.regOC >> 9 & 7; 11142: XEiJ.mpuCycleCount += 8; 11143: XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) - (y = XEiJ.regRn[ea]) - (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11144: } else { //SUBX.L -(Ar),-(Aq) 11145: XEiJ.mpuCycleCount += 30; 11146: y = XEiJ.busRls (XEiJ.regRn[ea] -= 4); //このr[ea]はアドレスレジスタ 11147: int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4; 11148: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - y - (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 11149: } 11150: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 11151: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11152: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_subx 11153: } else { //SUB.L Dq,<ea> 11154: XEiJ.mpuCycleCount += 12; 11155: int a = efaMltLong (ea); 11156: int x; 11157: int y; 11158: int z; 11159: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) - (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7])); 11160: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11161: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11162: (x & (y ^ z) ^ (y | z)) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_sub 11163: } 11164: } //irpSubToMemLong 11165: 11166: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11167: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11168: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11169: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11170: //SUBA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr 11171: //SUB.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1001_qqq_111_mmm_rrr [SUBA.L <ea>,Aq] 11172: //CLR.L Ar |A|012346|-|-----|-----| A |1001_rrr_111_001_rrr [SUBA.L Ar,Ar] 11173: public static void irpSubaLong () throws M68kException { 11174: int ea = XEiJ.regOC & 63; 11175: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //Dr/Ar/#<data>のとき8+、それ以外は6+ 11176: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11177: XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= z; //r[op >> 9 & 15] -= ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可 11178: //ccrは変化しない 11179: } //irpSubaLong 11180: 11181: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11182: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11183: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11184: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11185: //SXCALL <name> |A|012346|-|UUUUU|*****| |1010_0dd_ddd_ddd_ddd [ALINE #<data>] 11186: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11187: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11188: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11189: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11190: //ALINE #<data> |-|012346|-|UUUUU|*****| |1010_ddd_ddd_ddd_ddd (line 1010 emulator) 11191: public static void irpAline () throws M68kException { 11192: XEiJ.mpuCycleCount += 34; 11193: if (XEiJ.MPU_INLINE_EXCEPTION) { 11194: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 11195: int sp = XEiJ.regRn[15]; 11196: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 11197: if (XEiJ.regSRS == 0) { //ユーザモードのとき 11198: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 11199: XEiJ.mpuUSP = sp; //USPを保存 11200: sp = XEiJ.mpuISP; //SSPを復元 11201: if (DataBreakPoint.DBP_ON) { 11202: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 11203: } else { 11204: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 11205: } 11206: if (InstructionBreakPoint.IBP_ON) { 11207: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 11208: } 11209: } 11210: int vectorOffset = M68kException.M6E_LINE_1010_EMULATOR << 2; //vector offset 11211: XEiJ.regRn[15] = sp -= 8; //short format 11212: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 11213: XEiJ.busWl (sp + 2, XEiJ.regPC0); //program counter 11214: XEiJ.busWw (sp, save_sr); //status register 11215: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 11216: } else { 11217: irpException (M68kException.M6E_LINE_1010_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは命令の先頭 11218: } 11219: } //irpAline 11220: 11221: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11222: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11223: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11224: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11225: //CMP.B <ea>,Dq |-|012346|-|-UUUU|-****|D M+-WXZPI|1011_qqq_000_mmm_rrr 11226: public static void irpCmpByte () throws M68kException { 11227: XEiJ.mpuCycleCount += 4; 11228: int ea = XEiJ.regOC & 63; 11229: int x; 11230: int y; 11231: int z = (byte) ((x = (byte) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_AR ? (byte) XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)))); 11232: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11233: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11234: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11235: } //irpCmpByte 11236: 11237: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11238: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11239: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11240: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11241: //CMP.W <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_001_mmm_rrr 11242: public static void irpCmpWord () throws M68kException { 11243: XEiJ.mpuCycleCount += 4; 11244: int ea = XEiJ.regOC & 63; 11245: int x; 11246: int y; 11247: int z = (short) ((x = (short) XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)))); //このr[ea]はデータレジスタまたはアドレスレジスタ 11248: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11249: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11250: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11251: } //irpCmpWord 11252: 11253: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11254: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11255: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11256: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11257: //CMP.L <ea>,Dq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_010_mmm_rrr 11258: public static void irpCmpLong () throws M68kException { 11259: XEiJ.mpuCycleCount += 6; 11260: int ea = XEiJ.regOC & 63; 11261: int x; 11262: int y; 11263: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 7]) - (y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea))); //このr[ea]はデータレジスタまたはアドレスレジスタ 11264: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11265: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11266: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11267: } //irpCmpLong 11268: 11269: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11270: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11271: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11272: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11273: //CMPA.W <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr 11274: //CMP.W <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_011_mmm_rrr [CMPA.W <ea>,Aq] 11275: // 11276: //CMPA.W <ea>,Aq 11277: // ソースを符号拡張してロングで比較する 11278: public static void irpCmpaWord () throws M68kException { 11279: XEiJ.mpuCycleCount += 6; 11280: int ea = XEiJ.regOC & 63; 11281: //ソースを符号拡張してからロングで比較する 11282: int y = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11283: int x; 11284: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y; 11285: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11286: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11287: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11288: } //irpCmpaWord 11289: 11290: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11291: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11292: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11293: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11294: //EOR.B Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_100_mmm_rrr 11295: //CMPM.B (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_100_001_rrr 11296: public static void irpEorByte () throws M68kException { 11297: int ea = XEiJ.regOC & 63; 11298: if (ea >> 3 == XEiJ.MMM_AR) { //CMPM.B (Ar)+,(Aq)+ 11299: XEiJ.mpuCycleCount += 12; 11300: int y = XEiJ.busRbs (XEiJ.regRn[ea]++); //このr[ea]はアドレスレジスタ 11301: int x; 11302: int z = (byte) ((x = XEiJ.busRbs (XEiJ.regRn[XEiJ.regOC >> 9 & 15]++)) - y); 11303: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11304: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11305: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11306: } else { 11307: int qqq = XEiJ.regOC >> 9 & 7; 11308: int z; 11309: if (ea < XEiJ.EA_AR) { //EOR.B Dq,Dr 11310: XEiJ.mpuCycleCount += 4; 11311: z = XEiJ.regRn[ea] ^= 255 & XEiJ.regRn[qqq]; //0拡張してからEOR 11312: } else { //EOR.B Dq,<mem> 11313: XEiJ.mpuCycleCount += 8; 11314: int a = efaMltByte (ea); 11315: XEiJ.busWb (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRbs (a)); 11316: } 11317: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 11318: } 11319: } //irpEorByte 11320: 11321: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11322: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11323: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11325: //EOR.W Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_101_mmm_rrr 11326: //CMPM.W (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_101_001_rrr 11327: public static void irpEorWord () throws M68kException { 11328: int ea = XEiJ.regOC & 63; 11329: int rrr = XEiJ.regOC & 7; 11330: int mmm = ea >> 3; 11331: if (mmm == XEiJ.MMM_AR) { //CMPM.W (Ar)+,(Aq)+ 11332: XEiJ.mpuCycleCount += 12; 11333: int y = XEiJ.busRws ((XEiJ.regRn[ea] += 2) - 2); //このr[ea]はアドレスレジスタ 11334: int x; 11335: int z = (short) ((x = XEiJ.busRws ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 2) - 2)) - y); 11336: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11337: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11338: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11339: } else { 11340: int qqq = XEiJ.regOC >> 9 & 7; 11341: int z; 11342: if (ea < XEiJ.EA_AR) { //EOR.W Dq,Dr 11343: XEiJ.mpuCycleCount += 4; 11344: z = XEiJ.regRn[rrr] ^= (char) XEiJ.regRn[qqq]; //0拡張してからEOR 11345: } else { //EOR.W Dq,<mem> 11346: XEiJ.mpuCycleCount += 8; 11347: int a = efaMltWord (ea); 11348: XEiJ.busWw (a, z = XEiJ.regRn[qqq] ^ XEiJ.busRws (a)); 11349: } 11350: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 11351: } 11352: } //irpEorWord 11353: 11354: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11355: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11356: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11357: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11358: //EOR.L Dq,<ea> |-|012346|-|-UUUU|-**00|D M+-WXZ |1011_qqq_110_mmm_rrr 11359: //CMPM.L (Ar)+,(Aq)+ |-|012346|-|-UUUU|-****| |1011_qqq_110_001_rrr 11360: public static void irpEorLong () throws M68kException { 11361: int ea = XEiJ.regOC & 63; 11362: if (ea >> 3 == XEiJ.MMM_AR) { //CMPM.L (Ar)+,(Aq)+ 11363: XEiJ.mpuCycleCount += 20; 11364: int y = XEiJ.busRls ((XEiJ.regRn[ea] += 4) - 4); //このr[ea]はアドレスレジスタ 11365: int x; 11366: int z = (x = XEiJ.busRls ((XEiJ.regRn[XEiJ.regOC >> 9 & 15] += 4) - 4)) - y; 11367: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11368: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11369: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11370: } else { 11371: int qqq = XEiJ.regOC >> 9 & 7; 11372: int z; 11373: if (ea < XEiJ.EA_AR) { //EOR.L Dq,Dr 11374: XEiJ.mpuCycleCount += 8; 11375: XEiJ.regRn[ea] = z = XEiJ.regRn[ea] ^ XEiJ.regRn[qqq]; 11376: } else { //EOR.L Dq,<mem> 11377: XEiJ.mpuCycleCount += 12; 11378: int a = efaMltLong (ea); 11379: XEiJ.busWl (a, z = XEiJ.busRls (a) ^ XEiJ.regRn[qqq]); 11380: } 11381: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11382: } 11383: } //irpEorLong 11384: 11385: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11386: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11387: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11388: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11389: //CMPA.L <ea>,Aq |-|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr 11390: //CMP.L <ea>,Aq |A|012346|-|-UUUU|-****|DAM+-WXZPI|1011_qqq_111_mmm_rrr [CMPA.L <ea>,Aq] 11391: public static void irpCmpaLong () throws M68kException { 11392: XEiJ.mpuCycleCount += 6; 11393: int ea = XEiJ.regOC & 63; 11394: int y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11395: int x; 11396: int z = (x = XEiJ.regRn[XEiJ.regOC >> 9 & 15]) - y; 11397: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | 11398: ((x ^ y) & (x ^ z)) >>> 31 << 1 | 11399: (x & (y ^ z) ^ (y | z)) >>> 31); //ccr_cmp 11400: } //irpCmpaLong 11401: 11402: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11403: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11404: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11405: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11406: //AND.B <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_000_mmm_rrr 11407: public static void irpAndToRegByte () throws M68kException { 11408: XEiJ.mpuCycleCount += 4; 11409: int ea = XEiJ.regOC & 63; 11410: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & (XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~255 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea))))]; //ccr_tst_byte。1拡張してからAND 11411: } //irpAndToRegByte 11412: 11413: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11414: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11415: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11416: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11417: //AND.W <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_001_mmm_rrr 11418: public static void irpAndToRegWord () throws M68kException { 11419: XEiJ.mpuCycleCount += 4; 11420: int ea = XEiJ.regOC & 63; 11421: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] &= ~65535 | (ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea))); //1拡張してからAND 11422: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 11423: } //irpAndToRegWord 11424: 11425: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11426: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11427: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11428: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11429: //AND.L <ea>,Dq |-|012346|-|-UUUU|-**00|D M+-WXZPI|1100_qqq_010_mmm_rrr 11430: public static void irpAndToRegLong () throws M68kException { 11431: int ea = XEiJ.regOC & 63; 11432: int qqq = XEiJ.regOC >> 9 & 7; 11433: int z; 11434: if (ea < XEiJ.EA_AR) { //AND.L Dr,Dq 11435: XEiJ.mpuCycleCount += 8; 11436: z = XEiJ.regRn[qqq] &= XEiJ.regRn[ea]; 11437: } else { //AND.L <mem>,Dq 11438: XEiJ.mpuCycleCount += ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11439: z = XEiJ.regRn[qqq] &= XEiJ.busRls (efaAnyLong (ea)); 11440: } 11441: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11442: } //irpAndToRegLong 11443: 11444: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11445: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11446: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11447: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11448: //MULU.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_011_mmm_rrr 11449: public static void irpMuluWord () throws M68kException { 11450: int ea = XEiJ.regOC & 63; 11451: int qqq = XEiJ.regOC >> 9 & 7; 11452: int y = ea < XEiJ.EA_AR ? (char) XEiJ.regRn[ea] : XEiJ.busRwz (efaAnyWord (ea)); 11453: //muluの所要サイクル数は38+2n 11454: //nはソースに含まれる1の数 11455: int s = y & 0x5555; 11456: s += y - s >> 1; 11457: int t = s & 0x3333; 11458: t += s - t >> 2; 11459: t += t >> 4; 11460: XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1); //38+2n 11461: //XEiJ.mpuCycleCount += 38 + (Integer.bitCount (y) << 1); //少し遅くなる 11462: int z; 11463: XEiJ.regRn[qqq] = z = (char) XEiJ.regRn[qqq] * y; //積の下位32ビット。オーバーフローは無視 11464: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11465: } //irpMuluWord 11466: 11467: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11468: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11469: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11470: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11471: //ABCD.B Dr,Dq |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_000_rrr 11472: //ABCD.B -(Ar),-(Aq) |-|012346|-|UUUUU|*U*U*| |1100_qqq_100_001_rrr 11473: //AND.B Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_100_mmm_rrr 11474: public static void irpAndToMemByte () throws M68kException { 11475: int ea = XEiJ.regOC & 63; 11476: if (ea >= XEiJ.EA_MM) { //AND.B Dq,<ea> 11477: XEiJ.mpuCycleCount += 8; 11478: int a = efaMltByte (ea); 11479: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRbs (a); 11480: XEiJ.busWb (a, z); 11481: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.MPU_TSTB_TABLE[255 & z]; //ccr_tst_byte 11482: } else if (ea < XEiJ.EA_AR) { //ABCD.B Dr,Dq 11483: int qqq = XEiJ.regOC >> 9 & 7; 11484: XEiJ.mpuCycleCount += 6; 11485: XEiJ.regRn[qqq] = ~0xff & XEiJ.regRn[qqq] | irpAbcd (XEiJ.regRn[qqq], XEiJ.regRn[ea]); 11486: } else { //ABCD.B -(Ar),-(Aq) 11487: XEiJ.mpuCycleCount += 18; 11488: int y = XEiJ.busRbz (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11489: int a = --XEiJ.regRn[(XEiJ.regOC >> 9) - (96 - 8)]; 11490: XEiJ.busWb (a, irpAbcd (XEiJ.busRbz (a), y)); 11491: } 11492: } //irpAndToMemByte 11493: 11494: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11495: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11496: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11497: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11498: //EXG.L Dq,Dr |-|012346|-|-----|-----| |1100_qqq_101_000_rrr 11499: //EXG.L Aq,Ar |-|012346|-|-----|-----| |1100_qqq_101_001_rrr 11500: //AND.W Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_101_mmm_rrr 11501: public static void irpAndToMemWord () throws M68kException { 11502: int ea = XEiJ.regOC & 63; 11503: if (ea < XEiJ.EA_MM) { //EXG 11504: XEiJ.mpuCycleCount += 6; 11505: if (ea < XEiJ.EA_AR) { //EXG.L Dq,Dr 11506: int qqq = XEiJ.regOC >> 9 & 7; 11507: int t = XEiJ.regRn[qqq]; 11508: XEiJ.regRn[qqq] = XEiJ.regRn[ea]; 11509: XEiJ.regRn[ea] = t; 11510: } else { //EXG.L Aq,Ar 11511: int aqq = (XEiJ.regOC >> 9) - (96 - 8); 11512: int t = XEiJ.regRn[aqq]; 11513: XEiJ.regRn[aqq] = XEiJ.regRn[ea]; //このr[ea]アドレスレジスタ 11514: XEiJ.regRn[ea] = t; //このr[ea]はアドレスレジスタ 11515: } 11516: } else { //AND.W Dq,<ea> 11517: XEiJ.mpuCycleCount += 8; 11518: int a = efaMltWord (ea); 11519: int z = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & XEiJ.busRws (a); 11520: XEiJ.busWw (a, z); 11521: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (char) z - 1 >> 31 & XEiJ.REG_CCR_Z | ((short) z < 0 ? XEiJ.REG_CCR_N : 0); //ccr_tst_word 11522: } 11523: } //irpAndToMemWord 11524: 11525: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11526: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11527: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11528: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11529: //EXG.L Dq,Ar |-|012346|-|-----|-----| |1100_qqq_110_001_rrr 11530: //AND.L Dq,<ea> |-|012346|-|-UUUU|-**00| M+-WXZ |1100_qqq_110_mmm_rrr 11531: public static void irpAndToMemLong () throws M68kException { 11532: int ea = XEiJ.regOC & 63; 11533: int qqq = XEiJ.regOC >> 9 & 7; 11534: if (ea >> 3 == XEiJ.MMM_AR) { //EXG.L Dq,Ar 11535: XEiJ.mpuCycleCount += 6; 11536: int t = XEiJ.regRn[qqq]; 11537: XEiJ.regRn[qqq] = XEiJ.regRn[ea]; //このr[ea]はアドレスレジスタ 11538: XEiJ.regRn[ea] = t; //このr[ea]はアドレスレジスタ 11539: } else { //AND.L Dq,<ea> 11540: XEiJ.mpuCycleCount += 12; 11541: int a = efaMltLong (ea); 11542: int z; 11543: XEiJ.busWl (a, z = XEiJ.busRls (a) & XEiJ.regRn[qqq]); 11544: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11545: } 11546: } //irpAndToMemLong 11547: 11548: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11549: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11550: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11551: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11552: //MULS.W <ea>,Dq |-|012346|-|-UUUU|-***0|D M+-WXZPI|1100_qqq_111_mmm_rrr 11553: public static void irpMulsWord () throws M68kException { 11554: int ea = XEiJ.regOC & 63; 11555: int qqq = XEiJ.regOC >> 9 & 7; 11556: int y = ea < XEiJ.EA_AR ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); 11557: int t = y << 1 ^ y; //右側が1である0と右側が0または末尾である1は1、それ以外は0。ソースは符号拡張されているので上位16ビットはすべて0 11558: //mulsの所要サイクル数は38+2n 11559: //nはソースの末尾に0を付け加えた17ビットに含まれる10または01の数 11560: int s = t & 0x5555; 11561: s += t - s >> 1; 11562: t = s & 0x3333; 11563: t += s - t >> 2; 11564: t += t >> 4; 11565: XEiJ.mpuCycleCount += 38 + (((t & 15) + (t >> 8 & 15)) << 1); //38+2n 11566: int z; 11567: XEiJ.regRn[qqq] = z = (short) XEiJ.regRn[qqq] * y; //積の下位32ビット。オーバーフローは無視 11568: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X); //ccr_tst 11569: } //irpMulsWord 11570: 11571: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11572: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11573: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11574: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11575: //ADD.B <ea>,Dq |-|012346|-|UUUUU|*****|D M+-WXZPI|1101_qqq_000_mmm_rrr 11576: public static void irpAddToRegByte () throws M68kException { 11577: XEiJ.mpuCycleCount += 4; 11578: int ea = XEiJ.regOC & 63; 11579: int qqq = XEiJ.regOC >> 9 & 7; 11580: int x, y, z; 11581: y = ea < XEiJ.EA_AR ? XEiJ.regRn[ea] : XEiJ.busRbs (efaAnyByte (ea)); 11582: x = XEiJ.regRn[qqq]; 11583: z = x + y; 11584: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11585: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11586: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11587: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_byte 11588: } //irpAddToRegByte 11589: 11590: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11591: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11592: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11593: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11594: //ADD.W <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_001_mmm_rrr 11595: public static void irpAddToRegWord () throws M68kException { 11596: XEiJ.mpuCycleCount += 4; 11597: int ea = XEiJ.regOC & 63; 11598: int qqq = XEiJ.regOC >> 9 & 7; 11599: int x, y, z; 11600: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11601: x = XEiJ.regRn[qqq]; 11602: z = x + y; 11603: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11604: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11605: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11606: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_word 11607: } //irpAddToRegWord 11608: 11609: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11610: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11611: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11612: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11613: //ADD.L <ea>,Dq |-|012346|-|UUUUU|*****|DAM+-WXZPI|1101_qqq_010_mmm_rrr 11614: public static void irpAddToRegLong () throws M68kException { 11615: int ea = XEiJ.regOC & 63; 11616: int qqq = XEiJ.regOC >> 9 & 7; 11617: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //ソースが#<data>のとき2増やす 11618: int x, y, z; 11619: y = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ 11620: x = XEiJ.regRn[qqq]; 11621: z = x + y; 11622: XEiJ.regRn[qqq] = z; 11623: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11624: ((x ^ z) & (y ^ z)) >> 30 & XEiJ.REG_CCR_V | 11625: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 11626: } //irpAddToRegLong 11627: 11628: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11629: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11630: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11631: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11632: //ADDA.W <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr 11633: //ADD.W <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_011_mmm_rrr [ADDA.W <ea>,Aq] 11634: // 11635: //ADDA.W <ea>,Aq 11636: // ソースを符号拡張してロングで加算する 11637: public static void irpAddaWord () throws M68kException { 11638: XEiJ.mpuCycleCount += 8; 11639: int ea = XEiJ.regOC & 63; 11640: int z = ea < XEiJ.EA_MM ? (short) XEiJ.regRn[ea] : XEiJ.busRws (efaAnyWord (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11641: XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z; //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? (short) r[ea] : rws (efaAnyWord (ea));は不可 11642: //ccrは変化しない 11643: } //irpAddaWord 11644: 11645: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11646: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11647: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11648: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11649: //ADDX.B Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_100_000_rrr 11650: //ADDX.B -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_100_001_rrr 11651: //ADD.B Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_100_mmm_rrr 11652: public static void irpAddToMemByte () throws M68kException { 11653: int ea = XEiJ.regOC & 63; 11654: int a, x, y, z; 11655: if (ea < XEiJ.EA_MM) { 11656: if (ea < XEiJ.EA_AR) { //ADDX.B Dr,Dq 11657: int qqq = XEiJ.regOC >> 9 & 7; 11658: XEiJ.mpuCycleCount += 4; 11659: y = XEiJ.regRn[ea]; 11660: x = XEiJ.regRn[qqq]; 11661: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11662: XEiJ.regRn[qqq] = ~255 & x | 255 & z; 11663: } else { //ADDX.B -(Ar),-(Aq) 11664: XEiJ.mpuCycleCount += 18; 11665: y = XEiJ.busRbs (--XEiJ.regRn[ea]); //このr[ea]はアドレスレジスタ 11666: a = --XEiJ.regRn[XEiJ.regOC >> 9 & 15]; //1qqq=aqq 11667: x = XEiJ.busRbs (a); 11668: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11669: XEiJ.busWb (a, z); 11670: } 11671: XEiJ.regCCR = (z >> 4 & XEiJ.REG_CCR_N | (255 & z) - 1 >> 6 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11672: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11673: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx_byte 11674: } else { //ADD.B Dq,<ea> 11675: XEiJ.mpuCycleCount += 8; 11676: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11677: a = efaMltByte (ea); 11678: x = XEiJ.busRbs (a); 11679: z = x + y; 11680: XEiJ.busWb (a, z); 11681: XEiJ.regCCR = (XEiJ.MPU_TSTB_TABLE[255 & z] | 11682: ((x ^ z) & (y ^ z)) >> 6 & XEiJ.REG_CCR_V | 11683: (byte) ((x | y) ^ (x ^ y) & z) >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_byte 11684: } 11685: } //irpAddToMemByte 11686: 11687: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11688: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11689: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11690: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11691: //ADDX.W Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_101_000_rrr 11692: //ADDX.W -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_101_001_rrr 11693: //ADD.W Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_101_mmm_rrr 11694: public static void irpAddToMemWord () throws M68kException { 11695: int ea = XEiJ.regOC & 63; 11696: int a, x, y, z; 11697: if (ea < XEiJ.EA_MM) { 11698: if (ea < XEiJ.EA_AR) { //ADDX.W Dr,Dq 11699: int qqq = XEiJ.regOC >> 9 & 7; 11700: XEiJ.mpuCycleCount += 4; 11701: y = XEiJ.regRn[ea]; 11702: x = XEiJ.regRn[qqq]; 11703: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11704: XEiJ.regRn[qqq] = ~65535 & x | (char) z; 11705: } else { //ADDX.W -(Ar),-(Aq) 11706: XEiJ.mpuCycleCount += 18; 11707: y = XEiJ.busRws (XEiJ.regRn[ea] -= 2); //このr[ea]はアドレスレジスタ 11708: a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 2; 11709: x = XEiJ.busRws (a); 11710: z = x + y + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11711: XEiJ.busWw (a, z); 11712: } 11713: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.regCCR & XEiJ.REG_CCR_Z | //ADDXはZをクリアすることはあるがセットすることはない 11714: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11715: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx_word 11716: } else { //ADD.W Dq,<ea> 11717: XEiJ.mpuCycleCount += 8; 11718: a = efaMltWord (ea); 11719: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7]; 11720: x = XEiJ.busRws (a); 11721: z = x + y; 11722: XEiJ.busWw (a, z); 11723: XEiJ.regCCR = (z >> 12 & XEiJ.REG_CCR_N | (char) z - 1 >> 14 & XEiJ.REG_CCR_Z | 11724: ((x ^ z) & (y ^ z)) >> 14 & XEiJ.REG_CCR_V | 11725: (short) ((x | y) ^ (x ^ y) & z) >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add_word 11726: } 11727: } //irpAddToMemWord 11728: 11729: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11730: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11731: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11732: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11733: //ADDX.L Dr,Dq |-|012346|-|*UUUU|*****| |1101_qqq_110_000_rrr 11734: //ADDX.L -(Ar),-(Aq) |-|012346|-|*UUUU|*****| |1101_qqq_110_001_rrr 11735: //ADD.L Dq,<ea> |-|012346|-|UUUUU|*****| M+-WXZ |1101_qqq_110_mmm_rrr 11736: public static void irpAddToMemLong () throws M68kException { 11737: int ea = XEiJ.regOC & 63; 11738: if (ea < XEiJ.EA_MM) { 11739: int x; 11740: int y; 11741: int z; 11742: if (ea < XEiJ.EA_AR) { //ADDX.L Dr,Dq 11743: int qqq = XEiJ.regOC >> 9 & 7; 11744: XEiJ.mpuCycleCount += 8; 11745: XEiJ.regRn[qqq] = z = (x = XEiJ.regRn[qqq]) + (y = XEiJ.regRn[ea]) + (XEiJ.regCCR >> 4); //Xの左側はすべて0なのでCCR_X&を省略 11746: } else { //ADDX.L -(Ar),-(Aq) 11747: XEiJ.mpuCycleCount += 30; 11748: y = XEiJ.busRls (XEiJ.regRn[ea] -= 4); //このr[ea]はアドレスレジスタ 11749: int a = XEiJ.regRn[XEiJ.regOC >> 9 & 15] -= 4; 11750: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + y + (XEiJ.regCCR >> 4)); //Xの左側はすべて0なのでCCR_X&を省略 11751: } 11752: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_Z : 0) | 11753: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 11754: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_addx 11755: } else { //ADD.L Dq,<ea> 11756: XEiJ.mpuCycleCount += 12; 11757: int a = efaMltLong (ea); 11758: int x; 11759: int y; 11760: int z; 11761: XEiJ.busWl (a, z = (x = XEiJ.busRls (a)) + (y = XEiJ.regRn[XEiJ.regOC >> 9 & 7])); 11762: XEiJ.regCCR = (z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | 11763: ((x ^ z) & (y ^ z)) >>> 31 << 1 | 11764: ((x | y) ^ (x ^ y) & z) >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //ccr_add 11765: } 11766: } //irpAddToMemLong 11767: 11768: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11769: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11770: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11771: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11772: //ADDA.L <ea>,Aq |-|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr 11773: //ADD.L <ea>,Aq |A|012346|-|-----|-----|DAM+-WXZPI|1101_qqq_111_mmm_rrr [ADDA.L <ea>,Aq] 11774: public static void irpAddaLong () throws M68kException { 11775: int ea = XEiJ.regOC & 63; 11776: XEiJ.mpuCycleCount += ea < XEiJ.EA_MM || ea == XEiJ.EA_IM ? 8 : 6; //Dr/Ar/#<data>のとき8+、それ以外は6+ 11777: int z = ea < XEiJ.EA_MM ? XEiJ.regRn[ea] : XEiJ.busRls (efaAnyLong (ea)); //このr[ea]はデータレジスタまたはアドレスレジスタ。ここでAqが変化する可能性があることに注意 11778: XEiJ.regRn[XEiJ.regOC >> 9 & 15] += z; //r[op >> 9 & 15] += ea < XEiJ.EA_MM ? r[ea] : rls (efaAnyLong (ea));は不可 11779: //ccrは変化しない 11780: } //irpAddaLong 11781: 11782: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11783: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11784: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11785: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11786: //ASR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_000_rrr 11787: //LSR.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_001_rrr 11788: //ROXR.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_010_rrr 11789: //ROR.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_011_rrr 11790: //ASR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_100_rrr 11791: //LSR.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_000_101_rrr 11792: //ROXR.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_000_110_rrr 11793: //ROR.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_000_111_rrr 11794: //ASR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_000_rrr [ASR.B #1,Dr] 11795: //LSR.B Dr |A|012346|-|UUUUU|***0*| |1110_001_000_001_rrr [LSR.B #1,Dr] 11796: //ROXR.B Dr |A|012346|-|*UUUU|***0*| |1110_001_000_010_rrr [ROXR.B #1,Dr] 11797: //ROR.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_000_011_rrr [ROR.B #1,Dr] 11798: // 11799: //ASR.B #<data>,Dr 11800: //ASR.B Dq,Dr 11801: // 算術右シフトバイト 11802: // ........................アイウエオカキク XNZVC 11803: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11804: // 1 ........................アアイウエオカキ クア*0ク Z=アイウエオカキ==0 11805: // 2 ........................アアアイウエオカ キア*0キ Z=アイウエオカ==0 11806: // 3 ........................アアアアイウエオ カア*0カ Z=アイウエオ==0 11807: // 4 ........................アアアアアイウエ オア*0オ Z=アイウエ==0 11808: // 5 ........................アアアアアアイウ エア*0エ Z=アイウ==0 11809: // 6 ........................アアアアアアアイ ウア*0ウ Z=アイ==0 11810: // 7 ........................アアアアアアアア イア*0イ Z=ア==0 11811: // 8 ........................アアアアアアアア アア*0ア Z=ア==0 11812: // CCR 11813: // X countが0のとき変化しない。他は最後に押し出されたビット 11814: // N 結果の最上位ビット 11815: // Z 結果が0のときセット。他はクリア 11816: // V 常にクリア 11817: // C countが0のときクリア。他は最後に押し出されたビット 11818: // 11819: //LSR.B #<data>,Dr 11820: //LSR.B Dq,Dr 11821: // 論理右シフトバイト 11822: // ........................アイウエオカキク XNZVC 11823: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11824: // 1 ........................0アイウエオカキ ク0*0ク Z=アイウエオカキ==0 11825: // 2 ........................00アイウエオカ キ0*0キ Z=アイウエオカ==0 11826: // 3 ........................000アイウエオ カ0*0カ Z=アイウエオ==0 11827: // 4 ........................0000アイウエ オ0*0オ Z=アイウエ==0 11828: // 5 ........................00000アイウ エ0*0エ Z=アイウ==0 11829: // 6 ........................000000アイ ウ0*0ウ Z=アイ==0 11830: // 7 ........................0000000ア イ0*0イ Z=ア==0 11831: // 8 ........................00000000 ア010ア 11832: // 9 ........................00000000 00100 11833: // CCR 11834: // X countが0のとき変化しない。他は最後に押し出されたビット 11835: // N 結果の最上位ビット 11836: // Z 結果が0のときセット。他はクリア 11837: // V 常にクリア 11838: // C countが0のときクリア。他は最後に押し出されたビット 11839: // 11840: //ROR.B #<data>,Dr 11841: //ROR.B Dq,Dr 11842: // 右ローテートバイト 11843: // ........................アイウエオカキク XNZVC 11844: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 11845: // 1 ........................クアイウエオカキ Xク*0ク Z=アイウエオカキク==0 11846: // : 11847: // 7 ........................イウエオカキクア Xイ*0イ Z=アイウエオカキク==0 11848: // 8 ........................アイウエオカキク Xア*0ア Z=アイウエオカキク==0 11849: // CCR 11850: // X 常に変化しない 11851: // N 結果の最上位ビット 11852: // Z 結果が0のときセット。他はクリア 11853: // V 常にクリア 11854: // C countが0のときクリア。他は結果の最上位ビット 11855: // 11856: //ROXR.B #<data>,Dr 11857: //ROXR.B Dq,Dr 11858: // 拡張右ローテートバイト 11859: // ........................アイウエオカキク XNZVC 11860: // 0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 11861: // 1 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0 11862: // 2 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0 11863: // 3 ........................キクXアイウエオ カキ*0カ Z=アイウエオキクX==0 11864: // 4 ........................カキクXアイウエ オカ*0オ Z=アイウエカキクX==0 11865: // 5 ........................オカキクXアイウ エオ*0エ Z=アイウオカキクX==0 11866: // 6 ........................エオカキクXアイ ウエ*0ウ Z=アイエオカキクX==0 11867: // 7 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0 11868: // 8 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0 11869: // 9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 11870: // CCR 11871: // X countが0のとき変化しない。他は最後に押し出されたビット 11872: // N 結果の最上位ビット 11873: // Z 結果が0のときセット。他はクリア 11874: // V 常にクリア 11875: // C countが0のときXのコピー。他は最後に押し出されたビット 11876: public static void irpXxrToRegByte () throws M68kException { 11877: int rrr; 11878: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 11879: int y; 11880: int z; 11881: int t; 11882: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 11883: case 0b000_000 >> 3: //ASR.B #<data>,Dr 11884: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11885: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> y) >> 1); 11886: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11887: break; 11888: case 0b001_000 >> 3: //LSR.B #<data>,Dr 11889: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11890: XEiJ.regRn[rrr] = ~0xff & x | (z = (t = (0xff & x) >>> y) >>> 1); 11891: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11892: break; 11893: case 0b010_000 >> 3: //ROXR.B #<data>,Dr 11894: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11895: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1; 11896: if (y == 1 - 1) { //y=data-1=1-1 11897: t = x; 11898: } else { //y=data-1=2-1~8-1 11899: z = x << 9 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1; 11900: } 11901: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 11902: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11903: break; 11904: case 0b011_000 >> 3: //ROR.B #<data>,Dr 11905: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 11906: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 7 - y | (0xff & x) >>> y + 1)); 11907: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 7 & 1; //Xは変化しない。Cは結果の最上位ビット 11908: break; 11909: case 0b100_000 >> 3: //ASR.B Dq,Dr 11910: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11911: XEiJ.mpuCycleCount += 6 + (y << 1); 11912: if (y == 0) { //y=data=0 11913: z = (byte) x; 11914: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 11915: } else { //y=data=1~63 11916: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (t = (byte) x >> (y <= 8 ? y - 1 : 7)) >> 1); 11917: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11918: } 11919: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11920: break; 11921: case 0b101_000 >> 3: //LSR.B Dq,Dr 11922: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11923: XEiJ.mpuCycleCount += 6 + (y << 1); 11924: if (y == 0) { //y=data=0 11925: z = (byte) x; 11926: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 11927: } else { //y=data=1~63 11928: XEiJ.regRn[rrr] = ~0xff & x | (z = (t = y <= 8 ? (0xff & x) >>> y - 1 : 0) >>> 1); 11929: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11930: } 11931: break; 11932: case 0b110_000 >> 3: //ROXR.B Dq,Dr 11933: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11934: XEiJ.mpuCycleCount += 6 + (y << 1); 11935: //y %= 9; 11936: y = (y & 7) - (y >> 3); //y=data=-7~7 11937: y += y >> 3 & 9; //y=data=0~8 11938: if (y == 0) { //y=data=0 11939: z = (byte) x; 11940: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 11941: } else { //y=data=1~8 11942: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 7 - 4 | (0xff & x) >>> 1; 11943: if (y == 1) { //y=data=1 11944: t = x; //Cは最後に押し出されたビット 11945: } else { //y=data=2~8 11946: z = x << 9 - y | (t = z >>> y - 2) >>> 1; 11947: } 11948: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 11949: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 11950: } 11951: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 11952: break; 11953: case 0b111_000 >> 3: //ROR.B Dq,Dr 11954: default: 11955: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 11956: XEiJ.mpuCycleCount += 6 + (y << 1); 11957: if (y == 0) { 11958: z = (byte) x; 11959: t = 0; //Cはクリア 11960: } else { 11961: y &= 7; //y=data=0~7 11962: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << 8 - y | (0xff & x) >>> y)); 11963: t = z >>> 7 & 1; //Cは結果の最上位ビット 11964: } 11965: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 11966: } 11967: } //irpXxrToRegByte 11968: 11969: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11970: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 11971: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 11972: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 11973: //ASR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_000_rrr 11974: //LSR.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_001_rrr 11975: //ROXR.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_010_rrr 11976: //ROR.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_011_rrr 11977: //ASR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_100_rrr 11978: //LSR.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_001_101_rrr 11979: //ROXR.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_001_110_rrr 11980: //ROR.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_001_111_rrr 11981: //ASR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_000_rrr [ASR.W #1,Dr] 11982: //LSR.W Dr |A|012346|-|UUUUU|***0*| |1110_001_001_001_rrr [LSR.W #1,Dr] 11983: //ROXR.W Dr |A|012346|-|*UUUU|***0*| |1110_001_001_010_rrr [ROXR.W #1,Dr] 11984: //ROR.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_001_011_rrr [ROR.W #1,Dr] 11985: // 11986: //ASR.W #<data>,Dr 11987: //ASR.W Dq,Dr 11988: //ASR.W <ea> 11989: // 算術右シフトワード 11990: // ................アイウエオカキクケコサシスセソタ XNZVC 11991: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 11992: // 1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0 11993: // : 11994: // 15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0 11995: // 16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0 11996: // CCR 11997: // X countが0のとき変化しない。他は最後に押し出されたビット 11998: // N 結果の最上位ビット 11999: // Z 結果が0のときセット。他はクリア 12000: // V 常にクリア 12001: // C countが0のときクリア。他は最後に押し出されたビット 12002: // 12003: //LSR.W #<data>,Dr 12004: //LSR.W Dq,Dr 12005: //LSR.W <ea> 12006: // 論理右シフトワード 12007: // ................アイウエオカキクケコサシスセソタ XNZVC 12008: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12009: // 1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0 12010: // : 12011: // 15 ................000000000000000ア イ0*0イ Z=ア==0 12012: // 16 ................0000000000000000 ア010ア 12013: // 17 ................0000000000000000 00100 12014: // CCR 12015: // X countが0のとき変化しない。他は最後に押し出されたビット 12016: // N 結果の最上位ビット 12017: // Z 結果が0のときセット。他はクリア 12018: // V 常にクリア 12019: // C countが0のときクリア。他は最後に押し出されたビット 12020: // 12021: //ROR.W #<data>,Dr 12022: //ROR.W Dq,Dr 12023: //ROR.W <ea> 12024: // 右ローテートワード 12025: // ................アイウエオカキクケコサシスセソタ XNZVC 12026: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12027: // 1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0 12028: // : 12029: // 15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0 12030: // 16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0 12031: // CCR 12032: // X 常に変化しない 12033: // N 結果の最上位ビット 12034: // Z 結果が0のときセット。他はクリア 12035: // V 常にクリア 12036: // C countが0のときクリア。他は結果の最上位ビット 12037: // 12038: //ROXR.W #<data>,Dr 12039: //ROXR.W Dq,Dr 12040: //ROXR.W <ea> 12041: // 拡張右ローテートワード 12042: // ................アイウエオカキクケコサシスセソタ XNZVC 12043: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12044: // 1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 12045: // 2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 12046: // : 12047: // 15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 12048: // 16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 12049: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12050: // CCR 12051: // X countが0のとき変化しない。他は最後に押し出されたビット 12052: // N 結果の最上位ビット 12053: // Z 結果が0のときセット。他はクリア 12054: // V 常にクリア 12055: // C countが0のときXのコピー。他は最後に押し出されたビット 12056: public static void irpXxrToRegWord () throws M68kException { 12057: int rrr; 12058: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12059: int y; 12060: int z; 12061: int t; 12062: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12063: case 0b000_000 >> 3: //ASR.W #<data>,Dr 12064: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12065: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> y) >> 1); 12066: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12067: break; 12068: case 0b001_000 >> 3: //LSR.W #<data>,Dr 12069: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12070: XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = (char) x >>> y) >>> 1); 12071: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12072: break; 12073: case 0b010_000 >> 3: //ROXR.W #<data>,Dr 12074: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12075: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1; 12076: if (y == 1 - 1) { //y=data-1=1-1 12077: t = x; 12078: } else { //y=data-1=2-1~8-1 12079: z = x << 17 - 1 - y | (t = z >>> y - (2 - 1)) >>> 1; 12080: } 12081: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12082: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12083: break; 12084: case 0b011_000 >> 3: //ROR.W #<data>,Dr 12085: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12086: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - 1 - y | (char) x >>> y + 1)); 12087: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 15 & 1; //Xは変化しない。Cは結果の最上位ビット 12088: break; 12089: case 0b100_000 >> 3: //ASR.W Dq,Dr 12090: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12091: XEiJ.mpuCycleCount += 6 + (y << 1); 12092: if (y == 0) { //y=data=0 12093: z = (short) x; 12094: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12095: } else { //y=data=1~63 12096: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (t = (short) x >> (y <= 16 ? y - 1 : 15)) >> 1); 12097: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12098: } 12099: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12100: break; 12101: case 0b101_000 >> 3: //LSR.W Dq,Dr 12102: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12103: XEiJ.mpuCycleCount += 6 + (y << 1); 12104: if (y == 0) { //y=data=0 12105: z = (short) x; 12106: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 12107: } else { //y=data=1~63 12108: XEiJ.regRn[rrr] = ~0xffff & x | (z = (t = y <= 16 ? (char) x >>> y - 1 : 0) >>> 1); 12109: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12110: } 12111: break; 12112: case 0b110_000 >> 3: //ROXR.W Dq,Dr 12113: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12114: XEiJ.mpuCycleCount += 6 + (y << 1); 12115: //y %= 17; 12116: y = (y & 15) - (y >> 4); //y=data=-3~15 12117: y += y >> 4 & 17; //y=data=0~16 12118: if (y == 0) { //y=data=0 12119: z = (short) x; 12120: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12121: } else { //y=data=1~16 12122: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | (char) x >>> 1; 12123: if (y == 1) { //y=data=1 12124: t = x; //Cは最後に押し出されたビット 12125: } else { //y=data=2~16 12126: z = x << 17 - y | (t = z >>> y - 2) >>> 1; 12127: } 12128: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12129: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12130: } 12131: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12132: break; 12133: case 0b111_000 >> 3: //ROR.W Dq,Dr 12134: default: 12135: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12136: XEiJ.mpuCycleCount += 6 + (y << 1); 12137: if (y == 0) { 12138: z = (short) x; 12139: t = 0; //Cはクリア 12140: } else { 12141: y &= 15; //y=data=0~15 12142: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << 16 - y | (char) x >>> y)); 12143: t = z >>> 15 & 1; //Cは結果の最上位ビット 12144: } 12145: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12146: } 12147: } //irpXxrToRegWord 12148: 12149: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12150: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12151: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12152: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12153: //ASR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_000_rrr 12154: //LSR.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_001_rrr 12155: //ROXR.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_010_rrr 12156: //ROR.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_011_rrr 12157: //ASR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_100_rrr 12158: //LSR.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_010_101_rrr 12159: //ROXR.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_010_110_rrr 12160: //ROR.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_010_111_rrr 12161: //ASR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_000_rrr [ASR.L #1,Dr] 12162: //LSR.L Dr |A|012346|-|UUUUU|***0*| |1110_001_010_001_rrr [LSR.L #1,Dr] 12163: //ROXR.L Dr |A|012346|-|*UUUU|***0*| |1110_001_010_010_rrr [ROXR.L #1,Dr] 12164: //ROR.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_010_011_rrr [ROR.L #1,Dr] 12165: // 12166: //ASR.L #<data>,Dr 12167: //ASR.L Dq,Dr 12168: // 算術右シフトロング 12169: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12170: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12171: // 1 アアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0 12172: // : 12173: // 31 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア イア*0イ Z=ア==0 12174: // 32 アアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアア アア*0ア Z=ア==0 12175: // CCR 12176: // X countが0のとき変化しない。他は最後に押し出されたビット 12177: // N 結果の最上位ビット 12178: // Z 結果が0のときセット。他はクリア 12179: // V 常にクリア 12180: // C countが0のときクリア。他は最後に押し出されたビット 12181: // 12182: //LSR.L #<data>,Dr 12183: //LSR.L Dq,Dr 12184: // 論理右シフトロング 12185: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12186: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12187: // 1 0アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミ0*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ==0 12188: // : 12189: // 31 0000000000000000000000000000000ア イ0*0イ Z=ア==0 12190: // 32 00000000000000000000000000000000 ア010ア 12191: // 33 00000000000000000000000000000000 00100 12192: // CCR 12193: // X countが0のとき変化しない。他は最後に押し出されたビット 12194: // N 結果の最上位ビット 12195: // Z 結果が0のときセット。他はクリア 12196: // V 常にクリア 12197: // C countが0のときクリア。他は最後に押し出されたビット 12198: // 12199: //ROR.L #<data>,Dr 12200: //ROR.L Dq,Dr 12201: // 右ローテートロング 12202: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12203: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12204: // 1 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12205: // : 12206: // 31 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0イ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12207: // 32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12208: // CCR 12209: // X 常に変化しない 12210: // N 結果の最上位ビット 12211: // Z 結果が0のときセット。他はクリア 12212: // V 常にクリア 12213: // C countが0のときクリア。他は結果の最上位ビット 12214: // 12215: //ROXR.L #<data>,Dr 12216: //ROXR.L Dq,Dr 12217: // 拡張右ローテートロング 12218: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12219: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12220: // 1 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0 12221: // 2 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0 12222: // : 12223: // 31 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12224: // 32 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12225: // 33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12226: // CCR 12227: // X countが0のとき変化しない。他は最後に押し出されたビット 12228: // N 結果の最上位ビット 12229: // Z 結果が0のときセット。他はクリア 12230: // V 常にクリア 12231: // C countが0のときXのコピー。他は最後に押し出されたビット 12232: public static void irpXxrToRegLong () throws M68kException { 12233: int rrr; 12234: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12235: int y; 12236: int z; 12237: int t; 12238: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12239: case 0b000_000 >> 3: //ASR.L #<data>,Dr 12240: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12241: XEiJ.regRn[rrr] = z = (t = x >> y) >> 1; 12242: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12243: break; 12244: case 0b001_000 >> 3: //LSR.L #<data>,Dr 12245: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12246: XEiJ.regRn[rrr] = z = (t = x >>> y) >>> 1; 12247: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12248: break; 12249: case 0b010_000 >> 3: //ROXR.L #<data>,Dr 12250: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12251: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1; 12252: if (y == 1 - 1) { //y=data-1=1-1 12253: t = x; 12254: } else { //y=data-1=2-1~8-1 12255: z = x << -y | (t = z >>> y - (2 - 1)) >>> 1; //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略 12256: } 12257: XEiJ.regRn[rrr] = z; 12258: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12259: break; 12260: case 0b011_000 >> 3: //ROR.L #<data>,Dr 12261: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12262: XEiJ.regRn[rrr] = z = x << ~y | x >>> y + 1; //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略 12263: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z >>> 31; //Xは変化しない。Cは結果の最上位ビット 12264: break; 12265: case 0b100_000 >> 3: //ASR.L Dq,Dr 12266: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12267: XEiJ.mpuCycleCount += 8 + (y << 1); 12268: if (y == 0) { //y=data=0 12269: z = x; 12270: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12271: } else { //y=data=1~63 12272: XEiJ.regRn[rrr] = z = (t = x >> (y <= 32 ? y - 1 : 31)) >> 1; 12273: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12274: } 12275: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12276: break; 12277: case 0b101_000 >> 3: //LSR.L Dq,Dr 12278: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12279: XEiJ.mpuCycleCount += 8 + (y << 1); 12280: if (y == 0) { //y=data=0 12281: z = x; 12282: XEiJ.regCCR = XEiJ.regCCR & XEiJ.REG_CCR_X | (z < 0 ? XEiJ.REG_CCR_N : z == 0 ? XEiJ.REG_CCR_Z : 0); //Xは変化しない。Cはクリア 12283: } else { //y=data=1~63 12284: XEiJ.regRn[rrr] = z = (t = y <= 32 ? x >>> y - 1 : 0) >>> 1; 12285: XEiJ.regCCR = (z == 0 ? XEiJ.REG_CCR_Z : 0) | -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12286: } 12287: break; 12288: case 0b110_000 >> 3: //ROXR.L Dq,Dr 12289: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12290: XEiJ.mpuCycleCount += 8 + (y << 1); 12291: //y %= 33; 12292: y -= 32 - y >> 6 & 33; //y=data=0~32 12293: if (y == 0) { //y=data=0 12294: z = x; 12295: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12296: } else { //y=data=1~32 12297: z = (XEiJ.regCCR & XEiJ.REG_CCR_X) << 31 - 4 | x >>> 1; 12298: if (y == 1) { //y=data=1 12299: t = x; //Cは最後に押し出されたビット 12300: } else { //y=data=2~32 12301: z = x << 33 - y | (t = z >>> y - 2) >>> 1; 12302: } 12303: XEiJ.regRn[rrr] = z; 12304: t = -(t & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12305: } 12306: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12307: break; 12308: case 0b111_000 >> 3: //ROR.L Dq,Dr 12309: default: 12310: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12311: XEiJ.mpuCycleCount += 8 + (y << 1); 12312: if (y == 0) { 12313: z = x; 12314: t = 0; //Cはクリア 12315: } else { 12316: y &= 31; //y=data=0~31 12317: XEiJ.regRn[rrr] = z = x << -y | x >>> y; //Javaのシフト演算子は5ビットでマスクされるので32-yを-yに省略。y=32のときx|xになるが問題ない 12318: t = z >>> 31; //Cは結果の最上位ビット 12319: } 12320: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12321: } 12322: } //irpXxrToRegLong 12323: 12324: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12325: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12326: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12327: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12328: //ASR.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_000_011_mmm_rrr 12329: // 12330: //ASR.W #<data>,Dr 12331: //ASR.W Dq,Dr 12332: //ASR.W <ea> 12333: // 算術右シフトワード 12334: // ................アイウエオカキクケコサシスセソタ XNZVC 12335: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12336: // 1 ................アアイウエオカキクケコサシスセソ タア*0タ Z=アイウエオカキクケコサシスセソ==0 12337: // : 12338: // 15 ................アアアアアアアアアアアアアアアア イア*0イ Z=ア==0 12339: // 16 ................アアアアアアアアアアアアアアアア アア*0ア Z=ア==0 12340: // CCR 12341: // X countが0のとき変化しない。他は最後に押し出されたビット 12342: // N 結果の最上位ビット 12343: // Z 結果が0のときセット。他はクリア 12344: // V 常にクリア 12345: // C countが0のときクリア。他は最後に押し出されたビット 12346: public static void irpAsrToMem () throws M68kException { 12347: XEiJ.mpuCycleCount += 8; 12348: int ea = XEiJ.regOC & 63; 12349: int a = efaMltWord (ea); 12350: int x = XEiJ.busRws (a); 12351: int z = x >> 1; 12352: XEiJ.busWw (a, z); 12353: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12354: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12355: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12356: } //irpAsrToMem 12357: 12358: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12359: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12360: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12361: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12362: //ASL.B #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_000_rrr 12363: //LSL.B #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_001_rrr 12364: //ROXL.B #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_010_rrr 12365: //ROL.B #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_011_rrr 12366: //ASL.B Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_100_100_rrr 12367: //LSL.B Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_100_101_rrr 12368: //ROXL.B Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_100_110_rrr 12369: //ROL.B Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_100_111_rrr 12370: //ASL.B Dr |A|012346|-|UUUUU|*****| |1110_001_100_000_rrr [ASL.B #1,Dr] 12371: //LSL.B Dr |A|012346|-|UUUUU|***0*| |1110_001_100_001_rrr [LSL.B #1,Dr] 12372: //ROXL.B Dr |A|012346|-|*UUUU|***0*| |1110_001_100_010_rrr [ROXL.B #1,Dr] 12373: //ROL.B Dr |A|012346|-|-UUUU|-**0*| |1110_001_100_011_rrr [ROL.B #1,Dr] 12374: // 12375: //ASL.B #<data>,Dr 12376: //ASL.B Dq,Dr 12377: // 算術左シフトバイト 12378: // ........................アイウエオカキク XNZVC 12379: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12380: // 1 ........................イウエオカキク0 アイ**ア Z=イウエオカキク==0,V=アイ!=0/-1 12381: // : 12382: // 7 ........................ク0000000 キク**キ Z=ク==0,V=アイウエオカキク!=0/-1 12383: // 8 ........................00000000 ク01*ク V=アイウエオカキク!=0 12384: // 9 ........................00000000 001*0 V=アイウエオカキク!=0 12385: // CCR 12386: // X countが0のとき変化しない。他は最後に押し出されたビット 12387: // N 結果の最上位ビット 12388: // Z 結果が0のときセット。他はクリア 12389: // V ASRで元に戻せないときセット。他はクリア 12390: // C countが0のときクリア。他は最後に押し出されたビット 12391: // 12392: //LSL.B #<data>,Dr 12393: //LSL.B Dq,Dr 12394: // 論理左シフトバイト 12395: // ........................アイウエオカキク XNZVC 12396: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12397: // 1 ........................イウエオカキク0 アイ*0ア Z=イウエオカキク==0 12398: // : 12399: // 7 ........................ク0000000 キク*0キ Z=ク==0 12400: // 8 ........................00000000 ク010ク 12401: // 9 ........................00000000 00100 12402: // CCR 12403: // X countが0のとき変化しない。他は最後に押し出されたビット 12404: // N 結果の最上位ビット 12405: // Z 結果が0のときセット。他はクリア 12406: // V 常にクリア 12407: // C countが0のときクリア。他は最後に押し出されたビット 12408: // 12409: //ROL.B #<data>,Dr 12410: //ROL.B Dq,Dr 12411: // 左ローテートバイト 12412: // ........................アイウエオカキク XNZVC 12413: // 0 ........................アイウエオカキク Xア*00 Z=アイウエオカキク==0 12414: // 1 ........................イウエオカキクア Xイ*0ア Z=アイウエオカキク==0 12415: // : 12416: // 7 ........................クアイウエオカキ Xク*0キ Z=アイウエオカキク==0 12417: // 8 ........................アイウエオカキク Xア*0ク Z=アイウエオカキク==0 12418: // CCR 12419: // X 常に変化しない 12420: // N 結果の最上位ビット 12421: // Z 結果が0のときセット。他はクリア 12422: // V 常にクリア 12423: // C countが0のときクリア。他は結果の最下位ビット 12424: // 12425: //ROXL.B #<data>,Dr 12426: //ROXL.B Dq,Dr 12427: // 拡張左ローテートバイト 12428: // ........................アイウエオカキク XNZVC 12429: // 0 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 12430: // 1 ........................イウエオカキクX アイ*0ア Z=イウエオカキクX==0 12431: // 2 ........................ウエオカキクXア イウ*0イ Z=アウエオカキクX==0 12432: // : 12433: // 7 ........................クXアイウエオカ キク*0キ Z=アイウエオカクX==0 12434: // 8 ........................Xアイウエオカキ クX*0ク Z=アイウエオカキX==0 12435: // 9 ........................アイウエオカキク Xア*0X Z=アイウエオカキク==0 12436: // CCR 12437: // X countが0のとき変化しない。他は最後に押し出されたビット 12438: // N 結果の最上位ビット 12439: // Z 結果が0のときセット。他はクリア 12440: // V 常にクリア 12441: // C countが0のときXのコピー。他は最後に押し出されたビット 12442: public static void irpXxlToRegByte () throws M68kException { 12443: int rrr; 12444: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12445: int y; 12446: int z; 12447: int t; 12448: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12449: case 0b000_000 >> 3: //ASL.B #<data>,Dr 12450: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12451: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1)); 12452: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != (byte) x ? XEiJ.REG_CCR_V : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12453: break; 12454: case 0b001_000 >> 3: //LSL.B #<data>,Dr 12455: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12456: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y) << 1)); 12457: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12458: break; 12459: case 0b010_000 >> 3: //ROXL.B #<data>,Dr 12460: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12461: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12462: if (y == 1 - 1) { //y=data-1=1-1 12463: t = x; 12464: } else { //y=data-1=2-1~8-1 12465: z = (t = z << y - (2 - 1)) << 1 | (0xff & x) >>> 9 - 1 - y; 12466: } 12467: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 12468: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12469: break; 12470: case 0b011_000 >> 3: //ROL.B #<data>,Dr 12471: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12472: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y + 1 | (0xff & x) >>> 7 - y)); 12473: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1; //Xは変化しない。Cは結果の最下位ビット 12474: break; 12475: case 0b100_000 >> 3: //ASL.B Dq,Dr 12476: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12477: XEiJ.mpuCycleCount += 6 + (y << 1); 12478: if (y <= 7) { //y=data=0~7 12479: if (y == 0) { //y=data=0 12480: z = (byte) x; 12481: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12482: } else { //y=data=1~7 12483: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = x << y - 1) << 1)); 12484: t = (z >> y != (byte) x ? XEiJ.REG_CCR_V : 0) | (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12485: } 12486: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12487: } else { //y=data=8~63 12488: XEiJ.regRn[rrr] = ~0xff & x; 12489: XEiJ.regCCR = XEiJ.REG_CCR_Z | ((byte) x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 8 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0); 12490: } 12491: break; 12492: case 0b101_000 >> 3: //LSL.B Dq,Dr 12493: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12494: XEiJ.mpuCycleCount += 6 + (y << 1); 12495: if (y == 0) { //y=data=0 12496: z = (byte) x; 12497: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12498: } else { //y=data=1~63 12499: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) ((t = y <= 8 ? x << y - 1 : 0) << 1)); 12500: t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12501: } 12502: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12503: break; 12504: case 0b110_000 >> 3: //ROXL.B Dq,Dr 12505: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12506: XEiJ.mpuCycleCount += 6 + (y << 1); 12507: //y %= 9; 12508: y = (y & 7) - (y >> 3); //y=data=-7~7 12509: y += y >> 3 & 9; //y=data=0~8 12510: if (y == 0) { //y=data=0 12511: z = (byte) x; 12512: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12513: } else { //y=data=1~8 12514: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12515: if (y == 1) { //y=data=1 12516: t = x; //Cは最後に押し出されたビット 12517: } else { //y=data=2~8 12518: z = (t = z << y - 2) << 1 | (0xff & x) >>> 9 - y; 12519: } 12520: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) z); 12521: t = (byte) t >> 7 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12522: } 12523: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12524: break; 12525: case 0b111_000 >> 3: //ROL.B Dq,Dr 12526: default: 12527: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12528: XEiJ.mpuCycleCount += 6 + (y << 1); 12529: if (y == 0) { 12530: z = (byte) x; 12531: t = 0; //Cはクリア 12532: } else { 12533: y &= 7; //y=data=0~7 12534: XEiJ.regRn[rrr] = ~0xff & x | 0xff & (z = (byte) (x << y | (0xff & x) >>> 8 - y)); 12535: t = z & 1; //Cは結果の最下位ビット 12536: } 12537: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12538: } 12539: } //irpXxlToRegByte 12540: 12541: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12542: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12543: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12544: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12545: //ASL.W #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_000_rrr 12546: //LSL.W #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_001_rrr 12547: //ROXL.W #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_010_rrr 12548: //ROL.W #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_011_rrr 12549: //ASL.W Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_101_100_rrr 12550: //LSL.W Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_101_101_rrr 12551: //ROXL.W Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_101_110_rrr 12552: //ROL.W Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_101_111_rrr 12553: //ASL.W Dr |A|012346|-|UUUUU|*****| |1110_001_101_000_rrr [ASL.W #1,Dr] 12554: //LSL.W Dr |A|012346|-|UUUUU|***0*| |1110_001_101_001_rrr [LSL.W #1,Dr] 12555: //ROXL.W Dr |A|012346|-|*UUUU|***0*| |1110_001_101_010_rrr [ROXL.W #1,Dr] 12556: //ROL.W Dr |A|012346|-|-UUUU|-**0*| |1110_001_101_011_rrr [ROL.W #1,Dr] 12557: // 12558: //ASL.W #<data>,Dr 12559: //ASL.W Dq,Dr 12560: //ASL.W <ea> 12561: // 算術左シフトワード 12562: // ................アイウエオカキクケコサシスセソタ XNZVC 12563: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12564: // 1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1 12565: // : 12566: // 15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1 12567: // 16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0 12568: // 17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0 12569: // CCR 12570: // X countが0のとき変化しない。他は最後に押し出されたビット 12571: // N 結果の最上位ビット 12572: // Z 結果が0のときセット。他はクリア 12573: // V ASRで元に戻せないときセット。他はクリア 12574: // C countが0のときクリア。他は最後に押し出されたビット 12575: // 12576: //LSL.W #<data>,Dr 12577: //LSL.W Dq,Dr 12578: //LSL.W <ea> 12579: // 論理左シフトワード 12580: // ................アイウエオカキクケコサシスセソタ XNZVC 12581: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12582: // 1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0 12583: // : 12584: // 15 ................タ000000000000000 ソタ*0ソ Z=タ==0 12585: // 16 ................0000000000000000 タ010タ 12586: // 17 ................0000000000000000 00100 12587: // CCR 12588: // X countが0のとき変化しない。他は最後に押し出されたビット 12589: // N 結果の最上位ビット 12590: // Z 結果が0のときセット。他はクリア 12591: // V 常にクリア 12592: // C countが0のときクリア。他は最後に押し出されたビット 12593: // 12594: //ROL.W #<data>,Dr 12595: //ROL.W Dq,Dr 12596: //ROL.W <ea> 12597: // 左ローテートワード 12598: // ................アイウエオカキクケコサシスセソタ XNZVC 12599: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12600: // 1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0 12601: // : 12602: // 15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0 12603: // 16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0 12604: // CCR 12605: // X 常に変化しない 12606: // N 結果の最上位ビット 12607: // Z 結果が0のときセット。他はクリア 12608: // V 常にクリア 12609: // C countが0のときクリア。他は結果の最下位ビット 12610: // 12611: //ROXL.W #<data>,Dr 12612: //ROXL.W Dq,Dr 12613: //ROXL.W <ea> 12614: // 拡張左ローテートワード 12615: // ................アイウエオカキクケコサシスセソタ XNZVC 12616: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12617: // 1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 12618: // 2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 12619: // : 12620: // 15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 12621: // 16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 12622: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 12623: // CCR 12624: // X countが0のとき変化しない。他は最後に押し出されたビット 12625: // N 結果の最上位ビット 12626: // Z 結果が0のときセット。他はクリア 12627: // V 常にクリア 12628: // C countが0のときXのコピー。他は最後に押し出されたビット 12629: public static void irpXxlToRegWord () throws M68kException { 12630: int rrr; 12631: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12632: int y; 12633: int z; 12634: int t; 12635: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12636: case 0b000_000 >> 3: //ASL.W #<data>,Dr 12637: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12638: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1)); 12639: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != (short) x ? XEiJ.REG_CCR_V : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12640: break; 12641: case 0b001_000 >> 3: //LSL.W #<data>,Dr 12642: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12643: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y) << 1)); 12644: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12645: break; 12646: case 0b010_000 >> 3: //ROXL.W #<data>,Dr 12647: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12648: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12649: if (y == 1 - 1) { //y=data-1=1-1 12650: t = x; 12651: } else { //y=data-1=2-1~8-1 12652: z = (t = z << y - (2 - 1)) << 1 | (char) x >>> 17 - 1 - y; 12653: } 12654: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12655: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12656: break; 12657: case 0b011_000 >> 3: //ROL.W #<data>,Dr 12658: XEiJ.mpuCycleCount += 6 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12659: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y + 1 | (char) x >>> 16 - 1 - y)); 12660: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1; //Xは変化しない。Cは結果の最下位ビット 12661: break; 12662: case 0b100_000 >> 3: //ASL.W Dq,Dr 12663: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12664: XEiJ.mpuCycleCount += 6 + (y << 1); 12665: if (y <= 15) { //y=data=0~15 12666: if (y == 0) { //y=data=0 12667: z = (short) x; 12668: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12669: } else { //y=data=1~15 12670: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = x << y - 1) << 1)); 12671: t = (z >> y != (short) x ? XEiJ.REG_CCR_V : 0) | (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12672: } 12673: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12674: } else { //y=data=16~63 12675: XEiJ.regRn[rrr] = ~0xffff & x; 12676: XEiJ.regCCR = XEiJ.REG_CCR_Z | ((short) x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 16 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0); 12677: } 12678: break; 12679: case 0b101_000 >> 3: //LSL.W Dq,Dr 12680: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12681: XEiJ.mpuCycleCount += 6 + (y << 1); 12682: if (y == 0) { //y=data=0 12683: z = (short) x; 12684: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12685: } else { //y=data=1~63 12686: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) ((t = y <= 16 ? x << y - 1 : 0) << 1)); 12687: t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12688: } 12689: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12690: break; 12691: case 0b110_000 >> 3: //ROXL.W Dq,Dr 12692: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12693: XEiJ.mpuCycleCount += 6 + (y << 1); 12694: //y %= 17; 12695: y = (y & 15) - (y >> 4); //y=data=-3~15 12696: y += y >> 4 & 17; //y=data=0~16 12697: if (y == 0) { //y=data=0 12698: z = (short) x; 12699: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12700: } else { //y=data=1~16 12701: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12702: if (y == 1) { //y=data=1 12703: t = x; //Cは最後に押し出されたビット 12704: } else { //y=data=2~16 12705: z = (t = z << y - 2) << 1 | (char) x >>> 17 - y; 12706: } 12707: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) z); 12708: t = (short) t >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12709: } 12710: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12711: break; 12712: case 0b111_000 >> 3: //ROL.W Dq,Dr 12713: default: 12714: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12715: XEiJ.mpuCycleCount += 6 + (y << 1); 12716: if (y == 0) { 12717: z = (short) x; 12718: t = 0; //Cはクリア 12719: } else { 12720: y &= 15; //y=data=0~15 12721: XEiJ.regRn[rrr] = ~0xffff & x | (char) (z = (short) (x << y | (char) x >>> 16 - y)); 12722: t = z & 1; //Cは結果の最下位ビット 12723: } 12724: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12725: } 12726: } //irpXxlToRegWord 12727: 12728: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12729: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12730: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12731: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12732: //ASL.L #<data>,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_000_rrr 12733: //LSL.L #<data>,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_001_rrr 12734: //ROXL.L #<data>,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_010_rrr 12735: //ROL.L #<data>,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_011_rrr 12736: //ASL.L Dq,Dr |-|012346|-|UUUUU|*****| |1110_qqq_110_100_rrr 12737: //LSL.L Dq,Dr |-|012346|-|UUUUU|***0*| |1110_qqq_110_101_rrr 12738: //ROXL.L Dq,Dr |-|012346|-|*UUUU|***0*| |1110_qqq_110_110_rrr 12739: //ROL.L Dq,Dr |-|012346|-|-UUUU|-**0*| |1110_qqq_110_111_rrr 12740: //ASL.L Dr |A|012346|-|UUUUU|*****| |1110_001_110_000_rrr [ASL.L #1,Dr] 12741: //LSL.L Dr |A|012346|-|UUUUU|***0*| |1110_001_110_001_rrr [LSL.L #1,Dr] 12742: //ROXL.L Dr |A|012346|-|*UUUU|***0*| |1110_001_110_010_rrr [ROXL.L #1,Dr] 12743: //ROL.L Dr |A|012346|-|-UUUU|-**0*| |1110_001_110_011_rrr [ROL.L #1,Dr] 12744: // 12745: //ASL.L #<data>,Dr 12746: //ASL.L Dq,Dr 12747: // 算術左シフトロング 12748: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12749: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア**0 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12750: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ**ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0,V=アイ!=0/-1 12751: // : 12752: // 31 ミ0000000000000000000000000000000 マミ**マ Z=ミ==0,V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0/-1 12753: // 32 00000000000000000000000000000000 ミ01*ミ V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0 12754: // 33 00000000000000000000000000000000 001*0 V=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ!=0 12755: // CCR 12756: // X countが0のとき変化しない。他は最後に押し出されたビット 12757: // N 結果の最上位ビット 12758: // Z 結果が0のときセット。他はクリア 12759: // V ASRで元に戻せないときセット。他はクリア 12760: // C countが0のときクリア。他は最後に押し出されたビット 12761: // 12762: //LSL.L #<data>,Dr 12763: //LSL.L Dq,Dr 12764: // 論理左シフトロング 12765: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12766: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12767: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ0 アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12768: // : 12769: // 31 ミ0000000000000000000000000000000 マミ*0マ Z=ミ==0 12770: // 32 00000000000000000000000000000000 ミ010ミ 12771: // 33 00000000000000000000000000000000 00100 12772: // CCR 12773: // X countが0のとき変化しない。他は最後に押し出されたビット 12774: // N 結果の最上位ビット 12775: // Z 結果が0のときセット。他はクリア 12776: // V 常にクリア 12777: // C countが0のときクリア。他は最後に押し出されたビット 12778: // 12779: //ROL.L #<data>,Dr 12780: //ROL.L Dq,Dr 12781: // 左ローテートロング 12782: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12783: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*00 Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12784: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミア Xイ*0ア Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12785: // : 12786: // 31 ミアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ Xミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12787: // 32 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12788: // CCR 12789: // X 常に変化しない 12790: // N 結果の最上位ビット 12791: // Z 結果が0のときセット。他はクリア 12792: // V 常にクリア 12793: // C countが0のときクリア。他は結果の最下位ビット 12794: // 12795: //ROXL.L #<data>,Dr 12796: //ROXL.L Dq,Dr 12797: // 拡張左ローテートロング 12798: // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ XNZVC 12799: // 0 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12800: // 1 イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX アイ*0ア Z=イウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12801: // 2 ウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミXア イウ*0イ Z=アウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミX==0 12802: // : 12803: // 31 ミXアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ マミ*0マ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホミX==0 12804: // 32 Xアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマ ミX*0ミ Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマX==0 12805: // 33 アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ Xア*0X Z=アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミ==0 12806: // CCR 12807: // X countが0のとき変化しない。他は最後に押し出されたビット 12808: // N 結果の最上位ビット 12809: // Z 結果が0のときセット。他はクリア 12810: // V 常にクリア 12811: // C countが0のときXのコピー。他は最後に押し出されたビット 12812: public static void irpXxlToRegLong () throws M68kException { 12813: int rrr; 12814: int x = XEiJ.regRn[rrr = XEiJ.regOC & 7]; 12815: int y; 12816: int z; 12817: int t; 12818: switch (XEiJ.regOC >> 3 & 0b111_000 >> 3) { 12819: case 0b000_000 >> 3: //ASL.L #<data>,Dr 12820: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12821: XEiJ.regRn[rrr] = z = (t = x << y) << 1; 12822: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | (z >> y + 1 != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12823: break; 12824: case 0b001_000 >> 3: //LSL.L #<data>,Dr 12825: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12826: XEiJ.regRn[rrr] = z = (t = x << y) << 1; 12827: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12828: break; 12829: case 0b010_000 >> 3: //ROXL.L #<data>,Dr 12830: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12831: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12832: if (y == 1 - 1) { //y=data-1=1-1 12833: t = x; 12834: } else { //y=data-1=2-1~8-1 12835: z = (t = z << y - (2 - 1)) << 1 | x >>> -y; //Javaのシフト演算子は5ビットでマスクされるので33-1-yを-yに省略 12836: } 12837: XEiJ.regRn[rrr] = z; 12838: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12839: break; 12840: case 0b011_000 >> 3: //ROL.L #<data>,Dr 12841: XEiJ.mpuCycleCount += 8 + 2 + ((y = (XEiJ.regOC >> 9) - 1 & 7) << 1); //y=data-1=1-1~8-1 12842: XEiJ.regRn[rrr] = z = x << y + 1 | x >>> ~y; //Javaのシフト演算子は5ビットでマスクされるので32-1-yを~yに省略 12843: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | z & 1; //Xは変化しない。Cは結果の最下位ビット 12844: break; 12845: case 0b100_000 >> 3: //ASL.L Dq,Dr 12846: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12847: XEiJ.mpuCycleCount += 8 + (y << 1); 12848: if (y <= 31) { //y=data=0~31 12849: if (y == 0) { //y=data=0 12850: z = x; 12851: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。VとCはクリア 12852: } else { //y=data=1~31 12853: XEiJ.regRn[rrr] = z = (t = x << y - 1) << 1; 12854: t = (z >> y != x ? XEiJ.REG_CCR_V : 0) | t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //VはASRで元に戻せないときセット。XとCは最後に押し出されたビット 12855: } 12856: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12857: } else { //y=data=32~63 12858: XEiJ.regRn[rrr] = 0; 12859: XEiJ.regCCR = XEiJ.REG_CCR_Z | (x != 0 ? XEiJ.REG_CCR_V : 0) | (y == 32 ? -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C) : 0); 12860: } 12861: break; 12862: case 0b101_000 >> 3: //LSL.L Dq,Dr 12863: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12864: XEiJ.mpuCycleCount += 8 + (y << 1); 12865: if (y == 0) { //y=data=0 12866: z = x; 12867: t = XEiJ.regCCR & XEiJ.REG_CCR_X; //Xは変化しない。Cはクリア 12868: } else { //y=data=1~63 12869: XEiJ.regRn[rrr] = z = (t = y <= 32 ? x << y - 1 : 0) << 1; 12870: t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12871: } 12872: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12873: break; 12874: case 0b110_000 >> 3: //ROXL.L Dq,Dr 12875: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12876: XEiJ.mpuCycleCount += 8 + (y << 1); 12877: //y %= 33; 12878: y -= 32 - y >> 6 & 33; //y=data=0~32 12879: if (y == 0) { //y=data=0 12880: z = x; 12881: t = -(XEiJ.regCCR >> 4 & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //Xは変化しない。CはXのコピー 12882: } else { //y=data=1~32 12883: z = x << 1 | XEiJ.regCCR >> 4 & 1; 12884: if (y == 1) { //y=data=1 12885: t = x; //Cは最後に押し出されたビット 12886: } else { //y=data=2~32 12887: z = (t = z << y - 2) << 1 | x >>> 33 - y; 12888: } 12889: XEiJ.regRn[rrr] = z; 12890: t = t >> 31 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); //XとCは最後に押し出されたビット 12891: } 12892: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.REG_CCR_Z : 0) | t; 12893: break; 12894: case 0b111_000 >> 3: //ROL.L Dq,Dr 12895: default: 12896: y = XEiJ.regRn[XEiJ.regOC >> 9 & 7] & 63; //y=0~63。Javaのシフト演算子は5ビットでマスクされることに注意 12897: XEiJ.mpuCycleCount += 8 + (y << 1); 12898: if (y == 0) { 12899: z = x; 12900: t = 0; //Cはクリア 12901: } else { 12902: XEiJ.regRn[rrr] = z = x << y | x >>> -y; //Javaのシフト演算子は5ビットでマスクされるのでy&31をyに、32-(y&31)を-yに省略。y=32のときx|xになるが問題ない 12903: t = z & 1; 12904: } 12905: XEiJ.regCCR = z >> 28 & XEiJ.REG_CCR_N | (z == 0 ? XEiJ.regCCR & XEiJ.REG_CCR_X | XEiJ.REG_CCR_Z : XEiJ.regCCR & XEiJ.REG_CCR_X) | t; //Xは変化しない 12906: } 12907: } //irpXxlToRegLong 12908: 12909: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12910: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12911: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12912: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12913: //ASL.W <ea> |-|012346|-|UUUUU|*****| M+-WXZ |1110_000_111_mmm_rrr 12914: // 12915: //ASL.W #<data>,Dr 12916: //ASL.W Dq,Dr 12917: //ASL.W <ea> 12918: // 算術左シフトワード 12919: // ................アイウエオカキクケコサシスセソタ XNZVC 12920: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12921: // 1 ................イウエオカキクケコサシスセソタ0 アイ**ア Z=イウエオカキクケコサシスセソタ==0,V=アイ!=0/-1 12922: // : 12923: // 15 ................タ000000000000000 ソタ**ソ Z=タ==0,V=アイウエオカキクケコサシスセソタ!=0/-1 12924: // 16 ................0000000000000000 タ01*タ V=アイウエオカキクケコサシスセソタ!=0 12925: // 17 ................0000000000000000 001*0 V=アイウエオカキクケコサシスセソタ!=0 12926: // CCR 12927: // X countが0のとき変化しない。他は最後に押し出されたビット 12928: // N 結果の最上位ビット 12929: // Z 結果が0のときセット。他はクリア 12930: // V ASRで元に戻せないときセット。他はクリア 12931: // C countが0のときクリア。他は最後に押し出されたビット 12932: public static void irpAslToMem () throws M68kException { 12933: XEiJ.mpuCycleCount += 8; 12934: int ea = XEiJ.regOC & 63; 12935: int a = efaMltWord (ea); 12936: int x = XEiJ.busRws (a); 12937: int z = (short) (x << 1); 12938: XEiJ.busWw (a, z); 12939: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 12940: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 12941: (x ^ z) >>> 31 << 1 | //Vは最上位ビットが変化したときセット 12942: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12943: } //irpAslToMem 12944: 12945: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12946: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12947: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12948: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12949: //LSR.W <ea> |-|012346|-|UUUUU|*0*0*| M+-WXZ |1110_001_011_mmm_rrr 12950: // 12951: //LSR.W #<data>,Dr 12952: //LSR.W Dq,Dr 12953: //LSR.W <ea> 12954: // 論理右シフトワード 12955: // ................アイウエオカキクケコサシスセソタ XNZVC 12956: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12957: // 1 ................0アイウエオカキクケコサシスセソ タ0*0タ Z=アイウエオカキクケコサシスセソ==0 12958: // : 12959: // 15 ................000000000000000ア イ0*0イ Z=ア==0 12960: // 16 ................0000000000000000 ア010ア 12961: // 17 ................0000000000000000 00100 12962: // CCR 12963: // X countが0のとき変化しない。他は最後に押し出されたビット 12964: // N 結果の最上位ビット 12965: // Z 結果が0のときセット。他はクリア 12966: // V 常にクリア 12967: // C countが0のときクリア。他は最後に押し出されたビット 12968: public static void irpLsrToMem () throws M68kException { 12969: XEiJ.mpuCycleCount += 8; 12970: int ea = XEiJ.regOC & 63; 12971: int a = efaMltWord (ea); 12972: int x = XEiJ.busRwz (a); 12973: int z = x >>> 1; 12974: XEiJ.busWw (a, z); 12975: XEiJ.regCCR = ((z == 0 ? XEiJ.REG_CCR_Z : 0) | 12976: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 12977: } //irpLsrToMem 12978: 12979: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12980: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 12981: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 12982: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 12983: //LSL.W <ea> |-|012346|-|UUUUU|***0*| M+-WXZ |1110_001_111_mmm_rrr 12984: // 12985: //LSL.W #<data>,Dr 12986: //LSL.W Dq,Dr 12987: //LSL.W <ea> 12988: // 論理左シフトワード 12989: // ................アイウエオカキクケコサシスセソタ XNZVC 12990: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 12991: // 1 ................イウエオカキクケコサシスセソタ0 アイ*0ア Z=イウエオカキクケコサシスセソタ==0 12992: // : 12993: // 15 ................タ000000000000000 ソタ*0ソ Z=タ==0 12994: // 16 ................0000000000000000 タ010タ 12995: // 17 ................0000000000000000 00100 12996: // CCR 12997: // X countが0のとき変化しない。他は最後に押し出されたビット 12998: // N 結果の最上位ビット 12999: // Z 結果が0のときセット。他はクリア 13000: // V 常にクリア 13001: // C countが0のときクリア。他は最後に押し出されたビット 13002: public static void irpLslToMem () throws M68kException { 13003: XEiJ.mpuCycleCount += 8; 13004: int ea = XEiJ.regOC & 63; 13005: int a = efaMltWord (ea); 13006: int x = XEiJ.busRws (a); 13007: int z = (short) (x << 1); 13008: XEiJ.busWw (a, z); 13009: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 13010: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13011: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13012: } //irpLslToMem 13013: 13014: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13015: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13016: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13017: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13018: //ROXR.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_011_mmm_rrr 13019: // 13020: //ROXR.W #<data>,Dr 13021: //ROXR.W Dq,Dr 13022: //ROXR.W <ea> 13023: // 拡張右ローテートワード 13024: // ................アイウエオカキクケコサシスセソタ XNZVC 13025: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13026: // 1 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 13027: // 2 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 13028: // : 13029: // 15 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 13030: // 16 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 13031: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13032: // CCR 13033: // X countが0のとき変化しない。他は最後に押し出されたビット 13034: // N 結果の最上位ビット 13035: // Z 結果が0のときセット。他はクリア 13036: // V 常にクリア 13037: // C countが0のときXのコピー。他は最後に押し出されたビット 13038: public static void irpRoxrToMem () throws M68kException { 13039: XEiJ.mpuCycleCount += 8; 13040: int ea = XEiJ.regOC & 63; 13041: int a = efaMltWord (ea); 13042: int x = XEiJ.busRwz (a); 13043: int z = -(XEiJ.regCCR & XEiJ.REG_CCR_X) << 15 - 4 | x >>> 1; 13044: XEiJ.busWw (a, z); 13045: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 13046: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13047: -(x & 1) & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13048: } //irpRoxrToMem 13049: 13050: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13051: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13052: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13053: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13054: //ROXL.W <ea> |-|012346|-|*UUUU|***0*| M+-WXZ |1110_010_111_mmm_rrr 13055: // 13056: //ROXL.W #<data>,Dr 13057: //ROXL.W Dq,Dr 13058: //ROXL.W <ea> 13059: // 拡張左ローテートワード 13060: // ................アイウエオカキクケコサシスセソタ XNZVC 13061: // 0 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13062: // 1 ................イウエオカキクケコサシスセソタX アイ*0ア Z=イウエオカキクケコサシスセソタX==0 13063: // 2 ................ウエオカキクケコサシスセソタXア イウ*0イ Z=アウエオカキクケコサシスセソタX==0 13064: // : 13065: // 15 ................タXアイウエオカキクケコサシスセ ソタ*0ソ Z=アイウエオカキクケコサシスセタX==0 13066: // 16 ................Xアイウエオカキクケコサシスセソ タX*0タ Z=アイウエオカキクケコサシスセソX==0 13067: // 17 ................アイウエオカキクケコサシスセソタ Xア*0X Z=アイウエオカキクケコサシスセソタ==0 13068: // CCR 13069: // X countが0のとき変化しない。他は最後に押し出されたビット 13070: // N 結果の最上位ビット 13071: // Z 結果が0のときセット。他はクリア 13072: // V 常にクリア 13073: // C countが0のときXのコピー。他は最後に押し出されたビット 13074: public static void irpRoxlToMem () throws M68kException { 13075: XEiJ.mpuCycleCount += 8; 13076: int ea = XEiJ.regOC & 63; 13077: int a = efaMltWord (ea); 13078: int x = XEiJ.busRws (a); 13079: int z = (short) (x << 1 | XEiJ.regCCR >> 4 & 1); 13080: XEiJ.busWw (a, z); 13081: XEiJ.regCCR = ((z < 0 ? XEiJ.REG_CCR_N : 0) | 13082: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13083: x >> 15 & (XEiJ.REG_CCR_X | XEiJ.REG_CCR_C)); //XとCは最後に押し出されたビット 13084: } //irpRoxlToMem 13085: 13086: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13087: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13088: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13089: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13090: //ROR.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_011_mmm_rrr 13091: // 13092: //ROR.W #<data>,Dr 13093: //ROR.W Dq,Dr 13094: //ROR.W <ea> 13095: // 右ローテートワード 13096: // ................アイウエオカキクケコサシスセソタ XNZVC 13097: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 13098: // 1 ................タアイウエオカキクケコサシスセソ Xタ*0タ Z=アイウエオカキクケコサシスセソタ==0 13099: // : 13100: // 15 ................イウエオカキクケコサシスセソタア Xイ*0イ Z=アイウエオカキクケコサシスセソタ==0 13101: // 16 ................アイウエオカキクケコサシスセソタ Xア*0ア Z=アイウエオカキクケコサシスセソタ==0 13102: // CCR 13103: // X 常に変化しない 13104: // N 結果の最上位ビット 13105: // Z 結果が0のときセット。他はクリア 13106: // V 常にクリア 13107: // C countが0のときクリア。他は結果の最上位ビット 13108: public static void irpRorToMem () throws M68kException { 13109: XEiJ.mpuCycleCount += 8; 13110: int ea = XEiJ.regOC & 63; 13111: int a = efaMltWord (ea); 13112: int x = XEiJ.busRwz (a); 13113: int z = (short) (x << 15 | x >>> 1); 13114: XEiJ.busWw (a, z); 13115: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 13116: (z < 0 ? XEiJ.REG_CCR_N : 0) | 13117: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13118: z >>> 31); //Cは結果の最上位ビット 13119: } //irpRorToMem 13120: 13121: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13122: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13123: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13124: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13125: //ROL.W <ea> |-|012346|-|-UUUU|-**0*| M+-WXZ |1110_011_111_mmm_rrr 13126: // 13127: //ROL.W #<data>,Dr 13128: //ROL.W Dq,Dr 13129: //ROL.W <ea> 13130: // 左ローテートワード 13131: // ................アイウエオカキクケコサシスセソタ XNZVC 13132: // 0 ................アイウエオカキクケコサシスセソタ Xア*00 Z=アイウエオカキクケコサシスセソタ==0 13133: // 1 ................イウエオカキクケコサシスセソタア Xイ*0ア Z=アイウエオカキクケコサシスセソタ==0 13134: // : 13135: // 15 ................タアイウエオカキクケコサシスセソ Xタ*0ソ Z=アイウエオカキクケコサシスセソタ==0 13136: // 16 ................アイウエオカキクケコサシスセソタ Xア*0タ Z=アイウエオカキクケコサシスセソタ==0 13137: // CCR 13138: // X 常に変化しない 13139: // N 結果の最上位ビット 13140: // Z 結果が0のときセット。他はクリア 13141: // V 常にクリア 13142: // C countが0のときクリア。他は結果の最下位ビット 13143: public static void irpRolToMem () throws M68kException { 13144: XEiJ.mpuCycleCount += 8; 13145: int ea = XEiJ.regOC & 63; 13146: int a = efaMltWord (ea); 13147: int x = XEiJ.busRwz (a); 13148: int z = (short) (x << 1 | x >>> 15); 13149: XEiJ.busWw (a, z); 13150: XEiJ.regCCR = (XEiJ.regCCR & XEiJ.REG_CCR_X | //Xは変化しない 13151: (z < 0 ? XEiJ.REG_CCR_N : 0) | 13152: (z == 0 ? XEiJ.REG_CCR_Z : 0) | 13153: z & 1); //Cは結果の最下位ビット 13154: } //irpRolToMem 13155: 13156: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13157: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13158: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13159: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13160: //FPACK <data> |A|012346|-|UUUUU|*****| |1111_111_0dd_ddd_ddd [FLINE #<data>] 13161: public static void irpFpack () throws M68kException { 13162: if (!MainMemory.mmrFEfuncActivated) { 13163: irpFline (); 13164: return; 13165: } 13166: StringBuilder sb; 13167: int a0; 13168: if (FEFunction.FPK_DEBUG_TRACE) { 13169: sb = new StringBuilder (); 13170: String name = Disassembler.DIS_FPACK_NAME[XEiJ.regOC & 255]; 13171: if (name.length () == 0) { 13172: XEiJ.fmtHex4 (sb.append ('$'), XEiJ.regOC); 13173: } else { 13174: sb.append (name); 13175: } 13176: sb.append ('\n'); 13177: XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (sb.append (" D0="), XEiJ.regRn[0]).append (" D1="), XEiJ.regRn[1]).append (" D2="), XEiJ.regRn[2]).append (" D3="), XEiJ.regRn[3]); 13178: a0 = XEiJ.regRn[8]; 13179: MainMemory.mmrRstr (sb.append (" (A0)=\""), a0, MainMemory.mmrStrlen (a0, 20)).append ("\"\n"); 13180: } 13181: XEiJ.mpuCycleCount += FEFunction.FPK_CLOCK; //一律にFEFunction.FPK_CLOCKサイクルかかることにする 13182: switch (XEiJ.regOC & 255) { 13183: case 0x00: FEFunction.fpkLMUL (); break; 13184: case 0x01: FEFunction.fpkLDIV (); break; 13185: case 0x02: FEFunction.fpkLMOD (); break; 13186: //case 0x03: break; 13187: case 0x04: FEFunction.fpkUMUL (); break; 13188: case 0x05: FEFunction.fpkUDIV (); break; 13189: case 0x06: FEFunction.fpkUMOD (); break; 13190: //case 0x07: break; 13191: case 0x08: FEFunction.fpkIMUL (); break; 13192: case 0x09: FEFunction.fpkIDIV (); break; 13193: //case 0x0a: break; 13194: //case 0x0b: break; 13195: case 0x0c: FEFunction.fpkRANDOMIZE (); break; 13196: case 0x0d: FEFunction.fpkSRAND (); break; 13197: case 0x0e: FEFunction.fpkRAND (); break; 13198: //case 0x0f: break; 13199: case 0x10: FEFunction.fpkSTOL (); break; 13200: case 0x11: FEFunction.fpkLTOS (); break; 13201: case 0x12: FEFunction.fpkSTOH (); break; 13202: case 0x13: FEFunction.fpkHTOS (); break; 13203: case 0x14: FEFunction.fpkSTOO (); break; 13204: case 0x15: FEFunction.fpkOTOS (); break; 13205: case 0x16: FEFunction.fpkSTOB (); break; 13206: case 0x17: FEFunction.fpkBTOS (); break; 13207: case 0x18: FEFunction.fpkIUSING (); break; 13208: //case 0x19: break; 13209: case 0x1a: FEFunction.fpkLTOD (); break; 13210: case 0x1b: FEFunction.fpkDTOL (); break; 13211: case 0x1c: FEFunction.fpkLTOF (); break; 13212: case 0x1d: FEFunction.fpkFTOL (); break; 13213: case 0x1e: FEFunction.fpkFTOD (); break; 13214: case 0x1f: FEFunction.fpkDTOF (); break; 13215: case 0x20: FEFunction.fpkVAL (); break; 13216: case 0x21: FEFunction.fpkUSING (); break; 13217: case 0x22: FEFunction.fpkSTOD (); break; 13218: case 0x23: FEFunction.fpkDTOS (); break; 13219: case 0x24: FEFunction.fpkECVT (); break; 13220: case 0x25: FEFunction.fpkFCVT (); break; 13221: case 0x26: FEFunction.fpkGCVT (); break; 13222: //case 0x27: break; 13223: case 0x28: FEFunction.fpkDTST (); break; 13224: case 0x29: FEFunction.fpkDCMP (); break; 13225: case 0x2a: FEFunction.fpkDNEG (); break; 13226: case 0x2b: FEFunction.fpkDADD (); break; 13227: case 0x2c: FEFunction.fpkDSUB (); break; 13228: case 0x2d: FEFunction.fpkDMUL (); break; 13229: case 0x2e: FEFunction.fpkDDIV (); break; 13230: case 0x2f: FEFunction.fpkDMOD (); break; 13231: case 0x30: FEFunction.fpkDABS (); break; 13232: case 0x31: FEFunction.fpkDCEIL (); break; 13233: case 0x32: FEFunction.fpkDFIX (); break; 13234: case 0x33: FEFunction.fpkDFLOOR (); break; 13235: case 0x34: FEFunction.fpkDFRAC (); break; 13236: case 0x35: FEFunction.fpkDSGN (); break; 13237: case 0x36: FEFunction.fpkSIN (); break; 13238: case 0x37: FEFunction.fpkCOS (); break; 13239: case 0x38: FEFunction.fpkTAN (); break; 13240: case 0x39: FEFunction.fpkATAN (); break; 13241: case 0x3a: FEFunction.fpkLOG (); break; 13242: case 0x3b: FEFunction.fpkEXP (); break; 13243: case 0x3c: FEFunction.fpkSQR (); break; 13244: case 0x3d: FEFunction.fpkPI (); break; 13245: case 0x3e: FEFunction.fpkNPI (); break; 13246: case 0x3f: FEFunction.fpkPOWER (); break; 13247: case 0x40: FEFunction.fpkRND (); break; 13248: case 0x41: FEFunction.fpkSINH (); break; 13249: case 0x42: FEFunction.fpkCOSH (); break; 13250: case 0x43: FEFunction.fpkTANH (); break; 13251: case 0x44: FEFunction.fpkATANH (); break; 13252: case 0x45: FEFunction.fpkASIN (); break; 13253: case 0x46: FEFunction.fpkACOS (); break; 13254: case 0x47: FEFunction.fpkLOG10 (); break; 13255: case 0x48: FEFunction.fpkLOG2 (); break; 13256: case 0x49: FEFunction.fpkDFREXP (); break; 13257: case 0x4a: FEFunction.fpkDLDEXP (); break; 13258: case 0x4b: FEFunction.fpkDADDONE (); break; 13259: case 0x4c: FEFunction.fpkDSUBONE (); break; 13260: case 0x4d: FEFunction.fpkDDIVTWO (); break; 13261: case 0x4e: FEFunction.fpkDIEECNV (); break; 13262: case 0x4f: FEFunction.fpkIEEDCNV (); break; 13263: case 0x50: FEFunction.fpkFVAL (); break; 13264: case 0x51: FEFunction.fpkFUSING (); break; 13265: case 0x52: FEFunction.fpkSTOF (); break; 13266: case 0x53: FEFunction.fpkFTOS (); break; 13267: case 0x54: FEFunction.fpkFECVT (); break; 13268: case 0x55: FEFunction.fpkFFCVT (); break; 13269: case 0x56: FEFunction.fpkFGCVT (); break; 13270: //case 0x57: break; 13271: case 0x58: FEFunction.fpkFTST (); break; 13272: case 0x59: FEFunction.fpkFCMP (); break; 13273: case 0x5a: FEFunction.fpkFNEG (); break; 13274: case 0x5b: FEFunction.fpkFADD (); break; 13275: case 0x5c: FEFunction.fpkFSUB (); break; 13276: case 0x5d: FEFunction.fpkFMUL (); break; 13277: case 0x5e: FEFunction.fpkFDIV (); break; 13278: case 0x5f: FEFunction.fpkFMOD (); break; 13279: case 0x60: FEFunction.fpkFABS (); break; 13280: case 0x61: FEFunction.fpkFCEIL (); break; 13281: case 0x62: FEFunction.fpkFFIX (); break; 13282: case 0x63: FEFunction.fpkFFLOOR (); break; 13283: case 0x64: FEFunction.fpkFFRAC (); break; 13284: case 0x65: FEFunction.fpkFSGN (); break; 13285: case 0x66: FEFunction.fpkFSIN (); break; 13286: case 0x67: FEFunction.fpkFCOS (); break; 13287: case 0x68: FEFunction.fpkFTAN (); break; 13288: case 0x69: FEFunction.fpkFATAN (); break; 13289: case 0x6a: FEFunction.fpkFLOG (); break; 13290: case 0x6b: FEFunction.fpkFEXP (); break; 13291: case 0x6c: FEFunction.fpkFSQR (); break; 13292: case 0x6d: FEFunction.fpkFPI (); break; 13293: case 0x6e: FEFunction.fpkFNPI (); break; 13294: case 0x6f: FEFunction.fpkFPOWER (); break; 13295: case 0x70: FEFunction.fpkFRND (); break; 13296: case 0x71: FEFunction.fpkFSINH (); break; 13297: case 0x72: FEFunction.fpkFCOSH (); break; 13298: case 0x73: FEFunction.fpkFTANH (); break; 13299: case 0x74: FEFunction.fpkFATANH (); break; 13300: case 0x75: FEFunction.fpkFASIN (); break; 13301: case 0x76: FEFunction.fpkFACOS (); break; 13302: case 0x77: FEFunction.fpkFLOG10 (); break; 13303: case 0x78: FEFunction.fpkFLOG2 (); break; 13304: case 0x79: FEFunction.fpkFFREXP (); break; 13305: case 0x7a: FEFunction.fpkFLDEXP (); break; 13306: case 0x7b: FEFunction.fpkFADDONE (); break; 13307: case 0x7c: FEFunction.fpkFSUBONE (); break; 13308: case 0x7d: FEFunction.fpkFDIVTWO (); break; 13309: case 0x7e: FEFunction.fpkFIEECNV (); break; 13310: case 0x7f: FEFunction.fpkIEEFCNV (); break; 13311: //case 0x80: break; 13312: //case 0x81: break; 13313: //case 0x82: break; 13314: //case 0x83: break; 13315: //case 0x84: break; 13316: //case 0x85: break; 13317: //case 0x86: break; 13318: //case 0x87: break; 13319: //case 0x88: break; 13320: //case 0x89: break; 13321: //case 0x8a: break; 13322: //case 0x8b: break; 13323: //case 0x8c: break; 13324: //case 0x8d: break; 13325: //case 0x8e: break; 13326: //case 0x8f: break; 13327: //case 0x90: break; 13328: //case 0x91: break; 13329: //case 0x92: break; 13330: //case 0x93: break; 13331: //case 0x94: break; 13332: //case 0x95: break; 13333: //case 0x96: break; 13334: //case 0x97: break; 13335: //case 0x98: break; 13336: //case 0x99: break; 13337: //case 0x9a: break; 13338: //case 0x9b: break; 13339: //case 0x9c: break; 13340: //case 0x9d: break; 13341: //case 0x9e: break; 13342: //case 0x9f: break; 13343: //case 0xa0: break; 13344: //case 0xa1: break; 13345: //case 0xa2: break; 13346: //case 0xa3: break; 13347: //case 0xa4: break; 13348: //case 0xa5: break; 13349: //case 0xa6: break; 13350: //case 0xa7: break; 13351: //case 0xa8: break; 13352: //case 0xa9: break; 13353: //case 0xaa: break; 13354: //case 0xab: break; 13355: //case 0xac: break; 13356: //case 0xad: break; 13357: //case 0xae: break; 13358: //case 0xaf: break; 13359: //case 0xb0: break; 13360: //case 0xb1: break; 13361: //case 0xb2: break; 13362: //case 0xb3: break; 13363: //case 0xb4: break; 13364: //case 0xb5: break; 13365: //case 0xb6: break; 13366: //case 0xb7: break; 13367: //case 0xb8: break; 13368: //case 0xb9: break; 13369: //case 0xba: break; 13370: //case 0xbb: break; 13371: //case 0xbc: break; 13372: //case 0xbd: break; 13373: //case 0xbe: break; 13374: //case 0xbf: break; 13375: //case 0xc0: break; 13376: //case 0xc1: break; 13377: //case 0xc2: break; 13378: //case 0xc3: break; 13379: //case 0xc4: break; 13380: //case 0xc5: break; 13381: //case 0xc6: break; 13382: //case 0xc7: break; 13383: //case 0xc8: break; 13384: //case 0xc9: break; 13385: //case 0xca: break; 13386: //case 0xcb: break; 13387: //case 0xcc: break; 13388: //case 0xcd: break; 13389: //case 0xce: break; 13390: //case 0xcf: break; 13391: //case 0xd0: break; 13392: //case 0xd1: break; 13393: //case 0xd2: break; 13394: //case 0xd3: break; 13395: //case 0xd4: break; 13396: //case 0xd5: break; 13397: //case 0xd6: break; 13398: //case 0xd7: break; 13399: //case 0xd8: break; 13400: //case 0xd9: break; 13401: //case 0xda: break; 13402: //case 0xdb: break; 13403: //case 0xdc: break; 13404: //case 0xdd: break; 13405: //case 0xde: break; 13406: //case 0xdf: break; 13407: case 0xe0: FEFunction.fpkCLMUL (); break; 13408: case 0xe1: FEFunction.fpkCLDIV (); break; 13409: case 0xe2: FEFunction.fpkCLMOD (); break; 13410: case 0xe3: FEFunction.fpkCUMUL (); break; 13411: case 0xe4: FEFunction.fpkCUDIV (); break; 13412: case 0xe5: FEFunction.fpkCUMOD (); break; 13413: case 0xe6: FEFunction.fpkCLTOD (); break; 13414: case 0xe7: FEFunction.fpkCDTOL (); break; 13415: case 0xe8: FEFunction.fpkCLTOF (); break; 13416: case 0xe9: FEFunction.fpkCFTOL (); break; 13417: case 0xea: FEFunction.fpkCFTOD (); break; 13418: case 0xeb: FEFunction.fpkCDTOF (); break; 13419: case 0xec: FEFunction.fpkCDCMP (); break; 13420: case 0xed: FEFunction.fpkCDADD (); break; 13421: case 0xee: FEFunction.fpkCDSUB (); break; 13422: case 0xef: FEFunction.fpkCDMUL (); break; 13423: case 0xf0: FEFunction.fpkCDDIV (); break; 13424: case 0xf1: FEFunction.fpkCDMOD (); break; 13425: case 0xf2: FEFunction.fpkCFCMP (); break; 13426: case 0xf3: FEFunction.fpkCFADD (); break; 13427: case 0xf4: FEFunction.fpkCFSUB (); break; 13428: case 0xf5: FEFunction.fpkCFMUL (); break; 13429: case 0xf6: FEFunction.fpkCFDIV (); break; 13430: case 0xf7: FEFunction.fpkCFMOD (); break; 13431: case 0xf8: FEFunction.fpkCDTST (); break; 13432: case 0xf9: FEFunction.fpkCFTST (); break; 13433: case 0xfa: FEFunction.fpkCDINC (); break; 13434: case 0xfb: FEFunction.fpkCFINC (); break; 13435: case 0xfc: FEFunction.fpkCDDEC (); break; 13436: case 0xfd: FEFunction.fpkCFDEC (); break; 13437: case 0xfe: FEFunction.fpkFEVARG (); break; 13438: //case 0xff: FEFunction.fpkFEVECS (); break; //FLOATn.Xに処理させる 13439: default: 13440: XEiJ.mpuCycleCount -= FEFunction.FPK_CLOCK; //戻す 13441: irpFline (); 13442: } 13443: if (FEFunction.FPK_DEBUG_TRACE) { 13444: int i = sb.length (); 13445: XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (XEiJ.fmtHex8 (sb.append (" D0="), XEiJ.regRn[0]).append (" D1="), XEiJ.regRn[1]).append (" D2="), XEiJ.regRn[2]).append (" D3="), XEiJ.regRn[3]); 13446: int l = MainMemory.mmrStrlen (a0, 20); 13447: sb.append (" (A0)=\""); 13448: i = sb.length () - i; 13449: MainMemory.mmrRstr (sb, a0, l).append ("\"\n"); 13450: if (a0 <= XEiJ.regRn[8] && XEiJ.regRn[8] <= a0 + l) { 13451: for (i += sb.length () + XEiJ.regRn[8] - a0; sb.length () < i; ) { 13452: sb.append (' '); 13453: } 13454: sb.append ('^'); 13455: } 13456: System.out.println (sb.toString ()); 13457: } 13458: } //irpFpack 13459: 13460: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13461: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13462: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13463: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13464: //DOS <data> |A|012346|-|UUUUU|UUUUU| |1111_111_1dd_ddd_ddd [FLINE #<data>] 13465: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13466: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13467: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13468: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13469: //FLINE #<data> |-|012346|-|UUUUU|UUUUU| |1111_ddd_ddd_ddd_ddd (line 1111 emulator) 13470: public static void irpFline () throws M68kException { 13471: XEiJ.mpuCycleCount += 34; 13472: if (XEiJ.MPU_INLINE_EXCEPTION) { 13473: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 13474: int sp = XEiJ.regRn[15]; 13475: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 13476: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13477: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13478: XEiJ.mpuUSP = sp; //USPを保存 13479: sp = XEiJ.mpuISP; //SSPを復元 13480: if (DataBreakPoint.DBP_ON) { 13481: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13482: } else { 13483: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13484: } 13485: if (InstructionBreakPoint.IBP_ON) { 13486: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13487: } 13488: } 13489: int vectorOffset = M68kException.M6E_LINE_1111_EMULATOR << 2; //vector offset 13490: XEiJ.regRn[15] = sp -= 8; //short format 13491: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 13492: XEiJ.busWl (sp + 2, XEiJ.regPC0); //program counter 13493: XEiJ.busWw (sp, save_sr); //status register 13494: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 13495: } else { 13496: irpException (M68kException.M6E_LINE_1111_EMULATOR, XEiJ.regPC0, XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR); //pcは命令の先頭 13497: } 13498: } //irpFline 13499: 13500: //irpIllegal () 13501: // オペコードの上位10bitで分類されなかった未実装命令 13502: // 0x4afcのILLEGAL命令はここには来ない 13503: public static void irpIllegal () throws M68kException { 13504: if (true) { 13505: XEiJ.mpuCycleCount += 34; 13506: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13507: throw M68kException.m6eSignal; 13508: } 13509: } //irpIllegal 13510: 13511: //z = irpAbcd (x, y) 13512: // ABCD 13513: public static int irpAbcd (int x, int y) { 13514: int c = XEiJ.regCCR >> 4; 13515: int t = (x & 0xff) + (y & 0xff) + c; //仮の結果 13516: int z = t; //結果 13517: if (0x0a <= (x & 0x0f) + (y & 0x0f) + c) { //ハーフキャリー 13518: z += 0x10 - 0x0a; 13519: } 13520: //XとCはキャリーがあるときセット、さもなくばクリア 13521: if (0xa0 <= z) { //キャリー 13522: z += 0x100 - 0xa0; 13523: XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C; 13524: } else { 13525: XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); 13526: } 13527: //Zは結果が0でないときクリア、さもなくば変化しない 13528: z &= 0xff; 13529: if (z != 0x00) { 13530: XEiJ.regCCR &= ~XEiJ.REG_CCR_Z; 13531: } 13532: if (true) { 13533: //000/030のときNは結果の最上位ビット 13534: if ((z & 0x80) != 0) { 13535: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13536: } else { 13537: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13538: } 13539: //000のときVは補正値の加算でオーバーフローしたときセット、さもなくばクリア 13540: int a = z - t; //補正値 13541: if ((((t ^ z) & (a ^ z)) & 0x80) != 0) { 13542: XEiJ.regCCR |= XEiJ.REG_CCR_V; 13543: } else { 13544: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13545: } 13546: } else if (false) { 13547: //000/030のときNは結果の最上位ビット 13548: if ((z & 0x80) != 0) { 13549: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13550: } else { 13551: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13552: } 13553: //030のときVはクリア 13554: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13555: } else { 13556: //060のときNとVは変化しない 13557: } 13558: return z; 13559: } //irpAbcd 13560: 13561: //z = irpSbcd (x, y) 13562: // SBCD 13563: public static int irpSbcd (int x, int y) { 13564: int b = XEiJ.regCCR >> 4; 13565: int t = (x & 0xff) - (y & 0xff) - b; //仮の結果 13566: int z = t; //結果 13567: if ((x & 0x0f) - (y & 0x0f) - b < 0) { //ハーフボロー 13568: z -= 0x10 - 0x0a; 13569: } 13570: //XとCはボローがあるときセット、さもなくばクリア 13571: if (z < 0) { //ボロー 13572: if (t < 0) { 13573: z -= 0x100 - 0xa0; 13574: } 13575: XEiJ.regCCR |= XEiJ.REG_CCR_X | XEiJ.REG_CCR_C; 13576: } else { 13577: XEiJ.regCCR &= ~(XEiJ.REG_CCR_X | XEiJ.REG_CCR_C); 13578: } 13579: //Zは結果が0でないときクリア、さもなくば変化しない 13580: z &= 0xff; 13581: if (z != 0x00) { 13582: XEiJ.regCCR &= ~XEiJ.REG_CCR_Z; 13583: } 13584: if (true) { 13585: //000/030のときNは結果の最上位ビット 13586: if ((z & 0x80) != 0) { 13587: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13588: } else { 13589: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13590: } 13591: //000のときVは補正値の減算でオーバーフローしたときセット、さもなくばクリア 13592: int a = t - z; //補正値 13593: if ((((t & (a ^ z)) ^ (a | z)) & 0x80) != 0) { 13594: XEiJ.regCCR |= XEiJ.REG_CCR_V; 13595: } else { 13596: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13597: } 13598: } else if (false) { 13599: //000/030のときNは結果の最上位ビット 13600: if ((z & 0x80) != 0) { 13601: XEiJ.regCCR |= XEiJ.REG_CCR_N; 13602: } else { 13603: XEiJ.regCCR &= ~XEiJ.REG_CCR_N; 13604: } 13605: //030のときVはクリア 13606: XEiJ.regCCR &= ~XEiJ.REG_CCR_V; 13607: } else { 13608: //060のときNとVは変化しない 13609: } 13610: return z; 13611: } //irpSbcd 13612: 13613: 13614: 13615: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13616: // | | MPU | |CCin |CCout|addressing| 1st opcode 2nd opcode 13617: // A:alias P:privileged |A|012346|P|XNZVC|XNZVC|DAM+-WXZPI|bbbb_bbb_bbb_bbb_bbb-bbbbbbbbbbbbbbbb 13618: //------------------------------------------------+-+------+-+-----+-----+----------+------------------------------------- 13619: //HFSBOOT |-|012346|-|-----|-----| |0100_111_000_000_000 13620: //HFSINST |-|012346|-|-----|-----| |0100_111_000_000_001 13621: //HFSSTR |-|012346|-|-----|-----| |0100_111_000_000_010 13622: //HFSINT |-|012346|-|-----|-----| |0100_111_000_000_011 13623: //EMXNOP |-|012346|-|-----|-----| |0100_111_000_000_100 13624: // エミュレータ拡張命令 13625: public static void irpEmx () throws M68kException { 13626: switch (XEiJ.regOC & 63) { 13627: case XEiJ.EMX_OPCODE_HFSBOOT & 63: 13628: XEiJ.mpuCycleCount += 40; 13629: if (HFS.hfsIPLBoot ()) { 13630: //JMP $6800.W 13631: irpSetPC (0x00006800); 13632: } 13633: break; 13634: case XEiJ.EMX_OPCODE_HFSINST & 63: 13635: XEiJ.mpuCycleCount += 40; 13636: HFS.hfsInstall (); 13637: break; 13638: case XEiJ.EMX_OPCODE_HFSSTR & 63: 13639: XEiJ.mpuCycleCount += 40; 13640: HFS.hfsStrategy (); 13641: break; 13642: case XEiJ.EMX_OPCODE_HFSINT & 63: 13643: XEiJ.mpuCycleCount += 40; 13644: //XEiJ.mpuClockTime += (int) (TMR_FREQ / 100000L); //0.01ms 13645: if (HFS.hfsInterrupt ()) { 13646: //WAIT 13647: XEiJ.mpuTraceFlag = 0; //トレース例外を発生させない 13648: XEiJ.regPC = XEiJ.regPC0; //ループ 13649: XEiJ.mpuClockTime += XEiJ.TMR_FREQ * 4 / 1000000; //4μs。10MHzのとき40clk 13650: XEiJ.mpuLastNano += 4000L; 13651: } 13652: break; 13653: case XEiJ.EMX_OPCODE_EMXNOP & 63: 13654: XEiJ.emxNop (); 13655: break; 13656: default: 13657: XEiJ.mpuCycleCount += 34; 13658: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 13659: throw M68kException.m6eSignal; 13660: } 13661: } //irpEmx 13662: 13663: 13664: 13665: //irpSetPC (a) 13666: // pcへデータを書き込む 13667: // 奇数のときはアドレスエラーが発生する 13668: public static void irpSetPC (int a) throws M68kException { 13669: if (XEiJ.TEST_BIT_0_SHIFT ? a << 31 - 0 < 0 : (a & 1) != 0) { 13670: M68kException.m6eNumber = M68kException.M6E_ADDRESS_ERROR; 13671: M68kException.m6eAddress = a; 13672: M68kException.m6eDirection = XEiJ.MPU_WR_READ; 13673: M68kException.m6eSize = XEiJ.MPU_SS_LONG; 13674: throw M68kException.m6eSignal; 13675: } 13676: if (BranchLog.BLG_ON) { 13677: //BranchLog.blgJump (a); //分岐ログに分岐レコードを追加する 13678: if (BranchLog.blgPrevHeadSuper != (BranchLog.blgHead | BranchLog.blgSuper) || BranchLog.blgPrevTail != XEiJ.regPC0) { //前回のレコードと異なるとき 13679: int i = (char) BranchLog.blgNewestRecord++ << BranchLog.BLG_RECORD_SHIFT; 13680: BranchLog.blgArray[i] = BranchLog.blgPrevHeadSuper = BranchLog.blgHead | BranchLog.blgSuper; 13681: BranchLog.blgArray[i + 1] = BranchLog.blgPrevTail = XEiJ.regPC0; 13682: } 13683: BranchLog.blgHead = XEiJ.regPC = a; 13684: BranchLog.blgSuper = XEiJ.regSRS >>> 13; 13685: } else { 13686: XEiJ.regPC = a; 13687: } 13688: } //irpSetPC 13689: 13690: //irpSetSR (newSr) 13691: // srへデータを書き込む 13692: // ori to sr/andi to sr/eori to sr/move to sr/stop/rteで使用される 13693: // スーパーバイザモードになっていることを確認してから呼び出すこと 13694: // rteではr[15]が指すアドレスからsrとpcを取り出してr[15]を更新してから呼び出すこと 13695: // スーパーバイザモード→ユーザモードのときは移行のための処理を行う 13696: // 新しい割り込みマスクレベルよりも高い割り込み処理の終了をデバイスに通知する 13697: public static void irpSetSR (int newSr) { 13698: XEiJ.regSRT1 = XEiJ.REG_SR_T1 & newSr; 13699: if ((XEiJ.regSRS = XEiJ.REG_SR_S & newSr) == 0) { //スーパーバイザモード→ユーザモード 13700: XEiJ.mpuISP = XEiJ.regRn[15]; //XEiJ.mpuISPを保存 13701: XEiJ.regRn[15] = XEiJ.mpuUSP; //XEiJ.mpuUSPを復元 13702: if (DataBreakPoint.DBP_ON) { 13703: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpUserMap; //ユーザメモリマップに切り替える 13704: } else { 13705: XEiJ.busMemoryMap = XEiJ.busUserMap; //ユーザメモリマップに切り替える 13706: } 13707: if (InstructionBreakPoint.IBP_ON) { 13708: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1UserMap; 13709: } 13710: } 13711: int t = (XEiJ.mpuIMR = 0x7f >> ((XEiJ.regSRI = XEiJ.REG_SR_I & newSr) >> 8)) & XEiJ.mpuISR; //XEiJ.mpuISRで1→0とするビット 13712: if (t != 0) { //終了する割り込みがあるとき 13713: XEiJ.mpuISR ^= t; 13714: //デバイスに割り込み処理の終了を通知する 13715: if (t == XEiJ.MPU_MFP_INTERRUPT_MASK) { //MFPのみ 13716: MC68901.mfpDone (); 13717: } else if (t == XEiJ.MPU_DMA_INTERRUPT_MASK) { //DMAのみ 13718: HD63450.dmaDone (); 13719: } else if (t == XEiJ.MPU_SCC_INTERRUPT_MASK) { //SCCのみ 13720: Z8530.sccDone (); 13721: } else if (t == XEiJ.MPU_IOI_INTERRUPT_MASK) { //IOIのみ 13722: IOInterrupt.ioiDone (); 13723: } else if (t == XEiJ.MPU_EB2_INTERRUPT_MASK) { //EB2のみ 13724: XEiJ.eb2Done (); 13725: } else { //SYSのみまたは複数 13726: if (XEiJ.TEST_BIT_1_SHIFT ? t << 24 + XEiJ.MPU_MFP_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_MFP_INTERRUPT_MASK) != 0) { 13727: MC68901.mfpDone (); 13728: } 13729: if (t << 24 + XEiJ.MPU_DMA_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_DMA_INTERRUPT_MASK) != 0 13730: HD63450.dmaDone (); 13731: } 13732: if (XEiJ.TEST_BIT_2_SHIFT ? t << 24 + XEiJ.MPU_SCC_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SCC_INTERRUPT_MASK) != 0) { 13733: Z8530.sccDone (); 13734: } 13735: if (t << 24 + XEiJ.MPU_IOI_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_IOI_INTERRUPT_MASK) != 0 13736: IOInterrupt.ioiDone (); 13737: } 13738: if (t << 24 + XEiJ.MPU_EB2_INTERRUPT_LEVEL < 0) { //(t & XEiJ.MPU_EB2_INTERRUPT_MASK) != 0 13739: XEiJ.eb2Done (); 13740: } 13741: if (XEiJ.TEST_BIT_0_SHIFT ? t << 24 + XEiJ.MPU_SYS_INTERRUPT_LEVEL < 0 : (t & XEiJ.MPU_SYS_INTERRUPT_MASK) != 0) { 13742: XEiJ.sysDone (); 13743: } 13744: } 13745: } 13746: XEiJ.mpuIMR |= ~XEiJ.mpuISR & XEiJ.MPU_SYS_INTERRUPT_MASK; //割り込みマスクレベルが7のときレベル7割り込みの処理中でなければレベル7割り込みを許可する 13747: XEiJ.regCCR = XEiJ.REG_CCR_MASK & newSr; 13748: } //irpSetSR 13749: 13750: //irpInterrupt (vectorNumber, level) 13751: // 割り込み処理を開始する 13752: public static void irpInterrupt (int vectorNumber, int level) throws M68kException { 13753: if (XEiJ.regOC == 0b0100_111_001_110_010) { //最後に実行した命令はSTOP命令 13754: XEiJ.regPC = XEiJ.regPC0 + 4; //次の命令に進む 13755: } 13756: XEiJ.mpuClockTime += XEiJ.mpuModifiedUnit * 44; 13757: int save_sr = XEiJ.regSRT1 | XEiJ.regSRS | XEiJ.regSRI | XEiJ.regCCR; 13758: XEiJ.regSRI = level << 8; //割り込みマスクを要求されたレベルに変更する 13759: XEiJ.mpuIMR = 0x7f >> level; 13760: XEiJ.mpuISR |= 0x80 >> level; 13761: int sp = XEiJ.regRn[15]; 13762: XEiJ.regSRT1 = 0; //srのTビットを消す 13763: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13764: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13765: XEiJ.mpuUSP = sp; //USPを保存 13766: sp = XEiJ.mpuISP; //SSPを復元 13767: if (DataBreakPoint.DBP_ON) { 13768: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13769: } else { 13770: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13771: } 13772: if (InstructionBreakPoint.IBP_ON) { 13773: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13774: } 13775: } 13776: int vectorOffset = vectorNumber << 2; //vector offset 13777: XEiJ.regRn[15] = sp -= 8; //short format 13778: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 13779: XEiJ.busWl (sp + 2, XEiJ.regPC); //program counter 13780: XEiJ.busWw (sp, save_sr); //status register 13781: if (BranchLog.BLG_ON) { 13782: XEiJ.regPC0 = XEiJ.regPC; //rteによる割り込み終了と同時に次の割り込みを受け付けたとき間でpc0を更新しないと2番目の分岐レコードの終了アドレスが1番目と同じになっておかしな分岐レコードができてしまう 13783: } 13784: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 13785: } //irpInterrupt 13786: 13787: //irpException (vectorNumber, save_pc, save_sr) 13788: // 例外処理を開始する 13789: // スタックへのプッシュ、ベクタの取り出し、ジャンプのいずれかでバスエラーまたはアドレスエラーが発生する場合がある 13790: public static void irpException (int vectorNumber, int save_pc, int save_sr) throws M68kException { 13791: int sp = XEiJ.regRn[15]; 13792: XEiJ.regSRT1 = XEiJ.mpuTraceFlag = 0; //srのTビットを消す 13793: if (XEiJ.regSRS == 0) { //ユーザモードのとき 13794: XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する 13795: XEiJ.mpuUSP = sp; //USPを保存 13796: sp = XEiJ.mpuISP; //SSPを復元 13797: if (DataBreakPoint.DBP_ON) { 13798: DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える 13799: } else { 13800: XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える 13801: } 13802: if (InstructionBreakPoint.IBP_ON) { 13803: InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap; 13804: } 13805: } 13806: int vectorOffset = vectorNumber << 2; //vector offset 13807: XEiJ.regRn[15] = sp -= 8; //short format 13808: XEiJ.busWw (sp + 6, 0x0000 | vectorOffset); //format and vector offset 13809: XEiJ.busWl (sp + 2, save_pc); //program counter 13810: XEiJ.busWw (sp, save_sr); //status register 13811: irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + vectorOffset)); //例外ベクタを取り出してジャンプする 13812: } //irpException 13813: 13814: 13815: 13816: //a = efaAnyByte (ea) //| M+-WXZPI| 13817: // 任意のモードのバイトオペランドの実効アドレスを求める 13818: // (A7)+と-(A7)はA7を奇偶に関わらず2変化させ、跨いだワードの上位バイト(アドレスの小さい方)を参照する 13819: // #<data>はオペコードに続くワードの下位バイトを参照する。上位バイトは不定なので参照してはならない 13820: @SuppressWarnings ("fallthrough") public static int efaAnyByte (int ea) throws M68kException { 13821: int t, w; 13822: switch (ea) { 13823: case 0b010_000: //(A0) 13824: if (XEiJ.EFA_SEPARATE_AR) { 13825: XEiJ.mpuCycleCount += 4; 13826: return XEiJ.regRn[ 8]; 13827: } 13828: //fallthrough 13829: case 0b010_001: //(A1) 13830: if (XEiJ.EFA_SEPARATE_AR) { 13831: XEiJ.mpuCycleCount += 4; 13832: return XEiJ.regRn[ 9]; 13833: } 13834: //fallthrough 13835: case 0b010_010: //(A2) 13836: if (XEiJ.EFA_SEPARATE_AR) { 13837: XEiJ.mpuCycleCount += 4; 13838: return XEiJ.regRn[10]; 13839: } 13840: //fallthrough 13841: case 0b010_011: //(A3) 13842: if (XEiJ.EFA_SEPARATE_AR) { 13843: XEiJ.mpuCycleCount += 4; 13844: return XEiJ.regRn[11]; 13845: } 13846: //fallthrough 13847: case 0b010_100: //(A4) 13848: if (XEiJ.EFA_SEPARATE_AR) { 13849: XEiJ.mpuCycleCount += 4; 13850: return XEiJ.regRn[12]; 13851: } 13852: //fallthrough 13853: case 0b010_101: //(A5) 13854: if (XEiJ.EFA_SEPARATE_AR) { 13855: XEiJ.mpuCycleCount += 4; 13856: return XEiJ.regRn[13]; 13857: } 13858: //fallthrough 13859: case 0b010_110: //(A6) 13860: if (XEiJ.EFA_SEPARATE_AR) { 13861: XEiJ.mpuCycleCount += 4; 13862: return XEiJ.regRn[14]; 13863: } 13864: //fallthrough 13865: case 0b010_111: //(A7) 13866: if (XEiJ.EFA_SEPARATE_AR) { 13867: XEiJ.mpuCycleCount += 4; 13868: return XEiJ.regRn[15]; 13869: } else { 13870: XEiJ.mpuCycleCount += 4; 13871: return XEiJ.regRn[ea - (0b010_000 - 8)]; 13872: } 13873: case 0b011_000: //(A0)+ 13874: if (XEiJ.EFA_SEPARATE_AR) { 13875: XEiJ.mpuCycleCount += 4; 13876: return XEiJ.regRn[ 8]++; 13877: } 13878: //fallthrough 13879: case 0b011_001: //(A1)+ 13880: if (XEiJ.EFA_SEPARATE_AR) { 13881: XEiJ.mpuCycleCount += 4; 13882: return XEiJ.regRn[ 9]++; 13883: } 13884: //fallthrough 13885: case 0b011_010: //(A2)+ 13886: if (XEiJ.EFA_SEPARATE_AR) { 13887: XEiJ.mpuCycleCount += 4; 13888: return XEiJ.regRn[10]++; 13889: } 13890: //fallthrough 13891: case 0b011_011: //(A3)+ 13892: if (XEiJ.EFA_SEPARATE_AR) { 13893: XEiJ.mpuCycleCount += 4; 13894: return XEiJ.regRn[11]++; 13895: } 13896: //fallthrough 13897: case 0b011_100: //(A4)+ 13898: if (XEiJ.EFA_SEPARATE_AR) { 13899: XEiJ.mpuCycleCount += 4; 13900: return XEiJ.regRn[12]++; 13901: } 13902: //fallthrough 13903: case 0b011_101: //(A5)+ 13904: if (XEiJ.EFA_SEPARATE_AR) { 13905: XEiJ.mpuCycleCount += 4; 13906: return XEiJ.regRn[13]++; 13907: } 13908: //fallthrough 13909: case 0b011_110: //(A6)+ 13910: if (XEiJ.EFA_SEPARATE_AR) { 13911: XEiJ.mpuCycleCount += 4; 13912: return XEiJ.regRn[14]++; 13913: } else { 13914: XEiJ.mpuCycleCount += 4; 13915: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 13916: } 13917: case 0b011_111: //(A7)+ 13918: XEiJ.mpuCycleCount += 4; 13919: return (XEiJ.regRn[15] += 2) - 2; 13920: case 0b100_000: //-(A0) 13921: if (XEiJ.EFA_SEPARATE_AR) { 13922: XEiJ.mpuCycleCount += 6; 13923: return --XEiJ.regRn[ 8]; 13924: } 13925: //fallthrough 13926: case 0b100_001: //-(A1) 13927: if (XEiJ.EFA_SEPARATE_AR) { 13928: XEiJ.mpuCycleCount += 6; 13929: return --XEiJ.regRn[ 9]; 13930: } 13931: //fallthrough 13932: case 0b100_010: //-(A2) 13933: if (XEiJ.EFA_SEPARATE_AR) { 13934: XEiJ.mpuCycleCount += 6; 13935: return --XEiJ.regRn[10]; 13936: } 13937: //fallthrough 13938: case 0b100_011: //-(A3) 13939: if (XEiJ.EFA_SEPARATE_AR) { 13940: XEiJ.mpuCycleCount += 6; 13941: return --XEiJ.regRn[11]; 13942: } 13943: //fallthrough 13944: case 0b100_100: //-(A4) 13945: if (XEiJ.EFA_SEPARATE_AR) { 13946: XEiJ.mpuCycleCount += 6; 13947: return --XEiJ.regRn[12]; 13948: } 13949: //fallthrough 13950: case 0b100_101: //-(A5) 13951: if (XEiJ.EFA_SEPARATE_AR) { 13952: XEiJ.mpuCycleCount += 6; 13953: return --XEiJ.regRn[13]; 13954: } 13955: //fallthrough 13956: case 0b100_110: //-(A6) 13957: if (XEiJ.EFA_SEPARATE_AR) { 13958: XEiJ.mpuCycleCount += 6; 13959: return --XEiJ.regRn[14]; 13960: } else { 13961: XEiJ.mpuCycleCount += 6; 13962: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 13963: } 13964: case 0b100_111: //-(A7) 13965: XEiJ.mpuCycleCount += 6; 13966: return XEiJ.regRn[15] -= 2; 13967: case 0b101_000: //(d16,A0) 13968: case 0b101_001: //(d16,A1) 13969: case 0b101_010: //(d16,A2) 13970: case 0b101_011: //(d16,A3) 13971: case 0b101_100: //(d16,A4) 13972: case 0b101_101: //(d16,A5) 13973: case 0b101_110: //(d16,A6) 13974: case 0b101_111: //(d16,A7) 13975: XEiJ.mpuCycleCount += 8; 13976: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 13977: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 13978: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 13979: } else { 13980: t = XEiJ.regPC; 13981: XEiJ.regPC = t + 2; 13982: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 13983: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 13984: } 13985: case 0b110_000: //(d8,A0,Rn.wl) 13986: case 0b110_001: //(d8,A1,Rn.wl) 13987: case 0b110_010: //(d8,A2,Rn.wl) 13988: case 0b110_011: //(d8,A3,Rn.wl) 13989: case 0b110_100: //(d8,A4,Rn.wl) 13990: case 0b110_101: //(d8,A5,Rn.wl) 13991: case 0b110_110: //(d8,A6,Rn.wl) 13992: case 0b110_111: //(d8,A7,Rn.wl) 13993: XEiJ.mpuCycleCount += 10; 13994: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 13995: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 13996: } else { 13997: w = XEiJ.regPC; 13998: XEiJ.regPC = w + 2; 13999: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14000: } 14001: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14002: + (byte) w //バイトディスプレースメント 14003: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14004: XEiJ.regRn[w >> 12])); //ロングインデックス 14005: case 0b111_000: //(xxx).W 14006: XEiJ.mpuCycleCount += 8; 14007: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14008: case 0b111_001: //(xxx).L 14009: XEiJ.mpuCycleCount += 12; 14010: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14011: case 0b111_010: //(d16,PC) 14012: XEiJ.mpuCycleCount += 8; 14013: t = XEiJ.regPC; 14014: XEiJ.regPC = t + 2; 14015: return (t //ベースレジスタ 14016: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14017: case 0b111_011: //(d8,PC,Rn.wl) 14018: XEiJ.mpuCycleCount += 10; 14019: t = XEiJ.regPC; 14020: XEiJ.regPC = t + 2; 14021: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14022: return (t //ベースレジスタ 14023: + (byte) w //バイトディスプレースメント 14024: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14025: XEiJ.regRn[w >> 12])); //ロングインデックス 14026: case 0b111_100: //#<data> 14027: XEiJ.mpuCycleCount += 4; 14028: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14029: return (XEiJ.regPC += 2) - 1; //下位バイト 14030: } else { 14031: t = XEiJ.regPC; 14032: XEiJ.regPC = t + 2; 14033: return t + 1; //下位バイト 14034: } 14035: } //switch 14036: XEiJ.mpuCycleCount += 34; 14037: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14038: throw M68kException.m6eSignal; 14039: } //efaAnyByte 14040: 14041: //a = efaMemByte (ea) //| M+-WXZP | 14042: // メモリモードのバイトオペランドの実効アドレスを求める 14043: // efaAnyByteとの違いは#<data>がないこと 14044: @SuppressWarnings ("fallthrough") public static int efaMemByte (int ea) throws M68kException { 14045: int t, w; 14046: switch (ea) { 14047: case 0b010_000: //(A0) 14048: if (XEiJ.EFA_SEPARATE_AR) { 14049: XEiJ.mpuCycleCount += 4; 14050: return XEiJ.regRn[ 8]; 14051: } 14052: //fallthrough 14053: case 0b010_001: //(A1) 14054: if (XEiJ.EFA_SEPARATE_AR) { 14055: XEiJ.mpuCycleCount += 4; 14056: return XEiJ.regRn[ 9]; 14057: } 14058: //fallthrough 14059: case 0b010_010: //(A2) 14060: if (XEiJ.EFA_SEPARATE_AR) { 14061: XEiJ.mpuCycleCount += 4; 14062: return XEiJ.regRn[10]; 14063: } 14064: //fallthrough 14065: case 0b010_011: //(A3) 14066: if (XEiJ.EFA_SEPARATE_AR) { 14067: XEiJ.mpuCycleCount += 4; 14068: return XEiJ.regRn[11]; 14069: } 14070: //fallthrough 14071: case 0b010_100: //(A4) 14072: if (XEiJ.EFA_SEPARATE_AR) { 14073: XEiJ.mpuCycleCount += 4; 14074: return XEiJ.regRn[12]; 14075: } 14076: //fallthrough 14077: case 0b010_101: //(A5) 14078: if (XEiJ.EFA_SEPARATE_AR) { 14079: XEiJ.mpuCycleCount += 4; 14080: return XEiJ.regRn[13]; 14081: } 14082: //fallthrough 14083: case 0b010_110: //(A6) 14084: if (XEiJ.EFA_SEPARATE_AR) { 14085: XEiJ.mpuCycleCount += 4; 14086: return XEiJ.regRn[14]; 14087: } 14088: //fallthrough 14089: case 0b010_111: //(A7) 14090: if (XEiJ.EFA_SEPARATE_AR) { 14091: XEiJ.mpuCycleCount += 4; 14092: return XEiJ.regRn[15]; 14093: } else { 14094: XEiJ.mpuCycleCount += 4; 14095: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14096: } 14097: case 0b011_000: //(A0)+ 14098: if (XEiJ.EFA_SEPARATE_AR) { 14099: XEiJ.mpuCycleCount += 4; 14100: return XEiJ.regRn[ 8]++; 14101: } 14102: //fallthrough 14103: case 0b011_001: //(A1)+ 14104: if (XEiJ.EFA_SEPARATE_AR) { 14105: XEiJ.mpuCycleCount += 4; 14106: return XEiJ.regRn[ 9]++; 14107: } 14108: //fallthrough 14109: case 0b011_010: //(A2)+ 14110: if (XEiJ.EFA_SEPARATE_AR) { 14111: XEiJ.mpuCycleCount += 4; 14112: return XEiJ.regRn[10]++; 14113: } 14114: //fallthrough 14115: case 0b011_011: //(A3)+ 14116: if (XEiJ.EFA_SEPARATE_AR) { 14117: XEiJ.mpuCycleCount += 4; 14118: return XEiJ.regRn[11]++; 14119: } 14120: //fallthrough 14121: case 0b011_100: //(A4)+ 14122: if (XEiJ.EFA_SEPARATE_AR) { 14123: XEiJ.mpuCycleCount += 4; 14124: return XEiJ.regRn[12]++; 14125: } 14126: //fallthrough 14127: case 0b011_101: //(A5)+ 14128: if (XEiJ.EFA_SEPARATE_AR) { 14129: XEiJ.mpuCycleCount += 4; 14130: return XEiJ.regRn[13]++; 14131: } 14132: //fallthrough 14133: case 0b011_110: //(A6)+ 14134: if (XEiJ.EFA_SEPARATE_AR) { 14135: XEiJ.mpuCycleCount += 4; 14136: return XEiJ.regRn[14]++; 14137: } else { 14138: XEiJ.mpuCycleCount += 4; 14139: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 14140: } 14141: case 0b011_111: //(A7)+ 14142: XEiJ.mpuCycleCount += 4; 14143: return (XEiJ.regRn[15] += 2) - 2; 14144: case 0b100_000: //-(A0) 14145: if (XEiJ.EFA_SEPARATE_AR) { 14146: XEiJ.mpuCycleCount += 6; 14147: return --XEiJ.regRn[ 8]; 14148: } 14149: //fallthrough 14150: case 0b100_001: //-(A1) 14151: if (XEiJ.EFA_SEPARATE_AR) { 14152: XEiJ.mpuCycleCount += 6; 14153: return --XEiJ.regRn[ 9]; 14154: } 14155: //fallthrough 14156: case 0b100_010: //-(A2) 14157: if (XEiJ.EFA_SEPARATE_AR) { 14158: XEiJ.mpuCycleCount += 6; 14159: return --XEiJ.regRn[10]; 14160: } 14161: //fallthrough 14162: case 0b100_011: //-(A3) 14163: if (XEiJ.EFA_SEPARATE_AR) { 14164: XEiJ.mpuCycleCount += 6; 14165: return --XEiJ.regRn[11]; 14166: } 14167: //fallthrough 14168: case 0b100_100: //-(A4) 14169: if (XEiJ.EFA_SEPARATE_AR) { 14170: XEiJ.mpuCycleCount += 6; 14171: return --XEiJ.regRn[12]; 14172: } 14173: //fallthrough 14174: case 0b100_101: //-(A5) 14175: if (XEiJ.EFA_SEPARATE_AR) { 14176: XEiJ.mpuCycleCount += 6; 14177: return --XEiJ.regRn[13]; 14178: } 14179: //fallthrough 14180: case 0b100_110: //-(A6) 14181: if (XEiJ.EFA_SEPARATE_AR) { 14182: XEiJ.mpuCycleCount += 6; 14183: return --XEiJ.regRn[14]; 14184: } else { 14185: XEiJ.mpuCycleCount += 6; 14186: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 14187: } 14188: case 0b100_111: //-(A7) 14189: XEiJ.mpuCycleCount += 6; 14190: return XEiJ.regRn[15] -= 2; 14191: case 0b101_000: //(d16,A0) 14192: case 0b101_001: //(d16,A1) 14193: case 0b101_010: //(d16,A2) 14194: case 0b101_011: //(d16,A3) 14195: case 0b101_100: //(d16,A4) 14196: case 0b101_101: //(d16,A5) 14197: case 0b101_110: //(d16,A6) 14198: case 0b101_111: //(d16,A7) 14199: XEiJ.mpuCycleCount += 8; 14200: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14201: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14202: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14203: } else { 14204: t = XEiJ.regPC; 14205: XEiJ.regPC = t + 2; 14206: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14207: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14208: } 14209: case 0b110_000: //(d8,A0,Rn.wl) 14210: case 0b110_001: //(d8,A1,Rn.wl) 14211: case 0b110_010: //(d8,A2,Rn.wl) 14212: case 0b110_011: //(d8,A3,Rn.wl) 14213: case 0b110_100: //(d8,A4,Rn.wl) 14214: case 0b110_101: //(d8,A5,Rn.wl) 14215: case 0b110_110: //(d8,A6,Rn.wl) 14216: case 0b110_111: //(d8,A7,Rn.wl) 14217: XEiJ.mpuCycleCount += 10; 14218: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14219: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14220: } else { 14221: w = XEiJ.regPC; 14222: XEiJ.regPC = w + 2; 14223: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14224: } 14225: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14226: + (byte) w //バイトディスプレースメント 14227: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14228: XEiJ.regRn[w >> 12])); //ロングインデックス 14229: case 0b111_000: //(xxx).W 14230: XEiJ.mpuCycleCount += 8; 14231: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14232: case 0b111_001: //(xxx).L 14233: XEiJ.mpuCycleCount += 12; 14234: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14235: case 0b111_010: //(d16,PC) 14236: XEiJ.mpuCycleCount += 8; 14237: t = XEiJ.regPC; 14238: XEiJ.regPC = t + 2; 14239: return (t //ベースレジスタ 14240: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14241: case 0b111_011: //(d8,PC,Rn.wl) 14242: XEiJ.mpuCycleCount += 10; 14243: t = XEiJ.regPC; 14244: XEiJ.regPC = t + 2; 14245: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14246: return (t //ベースレジスタ 14247: + (byte) w //バイトディスプレースメント 14248: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14249: XEiJ.regRn[w >> 12])); //ロングインデックス 14250: } //switch 14251: XEiJ.mpuCycleCount += 34; 14252: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14253: throw M68kException.m6eSignal; 14254: } //efaMemByte 14255: 14256: //a = efaMltByte (ea) //| M+-WXZ | 14257: // メモリ可変モードのバイトオペランドの実効アドレスを求める 14258: // efaMemByteとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 14259: @SuppressWarnings ("fallthrough") public static int efaMltByte (int ea) throws M68kException { 14260: int t, w; 14261: switch (ea) { 14262: case 0b010_000: //(A0) 14263: if (XEiJ.EFA_SEPARATE_AR) { 14264: XEiJ.mpuCycleCount += 4; 14265: return XEiJ.regRn[ 8]; 14266: } 14267: //fallthrough 14268: case 0b010_001: //(A1) 14269: if (XEiJ.EFA_SEPARATE_AR) { 14270: XEiJ.mpuCycleCount += 4; 14271: return XEiJ.regRn[ 9]; 14272: } 14273: //fallthrough 14274: case 0b010_010: //(A2) 14275: if (XEiJ.EFA_SEPARATE_AR) { 14276: XEiJ.mpuCycleCount += 4; 14277: return XEiJ.regRn[10]; 14278: } 14279: //fallthrough 14280: case 0b010_011: //(A3) 14281: if (XEiJ.EFA_SEPARATE_AR) { 14282: XEiJ.mpuCycleCount += 4; 14283: return XEiJ.regRn[11]; 14284: } 14285: //fallthrough 14286: case 0b010_100: //(A4) 14287: if (XEiJ.EFA_SEPARATE_AR) { 14288: XEiJ.mpuCycleCount += 4; 14289: return XEiJ.regRn[12]; 14290: } 14291: //fallthrough 14292: case 0b010_101: //(A5) 14293: if (XEiJ.EFA_SEPARATE_AR) { 14294: XEiJ.mpuCycleCount += 4; 14295: return XEiJ.regRn[13]; 14296: } 14297: //fallthrough 14298: case 0b010_110: //(A6) 14299: if (XEiJ.EFA_SEPARATE_AR) { 14300: XEiJ.mpuCycleCount += 4; 14301: return XEiJ.regRn[14]; 14302: } 14303: //fallthrough 14304: case 0b010_111: //(A7) 14305: if (XEiJ.EFA_SEPARATE_AR) { 14306: XEiJ.mpuCycleCount += 4; 14307: return XEiJ.regRn[15]; 14308: } else { 14309: XEiJ.mpuCycleCount += 4; 14310: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14311: } 14312: case 0b011_000: //(A0)+ 14313: if (XEiJ.EFA_SEPARATE_AR) { 14314: XEiJ.mpuCycleCount += 4; 14315: return XEiJ.regRn[ 8]++; 14316: } 14317: //fallthrough 14318: case 0b011_001: //(A1)+ 14319: if (XEiJ.EFA_SEPARATE_AR) { 14320: XEiJ.mpuCycleCount += 4; 14321: return XEiJ.regRn[ 9]++; 14322: } 14323: //fallthrough 14324: case 0b011_010: //(A2)+ 14325: if (XEiJ.EFA_SEPARATE_AR) { 14326: XEiJ.mpuCycleCount += 4; 14327: return XEiJ.regRn[10]++; 14328: } 14329: //fallthrough 14330: case 0b011_011: //(A3)+ 14331: if (XEiJ.EFA_SEPARATE_AR) { 14332: XEiJ.mpuCycleCount += 4; 14333: return XEiJ.regRn[11]++; 14334: } 14335: //fallthrough 14336: case 0b011_100: //(A4)+ 14337: if (XEiJ.EFA_SEPARATE_AR) { 14338: XEiJ.mpuCycleCount += 4; 14339: return XEiJ.regRn[12]++; 14340: } 14341: //fallthrough 14342: case 0b011_101: //(A5)+ 14343: if (XEiJ.EFA_SEPARATE_AR) { 14344: XEiJ.mpuCycleCount += 4; 14345: return XEiJ.regRn[13]++; 14346: } 14347: //fallthrough 14348: case 0b011_110: //(A6)+ 14349: if (XEiJ.EFA_SEPARATE_AR) { 14350: XEiJ.mpuCycleCount += 4; 14351: return XEiJ.regRn[14]++; 14352: } else { 14353: XEiJ.mpuCycleCount += 4; 14354: return XEiJ.regRn[ea - (0b011_000 - 8)]++; 14355: } 14356: case 0b011_111: //(A7)+ 14357: XEiJ.mpuCycleCount += 4; 14358: return (XEiJ.regRn[15] += 2) - 2; 14359: case 0b100_000: //-(A0) 14360: if (XEiJ.EFA_SEPARATE_AR) { 14361: XEiJ.mpuCycleCount += 6; 14362: return --XEiJ.regRn[ 8]; 14363: } 14364: //fallthrough 14365: case 0b100_001: //-(A1) 14366: if (XEiJ.EFA_SEPARATE_AR) { 14367: XEiJ.mpuCycleCount += 6; 14368: return --XEiJ.regRn[ 9]; 14369: } 14370: //fallthrough 14371: case 0b100_010: //-(A2) 14372: if (XEiJ.EFA_SEPARATE_AR) { 14373: XEiJ.mpuCycleCount += 6; 14374: return --XEiJ.regRn[10]; 14375: } 14376: //fallthrough 14377: case 0b100_011: //-(A3) 14378: if (XEiJ.EFA_SEPARATE_AR) { 14379: XEiJ.mpuCycleCount += 6; 14380: return --XEiJ.regRn[11]; 14381: } 14382: //fallthrough 14383: case 0b100_100: //-(A4) 14384: if (XEiJ.EFA_SEPARATE_AR) { 14385: XEiJ.mpuCycleCount += 6; 14386: return --XEiJ.regRn[12]; 14387: } 14388: //fallthrough 14389: case 0b100_101: //-(A5) 14390: if (XEiJ.EFA_SEPARATE_AR) { 14391: XEiJ.mpuCycleCount += 6; 14392: return --XEiJ.regRn[13]; 14393: } 14394: //fallthrough 14395: case 0b100_110: //-(A6) 14396: if (XEiJ.EFA_SEPARATE_AR) { 14397: XEiJ.mpuCycleCount += 6; 14398: return --XEiJ.regRn[14]; 14399: } else { 14400: XEiJ.mpuCycleCount += 6; 14401: return --XEiJ.regRn[ea - (0b100_000 - 8)]; 14402: } 14403: case 0b100_111: //-(A7) 14404: XEiJ.mpuCycleCount += 6; 14405: return XEiJ.regRn[15] -= 2; 14406: case 0b101_000: //(d16,A0) 14407: case 0b101_001: //(d16,A1) 14408: case 0b101_010: //(d16,A2) 14409: case 0b101_011: //(d16,A3) 14410: case 0b101_100: //(d16,A4) 14411: case 0b101_101: //(d16,A5) 14412: case 0b101_110: //(d16,A6) 14413: case 0b101_111: //(d16,A7) 14414: XEiJ.mpuCycleCount += 8; 14415: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14416: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14417: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14418: } else { 14419: t = XEiJ.regPC; 14420: XEiJ.regPC = t + 2; 14421: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14422: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14423: } 14424: case 0b110_000: //(d8,A0,Rn.wl) 14425: case 0b110_001: //(d8,A1,Rn.wl) 14426: case 0b110_010: //(d8,A2,Rn.wl) 14427: case 0b110_011: //(d8,A3,Rn.wl) 14428: case 0b110_100: //(d8,A4,Rn.wl) 14429: case 0b110_101: //(d8,A5,Rn.wl) 14430: case 0b110_110: //(d8,A6,Rn.wl) 14431: case 0b110_111: //(d8,A7,Rn.wl) 14432: XEiJ.mpuCycleCount += 10; 14433: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14434: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14435: } else { 14436: w = XEiJ.regPC; 14437: XEiJ.regPC = w + 2; 14438: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14439: } 14440: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14441: + (byte) w //バイトディスプレースメント 14442: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14443: XEiJ.regRn[w >> 12])); //ロングインデックス 14444: case 0b111_000: //(xxx).W 14445: XEiJ.mpuCycleCount += 8; 14446: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14447: case 0b111_001: //(xxx).L 14448: XEiJ.mpuCycleCount += 12; 14449: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14450: } //switch 14451: XEiJ.mpuCycleCount += 34; 14452: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14453: throw M68kException.m6eSignal; 14454: } //efaMltByte 14455: 14456: //a = efaCntByte (ea) //| M WXZP | 14457: // 制御モードのロングオペランドの実効アドレスを求める 14458: // efaMemByteとの違いは(Ar)+と-(Ar)がないこと 14459: @SuppressWarnings ("fallthrough") public static int efaCntByte (int ea) throws M68kException { 14460: int t, w; 14461: switch (ea) { 14462: case 0b010_000: //(A0) 14463: if (XEiJ.EFA_SEPARATE_AR) { 14464: XEiJ.mpuCycleCount += 4; 14465: return XEiJ.regRn[ 8]; 14466: } 14467: //fallthrough 14468: case 0b010_001: //(A1) 14469: if (XEiJ.EFA_SEPARATE_AR) { 14470: XEiJ.mpuCycleCount += 4; 14471: return XEiJ.regRn[ 9]; 14472: } 14473: //fallthrough 14474: case 0b010_010: //(A2) 14475: if (XEiJ.EFA_SEPARATE_AR) { 14476: XEiJ.mpuCycleCount += 4; 14477: return XEiJ.regRn[10]; 14478: } 14479: //fallthrough 14480: case 0b010_011: //(A3) 14481: if (XEiJ.EFA_SEPARATE_AR) { 14482: XEiJ.mpuCycleCount += 4; 14483: return XEiJ.regRn[11]; 14484: } 14485: //fallthrough 14486: case 0b010_100: //(A4) 14487: if (XEiJ.EFA_SEPARATE_AR) { 14488: XEiJ.mpuCycleCount += 4; 14489: return XEiJ.regRn[12]; 14490: } 14491: //fallthrough 14492: case 0b010_101: //(A5) 14493: if (XEiJ.EFA_SEPARATE_AR) { 14494: XEiJ.mpuCycleCount += 4; 14495: return XEiJ.regRn[13]; 14496: } 14497: //fallthrough 14498: case 0b010_110: //(A6) 14499: if (XEiJ.EFA_SEPARATE_AR) { 14500: XEiJ.mpuCycleCount += 4; 14501: return XEiJ.regRn[14]; 14502: } 14503: //fallthrough 14504: case 0b010_111: //(A7) 14505: if (XEiJ.EFA_SEPARATE_AR) { 14506: XEiJ.mpuCycleCount += 4; 14507: return XEiJ.regRn[15]; 14508: } else { 14509: XEiJ.mpuCycleCount += 4; 14510: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14511: } 14512: case 0b101_000: //(d16,A0) 14513: case 0b101_001: //(d16,A1) 14514: case 0b101_010: //(d16,A2) 14515: case 0b101_011: //(d16,A3) 14516: case 0b101_100: //(d16,A4) 14517: case 0b101_101: //(d16,A5) 14518: case 0b101_110: //(d16,A6) 14519: case 0b101_111: //(d16,A7) 14520: XEiJ.mpuCycleCount += 8; 14521: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14522: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14523: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14524: } else { 14525: t = XEiJ.regPC; 14526: XEiJ.regPC = t + 2; 14527: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14528: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14529: } 14530: case 0b110_000: //(d8,A0,Rn.wl) 14531: case 0b110_001: //(d8,A1,Rn.wl) 14532: case 0b110_010: //(d8,A2,Rn.wl) 14533: case 0b110_011: //(d8,A3,Rn.wl) 14534: case 0b110_100: //(d8,A4,Rn.wl) 14535: case 0b110_101: //(d8,A5,Rn.wl) 14536: case 0b110_110: //(d8,A6,Rn.wl) 14537: case 0b110_111: //(d8,A7,Rn.wl) 14538: XEiJ.mpuCycleCount += 10; 14539: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14540: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14541: } else { 14542: w = XEiJ.regPC; 14543: XEiJ.regPC = w + 2; 14544: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14545: } 14546: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14547: + (byte) w //バイトディスプレースメント 14548: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14549: XEiJ.regRn[w >> 12])); //ロングインデックス 14550: case 0b111_000: //(xxx).W 14551: XEiJ.mpuCycleCount += 8; 14552: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14553: case 0b111_001: //(xxx).L 14554: XEiJ.mpuCycleCount += 12; 14555: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14556: case 0b111_010: //(d16,PC) 14557: XEiJ.mpuCycleCount += 8; 14558: t = XEiJ.regPC; 14559: XEiJ.regPC = t + 2; 14560: return (t //ベースレジスタ 14561: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14562: case 0b111_011: //(d8,PC,Rn.wl) 14563: XEiJ.mpuCycleCount += 10; 14564: t = XEiJ.regPC; 14565: XEiJ.regPC = t + 2; 14566: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14567: return (t //ベースレジスタ 14568: + (byte) w //バイトディスプレースメント 14569: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14570: XEiJ.regRn[w >> 12])); //ロングインデックス 14571: } //switch 14572: XEiJ.mpuCycleCount += 34; 14573: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14574: throw M68kException.m6eSignal; 14575: } //efaCntByte 14576: 14577: //a = efaAnyWord (ea) //| M+-WXZPI| 14578: // 任意のモードのワードオペランドの実効アドレスを求める 14579: // efaAnyByteとの違いは(Ar)+と-(Ar)がArを2変化させることと、(A7)+と-(A7)と#<data>の特別な動作がないこと 14580: @SuppressWarnings ("fallthrough") public static int efaAnyWord (int ea) throws M68kException { 14581: int t, w; 14582: switch (ea) { 14583: case 0b010_000: //(A0) 14584: if (XEiJ.EFA_SEPARATE_AR) { 14585: XEiJ.mpuCycleCount += 4; 14586: return XEiJ.regRn[ 8]; 14587: } 14588: //fallthrough 14589: case 0b010_001: //(A1) 14590: if (XEiJ.EFA_SEPARATE_AR) { 14591: XEiJ.mpuCycleCount += 4; 14592: return XEiJ.regRn[ 9]; 14593: } 14594: //fallthrough 14595: case 0b010_010: //(A2) 14596: if (XEiJ.EFA_SEPARATE_AR) { 14597: XEiJ.mpuCycleCount += 4; 14598: return XEiJ.regRn[10]; 14599: } 14600: //fallthrough 14601: case 0b010_011: //(A3) 14602: if (XEiJ.EFA_SEPARATE_AR) { 14603: XEiJ.mpuCycleCount += 4; 14604: return XEiJ.regRn[11]; 14605: } 14606: //fallthrough 14607: case 0b010_100: //(A4) 14608: if (XEiJ.EFA_SEPARATE_AR) { 14609: XEiJ.mpuCycleCount += 4; 14610: return XEiJ.regRn[12]; 14611: } 14612: //fallthrough 14613: case 0b010_101: //(A5) 14614: if (XEiJ.EFA_SEPARATE_AR) { 14615: XEiJ.mpuCycleCount += 4; 14616: return XEiJ.regRn[13]; 14617: } 14618: //fallthrough 14619: case 0b010_110: //(A6) 14620: if (XEiJ.EFA_SEPARATE_AR) { 14621: XEiJ.mpuCycleCount += 4; 14622: return XEiJ.regRn[14]; 14623: } 14624: //fallthrough 14625: case 0b010_111: //(A7) 14626: if (XEiJ.EFA_SEPARATE_AR) { 14627: XEiJ.mpuCycleCount += 4; 14628: return XEiJ.regRn[15]; 14629: } else { 14630: XEiJ.mpuCycleCount += 4; 14631: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14632: } 14633: case 0b011_000: //(A0)+ 14634: if (XEiJ.EFA_SEPARATE_AR) { 14635: XEiJ.mpuCycleCount += 4; 14636: return (XEiJ.regRn[ 8] += 2) - 2; 14637: } 14638: //fallthrough 14639: case 0b011_001: //(A1)+ 14640: if (XEiJ.EFA_SEPARATE_AR) { 14641: XEiJ.mpuCycleCount += 4; 14642: return (XEiJ.regRn[ 9] += 2) - 2; 14643: } 14644: //fallthrough 14645: case 0b011_010: //(A2)+ 14646: if (XEiJ.EFA_SEPARATE_AR) { 14647: XEiJ.mpuCycleCount += 4; 14648: return (XEiJ.regRn[10] += 2) - 2; 14649: } 14650: //fallthrough 14651: case 0b011_011: //(A3)+ 14652: if (XEiJ.EFA_SEPARATE_AR) { 14653: XEiJ.mpuCycleCount += 4; 14654: return (XEiJ.regRn[11] += 2) - 2; 14655: } 14656: //fallthrough 14657: case 0b011_100: //(A4)+ 14658: if (XEiJ.EFA_SEPARATE_AR) { 14659: XEiJ.mpuCycleCount += 4; 14660: return (XEiJ.regRn[12] += 2) - 2; 14661: } 14662: //fallthrough 14663: case 0b011_101: //(A5)+ 14664: if (XEiJ.EFA_SEPARATE_AR) { 14665: XEiJ.mpuCycleCount += 4; 14666: return (XEiJ.regRn[13] += 2) - 2; 14667: } 14668: //fallthrough 14669: case 0b011_110: //(A6)+ 14670: if (XEiJ.EFA_SEPARATE_AR) { 14671: XEiJ.mpuCycleCount += 4; 14672: return (XEiJ.regRn[14] += 2) - 2; 14673: } 14674: //fallthrough 14675: case 0b011_111: //(A7)+ 14676: if (XEiJ.EFA_SEPARATE_AR) { 14677: XEiJ.mpuCycleCount += 4; 14678: return (XEiJ.regRn[15] += 2) - 2; 14679: } else { 14680: XEiJ.mpuCycleCount += 4; 14681: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 14682: } 14683: case 0b100_000: //-(A0) 14684: if (XEiJ.EFA_SEPARATE_AR) { 14685: XEiJ.mpuCycleCount += 6; 14686: return XEiJ.regRn[ 8] -= 2; 14687: } 14688: //fallthrough 14689: case 0b100_001: //-(A1) 14690: if (XEiJ.EFA_SEPARATE_AR) { 14691: XEiJ.mpuCycleCount += 6; 14692: return XEiJ.regRn[ 9] -= 2; 14693: } 14694: //fallthrough 14695: case 0b100_010: //-(A2) 14696: if (XEiJ.EFA_SEPARATE_AR) { 14697: XEiJ.mpuCycleCount += 6; 14698: return XEiJ.regRn[10] -= 2; 14699: } 14700: //fallthrough 14701: case 0b100_011: //-(A3) 14702: if (XEiJ.EFA_SEPARATE_AR) { 14703: XEiJ.mpuCycleCount += 6; 14704: return XEiJ.regRn[11] -= 2; 14705: } 14706: //fallthrough 14707: case 0b100_100: //-(A4) 14708: if (XEiJ.EFA_SEPARATE_AR) { 14709: XEiJ.mpuCycleCount += 6; 14710: return XEiJ.regRn[12] -= 2; 14711: } 14712: //fallthrough 14713: case 0b100_101: //-(A5) 14714: if (XEiJ.EFA_SEPARATE_AR) { 14715: XEiJ.mpuCycleCount += 6; 14716: return XEiJ.regRn[13] -= 2; 14717: } 14718: //fallthrough 14719: case 0b100_110: //-(A6) 14720: if (XEiJ.EFA_SEPARATE_AR) { 14721: XEiJ.mpuCycleCount += 6; 14722: return XEiJ.regRn[14] -= 2; 14723: } 14724: //fallthrough 14725: case 0b100_111: //-(A7) 14726: if (XEiJ.EFA_SEPARATE_AR) { 14727: XEiJ.mpuCycleCount += 6; 14728: return XEiJ.regRn[15] -= 2; 14729: } else { 14730: XEiJ.mpuCycleCount += 6; 14731: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 14732: } 14733: case 0b101_000: //(d16,A0) 14734: case 0b101_001: //(d16,A1) 14735: case 0b101_010: //(d16,A2) 14736: case 0b101_011: //(d16,A3) 14737: case 0b101_100: //(d16,A4) 14738: case 0b101_101: //(d16,A5) 14739: case 0b101_110: //(d16,A6) 14740: case 0b101_111: //(d16,A7) 14741: XEiJ.mpuCycleCount += 8; 14742: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14743: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14744: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14745: } else { 14746: t = XEiJ.regPC; 14747: XEiJ.regPC = t + 2; 14748: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14749: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14750: } 14751: case 0b110_000: //(d8,A0,Rn.wl) 14752: case 0b110_001: //(d8,A1,Rn.wl) 14753: case 0b110_010: //(d8,A2,Rn.wl) 14754: case 0b110_011: //(d8,A3,Rn.wl) 14755: case 0b110_100: //(d8,A4,Rn.wl) 14756: case 0b110_101: //(d8,A5,Rn.wl) 14757: case 0b110_110: //(d8,A6,Rn.wl) 14758: case 0b110_111: //(d8,A7,Rn.wl) 14759: XEiJ.mpuCycleCount += 10; 14760: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14761: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14762: } else { 14763: w = XEiJ.regPC; 14764: XEiJ.regPC = w + 2; 14765: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14766: } 14767: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14768: + (byte) w //バイトディスプレースメント 14769: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14770: XEiJ.regRn[w >> 12])); //ロングインデックス 14771: case 0b111_000: //(xxx).W 14772: XEiJ.mpuCycleCount += 8; 14773: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 14774: case 0b111_001: //(xxx).L 14775: XEiJ.mpuCycleCount += 12; 14776: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 14777: case 0b111_010: //(d16,PC) 14778: XEiJ.mpuCycleCount += 8; 14779: t = XEiJ.regPC; 14780: XEiJ.regPC = t + 2; 14781: return (t //ベースレジスタ 14782: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14783: case 0b111_011: //(d8,PC,Rn.wl) 14784: XEiJ.mpuCycleCount += 10; 14785: t = XEiJ.regPC; 14786: XEiJ.regPC = t + 2; 14787: w = XEiJ.busRwze (t); //pcwz。拡張ワード 14788: return (t //ベースレジスタ 14789: + (byte) w //バイトディスプレースメント 14790: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 14791: XEiJ.regRn[w >> 12])); //ロングインデックス 14792: case 0b111_100: //#<data> 14793: XEiJ.mpuCycleCount += 4; 14794: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14795: return (XEiJ.regPC += 2) - 2; 14796: } else { 14797: t = XEiJ.regPC; 14798: XEiJ.regPC = t + 2; 14799: return t; 14800: } 14801: } //switch 14802: XEiJ.mpuCycleCount += 34; 14803: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 14804: throw M68kException.m6eSignal; 14805: } //efaAnyWord 14806: 14807: //a = efaMemWord (ea) //| M+-WXZP | 14808: // メモリモードのワードオペランドの実効アドレスを求める 14809: // efaAnyWordとの違いは#<data>がないこと 14810: @SuppressWarnings ("fallthrough") public static int efaMemWord (int ea) throws M68kException { 14811: int t, w; 14812: switch (ea) { 14813: case 0b010_000: //(A0) 14814: if (XEiJ.EFA_SEPARATE_AR) { 14815: XEiJ.mpuCycleCount += 4; 14816: return XEiJ.regRn[ 8]; 14817: } 14818: //fallthrough 14819: case 0b010_001: //(A1) 14820: if (XEiJ.EFA_SEPARATE_AR) { 14821: XEiJ.mpuCycleCount += 4; 14822: return XEiJ.regRn[ 9]; 14823: } 14824: //fallthrough 14825: case 0b010_010: //(A2) 14826: if (XEiJ.EFA_SEPARATE_AR) { 14827: XEiJ.mpuCycleCount += 4; 14828: return XEiJ.regRn[10]; 14829: } 14830: //fallthrough 14831: case 0b010_011: //(A3) 14832: if (XEiJ.EFA_SEPARATE_AR) { 14833: XEiJ.mpuCycleCount += 4; 14834: return XEiJ.regRn[11]; 14835: } 14836: //fallthrough 14837: case 0b010_100: //(A4) 14838: if (XEiJ.EFA_SEPARATE_AR) { 14839: XEiJ.mpuCycleCount += 4; 14840: return XEiJ.regRn[12]; 14841: } 14842: //fallthrough 14843: case 0b010_101: //(A5) 14844: if (XEiJ.EFA_SEPARATE_AR) { 14845: XEiJ.mpuCycleCount += 4; 14846: return XEiJ.regRn[13]; 14847: } 14848: //fallthrough 14849: case 0b010_110: //(A6) 14850: if (XEiJ.EFA_SEPARATE_AR) { 14851: XEiJ.mpuCycleCount += 4; 14852: return XEiJ.regRn[14]; 14853: } 14854: //fallthrough 14855: case 0b010_111: //(A7) 14856: if (XEiJ.EFA_SEPARATE_AR) { 14857: XEiJ.mpuCycleCount += 4; 14858: return XEiJ.regRn[15]; 14859: } else { 14860: XEiJ.mpuCycleCount += 4; 14861: return XEiJ.regRn[ea - (0b010_000 - 8)]; 14862: } 14863: case 0b011_000: //(A0)+ 14864: if (XEiJ.EFA_SEPARATE_AR) { 14865: XEiJ.mpuCycleCount += 4; 14866: return (XEiJ.regRn[ 8] += 2) - 2; 14867: } 14868: //fallthrough 14869: case 0b011_001: //(A1)+ 14870: if (XEiJ.EFA_SEPARATE_AR) { 14871: XEiJ.mpuCycleCount += 4; 14872: return (XEiJ.regRn[ 9] += 2) - 2; 14873: } 14874: //fallthrough 14875: case 0b011_010: //(A2)+ 14876: if (XEiJ.EFA_SEPARATE_AR) { 14877: XEiJ.mpuCycleCount += 4; 14878: return (XEiJ.regRn[10] += 2) - 2; 14879: } 14880: //fallthrough 14881: case 0b011_011: //(A3)+ 14882: if (XEiJ.EFA_SEPARATE_AR) { 14883: XEiJ.mpuCycleCount += 4; 14884: return (XEiJ.regRn[11] += 2) - 2; 14885: } 14886: //fallthrough 14887: case 0b011_100: //(A4)+ 14888: if (XEiJ.EFA_SEPARATE_AR) { 14889: XEiJ.mpuCycleCount += 4; 14890: return (XEiJ.regRn[12] += 2) - 2; 14891: } 14892: //fallthrough 14893: case 0b011_101: //(A5)+ 14894: if (XEiJ.EFA_SEPARATE_AR) { 14895: XEiJ.mpuCycleCount += 4; 14896: return (XEiJ.regRn[13] += 2) - 2; 14897: } 14898: //fallthrough 14899: case 0b011_110: //(A6)+ 14900: if (XEiJ.EFA_SEPARATE_AR) { 14901: XEiJ.mpuCycleCount += 4; 14902: return (XEiJ.regRn[14] += 2) - 2; 14903: } 14904: //fallthrough 14905: case 0b011_111: //(A7)+ 14906: if (XEiJ.EFA_SEPARATE_AR) { 14907: XEiJ.mpuCycleCount += 4; 14908: return (XEiJ.regRn[15] += 2) - 2; 14909: } else { 14910: XEiJ.mpuCycleCount += 4; 14911: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 14912: } 14913: case 0b100_000: //-(A0) 14914: if (XEiJ.EFA_SEPARATE_AR) { 14915: XEiJ.mpuCycleCount += 6; 14916: return XEiJ.regRn[ 8] -= 2; 14917: } 14918: //fallthrough 14919: case 0b100_001: //-(A1) 14920: if (XEiJ.EFA_SEPARATE_AR) { 14921: XEiJ.mpuCycleCount += 6; 14922: return XEiJ.regRn[ 9] -= 2; 14923: } 14924: //fallthrough 14925: case 0b100_010: //-(A2) 14926: if (XEiJ.EFA_SEPARATE_AR) { 14927: XEiJ.mpuCycleCount += 6; 14928: return XEiJ.regRn[10] -= 2; 14929: } 14930: //fallthrough 14931: case 0b100_011: //-(A3) 14932: if (XEiJ.EFA_SEPARATE_AR) { 14933: XEiJ.mpuCycleCount += 6; 14934: return XEiJ.regRn[11] -= 2; 14935: } 14936: //fallthrough 14937: case 0b100_100: //-(A4) 14938: if (XEiJ.EFA_SEPARATE_AR) { 14939: XEiJ.mpuCycleCount += 6; 14940: return XEiJ.regRn[12] -= 2; 14941: } 14942: //fallthrough 14943: case 0b100_101: //-(A5) 14944: if (XEiJ.EFA_SEPARATE_AR) { 14945: XEiJ.mpuCycleCount += 6; 14946: return XEiJ.regRn[13] -= 2; 14947: } 14948: //fallthrough 14949: case 0b100_110: //-(A6) 14950: if (XEiJ.EFA_SEPARATE_AR) { 14951: XEiJ.mpuCycleCount += 6; 14952: return XEiJ.regRn[14] -= 2; 14953: } 14954: //fallthrough 14955: case 0b100_111: //-(A7) 14956: if (XEiJ.EFA_SEPARATE_AR) { 14957: XEiJ.mpuCycleCount += 6; 14958: return XEiJ.regRn[15] -= 2; 14959: } else { 14960: XEiJ.mpuCycleCount += 6; 14961: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 14962: } 14963: case 0b101_000: //(d16,A0) 14964: case 0b101_001: //(d16,A1) 14965: case 0b101_010: //(d16,A2) 14966: case 0b101_011: //(d16,A3) 14967: case 0b101_100: //(d16,A4) 14968: case 0b101_101: //(d16,A5) 14969: case 0b101_110: //(d16,A6) 14970: case 0b101_111: //(d16,A7) 14971: XEiJ.mpuCycleCount += 8; 14972: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14973: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14974: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 14975: } else { 14976: t = XEiJ.regPC; 14977: XEiJ.regPC = t + 2; 14978: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 14979: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 14980: } 14981: case 0b110_000: //(d8,A0,Rn.wl) 14982: case 0b110_001: //(d8,A1,Rn.wl) 14983: case 0b110_010: //(d8,A2,Rn.wl) 14984: case 0b110_011: //(d8,A3,Rn.wl) 14985: case 0b110_100: //(d8,A4,Rn.wl) 14986: case 0b110_101: //(d8,A5,Rn.wl) 14987: case 0b110_110: //(d8,A6,Rn.wl) 14988: case 0b110_111: //(d8,A7,Rn.wl) 14989: XEiJ.mpuCycleCount += 10; 14990: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 14991: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 14992: } else { 14993: w = XEiJ.regPC; 14994: XEiJ.regPC = w + 2; 14995: w = XEiJ.busRwze (w); //pcwz。拡張ワード 14996: } 14997: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 14998: + (byte) w //バイトディスプレースメント 14999: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15000: XEiJ.regRn[w >> 12])); //ロングインデックス 15001: case 0b111_000: //(xxx).W 15002: XEiJ.mpuCycleCount += 8; 15003: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15004: case 0b111_001: //(xxx).L 15005: XEiJ.mpuCycleCount += 12; 15006: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15007: case 0b111_010: //(d16,PC) 15008: XEiJ.mpuCycleCount += 8; 15009: t = XEiJ.regPC; 15010: XEiJ.regPC = t + 2; 15011: return (t //ベースレジスタ 15012: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15013: case 0b111_011: //(d8,PC,Rn.wl) 15014: XEiJ.mpuCycleCount += 10; 15015: t = XEiJ.regPC; 15016: XEiJ.regPC = t + 2; 15017: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15018: return (t //ベースレジスタ 15019: + (byte) w //バイトディスプレースメント 15020: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15021: XEiJ.regRn[w >> 12])); //ロングインデックス 15022: } //switch 15023: XEiJ.mpuCycleCount += 34; 15024: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15025: throw M68kException.m6eSignal; 15026: } //efaMemWord 15027: 15028: //a = efaMltWord (ea) //| M+-WXZ | 15029: // メモリ可変モードのワードオペランドの実効アドレスを求める 15030: // efaMemWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15031: @SuppressWarnings ("fallthrough") public static int efaMltWord (int ea) throws M68kException { 15032: int t, w; 15033: switch (ea) { 15034: case 0b010_000: //(A0) 15035: if (XEiJ.EFA_SEPARATE_AR) { 15036: XEiJ.mpuCycleCount += 4; 15037: return XEiJ.regRn[ 8]; 15038: } 15039: //fallthrough 15040: case 0b010_001: //(A1) 15041: if (XEiJ.EFA_SEPARATE_AR) { 15042: XEiJ.mpuCycleCount += 4; 15043: return XEiJ.regRn[ 9]; 15044: } 15045: //fallthrough 15046: case 0b010_010: //(A2) 15047: if (XEiJ.EFA_SEPARATE_AR) { 15048: XEiJ.mpuCycleCount += 4; 15049: return XEiJ.regRn[10]; 15050: } 15051: //fallthrough 15052: case 0b010_011: //(A3) 15053: if (XEiJ.EFA_SEPARATE_AR) { 15054: XEiJ.mpuCycleCount += 4; 15055: return XEiJ.regRn[11]; 15056: } 15057: //fallthrough 15058: case 0b010_100: //(A4) 15059: if (XEiJ.EFA_SEPARATE_AR) { 15060: XEiJ.mpuCycleCount += 4; 15061: return XEiJ.regRn[12]; 15062: } 15063: //fallthrough 15064: case 0b010_101: //(A5) 15065: if (XEiJ.EFA_SEPARATE_AR) { 15066: XEiJ.mpuCycleCount += 4; 15067: return XEiJ.regRn[13]; 15068: } 15069: //fallthrough 15070: case 0b010_110: //(A6) 15071: if (XEiJ.EFA_SEPARATE_AR) { 15072: XEiJ.mpuCycleCount += 4; 15073: return XEiJ.regRn[14]; 15074: } 15075: //fallthrough 15076: case 0b010_111: //(A7) 15077: if (XEiJ.EFA_SEPARATE_AR) { 15078: XEiJ.mpuCycleCount += 4; 15079: return XEiJ.regRn[15]; 15080: } else { 15081: XEiJ.mpuCycleCount += 4; 15082: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15083: } 15084: case 0b011_000: //(A0)+ 15085: if (XEiJ.EFA_SEPARATE_AR) { 15086: XEiJ.mpuCycleCount += 4; 15087: return (XEiJ.regRn[ 8] += 2) - 2; 15088: } 15089: //fallthrough 15090: case 0b011_001: //(A1)+ 15091: if (XEiJ.EFA_SEPARATE_AR) { 15092: XEiJ.mpuCycleCount += 4; 15093: return (XEiJ.regRn[ 9] += 2) - 2; 15094: } 15095: //fallthrough 15096: case 0b011_010: //(A2)+ 15097: if (XEiJ.EFA_SEPARATE_AR) { 15098: XEiJ.mpuCycleCount += 4; 15099: return (XEiJ.regRn[10] += 2) - 2; 15100: } 15101: //fallthrough 15102: case 0b011_011: //(A3)+ 15103: if (XEiJ.EFA_SEPARATE_AR) { 15104: XEiJ.mpuCycleCount += 4; 15105: return (XEiJ.regRn[11] += 2) - 2; 15106: } 15107: //fallthrough 15108: case 0b011_100: //(A4)+ 15109: if (XEiJ.EFA_SEPARATE_AR) { 15110: XEiJ.mpuCycleCount += 4; 15111: return (XEiJ.regRn[12] += 2) - 2; 15112: } 15113: //fallthrough 15114: case 0b011_101: //(A5)+ 15115: if (XEiJ.EFA_SEPARATE_AR) { 15116: XEiJ.mpuCycleCount += 4; 15117: return (XEiJ.regRn[13] += 2) - 2; 15118: } 15119: //fallthrough 15120: case 0b011_110: //(A6)+ 15121: if (XEiJ.EFA_SEPARATE_AR) { 15122: XEiJ.mpuCycleCount += 4; 15123: return (XEiJ.regRn[14] += 2) - 2; 15124: } 15125: //fallthrough 15126: case 0b011_111: //(A7)+ 15127: if (XEiJ.EFA_SEPARATE_AR) { 15128: XEiJ.mpuCycleCount += 4; 15129: return (XEiJ.regRn[15] += 2) - 2; 15130: } else { 15131: XEiJ.mpuCycleCount += 4; 15132: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 2) - 2; 15133: } 15134: case 0b100_000: //-(A0) 15135: if (XEiJ.EFA_SEPARATE_AR) { 15136: XEiJ.mpuCycleCount += 6; 15137: return XEiJ.regRn[ 8] -= 2; 15138: } 15139: //fallthrough 15140: case 0b100_001: //-(A1) 15141: if (XEiJ.EFA_SEPARATE_AR) { 15142: XEiJ.mpuCycleCount += 6; 15143: return XEiJ.regRn[ 9] -= 2; 15144: } 15145: //fallthrough 15146: case 0b100_010: //-(A2) 15147: if (XEiJ.EFA_SEPARATE_AR) { 15148: XEiJ.mpuCycleCount += 6; 15149: return XEiJ.regRn[10] -= 2; 15150: } 15151: //fallthrough 15152: case 0b100_011: //-(A3) 15153: if (XEiJ.EFA_SEPARATE_AR) { 15154: XEiJ.mpuCycleCount += 6; 15155: return XEiJ.regRn[11] -= 2; 15156: } 15157: //fallthrough 15158: case 0b100_100: //-(A4) 15159: if (XEiJ.EFA_SEPARATE_AR) { 15160: XEiJ.mpuCycleCount += 6; 15161: return XEiJ.regRn[12] -= 2; 15162: } 15163: //fallthrough 15164: case 0b100_101: //-(A5) 15165: if (XEiJ.EFA_SEPARATE_AR) { 15166: XEiJ.mpuCycleCount += 6; 15167: return XEiJ.regRn[13] -= 2; 15168: } 15169: //fallthrough 15170: case 0b100_110: //-(A6) 15171: if (XEiJ.EFA_SEPARATE_AR) { 15172: XEiJ.mpuCycleCount += 6; 15173: return XEiJ.regRn[14] -= 2; 15174: } 15175: //fallthrough 15176: case 0b100_111: //-(A7) 15177: if (XEiJ.EFA_SEPARATE_AR) { 15178: XEiJ.mpuCycleCount += 6; 15179: return XEiJ.regRn[15] -= 2; 15180: } else { 15181: XEiJ.mpuCycleCount += 6; 15182: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 2; 15183: } 15184: case 0b101_000: //(d16,A0) 15185: case 0b101_001: //(d16,A1) 15186: case 0b101_010: //(d16,A2) 15187: case 0b101_011: //(d16,A3) 15188: case 0b101_100: //(d16,A4) 15189: case 0b101_101: //(d16,A5) 15190: case 0b101_110: //(d16,A6) 15191: case 0b101_111: //(d16,A7) 15192: XEiJ.mpuCycleCount += 8; 15193: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15194: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15195: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15196: } else { 15197: t = XEiJ.regPC; 15198: XEiJ.regPC = t + 2; 15199: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15200: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15201: } 15202: case 0b110_000: //(d8,A0,Rn.wl) 15203: case 0b110_001: //(d8,A1,Rn.wl) 15204: case 0b110_010: //(d8,A2,Rn.wl) 15205: case 0b110_011: //(d8,A3,Rn.wl) 15206: case 0b110_100: //(d8,A4,Rn.wl) 15207: case 0b110_101: //(d8,A5,Rn.wl) 15208: case 0b110_110: //(d8,A6,Rn.wl) 15209: case 0b110_111: //(d8,A7,Rn.wl) 15210: XEiJ.mpuCycleCount += 10; 15211: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15212: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15213: } else { 15214: w = XEiJ.regPC; 15215: XEiJ.regPC = w + 2; 15216: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15217: } 15218: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15219: + (byte) w //バイトディスプレースメント 15220: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15221: XEiJ.regRn[w >> 12])); //ロングインデックス 15222: case 0b111_000: //(xxx).W 15223: XEiJ.mpuCycleCount += 8; 15224: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15225: case 0b111_001: //(xxx).L 15226: XEiJ.mpuCycleCount += 12; 15227: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15228: } //switch 15229: XEiJ.mpuCycleCount += 34; 15230: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15231: throw M68kException.m6eSignal; 15232: } //efaMltWord 15233: 15234: //a = efaCntWord (ea) //| M WXZP | 15235: // 制御モードのワードオペランドの実効アドレスを求める 15236: // efaMemWordとの違いは(Ar)+と-(Ar)がないこと 15237: @SuppressWarnings ("fallthrough") public static int efaCntWord (int ea) throws M68kException { 15238: int t, w; 15239: switch (ea) { 15240: case 0b010_000: //(A0) 15241: if (XEiJ.EFA_SEPARATE_AR) { 15242: XEiJ.mpuCycleCount += 4; 15243: return XEiJ.regRn[ 8]; 15244: } 15245: //fallthrough 15246: case 0b010_001: //(A1) 15247: if (XEiJ.EFA_SEPARATE_AR) { 15248: XEiJ.mpuCycleCount += 4; 15249: return XEiJ.regRn[ 9]; 15250: } 15251: //fallthrough 15252: case 0b010_010: //(A2) 15253: if (XEiJ.EFA_SEPARATE_AR) { 15254: XEiJ.mpuCycleCount += 4; 15255: return XEiJ.regRn[10]; 15256: } 15257: //fallthrough 15258: case 0b010_011: //(A3) 15259: if (XEiJ.EFA_SEPARATE_AR) { 15260: XEiJ.mpuCycleCount += 4; 15261: return XEiJ.regRn[11]; 15262: } 15263: //fallthrough 15264: case 0b010_100: //(A4) 15265: if (XEiJ.EFA_SEPARATE_AR) { 15266: XEiJ.mpuCycleCount += 4; 15267: return XEiJ.regRn[12]; 15268: } 15269: //fallthrough 15270: case 0b010_101: //(A5) 15271: if (XEiJ.EFA_SEPARATE_AR) { 15272: XEiJ.mpuCycleCount += 4; 15273: return XEiJ.regRn[13]; 15274: } 15275: //fallthrough 15276: case 0b010_110: //(A6) 15277: if (XEiJ.EFA_SEPARATE_AR) { 15278: XEiJ.mpuCycleCount += 4; 15279: return XEiJ.regRn[14]; 15280: } 15281: //fallthrough 15282: case 0b010_111: //(A7) 15283: if (XEiJ.EFA_SEPARATE_AR) { 15284: XEiJ.mpuCycleCount += 4; 15285: return XEiJ.regRn[15]; 15286: } else { 15287: XEiJ.mpuCycleCount += 4; 15288: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15289: } 15290: case 0b101_000: //(d16,A0) 15291: case 0b101_001: //(d16,A1) 15292: case 0b101_010: //(d16,A2) 15293: case 0b101_011: //(d16,A3) 15294: case 0b101_100: //(d16,A4) 15295: case 0b101_101: //(d16,A5) 15296: case 0b101_110: //(d16,A6) 15297: case 0b101_111: //(d16,A7) 15298: XEiJ.mpuCycleCount += 8; 15299: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15300: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15301: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15302: } else { 15303: t = XEiJ.regPC; 15304: XEiJ.regPC = t + 2; 15305: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15306: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15307: } 15308: case 0b110_000: //(d8,A0,Rn.wl) 15309: case 0b110_001: //(d8,A1,Rn.wl) 15310: case 0b110_010: //(d8,A2,Rn.wl) 15311: case 0b110_011: //(d8,A3,Rn.wl) 15312: case 0b110_100: //(d8,A4,Rn.wl) 15313: case 0b110_101: //(d8,A5,Rn.wl) 15314: case 0b110_110: //(d8,A6,Rn.wl) 15315: case 0b110_111: //(d8,A7,Rn.wl) 15316: XEiJ.mpuCycleCount += 10; 15317: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15318: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15319: } else { 15320: w = XEiJ.regPC; 15321: XEiJ.regPC = w + 2; 15322: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15323: } 15324: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15325: + (byte) w //バイトディスプレースメント 15326: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15327: XEiJ.regRn[w >> 12])); //ロングインデックス 15328: case 0b111_000: //(xxx).W 15329: XEiJ.mpuCycleCount += 8; 15330: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15331: case 0b111_001: //(xxx).L 15332: XEiJ.mpuCycleCount += 12; 15333: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15334: case 0b111_010: //(d16,PC) 15335: XEiJ.mpuCycleCount += 8; 15336: t = XEiJ.regPC; 15337: XEiJ.regPC = t + 2; 15338: return (t //ベースレジスタ 15339: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15340: case 0b111_011: //(d8,PC,Rn.wl) 15341: XEiJ.mpuCycleCount += 10; 15342: t = XEiJ.regPC; 15343: XEiJ.regPC = t + 2; 15344: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15345: return (t //ベースレジスタ 15346: + (byte) w //バイトディスプレースメント 15347: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15348: XEiJ.regRn[w >> 12])); //ロングインデックス 15349: } //switch 15350: XEiJ.mpuCycleCount += 34; 15351: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15352: throw M68kException.m6eSignal; 15353: } //efaCntWord 15354: 15355: //a = efaCltWord (ea) //| M WXZ | 15356: // 制御可変モードのワードオペランドの実効アドレスを求める 15357: // efaCntWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15358: @SuppressWarnings ("fallthrough") public static int efaCltWord (int ea) throws M68kException { 15359: int t, w; 15360: switch (ea) { 15361: case 0b010_000: //(A0) 15362: if (XEiJ.EFA_SEPARATE_AR) { 15363: XEiJ.mpuCycleCount += 4; 15364: return XEiJ.regRn[ 8]; 15365: } 15366: //fallthrough 15367: case 0b010_001: //(A1) 15368: if (XEiJ.EFA_SEPARATE_AR) { 15369: XEiJ.mpuCycleCount += 4; 15370: return XEiJ.regRn[ 9]; 15371: } 15372: //fallthrough 15373: case 0b010_010: //(A2) 15374: if (XEiJ.EFA_SEPARATE_AR) { 15375: XEiJ.mpuCycleCount += 4; 15376: return XEiJ.regRn[10]; 15377: } 15378: //fallthrough 15379: case 0b010_011: //(A3) 15380: if (XEiJ.EFA_SEPARATE_AR) { 15381: XEiJ.mpuCycleCount += 4; 15382: return XEiJ.regRn[11]; 15383: } 15384: //fallthrough 15385: case 0b010_100: //(A4) 15386: if (XEiJ.EFA_SEPARATE_AR) { 15387: XEiJ.mpuCycleCount += 4; 15388: return XEiJ.regRn[12]; 15389: } 15390: //fallthrough 15391: case 0b010_101: //(A5) 15392: if (XEiJ.EFA_SEPARATE_AR) { 15393: XEiJ.mpuCycleCount += 4; 15394: return XEiJ.regRn[13]; 15395: } 15396: //fallthrough 15397: case 0b010_110: //(A6) 15398: if (XEiJ.EFA_SEPARATE_AR) { 15399: XEiJ.mpuCycleCount += 4; 15400: return XEiJ.regRn[14]; 15401: } 15402: //fallthrough 15403: case 0b010_111: //(A7) 15404: if (XEiJ.EFA_SEPARATE_AR) { 15405: XEiJ.mpuCycleCount += 4; 15406: return XEiJ.regRn[15]; 15407: } else { 15408: XEiJ.mpuCycleCount += 4; 15409: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15410: } 15411: case 0b101_000: //(d16,A0) 15412: case 0b101_001: //(d16,A1) 15413: case 0b101_010: //(d16,A2) 15414: case 0b101_011: //(d16,A3) 15415: case 0b101_100: //(d16,A4) 15416: case 0b101_101: //(d16,A5) 15417: case 0b101_110: //(d16,A6) 15418: case 0b101_111: //(d16,A7) 15419: XEiJ.mpuCycleCount += 8; 15420: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15421: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15422: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15423: } else { 15424: t = XEiJ.regPC; 15425: XEiJ.regPC = t + 2; 15426: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15427: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15428: } 15429: case 0b110_000: //(d8,A0,Rn.wl) 15430: case 0b110_001: //(d8,A1,Rn.wl) 15431: case 0b110_010: //(d8,A2,Rn.wl) 15432: case 0b110_011: //(d8,A3,Rn.wl) 15433: case 0b110_100: //(d8,A4,Rn.wl) 15434: case 0b110_101: //(d8,A5,Rn.wl) 15435: case 0b110_110: //(d8,A6,Rn.wl) 15436: case 0b110_111: //(d8,A7,Rn.wl) 15437: XEiJ.mpuCycleCount += 10; 15438: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15439: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15440: } else { 15441: w = XEiJ.regPC; 15442: XEiJ.regPC = w + 2; 15443: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15444: } 15445: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15446: + (byte) w //バイトディスプレースメント 15447: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15448: XEiJ.regRn[w >> 12])); //ロングインデックス 15449: case 0b111_000: //(xxx).W 15450: XEiJ.mpuCycleCount += 8; 15451: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15452: case 0b111_001: //(xxx).L 15453: XEiJ.mpuCycleCount += 12; 15454: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15455: } //switch 15456: XEiJ.mpuCycleCount += 34; 15457: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15458: throw M68kException.m6eSignal; 15459: } //efaCltWord 15460: 15461: //a = efaAnyLong (ea) //| M+-WXZPI| 15462: // 任意のモードのロングオペランドの実効アドレスを求める 15463: // efaAnyWordとの違いは(Ar)+と-(Ar)がArを4変化させることと、#<data>がPCを4変化させることと、 15464: // オペランドのアクセスが1ワード増える分の4サイクルが追加されていること 15465: @SuppressWarnings ("fallthrough") public static int efaAnyLong (int ea) throws M68kException { 15466: int t, w; 15467: switch (ea) { 15468: case 0b010_000: //(A0) 15469: if (XEiJ.EFA_SEPARATE_AR) { 15470: XEiJ.mpuCycleCount += 8; 15471: return XEiJ.regRn[ 8]; 15472: } 15473: //fallthrough 15474: case 0b010_001: //(A1) 15475: if (XEiJ.EFA_SEPARATE_AR) { 15476: XEiJ.mpuCycleCount += 8; 15477: return XEiJ.regRn[ 9]; 15478: } 15479: //fallthrough 15480: case 0b010_010: //(A2) 15481: if (XEiJ.EFA_SEPARATE_AR) { 15482: XEiJ.mpuCycleCount += 8; 15483: return XEiJ.regRn[10]; 15484: } 15485: //fallthrough 15486: case 0b010_011: //(A3) 15487: if (XEiJ.EFA_SEPARATE_AR) { 15488: XEiJ.mpuCycleCount += 8; 15489: return XEiJ.regRn[11]; 15490: } 15491: //fallthrough 15492: case 0b010_100: //(A4) 15493: if (XEiJ.EFA_SEPARATE_AR) { 15494: XEiJ.mpuCycleCount += 8; 15495: return XEiJ.regRn[12]; 15496: } 15497: //fallthrough 15498: case 0b010_101: //(A5) 15499: if (XEiJ.EFA_SEPARATE_AR) { 15500: XEiJ.mpuCycleCount += 8; 15501: return XEiJ.regRn[13]; 15502: } 15503: //fallthrough 15504: case 0b010_110: //(A6) 15505: if (XEiJ.EFA_SEPARATE_AR) { 15506: XEiJ.mpuCycleCount += 8; 15507: return XEiJ.regRn[14]; 15508: } 15509: //fallthrough 15510: case 0b010_111: //(A7) 15511: if (XEiJ.EFA_SEPARATE_AR) { 15512: XEiJ.mpuCycleCount += 8; 15513: return XEiJ.regRn[15]; 15514: } else { 15515: XEiJ.mpuCycleCount += 8; 15516: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15517: } 15518: case 0b011_000: //(A0)+ 15519: if (XEiJ.EFA_SEPARATE_AR) { 15520: XEiJ.mpuCycleCount += 8; 15521: return (XEiJ.regRn[ 8] += 4) - 4; 15522: } 15523: //fallthrough 15524: case 0b011_001: //(A1)+ 15525: if (XEiJ.EFA_SEPARATE_AR) { 15526: XEiJ.mpuCycleCount += 8; 15527: return (XEiJ.regRn[ 9] += 4) - 4; 15528: } 15529: //fallthrough 15530: case 0b011_010: //(A2)+ 15531: if (XEiJ.EFA_SEPARATE_AR) { 15532: XEiJ.mpuCycleCount += 8; 15533: return (XEiJ.regRn[10] += 4) - 4; 15534: } 15535: //fallthrough 15536: case 0b011_011: //(A3)+ 15537: if (XEiJ.EFA_SEPARATE_AR) { 15538: XEiJ.mpuCycleCount += 8; 15539: return (XEiJ.regRn[11] += 4) - 4; 15540: } 15541: //fallthrough 15542: case 0b011_100: //(A4)+ 15543: if (XEiJ.EFA_SEPARATE_AR) { 15544: XEiJ.mpuCycleCount += 8; 15545: return (XEiJ.regRn[12] += 4) - 4; 15546: } 15547: //fallthrough 15548: case 0b011_101: //(A5)+ 15549: if (XEiJ.EFA_SEPARATE_AR) { 15550: XEiJ.mpuCycleCount += 8; 15551: return (XEiJ.regRn[13] += 4) - 4; 15552: } 15553: //fallthrough 15554: case 0b011_110: //(A6)+ 15555: if (XEiJ.EFA_SEPARATE_AR) { 15556: XEiJ.mpuCycleCount += 8; 15557: return (XEiJ.regRn[14] += 4) - 4; 15558: } 15559: //fallthrough 15560: case 0b011_111: //(A7)+ 15561: if (XEiJ.EFA_SEPARATE_AR) { 15562: XEiJ.mpuCycleCount += 8; 15563: return (XEiJ.regRn[15] += 4) - 4; 15564: } else { 15565: XEiJ.mpuCycleCount += 8; 15566: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 15567: } 15568: case 0b100_000: //-(A0) 15569: if (XEiJ.EFA_SEPARATE_AR) { 15570: XEiJ.mpuCycleCount += 10; 15571: return XEiJ.regRn[ 8] -= 4; 15572: } 15573: //fallthrough 15574: case 0b100_001: //-(A1) 15575: if (XEiJ.EFA_SEPARATE_AR) { 15576: XEiJ.mpuCycleCount += 10; 15577: return XEiJ.regRn[ 9] -= 4; 15578: } 15579: //fallthrough 15580: case 0b100_010: //-(A2) 15581: if (XEiJ.EFA_SEPARATE_AR) { 15582: XEiJ.mpuCycleCount += 10; 15583: return XEiJ.regRn[10] -= 4; 15584: } 15585: //fallthrough 15586: case 0b100_011: //-(A3) 15587: if (XEiJ.EFA_SEPARATE_AR) { 15588: XEiJ.mpuCycleCount += 10; 15589: return XEiJ.regRn[11] -= 4; 15590: } 15591: //fallthrough 15592: case 0b100_100: //-(A4) 15593: if (XEiJ.EFA_SEPARATE_AR) { 15594: XEiJ.mpuCycleCount += 10; 15595: return XEiJ.regRn[12] -= 4; 15596: } 15597: //fallthrough 15598: case 0b100_101: //-(A5) 15599: if (XEiJ.EFA_SEPARATE_AR) { 15600: XEiJ.mpuCycleCount += 10; 15601: return XEiJ.regRn[13] -= 4; 15602: } 15603: //fallthrough 15604: case 0b100_110: //-(A6) 15605: if (XEiJ.EFA_SEPARATE_AR) { 15606: XEiJ.mpuCycleCount += 10; 15607: return XEiJ.regRn[14] -= 4; 15608: } 15609: //fallthrough 15610: case 0b100_111: //-(A7) 15611: if (XEiJ.EFA_SEPARATE_AR) { 15612: XEiJ.mpuCycleCount += 10; 15613: return XEiJ.regRn[15] -= 4; 15614: } else { 15615: XEiJ.mpuCycleCount += 10; 15616: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 15617: } 15618: case 0b101_000: //(d16,A0) 15619: case 0b101_001: //(d16,A1) 15620: case 0b101_010: //(d16,A2) 15621: case 0b101_011: //(d16,A3) 15622: case 0b101_100: //(d16,A4) 15623: case 0b101_101: //(d16,A5) 15624: case 0b101_110: //(d16,A6) 15625: case 0b101_111: //(d16,A7) 15626: XEiJ.mpuCycleCount += 12; 15627: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15628: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15629: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15630: } else { 15631: t = XEiJ.regPC; 15632: XEiJ.regPC = t + 2; 15633: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15634: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15635: } 15636: case 0b110_000: //(d8,A0,Rn.wl) 15637: case 0b110_001: //(d8,A1,Rn.wl) 15638: case 0b110_010: //(d8,A2,Rn.wl) 15639: case 0b110_011: //(d8,A3,Rn.wl) 15640: case 0b110_100: //(d8,A4,Rn.wl) 15641: case 0b110_101: //(d8,A5,Rn.wl) 15642: case 0b110_110: //(d8,A6,Rn.wl) 15643: case 0b110_111: //(d8,A7,Rn.wl) 15644: XEiJ.mpuCycleCount += 14; 15645: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15646: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15647: } else { 15648: w = XEiJ.regPC; 15649: XEiJ.regPC = w + 2; 15650: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15651: } 15652: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15653: + (byte) w //バイトディスプレースメント 15654: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15655: XEiJ.regRn[w >> 12])); //ロングインデックス 15656: case 0b111_000: //(xxx).W 15657: XEiJ.mpuCycleCount += 12; 15658: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15659: case 0b111_001: //(xxx).L 15660: XEiJ.mpuCycleCount += 16; 15661: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15662: case 0b111_010: //(d16,PC) 15663: XEiJ.mpuCycleCount += 12; 15664: t = XEiJ.regPC; 15665: XEiJ.regPC = t + 2; 15666: return (t //ベースレジスタ 15667: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15668: case 0b111_011: //(d8,PC,Rn.wl) 15669: XEiJ.mpuCycleCount += 14; 15670: t = XEiJ.regPC; 15671: XEiJ.regPC = t + 2; 15672: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15673: return (t //ベースレジスタ 15674: + (byte) w //バイトディスプレースメント 15675: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15676: XEiJ.regRn[w >> 12])); //ロングインデックス 15677: case 0b111_100: //#<data> 15678: XEiJ.mpuCycleCount += 8; 15679: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15680: return (XEiJ.regPC += 4) - 4; 15681: } else { 15682: t = XEiJ.regPC; 15683: XEiJ.regPC = t + 4; 15684: return t; 15685: } 15686: } //switch 15687: XEiJ.mpuCycleCount += 34; 15688: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15689: throw M68kException.m6eSignal; 15690: } //efaAnyLong 15691: 15692: //a = efaMemLong (ea) //| M+-WXZP | 15693: // メモリモードのロングオペランドの実効アドレスを求める 15694: // efaAnyLongとの違いは#<data>がないこと 15695: @SuppressWarnings ("fallthrough") public static int efaMemLong (int ea) throws M68kException { 15696: int t, w; 15697: switch (ea) { 15698: case 0b010_000: //(A0) 15699: if (XEiJ.EFA_SEPARATE_AR) { 15700: XEiJ.mpuCycleCount += 8; 15701: return XEiJ.regRn[ 8]; 15702: } 15703: //fallthrough 15704: case 0b010_001: //(A1) 15705: if (XEiJ.EFA_SEPARATE_AR) { 15706: XEiJ.mpuCycleCount += 8; 15707: return XEiJ.regRn[ 9]; 15708: } 15709: //fallthrough 15710: case 0b010_010: //(A2) 15711: if (XEiJ.EFA_SEPARATE_AR) { 15712: XEiJ.mpuCycleCount += 8; 15713: return XEiJ.regRn[10]; 15714: } 15715: //fallthrough 15716: case 0b010_011: //(A3) 15717: if (XEiJ.EFA_SEPARATE_AR) { 15718: XEiJ.mpuCycleCount += 8; 15719: return XEiJ.regRn[11]; 15720: } 15721: //fallthrough 15722: case 0b010_100: //(A4) 15723: if (XEiJ.EFA_SEPARATE_AR) { 15724: XEiJ.mpuCycleCount += 8; 15725: return XEiJ.regRn[12]; 15726: } 15727: //fallthrough 15728: case 0b010_101: //(A5) 15729: if (XEiJ.EFA_SEPARATE_AR) { 15730: XEiJ.mpuCycleCount += 8; 15731: return XEiJ.regRn[13]; 15732: } 15733: //fallthrough 15734: case 0b010_110: //(A6) 15735: if (XEiJ.EFA_SEPARATE_AR) { 15736: XEiJ.mpuCycleCount += 8; 15737: return XEiJ.regRn[14]; 15738: } 15739: //fallthrough 15740: case 0b010_111: //(A7) 15741: if (XEiJ.EFA_SEPARATE_AR) { 15742: XEiJ.mpuCycleCount += 8; 15743: return XEiJ.regRn[15]; 15744: } else { 15745: XEiJ.mpuCycleCount += 8; 15746: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15747: } 15748: case 0b011_000: //(A0)+ 15749: if (XEiJ.EFA_SEPARATE_AR) { 15750: XEiJ.mpuCycleCount += 8; 15751: return (XEiJ.regRn[ 8] += 4) - 4; 15752: } 15753: //fallthrough 15754: case 0b011_001: //(A1)+ 15755: if (XEiJ.EFA_SEPARATE_AR) { 15756: XEiJ.mpuCycleCount += 8; 15757: return (XEiJ.regRn[ 9] += 4) - 4; 15758: } 15759: //fallthrough 15760: case 0b011_010: //(A2)+ 15761: if (XEiJ.EFA_SEPARATE_AR) { 15762: XEiJ.mpuCycleCount += 8; 15763: return (XEiJ.regRn[10] += 4) - 4; 15764: } 15765: //fallthrough 15766: case 0b011_011: //(A3)+ 15767: if (XEiJ.EFA_SEPARATE_AR) { 15768: XEiJ.mpuCycleCount += 8; 15769: return (XEiJ.regRn[11] += 4) - 4; 15770: } 15771: //fallthrough 15772: case 0b011_100: //(A4)+ 15773: if (XEiJ.EFA_SEPARATE_AR) { 15774: XEiJ.mpuCycleCount += 8; 15775: return (XEiJ.regRn[12] += 4) - 4; 15776: } 15777: //fallthrough 15778: case 0b011_101: //(A5)+ 15779: if (XEiJ.EFA_SEPARATE_AR) { 15780: XEiJ.mpuCycleCount += 8; 15781: return (XEiJ.regRn[13] += 4) - 4; 15782: } 15783: //fallthrough 15784: case 0b011_110: //(A6)+ 15785: if (XEiJ.EFA_SEPARATE_AR) { 15786: XEiJ.mpuCycleCount += 8; 15787: return (XEiJ.regRn[14] += 4) - 4; 15788: } 15789: //fallthrough 15790: case 0b011_111: //(A7)+ 15791: if (XEiJ.EFA_SEPARATE_AR) { 15792: XEiJ.mpuCycleCount += 8; 15793: return (XEiJ.regRn[15] += 4) - 4; 15794: } else { 15795: XEiJ.mpuCycleCount += 8; 15796: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 15797: } 15798: case 0b100_000: //-(A0) 15799: if (XEiJ.EFA_SEPARATE_AR) { 15800: XEiJ.mpuCycleCount += 10; 15801: return XEiJ.regRn[ 8] -= 4; 15802: } 15803: //fallthrough 15804: case 0b100_001: //-(A1) 15805: if (XEiJ.EFA_SEPARATE_AR) { 15806: XEiJ.mpuCycleCount += 10; 15807: return XEiJ.regRn[ 9] -= 4; 15808: } 15809: //fallthrough 15810: case 0b100_010: //-(A2) 15811: if (XEiJ.EFA_SEPARATE_AR) { 15812: XEiJ.mpuCycleCount += 10; 15813: return XEiJ.regRn[10] -= 4; 15814: } 15815: //fallthrough 15816: case 0b100_011: //-(A3) 15817: if (XEiJ.EFA_SEPARATE_AR) { 15818: XEiJ.mpuCycleCount += 10; 15819: return XEiJ.regRn[11] -= 4; 15820: } 15821: //fallthrough 15822: case 0b100_100: //-(A4) 15823: if (XEiJ.EFA_SEPARATE_AR) { 15824: XEiJ.mpuCycleCount += 10; 15825: return XEiJ.regRn[12] -= 4; 15826: } 15827: //fallthrough 15828: case 0b100_101: //-(A5) 15829: if (XEiJ.EFA_SEPARATE_AR) { 15830: XEiJ.mpuCycleCount += 10; 15831: return XEiJ.regRn[13] -= 4; 15832: } 15833: //fallthrough 15834: case 0b100_110: //-(A6) 15835: if (XEiJ.EFA_SEPARATE_AR) { 15836: XEiJ.mpuCycleCount += 10; 15837: return XEiJ.regRn[14] -= 4; 15838: } 15839: //fallthrough 15840: case 0b100_111: //-(A7) 15841: if (XEiJ.EFA_SEPARATE_AR) { 15842: XEiJ.mpuCycleCount += 10; 15843: return XEiJ.regRn[15] -= 4; 15844: } else { 15845: XEiJ.mpuCycleCount += 10; 15846: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 15847: } 15848: case 0b101_000: //(d16,A0) 15849: case 0b101_001: //(d16,A1) 15850: case 0b101_010: //(d16,A2) 15851: case 0b101_011: //(d16,A3) 15852: case 0b101_100: //(d16,A4) 15853: case 0b101_101: //(d16,A5) 15854: case 0b101_110: //(d16,A6) 15855: case 0b101_111: //(d16,A7) 15856: XEiJ.mpuCycleCount += 12; 15857: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15858: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15859: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 15860: } else { 15861: t = XEiJ.regPC; 15862: XEiJ.regPC = t + 2; 15863: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 15864: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15865: } 15866: case 0b110_000: //(d8,A0,Rn.wl) 15867: case 0b110_001: //(d8,A1,Rn.wl) 15868: case 0b110_010: //(d8,A2,Rn.wl) 15869: case 0b110_011: //(d8,A3,Rn.wl) 15870: case 0b110_100: //(d8,A4,Rn.wl) 15871: case 0b110_101: //(d8,A5,Rn.wl) 15872: case 0b110_110: //(d8,A6,Rn.wl) 15873: case 0b110_111: //(d8,A7,Rn.wl) 15874: XEiJ.mpuCycleCount += 14; 15875: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 15876: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 15877: } else { 15878: w = XEiJ.regPC; 15879: XEiJ.regPC = w + 2; 15880: w = XEiJ.busRwze (w); //pcwz。拡張ワード 15881: } 15882: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 15883: + (byte) w //バイトディスプレースメント 15884: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15885: XEiJ.regRn[w >> 12])); //ロングインデックス 15886: case 0b111_000: //(xxx).W 15887: XEiJ.mpuCycleCount += 12; 15888: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 15889: case 0b111_001: //(xxx).L 15890: XEiJ.mpuCycleCount += 16; 15891: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 15892: case 0b111_010: //(d16,PC) 15893: XEiJ.mpuCycleCount += 12; 15894: t = XEiJ.regPC; 15895: XEiJ.regPC = t + 2; 15896: return (t //ベースレジスタ 15897: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 15898: case 0b111_011: //(d8,PC,Rn.wl) 15899: XEiJ.mpuCycleCount += 14; 15900: t = XEiJ.regPC; 15901: XEiJ.regPC = t + 2; 15902: w = XEiJ.busRwze (t); //pcwz。拡張ワード 15903: return (t //ベースレジスタ 15904: + (byte) w //バイトディスプレースメント 15905: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 15906: XEiJ.regRn[w >> 12])); //ロングインデックス 15907: } //switch 15908: XEiJ.mpuCycleCount += 34; 15909: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 15910: throw M68kException.m6eSignal; 15911: } //efaMemLong 15912: 15913: //a = efaMltLong (ea) //| M+-WXZ | 15914: // メモリ可変モードのロングオペランドの実効アドレスを求める 15915: // efaMemLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 15916: @SuppressWarnings ("fallthrough") public static int efaMltLong (int ea) throws M68kException { 15917: int t, w; 15918: switch (ea) { 15919: case 0b010_000: //(A0) 15920: if (XEiJ.EFA_SEPARATE_AR) { 15921: XEiJ.mpuCycleCount += 8; 15922: return XEiJ.regRn[ 8]; 15923: } 15924: //fallthrough 15925: case 0b010_001: //(A1) 15926: if (XEiJ.EFA_SEPARATE_AR) { 15927: XEiJ.mpuCycleCount += 8; 15928: return XEiJ.regRn[ 9]; 15929: } 15930: //fallthrough 15931: case 0b010_010: //(A2) 15932: if (XEiJ.EFA_SEPARATE_AR) { 15933: XEiJ.mpuCycleCount += 8; 15934: return XEiJ.regRn[10]; 15935: } 15936: //fallthrough 15937: case 0b010_011: //(A3) 15938: if (XEiJ.EFA_SEPARATE_AR) { 15939: XEiJ.mpuCycleCount += 8; 15940: return XEiJ.regRn[11]; 15941: } 15942: //fallthrough 15943: case 0b010_100: //(A4) 15944: if (XEiJ.EFA_SEPARATE_AR) { 15945: XEiJ.mpuCycleCount += 8; 15946: return XEiJ.regRn[12]; 15947: } 15948: //fallthrough 15949: case 0b010_101: //(A5) 15950: if (XEiJ.EFA_SEPARATE_AR) { 15951: XEiJ.mpuCycleCount += 8; 15952: return XEiJ.regRn[13]; 15953: } 15954: //fallthrough 15955: case 0b010_110: //(A6) 15956: if (XEiJ.EFA_SEPARATE_AR) { 15957: XEiJ.mpuCycleCount += 8; 15958: return XEiJ.regRn[14]; 15959: } 15960: //fallthrough 15961: case 0b010_111: //(A7) 15962: if (XEiJ.EFA_SEPARATE_AR) { 15963: XEiJ.mpuCycleCount += 8; 15964: return XEiJ.regRn[15]; 15965: } else { 15966: XEiJ.mpuCycleCount += 8; 15967: return XEiJ.regRn[ea - (0b010_000 - 8)]; 15968: } 15969: case 0b011_000: //(A0)+ 15970: if (XEiJ.EFA_SEPARATE_AR) { 15971: XEiJ.mpuCycleCount += 8; 15972: return (XEiJ.regRn[ 8] += 4) - 4; 15973: } 15974: //fallthrough 15975: case 0b011_001: //(A1)+ 15976: if (XEiJ.EFA_SEPARATE_AR) { 15977: XEiJ.mpuCycleCount += 8; 15978: return (XEiJ.regRn[ 9] += 4) - 4; 15979: } 15980: //fallthrough 15981: case 0b011_010: //(A2)+ 15982: if (XEiJ.EFA_SEPARATE_AR) { 15983: XEiJ.mpuCycleCount += 8; 15984: return (XEiJ.regRn[10] += 4) - 4; 15985: } 15986: //fallthrough 15987: case 0b011_011: //(A3)+ 15988: if (XEiJ.EFA_SEPARATE_AR) { 15989: XEiJ.mpuCycleCount += 8; 15990: return (XEiJ.regRn[11] += 4) - 4; 15991: } 15992: //fallthrough 15993: case 0b011_100: //(A4)+ 15994: if (XEiJ.EFA_SEPARATE_AR) { 15995: XEiJ.mpuCycleCount += 8; 15996: return (XEiJ.regRn[12] += 4) - 4; 15997: } 15998: //fallthrough 15999: case 0b011_101: //(A5)+ 16000: if (XEiJ.EFA_SEPARATE_AR) { 16001: XEiJ.mpuCycleCount += 8; 16002: return (XEiJ.regRn[13] += 4) - 4; 16003: } 16004: //fallthrough 16005: case 0b011_110: //(A6)+ 16006: if (XEiJ.EFA_SEPARATE_AR) { 16007: XEiJ.mpuCycleCount += 8; 16008: return (XEiJ.regRn[14] += 4) - 4; 16009: } 16010: //fallthrough 16011: case 0b011_111: //(A7)+ 16012: if (XEiJ.EFA_SEPARATE_AR) { 16013: XEiJ.mpuCycleCount += 8; 16014: return (XEiJ.regRn[15] += 4) - 4; 16015: } else { 16016: XEiJ.mpuCycleCount += 8; 16017: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4; 16018: } 16019: case 0b100_000: //-(A0) 16020: if (XEiJ.EFA_SEPARATE_AR) { 16021: XEiJ.mpuCycleCount += 10; 16022: return XEiJ.regRn[ 8] -= 4; 16023: } 16024: //fallthrough 16025: case 0b100_001: //-(A1) 16026: if (XEiJ.EFA_SEPARATE_AR) { 16027: XEiJ.mpuCycleCount += 10; 16028: return XEiJ.regRn[ 9] -= 4; 16029: } 16030: //fallthrough 16031: case 0b100_010: //-(A2) 16032: if (XEiJ.EFA_SEPARATE_AR) { 16033: XEiJ.mpuCycleCount += 10; 16034: return XEiJ.regRn[10] -= 4; 16035: } 16036: //fallthrough 16037: case 0b100_011: //-(A3) 16038: if (XEiJ.EFA_SEPARATE_AR) { 16039: XEiJ.mpuCycleCount += 10; 16040: return XEiJ.regRn[11] -= 4; 16041: } 16042: //fallthrough 16043: case 0b100_100: //-(A4) 16044: if (XEiJ.EFA_SEPARATE_AR) { 16045: XEiJ.mpuCycleCount += 10; 16046: return XEiJ.regRn[12] -= 4; 16047: } 16048: //fallthrough 16049: case 0b100_101: //-(A5) 16050: if (XEiJ.EFA_SEPARATE_AR) { 16051: XEiJ.mpuCycleCount += 10; 16052: return XEiJ.regRn[13] -= 4; 16053: } 16054: //fallthrough 16055: case 0b100_110: //-(A6) 16056: if (XEiJ.EFA_SEPARATE_AR) { 16057: XEiJ.mpuCycleCount += 10; 16058: return XEiJ.regRn[14] -= 4; 16059: } 16060: //fallthrough 16061: case 0b100_111: //-(A7) 16062: if (XEiJ.EFA_SEPARATE_AR) { 16063: XEiJ.mpuCycleCount += 10; 16064: return XEiJ.regRn[15] -= 4; 16065: } else { 16066: XEiJ.mpuCycleCount += 10; 16067: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4; 16068: } 16069: case 0b101_000: //(d16,A0) 16070: case 0b101_001: //(d16,A1) 16071: case 0b101_010: //(d16,A2) 16072: case 0b101_011: //(d16,A3) 16073: case 0b101_100: //(d16,A4) 16074: case 0b101_101: //(d16,A5) 16075: case 0b101_110: //(d16,A6) 16076: case 0b101_111: //(d16,A7) 16077: XEiJ.mpuCycleCount += 12; 16078: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16079: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16080: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16081: } else { 16082: t = XEiJ.regPC; 16083: XEiJ.regPC = t + 2; 16084: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16085: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16086: } 16087: case 0b110_000: //(d8,A0,Rn.wl) 16088: case 0b110_001: //(d8,A1,Rn.wl) 16089: case 0b110_010: //(d8,A2,Rn.wl) 16090: case 0b110_011: //(d8,A3,Rn.wl) 16091: case 0b110_100: //(d8,A4,Rn.wl) 16092: case 0b110_101: //(d8,A5,Rn.wl) 16093: case 0b110_110: //(d8,A6,Rn.wl) 16094: case 0b110_111: //(d8,A7,Rn.wl) 16095: XEiJ.mpuCycleCount += 14; 16096: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16097: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16098: } else { 16099: w = XEiJ.regPC; 16100: XEiJ.regPC = w + 2; 16101: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16102: } 16103: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16104: + (byte) w //バイトディスプレースメント 16105: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16106: XEiJ.regRn[w >> 12])); //ロングインデックス 16107: case 0b111_000: //(xxx).W 16108: XEiJ.mpuCycleCount += 12; 16109: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16110: case 0b111_001: //(xxx).L 16111: XEiJ.mpuCycleCount += 16; 16112: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16113: } //switch 16114: XEiJ.mpuCycleCount += 34; 16115: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16116: throw M68kException.m6eSignal; 16117: } //efaMltLong 16118: 16119: //a = efaCntLong (ea) //| M WXZP | 16120: // 制御モードのロングオペランドの実効アドレスを求める 16121: // efaMemLongとの違いは(Ar)+と-(Ar)がないこと 16122: @SuppressWarnings ("fallthrough") public static int efaCntLong (int ea) throws M68kException { 16123: int t, w; 16124: switch (ea) { 16125: case 0b010_000: //(A0) 16126: if (XEiJ.EFA_SEPARATE_AR) { 16127: XEiJ.mpuCycleCount += 8; 16128: return XEiJ.regRn[ 8]; 16129: } 16130: //fallthrough 16131: case 0b010_001: //(A1) 16132: if (XEiJ.EFA_SEPARATE_AR) { 16133: XEiJ.mpuCycleCount += 8; 16134: return XEiJ.regRn[ 9]; 16135: } 16136: //fallthrough 16137: case 0b010_010: //(A2) 16138: if (XEiJ.EFA_SEPARATE_AR) { 16139: XEiJ.mpuCycleCount += 8; 16140: return XEiJ.regRn[10]; 16141: } 16142: //fallthrough 16143: case 0b010_011: //(A3) 16144: if (XEiJ.EFA_SEPARATE_AR) { 16145: XEiJ.mpuCycleCount += 8; 16146: return XEiJ.regRn[11]; 16147: } 16148: //fallthrough 16149: case 0b010_100: //(A4) 16150: if (XEiJ.EFA_SEPARATE_AR) { 16151: XEiJ.mpuCycleCount += 8; 16152: return XEiJ.regRn[12]; 16153: } 16154: //fallthrough 16155: case 0b010_101: //(A5) 16156: if (XEiJ.EFA_SEPARATE_AR) { 16157: XEiJ.mpuCycleCount += 8; 16158: return XEiJ.regRn[13]; 16159: } 16160: //fallthrough 16161: case 0b010_110: //(A6) 16162: if (XEiJ.EFA_SEPARATE_AR) { 16163: XEiJ.mpuCycleCount += 8; 16164: return XEiJ.regRn[14]; 16165: } 16166: //fallthrough 16167: case 0b010_111: //(A7) 16168: if (XEiJ.EFA_SEPARATE_AR) { 16169: XEiJ.mpuCycleCount += 8; 16170: return XEiJ.regRn[15]; 16171: } else { 16172: XEiJ.mpuCycleCount += 8; 16173: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16174: } 16175: case 0b101_000: //(d16,A0) 16176: case 0b101_001: //(d16,A1) 16177: case 0b101_010: //(d16,A2) 16178: case 0b101_011: //(d16,A3) 16179: case 0b101_100: //(d16,A4) 16180: case 0b101_101: //(d16,A5) 16181: case 0b101_110: //(d16,A6) 16182: case 0b101_111: //(d16,A7) 16183: XEiJ.mpuCycleCount += 12; 16184: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16185: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16186: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16187: } else { 16188: t = XEiJ.regPC; 16189: XEiJ.regPC = t + 2; 16190: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16191: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16192: } 16193: case 0b110_000: //(d8,A0,Rn.wl) 16194: case 0b110_001: //(d8,A1,Rn.wl) 16195: case 0b110_010: //(d8,A2,Rn.wl) 16196: case 0b110_011: //(d8,A3,Rn.wl) 16197: case 0b110_100: //(d8,A4,Rn.wl) 16198: case 0b110_101: //(d8,A5,Rn.wl) 16199: case 0b110_110: //(d8,A6,Rn.wl) 16200: case 0b110_111: //(d8,A7,Rn.wl) 16201: XEiJ.mpuCycleCount += 14; 16202: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16203: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16204: } else { 16205: w = XEiJ.regPC; 16206: XEiJ.regPC = w + 2; 16207: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16208: } 16209: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16210: + (byte) w //バイトディスプレースメント 16211: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16212: XEiJ.regRn[w >> 12])); //ロングインデックス 16213: case 0b111_000: //(xxx).W 16214: XEiJ.mpuCycleCount += 12; 16215: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16216: case 0b111_001: //(xxx).L 16217: XEiJ.mpuCycleCount += 16; 16218: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16219: case 0b111_010: //(d16,PC) 16220: XEiJ.mpuCycleCount += 12; 16221: t = XEiJ.regPC; 16222: XEiJ.regPC = t + 2; 16223: return (t //ベースレジスタ 16224: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16225: case 0b111_011: //(d8,PC,Rn.wl) 16226: XEiJ.mpuCycleCount += 14; 16227: t = XEiJ.regPC; 16228: XEiJ.regPC = t + 2; 16229: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16230: return (t //ベースレジスタ 16231: + (byte) w //バイトディスプレースメント 16232: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16233: XEiJ.regRn[w >> 12])); //ロングインデックス 16234: } //switch 16235: XEiJ.mpuCycleCount += 34; 16236: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16237: throw M68kException.m6eSignal; 16238: } //efaCntLong 16239: 16240: //a = efaCltLong (ea) //| M WXZ | 16241: // 制御可変モードのワードオペランドの実効アドレスを求める 16242: // efaCntLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと 16243: @SuppressWarnings ("fallthrough") public static int efaCltLong (int ea) throws M68kException { 16244: int t, w; 16245: switch (ea) { 16246: case 0b010_000: //(A0) 16247: if (XEiJ.EFA_SEPARATE_AR) { 16248: XEiJ.mpuCycleCount += 8; 16249: return XEiJ.regRn[ 8]; 16250: } 16251: //fallthrough 16252: case 0b010_001: //(A1) 16253: if (XEiJ.EFA_SEPARATE_AR) { 16254: XEiJ.mpuCycleCount += 8; 16255: return XEiJ.regRn[ 9]; 16256: } 16257: //fallthrough 16258: case 0b010_010: //(A2) 16259: if (XEiJ.EFA_SEPARATE_AR) { 16260: XEiJ.mpuCycleCount += 8; 16261: return XEiJ.regRn[10]; 16262: } 16263: //fallthrough 16264: case 0b010_011: //(A3) 16265: if (XEiJ.EFA_SEPARATE_AR) { 16266: XEiJ.mpuCycleCount += 8; 16267: return XEiJ.regRn[11]; 16268: } 16269: //fallthrough 16270: case 0b010_100: //(A4) 16271: if (XEiJ.EFA_SEPARATE_AR) { 16272: XEiJ.mpuCycleCount += 8; 16273: return XEiJ.regRn[12]; 16274: } 16275: //fallthrough 16276: case 0b010_101: //(A5) 16277: if (XEiJ.EFA_SEPARATE_AR) { 16278: XEiJ.mpuCycleCount += 8; 16279: return XEiJ.regRn[13]; 16280: } 16281: //fallthrough 16282: case 0b010_110: //(A6) 16283: if (XEiJ.EFA_SEPARATE_AR) { 16284: XEiJ.mpuCycleCount += 8; 16285: return XEiJ.regRn[14]; 16286: } 16287: //fallthrough 16288: case 0b010_111: //(A7) 16289: if (XEiJ.EFA_SEPARATE_AR) { 16290: XEiJ.mpuCycleCount += 8; 16291: return XEiJ.regRn[15]; 16292: } else { 16293: XEiJ.mpuCycleCount += 8; 16294: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16295: } 16296: case 0b101_000: //(d16,A0) 16297: case 0b101_001: //(d16,A1) 16298: case 0b101_010: //(d16,A2) 16299: case 0b101_011: //(d16,A3) 16300: case 0b101_100: //(d16,A4) 16301: case 0b101_101: //(d16,A5) 16302: case 0b101_110: //(d16,A6) 16303: case 0b101_111: //(d16,A7) 16304: XEiJ.mpuCycleCount += 12; 16305: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16306: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16307: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16308: } else { 16309: t = XEiJ.regPC; 16310: XEiJ.regPC = t + 2; 16311: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16312: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16313: } 16314: case 0b110_000: //(d8,A0,Rn.wl) 16315: case 0b110_001: //(d8,A1,Rn.wl) 16316: case 0b110_010: //(d8,A2,Rn.wl) 16317: case 0b110_011: //(d8,A3,Rn.wl) 16318: case 0b110_100: //(d8,A4,Rn.wl) 16319: case 0b110_101: //(d8,A5,Rn.wl) 16320: case 0b110_110: //(d8,A6,Rn.wl) 16321: case 0b110_111: //(d8,A7,Rn.wl) 16322: XEiJ.mpuCycleCount += 14; 16323: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16324: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16325: } else { 16326: w = XEiJ.regPC; 16327: XEiJ.regPC = w + 2; 16328: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16329: } 16330: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16331: + (byte) w //バイトディスプレースメント 16332: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16333: XEiJ.regRn[w >> 12])); //ロングインデックス 16334: case 0b111_000: //(xxx).W 16335: XEiJ.mpuCycleCount += 12; 16336: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16337: case 0b111_001: //(xxx).L 16338: XEiJ.mpuCycleCount += 16; 16339: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16340: } //switch 16341: XEiJ.mpuCycleCount += 34; 16342: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16343: throw M68kException.m6eSignal; 16344: } //efaCltLong 16345: 16346: //a = efaAnyQuad (ea) //| M+-WXZPI| 16347: // 任意のモードのクワッドオペランドの実効アドレスを求める 16348: // efaAnyLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、 16349: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16350: @SuppressWarnings ("fallthrough") public static int efaAnyQuad (int ea) throws M68kException { 16351: int t, w; 16352: switch (ea) { 16353: case 0b010_000: //(A0) 16354: if (XEiJ.EFA_SEPARATE_AR) { 16355: XEiJ.mpuCycleCount += 16; 16356: return XEiJ.regRn[ 8]; 16357: } 16358: //fallthrough 16359: case 0b010_001: //(A1) 16360: if (XEiJ.EFA_SEPARATE_AR) { 16361: XEiJ.mpuCycleCount += 16; 16362: return XEiJ.regRn[ 9]; 16363: } 16364: //fallthrough 16365: case 0b010_010: //(A2) 16366: if (XEiJ.EFA_SEPARATE_AR) { 16367: XEiJ.mpuCycleCount += 16; 16368: return XEiJ.regRn[10]; 16369: } 16370: //fallthrough 16371: case 0b010_011: //(A3) 16372: if (XEiJ.EFA_SEPARATE_AR) { 16373: XEiJ.mpuCycleCount += 16; 16374: return XEiJ.regRn[11]; 16375: } 16376: //fallthrough 16377: case 0b010_100: //(A4) 16378: if (XEiJ.EFA_SEPARATE_AR) { 16379: XEiJ.mpuCycleCount += 16; 16380: return XEiJ.regRn[12]; 16381: } 16382: //fallthrough 16383: case 0b010_101: //(A5) 16384: if (XEiJ.EFA_SEPARATE_AR) { 16385: XEiJ.mpuCycleCount += 16; 16386: return XEiJ.regRn[13]; 16387: } 16388: //fallthrough 16389: case 0b010_110: //(A6) 16390: if (XEiJ.EFA_SEPARATE_AR) { 16391: XEiJ.mpuCycleCount += 16; 16392: return XEiJ.regRn[14]; 16393: } 16394: //fallthrough 16395: case 0b010_111: //(A7) 16396: if (XEiJ.EFA_SEPARATE_AR) { 16397: XEiJ.mpuCycleCount += 16; 16398: return XEiJ.regRn[15]; 16399: } else { 16400: XEiJ.mpuCycleCount += 16; 16401: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16402: } 16403: case 0b011_000: //(A0)+ 16404: if (XEiJ.EFA_SEPARATE_AR) { 16405: XEiJ.mpuCycleCount += 16; 16406: return (XEiJ.regRn[ 8] += 8) - 8; 16407: } 16408: //fallthrough 16409: case 0b011_001: //(A1)+ 16410: if (XEiJ.EFA_SEPARATE_AR) { 16411: XEiJ.mpuCycleCount += 16; 16412: return (XEiJ.regRn[ 9] += 8) - 8; 16413: } 16414: //fallthrough 16415: case 0b011_010: //(A2)+ 16416: if (XEiJ.EFA_SEPARATE_AR) { 16417: XEiJ.mpuCycleCount += 16; 16418: return (XEiJ.regRn[10] += 8) - 8; 16419: } 16420: //fallthrough 16421: case 0b011_011: //(A3)+ 16422: if (XEiJ.EFA_SEPARATE_AR) { 16423: XEiJ.mpuCycleCount += 16; 16424: return (XEiJ.regRn[11] += 8) - 8; 16425: } 16426: //fallthrough 16427: case 0b011_100: //(A4)+ 16428: if (XEiJ.EFA_SEPARATE_AR) { 16429: XEiJ.mpuCycleCount += 16; 16430: return (XEiJ.regRn[12] += 8) - 8; 16431: } 16432: //fallthrough 16433: case 0b011_101: //(A5)+ 16434: if (XEiJ.EFA_SEPARATE_AR) { 16435: XEiJ.mpuCycleCount += 16; 16436: return (XEiJ.regRn[13] += 8) - 8; 16437: } 16438: //fallthrough 16439: case 0b011_110: //(A6)+ 16440: if (XEiJ.EFA_SEPARATE_AR) { 16441: XEiJ.mpuCycleCount += 16; 16442: return (XEiJ.regRn[14] += 8) - 8; 16443: } 16444: //fallthrough 16445: case 0b011_111: //(A7)+ 16446: if (XEiJ.EFA_SEPARATE_AR) { 16447: XEiJ.mpuCycleCount += 16; 16448: return (XEiJ.regRn[15] += 8) - 8; 16449: } else { 16450: XEiJ.mpuCycleCount += 16; 16451: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8; 16452: } 16453: case 0b100_000: //-(A0) 16454: if (XEiJ.EFA_SEPARATE_AR) { 16455: XEiJ.mpuCycleCount += 18; 16456: return XEiJ.regRn[ 8] -= 8; 16457: } 16458: //fallthrough 16459: case 0b100_001: //-(A1) 16460: if (XEiJ.EFA_SEPARATE_AR) { 16461: XEiJ.mpuCycleCount += 18; 16462: return XEiJ.regRn[ 9] -= 8; 16463: } 16464: //fallthrough 16465: case 0b100_010: //-(A2) 16466: if (XEiJ.EFA_SEPARATE_AR) { 16467: XEiJ.mpuCycleCount += 18; 16468: return XEiJ.regRn[10] -= 8; 16469: } 16470: //fallthrough 16471: case 0b100_011: //-(A3) 16472: if (XEiJ.EFA_SEPARATE_AR) { 16473: XEiJ.mpuCycleCount += 18; 16474: return XEiJ.regRn[11] -= 8; 16475: } 16476: //fallthrough 16477: case 0b100_100: //-(A4) 16478: if (XEiJ.EFA_SEPARATE_AR) { 16479: XEiJ.mpuCycleCount += 18; 16480: return XEiJ.regRn[12] -= 8; 16481: } 16482: //fallthrough 16483: case 0b100_101: //-(A5) 16484: if (XEiJ.EFA_SEPARATE_AR) { 16485: XEiJ.mpuCycleCount += 18; 16486: return XEiJ.regRn[13] -= 8; 16487: } 16488: //fallthrough 16489: case 0b100_110: //-(A6) 16490: if (XEiJ.EFA_SEPARATE_AR) { 16491: XEiJ.mpuCycleCount += 18; 16492: return XEiJ.regRn[14] -= 8; 16493: } 16494: //fallthrough 16495: case 0b100_111: //-(A7) 16496: if (XEiJ.EFA_SEPARATE_AR) { 16497: XEiJ.mpuCycleCount += 18; 16498: return XEiJ.regRn[15] -= 8; 16499: } else { 16500: XEiJ.mpuCycleCount += 18; 16501: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8; 16502: } 16503: case 0b101_000: //(d16,A0) 16504: case 0b101_001: //(d16,A1) 16505: case 0b101_010: //(d16,A2) 16506: case 0b101_011: //(d16,A3) 16507: case 0b101_100: //(d16,A4) 16508: case 0b101_101: //(d16,A5) 16509: case 0b101_110: //(d16,A6) 16510: case 0b101_111: //(d16,A7) 16511: XEiJ.mpuCycleCount += 20; 16512: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16513: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16514: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16515: } else { 16516: t = XEiJ.regPC; 16517: XEiJ.regPC = t + 2; 16518: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16519: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16520: } 16521: case 0b110_000: //(d8,A0,Rn.wl) 16522: case 0b110_001: //(d8,A1,Rn.wl) 16523: case 0b110_010: //(d8,A2,Rn.wl) 16524: case 0b110_011: //(d8,A3,Rn.wl) 16525: case 0b110_100: //(d8,A4,Rn.wl) 16526: case 0b110_101: //(d8,A5,Rn.wl) 16527: case 0b110_110: //(d8,A6,Rn.wl) 16528: case 0b110_111: //(d8,A7,Rn.wl) 16529: XEiJ.mpuCycleCount += 22; 16530: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16531: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16532: } else { 16533: w = XEiJ.regPC; 16534: XEiJ.regPC = w + 2; 16535: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16536: } 16537: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16538: + (byte) w //バイトディスプレースメント 16539: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16540: XEiJ.regRn[w >> 12])); //ロングインデックス 16541: case 0b111_000: //(xxx).W 16542: XEiJ.mpuCycleCount += 20; 16543: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16544: case 0b111_001: //(xxx).L 16545: XEiJ.mpuCycleCount += 24; 16546: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16547: case 0b111_010: //(d16,PC) 16548: XEiJ.mpuCycleCount += 20; 16549: t = XEiJ.regPC; 16550: XEiJ.regPC = t + 2; 16551: return (t //ベースレジスタ 16552: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16553: case 0b111_011: //(d8,PC,Rn.wl) 16554: XEiJ.mpuCycleCount += 22; 16555: t = XEiJ.regPC; 16556: XEiJ.regPC = t + 2; 16557: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16558: return (t //ベースレジスタ 16559: + (byte) w //バイトディスプレースメント 16560: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16561: XEiJ.regRn[w >> 12])); //ロングインデックス 16562: case 0b111_100: //#<data> 16563: XEiJ.mpuCycleCount += 16; 16564: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16565: return (XEiJ.regPC += 8) - 8; 16566: } else { 16567: t = XEiJ.regPC; 16568: XEiJ.regPC = t + 8; 16569: return t; 16570: } 16571: } //switch 16572: XEiJ.mpuCycleCount += 34; 16573: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16574: throw M68kException.m6eSignal; 16575: } //efaAnyQuad 16576: 16577: //a = efaMltQuad (ea) //| M+-WXZ | 16578: // メモリ可変モードのクワッドオペランドの実効アドレスを求める 16579: // efaMltLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、 16580: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16581: @SuppressWarnings ("fallthrough") public static int efaMltQuad (int ea) throws M68kException { 16582: int t, w; 16583: switch (ea) { 16584: case 0b010_000: //(A0) 16585: if (XEiJ.EFA_SEPARATE_AR) { 16586: XEiJ.mpuCycleCount += 16; 16587: return XEiJ.regRn[ 8]; 16588: } 16589: //fallthrough 16590: case 0b010_001: //(A1) 16591: if (XEiJ.EFA_SEPARATE_AR) { 16592: XEiJ.mpuCycleCount += 16; 16593: return XEiJ.regRn[ 9]; 16594: } 16595: //fallthrough 16596: case 0b010_010: //(A2) 16597: if (XEiJ.EFA_SEPARATE_AR) { 16598: XEiJ.mpuCycleCount += 16; 16599: return XEiJ.regRn[10]; 16600: } 16601: //fallthrough 16602: case 0b010_011: //(A3) 16603: if (XEiJ.EFA_SEPARATE_AR) { 16604: XEiJ.mpuCycleCount += 16; 16605: return XEiJ.regRn[11]; 16606: } 16607: //fallthrough 16608: case 0b010_100: //(A4) 16609: if (XEiJ.EFA_SEPARATE_AR) { 16610: XEiJ.mpuCycleCount += 16; 16611: return XEiJ.regRn[12]; 16612: } 16613: //fallthrough 16614: case 0b010_101: //(A5) 16615: if (XEiJ.EFA_SEPARATE_AR) { 16616: XEiJ.mpuCycleCount += 16; 16617: return XEiJ.regRn[13]; 16618: } 16619: //fallthrough 16620: case 0b010_110: //(A6) 16621: if (XEiJ.EFA_SEPARATE_AR) { 16622: XEiJ.mpuCycleCount += 16; 16623: return XEiJ.regRn[14]; 16624: } 16625: //fallthrough 16626: case 0b010_111: //(A7) 16627: if (XEiJ.EFA_SEPARATE_AR) { 16628: XEiJ.mpuCycleCount += 16; 16629: return XEiJ.regRn[15]; 16630: } else { 16631: XEiJ.mpuCycleCount += 16; 16632: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16633: } 16634: case 0b011_000: //(A0)+ 16635: if (XEiJ.EFA_SEPARATE_AR) { 16636: XEiJ.mpuCycleCount += 16; 16637: return (XEiJ.regRn[ 8] += 8) - 8; 16638: } 16639: //fallthrough 16640: case 0b011_001: //(A1)+ 16641: if (XEiJ.EFA_SEPARATE_AR) { 16642: XEiJ.mpuCycleCount += 16; 16643: return (XEiJ.regRn[ 9] += 8) - 8; 16644: } 16645: //fallthrough 16646: case 0b011_010: //(A2)+ 16647: if (XEiJ.EFA_SEPARATE_AR) { 16648: XEiJ.mpuCycleCount += 16; 16649: return (XEiJ.regRn[10] += 8) - 8; 16650: } 16651: //fallthrough 16652: case 0b011_011: //(A3)+ 16653: if (XEiJ.EFA_SEPARATE_AR) { 16654: XEiJ.mpuCycleCount += 16; 16655: return (XEiJ.regRn[11] += 8) - 8; 16656: } 16657: //fallthrough 16658: case 0b011_100: //(A4)+ 16659: if (XEiJ.EFA_SEPARATE_AR) { 16660: XEiJ.mpuCycleCount += 16; 16661: return (XEiJ.regRn[12] += 8) - 8; 16662: } 16663: //fallthrough 16664: case 0b011_101: //(A5)+ 16665: if (XEiJ.EFA_SEPARATE_AR) { 16666: XEiJ.mpuCycleCount += 16; 16667: return (XEiJ.regRn[13] += 8) - 8; 16668: } 16669: //fallthrough 16670: case 0b011_110: //(A6)+ 16671: if (XEiJ.EFA_SEPARATE_AR) { 16672: XEiJ.mpuCycleCount += 16; 16673: return (XEiJ.regRn[14] += 8) - 8; 16674: } 16675: //fallthrough 16676: case 0b011_111: //(A7)+ 16677: if (XEiJ.EFA_SEPARATE_AR) { 16678: XEiJ.mpuCycleCount += 16; 16679: return (XEiJ.regRn[15] += 8) - 8; 16680: } else { 16681: XEiJ.mpuCycleCount += 16; 16682: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8; 16683: } 16684: case 0b100_000: //-(A0) 16685: if (XEiJ.EFA_SEPARATE_AR) { 16686: XEiJ.mpuCycleCount += 18; 16687: return XEiJ.regRn[ 8] -= 8; 16688: } 16689: //fallthrough 16690: case 0b100_001: //-(A1) 16691: if (XEiJ.EFA_SEPARATE_AR) { 16692: XEiJ.mpuCycleCount += 18; 16693: return XEiJ.regRn[ 9] -= 8; 16694: } 16695: //fallthrough 16696: case 0b100_010: //-(A2) 16697: if (XEiJ.EFA_SEPARATE_AR) { 16698: XEiJ.mpuCycleCount += 18; 16699: return XEiJ.regRn[10] -= 8; 16700: } 16701: //fallthrough 16702: case 0b100_011: //-(A3) 16703: if (XEiJ.EFA_SEPARATE_AR) { 16704: XEiJ.mpuCycleCount += 18; 16705: return XEiJ.regRn[11] -= 8; 16706: } 16707: //fallthrough 16708: case 0b100_100: //-(A4) 16709: if (XEiJ.EFA_SEPARATE_AR) { 16710: XEiJ.mpuCycleCount += 18; 16711: return XEiJ.regRn[12] -= 8; 16712: } 16713: //fallthrough 16714: case 0b100_101: //-(A5) 16715: if (XEiJ.EFA_SEPARATE_AR) { 16716: XEiJ.mpuCycleCount += 18; 16717: return XEiJ.regRn[13] -= 8; 16718: } 16719: //fallthrough 16720: case 0b100_110: //-(A6) 16721: if (XEiJ.EFA_SEPARATE_AR) { 16722: XEiJ.mpuCycleCount += 18; 16723: return XEiJ.regRn[14] -= 8; 16724: } 16725: //fallthrough 16726: case 0b100_111: //-(A7) 16727: if (XEiJ.EFA_SEPARATE_AR) { 16728: XEiJ.mpuCycleCount += 18; 16729: return XEiJ.regRn[15] -= 8; 16730: } else { 16731: XEiJ.mpuCycleCount += 18; 16732: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8; 16733: } 16734: case 0b101_000: //(d16,A0) 16735: case 0b101_001: //(d16,A1) 16736: case 0b101_010: //(d16,A2) 16737: case 0b101_011: //(d16,A3) 16738: case 0b101_100: //(d16,A4) 16739: case 0b101_101: //(d16,A5) 16740: case 0b101_110: //(d16,A6) 16741: case 0b101_111: //(d16,A7) 16742: XEiJ.mpuCycleCount += 20; 16743: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16744: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16745: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16746: } else { 16747: t = XEiJ.regPC; 16748: XEiJ.regPC = t + 2; 16749: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16750: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16751: } 16752: case 0b110_000: //(d8,A0,Rn.wl) 16753: case 0b110_001: //(d8,A1,Rn.wl) 16754: case 0b110_010: //(d8,A2,Rn.wl) 16755: case 0b110_011: //(d8,A3,Rn.wl) 16756: case 0b110_100: //(d8,A4,Rn.wl) 16757: case 0b110_101: //(d8,A5,Rn.wl) 16758: case 0b110_110: //(d8,A6,Rn.wl) 16759: case 0b110_111: //(d8,A7,Rn.wl) 16760: XEiJ.mpuCycleCount += 22; 16761: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16762: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16763: } else { 16764: w = XEiJ.regPC; 16765: XEiJ.regPC = w + 2; 16766: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16767: } 16768: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16769: + (byte) w //バイトディスプレースメント 16770: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16771: XEiJ.regRn[w >> 12])); //ロングインデックス 16772: case 0b111_000: //(xxx).W 16773: XEiJ.mpuCycleCount += 20; 16774: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16775: case 0b111_001: //(xxx).L 16776: XEiJ.mpuCycleCount += 24; 16777: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16778: } //switch 16779: XEiJ.mpuCycleCount += 34; 16780: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 16781: throw M68kException.m6eSignal; 16782: } //efaMltQuad 16783: 16784: //a = efaAnyExtd (ea) //| M+-WXZPI| 16785: // 任意のモードのエクステンデッドオペランドの実効アドレスを求める 16786: // efaAnyQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、 16787: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 16788: @SuppressWarnings ("fallthrough") public static int efaAnyExtd (int ea) throws M68kException { 16789: int t, w; 16790: switch (ea) { 16791: case 0b010_000: //(A0) 16792: if (XEiJ.EFA_SEPARATE_AR) { 16793: XEiJ.mpuCycleCount += 24; 16794: return XEiJ.regRn[ 8]; 16795: } 16796: //fallthrough 16797: case 0b010_001: //(A1) 16798: if (XEiJ.EFA_SEPARATE_AR) { 16799: XEiJ.mpuCycleCount += 24; 16800: return XEiJ.regRn[ 9]; 16801: } 16802: //fallthrough 16803: case 0b010_010: //(A2) 16804: if (XEiJ.EFA_SEPARATE_AR) { 16805: XEiJ.mpuCycleCount += 24; 16806: return XEiJ.regRn[10]; 16807: } 16808: //fallthrough 16809: case 0b010_011: //(A3) 16810: if (XEiJ.EFA_SEPARATE_AR) { 16811: XEiJ.mpuCycleCount += 24; 16812: return XEiJ.regRn[11]; 16813: } 16814: //fallthrough 16815: case 0b010_100: //(A4) 16816: if (XEiJ.EFA_SEPARATE_AR) { 16817: XEiJ.mpuCycleCount += 24; 16818: return XEiJ.regRn[12]; 16819: } 16820: //fallthrough 16821: case 0b010_101: //(A5) 16822: if (XEiJ.EFA_SEPARATE_AR) { 16823: XEiJ.mpuCycleCount += 24; 16824: return XEiJ.regRn[13]; 16825: } 16826: //fallthrough 16827: case 0b010_110: //(A6) 16828: if (XEiJ.EFA_SEPARATE_AR) { 16829: XEiJ.mpuCycleCount += 24; 16830: return XEiJ.regRn[14]; 16831: } 16832: //fallthrough 16833: case 0b010_111: //(A7) 16834: if (XEiJ.EFA_SEPARATE_AR) { 16835: XEiJ.mpuCycleCount += 24; 16836: return XEiJ.regRn[15]; 16837: } else { 16838: XEiJ.mpuCycleCount += 24; 16839: return XEiJ.regRn[ea - (0b010_000 - 8)]; 16840: } 16841: case 0b011_000: //(A0)+ 16842: if (XEiJ.EFA_SEPARATE_AR) { 16843: XEiJ.mpuCycleCount += 24; 16844: return (XEiJ.regRn[ 8] += 12) - 12; 16845: } 16846: //fallthrough 16847: case 0b011_001: //(A1)+ 16848: if (XEiJ.EFA_SEPARATE_AR) { 16849: XEiJ.mpuCycleCount += 24; 16850: return (XEiJ.regRn[ 9] += 12) - 12; 16851: } 16852: //fallthrough 16853: case 0b011_010: //(A2)+ 16854: if (XEiJ.EFA_SEPARATE_AR) { 16855: XEiJ.mpuCycleCount += 24; 16856: return (XEiJ.regRn[10] += 12) - 12; 16857: } 16858: //fallthrough 16859: case 0b011_011: //(A3)+ 16860: if (XEiJ.EFA_SEPARATE_AR) { 16861: XEiJ.mpuCycleCount += 24; 16862: return (XEiJ.regRn[11] += 12) - 12; 16863: } 16864: //fallthrough 16865: case 0b011_100: //(A4)+ 16866: if (XEiJ.EFA_SEPARATE_AR) { 16867: XEiJ.mpuCycleCount += 24; 16868: return (XEiJ.regRn[12] += 12) - 12; 16869: } 16870: //fallthrough 16871: case 0b011_101: //(A5)+ 16872: if (XEiJ.EFA_SEPARATE_AR) { 16873: XEiJ.mpuCycleCount += 24; 16874: return (XEiJ.regRn[13] += 12) - 12; 16875: } 16876: //fallthrough 16877: case 0b011_110: //(A6)+ 16878: if (XEiJ.EFA_SEPARATE_AR) { 16879: XEiJ.mpuCycleCount += 24; 16880: return (XEiJ.regRn[14] += 12) - 12; 16881: } 16882: //fallthrough 16883: case 0b011_111: //(A7)+ 16884: if (XEiJ.EFA_SEPARATE_AR) { 16885: XEiJ.mpuCycleCount += 24; 16886: return (XEiJ.regRn[15] += 12) - 12; 16887: } else { 16888: XEiJ.mpuCycleCount += 24; 16889: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12; 16890: } 16891: case 0b100_000: //-(A0) 16892: if (XEiJ.EFA_SEPARATE_AR) { 16893: XEiJ.mpuCycleCount += 26; 16894: return XEiJ.regRn[ 8] -= 12; 16895: } 16896: //fallthrough 16897: case 0b100_001: //-(A1) 16898: if (XEiJ.EFA_SEPARATE_AR) { 16899: XEiJ.mpuCycleCount += 26; 16900: return XEiJ.regRn[ 9] -= 12; 16901: } 16902: //fallthrough 16903: case 0b100_010: //-(A2) 16904: if (XEiJ.EFA_SEPARATE_AR) { 16905: XEiJ.mpuCycleCount += 26; 16906: return XEiJ.regRn[10] -= 12; 16907: } 16908: //fallthrough 16909: case 0b100_011: //-(A3) 16910: if (XEiJ.EFA_SEPARATE_AR) { 16911: XEiJ.mpuCycleCount += 26; 16912: return XEiJ.regRn[11] -= 12; 16913: } 16914: //fallthrough 16915: case 0b100_100: //-(A4) 16916: if (XEiJ.EFA_SEPARATE_AR) { 16917: XEiJ.mpuCycleCount += 26; 16918: return XEiJ.regRn[12] -= 12; 16919: } 16920: //fallthrough 16921: case 0b100_101: //-(A5) 16922: if (XEiJ.EFA_SEPARATE_AR) { 16923: XEiJ.mpuCycleCount += 26; 16924: return XEiJ.regRn[13] -= 12; 16925: } 16926: //fallthrough 16927: case 0b100_110: //-(A6) 16928: if (XEiJ.EFA_SEPARATE_AR) { 16929: XEiJ.mpuCycleCount += 26; 16930: return XEiJ.regRn[14] -= 12; 16931: } 16932: //fallthrough 16933: case 0b100_111: //-(A7) 16934: if (XEiJ.EFA_SEPARATE_AR) { 16935: XEiJ.mpuCycleCount += 26; 16936: return XEiJ.regRn[15] -= 12; 16937: } else { 16938: XEiJ.mpuCycleCount += 26; 16939: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12; 16940: } 16941: case 0b101_000: //(d16,A0) 16942: case 0b101_001: //(d16,A1) 16943: case 0b101_010: //(d16,A2) 16944: case 0b101_011: //(d16,A3) 16945: case 0b101_100: //(d16,A4) 16946: case 0b101_101: //(d16,A5) 16947: case 0b101_110: //(d16,A6) 16948: case 0b101_111: //(d16,A7) 16949: XEiJ.mpuCycleCount += 28; 16950: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16951: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16952: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 16953: } else { 16954: t = XEiJ.regPC; 16955: XEiJ.regPC = t + 2; 16956: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 16957: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16958: } 16959: case 0b110_000: //(d8,A0,Rn.wl) 16960: case 0b110_001: //(d8,A1,Rn.wl) 16961: case 0b110_010: //(d8,A2,Rn.wl) 16962: case 0b110_011: //(d8,A3,Rn.wl) 16963: case 0b110_100: //(d8,A4,Rn.wl) 16964: case 0b110_101: //(d8,A5,Rn.wl) 16965: case 0b110_110: //(d8,A6,Rn.wl) 16966: case 0b110_111: //(d8,A7,Rn.wl) 16967: XEiJ.mpuCycleCount += 30; 16968: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 16969: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 16970: } else { 16971: w = XEiJ.regPC; 16972: XEiJ.regPC = w + 2; 16973: w = XEiJ.busRwze (w); //pcwz。拡張ワード 16974: } 16975: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 16976: + (byte) w //バイトディスプレースメント 16977: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16978: XEiJ.regRn[w >> 12])); //ロングインデックス 16979: case 0b111_000: //(xxx).W 16980: XEiJ.mpuCycleCount += 28; 16981: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 16982: case 0b111_001: //(xxx).L 16983: XEiJ.mpuCycleCount += 32; 16984: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 16985: case 0b111_010: //(d16,PC) 16986: XEiJ.mpuCycleCount += 28; 16987: t = XEiJ.regPC; 16988: XEiJ.regPC = t + 2; 16989: return (t //ベースレジスタ 16990: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 16991: case 0b111_011: //(d8,PC,Rn.wl) 16992: XEiJ.mpuCycleCount += 30; 16993: t = XEiJ.regPC; 16994: XEiJ.regPC = t + 2; 16995: w = XEiJ.busRwze (t); //pcwz。拡張ワード 16996: return (t //ベースレジスタ 16997: + (byte) w //バイトディスプレースメント 16998: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 16999: XEiJ.regRn[w >> 12])); //ロングインデックス 17000: case 0b111_100: //#<data> 17001: XEiJ.mpuCycleCount += 24; 17002: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17003: return (XEiJ.regPC += 12) - 12; 17004: } else { 17005: t = XEiJ.regPC; 17006: XEiJ.regPC = t + 12; 17007: return t; 17008: } 17009: } //switch 17010: XEiJ.mpuCycleCount += 34; 17011: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17012: throw M68kException.m6eSignal; 17013: } //efaAnyExtd 17014: 17015: //a = efaMltExtd (ea) //| M+-WXZ | 17016: // メモリ可変モードのエクステンデッドオペランドの実効アドレスを求める 17017: // efaMltQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、 17018: // オペランドのアクセスが2ワード増える分の8サイクルが追加されていること 17019: @SuppressWarnings ("fallthrough") public static int efaMltExtd (int ea) throws M68kException { 17020: int t, w; 17021: switch (ea) { 17022: case 0b010_000: //(A0) 17023: if (XEiJ.EFA_SEPARATE_AR) { 17024: XEiJ.mpuCycleCount += 24; 17025: return XEiJ.regRn[ 8]; 17026: } 17027: //fallthrough 17028: case 0b010_001: //(A1) 17029: if (XEiJ.EFA_SEPARATE_AR) { 17030: XEiJ.mpuCycleCount += 24; 17031: return XEiJ.regRn[ 9]; 17032: } 17033: //fallthrough 17034: case 0b010_010: //(A2) 17035: if (XEiJ.EFA_SEPARATE_AR) { 17036: XEiJ.mpuCycleCount += 24; 17037: return XEiJ.regRn[10]; 17038: } 17039: //fallthrough 17040: case 0b010_011: //(A3) 17041: if (XEiJ.EFA_SEPARATE_AR) { 17042: XEiJ.mpuCycleCount += 24; 17043: return XEiJ.regRn[11]; 17044: } 17045: //fallthrough 17046: case 0b010_100: //(A4) 17047: if (XEiJ.EFA_SEPARATE_AR) { 17048: XEiJ.mpuCycleCount += 24; 17049: return XEiJ.regRn[12]; 17050: } 17051: //fallthrough 17052: case 0b010_101: //(A5) 17053: if (XEiJ.EFA_SEPARATE_AR) { 17054: XEiJ.mpuCycleCount += 24; 17055: return XEiJ.regRn[13]; 17056: } 17057: //fallthrough 17058: case 0b010_110: //(A6) 17059: if (XEiJ.EFA_SEPARATE_AR) { 17060: XEiJ.mpuCycleCount += 24; 17061: return XEiJ.regRn[14]; 17062: } 17063: //fallthrough 17064: case 0b010_111: //(A7) 17065: if (XEiJ.EFA_SEPARATE_AR) { 17066: XEiJ.mpuCycleCount += 24; 17067: return XEiJ.regRn[15]; 17068: } else { 17069: XEiJ.mpuCycleCount += 24; 17070: return XEiJ.regRn[ea - (0b010_000 - 8)]; 17071: } 17072: case 0b011_000: //(A0)+ 17073: if (XEiJ.EFA_SEPARATE_AR) { 17074: XEiJ.mpuCycleCount += 24; 17075: return (XEiJ.regRn[ 8] += 12) - 12; 17076: } 17077: //fallthrough 17078: case 0b011_001: //(A1)+ 17079: if (XEiJ.EFA_SEPARATE_AR) { 17080: XEiJ.mpuCycleCount += 24; 17081: return (XEiJ.regRn[ 9] += 12) - 12; 17082: } 17083: //fallthrough 17084: case 0b011_010: //(A2)+ 17085: if (XEiJ.EFA_SEPARATE_AR) { 17086: XEiJ.mpuCycleCount += 24; 17087: return (XEiJ.regRn[10] += 12) - 12; 17088: } 17089: //fallthrough 17090: case 0b011_011: //(A3)+ 17091: if (XEiJ.EFA_SEPARATE_AR) { 17092: XEiJ.mpuCycleCount += 24; 17093: return (XEiJ.regRn[11] += 12) - 12; 17094: } 17095: //fallthrough 17096: case 0b011_100: //(A4)+ 17097: if (XEiJ.EFA_SEPARATE_AR) { 17098: XEiJ.mpuCycleCount += 24; 17099: return (XEiJ.regRn[12] += 12) - 12; 17100: } 17101: //fallthrough 17102: case 0b011_101: //(A5)+ 17103: if (XEiJ.EFA_SEPARATE_AR) { 17104: XEiJ.mpuCycleCount += 24; 17105: return (XEiJ.regRn[13] += 12) - 12; 17106: } 17107: //fallthrough 17108: case 0b011_110: //(A6)+ 17109: if (XEiJ.EFA_SEPARATE_AR) { 17110: XEiJ.mpuCycleCount += 24; 17111: return (XEiJ.regRn[14] += 12) - 12; 17112: } 17113: //fallthrough 17114: case 0b011_111: //(A7)+ 17115: if (XEiJ.EFA_SEPARATE_AR) { 17116: XEiJ.mpuCycleCount += 24; 17117: return (XEiJ.regRn[15] += 12) - 12; 17118: } else { 17119: XEiJ.mpuCycleCount += 24; 17120: return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12; 17121: } 17122: case 0b100_000: //-(A0) 17123: case 0b100_001: //-(A1) 17124: case 0b100_010: //-(A2) 17125: case 0b100_011: //-(A3) 17126: case 0b100_100: //-(A4) 17127: case 0b100_101: //-(A5) 17128: case 0b100_110: //-(A6) 17129: case 0b100_111: //-(A7) 17130: XEiJ.mpuCycleCount += 26; 17131: return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12; 17132: case 0b101_000: //(d16,A0) 17133: case 0b101_001: //(d16,A1) 17134: case 0b101_010: //(d16,A2) 17135: case 0b101_011: //(d16,A3) 17136: case 0b101_100: //(d16,A4) 17137: case 0b101_101: //(d16,A5) 17138: case 0b101_110: //(d16,A6) 17139: case 0b101_111: //(d16,A7) 17140: XEiJ.mpuCycleCount += 28; 17141: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17142: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17143: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17144: } else { 17145: t = XEiJ.regPC; 17146: XEiJ.regPC = t + 2; 17147: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17148: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17149: } 17150: case 0b110_000: //(d8,A0,Rn.wl) 17151: case 0b110_001: //(d8,A1,Rn.wl) 17152: case 0b110_010: //(d8,A2,Rn.wl) 17153: case 0b110_011: //(d8,A3,Rn.wl) 17154: case 0b110_100: //(d8,A4,Rn.wl) 17155: case 0b110_101: //(d8,A5,Rn.wl) 17156: case 0b110_110: //(d8,A6,Rn.wl) 17157: case 0b110_111: //(d8,A7,Rn.wl) 17158: XEiJ.mpuCycleCount += 30; 17159: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17160: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17161: } else { 17162: w = XEiJ.regPC; 17163: XEiJ.regPC = w + 2; 17164: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17165: } 17166: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17167: + (byte) w //バイトディスプレースメント 17168: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17169: XEiJ.regRn[w >> 12])); //ロングインデックス 17170: case 0b111_000: //(xxx).W 17171: XEiJ.mpuCycleCount += 28; 17172: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17173: case 0b111_001: //(xxx).L 17174: XEiJ.mpuCycleCount += 32; 17175: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17176: } //switch 17177: XEiJ.mpuCycleCount += 34; 17178: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17179: throw M68kException.m6eSignal; 17180: } //efaMltExtd 17181: 17182: //a = efaLeaPea (ea) //| M WXZP | 17183: // LEA命令とPEA命令のオペランドの実効アドレスを求める 17184: // efaCntWordとの違いはサイクル数のみ 17185: // LEA命令のベースサイクル数4を含んでいるのでLEA命令ではベースサイクル数を加えなくてよい 17186: // PEA命令のベースサイクル数は12-4=8 17187: @SuppressWarnings ("fallthrough") public static int efaLeaPea (int ea) throws M68kException { 17188: int t, w; 17189: switch (ea) { 17190: case 0b010_000: //(A0) 17191: if (XEiJ.EFA_SEPARATE_AR) { 17192: XEiJ.mpuCycleCount += 4; 17193: return XEiJ.regRn[ 8]; 17194: } 17195: //fallthrough 17196: case 0b010_001: //(A1) 17197: if (XEiJ.EFA_SEPARATE_AR) { 17198: XEiJ.mpuCycleCount += 4; 17199: return XEiJ.regRn[ 9]; 17200: } 17201: //fallthrough 17202: case 0b010_010: //(A2) 17203: if (XEiJ.EFA_SEPARATE_AR) { 17204: XEiJ.mpuCycleCount += 4; 17205: return XEiJ.regRn[10]; 17206: } 17207: //fallthrough 17208: case 0b010_011: //(A3) 17209: if (XEiJ.EFA_SEPARATE_AR) { 17210: XEiJ.mpuCycleCount += 4; 17211: return XEiJ.regRn[11]; 17212: } 17213: //fallthrough 17214: case 0b010_100: //(A4) 17215: if (XEiJ.EFA_SEPARATE_AR) { 17216: XEiJ.mpuCycleCount += 4; 17217: return XEiJ.regRn[12]; 17218: } 17219: //fallthrough 17220: case 0b010_101: //(A5) 17221: if (XEiJ.EFA_SEPARATE_AR) { 17222: XEiJ.mpuCycleCount += 4; 17223: return XEiJ.regRn[13]; 17224: } 17225: //fallthrough 17226: case 0b010_110: //(A6) 17227: if (XEiJ.EFA_SEPARATE_AR) { 17228: XEiJ.mpuCycleCount += 4; 17229: return XEiJ.regRn[14]; 17230: } 17231: //fallthrough 17232: case 0b010_111: //(A7) 17233: if (XEiJ.EFA_SEPARATE_AR) { 17234: XEiJ.mpuCycleCount += 4; 17235: return XEiJ.regRn[15]; 17236: } else { 17237: XEiJ.mpuCycleCount += 4; 17238: return XEiJ.regRn[ea - (0b010_000 - 8)]; 17239: } 17240: case 0b101_000: //(d16,A0) 17241: case 0b101_001: //(d16,A1) 17242: case 0b101_010: //(d16,A2) 17243: case 0b101_011: //(d16,A3) 17244: case 0b101_100: //(d16,A4) 17245: case 0b101_101: //(d16,A5) 17246: case 0b101_110: //(d16,A6) 17247: case 0b101_111: //(d16,A7) 17248: XEiJ.mpuCycleCount += 8; 17249: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17250: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17251: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17252: } else { 17253: t = XEiJ.regPC; 17254: XEiJ.regPC = t + 2; 17255: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17256: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17257: } 17258: case 0b110_000: //(d8,A0,Rn.wl) 17259: case 0b110_001: //(d8,A1,Rn.wl) 17260: case 0b110_010: //(d8,A2,Rn.wl) 17261: case 0b110_011: //(d8,A3,Rn.wl) 17262: case 0b110_100: //(d8,A4,Rn.wl) 17263: case 0b110_101: //(d8,A5,Rn.wl) 17264: case 0b110_110: //(d8,A6,Rn.wl) 17265: case 0b110_111: //(d8,A7,Rn.wl) 17266: XEiJ.mpuCycleCount += 12; 17267: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17268: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17269: } else { 17270: w = XEiJ.regPC; 17271: XEiJ.regPC = w + 2; 17272: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17273: } 17274: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17275: + (byte) w //バイトディスプレースメント 17276: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17277: XEiJ.regRn[w >> 12])); //ロングインデックス 17278: case 0b111_000: //(xxx).W 17279: XEiJ.mpuCycleCount += 8; 17280: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17281: case 0b111_001: //(xxx).L 17282: XEiJ.mpuCycleCount += 12; 17283: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17284: case 0b111_010: //(d16,PC) 17285: XEiJ.mpuCycleCount += 8; 17286: t = XEiJ.regPC; 17287: XEiJ.regPC = t + 2; 17288: return (t //ベースレジスタ 17289: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17290: case 0b111_011: //(d8,PC,Rn.wl) 17291: XEiJ.mpuCycleCount += 12; 17292: t = XEiJ.regPC; 17293: XEiJ.regPC = t + 2; 17294: w = XEiJ.busRwze (t); //pcwz。拡張ワード 17295: return (t //ベースレジスタ 17296: + (byte) w //バイトディスプレースメント 17297: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17298: XEiJ.regRn[w >> 12])); //ロングインデックス 17299: } //switch 17300: XEiJ.mpuCycleCount += 34; 17301: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17302: throw M68kException.m6eSignal; 17303: } //efaLeaPea 17304: 17305: //a = efaJmpJsr (ea) //| M WXZP | 17306: // JMP命令とJSR命令のオペランドの実効アドレスを求める 17307: // efaCntWordとの違いはサイクル数のみ 17308: // JMP命令のベースサイクル数8を含んでいるのでJMP命令ではベースサイクル数を加えなくてよい 17309: // JSR命令のベースサイクル数は16-8=8 17310: @SuppressWarnings ("fallthrough") public static int efaJmpJsr (int ea) throws M68kException { 17311: int t, w; 17312: switch (ea) { 17313: case 0b010_000: //(A0) 17314: if (XEiJ.EFA_SEPARATE_AR) { 17315: XEiJ.mpuCycleCount += 8; 17316: return XEiJ.regRn[ 8]; 17317: } 17318: //fallthrough 17319: case 0b010_001: //(A1) 17320: if (XEiJ.EFA_SEPARATE_AR) { 17321: XEiJ.mpuCycleCount += 8; 17322: return XEiJ.regRn[ 9]; 17323: } 17324: //fallthrough 17325: case 0b010_010: //(A2) 17326: if (XEiJ.EFA_SEPARATE_AR) { 17327: XEiJ.mpuCycleCount += 8; 17328: return XEiJ.regRn[10]; 17329: } 17330: //fallthrough 17331: case 0b010_011: //(A3) 17332: if (XEiJ.EFA_SEPARATE_AR) { 17333: XEiJ.mpuCycleCount += 8; 17334: return XEiJ.regRn[11]; 17335: } 17336: //fallthrough 17337: case 0b010_100: //(A4) 17338: if (XEiJ.EFA_SEPARATE_AR) { 17339: XEiJ.mpuCycleCount += 8; 17340: return XEiJ.regRn[12]; 17341: } 17342: //fallthrough 17343: case 0b010_101: //(A5) 17344: if (XEiJ.EFA_SEPARATE_AR) { 17345: XEiJ.mpuCycleCount += 8; 17346: return XEiJ.regRn[13]; 17347: } 17348: //fallthrough 17349: case 0b010_110: //(A6) 17350: if (XEiJ.EFA_SEPARATE_AR) { 17351: XEiJ.mpuCycleCount += 8; 17352: return XEiJ.regRn[14]; 17353: } 17354: //fallthrough 17355: case 0b010_111: //(A7) 17356: if (XEiJ.EFA_SEPARATE_AR) { 17357: XEiJ.mpuCycleCount += 8; 17358: return XEiJ.regRn[15]; 17359: } else { 17360: XEiJ.mpuCycleCount += 8; 17361: return XEiJ.regRn[ea - (0b010_000 - 8)]; 17362: } 17363: case 0b101_000: //(d16,A0) 17364: case 0b101_001: //(d16,A1) 17365: case 0b101_010: //(d16,A2) 17366: case 0b101_011: //(d16,A3) 17367: case 0b101_100: //(d16,A4) 17368: case 0b101_101: //(d16,A5) 17369: case 0b101_110: //(d16,A6) 17370: case 0b101_111: //(d16,A7) 17371: XEiJ.mpuCycleCount += 10; 17372: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17373: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17374: + XEiJ.busRwse ((XEiJ.regPC += 2) - 2)); //pcws。ワードディスプレースメント 17375: } else { 17376: t = XEiJ.regPC; 17377: XEiJ.regPC = t + 2; 17378: return (XEiJ.regRn[ea - (0b101_000 - 8)] //ベースレジスタ 17379: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17380: } 17381: case 0b110_000: //(d8,A0,Rn.wl) 17382: case 0b110_001: //(d8,A1,Rn.wl) 17383: case 0b110_010: //(d8,A2,Rn.wl) 17384: case 0b110_011: //(d8,A3,Rn.wl) 17385: case 0b110_100: //(d8,A4,Rn.wl) 17386: case 0b110_101: //(d8,A5,Rn.wl) 17387: case 0b110_110: //(d8,A6,Rn.wl) 17388: case 0b110_111: //(d8,A7,Rn.wl) 17389: XEiJ.mpuCycleCount += 14; 17390: if (XEiJ.MPU_COMPOUND_POSTINCREMENT) { 17391: w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2); //pcwz。拡張ワード 17392: } else { 17393: w = XEiJ.regPC; 17394: XEiJ.regPC = w + 2; 17395: w = XEiJ.busRwze (w); //pcwz。拡張ワード 17396: } 17397: return (XEiJ.regRn[ea - (0b110_000 - 8)] //ベースレジスタ 17398: + (byte) w //バイトディスプレースメント 17399: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17400: XEiJ.regRn[w >> 12])); //ロングインデックス 17401: case 0b111_000: //(xxx).W 17402: XEiJ.mpuCycleCount += 10; 17403: return XEiJ.busRwse ((XEiJ.regPC += 2) - 2); //pcws 17404: case 0b111_001: //(xxx).L 17405: XEiJ.mpuCycleCount += 12; 17406: return XEiJ.busRlse ((XEiJ.regPC += 4) - 4); //pcls 17407: case 0b111_010: //(d16,PC) 17408: XEiJ.mpuCycleCount += 10; 17409: t = XEiJ.regPC; 17410: XEiJ.regPC = t + 2; 17411: return (t //ベースレジスタ 17412: + XEiJ.busRwse (t)); //pcws。ワードディスプレースメント 17413: case 0b111_011: //(d8,PC,Rn.wl) 17414: XEiJ.mpuCycleCount += 14; 17415: t = XEiJ.regPC; 17416: XEiJ.regPC = t + 2; 17417: w = XEiJ.busRwze (t); //pcwz。拡張ワード 17418: return (t //ベースレジスタ 17419: + (byte) w //バイトディスプレースメント 17420: + (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] : //ワードインデックス 17421: XEiJ.regRn[w >> 12])); //ロングインデックス 17422: } //switch 17423: XEiJ.mpuCycleCount += 34; 17424: M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION; 17425: throw M68kException.m6eSignal; 17426: } //efaJmpJsr 17427: 17428: 17429: 17430: } //class MC68010 17431: 17432: 17433: