Fixed pointer table commenting

This commit is contained in:
Smallhacker 2019-01-14 00:23:19 -05:00
parent 1c71788f01
commit 3322f2460f
5 changed files with 24 additions and 20 deletions

View File

@ -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) {

View File

@ -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 }

View File

@ -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()

View File

@ -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)

View File

@ -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)