|
|
|
@@ -9,6 +9,31 @@ enum class Machine {
|
|
|
|
|
MC68060
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum class Register(val regname: String, val num: Int) {
|
|
|
|
|
D0("d0", 0),
|
|
|
|
|
D1("d1", 1),
|
|
|
|
|
D2("d2", 2),
|
|
|
|
|
D3("d3", 3),
|
|
|
|
|
D4("d4", 4),
|
|
|
|
|
D5("d5", 5),
|
|
|
|
|
D6("d6", 6),
|
|
|
|
|
D7("d7", 7),
|
|
|
|
|
A0("a0", 0),
|
|
|
|
|
A1("a1", 1),
|
|
|
|
|
A2("a2", 2),
|
|
|
|
|
A3("a3", 3),
|
|
|
|
|
A4("a4", 4),
|
|
|
|
|
A5("a5", 5),
|
|
|
|
|
A6("a6", 6),
|
|
|
|
|
A7("a7", 7);
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
|
private val NAME_TO_REG_MAP = values().associateBy { it.regname }
|
|
|
|
|
|
|
|
|
|
fun getRegFromName(regname: String) = NAME_TO_REG_MAP[regname.lowercase()]!!
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum class AddressMode {
|
|
|
|
|
IMMEDIATE_DATA,
|
|
|
|
|
ADDRESS_REGISTER_INDIRECT_PRE_DEC,
|
|
|
|
@@ -35,11 +60,63 @@ const val OP_SIZE_BWL = (OP_SIZE_B or OP_SIZE_W or OP_SIZE_L)
|
|
|
|
|
const val OP_SIZE_WL = (OP_SIZE_W or OP_SIZE_L)
|
|
|
|
|
const val OP_SIZE_SBW = (OP_SIZE_B or OP_SIZE_S or OP_SIZE_W)
|
|
|
|
|
|
|
|
|
|
const val RWM_READ_OPSIZE = 0x10
|
|
|
|
|
const val RWM_READ_B = 0x11
|
|
|
|
|
const val RWM_READ_W = 0x12
|
|
|
|
|
const val RWM_READ_L = 0x13
|
|
|
|
|
|
|
|
|
|
const val RWM_SET_OPSIZE = 0x20
|
|
|
|
|
const val RWM_SET_B = 0x21
|
|
|
|
|
const val RWM_SET_W = 0x22
|
|
|
|
|
const val RWM_SET_L = 0x23
|
|
|
|
|
|
|
|
|
|
const val RWM_MODIFY_OPSIZE = 0x30
|
|
|
|
|
const val RWM_MODIFY_B = 0x31
|
|
|
|
|
const val RWM_MODIFY_W = 0x32
|
|
|
|
|
const val RWM_MODIFY_L = 0x33
|
|
|
|
|
|
|
|
|
|
const val RWM_OP_MASK = 0xff
|
|
|
|
|
const val RWM_OP1_SHIFT = 0
|
|
|
|
|
const val RWM_OP2_SHIFT = 8
|
|
|
|
|
|
|
|
|
|
const val RWM_READ_OP1_OPSIZE = RWM_READ_OPSIZE shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_READ_OP1_B = RWM_READ_B shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_READ_OP1_W = RWM_READ_W shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_READ_OP1_L = RWM_READ_L shl RWM_OP1_SHIFT
|
|
|
|
|
|
|
|
|
|
const val RWM_SET_OP1_OPSIZE = RWM_SET_OPSIZE shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_SET_OP1_B = RWM_SET_B shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_SET_OP1_W = RWM_SET_W shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_SET_OP1_L = RWM_SET_L shl RWM_OP1_SHIFT
|
|
|
|
|
|
|
|
|
|
const val RWM_MODIFY_OP1_OPSIZE = RWM_MODIFY_OPSIZE shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_MODIFY_OP1_B = RWM_MODIFY_B shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_MODIFY_OP1_W = RWM_MODIFY_W shl RWM_OP1_SHIFT
|
|
|
|
|
const val RWM_MODIFY_OP1_L = RWM_MODIFY_L shl RWM_OP1_SHIFT
|
|
|
|
|
|
|
|
|
|
const val RWM_READ_OP2_OPSIZE = RWM_READ_OPSIZE shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_READ_OP2_B = RWM_READ_B shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_READ_OP2_W = RWM_READ_W shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_READ_OP2_L = RWM_READ_L shl RWM_OP2_SHIFT
|
|
|
|
|
|
|
|
|
|
const val RWM_SET_OP2_OPSIZE = RWM_SET_OPSIZE shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_SET_OP2_B = RWM_SET_B shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_SET_OP2_W = RWM_SET_W shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_SET_OP2_L = RWM_SET_L shl RWM_OP2_SHIFT
|
|
|
|
|
|
|
|
|
|
const val RWM_MODIFY_OP2_OPSIZE = RWM_MODIFY_OPSIZE shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_MODIFY_OP2_B = RWM_MODIFY_B shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_MODIFY_OP2_W = RWM_MODIFY_W shl RWM_OP2_SHIFT
|
|
|
|
|
const val RWM_MODIFY_OP2_L = RWM_MODIFY_L shl RWM_OP2_SHIFT
|
|
|
|
|
|
|
|
|
|
const val RWM_MODIFY_STACK = 0x10000
|
|
|
|
|
|
|
|
|
|
data class AllowedAdrMode(
|
|
|
|
|
val op1: Set<AddressMode>? = null,
|
|
|
|
|
val op2: Set<AddressMode>? = null,
|
|
|
|
|
val size: Int = OP_SIZE_BWL,
|
|
|
|
|
val specialReg: String? = null
|
|
|
|
|
val specialReg: String? = null,
|
|
|
|
|
val modInfo: Int = 0
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
data class IsaData(
|
|
|
|
@@ -51,7 +128,7 @@ data class IsaData(
|
|
|
|
|
val id: String = mnemonic,
|
|
|
|
|
val isPrivileged: Boolean = false,
|
|
|
|
|
val hasOps: Boolean = true,
|
|
|
|
|
val modes: List<AllowedAdrMode> = listOf(AllowedAdrMode())
|
|
|
|
|
val modes: List<AllowedAdrMode> = listOf(AllowedAdrMode()),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
object M68kIsa {
|
|
|
|
@@ -131,21 +208,34 @@ object M68kIsa {
|
|
|
|
|
private val DREG_ONLY = setOf(AddressMode.DATA_REGISTER_DIRECT)
|
|
|
|
|
|
|
|
|
|
private val ADD_SUB_MODES = listOf(
|
|
|
|
|
AllowedAdrMode(ALL_EXCEPT_AREG, setOf(AddressMode.DATA_REGISTER_DIRECT)),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.ADDRESS_REGISTER_DIRECT), setOf(AddressMode.DATA_REGISTER_DIRECT), OP_SIZE_WL),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.DATA_REGISTER_DIRECT), INDIRECT_MODES),
|
|
|
|
|
AllowedAdrMode(ALL_EXCEPT_AREG, setOf(AddressMode.DATA_REGISTER_DIRECT), modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_DIRECT),
|
|
|
|
|
setOf(AddressMode.DATA_REGISTER_DIRECT),
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE
|
|
|
|
|
),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.DATA_REGISTER_DIRECT), INDIRECT_MODES, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private val ASD_LSD_ROD_ROXD_MODES = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), DREG_ONLY),
|
|
|
|
|
AllowedAdrMode(INDIRECT_MODES, null),
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), DREG_ONLY, modInfo = RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(INDIRECT_MODES, null, modInfo = RWM_MODIFY_OP1_OPSIZE),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private val BTST_BCHG_BCLR_BSET_MODES = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, OP_SIZE_L),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), DREG_ONLY, OP_SIZE_L),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), INDIRECT_MODES, OP_SIZE_B),
|
|
|
|
|
private val BCHG_BCLR_BSET_MODES = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, OP_SIZE_L, modInfo = RWM_READ_OP1_B or RWM_MODIFY_OP2_L),
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, INDIRECT_MODES, OP_SIZE_B, modInfo = RWM_READ_OP1_B or RWM_MODIFY_OP2_B),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), DREG_ONLY, OP_SIZE_L, modInfo = RWM_MODIFY_OP2_L),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), INDIRECT_MODES, OP_SIZE_B, modInfo = RWM_MODIFY_OP2_B),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private val BTST_MODES = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, OP_SIZE_L, modInfo = RWM_READ_OP1_B or RWM_READ_OP2_L),
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, INDIRECT_MODES, OP_SIZE_B, modInfo = RWM_READ_OP1_B or RWM_READ_OP2_B),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), DREG_ONLY, OP_SIZE_L, modInfo = RWM_READ_OP2_L),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), INDIRECT_MODES, OP_SIZE_B, modInfo = RWM_READ_OP2_B),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
private val conditionCodes =
|
|
|
|
@@ -158,11 +248,11 @@ object M68kIsa {
|
|
|
|
|
// Data Movement Instructions
|
|
|
|
|
IsaData(
|
|
|
|
|
"move", "Move",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_68000_MODES, ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_68000_MODES, ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_READ_OP1_OPSIZE or RWM_SET_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"movea", "Move Address", altMnemonics = listOf("move"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL, modInfo = RWM_READ_OP1_OPSIZE or RWM_SET_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"movem", "Move Multiple Registers",
|
|
|
|
@@ -176,7 +266,8 @@ object M68kIsa {
|
|
|
|
|
AddressMode.ADDRESS_REGISTER_INDIRECT_WITH_INDEX,
|
|
|
|
|
AddressMode.ABSOLUTE_ADDRESS
|
|
|
|
|
),
|
|
|
|
|
OP_SIZE_WL
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_SET_OP2_OPSIZE
|
|
|
|
|
),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(
|
|
|
|
@@ -187,7 +278,8 @@ object M68kIsa {
|
|
|
|
|
AddressMode.ABSOLUTE_ADDRESS
|
|
|
|
|
),
|
|
|
|
|
setOf(AddressMode.REGISTER_LIST),
|
|
|
|
|
OP_SIZE_WL
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_SET_OP2_OPSIZE
|
|
|
|
|
),
|
|
|
|
|
// according to Yann, specifying the registers as bitmask is also valid
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
@@ -199,7 +291,8 @@ object M68kIsa {
|
|
|
|
|
AddressMode.ADDRESS_REGISTER_INDIRECT_WITH_INDEX,
|
|
|
|
|
AddressMode.ABSOLUTE_ADDRESS
|
|
|
|
|
),
|
|
|
|
|
OP_SIZE_WL
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_SET_OP2_OPSIZE // Can't map immediate data to registers
|
|
|
|
|
),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(
|
|
|
|
@@ -210,7 +303,8 @@ object M68kIsa {
|
|
|
|
|
AddressMode.ABSOLUTE_ADDRESS
|
|
|
|
|
),
|
|
|
|
|
setOf(AddressMode.IMMEDIATE_DATA),
|
|
|
|
|
OP_SIZE_WL
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE // Can't map immediate data to registers
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
@@ -220,19 +314,21 @@ object M68kIsa {
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
DREG_ONLY,
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT, AddressMode.ADDRESS_REGISTER_INDIRECT_WITH_DISPLACEMENT),
|
|
|
|
|
OP_SIZE_WL
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE
|
|
|
|
|
),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT, AddressMode.ADDRESS_REGISTER_INDIRECT_WITH_DISPLACEMENT),
|
|
|
|
|
DREG_ONLY,
|
|
|
|
|
OP_SIZE_WL
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_SET_OP2_OPSIZE
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData(
|
|
|
|
|
"moveq", "Move Quick",
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), DREG_ONLY, OP_SIZE_L))
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), DREG_ONLY, OP_SIZE_L, modInfo = RWM_SET_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData(
|
|
|
|
@@ -241,7 +337,8 @@ object M68kIsa {
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.DATA_REGISTER_DIRECT, AddressMode.ADDRESS_REGISTER_DIRECT),
|
|
|
|
|
setOf(AddressMode.DATA_REGISTER_DIRECT, AddressMode.ADDRESS_REGISTER_DIRECT),
|
|
|
|
|
OP_SIZE_L
|
|
|
|
|
OP_SIZE_L,
|
|
|
|
|
modInfo = RWM_SET_OP1_L or RWM_SET_OP2_L
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
@@ -258,7 +355,8 @@ object M68kIsa {
|
|
|
|
|
AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_INDEX,
|
|
|
|
|
),
|
|
|
|
|
AREG_ONLY,
|
|
|
|
|
OP_SIZE_L
|
|
|
|
|
OP_SIZE_L,
|
|
|
|
|
modInfo = RWM_SET_OP2_L
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
@@ -275,116 +373,165 @@ object M68kIsa {
|
|
|
|
|
AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_INDEX,
|
|
|
|
|
),
|
|
|
|
|
null,
|
|
|
|
|
OP_SIZE_L
|
|
|
|
|
OP_SIZE_L,
|
|
|
|
|
modInfo = RWM_MODIFY_STACK
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"link", "Link and Allocate",
|
|
|
|
|
modes = listOf(AllowedAdrMode(AREG_ONLY, setOf(AddressMode.IMMEDIATE_DATA), OP_SIZE_W))
|
|
|
|
|
modes = listOf(AllowedAdrMode(AREG_ONLY, setOf(AddressMode.IMMEDIATE_DATA), OP_SIZE_W, modInfo = RWM_SET_OP1_L or RWM_MODIFY_STACK))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"unlk", "Unlink",
|
|
|
|
|
modes = listOf(AllowedAdrMode(AREG_ONLY, null, OP_UNSIZED))
|
|
|
|
|
modes = listOf(AllowedAdrMode(AREG_ONLY, null, OP_UNSIZED, modInfo = RWM_SET_OP1_L or RWM_MODIFY_STACK))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
// Integer Arithmetic Instructions
|
|
|
|
|
IsaData("add", "Add", modes = ADD_SUB_MODES),
|
|
|
|
|
IsaData("adda", "Add Address", altMnemonics = listOf("add"), modes = listOf(AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL))),
|
|
|
|
|
IsaData(
|
|
|
|
|
"adda", "Add Address", altMnemonics = listOf("add"),
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_L),
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"addi", "Add Immediate", altMnemonics = listOf("add"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_MODIFY_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"addq", "Add Quick", modes = listOf(
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), AREG_ONLY, size = OP_SIZE_WL)
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), AREG_ONLY, size = OP_SIZE_WL, modInfo = RWM_MODIFY_OP2_L)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"addx", "Add with Extend",
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC), setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC))
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData("sub", "Subtract", modes = ADD_SUB_MODES),
|
|
|
|
|
IsaData("suba", "Subtract Address", altMnemonics = listOf("sub"), modes = listOf(AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL))),
|
|
|
|
|
IsaData(
|
|
|
|
|
"suba", "Subtract Address", altMnemonics = listOf("sub"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"subi", "Subtract Immediate", altMnemonics = listOf("sub"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_MODIFY_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"subq", "Subtract Quick", modes = listOf(
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), AREG_ONLY, size = OP_SIZE_WL)
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), AREG_ONLY, size = OP_SIZE_WL, modInfo = RWM_MODIFY_OP2_L)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"subx", "Subtract with Extend",
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC), setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC))
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData("neg", "Negate", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null))),
|
|
|
|
|
IsaData("negx", "Negate with Extend", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null))),
|
|
|
|
|
IsaData("neg", "Negate", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, modInfo = RWM_MODIFY_OP1_OPSIZE))),
|
|
|
|
|
IsaData("negx", "Negate with Extend", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, modInfo = RWM_MODIFY_OP1_OPSIZE))),
|
|
|
|
|
|
|
|
|
|
IsaData("clr", "Clear", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null))),
|
|
|
|
|
IsaData("clr", "Clear", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, modInfo = RWM_SET_OP1_OPSIZE))),
|
|
|
|
|
|
|
|
|
|
IsaData(
|
|
|
|
|
"cmp", "Compare", modes = listOf(
|
|
|
|
|
AllowedAdrMode(ALL_EXCEPT_AREG, setOf(AddressMode.DATA_REGISTER_DIRECT)),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.ADDRESS_REGISTER_DIRECT), setOf(AddressMode.DATA_REGISTER_DIRECT), OP_SIZE_WL),
|
|
|
|
|
AllowedAdrMode(ALL_EXCEPT_AREG, setOf(AddressMode.DATA_REGISTER_DIRECT), modInfo = RWM_READ_OP1_OPSIZE or RWM_READ_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_DIRECT),
|
|
|
|
|
setOf(AddressMode.DATA_REGISTER_DIRECT),
|
|
|
|
|
OP_SIZE_WL,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_READ_OP2_OPSIZE
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData("cmpa", "Compare Address", altMnemonics = listOf("cmp"), modes = listOf(AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL))),
|
|
|
|
|
IsaData(
|
|
|
|
|
"cmpa", "Compare Address", altMnemonics = listOf("cmp"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_68000_MODES, AREG_ONLY, OP_SIZE_WL, modInfo = RWM_READ_OP1_OPSIZE or RWM_READ_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"cmpi", "Compare Immediate", altMnemonics = listOf("cmp"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_AND_IMMEDIATE))
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_AND_IMMEDIATE, modInfo = RWM_READ_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"cmpm", "Compare Memory to Memory", altMnemonics = listOf("cmp"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_POST_INC), setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_POST_INC)))
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_POST_INC),
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_POST_INC),
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_READ_OP2_OPSIZE
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData("muls", "Signed Multiply", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W))),
|
|
|
|
|
IsaData("mulu", "Unsigned Multiply", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W))),
|
|
|
|
|
IsaData("divs", "Signed Divide", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W))),
|
|
|
|
|
IsaData("divu", "Unsigned Divide", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W))),
|
|
|
|
|
IsaData(
|
|
|
|
|
"muls", "Signed Multiply",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W, modInfo = RWM_READ_OP1_W or RWM_MODIFY_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"mulu", "Unsigned Multiply",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W, modInfo = RWM_READ_OP1_W or RWM_MODIFY_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"divs", "Signed Divide",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W, modInfo = RWM_READ_OP1_L or RWM_MODIFY_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"divu", "Unsigned Divide",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W, modInfo = RWM_READ_OP1_L or RWM_MODIFY_OP2_L))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData("ext", "Sign Extend", modes = listOf(AllowedAdrMode(DREG_ONLY, null, OP_SIZE_WL))),
|
|
|
|
|
IsaData("ext", "Sign Extend", modes = listOf(AllowedAdrMode(DREG_ONLY, null, OP_SIZE_WL, modInfo = RWM_MODIFY_OP1_OPSIZE))),
|
|
|
|
|
|
|
|
|
|
// Logical Instructions
|
|
|
|
|
IsaData(
|
|
|
|
|
"and", "Logical AND",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY), AllowedAdrMode(DREG_ONLY, INDIRECT_MODES))
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, INDIRECT_MODES, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"andi", "Logical AND Immediate", altMnemonics = listOf("and"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_MODIFY_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"eor", "Logical Exclusive-OR",
|
|
|
|
|
modes = listOf(AllowedAdrMode(DREG_ONLY, ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(DREG_ONLY, ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"eori", "Logical Exclusive-OR Immediate", altMnemonics = listOf("eor"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_MODIFY_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"or", "Logical Inclusive-OR",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY), AllowedAdrMode(DREG_ONLY, INDIRECT_MODES))
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, INDIRECT_MODES, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"ori", "Logical Inclusive-OR Immediate", altMnemonics = listOf("or"),
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL))
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, modInfo = RWM_MODIFY_OP2_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"not", "Logical Complement",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null))
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, modInfo = RWM_MODIFY_OP1_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
// Shift and Rotate Instructions
|
|
|
|
@@ -396,32 +543,42 @@ object M68kIsa {
|
|
|
|
|
IsaData("ror", "Rotate Right", modes = ASD_LSD_ROD_ROXD_MODES),
|
|
|
|
|
IsaData("roxl", "Rotate with Extend Left", modes = ASD_LSD_ROD_ROXD_MODES),
|
|
|
|
|
IsaData("roxr", "Rotate with Extend Right", modes = ASD_LSD_ROD_ROXD_MODES),
|
|
|
|
|
IsaData("swap", "Swap Register Words", modes = listOf(AllowedAdrMode(DREG_ONLY, null, OP_SIZE_W))),
|
|
|
|
|
IsaData("swap", "Swap Register Words", modes = listOf(AllowedAdrMode(DREG_ONLY, null, OP_SIZE_W, modInfo = RWM_MODIFY_OP1_L))),
|
|
|
|
|
|
|
|
|
|
// Bit Manipulation Instructions
|
|
|
|
|
IsaData("bchg", "Test Bit and Change", modes = BTST_BCHG_BCLR_BSET_MODES),
|
|
|
|
|
IsaData("bclr", "Test Bit and Clear", modes = BTST_BCHG_BCLR_BSET_MODES),
|
|
|
|
|
IsaData("bset", "Test Bit and Set", modes = BTST_BCHG_BCLR_BSET_MODES),
|
|
|
|
|
IsaData("btst", "Test Bit", modes = BTST_BCHG_BCLR_BSET_MODES),
|
|
|
|
|
IsaData("bchg", "Test Bit and Change", modes = BCHG_BCLR_BSET_MODES),
|
|
|
|
|
IsaData("bclr", "Test Bit and Clear", modes = BCHG_BCLR_BSET_MODES),
|
|
|
|
|
IsaData("bset", "Test Bit and Set", modes = BCHG_BCLR_BSET_MODES),
|
|
|
|
|
IsaData("btst", "Test Bit", modes = BTST_MODES),
|
|
|
|
|
|
|
|
|
|
// Binary-Coded Decimal Instructions
|
|
|
|
|
IsaData(
|
|
|
|
|
"abcd", "Add Decimal with Extend",
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, OP_SIZE_B),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC), setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC), OP_SIZE_B)
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, OP_SIZE_B, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
OP_SIZE_B,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"sbcd", "Subtract Decimal with Extend",
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, OP_SIZE_B),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC), setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC), OP_SIZE_B)
|
|
|
|
|
AllowedAdrMode(DREG_ONLY, DREG_ONLY, OP_SIZE_B, modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE),
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
setOf(AddressMode.ADDRESS_REGISTER_INDIRECT_PRE_DEC),
|
|
|
|
|
OP_SIZE_B,
|
|
|
|
|
modInfo = RWM_READ_OP1_OPSIZE or RWM_MODIFY_OP2_OPSIZE
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"nbcd", "Negate Decimal with Extend",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, OP_SIZE_B))
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, OP_SIZE_B, modInfo = RWM_MODIFY_OP1_OPSIZE))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
// Program Control Instructions
|
|
|
|
@@ -430,18 +587,22 @@ object M68kIsa {
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.ABSOLUTE_ADDRESS), null, OP_SIZE_SBW))
|
|
|
|
|
),
|
|
|
|
|
IsaData("bra", "Branch", modes = listOf(AllowedAdrMode(setOf(AddressMode.ABSOLUTE_ADDRESS), null, OP_SIZE_SBW))),
|
|
|
|
|
IsaData("bsr", "Branch to Subroutine", modes = listOf(AllowedAdrMode(setOf(AddressMode.ABSOLUTE_ADDRESS), null, OP_SIZE_SBW))),
|
|
|
|
|
IsaData(
|
|
|
|
|
"bsr",
|
|
|
|
|
"Branch to Subroutine",
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.ABSOLUTE_ADDRESS), null, OP_SIZE_SBW, modInfo = RWM_MODIFY_STACK))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData(
|
|
|
|
|
"dbCC",
|
|
|
|
|
"Test Condition, Decrement, and Branch",
|
|
|
|
|
altMnemonics = listOf("dbra"),
|
|
|
|
|
conditionCodes = conditionCodes,
|
|
|
|
|
modes = listOf(AllowedAdrMode(DREG_ONLY, setOf(AddressMode.ABSOLUTE_ADDRESS), OP_SIZE_W))
|
|
|
|
|
modes = listOf(AllowedAdrMode(DREG_ONLY, setOf(AddressMode.ABSOLUTE_ADDRESS), OP_SIZE_W, modInfo = RWM_MODIFY_OP1_W))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"sCC", "Set Conditionally", conditionCodes = conditionCodes,
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, OP_SIZE_B))
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, OP_SIZE_B, modInfo = RWM_SET_OP2_B))
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData(
|
|
|
|
@@ -470,16 +631,16 @@ object M68kIsa {
|
|
|
|
|
AddressMode.ABSOLUTE_ADDRESS,
|
|
|
|
|
AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_DISPLACEMENT,
|
|
|
|
|
AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_INDEX
|
|
|
|
|
), null, OP_UNSIZED
|
|
|
|
|
), null, OP_UNSIZED, modInfo = RWM_MODIFY_STACK
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData("nop", "No Operation", hasOps = false, modes = NO_OPS_UNSIZED),
|
|
|
|
|
|
|
|
|
|
IsaData("rtr", "Return and Restore", hasOps = false, modes = NO_OPS_UNSIZED),
|
|
|
|
|
IsaData("rts", "Return from Subroutine", hasOps = false, modes = NO_OPS_UNSIZED),
|
|
|
|
|
IsaData("rtr", "Return and Restore", hasOps = false, modes = listOf(AllowedAdrMode(size = OP_UNSIZED, modInfo = RWM_MODIFY_STACK))),
|
|
|
|
|
IsaData("rts", "Return from Subroutine", hasOps = false, modes = listOf(AllowedAdrMode(size = OP_UNSIZED, modInfo = RWM_MODIFY_STACK))),
|
|
|
|
|
|
|
|
|
|
IsaData("tst", "Test Operand", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null))),
|
|
|
|
|
IsaData("tst", "Test Operand", modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, null, modInfo = RWM_READ_OP1_OPSIZE))),
|
|
|
|
|
|
|
|
|
|
// System Control Instructions
|
|
|
|
|
IsaData(
|
|
|
|
@@ -496,7 +657,15 @@ object M68kIsa {
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"move", "Move from Status Register", id = "move from SR",
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.SPECIAL_REGISTER_DIRECT), ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL, OP_SIZE_W, "sr"))
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(
|
|
|
|
|
setOf(AddressMode.SPECIAL_REGISTER_DIRECT),
|
|
|
|
|
ALL_EXCEPT_AREG_IMMEDIATE_AND_PC_REL,
|
|
|
|
|
OP_SIZE_W,
|
|
|
|
|
"sr",
|
|
|
|
|
modInfo = RWM_SET_OP2_W
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"move", "Move to Status Register", id = "move to SR", isPrivileged = true,
|
|
|
|
@@ -505,13 +674,16 @@ object M68kIsa {
|
|
|
|
|
IsaData(
|
|
|
|
|
"move", "Move User Stack Pointer", id = "move USP", isPrivileged = true,
|
|
|
|
|
modes = listOf(
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.SPECIAL_REGISTER_DIRECT), AREG_ONLY, OP_SIZE_L, "usp"),
|
|
|
|
|
AllowedAdrMode(AREG_ONLY, setOf(AddressMode.SPECIAL_REGISTER_DIRECT), OP_SIZE_L, "usp"),
|
|
|
|
|
AllowedAdrMode(setOf(AddressMode.SPECIAL_REGISTER_DIRECT), AREG_ONLY, OP_SIZE_L, "usp", modInfo = RWM_SET_OP2_L),
|
|
|
|
|
AllowedAdrMode(AREG_ONLY, setOf(AddressMode.SPECIAL_REGISTER_DIRECT), OP_SIZE_L, "usp", modInfo = RWM_READ_OP1_L),
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
IsaData("reset", "Reset External Devices", isPrivileged = true, hasOps = false, modes = NO_OPS_UNSIZED),
|
|
|
|
|
IsaData("rte", "Return from Exception", isPrivileged = true, hasOps = false, modes = NO_OPS_UNSIZED),
|
|
|
|
|
IsaData(
|
|
|
|
|
"rte", "Return from Exception", isPrivileged = true, hasOps = false,
|
|
|
|
|
modes = listOf(AllowedAdrMode(size = OP_UNSIZED, modInfo = RWM_MODIFY_STACK))
|
|
|
|
|
),
|
|
|
|
|
IsaData(
|
|
|
|
|
"stop", "Stop", isPrivileged = true,
|
|
|
|
|
modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), null, OP_UNSIZED))
|
|
|
|
@@ -519,7 +691,7 @@ object M68kIsa {
|
|
|
|
|
|
|
|
|
|
IsaData(
|
|
|
|
|
"chk", "Check Register Against Bound",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W))
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_AREG, DREG_ONLY, OP_SIZE_W, modInfo = RWM_READ_OP1_W or RWM_READ_OP2_W))
|
|
|
|
|
),
|
|
|
|
|
IsaData("illegal", "Take Illegal Instruction Trap", hasOps = false, modes = NO_OPS_UNSIZED),
|
|
|
|
|
IsaData("trap", "Trap", modes = listOf(AllowedAdrMode(setOf(AddressMode.IMMEDIATE_DATA), null, OP_UNSIZED))),
|
|
|
|
@@ -543,7 +715,10 @@ object M68kIsa {
|
|
|
|
|
),
|
|
|
|
|
|
|
|
|
|
// Multiprocessor Instructions
|
|
|
|
|
IsaData("tas", "Test Operand and Set", modes = listOf(AllowedAdrMode(ALL_EXCEPT_IMMEDIATE_AND_PC_REL, null, OP_SIZE_B)))
|
|
|
|
|
IsaData(
|
|
|
|
|
"tas", "Test Operand and Set",
|
|
|
|
|
modes = listOf(AllowedAdrMode(ALL_EXCEPT_IMMEDIATE_AND_PC_REL, null, OP_SIZE_B, modInfo = RWM_MODIFY_OP1_B))
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val mnemonics =
|
|
|
|
|