package com.smallhacker.disbrowser.asm import com.smallhacker.disbrowser.memory.SnesAddress class Segment (val start: SnesAddress, val end: SegmentEnd, val instructions: List) class SegmentEnd(val address: SnesAddress, val local: List = emptyList(), val remote: List = emptyList(), val returnAddress: SnesAddress? = null, val returning: Boolean = false) fun stoppingSegmentEnd(address: SnesAddress) = SegmentEnd(address) fun branchingSegmentEnd(address: SnesAddress, continueState: State, branchState: State) = SegmentEnd(address, local = listOf(continueState, branchState)) fun alwaysBranchingSegmentEnd(address: SnesAddress, branchState: State) = SegmentEnd(address, local = listOf(branchState)) fun jumpSegmentEnd(address: SnesAddress, targetState: State) = SegmentEnd(address, remote = listOf(targetState)) fun subroutineSegmentEnd(address: SnesAddress, targetState: State, returnAddress: SnesAddress) = SegmentEnd(address, remote = listOf(targetState), returnAddress = returnAddress) fun returnSegmentEnd(address: SnesAddress) = SegmentEnd(address, returning = true) fun continuationSegmentEnd(state: State) = SegmentEnd(state.address, local = listOf(state)) fun Segment.toDisassembly() = Disassembly(instructions)