diff options
author | Thomas <doodrabbit@hotmail.com> | 2021-12-17 20:57:03 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-17 20:57:03 -0500 |
commit | af67eaffa7ab1a347a6f0e59ed7f1e107749d15a (patch) | |
tree | b9f90f7b047b3dc5a411dbf65117bf07b237a37d /tools/asmdiff/asmdiff.sh | |
parent | 3ab18655ca1311019212b3a2a9dbe32e5fbee55d (diff) | |
parent | 44cd7753b5dde323d1e8274b2dc8a5599729e83f (diff) |
Real-match math_util.c
Diffstat (limited to 'tools/asmdiff/asmdiff.sh')
-rw-r--r-- | tools/asmdiff/asmdiff.sh | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/tools/asmdiff/asmdiff.sh b/tools/asmdiff/asmdiff.sh new file mode 100644 index 00000000..e134e2be --- /dev/null +++ b/tools/asmdiff/asmdiff.sh @@ -0,0 +1,179 @@ +#!/usr/bin/env bash + +MYDIR=$(dirname $0) + +mkdir -p ${MYDIR}/.bins + +DEFAULT_BASEROM=baserom.nds +DEFAULT_ARM9BUILDDIR=build/heartgold.us +DEFAULT_ARM7BUILDDIR=sub/build +DEFAULT_FSDIR=files + +# Build C utils on demand +[[ $MYDIR/ntruncompbw -nt $MYDIR/ntruncompbw.c ]] || gcc -O3 -g -o $MYDIR/ntruncompbw $MYDIR/ntruncompbw.c +[[ $MYDIR/ntrextractfile -nt $MYDIR/ntrextractfile.c ]] || gcc -O3 -g -o $MYDIR/ntrextractfile $MYDIR/ntrextractfile.c + +getword() { + od -j "$2" -N 4 -A n -t u "$1" | awk '{$1=$1};1' +} + +[[ -n "$DEVKITARM" ]] && export PATH=${DEVKITARM}/bin:${PATH} + +POSITIONAL=() + +usage () { + echo "Diff segments of a Nintendo DS ROM" + echo "Usage: $0 [-h] [-7] [-m OVERLAY] [-r BASEROM] [-d BUILDDIR] [START [END]]" + echo "" + echo "Arguments:" + echo " START, END Start and end virtual addresses to diff" + echo "" + echo "Options:" + echo " -7 Diff the ARM7 module (default: ARM9)" + echo " -m OVERLAY Diff the indicated overlay module (default: static module)" + echo " -r BASEROM Use the indicated baserom (default: baserom.nds)" + echo " -d BUILDDIR Look for compiled binaries in this directory (default: build/heartgold.us)" + echo " -f FILE Dump the indicated file, and use hexdump instead" + echo " -F FSDIR Filesystem path on the home system" + echo " -t Force THUMB instructions (default: ARM)" + echo " -h Show this message and exit" +} + +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -h) + usage + exit 0 + ;; + -7) + proc=armv4t + builddir=${builddir:-$DEFAULT_ARM7BUILDDIR} + basestem=${basestem}.sub + shift + ;; + -m) + [[ -n $overlay ]] && { echo can only do one overlay at a time; exit 1; } + mode=overlay + overlay="$2" + basestem=${basestem}.o${overlay} + shift 2 + ;; + -r) + baserom="$2" + shift 2 + ;; + -t) + thumb=-Mforce-thumb + shift + ;; + -f) + mode=file + filepath="$2" + shift 2 + ;; + -F) + fsdir="$2" + shift 2 + ;; + -d) + builddir="$2" + shift 2 + ;; + -*) + usage + echo unrecognized option flag: "$1" >&2 + exit 1 + ;; + *) + POSITIONAL+=("$1") + shift + ;; + esac +done + +set -- "${POSITIONAL[@]}" + +mode=${mode:-static} +proc=${proc:-armv5te} +builddir=${builddir:-$DEFAULT_ARM9BUILDDIR} +baserom=${baserom:-$DEFAULT_BASEROM} +fsdir=${fsdir:-$DEFAULT_FSDIR} + +basefile=${MYDIR}/.bins/${baserom}${basestem}.sbin + +case "$mode" in + overlay) + case $proc in + armv4t) + ovt=88 + ;; + armv5te) + ovt=80 + ;; + esac + ovtoff=$(getword "$baserom" "$ovt") + vma=$(getword "$baserom" "$((ovtoff+32*overlay+4))") + size=$(getword "$baserom" "$((ovtoff+32*overlay+8))") + [[ -f $basefile ]] || { + fileid=$(getword "$baserom" "$((ovtoff+32*overlay+24))") + param=$(getword "$baserom" "$((ovtoff+32*overlay+28))") + fatoff=$(getword "$baserom" 72) + fileoff=$(getword "$baserom" "$((fatoff+8*fileid))") + filesize=$(($(getword "$baserom" "$((fatoff+8*fileid+4))")-fileoff)) + dd if="$baserom" of="$basefile" bs=1 skip="$fileoff" count="$filesize" 2>/dev/null + (( param & 16777216 )) && { + compsize=$((param & 16777215)) + $MYDIR/ntruncompbw $basefile $vma $((vma+compsize)) || { rm -f $basefile; exit 1; } + } + } + buildfile=$builddir/OVY_${overlay}.sbin + ;; + static) + case $proc in + armv4t) + romtab=48 + compname=ichneumon_sub + ;; + armv5te) + romtab=32 + compname=main + ;; + esac + + fileoff=$(getword "$baserom" "$romtab") + vma=$(getword "$baserom" "$((romtab+8))") + size=$(getword "$baserom" "$((romtab+12))") + + [[ -f $basefile ]] || { + dd if="$baserom" of="$basefile" bs=1 skip="$fileoff" count="$size" 2>/dev/null + [[ $proc == armv5te ]] && { + _start_ModuleParams=$(getword "$baserom" $((fileoff+size+4))) + compstatend=$(getword "$basefile" $((_start_ModuleParams+20))) + [[ $compstatend != "0" ]] && { + $MYDIR/ntruncompbw $basefile $vma $compstatend || { rm -f $basefile; exit 1; } + dd if=/dev/zero of="$basefile" bs=1 seek="$((_start_ModuleParams+20))" count=4 conv=notrunc 2>/dev/null + } + } + } + buildfile=${builddir}/${compname}.sbin + ;; + file) + buildfile=${fsdir}/${filepath} + [[ -f "${buildfile}" ]] || { echo file not found: "${buildfile}"; exit 1; } + basefile=${MYDIR}/.files/${filepath} + [[ -f "${basefile}" ]] || { + mkdir -p $(dirname "${basefile}") + ${MYDIR}/ntrextractfile ${baserom} ${filepath} >${basefile} + } + diff -u <(hexdump -Cv $basefile) <(hexdump -Cv $buildfile) + exit 0 + ;; +esac + +[[ -n "$1" ]] && start=$(($1)) || start=$vma +[[ -n "$2" ]] && size=$(($2)) || size=$(wc -c <$basefile) +do-objdump () { + arm-none-eabi-objdump -Drz -bbinary -m$proc $thumb --adjust-vma=$vma --start-address=$start --stop-address=$((start+size)) $1 +} +diff -u <(do-objdump $basefile) <(do-objdump $buildfile) |