diff --git a/sh/sram b/sh/sram new file mode 100644 index 0000000..534be6c --- /dev/null +++ b/sh/sram @@ -0,0 +1,50 @@ +#!/usr/bin/env zsh + +sram() { + die() { + echo -E "$@">&2 + exit 1 + } + + crop() { + tail -n +$((($1)/16+1)) + } + + revend() { + objcopy -I binary -O binary --reverse-bytes=4 "$@" + } + + dump() { + xxd -ps -c 16 "$@" + } + + zeros() { + # one row (16) of zeros + yes "00000000000000000000000000000000" | head -n $1 + } + + game="$1" + in="$2" + out="$3" + + if [[ "$game" == "mm" ]]; then + headsize=$((0x20800)) + elif [[ "$game" == "oot" ]]; then + headsize=$((0x40800)) + else + echo "Unknown game." >&2 + return 1 + fi + + [ -e "$2" ] || die "input save does not exist" + + if [[ "${in##*.}" == "SaveRAM" ]] then + dump "$in" | crop $headsize | dump -r > "$out" + else + cat <(zeros $(($headsize/16))) <(dump "$in") | dump -r > "$out" + fi + + revend "$out" +} + +sram "$@"