Tweaking for M68kRegisterFlowDocumentationProvider regarding colors, formatting and abbreviated documentation on hover. Prepared next release.
This commit is contained in:
parent
94001c8b87
commit
954f42bf63
@ -30,6 +30,7 @@ it's "good enough" to get started, and I can return to demo coding with its curr
|
|||||||
- Mnemonics code completion
|
- Mnemonics code completion
|
||||||
- Symbols / Labels / Macros code completion
|
- Symbols / Labels / Macros code completion
|
||||||
- References / Refactoring support for local and global labels, symbol assignments, and macros.
|
- References / Refactoring support for local and global labels, symbol assignments, and macros.
|
||||||
|
- Simple register usage flow (hover over register or press F1 for full flow)
|
||||||
- Brace matching
|
- Brace matching
|
||||||
- Quote handler
|
- Quote handler
|
||||||
- Goto Symbol support
|
- Goto Symbol support
|
||||||
@ -70,7 +71,7 @@ make it work with JUnit 5. Feel free to use the code (in package ```de.platon42.
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
### V0.4 (unreleased)
|
### V0.4 (03-Aug-21)
|
||||||
|
|
||||||
- Notice: Due to major new API use, this plugin no longer works on IDEs >=2019.3.1, but rather requires >=2020.3.
|
- Notice: Due to major new API use, this plugin no longer works on IDEs >=2019.3.1, but rather requires >=2020.3.
|
||||||
- Enhancement: Added Structure View filters.
|
- Enhancement: Added Structure View filters.
|
||||||
|
@ -57,7 +57,7 @@ runPluginVerifier {
|
|||||||
|
|
||||||
patchPluginXml {
|
patchPluginXml {
|
||||||
setChangeNotes("""
|
setChangeNotes("""
|
||||||
<h4>V0.4 (unreleased)</h4>
|
<h4>V0.4 (03-Aug-21)</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Notice: Due to major new API use, this plugin no longer works on IDEs >=2019.3.1, but rather requires >=2020.3.
|
<li>Notice: Due to major new API use, this plugin no longer works on IDEs >=2019.3.1, but rather requires >=2020.3.
|
||||||
<li>Enhancement: Added Structure View filters.
|
<li>Enhancement: Added Structure View filters.
|
||||||
|
@ -8,6 +8,8 @@ import com.intellij.openapi.util.text.HtmlChunk
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
|
import com.intellij.ui.ColorUtil
|
||||||
|
import com.intellij.ui.JBColor
|
||||||
import de.platon42.intellij.plugins.m68k.asm.*
|
import de.platon42.intellij.plugins.m68k.asm.*
|
||||||
import de.platon42.intellij.plugins.m68k.asm.Register.Companion.getRegFromName
|
import de.platon42.intellij.plugins.m68k.asm.Register.Companion.getRegFromName
|
||||||
import de.platon42.intellij.plugins.m68k.psi.*
|
import de.platon42.intellij.plugins.m68k.psi.*
|
||||||
@ -21,83 +23,104 @@ class M68kRegisterFlowDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
|
|
||||||
override fun generateDoc(element: PsiElement, originalElement: PsiElement?): String? {
|
override fun generateDoc(element: PsiElement, originalElement: PsiElement?): String? {
|
||||||
if (element is M68kDataRegister || element is M68kAddressRegister) {
|
if (element is M68kDataRegister || element is M68kAddressRegister) {
|
||||||
val register = getRegFromName(element.text)
|
return createDoc(element as M68kRegister, 100) // TODO make this configurable
|
||||||
val addressingMode = PsiTreeUtil.getParentOfType(element, M68kAddressingMode::class.java) ?: return null
|
|
||||||
val asmInstruction = PsiTreeUtil.getParentOfType(addressingMode, M68kAsmInstruction::class.java) ?: return null
|
|
||||||
|
|
||||||
val (isaData, adrMode) = findExactIsaDataAndAllowedAdrModeForInstruction(asmInstruction) ?: return "unknown instruction"
|
|
||||||
|
|
||||||
val cursorInstRwmRegs = evaluateRegisterUse(asmInstruction, adrMode, register)
|
|
||||||
val opSize = getOpSizeOrDefault(asmInstruction.asmOp.opSize, adrMode)
|
|
||||||
|
|
||||||
val rn = register.regname
|
|
||||||
val thisInfo = cursorInstRwmRegs
|
|
||||||
.joinToString(separator = ", ", prefix = "${isaData.mnemonic} instruction ") {
|
|
||||||
rwmToDisplayText(it, rn)
|
|
||||||
}
|
|
||||||
val totalRwm = cursorInstRwmRegs.reduce(Int::or)
|
|
||||||
|
|
||||||
val firstOp = asmInstruction.addressingModeList[0] == addressingMode
|
|
||||||
val cursorRwm = modifyRwmWithOpsize((adrMode.modInfo ushr if (firstOp) RWM_OP1_SHIFT else RWM_OP2_SHIFT) and RWM_OP_MASK, opSize)
|
|
||||||
val analysisBuilder = HtmlBuilder()
|
|
||||||
val missingBits = if (cursorRwm and RWM_SET_L != 0) {
|
|
||||||
if (totalRwm and RWM_SET_L == RWM_SET_L) {
|
|
||||||
analysisBuilder.append(HtmlChunk.text("Register result is fully defined by this instruction."))
|
|
||||||
0
|
|
||||||
} else {
|
|
||||||
(RWM_SET_L and RWM_SIZE_MASK) and totalRwm.inv()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
(RWM_SET_L and RWM_SIZE_MASK) and ((cursorRwm and RWM_MODIFY_L) ushr 8)
|
|
||||||
}
|
|
||||||
val backtrace: MutableList<HtmlChunk> = ArrayList()
|
|
||||||
val initialStatement: M68kStatement = asmInstruction.parent as M68kStatement
|
|
||||||
if (missingBits > 0) {
|
|
||||||
val localLabelName = PsiTreeUtil.findChildOfType(initialStatement, M68kLocalLabel::class.java)?.name ?: ""
|
|
||||||
backtrace.add(
|
|
||||||
HtmlChunk.tag("tr")
|
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.text(localLabelName)))
|
|
||||||
.children(highlightRegister(asmInstruction, register).bold().wrapWith(DocumentationMarkup.SECTION_CONTENT_CELL))
|
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.text(" ; <--")))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
backtrace.addAll(analyseFlow(register, missingBits, true, initialStatement) { PsiTreeUtil.getPrevSiblingOfType(it, M68kStatement::class.java) })
|
|
||||||
backtrace.reverse()
|
|
||||||
val traceBits = (cursorRwm or (cursorRwm ushr 8)) and RWM_SIZE_MASK
|
|
||||||
backtrace.addAll(analyseFlow(register, traceBits, false, initialStatement) { PsiTreeUtil.getNextSiblingOfType(it, M68kStatement::class.java) })
|
|
||||||
|
|
||||||
val statementRows = HtmlBuilder()
|
|
||||||
backtrace.forEach(statementRows::append)
|
|
||||||
val builder = HtmlBuilder()
|
|
||||||
builder.append(HtmlChunk.text(thisInfo).wrapWith(DocumentationMarkup.DEFINITION_ELEMENT))
|
|
||||||
builder.append(statementRows.wrapWith(DocumentationMarkup.SECTIONS_TABLE.style("padding-left: 8pt; padding-right: 8pt")))
|
|
||||||
builder.append(analysisBuilder.wrapWith(DocumentationMarkup.CONTENT_ELEMENT))
|
|
||||||
return builder.toString()
|
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun generateHoverDoc(element: PsiElement, originalElement: PsiElement?): String? {
|
||||||
|
if (element is M68kDataRegister || element is M68kAddressRegister) {
|
||||||
|
return createDoc(element as M68kRegister, 4) // TODO make this configurable
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createDoc(element: M68kRegister, linesLimit: Int): String? {
|
||||||
|
val register = getRegFromName(element.text)
|
||||||
|
val addressingMode = PsiTreeUtil.getParentOfType(element, M68kAddressingMode::class.java) ?: return null
|
||||||
|
val asmInstruction = PsiTreeUtil.getParentOfType(addressingMode, M68kAsmInstruction::class.java) ?: return null
|
||||||
|
|
||||||
|
val (isaData, adrMode) = findExactIsaDataAndAllowedAdrModeForInstruction(asmInstruction) ?: return "unknown instruction"
|
||||||
|
|
||||||
|
val cursorInstRwmRegs = evaluateRegisterUse(asmInstruction, adrMode, register)
|
||||||
|
val opSize = getOpSizeOrDefault(asmInstruction.asmOp.opSize, adrMode)
|
||||||
|
|
||||||
|
val rn = register.regname
|
||||||
|
val thisInfo = cursorInstRwmRegs
|
||||||
|
.joinToString(separator = ", ", prefix = "${isaData.mnemonic} instruction ") { rwmToDisplayText(it, rn) }
|
||||||
|
val totalRwm = cursorInstRwmRegs.reduce(Int::or)
|
||||||
|
|
||||||
|
val firstOp = asmInstruction.addressingModeList[0] == addressingMode
|
||||||
|
val cursorRwm = modifyRwmWithOpsize((adrMode.modInfo ushr if (firstOp) RWM_OP1_SHIFT else RWM_OP2_SHIFT) and RWM_OP_MASK, opSize)
|
||||||
|
val backtrace: MutableList<HtmlChunk> = ArrayList()
|
||||||
|
val missingBits = if (cursorRwm and RWM_SET_L != 0) {
|
||||||
|
if (totalRwm and RWM_SET_L == RWM_SET_L) {
|
||||||
|
backtrace.add(
|
||||||
|
HtmlChunk.tag("tr")
|
||||||
|
.children(
|
||||||
|
DocumentationMarkup.SECTION_CONTENT_CELL.attr("colspan", "3")
|
||||||
|
.child(HtmlChunk.text("Register result is fully defined by this instruction."))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
(RWM_SET_L and RWM_SIZE_MASK) and totalRwm.inv()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(RWM_SET_L and RWM_SIZE_MASK) and ((cursorRwm and RWM_MODIFY_L) ushr 8)
|
||||||
|
}
|
||||||
|
val initialStatement: M68kStatement = asmInstruction.parent as M68kStatement
|
||||||
|
val localLabelName = PsiTreeUtil.findChildOfType(initialStatement, M68kLocalLabel::class.java)?.name ?: "-->"
|
||||||
|
backtrace.add(
|
||||||
|
HtmlChunk.tag("tr")
|
||||||
|
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.text(localLabelName)))
|
||||||
|
.children(highlightRegister(asmInstruction, register).bold().wrapWith(DocumentationMarkup.SECTION_CONTENT_CELL))
|
||||||
|
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.text(" ; <--")))
|
||||||
|
)
|
||||||
|
|
||||||
|
backtrace.addAll(analyseFlow(register, missingBits, true, initialStatement, linesLimit) {
|
||||||
|
PsiTreeUtil.getPrevSiblingOfType(
|
||||||
|
it,
|
||||||
|
M68kStatement::class.java
|
||||||
|
)
|
||||||
|
})
|
||||||
|
backtrace.reverse()
|
||||||
|
val traceBits = (cursorRwm or (cursorRwm ushr 8)) and RWM_SIZE_MASK
|
||||||
|
backtrace.addAll(analyseFlow(register, traceBits, false, initialStatement, linesLimit) {
|
||||||
|
PsiTreeUtil.getNextSiblingOfType(
|
||||||
|
it,
|
||||||
|
M68kStatement::class.java
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
val statementRows = HtmlBuilder()
|
||||||
|
backtrace.forEach(statementRows::append)
|
||||||
|
val builder = HtmlBuilder()
|
||||||
|
builder.append(HtmlChunk.text(thisInfo).wrapWith(DocumentationMarkup.DEFINITION_ELEMENT))
|
||||||
|
builder.append(statementRows.wrapWith(DocumentationMarkup.SECTIONS_TABLE.style("padding-left: 8pt; padding-right: 8pt")))
|
||||||
|
return builder.toString()
|
||||||
|
}
|
||||||
|
|
||||||
private fun analyseFlow(
|
private fun analyseFlow(
|
||||||
register: Register,
|
register: Register,
|
||||||
rwmBits: Int,
|
rwmBits: Int,
|
||||||
globalLabelBreaksOnInitialStatement: Boolean,
|
globalLabelBreaksOnInitialStatement: Boolean,
|
||||||
startingStatement: M68kStatement,
|
startingStatement: M68kStatement,
|
||||||
|
linesLimit: Int,
|
||||||
direction: (statement: M68kStatement) -> M68kStatement?
|
direction: (statement: M68kStatement) -> M68kStatement?
|
||||||
): MutableList<HtmlChunk> {
|
): MutableList<HtmlChunk> {
|
||||||
var missingBits = rwmBits
|
var missingBits = rwmBits
|
||||||
var currStatement = startingStatement
|
var currStatement = startingStatement
|
||||||
val backtrace: MutableList<HtmlChunk> = ArrayList()
|
val statementLines: MutableList<HtmlChunk> = ArrayList()
|
||||||
val rn = register.regname
|
val rn = register.regname
|
||||||
var addAbrevDots = false
|
var addAbrevDots = false
|
||||||
|
var lines = 0
|
||||||
while (missingBits > 0) {
|
while (missingBits > 0) {
|
||||||
val globalLabel = PsiTreeUtil.findChildOfType(currStatement, M68kGlobalLabel::class.java)
|
val globalLabel = PsiTreeUtil.findChildOfType(currStatement, M68kGlobalLabel::class.java)
|
||||||
if ((globalLabel != null) && (globalLabelBreaksOnInitialStatement || (currStatement !== startingStatement))) {
|
if ((globalLabel != null) && (globalLabelBreaksOnInitialStatement || (currStatement !== startingStatement))) {
|
||||||
backtrace.add(
|
statementLines.add(
|
||||||
HtmlChunk.tag("tr")
|
HtmlChunk.tag("tr")
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.text(globalLabel.name!!).bold()))
|
.children(DocumentationMarkup.SECTION_CONTENT_CELL.attr("colspan", "3").child(HtmlChunk.text(globalLabel.name!!).bold()))
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.nbsp()))
|
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.nbsp()))
|
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -105,37 +128,35 @@ class M68kRegisterFlowDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
val currAsmInstruction = PsiTreeUtil.getChildOfType(currStatement, M68kAsmInstruction::class.java) ?: continue
|
val currAsmInstruction = PsiTreeUtil.getChildOfType(currStatement, M68kAsmInstruction::class.java) ?: continue
|
||||||
if (checkIfInstructionUsesRegister(currAsmInstruction, register)) {
|
if (checkIfInstructionUsesRegister(currAsmInstruction, register)) {
|
||||||
if (addAbrevDots) {
|
if (addAbrevDots) {
|
||||||
backtrace.add(
|
++lines
|
||||||
HtmlChunk.tag("tr")
|
statementLines.add(createAbbreviationDots())
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.nbsp()))
|
}
|
||||||
.children(
|
if (++lines > linesLimit) {
|
||||||
DocumentationMarkup.SECTION_CONTENT_CELL.child(
|
if (!addAbrevDots) {
|
||||||
HtmlChunk.text("[...]").wrapWith(HtmlChunk.div().attr("class", "grayed"))
|
statementLines.add(createAbbreviationDots())
|
||||||
)
|
}
|
||||||
)
|
break
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.nbsp()))
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
addAbrevDots = false
|
addAbrevDots = false
|
||||||
val (_, currAdrMode) = findExactIsaDataAndAllowedAdrModeForInstruction(currAsmInstruction) ?: continue
|
val (_, currAdrMode) = findExactIsaDataAndAllowedAdrModeForInstruction(currAsmInstruction) ?: continue
|
||||||
|
|
||||||
val localLabelName = PsiTreeUtil.findChildOfType(currStatement, M68kLocalLabel::class.java)?.name ?: ""
|
val localLabelName = PsiTreeUtil.findChildOfType(currStatement, M68kLocalLabel::class.java)?.name ?: " "
|
||||||
val currRwms = evaluateRegisterUse(currAsmInstruction, currAdrMode, register)
|
val currRwms = evaluateRegisterUse(currAsmInstruction, currAdrMode, register)
|
||||||
val currTotalRwm = currRwms.reduce(Int::or)
|
val currTotalRwm = currRwms.reduce(Int::or)
|
||||||
if ((currTotalRwm and RWM_SET_L) > 0) {
|
|
||||||
missingBits = missingBits and currTotalRwm.inv()
|
|
||||||
}
|
|
||||||
val lineInfo = currRwms
|
val lineInfo = currRwms
|
||||||
.map {
|
.map {
|
||||||
val text = HtmlChunk.text(rwmToDisplayText(it, rn))
|
val text = HtmlChunk.text(rwmToDisplayText(it, rn))
|
||||||
if ((missingBits and it) > 0) text.bold() else text.italic()
|
if ((missingBits and it) > 0) text.wrapWith(HtmlChunk.font("#" + ColorUtil.toHex(JBColor.GREEN))) else text
|
||||||
}
|
}
|
||||||
|
if ((currTotalRwm and RWM_SET_L) > 0) {
|
||||||
|
missingBits = missingBits and currTotalRwm.inv()
|
||||||
|
}
|
||||||
val lineBuilder = HtmlBuilder()
|
val lineBuilder = HtmlBuilder()
|
||||||
lineBuilder.append(" ; ")
|
lineBuilder.append(" ; ")
|
||||||
lineBuilder.appendWithSeparators(HtmlChunk.text(", "), lineInfo)
|
lineBuilder.appendWithSeparators(HtmlChunk.text(", "), lineInfo)
|
||||||
.wrapWith(HtmlChunk.div())
|
.wrapWith(HtmlChunk.div())
|
||||||
|
|
||||||
backtrace.add(
|
statementLines.add(
|
||||||
HtmlChunk.tag("tr")
|
HtmlChunk.tag("tr")
|
||||||
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.text(localLabelName)))
|
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.text(localLabelName)))
|
||||||
.children(highlightRegister(currAsmInstruction, register).wrapWith(DocumentationMarkup.SECTION_CONTENT_CELL))
|
.children(highlightRegister(currAsmInstruction, register).wrapWith(DocumentationMarkup.SECTION_CONTENT_CELL))
|
||||||
@ -145,7 +166,7 @@ class M68kRegisterFlowDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
addAbrevDots = true
|
addAbrevDots = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return backtrace
|
return statementLines
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun highlightRegister(currAsmInstruction: M68kAsmInstruction, register: Register): HtmlChunk {
|
private fun highlightRegister(currAsmInstruction: M68kAsmInstruction, register: Register): HtmlChunk {
|
||||||
@ -158,7 +179,7 @@ class M68kRegisterFlowDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
if (indexPos >= 0) {
|
if (indexPos >= 0) {
|
||||||
builder.append(HtmlChunk.text(plainText.substring(startPos until indexPos)))
|
builder.append(HtmlChunk.text(plainText.substring(startPos until indexPos)))
|
||||||
startPos = indexPos + register.regname.length
|
startPos = indexPos + register.regname.length
|
||||||
builder.append(HtmlChunk.text(plainText.substring(indexPos until startPos)).wrapWith(HtmlChunk.font("red")))
|
builder.append(HtmlChunk.text(plainText.substring(indexPos until startPos)).wrapWith(HtmlChunk.font("#" + ColorUtil.toHex(JBColor.ORANGE))))
|
||||||
} else {
|
} else {
|
||||||
builder.append(HtmlChunk.text(plainText.substring(startPos)))
|
builder.append(HtmlChunk.text(plainText.substring(startPos)))
|
||||||
}
|
}
|
||||||
@ -180,6 +201,15 @@ class M68kRegisterFlowDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
else -> "uhm?"
|
else -> "uhm?"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createAbbreviationDots() = HtmlChunk.tag("tr")
|
||||||
|
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.nbsp()))
|
||||||
|
.children(
|
||||||
|
DocumentationMarkup.SECTION_CONTENT_CELL.child(
|
||||||
|
HtmlChunk.text("[...]").wrapWith(HtmlChunk.div().attr("class", "grayed"))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.children(DocumentationMarkup.SECTION_CONTENT_CELL.child(HtmlChunk.nbsp()))
|
||||||
|
|
||||||
private fun evaluateRegisterUse(
|
private fun evaluateRegisterUse(
|
||||||
asmInstruction: M68kAsmInstruction,
|
asmInstruction: M68kAsmInstruction,
|
||||||
adrMode: AllowedAdrMode,
|
adrMode: AllowedAdrMode,
|
||||||
@ -211,4 +241,4 @@ class M68kRegisterFlowDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
if (parent is M68kDataRegister || parent is M68kAddressRegister) return parent
|
if (parent is M68kDataRegister || parent is M68kAddressRegister) return parent
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,14 +37,14 @@ nextlabel
|
|||||||
<div class="definition">move instruction reads d0.w</div>
|
<div class="definition">move instruction reads d0.w</div>
|
||||||
<table class="sections" style="padding-left: 8pt; padding-right: 8pt">
|
<table class="sections" style="padding-left: 8pt; padding-right: 8pt">
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>moveq.l #0,<font color="red">d0</font></code></td>
|
<td valign="top"><code>moveq.l #0,<font color="#ffc800">d0</font></code></td>
|
||||||
<td valign="top"> ; <i>sets d0.l</i></td>
|
<td valign="top"> ; <font color="#00ff00">sets d0.l</font></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>add.w #1,<font color="red">d0</font></code></td>
|
<td valign="top"><code>add.w #1,<font color="#ffc800">d0</font></code></td>
|
||||||
<td valign="top"> ; <i>modifies d0.w</i></td>
|
<td valign="top"> ; modifies d0.w</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"> </td>
|
<td valign="top"> </td>
|
||||||
@ -54,29 +54,29 @@ nextlabel
|
|||||||
<td valign="top"> </td>
|
<td valign="top"> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>move.w <font color="red">d0</font>,d1</code></td>
|
<td valign="top"><code>move.w <font color="#ffc800">d0</font>,d1</code></td>
|
||||||
<td valign="top"> ; <i>reads d0.w</i></td>
|
<td valign="top"> ; reads d0.w</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>move.b d2,<font color="red">d0</font></code></td>
|
<td valign="top"><code>move.b d2,<font color="#ffc800">d0</font></code></td>
|
||||||
<td valign="top"> ; <i>sets d0.b</i></td>
|
<td valign="top"> ; <font color="#00ff00">sets d0.b</font></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>addq.b #1,<font color="red">d0</font></code></td>
|
<td valign="top"><code>addq.b #1,<font color="#ffc800">d0</font></code></td>
|
||||||
<td valign="top"> ; <i>modifies d0.b</i></td>
|
<td valign="top"> ; modifies d0.b</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top">--></td>
|
||||||
<td valign="top"><b><code>move.w <font color="red">d0</font>,d1</code></b></td>
|
<td valign="top"><b><code>move.w <font color="#ffc800">d0</font>,d1</code></b></td>
|
||||||
<td valign="top"> ; <--</td>
|
<td valign="top"> ; <--</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>move.l <font color="red">d0</font>,d2</code></td>
|
<td valign="top"><code>move.l <font color="#ffc800">d0</font>,d2</code></td>
|
||||||
<td valign="top"> ; <i>reads d0.l</i></td>
|
<td valign="top"> ; reads d0.l</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"> </td>
|
<td valign="top"> </td>
|
||||||
@ -86,17 +86,16 @@ nextlabel
|
|||||||
<td valign="top"> </td>
|
<td valign="top"> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>clr.b <font color="red">d0</font></code></td>
|
<td valign="top"><code>clr.b <font color="#ffc800">d0</font></code></td>
|
||||||
<td valign="top"> ; <i>sets d0.b</i></td>
|
<td valign="top"> ; <font color="#00ff00">sets d0.b</font></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top"></td>
|
<td valign="top"> </td>
|
||||||
<td valign="top"><code>moveq.l #0,<font color="red">d0</font></code></td>
|
<td valign="top"><code>moveq.l #0,<font color="#ffc800">d0</font></code></td>
|
||||||
<td valign="top"> ; <i>sets d0.l</i></td>
|
<td valign="top"> ; <font color="#00ff00">sets d0.l</font></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<div class="content"/>
|
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user