tazpanel annotate bootloader @ rev 638

boot.iso: allow /dev/cdrom
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Jan 05 15:14:01 2022 +0000 (2022-01-05)
parents 506184fa1105
children
rev   line source
pascal@516 1 #!/bin/sh
pascal@516 2 #
pascal@516 3 # This script creates a floppy image set from a linux bzImage and can merge
pascal@516 4 # a cmdline and/or one or more initramfs.
pascal@516 5 #
pascal@516 6 # (C) 2009-2015 Pascal Bellard - GNU General Public License v3.
pascal@516 7
pascal@516 8 usage()
pascal@516 9 {
pascal@516 10 cat <<EOT
pascal@516 11 Usage: $0 bzImage [--prefix image_prefix] [--info file] [--quiet]
pascal@516 12 [--format 1200|1440|1680|1920|2880|...] [--mem mb] [--tracks cnt]
pascal@516 13 [--rdev device] [--video mode] [--flags rootflags] [--no-syssize-fix]
pascal@516 14 [--dont-edit-cmdline] [--cmdline 'args'] [--hide-version-string]
pascal@516 15 [--address-initrd address] [--initrd initrdfile]...
pascal@516 16
pascal@516 17 Default values: --format 1440 --tracks 80 --rdev /dev/fd0 --prefix floppy. --mem 16
pascal@516 18
pascal@516 19 Example:
pascal@516 20 $0 /boot/bzImage --rdev /dev/ram0 --video -3 --cmdline 'rw lang=fr_FR kmap=fr-latin1 laptop autologin' --initrd /boot/rootfs.gz --initrd ./myconfig.gz
pascal@516 21
pascal@516 22 or: $0 --extract floppy*
pascal@516 23
pascal@516 24 Create kernel and maybe cmdline, initrd and info files from a floppy images set
pascal@516 25 EOT
pascal@516 26 exit 1
pascal@516 27 }
pascal@516 28
pascal@516 29 # bzImage offsets
pascal@516 30 SetupSzOfs=497
pascal@516 31 FlagsOfs=498
pascal@516 32 OldRamfsLenOfs=504
pascal@516 33 VideoModeOfs=506
pascal@516 34 RootDevOfs=508
pascal@516 35 Magic=0x202
pascal@516 36 RamfsAdrOfs=0x218
pascal@516 37 RamfsLenOfs=0x21C
pascal@516 38
pascal@516 39 ddq() { dd $@ 2> /dev/null; }
pascal@516 40
pascal@516 41 get()
pascal@516 42 {
pascal@516 43 echo $( od -v -j $(($1)) -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An $2 2>/dev/null ||
pascal@516 44 hexdump -v -s $(($1)) -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" $2 )
pascal@516 45 }
pascal@516 46
pascal@516 47 trace()
pascal@516 48 {
pascal@516 49 [ -n "$DEBUG" ] && printf "$@" 1>&2 && echo 1>&2
pascal@516 50 }
pascal@516 51
pascal@516 52 # usage: store bits offset data file
pascal@516 53 store()
pascal@516 54 {
pascal@516 55 n=$3; for i in $(seq 8 8 $1); do
pascal@516 56 printf '\\\\x%02X' $(($n & 255))
pascal@516 57 n=$(($n >> 8))
pascal@516 58 done | xargs echo -en | ddq bs=1 conv=notrunc of=$4 seek=$(($2))
pascal@516 59 s=$1; a=$2; d=$3; shift 4; c="$@"
pascal@516 60 trace "store$s(%03X) = %0$(($s/4))X $c" $a $d
pascal@516 61 }
pascal@516 62
pascal@516 63 die()
pascal@516 64 {
pascal@516 65 echo $@ 1>&2
pascal@516 66 exit 1
pascal@516 67 }
pascal@516 68 extract()
pascal@516 69 {
pascal@516 70 shift
pascal@516 71 [ ! -s "$1" ] && die "No floppy ?"
pascal@516 72 [ $(get 0x1FE "$1") -ne 43605 ] && die "Not bootable"
pascal@516 73 [ $(get $Magic "$1" 4) != 1400005704 ] &&
pascal@516 74 [ $(get 0x1F4 "$1") -gt 32768 -o $(get 0x1F6 "$1") -ne 0 ] &&
pascal@516 75 die "Not linux."
pascal@516 76 FORMAT="$(($(stat -c "%s" $1)/1024))"
pascal@516 77 cat <<EOT
pascal@516 78 --format $FORMAT
pascal@516 79 --rdev $(printf "0x%04X" $(get $RootDevOfs $1))
pascal@516 80 --video $(get $VideoModeOfs $1)
pascal@516 81 --flags $(get $FlagsOfs $1)
pascal@516 82 EOT
pascal@516 83 MYBB="$(ddq if=$1 bs=512 count=1 | strings | grep "Insert disk 00")"
pascal@516 84 cmdline=0
pascal@516 85 info=0
pascal@516 86 if [ "$MYBB" ]; then
pascal@516 87 cmdline=$(get 0x22 $1)
pascal@516 88 info=$(get 0x1EF $1)
pascal@516 89 [ $(get 0x75 $1) -eq $((0xDB0)) ] && echo "--dont-edit-cmdline"
pascal@516 90 [ $(get 0x58 $1) -eq $((0x9090)) ] && echo "--hide-version-string"
pascal@516 91 fi
pascal@516 92 n=$(($(get $SetupSzOfs $1 1)+1))
pascal@516 93 [ $n -eq 1 ] && n=5
pascal@516 94 [ $info -ne 0 ] && infolen=$(($n-$info/512)) && n=$(($info/512))
pascal@516 95 [ $cmdline -ne 0 ] && n=$(($cmdline/512))
pascal@516 96 cat "$@" | {
pascal@516 97 ddq bs=512 count=$n >kernel
pascal@516 98 files="kernel"
pascal@516 99 if [ "$MYBB" ]; then
pascal@516 100 store 8 $SetupSzOfs $(($n-1)) kernel "setup size $n"
pascal@516 101 store 16 0x22 0 kernel "clear cmdline"
pascal@516 102 store 16 0x1EF 0 kernel "clear info"
pascal@516 103 fi
pascal@516 104 [ $cmdline -ne 0 ] && files="$files cmdline" &&
pascal@516 105 ddq bs=512 count=1 | strings | sed q > cmdline
pascal@516 106 [ $info -ne 0 ] && files="$files info" &&
pascal@516 107 ddq bs=512 count=$infolen | sed \
pascal@516 108 's/'$(echo -en "\xff\xff$//;s/\xff/\f")'/g;s/\r/\n/g;q' > info
pascal@516 109 syssz=$(get 0x1F4 kernel 4)
pascal@516 110 ddq bs=16 count=$syssz >>kernel
pascal@516 111 [ $(($syssz % 32)) -ne 0 ] &&
pascal@516 112 ddq bs=16 of=/dev/null count=$((32 - ($syssz % 32)))
pascal@626 113 if [ $(get $Magic kernel 4) = 1400005704 ]; then
pascal@516 114 ddq bs=1 count=200 skip=$((512+$(get 0x20E kernel 2))) \
pascal@516 115 if=kernel | strings | sed q
pascal@516 116 len=$(get $RamfsLenOfs kernel 4)
pascal@516 117 if [ $len -ne 0 ]; then
pascal@516 118 adrs=$(get $RamfsAdrOfs kernel 4)
pascal@516 119 printf "--address-initrd 0x%X \n" $adrs
pascal@516 120 echo "--mem $(((($adrs+$len)/1024+512)/1024))"
pascal@516 121 ddq bs=512 count=$((($len+511)/512)) > initrd
pascal@516 122 ddq count=0 bs=1 seek=$len of=initrd
pascal@516 123 files="$files initrd"
pascal@516 124 store 64 $RamfsAdrOfs 0 kernel "reset initrd"
pascal@516 125 fi
pascal@516 126 if [ $(get 0x206 kernel) -ge 514 ]; then
pascal@516 127 store 32 0x228 0 kernel "clean cmdline32"
pascal@516 128 fi
pascal@516 129 else
pascal@516 130 len=$(get $OldRamfsLenOfs kernel)
pascal@516 131 [ $len -ne 0 ] && files="$files initrd" &&
pascal@516 132 if [ -s "$2" ]; then
pascal@516 133 ddq if=$2 bs=1024 count=$len of=initrd
pascal@516 134 else
pascal@516 135 ddq if=$1 bs=1024 skip=256 count=$len of=initrd
pascal@516 136 fi
pascal@516 137 fi
pascal@516 138 ls -l $files
pascal@516 139 }
pascal@516 140 exit
pascal@516 141 }
pascal@516 142
pascal@516 143 KERNEL=""
pascal@516 144 INITRD=""
pascal@516 145 ADRSRD=""
pascal@516 146 CMDLINE=""
pascal@516 147 PREFIX="floppy."
pascal@516 148 FORMAT="1440"
pascal@516 149 RDEV=""
pascal@516 150 VIDEO=""
pascal@516 151 FLAGS=""
pascal@516 152 TRACKS="80"
pascal@516 153 MEM="16"
pascal@516 154 HIDE=""
pascal@516 155 NOEDIT=""
pascal@516 156 QUIET=""
pascal@516 157 NOSYSSIZEFIX=""
pascal@516 158 INFOFILE=""
pascal@516 159 DEBUG=""
pascal@516 160 while [ -n "$1" ]; do
pascal@516 161 case "${1/--/-}" in
pascal@516 162 -c*) CMDLINE="$2"; shift;;
pascal@516 163 -inf*) INFOFILE="$2"; shift;;
pascal@516 164 -i*) INITRD="$INITRD $2"; shift;;
pascal@516 165 -a*) ADRSRD="$2"; shift;;
pascal@516 166 -h*) HIDE="1";;
pascal@516 167 -p*) PREFIX="$2"; shift;;
pascal@516 168 -fl*)FLAGS="$2"; shift;; # 1 read-only, 0 read-write
pascal@516 169 -f*) FORMAT="$2"; shift;;
pascal@516 170 -m*) MEM="$(echo $2 | sed 's/[^0-9]//g')"; shift;;
pascal@516 171 -r*) RDEV="$2"; shift;;
pascal@516 172 -v*) VIDEO="$2"; shift;; # -3 .. n
pascal@516 173 -t*) TRACKS="$2"; shift;; # likely 81 .. 84
pascal@516 174 -n*) NOSYSSIZEFIX="1";;
pascal@516 175 -debug) DEBUG="1";;
pascal@516 176 -d*) NOEDIT="1";;
pascal@516 177 -q*) QUIET="1";;
pascal@516 178 -e*) extract "$@";;
pascal@516 179 *) KERNEL="$1";;
pascal@516 180 esac
pascal@516 181 shift
pascal@516 182 done
pascal@516 183 [ -n "$KERNEL" -a -f "$KERNEL" ] || usage
pascal@516 184 while [ -L "$KERNEL" ]; do KERNEL="$(readlink "$KERNEL")"; done
pascal@516 185 if [ $(( $FORMAT % $TRACKS )) -ne 0 ]; then
pascal@516 186 echo "Invalid track count for format $FORMAT."
pascal@516 187 usage
pascal@516 188 fi
pascal@516 189 [ 0$MEM -lt 2 ] && MEM=2
pascal@516 190
pascal@516 191 patch()
pascal@516 192 {
pascal@516 193 echo -en $(echo ":$2" | sed 's/:/\\x/g') | \
pascal@516 194 ddq bs=1 conv=notrunc of=$3 seek=$((0x$1))
pascal@516 195 trace "patch $1 $2 $4"
pascal@516 196 }
pascal@516 197
pascal@516 198 error()
pascal@516 199 {
pascal@516 200 rm -f $bs
pascal@516 201 die $@
pascal@516 202 }
pascal@516 203
pascal@516 204 floppyset()
pascal@516 205 {
pascal@516 206 # boot+setup address
pascal@516 207 SetupBase=0x90000
pascal@516 208
pascal@516 209 bs=/tmp/bs$$
pascal@516 210
pascal@516 211 # Get and patch boot sector
pascal@516 212 # See http://hg.slitaz.org/wok/raw-file/13835bce7189/syslinux/stuff/iso2exe/bootloader.S
pascal@516 213 trace "Read bootsector..."
pascal@516 214 ddq if=$KERNEL bs=512 count=1 of=$bs
pascal@516 215
pascal@516 216 [ $(get 0x1FE $bs) -eq 43605 ] || error "Not bootable"
pascal@516 217
pascal@516 218 uudecode <<EOT | ddq of=$bs conv=notrunc
pascal@516 219 begin-base64 644 -
pascal@516 220 v8adaACQF4n8FgcxwLk7APOqWx+g8X1AD6H6xXd4XwZXvQAAsQbzpRYfZGaP
pascal@516 221 R3jGRfg/l1hB6CQBMfYLNu8BdAzoggF0B+hgATwbdfS+AAKBTBAggMZEJZvo
pascal@516 222 ZwEx9gt3G3Q6x0cZP6PoWwGwIOgtASwYc/lO6DEBmDwIdAOIBK05dxt08OgV
pascal@516 223 ATwKdd+IfP4WB78AgIn+h3cbtQLzpFuJ5v9IEMdAFAiTgPMIdfO79AGxBaEV
pascal@516 224 AmaLH2ZLZtPrZkOJRBtmv4AAAABmKfuccwIB31BTVjHbaACAB+hwAF5bjMG0
pascal@516 225 hxYHzRVYBQABEEwfnXfPuQkCuxwCOE/+che0iM0VPQCwcgaIbB+Ib/+hGQLT
pascal@516 226 b+J1o5fNE+oAACCQWjjBdzRgzRP56HMAYVJQKMh3ArABOfhyAon4ULQCzRNa
pascal@516 227 WHLclQHRjukA1wDXKddadE2M6ZU4wXXUiMixATDOdcz+xYD9UHXFtQBgvtEB
pascal@516 228 U7sPAIAg8Ev+AIA4OXf16EwAW4n16CkAdRVSmM0TuAECzRNa0NQ6Zv516kVI
pascal@516 229 debrjbAxHAO0DrsHAM0QPA1088O/bARkxgWmuA0BZDoldArNFnT0mM0WjudH
pascal@516 230 wwN0DrAN6NL/rDwAf/jDSW5zZXJ0IGRpc2sgMDAxIGFuZCBFbnRlci4HDQAA
pascal@516 231 AAA=
pascal@516 232 ====
pascal@516 233 EOT
pascal@516 234 # Get setup
pascal@516 235 setupsz=$(get $SetupSzOfs $bs 1)
pascal@516 236 if [ $setupsz -eq 0 ]; then
pascal@516 237 setupsz=4
pascal@516 238 store 8 $SetupSzOfs $setupsz $bs "setup size $setupsz"
pascal@516 239 fi
pascal@516 240 trace "Read setup ($setupsz sectors) ..."
pascal@516 241 ddq if=$KERNEL bs=512 skip=1 count=$setupsz >> $bs
pascal@516 242
pascal@516 243 Version=$(get 0x206 $bs)
pascal@516 244 [ $(get $Magic $bs 4) != 1400005704 ] && Version=0
pascal@516 245 feature=""
pascal@516 246 while read prot kern info ; do
pascal@516 247 [ $Version -lt $((0x$prot)) ] && continue
pascal@516 248 feature="features $prot starting from kernel $kern "
pascal@516 249 done <<EOT
pascal@516 250 200 1.3.73 kernel_version, bzImage, initrd, loadflags/type_of_loader
pascal@516 251 201 1.3.76 heap_end_ptr
pascal@516 252 202 2.4.0 new cmdline + relocatable setup
pascal@516 253 204 2.6.14 long syssize
pascal@516 254 206 2.6.22 cmdline maxsize $(get 0x238 $bs 4)
pascal@516 255 EOT
pascal@516 256 trace "Protocol %X $feature" $Version
pascal@516 257
pascal@516 258 # Old kernels need bootsector patches to disable rescent features
pascal@516 259 while read minversion maxversion offset bytes rem; do
pascal@516 260 [ $Version -gt $(( 0x$maxversion )) ] && continue
pascal@516 261 [ $Version -lt $(( 0x$minversion )) ] && continue
pascal@516 262 patch $offset $bytes $bs "$rem"
pascal@516 263 done <<EOT
pascal@516 264 000 1FF 0B2 B8:00:01 force zImage (movw \$0x100, %ax)
pascal@516 265 000 1FF 0F9 EB skip initrd code
pascal@516 266 000 1FF 059 90:90:90 no kernel version
pascal@516 267 000 1FF 050 90:90:90:90:90 type_of_loader
pascal@516 268 000 200 055 90:90:90:90 heap_end_ptr
pascal@516 269 000 203 1F6 00:00 syssize32
pascal@516 270 EOT
pascal@516 271 [ -n "$CMDLINE" ] || patch 061 EB $bs "No cmdline"
pascal@516 272 [ -n "$HIDE" ] && patch 058 90 90 90 $bs "Hide version"
pascal@516 273 [ -n "$NOEDIT" ] && patch 075 B0:0D:90 $bs 'mov CR,%al ; nop'
pascal@516 274 [ 1$TRACKS -ne 180 ] && store 8 0x15F $TRACKS $bs TRACKS
pascal@516 275
pascal@516 276 [ -n "$FLAGS" ] && store 16 $FlagsOfs $FLAGS $bs FLAGS
pascal@516 277 [ -n "$VIDEO" ] && store 16 $VideoModeOfs $VIDEO $bs VIDEO
pascal@516 278 [ -n "$RDEV" ] || case "$FORMAT" in
pascal@516 279 1200) RDEV=0x0208 ;;
pascal@516 280 1440) RDEV=0x021C ;;
pascal@516 281 2880) RDEV=0x0220 ;;
pascal@516 282 *) RDEV=0x0200 ;;
pascal@516 283 esac
pascal@516 284 while [ -L "$RDEV" ]; do RDEV="$(readlink "$RDEV")"; done
pascal@516 285 [ -b "$RDEV" ] && RDEV=$(stat -c '0x%02t%02T' $RDEV 2> /dev/null)
pascal@516 286 [ "$(echo $RDEV | tr '[0-9A-FXa-fx]' 0 | sed 's/0//g')" ] ||
pascal@516 287 store 16 $RootDevOfs $RDEV $bs RDEV
pascal@516 288
pascal@516 289 [ $FORMAT -lt 720 ] && store 8 0x15F 40 $bs 360K
pascal@516 290 [ $FORMAT -lt 320 ] && store 8 0x158 237 $bs 160K
pascal@516 291
pascal@516 292 extra=0
pascal@516 293 # Store cmdline after setup for kernels >= 0.99
pascal@516 294 if [ -n "$CMDLINE" ]; then
pascal@516 295 CmdlineOfs=$(stat -c '%s' $bs)
pascal@516 296 store 16 0x22 $CmdlineOfs $bs "Cmdline @$CmdlineOfs '$CMDLINE'"
pascal@516 297 [ $Version -ge 514 ] &&
pascal@516 298 store 32 0x228 $(( $SetupBase + 0x8000 )) $bs "Cmdline32"
pascal@516 299 echo -n "$CMDLINE" | ddq bs=512 count=1 conv=sync >> $bs
pascal@516 300 extra=$(($extra+1))
pascal@516 301 store 8 0x1F1 $(($setupsz+$extra)) $bs setup size
pascal@516 302 [ $Version -ge 512 ] && [ -n "$QUIET" ] &&
pascal@516 303 store 8 0x211 $(($(get 0x211 $bs 1) | 32)) $bs suppress early messages
pascal@516 304 fi
pascal@516 305
pascal@516 306 # Info text after setup
pascal@516 307 if [ -s "$INFOFILE" ]; then
pascal@516 308 InfoOfs=$(stat -c '%s' $bs)
pascal@516 309 sed -e ':a;N;$!ba;s/\r\n/\r/g;s/\n/\r/g' \
pascal@516 310 -e 's/'$(echo -e "\f/\xff/g;s/$/\xff\xff")'/' \
pascal@516 311 < "$INFOFILE" > $bs.infotext
pascal@516 312 ddq if=/dev/zero bs=512 count=1 >>$bs.infotext
pascal@516 313 infolen=$(($(stat -c %s $bs.infotext)/512))
pascal@516 314 ddq if=$bs.infotext count=$infolen bs=512 >> $bs
pascal@516 315 extra=$(($extra+$infolen))
pascal@516 316 rm -f $bs.infotext
pascal@516 317 store 8 0x1F1 $(($setupsz+$extra)) $bs setup size
pascal@516 318 store 16 0x1EF $InfoOfs $bs update infoptr
pascal@516 319 fi
pascal@516 320
pascal@516 321 syssz=$((($(stat -c %s $KERNEL)+15)/16-32*(1+$setupsz)))
pascal@516 322 #syssz=$(get 0x1F4 $bs 4)
pascal@516 323 sysszsect=$((($syssz+31)/32))
pascal@516 324 store 16 $OldRamfsLenOfs 0 $bs clear oldramfs
pascal@516 325 INITRD="${INITRD# }"
pascal@516 326 INITRDPAD=4
pascal@516 327 [ -n "$INITRD" ] &&
pascal@516 328 if [ $Version -lt 512 ]; then
pascal@516 329 # Compute initramfs location (protocol < 2.00)
pascal@516 330 [ $syssz -gt 32768 ] && syssz=$(get 0x1F4 $bs 2)
pascal@516 331 [ $syssz -eq 0 ] && syssz=$((0x7F00))
pascal@516 332 sysszsect=$((($syssz+31)/32))
pascal@517 333 INITRD="${INITRD%% *}"
pascal@516 334 initrdlen=$(stat -c %s "$INITRD")
pascal@516 335 store 16 $OldRamfsLenOfs $(($initrdlen/1024)) $bs set oldramfs
pascal@516 336 INITRDDISKALIGN=$((0x40000))
pascal@516 337 [ $(($initrdlen+$INITRDDISKALIGN)) -gt $(($FORMAT*1024)) -o \
pascal@516 338 $(((512*$sysszsect) + $(stat -c %s $bs))) -gt $INITRDDISKALIGN -o \
pascal@516 339 -n "$ADRSRD" ] && INITRDDISKALIGN=$(($FORMAT*1024))
pascal@516 340 else
pascal@516 341 INITRDRAMALIGN=0x1000
pascal@516 342 # Compute initramfs size (protocol >= 2.00)
pascal@516 343 initrdlen=0
pascal@516 344 INITRDDISKALIGN=0
pascal@516 345 for i in ${INITRD//,/ }; do
pascal@516 346 [ -s "$i" ] || continue
pascal@516 347 while [ -L "$i" ]; do i="$(readlink $i)"; done
pascal@516 348 size=$(stat -c %s "$i")
pascal@516 349 trace "initrd $i $size "
pascal@516 350 initrdlen=$(((($initrdlen + $INITRDPAD - 1) & -$INITRDPAD) + $size))
pascal@516 351 ADRSRD2=$(( (($MEM * 0x100000) - $initrdlen) & -$INITRDRAMALIGN ))
pascal@516 352 store 32 $RamfsAdrOfs $(( ${ADRSRD:-$ADRSRD2} )) $bs initrd adrs
pascal@516 353 store 32 $RamfsLenOfs $initrdlen $bs initrdlen
pascal@516 354 done
pascal@516 355 fi
pascal@516 356
pascal@516 357 [ -n "$NOSYSSIZEFIX" ] || store 32 0x1F4 $syssz $bs fix system size
pascal@516 358
pascal@516 359 # Output boot sector + setup + cmdline + info
pascal@516 360 ddq if=$bs
pascal@516 361
pascal@516 362 # Output kernel code
pascal@516 363 [ $INITRDDISKALIGN -ne 0 ] &&
pascal@516 364 INITRDDISKALIGN=$(($INITRDDISKALIGN/512-$sysszsect-$extra-$setupsz-1))
pascal@516 365 cat $KERNEL /dev/zero | ddq bs=512 skip=$(( $setupsz+1 )) \
pascal@516 366 count=$(($sysszsect+$INITRDDISKALIGN)) conv=sync
pascal@516 367
pascal@516 368 # Output initramfs
pascal@516 369 padding=$INITRDPAD
pascal@516 370 for i in ${INITRD//,/ }; do
pascal@516 371 [ -s "$i" ] || continue
pascal@516 372 [ $padding -eq $INITRDPAD ] || ddq if=/dev/zero bs=1 count=$padding
pascal@516 373 ddq if=$i
pascal@516 374 trace "initrd $i ($(stat -c %s $i) bytes) padding $INITRDPAD"
pascal@516 375 padding=$(( $INITRDPAD - ($(stat -c %s $i) % $INITRDPAD) ))
pascal@516 376 done
pascal@516 377
pascal@516 378 # Cleanup
pascal@516 379 rm -f $bs
pascal@516 380 }
pascal@516 381
pascal@626 382 if [ "$FORMAT" = "0" ]; then # unsplitted
pascal@516 383 floppyset > $PREFIX
pascal@516 384 PAD=$(( 512 - ($(stat -c %s $PREFIX) % 512) ))
pascal@516 385 [ $PAD -ne 512 ] && ddq if=/dev/zero bs=1 count=$PAD >> $PREFIX
pascal@516 386 exit
pascal@516 387 fi
pascal@516 388 floppyset | split -b ${FORMAT}k /dev/stdin floppy$$
pascal@516 389 i=1
pascal@516 390 ls floppy$$* 2> /dev/null | while read file ; do
pascal@516 391 output=$PREFIX$(printf "%03d" $i)
pascal@516 392 cat $file /dev/zero | ddq bs=1k count=$FORMAT conv=sync of=$output
pascal@516 393 echo $output
pascal@516 394 rm -f $file
pascal@516 395 i=$(( $i + 1 ))
pascal@516 396 done