b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | set -e |
| 3 | |
| 4 | peek4() |
| 5 | { |
| 6 | FILE="$1" |
| 7 | OFFSET="$2" |
| 8 | COUNT="$3" |
| 9 | if [ -z "$OFFSET" ]; then |
| 10 | OFFSET=0 |
| 11 | fi |
| 12 | if [ -z "$COUNT" ]; then |
| 13 | COUNT=1 |
| 14 | fi |
| 15 | dd if="$FILE" bs=4 count=$COUNT skip=$(($OFFSET / 4)) status=none | hexdump -v -e '/4 "%08X\n"' |
| 16 | } |
| 17 | |
| 18 | while [ -n "$1" ]; do |
| 19 | BIN="$1" |
| 20 | shift |
| 21 | MAGIC="$(peek4 "$BIN")" |
| 22 | if [ "$MAGIC" != "43504450" ]; then # CPDP |
| 23 | echo "$BIN is not a CP ramdump file!" |
| 24 | continue |
| 25 | fi |
| 26 | NR_FILES="$(peek4 "$BIN" 4)" |
| 27 | NR_FILES=$((0x$NR_FILES)) |
| 28 | if [ $NR_FILES -eq 0 ]; then |
| 29 | echo "$BIN contains no dump files" |
| 30 | continue |
| 31 | else |
| 32 | echo "$BIN contains $NR_FILES dump files" |
| 33 | fi |
| 34 | OUTDIR="${BIN%.bin}-unpacked" |
| 35 | mkdir -p "$OUTDIR" |
| 36 | N=0 |
| 37 | for I in `seq 0 $(($NR_FILES - 1))`; do |
| 38 | OFS=$(($I * 136 + 8)) |
| 39 | FNAME="$(printf '%s' "$(dd if="$BIN" bs=1 count=128 skip=$OFS status=none)")" |
| 40 | OFS=$(($OFS + 128)) |
| 41 | FILEOFS=$((0x`peek4 "$BIN" $OFS`)) |
| 42 | OFS=$(($OFS + 4)) |
| 43 | FILELEN=$((0x`peek4 "$BIN" $OFS`)) |
| 44 | echo "$I. $FNAME|$FILEOFS|$FILELEN" |
| 45 | if [ $FILELEN -ne 0 ]; then |
| 46 | tail -c +$(($FILEOFS + 1)) "$BIN" | head -c $FILELEN > "$OUTDIR/$FNAME" |
| 47 | N=$(($N + 1)) |
| 48 | fi |
| 49 | done |
| 50 | echo "$N dump files unpacked under $OUTDIR" |
| 51 | BASE="$(basename "$BIN")" |
| 52 | SFX="$(echo "$BASE" | sed 's/^COM_DDR_//')" |
| 53 | if [ -n "$SFX" -a "$SFX" != "$BASE" ]; then |
| 54 | DIR="$(dirname "$BIN")" |
| 55 | if [ -e "$OUTDIR/com_DSP_DDR.bin" -o -e "$OUTDIR/com_dsp_ddr.bin" ]; then |
| 56 | rm -fv "$DIR"/*"DSP_DDR_$SFX" "$DIR"/*"dsp_ddr_$SFX" |
| 57 | else |
| 58 | mv -v "$DIR"/*"DSP_DDR_$SFX" "$DIR"/*"dsp_ddr_$SFX" "$OUTDIR" || true |
| 59 | fi |
| 60 | for C in "$DIR"/com_dspdump_*; do |
| 61 | [ -e "$C" ] && mv -v "$C" "$OUTDIR" || true |
| 62 | done |
| 63 | for C in "$DIR"/com_extra_*; do |
| 64 | [ -e "$C" ] && mv -v "$C" "$OUTDIR" || true |
| 65 | done |
| 66 | fi |
| 67 | done |