#!/bin/bash

# Usage: disasm.sh <start_addr_or_symbol> [end_addr_or_symbol] [bin_file]

SYMBOLS=${SYMBOLS_FILE:-dump_t}
ELF=${ELF_FILE:-../output/release/device/bootloader/epsilon.A.elf }
BASE_ADDR=0x90000000  # Ajusté selon ton dump précédent (Table de vecteurs à 0x80)

lookup() {
    local key=$1
    if [[ $key =~ ^0x[0-9a-fA-F]+$ ]] || [[ $key =~ ^[0-9a-fA-F]+$ ]]; then
        echo "0x${key#0x}"
    else
        # Cherche le symbole et récupère l'adresse (colonne 2 dans le .map IAR)
        local addr=$(grep -w "$key" "$SYMBOLS" | awk '{print $1}' | head -1)
        if [ -z "$addr" ]; then
            echo "Symbole '$key' introuvable dans $SYMBOLS" >&2
            exit 1
        fi
        echo "0x${addr}"
    fi
}

if [ -z "$1" ]; then
    echo "Usage: $0 <start> [end] [bin_file]"
    exit 1
fi

RAW_START=$(lookup "$1")
[ $? -ne 0 ] && exit 1

# --- Logique de détection Thumb ---
START_VAL=$((RAW_START))
THUMB_OPT=""

if [ $((START_VAL % 2)) -ne 0 ]; then
    echo "--- Mode Thumb détecté (adresse impaire) ---" >&2
    THUMB_OPT="-M force-thumb"
    # On aligne l'adresse sur 2 octets pour objdump
    START=$(printf '0x%x' $((START_VAL - 1)))
else
    START=$(printf '0x%x' $START_VAL)
fi

if [ -n "$2" ] && [[ ! "$2" == *.bin ]]; then
    END=$(lookup "$2")
    [ $? -ne 0 ] && exit 1
    ELF=${3:-$ELF}
else
    # Si pas de fin, on affiche 256 octets par défaut
    END=$(printf '0x%x' $(( START_VAL + 256 )))
    ELF=${2:-$ELF}
fi

# Note: J'ai utilisé $BASE_ADDR pour l'ajustement VMA global du fichier
echo "Commande: arm-none-eabi-objdump -d -m arm $THUMB_OPT --adjust-vma=$BASE_ADDR --start-address=${START} --stop-address=${END} ${ELF}" >&2

arm-none-eabi-objdump -d -m arm $THUMB_OPT \
    --start-address=${START} \
    --stop-address=${END} \
    ${ELF}
