#!/bin/sh
# $NetBSD: walnut-mkimg.sh,v 1.6 2024/12/11 00:06:58 maya Exp $

# Convert an input to a TFTP image loadable by the IBM PowerPC OpenBIOS.

magic=5394511   # IBM OpenBIOS magic number 0x0052504f
start=0
size=0
overwrite=0

if [ $# -ne 2 ] ; then
       echo usage: $0 input image 1>&2
       exit 1
fi

input=$1; shift
output=$1; shift

: ${OBJDUMP=objdump}
: ${OBJCOPY=objcopy}
: ${STAT=stat}
: ${AWK=awk}
: ${FILE=file}

file=$( ${FILE} $input )
case $file in
*:\ ELF\ *)
       start=`${OBJDUMP} -f ${input} | ${AWK} '/start address/ { print $NF }'`
       start=`printf "%d" $start`
       ${OBJCOPY} -O binary ${input} ${input}.bin.$$
       ;;
*)
       case $file in
       *\ [Ff]ile\ [Ss]ystem*|*\ [Ff]ilesystem*)
               overwrite=1
               ;;
       esac
       cp ${input} ${input}.bin.$$
       ;;
esac

size=$(${STAT} -f '%z' ${input}.bin.$$)
size=$(( ( $size + 511 ) / 512 ))

enc()
{
       local _x=$1; shift
       printf $( printf '\\x%x' $_x )
}

be32enc()
{
       local _x=$1; shift
       enc $(( ( $_x >> 24 ) & 0xff ))
       enc $(( ( $_x >> 16 ) & 0xff ))
       enc $(( ( $_x >>  8 ) & 0xff ))
       enc $(( ( $_x >>  0 ) & 0xff ))
}

{
       be32enc $magic
       be32enc $start
       be32enc $size
       be32enc 0
       be32enc $start
       be32enc 0
       be32enc 0
       be32enc 0
} > ${input}.hdr.$$

if [ $overwrite = 0 ]; then
       cat ${input}.hdr.$$ ${input}.bin.$$ > ${output}
else
       cp ${input}.bin.$$ ${output}
       dd if=${input}.hdr.$$ of=${output} conv=notrunc
fi

rm -f ${input}.hdr.$$ ${input}.bin.$$
exit