Added 68020 Memory Indirect and Program Counter Memory Indirect addressing modes.
This commit is contained in:
@@ -46,6 +46,12 @@ enum class AddressMode(val description: String, val syntax: String) {
|
||||
ADDRESS_REGISTER_INDIRECT_WITH_SCALED_INDEX("address register indirect with scaled index", "(d8,An,Xn*s)"),
|
||||
PROGRAM_COUNTER_INDIRECT_WITH_INDEX("program counter indirect with index", "(d8,PC,Xn)"),
|
||||
PROGRAM_COUNTER_INDIRECT_WITH_SCALED_INDEX("program counter indirect with scaled index", "(d8,PC,Xn*s)"),
|
||||
MEMORY_INDIRECT("memory indirect", "([bd,An],od)"),
|
||||
MEMORY_INDIRECT_POSTINDEXED("memory indirect postindexed", "([bd,An],Xn*s,od)"),
|
||||
MEMORY_INDIRECT_PREINDEXED("memory indirect preindexed", "([bd,An,Xn*s],od)"),
|
||||
PROGRAM_COUNTER_MEMORY_INDIRECT("program counter memory indirect", "([bd,PC],od)"),
|
||||
PROGRAM_COUNTER_MEMORY_INDIRECT_POSTINDEXED("program counter memory indirect postindexed", "([bd,PC],Xn*s,od)"),
|
||||
PROGRAM_COUNTER_MEMORY_INDIRECT_PREINDEXED("program counter memory indirect preindexed", "([bd,PC,Xn*s],od)"),
|
||||
SPECIAL_REGISTER_DIRECT("special register", "sr|ccr|usp|vbr"),
|
||||
REGISTER_LIST("register list", "list"),
|
||||
IMMEDIATE_DATA("immediate", "#<xxx>"),
|
||||
|
||||
@@ -168,7 +168,6 @@ PLAIN_MACRO_LINE=[^;\r\n]+
|
||||
"+" { return OP_PLUS; }
|
||||
"-" { return OP_MINUS; }
|
||||
"*" { yybegin(exprOpState); return CURRENT_PC_SYMBOL; }
|
||||
|
||||
}
|
||||
|
||||
<EXPR> {
|
||||
@@ -218,6 +217,8 @@ PLAIN_MACRO_LINE=[^;\r\n]+
|
||||
"vbr" { yybegin(exprOpState); return REG_VBR; }
|
||||
|
||||
"#" { return HASH; }
|
||||
"\[" { return SQUARE_L; }
|
||||
// "\]" { return SQUARE_R; }
|
||||
|
||||
{SYMBOL} { yybegin(exprOpState); return SYMBOL; }
|
||||
}
|
||||
@@ -226,6 +227,8 @@ PLAIN_MACRO_LINE=[^;\r\n]+
|
||||
{OPSIZE_BS} { return OPSIZE_BS; }
|
||||
{OPSIZE_W} { return OPSIZE_W; }
|
||||
{OPSIZE_L} { return OPSIZE_L; }
|
||||
"\[" { return SQUARE_L; }
|
||||
"\]" { return SQUARE_R; }
|
||||
}
|
||||
|
||||
<WAITEOL>
|
||||
|
||||
@@ -259,6 +259,12 @@ AddressingMode ::= ImmediateData
|
||||
| AddressRegisterIndirectAddressingMode
|
||||
| AddressRegisterIndirectWithDisplacementNewAddressingMode
|
||||
| ProgramCounterIndirectWithDisplacementNewAddressingMode
|
||||
| MemoryIndirectAddressingMode
|
||||
| ProgramCounterMemoryIndirectAddressingMode
|
||||
| MemoryIndirectPostIndexedAddressingMode
|
||||
| ProgramCounterMemoryIndirectPostIndexedAddressingMode
|
||||
| MemoryIndirectPreIndexedAddressingMode
|
||||
| ProgramCounterMemoryIndirectPreIndexedAddressingMode
|
||||
| AddressRegisterIndirectWithIndexNewAddressingMode
|
||||
| ProgramCounterIndirectWithIndexNewAddressingMode
|
||||
| AddressRegisterIndirectWithDisplacementOldAddressingMode
|
||||
@@ -324,6 +330,47 @@ AddressRegisterIndirectWithIndexNewAddressingMode ::= ROUND_L (expr SEPARATOR)?
|
||||
]
|
||||
}
|
||||
|
||||
MemoryIndirectAddressingMode ::= ROUND_L SQUARE_L (expr SEPARATOR)? AddressRegister SQUARE_R (SEPARATOR expr)? ROUND_R
|
||||
{
|
||||
implements = [
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithAddressRegisterIndirect"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithBaseDisplacement"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithOuterDisplacement"
|
||||
]
|
||||
methods = [
|
||||
baseDisplacement = "expr[0]"
|
||||
outerDisplacement = "expr[1]"
|
||||
]
|
||||
}
|
||||
|
||||
MemoryIndirectPostIndexedAddressingMode ::= ROUND_L (SQUARE_L (expr SEPARATOR)? AddressRegister SQUARE_R SEPARATOR)? IndexRegister (SEPARATOR expr)? ROUND_R
|
||||
{
|
||||
implements = [
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithAddressRegisterIndirect"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithBaseDisplacement"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithIndexRegister"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithOuterDisplacement"
|
||||
]
|
||||
methods = [
|
||||
baseDisplacement = "expr[0]"
|
||||
outerDisplacement = "expr[1]"
|
||||
]
|
||||
}
|
||||
|
||||
MemoryIndirectPreIndexedAddressingMode ::= ROUND_L SQUARE_L (expr SEPARATOR)? AddressRegister SEPARATOR IndexRegister SQUARE_R (SEPARATOR expr)? ROUND_R
|
||||
{
|
||||
implements = [
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithAddressRegisterIndirect"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithBaseDisplacement"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithIndexRegister"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithOuterDisplacement"
|
||||
]
|
||||
methods = [
|
||||
baseDisplacement = "expr[0]"
|
||||
outerDisplacement = "expr[1]"
|
||||
]
|
||||
}
|
||||
|
||||
ProgramCounterIndirectWithDisplacementOldAddressingMode ::= (ROUND_L PC ROUND_R) | (expr ROUND_L PC ROUND_R)
|
||||
{
|
||||
implements = ["de.platon42.intellij.plugins.m68k.psi.M68kWithDisplacement"]
|
||||
@@ -362,6 +409,44 @@ ProgramCounterIndirectWithIndexNewAddressingMode ::= ROUND_L (expr SEPARATOR)? P
|
||||
]
|
||||
}
|
||||
|
||||
ProgramCounterMemoryIndirectAddressingMode ::= ROUND_L SQUARE_L (expr SEPARATOR)? PC SQUARE_R (SEPARATOR expr)? ROUND_R
|
||||
{
|
||||
implements = [
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithBaseDisplacement"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithOuterDisplacement"
|
||||
]
|
||||
methods = [
|
||||
baseDisplacement = "expr[0]"
|
||||
outerDisplacement = "expr[1]"
|
||||
]
|
||||
}
|
||||
|
||||
ProgramCounterMemoryIndirectPostIndexedAddressingMode ::= ROUND_L (SQUARE_L (expr SEPARATOR)? PC SQUARE_R SEPARATOR)? IndexRegister (SEPARATOR expr)? ROUND_R
|
||||
{
|
||||
implements = [
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithBaseDisplacement"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithIndexRegister"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithOuterDisplacement"
|
||||
]
|
||||
methods = [
|
||||
baseDisplacement = "expr[0]"
|
||||
outerDisplacement = "expr[1]"
|
||||
]
|
||||
}
|
||||
|
||||
ProgramCounterMemoryIndirectPreIndexedAddressingMode ::= ROUND_L SQUARE_L (expr SEPARATOR)? PC SEPARATOR IndexRegister SQUARE_R (SEPARATOR expr)? ROUND_R
|
||||
{
|
||||
implements = [
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithBaseDisplacement"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithIndexRegister"
|
||||
"de.platon42.intellij.plugins.m68k.psi.M68kWithOuterDisplacement"
|
||||
]
|
||||
methods = [
|
||||
baseDisplacement = "expr[0]"
|
||||
outerDisplacement = "expr[1]"
|
||||
]
|
||||
}
|
||||
|
||||
AbsoluteAddressAddressingMode ::= expr AddressSize? !ROUND_L
|
||||
|
||||
RegisterRange ::= (DataRegister OP_MINUS DataRegister) | (AddressRegister OP_MINUS AddressRegister) | (DataRegister OP_MINUS AddressRegister) {
|
||||
|
||||
@@ -18,6 +18,12 @@ object M68kAddressModeUtil {
|
||||
is M68kProgramCounterIndirectWithDisplacementOldAddressingMode -> AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_DISPLACEMENT
|
||||
is M68kProgramCounterIndirectWithIndexNewAddressingMode -> if (hasScale(addressingMode)) AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_SCALED_INDEX else AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_INDEX
|
||||
is M68kProgramCounterIndirectWithIndexOldAddressingMode -> if (hasScale(addressingMode)) AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_SCALED_INDEX else AddressMode.PROGRAM_COUNTER_INDIRECT_WITH_INDEX
|
||||
is M68kMemoryIndirectAddressingMode -> AddressMode.MEMORY_INDIRECT
|
||||
is M68kMemoryIndirectPreIndexedAddressingMode -> AddressMode.MEMORY_INDIRECT_PREINDEXED
|
||||
is M68kMemoryIndirectPostIndexedAddressingMode -> AddressMode.MEMORY_INDIRECT_POSTINDEXED
|
||||
is M68kProgramCounterMemoryIndirectAddressingMode -> AddressMode.PROGRAM_COUNTER_MEMORY_INDIRECT
|
||||
is M68kProgramCounterMemoryIndirectPreIndexedAddressingMode -> AddressMode.PROGRAM_COUNTER_MEMORY_INDIRECT_PREINDEXED
|
||||
is M68kProgramCounterMemoryIndirectPostIndexedAddressingMode -> AddressMode.PROGRAM_COUNTER_MEMORY_INDIRECT_POSTINDEXED
|
||||
is M68kSpecialRegisterDirectAddressingMode -> AddressMode.SPECIAL_REGISTER_DIRECT
|
||||
is M68kDataRegisterDirectAddressingMode -> AddressMode.DATA_REGISTER_DIRECT
|
||||
is M68kAddressRegisterDirectAddressingMode -> AddressMode.ADDRESS_REGISTER_DIRECT
|
||||
@@ -27,6 +33,7 @@ object M68kAddressModeUtil {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO add evaluation of constant expressions and allow scale == 1 as false
|
||||
private fun hasScale(addressingMode: M68kWithIndexRegister) = addressingMode.indexRegister.indexScale != null
|
||||
|
||||
fun getOtherReadWriteModifyRegisters(rwm: Int): List<Pair<Register, Int>> {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package de.platon42.intellij.plugins.m68k.psi
|
||||
|
||||
interface M68kWithBaseDisplacement : M68kAddressingMode {
|
||||
|
||||
val baseDisplacement: M68kExpr?
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package de.platon42.intellij.plugins.m68k.psi
|
||||
|
||||
interface M68kWithOuterDisplacement : M68kAddressingMode {
|
||||
|
||||
val outerDisplacement: M68kExpr?
|
||||
}
|
||||
Reference in New Issue
Block a user