Added support for referencing / refactoring of global variables and symbols. Added getPresentation() for structural view, but does not seem to be working yet. Also Find Usages still reports "Unclassified" :-/
This commit is contained in:
parent
5edaf47f28
commit
c00a403638
@ -1,8 +1,19 @@
|
|||||||
package de.platon42.intellij.plugins.m68k.psi
|
package de.platon42.intellij.plugins.m68k.psi
|
||||||
|
|
||||||
import com.intellij.extapi.psi.ASTWrapperPsiElement
|
import com.intellij.extapi.psi.ASTWrapperPsiElement
|
||||||
|
import com.intellij.ide.projectView.PresentationData
|
||||||
import com.intellij.lang.ASTNode
|
import com.intellij.lang.ASTNode
|
||||||
|
import com.intellij.navigation.ItemPresentation
|
||||||
|
import de.platon42.intellij.plugins.m68k.M68kIcons
|
||||||
|
import javax.swing.Icon
|
||||||
|
|
||||||
abstract class M68kGlobalLabelMixin(node: ASTNode) : ASTWrapperPsiElement(node), M68kGlobalLabel {
|
abstract class M68kGlobalLabelMixin(node: ASTNode) : ASTWrapperPsiElement(node), M68kGlobalLabel {
|
||||||
|
|
||||||
|
override fun getPresentation(): ItemPresentation? {
|
||||||
|
return PresentationData(name, containingFile?.name, getIcon(0), null)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getIcon(flags: Int): Icon? {
|
||||||
|
return M68kIcons.GLOBAL_LABEL
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,12 +1,18 @@
|
|||||||
package de.platon42.intellij.plugins.m68k.psi
|
package de.platon42.intellij.plugins.m68k.psi
|
||||||
|
|
||||||
import com.intellij.extapi.psi.ASTWrapperPsiElement
|
import com.intellij.extapi.psi.ASTWrapperPsiElement
|
||||||
|
import com.intellij.ide.projectView.PresentationData
|
||||||
import com.intellij.lang.ASTNode
|
import com.intellij.lang.ASTNode
|
||||||
|
import com.intellij.navigation.ItemPresentation
|
||||||
import de.platon42.intellij.plugins.m68k.M68kIcons
|
import de.platon42.intellij.plugins.m68k.M68kIcons
|
||||||
import javax.swing.Icon
|
import javax.swing.Icon
|
||||||
|
|
||||||
abstract class M68kLocalLabelMixin(node: ASTNode) : ASTWrapperPsiElement(node), M68kLocalLabel {
|
abstract class M68kLocalLabelMixin(node: ASTNode) : ASTWrapperPsiElement(node), M68kLocalLabel {
|
||||||
|
|
||||||
|
override fun getPresentation(): ItemPresentation? {
|
||||||
|
return PresentationData(name, containingFile?.name, getIcon(0), null)
|
||||||
|
}
|
||||||
|
|
||||||
override fun getIcon(flags: Int): Icon? {
|
override fun getIcon(flags: Int): Icon? {
|
||||||
return M68kIcons.LOCAL_LABEL
|
return M68kIcons.LOCAL_LABEL
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,43 @@
|
|||||||
|
package de.platon42.intellij.plugins.m68k.psi
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.psi.PsiManager
|
||||||
|
import com.intellij.psi.search.FileTypeIndex
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
|
import de.platon42.intellij.plugins.m68k.M68kFileType
|
||||||
|
|
||||||
|
object M68kLookupUtil {
|
||||||
|
|
||||||
|
fun findAllGlobalLabels(project: Project): List<M68kGlobalLabel> {
|
||||||
|
return FileTypeIndex.getFiles(M68kFileType.INSTANCE, GlobalSearchScope.allScope(project)).asSequence()
|
||||||
|
.map { PsiManager.getInstance(project).findFile(it) as M68kFile }
|
||||||
|
.flatMap {
|
||||||
|
val results: MutableList<M68kGlobalLabel> = ArrayList()
|
||||||
|
var currentStatement = it.firstChild
|
||||||
|
while (currentStatement != null) {
|
||||||
|
val child = currentStatement.firstChild
|
||||||
|
if (child is M68kGlobalLabel) results.add(child)
|
||||||
|
currentStatement = PsiTreeUtil.getNextSiblingOfType(currentStatement, M68kStatement::class.java)
|
||||||
|
}
|
||||||
|
results
|
||||||
|
}
|
||||||
|
.toList()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun findAllSymbolDefinitions(project: Project): List<M68kSymbolDefinition> {
|
||||||
|
return FileTypeIndex.getFiles(M68kFileType.INSTANCE, GlobalSearchScope.allScope(project)).asSequence()
|
||||||
|
.map { PsiManager.getInstance(project).findFile(it) as M68kFile }
|
||||||
|
.flatMap {
|
||||||
|
val results: MutableList<M68kSymbolDefinition> = ArrayList()
|
||||||
|
var currentStatement = it.firstChild
|
||||||
|
while (currentStatement != null) {
|
||||||
|
val child = currentStatement.firstChild
|
||||||
|
if (child is M68kAssignment) results.add(child.firstChild as M68kSymbolDefinition)
|
||||||
|
currentStatement = PsiTreeUtil.getNextSiblingOfType(currentStatement, M68kStatement::class.java)
|
||||||
|
}
|
||||||
|
results
|
||||||
|
}
|
||||||
|
.toList()
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,19 @@
|
|||||||
package de.platon42.intellij.plugins.m68k.psi
|
package de.platon42.intellij.plugins.m68k.psi
|
||||||
|
|
||||||
import com.intellij.extapi.psi.ASTWrapperPsiElement
|
import com.intellij.extapi.psi.ASTWrapperPsiElement
|
||||||
|
import com.intellij.ide.projectView.PresentationData
|
||||||
import com.intellij.lang.ASTNode
|
import com.intellij.lang.ASTNode
|
||||||
|
import com.intellij.navigation.ItemPresentation
|
||||||
|
import de.platon42.intellij.plugins.m68k.M68kIcons
|
||||||
|
import javax.swing.Icon
|
||||||
|
|
||||||
abstract class M68kSymbolDefinitionMixin(node: ASTNode) : ASTWrapperPsiElement(node), M68kSymbolDefinition {
|
abstract class M68kSymbolDefinitionMixin(node: ASTNode) : ASTWrapperPsiElement(node), M68kSymbolDefinition {
|
||||||
|
|
||||||
|
override fun getPresentation(): ItemPresentation? {
|
||||||
|
return PresentationData(name, containingFile?.name, getIcon(0), null)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getIcon(flags: Int): Icon? {
|
||||||
|
return M68kIcons.SYMBOL_DEF
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package de.platon42.intellij.plugins.m68k.refs
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||||
|
import com.intellij.openapi.util.TextRange
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.PsiElementResolveResult
|
||||||
|
import com.intellij.psi.PsiPolyVariantReferenceBase
|
||||||
|
import com.intellij.psi.ResolveResult
|
||||||
|
import com.intellij.psi.impl.source.resolve.ResolveCache
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolReference
|
||||||
|
|
||||||
|
class M68kGlobalLabelSymbolReference(element: M68kSymbolReference) :
|
||||||
|
PsiPolyVariantReferenceBase<M68kSymbolReference>(element, TextRange(0, element.textLength)) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val INSTANCE = Resolver()
|
||||||
|
|
||||||
|
fun findGlobalLabels(element: M68kSymbolReference, predicate: (M68kGlobalLabel) -> Boolean): List<M68kGlobalLabel> {
|
||||||
|
return M68kLookupUtil.findAllGlobalLabels(element.project).filter(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun findSymbolDefinitions(element: M68kSymbolReference, predicate: (M68kSymbolDefinition) -> Boolean): List<M68kSymbolDefinition> {
|
||||||
|
return M68kLookupUtil.findAllSymbolDefinitions(element.project).filter(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getCurrentFileSearchScope(element: PsiElement): GlobalSearchScope {
|
||||||
|
return GlobalSearchScope.fileScope(element.containingFile.originalFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Resolver : ResolveCache.PolyVariantResolver<M68kGlobalLabelSymbolReference> {
|
||||||
|
override fun resolve(ref: M68kGlobalLabelSymbolReference, incompleteCode: Boolean): Array<ResolveResult> {
|
||||||
|
val refName = ref.element.symbolName
|
||||||
|
|
||||||
|
val globalLabelMatches: Array<ResolveResult> = findGlobalLabels(ref.myElement) { it.name == refName }
|
||||||
|
.map { PsiElementResolveResult(it) }
|
||||||
|
.toTypedArray()
|
||||||
|
if (globalLabelMatches.isNotEmpty()) return globalLabelMatches
|
||||||
|
return findSymbolDefinitions(ref.myElement) { it.name == refName }
|
||||||
|
.map { PsiElementResolveResult(it) }
|
||||||
|
.toTypedArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun multiResolve(incompleteCode: Boolean): Array<ResolveResult> {
|
||||||
|
return ResolveCache.getInstance(element.project)
|
||||||
|
.resolveWithCaching(this, INSTANCE, false, incompleteCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun resolve(): PsiElement? {
|
||||||
|
val resolveResults = multiResolve(false)
|
||||||
|
return resolveResults.singleOrNull()?.element
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getVariants(): Array<Any> {
|
||||||
|
return listOf(findGlobalLabels(element) { true }, findSymbolDefinitions(element) { true }).asSequence()
|
||||||
|
.flatten()
|
||||||
|
.map { LookupElementBuilder.createWithIcon(it) }
|
||||||
|
.toList()
|
||||||
|
.toTypedArray()
|
||||||
|
}
|
||||||
|
}
|
@ -9,10 +9,12 @@ class M68kReferenceContributor : PsiReferenceContributor() {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val localLabelReferenceProvider = LocalLabelReferenceProvider()
|
val localLabelReferenceProvider = LocalLabelReferenceProvider()
|
||||||
|
val globalLabelReferenceProvider = GlobalLabelSymbolReferenceProvider()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
|
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
|
||||||
registrar.registerReferenceProvider(PlatformPatterns.psiElement(M68kSymbolReference::class.java), localLabelReferenceProvider)
|
registrar.registerReferenceProvider(PlatformPatterns.psiElement(M68kSymbolReference::class.java), localLabelReferenceProvider)
|
||||||
|
registrar.registerReferenceProvider(PlatformPatterns.psiElement(M68kSymbolReference::class.java), globalLabelReferenceProvider)
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalLabelReferenceProvider : PsiReferenceProvider() {
|
class LocalLabelReferenceProvider : PsiReferenceProvider() {
|
||||||
@ -22,4 +24,12 @@ class M68kReferenceContributor : PsiReferenceContributor() {
|
|||||||
return arrayOf(M68kLocalLabelReference(symbolReference))
|
return arrayOf(M68kLocalLabelReference(symbolReference))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class GlobalLabelSymbolReferenceProvider : PsiReferenceProvider() {
|
||||||
|
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> {
|
||||||
|
val symbolReference = element as M68kSymbolReference
|
||||||
|
if (symbolReference.isLocalLabelRef) return emptyArray()
|
||||||
|
return arrayOf(M68kGlobalLabelSymbolReference(symbolReference))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,55 @@
|
|||||||
|
package de.platon42.intellij.plugins.m68k.refs
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||||
|
import com.intellij.openapi.util.TextRange
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.PsiElementResolveResult
|
||||||
|
import com.intellij.psi.PsiPolyVariantReferenceBase
|
||||||
|
import com.intellij.psi.ResolveResult
|
||||||
|
import com.intellij.psi.impl.source.resolve.ResolveCache
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolReference
|
||||||
|
|
||||||
|
class M68kSymbolDefinitionReference(element: M68kSymbolReference) :
|
||||||
|
PsiPolyVariantReferenceBase<M68kSymbolReference>(element, TextRange(0, element.textLength)) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val INSTANCE = Resolver()
|
||||||
|
|
||||||
|
fun findSymbolDefinitions(element: M68kSymbolReference, predicate: (M68kSymbolDefinition) -> Boolean): List<M68kSymbolDefinition> {
|
||||||
|
return M68kLookupUtil.findAllSymbolDefinitions(element.project).filter(predicate)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getCurrentFileSearchScope(element: PsiElement): GlobalSearchScope {
|
||||||
|
return GlobalSearchScope.fileScope(element.containingFile.originalFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Resolver : ResolveCache.PolyVariantResolver<M68kSymbolDefinitionReference> {
|
||||||
|
override fun resolve(ref: M68kSymbolDefinitionReference, incompleteCode: Boolean): Array<ResolveResult> {
|
||||||
|
val refName = ref.element.symbolName
|
||||||
|
|
||||||
|
return findSymbolDefinitions(ref.myElement) { it.name == refName }
|
||||||
|
.map { PsiElementResolveResult(it) }
|
||||||
|
.toTypedArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun multiResolve(incompleteCode: Boolean): Array<ResolveResult> {
|
||||||
|
return ResolveCache.getInstance(element.project)
|
||||||
|
.resolveWithCaching(this, INSTANCE, false, incompleteCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun resolve(): PsiElement? {
|
||||||
|
val resolveResults = multiResolve(false)
|
||||||
|
return resolveResults.singleOrNull()?.element
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getVariants(): Array<Any> {
|
||||||
|
return findSymbolDefinitions(element) { true }
|
||||||
|
.map { LookupElementBuilder.createWithIcon(it) }
|
||||||
|
.toTypedArray()
|
||||||
|
}
|
||||||
|
}
|
@ -8,10 +8,7 @@ import com.intellij.psi.PsiNamedElement
|
|||||||
import com.intellij.psi.tree.TokenSet
|
import com.intellij.psi.tree.TokenSet
|
||||||
import de.platon42.intellij.plugins.m68k.lexer.M68kLexer
|
import de.platon42.intellij.plugins.m68k.lexer.M68kLexer
|
||||||
import de.platon42.intellij.plugins.m68k.lexer.M68kLexerPrefs
|
import de.platon42.intellij.plugins.m68k.lexer.M68kLexerPrefs
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
|
import de.platon42.intellij.plugins.m68k.psi.*
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kLocalLabel
|
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
|
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kTypes
|
|
||||||
import org.jetbrains.annotations.Nls
|
import org.jetbrains.annotations.Nls
|
||||||
import org.jetbrains.annotations.NonNls
|
import org.jetbrains.annotations.NonNls
|
||||||
|
|
||||||
@ -40,6 +37,7 @@ class M68kFindUsagesProvider : FindUsagesProvider {
|
|||||||
is M68kGlobalLabel -> "global label"
|
is M68kGlobalLabel -> "global label"
|
||||||
is M68kLocalLabel -> "local label"
|
is M68kLocalLabel -> "local label"
|
||||||
is M68kSymbolDefinition -> "symbol definition"
|
is M68kSymbolDefinition -> "symbol definition"
|
||||||
|
is M68kSymbolReference -> "symbol reference"
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,6 +47,7 @@ class M68kFindUsagesProvider : FindUsagesProvider {
|
|||||||
is M68kGlobalLabel -> element.name!!
|
is M68kGlobalLabel -> element.name!!
|
||||||
is M68kLocalLabel -> element.name!!
|
is M68kLocalLabel -> element.name!!
|
||||||
is M68kSymbolDefinition -> element.parent.text
|
is M68kSymbolDefinition -> element.parent.text
|
||||||
|
is M68kSymbolReference -> element.symbolName
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,9 @@ import de.platon42.intellij.jupiter.MyFixture
|
|||||||
import de.platon42.intellij.jupiter.TestDataPath
|
import de.platon42.intellij.jupiter.TestDataPath
|
||||||
import de.platon42.intellij.jupiter.TestDataSubPath
|
import de.platon42.intellij.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.m68k.AbstractM68kTest
|
import de.platon42.intellij.plugins.m68k.AbstractM68kTest
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kLocalLabel
|
import de.platon42.intellij.plugins.m68k.psi.M68kLocalLabel
|
||||||
|
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolReference
|
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolReference
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
@ -36,4 +38,38 @@ internal class M68kReferenceContributorTest : AbstractM68kTest() {
|
|||||||
.extracting<String> { (it as LookupElementBuilder).lookupString }
|
.extracting<String> { (it as LookupElementBuilder).lookupString }
|
||||||
.containsExactlyInAnyOrderElementsOf(listOf("loop$", "loop$", ".skip"))
|
.containsExactlyInAnyOrderElementsOf(listOf("loop$", "loop$", ".skip"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
internal fun reference_to_global_label_can_be_renamed(@MyFixture myFixture: CodeInsightTestFixture) {
|
||||||
|
val file = myFixture.configureByFile("global_labels.asm")
|
||||||
|
assertThat(myFixture.elementAtCaret).isInstanceOf(M68kGlobalLabel::class.java)
|
||||||
|
.extracting(PsiElement::getText).isEqualTo("main")
|
||||||
|
|
||||||
|
val reference = file.findReferenceAt(myFixture.editor.caretModel.offset - 1)!!
|
||||||
|
assertThat(reference).isInstanceOf(M68kGlobalLabelSymbolReference::class.java)
|
||||||
|
assertThat(reference.variants).hasOnlyElementsOfType(LookupElementBuilder::class.java)
|
||||||
|
.extracting<String> { (it as LookupElementBuilder).lookupString }
|
||||||
|
.containsExactlyInAnyOrder("main", "init", "exit")
|
||||||
|
|
||||||
|
myFixture.renameElementAtCaret("intro_main")
|
||||||
|
|
||||||
|
myFixture.checkResultByFile("global_labels_after_rename.asm")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
internal fun reference_to_symbol_can_be_renamed(@MyFixture myFixture: CodeInsightTestFixture) {
|
||||||
|
val file = myFixture.configureByFile("symbol_assignment.asm")
|
||||||
|
assertThat(myFixture.elementAtCaret).isInstanceOf(M68kSymbolDefinition::class.java)
|
||||||
|
.extracting(PsiElement::getText).isEqualTo("PIC_HEIGTH")
|
||||||
|
|
||||||
|
myFixture.renameElementAtCaret("PIC_HEIGHT")
|
||||||
|
|
||||||
|
val reference = file.findReferenceAt(myFixture.editor.caretModel.offset)!!
|
||||||
|
assertThat(reference).isInstanceOf(M68kGlobalLabelSymbolReference::class.java)
|
||||||
|
assertThat(reference.variants).hasOnlyElementsOfType(LookupElementBuilder::class.java)
|
||||||
|
.extracting<String> { (it as LookupElementBuilder).lookupString }
|
||||||
|
.containsExactlyInAnyOrder("main", "init", "exit", "PIC_WIDTH", "PIC_HEIGHT")
|
||||||
|
|
||||||
|
myFixture.checkResultByFile("symbol_assignment_after_rename.asm")
|
||||||
|
}
|
||||||
}
|
}
|
13
src/test/resources/references/labels/global_labels.asm
Normal file
13
src/test/resources/references/labels/global_labels.asm
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
bsr init
|
||||||
|
bsr main<caret>
|
||||||
|
bsr exit
|
||||||
|
rts
|
||||||
|
|
||||||
|
init moveq.l #-1,d0
|
||||||
|
rts
|
||||||
|
|
||||||
|
main moveq.l #0,d0
|
||||||
|
rts
|
||||||
|
|
||||||
|
exit illegal
|
||||||
|
rts
|
@ -0,0 +1,13 @@
|
|||||||
|
bsr init
|
||||||
|
bsr intro_main
|
||||||
|
bsr exit
|
||||||
|
rts
|
||||||
|
|
||||||
|
init moveq.l #-1,d0
|
||||||
|
rts
|
||||||
|
|
||||||
|
intro_main moveq.l #0,d0
|
||||||
|
rts
|
||||||
|
|
||||||
|
exit illegal
|
||||||
|
rts
|
17
src/test/resources/references/labels/symbol_assignment.asm
Normal file
17
src/test/resources/references/labels/symbol_assignment.asm
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
PIC_WIDTH = 320
|
||||||
|
PIC_HEIGTH equ 256
|
||||||
|
|
||||||
|
bsr init
|
||||||
|
bsr main
|
||||||
|
bsr exit
|
||||||
|
rts
|
||||||
|
|
||||||
|
init move.w #PIC_WIDTH,d0
|
||||||
|
move.w #PIC_<caret>HEIGTH,d1
|
||||||
|
rts
|
||||||
|
|
||||||
|
main moveq.l #0,d0
|
||||||
|
rts
|
||||||
|
|
||||||
|
exit illegal
|
||||||
|
rts
|
@ -0,0 +1,17 @@
|
|||||||
|
PIC_WIDTH = 320
|
||||||
|
PIC_HEIGHT equ 256
|
||||||
|
|
||||||
|
bsr init
|
||||||
|
bsr main
|
||||||
|
bsr exit
|
||||||
|
rts
|
||||||
|
|
||||||
|
init move.w #PIC_WIDTH,d0
|
||||||
|
move.w #PIC_HEIGHT,d1
|
||||||
|
rts
|
||||||
|
|
||||||
|
main moveq.l #0,d0
|
||||||
|
rts
|
||||||
|
|
||||||
|
exit illegal
|
||||||
|
rts
|
Loading…
Reference in New Issue
Block a user