# HG changeset patch # User Pascal Bellard # Date 1568569764 -7200 # Node ID f93fa966f210f921d2366825478af47334179a8c # Parent 063403f23e53905ca60184db4ee603ffef416f49 linux/bundle: multi floppy support diff -r 063403f23e53 -r f93fa966f210 base-tiny/receipt --- a/base-tiny/receipt Tue Sep 10 09:02:43 2019 +0200 +++ b/base-tiny/receipt Sun Sep 15 19:49:24 2019 +0200 @@ -119,6 +119,7 @@ sed "s|\$(echo -en '\x64\x66\x8F\x47\x78')|\$(echo -en '\x5E\x5E\x90\x90\x90')|" | \\ sed "s|\$(echo -en '\x66\x8F\x47\x78')|\$(echo -en '\x5E\x5E\x90\x90')|" | \\ sed "s|\$(echo -en '\x77\x02\xB0\x01')|\$(echo -en '\x90\x90\xB0\x01')|" | \\ + sed "s|\$(echo -en '\xB0\x31\x1C\x03\xB4\x0E')|\$(echo -en '\xB0\x31\x14\xFD\xB4\x0E')|" | \\ dd of=\$i conv=notrunc done EOT diff -r 063403f23e53 -r f93fa966f210 linux/stuff/bundle --- a/linux/stuff/bundle Tue Sep 10 09:02:43 2019 +0200 +++ b/linux/stuff/bundle Sun Sep 15 19:49:24 2019 +0200 @@ -36,6 +36,7 @@ cat < floppyset ; $p floppyset EOT elif [ -n "$4" ]; then out="$1" @@ -49,38 +50,36 @@ shift 2 free=$((0x1F1 - 2 - $pos - $crc)) while [ -n "$2" -a $free -ge ${#2} ]; do - echo "$((($(stat -c "%s" "$1")+511)/512)) $1 $2" + echo "$((($(stat -Lc "%s" "$1")+511)/512))?$1?$2" shift 2 - done | awk ' -BEGIN { i=0 } { sz[i]=$1; fn[i]=$2; sub(".*"$2,""); me[i++]=$0 } -END { - for (m=0, l=p=1; m> "$out" + echo -en "$x$name\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc + pos=$(($pos+2+${#name}+1)) if [ $crc -ne 0 ]; then - x=$(cat "$file" /dev/zero | ddq bs=512 count=$s | od -v \ - -t u2 -w2 -An|awk '{i+=$0} END {print (i % 65536)}') - x="$(printf '\\x%02x\\x%02x' $(($x % 256)) $(($x / 256)) )" + x=$(cat "$file" /dev/zero | ddq bs=512 count=$s | \ + od -v -t u2 -w2 -An | awk '{i+=$0} \ + END {print (i % 65536)}') + x="$(printf '\\x%02x\\x%02x' $(($x%256)) $(($x/256)) )" echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc pos=$(($pos+2)) - x="$(printf '\\x%02x\\x%02x' $(($s % 256)) $(($s / 256)) )" + x="$(printf '\\x%02x\\x%02x' $(($s%256)) $(($s/256)) )" echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc pos=$(($pos+2)) fi - shift 2 + echo "$file $s" + done | awk 'BEGIN { i=0 } { file[i]=$1; size[i]=$2; i++ } + END { while (--i >= 0) print file[i] " " size[i] }' | \ + while read file size; do + cat "$file" /dev/zero | ddq bs=512 count=$size >> "$out" done elif [ -s "$2" ]; then base_initrd=$((0x00300000)) - size_initrd=$(stat -c %s "$2") + size_initrd=$(stat -Lc %s "$2") [ $(($base_initrd + $size_initrd)) -gt $((0x1000000)) ] && base_initrd=$((0x01400000)) [ "$3" ] && base_initrd=$(($3)) @@ -95,16 +94,16 @@ [ $(get $(($menu -3)) "$1" 2) -eq 24937 ] && skip=4 || skip=0 ddq bs=1 skip=$menu count=$((0x1F3 - $menu)) if="$1" | \ od -v -t u1 -w1 -An | awk -vx=$skip '{ - if (--skip >= 0) next + if (--skip >= 0) next # crc, len if (--bytes < 0) { - if ($1 == 0) { - if (mul > 0) { + if ($1 == 0) { # eos + if (mul > 0) { # menu label if (sector == 0) exit skip=x; print sector " " s } - s=""; sector=0; mul=1; bytes=2 + s=""; sector=0; mul=1; bytes=2 # menu title } - else { c=sprintf("%c",$1); s=s c } + else { c=sprintf("%c",$1); s=s c } # menu title/label } else { sector += $0*mul; mul *= 256 } }' | while read s name; do @@ -114,11 +113,12 @@ if [ $(get $(($s*512 + 0x202)) "$1" 2) -eq 25672 ]; then x=$(get $(($s*512 + 0x21C)) "$1") [ $x -ne 0 ] && x=$(((($cnt+31)/32)*512+$x)) && - cnt=$((($x+15)/16)) + cnt=$((($x+15)/16)) # initrd fi ddq bs=16 skip=$((32*$s)) count=$cnt if="$1" of="$name" [ $x -ne 0 ] && ddq bs=1 seek=$x count=0 of="$name" - ls -l "$name" + printf "S%04X %9d " $s $(($cnt*16)) + ls -l "$name" | cut -c35- done else base_initrd=$(get 0x218 "$1") diff -r 063403f23e53 -r f93fa966f210 linux/stuff/bundle.S --- a/linux/stuff/bundle.S Tue Sep 10 09:02:43 2019 +0200 +++ b/linux/stuff/bundle.S Sun Sep 15 19:49:24 2019 +0200 @@ -52,29 +52,31 @@ call putcr movw %bp, %cx menulp: - movb $' ', %bh + .macro entry + movb $' ', %bl lodsw loop notcur xchgw %ax, %di - movb $'>', %bh + movb $'>', %bl notcur: - movb %bh, %al - call putcs + xchgw %ax, %bx + .endm #ifdef CHECK_FILES + call putentry lodsw // CRC16 lodsw // sector count +#else + entry + call putcs #endif cmpw $0, (%si) jne menulp #ifdef CHECK_FILES - movw $msgcrc, %si - movb $' ', %al - loop notcrc - movb $'>', %al -notcrc: - call putcs + movw $msgcrc-2, %si + call putentry #endif menustartz: + .macro waitkbdcode #ifdef TIMEOUT clock = 0x46C wait: @@ -88,18 +90,25 @@ waitkbd: movw $0x10D, %ax // test keyboard, timeout => CR cmpb (%si), %ah +clock_patch: je waitdone int $0x16 jz waitkbd cbw int $0x16 // eat char - movw %si, wait4key+0x7C02 // disable timeout + movb $0xA8, clock_patch+0x7C00 // disable timeout waitdone: popw %ds #else xorb %ax, %ax int $0x16 #endif + .endm +#ifdef CHECK_FILES + call wait4kbd +#else + waitkbdcode +#endif cmpb $0x0D, %al // CR ? je doit cmpb $0x48, %ah // UP ? @@ -112,14 +121,32 @@ loope menudown jmp menustartlp +#ifdef CHECK_FILES +toeos: + lodsb + orb %al, %al + jnz toeos + lodsw // crc, count + lodsw + cmpw $0, (%si) + jne nextchk + call wait4kbd + jmp start +#endif + .macro tochs // %di -> %cx, %dx & %bp=sector max movw $64, %cx - movw $0x200, %bx sectlp: - movw $0x201, %ax movb %ch, %dh decw %cx +#define BUFFER 0x200 +#ifdef CHECK_FILES + call readsector +#else + movw $BUFFER, %bx + movw $0x201, %ax int $0x13 +#endif jc sectlp movw %cx, %bp movw %di, %ax @@ -135,29 +162,26 @@ #ifdef CHECK_FILES jcxz docrc call getsectors + call readsector2 #else tochs // %di -> %cx, %dx & %bp=sector max -#endif - pushw %cx movw $0x201, %ax int $0x13 - popw %cx +#endif jc menustart // scan boot code - movw %bx, %di // =0x200 scanboot: - incw %di - je found - cmpw $0x5897, -3(%di) // xchgw %ax, %di; popw %ax + incw %bx + cmpw $0x5897, -3(%bx) // xchgw %ax, %di; popw %ax jne scanboot - cmpw $0xE841, -1(%di) // incw %cx ; call ... + cmpw $0xE841, -1(%bx) // incw %cx ; call ... jne scanboot found: pushw %ds - pushw %di + pushw %bx cli - movb 0x1F1(%bx), %al // setup size + movb 0x1F1+BUFFER, %al // setup size pushw %ss popw %ds pushw %ss @@ -175,29 +199,29 @@ lodsb orb %al, %al jnz skiptitle +nextchklp: + pushw %si // start of menu nextchk: lodsw // sector offset - xchgw %ax, %di - movw %di, %cx - movw $1, %bp - jcxz menustartz + cmpw %ax, %di // next sector offset + jne toeos call puts // menu entry - call getsectors + call getsectors // %di -> %cx, %dx & %bp=sector max lodsw + addw (%si), %di + pushw %di // next sector offset xchgw %ax, %di // crc - movw $0x201, %ax - int $0x13 lodsw // sector count - pushw %si - jc chkfail xchgw %ax, %si chksector: + call readsector + jc chkfail +chksectorz: subw (%bx), %di incw %bx incw %bx cmpb $4, %bh - jne chksector - movb $2, %bh + jne chksectorz decw %si je chkend movw %bp, %ax @@ -208,10 +232,16 @@ xorb %cl, %dh jne rdit incb %ch + cmp $80, %ch + jb rdit + push %si + mov $msgnext, %si + call puts + call wait4kbd + pop %si + mov $0, %ch rdit: - movw $0x201, %ax - int $0x13 - jnc chksector + jmp chksector chkend: movw $msgok, %si orw %di, %di @@ -220,18 +250,34 @@ movw $msgko, %si chkok: call puts - popw %si - jmp nextchk + popw %di // next sector offset + popw %si // start of menu + jmp nextchklp + +readsector: + movw $BUFFER, %bx +readsector2: + movw $0x201, %ax + int $0x13 + ret getsectors: tochs // %di -> %cx, %dx & %bp=sector max ret + +wait4kbd: + waitkbdcode + ret + +putentry: + entry + jmp putcs #endif puts: lodsb - orb %al, %al - jnz putcs + cmpb $2, %al + jnc putcs putcr: movb $10, %al putlf: @@ -249,7 +295,8 @@ msgok: .asciz " OK" msgko: - .asciz " Broken" + .ascii " Broken" + .word 1 // next sector offset msgcrc: .asciz "Check media" // used to detect CHECK_FILES #endif @@ -263,7 +310,12 @@ syssz: .long 0 // updated by bundle ramsize: +#ifdef CHECK_FILES +msgnext: + .asciz "Next!" +#else .ascii "SliTaz" +#endif // .word 0 //vidmode: // .word 0