Fixed pointer table commenting
This commit is contained in:
parent
1c71788f01
commit
3322f2460f
|
@ -2,7 +2,6 @@ package com.smallhacker.disbrowser
|
||||||
|
|
||||||
import com.smallhacker.disbrowser.asm.*
|
import com.smallhacker.disbrowser.asm.*
|
||||||
import com.smallhacker.disbrowser.game.Game
|
import com.smallhacker.disbrowser.game.Game
|
||||||
import com.smallhacker.disbrowser.game.GameData
|
|
||||||
|
|
||||||
class Grid {
|
class Grid {
|
||||||
private val arrowCells = HashMap<Pair<Int, Int>, HtmlNode?>()
|
private val arrowCells = HashMap<Pair<Int, Int>, HtmlNode?>()
|
||||||
|
@ -61,18 +60,19 @@ class Grid {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun add(ins: CodeUnit, game: Game, disassembly: Disassembly) {
|
fun add(ins: CodeUnit, game: Game, disassembly: Disassembly) {
|
||||||
val presentedAddress = ins.presentedAddress
|
val sortedAddress = ins.sortedAddress
|
||||||
|
val indicativeAddress = ins.indicativeAddress
|
||||||
val gameData = game.gameData
|
val gameData = game.gameData
|
||||||
|
|
||||||
if (nextAddress != null) {
|
if (nextAddress != null) {
|
||||||
if (presentedAddress != nextAddress) {
|
if (sortedAddress != nextAddress) {
|
||||||
addDummy()
|
addDummy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nextAddress = ins.nextPresentedAddress
|
nextAddress = ins.nextSortedAddress
|
||||||
|
|
||||||
val y = (height++)
|
val y = (height++)
|
||||||
addresses[presentedAddress] = y
|
addresses[sortedAddress] = y
|
||||||
|
|
||||||
val (address, bytes, label, primaryMnemonic, secondaryMnemonic, suffix, operands, state, comment, labelAddress)
|
val (address, bytes, label, primaryMnemonic, secondaryMnemonic, suffix, operands, state, comment, labelAddress)
|
||||||
= ins.print(gameData)
|
= ins.print(gameData)
|
||||||
|
@ -80,7 +80,7 @@ class Grid {
|
||||||
add(y, ins.address,
|
add(y, ins.address,
|
||||||
text(address ?: ""),
|
text(address ?: ""),
|
||||||
text(bytes),
|
text(bytes),
|
||||||
editableField(game, presentedAddress, "label", label),
|
editableField(game, indicativeAddress, "label", label),
|
||||||
fragment {
|
fragment {
|
||||||
if (secondaryMnemonic == null) {
|
if (secondaryMnemonic == null) {
|
||||||
text(primaryMnemonic)
|
text(primaryMnemonic)
|
||||||
|
@ -113,7 +113,7 @@ class Grid {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
text(state ?: ""),
|
text(state ?: ""),
|
||||||
editableField(game, presentedAddress, "comment", comment)
|
editableField(game, indicativeAddress, "comment", comment)
|
||||||
)
|
)
|
||||||
|
|
||||||
if (ins.opcode.continuation == Continuation.NO) {
|
if (ins.opcode.continuation == Continuation.NO) {
|
||||||
|
|
|
@ -48,10 +48,10 @@ object Service {
|
||||||
grid.add(it, game, disassembly)
|
grid.add(it, game, disassembly)
|
||||||
}
|
}
|
||||||
disassembly.asSequence()
|
disassembly.asSequence()
|
||||||
.mapNotNull {
|
.mapNotNull {ins ->
|
||||||
it.linkedState
|
ins.linkedState
|
||||||
?.let { link ->
|
?.let { link ->
|
||||||
it.presentedAddress to link.address
|
ins.sortedAddress to link.address
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.sortedBy { it.first distanceTo it.second }
|
.sortedBy { it.first distanceTo it.second }
|
||||||
|
|
|
@ -6,8 +6,9 @@ import com.smallhacker.disbrowser.util.*
|
||||||
interface CodeUnit {
|
interface CodeUnit {
|
||||||
val address: SnesAddress?
|
val address: SnesAddress?
|
||||||
val relativeAddress: SnesAddress
|
val relativeAddress: SnesAddress
|
||||||
val presentedAddress: SnesAddress
|
val indicativeAddress: SnesAddress
|
||||||
val nextPresentedAddress: SnesAddress
|
val sortedAddress: SnesAddress
|
||||||
|
val nextSortedAddress: SnesAddress
|
||||||
|
|
||||||
val linkedState: State?
|
val linkedState: State?
|
||||||
val preState: State?
|
val preState: State?
|
||||||
|
@ -55,13 +56,14 @@ interface CodeUnit {
|
||||||
class DataBlock(
|
class DataBlock(
|
||||||
override val opcode: Opcode,
|
override val opcode: Opcode,
|
||||||
override val bytes: ValidMemorySpace,
|
override val bytes: ValidMemorySpace,
|
||||||
override val presentedAddress: SnesAddress,
|
override val indicativeAddress: SnesAddress,
|
||||||
|
override val sortedAddress: SnesAddress,
|
||||||
override val relativeAddress: SnesAddress,
|
override val relativeAddress: SnesAddress,
|
||||||
override val linkedState: State?,
|
override val linkedState: State?,
|
||||||
override val memory: SnesMemory
|
override val memory: SnesMemory
|
||||||
) : CodeUnit {
|
) : CodeUnit {
|
||||||
override val nextPresentedAddress: SnesAddress
|
override val nextSortedAddress: SnesAddress
|
||||||
get() = presentedAddress + operandLength.toInt()
|
get() = sortedAddress + operandLength.toInt()
|
||||||
override val operandLength get() = bytes.size
|
override val operandLength get() = bytes.size
|
||||||
|
|
||||||
override val address: SnesAddress? = null
|
override val address: SnesAddress? = null
|
||||||
|
@ -73,9 +75,10 @@ class DataBlock(
|
||||||
class Instruction(override val bytes: ValidMemorySpace, override val opcode: Opcode, override val preState: State) : CodeUnit {
|
class Instruction(override val bytes: ValidMemorySpace, override val opcode: Opcode, override val preState: State) : CodeUnit {
|
||||||
override val memory = preState.memory
|
override val memory = preState.memory
|
||||||
override val address: SnesAddress get() = preState.address
|
override val address: SnesAddress get() = preState.address
|
||||||
|
override val indicativeAddress get() = address
|
||||||
override val relativeAddress get() = address
|
override val relativeAddress get() = address
|
||||||
override val presentedAddress get() = address
|
override val sortedAddress get() = address
|
||||||
override val nextPresentedAddress get() = postState.address
|
override val nextSortedAddress get() = postState.address
|
||||||
|
|
||||||
override val postState = opcode.mutate(this)
|
override val postState = opcode.mutate(this)
|
||||||
.mutateAddress { it + bytes.size.toInt() }
|
.mutateAddress { it + bytes.size.toInt() }
|
||||||
|
@ -136,8 +139,8 @@ fun CodeUnit.print(gameData: GameData? = null): PrintedCodeUnit {
|
||||||
}
|
}
|
||||||
|
|
||||||
val state = postState?.toString()
|
val state = postState?.toString()
|
||||||
val label = address?.let { gameData?.get(it)?.label }
|
val label = gameData?.get(indicativeAddress)?.label
|
||||||
val comment = address?.let { gameData?.get(it)?.comment }
|
val comment = gameData?.get(indicativeAddress)?.comment
|
||||||
val formattedAddress = address?.toFormattedString()
|
val formattedAddress = address?.toFormattedString()
|
||||||
val bytes = bytesToString()
|
val bytes = bytesToString()
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ object Disassembler {
|
||||||
}
|
}
|
||||||
|
|
||||||
val instructionList = instructions
|
val instructionList = instructions
|
||||||
.sortedBy { it.presentedAddress }
|
.sortedBy { it.sortedAddress }
|
||||||
.toList()
|
.toList()
|
||||||
|
|
||||||
return Disassembly(instructionList)
|
return Disassembly(instructionList)
|
||||||
|
|
|
@ -104,6 +104,7 @@ class JmpIndirectLongInterleavedTable @JsonCreator constructor(
|
||||||
DataBlock(
|
DataBlock(
|
||||||
Opcode.CODE_POINTER_LONG,
|
Opcode.CODE_POINTER_LONG,
|
||||||
table.range(offset, 3u),
|
table.range(offset, 3u),
|
||||||
|
start + offset.toInt(),
|
||||||
jumpInstruction.postState.address + offset.toInt(),
|
jumpInstruction.postState.address + offset.toInt(),
|
||||||
jumpInstruction.relativeAddress,
|
jumpInstruction.relativeAddress,
|
||||||
jumpInstruction.opcode.mutate(jumpInstruction)
|
jumpInstruction.opcode.mutate(jumpInstruction)
|
||||||
|
|
Loading…
Reference in New Issue