wok-tiny rev 151
linux/bundle: multi floppy support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Sep 15 19:49:24 2019 +0200 (2019-09-15) |
parents | 063403f23e53 |
children | 7efc88318579 |
files | base-tiny/receipt linux/stuff/bundle linux/stuff/bundle.S |
line diff
1.1 --- a/base-tiny/receipt Tue Sep 10 09:02:43 2019 +0200 1.2 +++ b/base-tiny/receipt Sun Sep 15 19:49:24 2019 +0200 1.3 @@ -119,6 +119,7 @@ 1.4 sed "s|\$(echo -en '\x64\x66\x8F\x47\x78')|\$(echo -en '\x5E\x5E\x90\x90\x90')|" | \\ 1.5 sed "s|\$(echo -en '\x66\x8F\x47\x78')|\$(echo -en '\x5E\x5E\x90\x90')|" | \\ 1.6 sed "s|\$(echo -en '\x77\x02\xB0\x01')|\$(echo -en '\x90\x90\xB0\x01')|" | \\ 1.7 + sed "s|\$(echo -en '\xB0\x31\x1C\x03\xB4\x0E')|\$(echo -en '\xB0\x31\x14\xFD\xB4\x0E')|" | \\ 1.8 dd of=\$i conv=notrunc 1.9 done 1.10 EOT
2.1 --- a/linux/stuff/bundle Tue Sep 10 09:02:43 2019 +0200 2.2 +++ b/linux/stuff/bundle Sun Sep 15 19:49:24 2019 +0200 2.3 @@ -36,6 +36,7 @@ 2.4 cat <<EOT 2.5 Usage: $p kernel [initrd] [@] 2.6 or: $p menufile "menu title" file1 "menu entry 1" ... 2.7 +or: cat floppy.* > floppyset ; $p floppyset 2.8 EOT 2.9 elif [ -n "$4" ]; then 2.10 out="$1" 2.11 @@ -49,38 +50,36 @@ 2.12 shift 2 2.13 free=$((0x1F1 - 2 - $pos - $crc)) 2.14 while [ -n "$2" -a $free -ge ${#2} ]; do 2.15 - echo "$((($(stat -c "%s" "$1")+511)/512)) $1 $2" 2.16 + echo "$((($(stat -Lc "%s" "$1")+511)/512))?$1?$2" 2.17 shift 2 2.18 - done | awk ' 2.19 -BEGIN { i=0 } { sz[i]=$1; fn[i]=$2; sub(".*"$2,""); me[i++]=$0 } 2.20 -END { 2.21 - for (m=0, l=p=1; m<i; m++) { 2.22 - for (s=100000, j=0; j<i; j++) if (!lc[j] && sz[j]<s) s=sz[k=j]; 2.23 - f2[m]=fn[k]; s2[m]=s; lc[k]=l; l+=s; l2[m]=p; p+=sz[m] 2.24 - } 2.25 - for (j=0; j<i; j++) 2.26 - print sz[j] " " lc[j] " " fn[j] " " s2[j] " " l2[j] " " f2[j] " " me[j] 2.27 -}' | while read s p file s2 p2 file2 entry ; do 2.28 - [ -z "$SORT_MENU" ] && file2=$file && s2=$s && p=$p2 2.29 + done | awk -F? 'BEGIN { nxt=1; i=0 } 2.30 +{ ofs[i]=$1; nxt+=$1 ; file[i]=$2; name[i]=$3; i++ } 2.31 +END { for (j = 0; j < i; j++) { nxt-=ofs[j] 2.32 +print nxt " " ofs[j] " " file[j] " " name[j] }}' | \ 2.33 + while read p s file name; do 2.34 x="$(printf '\\x%02x\\x%02x' $(($p % 256)) $(($p / 256)) )" 2.35 - echo -en "$x$entry\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc 2.36 - pos=$(($pos+2+${#entry}+1)) 2.37 - cat "$file2" /dev/zero | ddq bs=512 count=$s2 >> "$out" 2.38 + echo -en "$x$name\0" | ddq bs=1 of="$out" seek=$pos conv=notrunc 2.39 + pos=$(($pos+2+${#name}+1)) 2.40 if [ $crc -ne 0 ]; then 2.41 - x=$(cat "$file" /dev/zero | ddq bs=512 count=$s | od -v \ 2.42 - -t u2 -w2 -An|awk '{i+=$0} END {print (i % 65536)}') 2.43 - x="$(printf '\\x%02x\\x%02x' $(($x % 256)) $(($x / 256)) )" 2.44 + x=$(cat "$file" /dev/zero | ddq bs=512 count=$s | \ 2.45 + od -v -t u2 -w2 -An | awk '{i+=$0} \ 2.46 + END {print (i % 65536)}') 2.47 + x="$(printf '\\x%02x\\x%02x' $(($x%256)) $(($x/256)) )" 2.48 echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc 2.49 pos=$(($pos+2)) 2.50 - x="$(printf '\\x%02x\\x%02x' $(($s % 256)) $(($s / 256)) )" 2.51 + x="$(printf '\\x%02x\\x%02x' $(($s%256)) $(($s/256)) )" 2.52 echo -en "$x" | ddq bs=1 of="$out" seek=$pos conv=notrunc 2.53 pos=$(($pos+2)) 2.54 fi 2.55 - shift 2 2.56 + echo "$file $s" 2.57 + done | awk 'BEGIN { i=0 } { file[i]=$1; size[i]=$2; i++ } 2.58 + END { while (--i >= 0) print file[i] " " size[i] }' | \ 2.59 + while read file size; do 2.60 + cat "$file" /dev/zero | ddq bs=512 count=$size >> "$out" 2.61 done 2.62 elif [ -s "$2" ]; then 2.63 base_initrd=$((0x00300000)) 2.64 - size_initrd=$(stat -c %s "$2") 2.65 + size_initrd=$(stat -Lc %s "$2") 2.66 [ $(($base_initrd + $size_initrd)) -gt $((0x1000000)) ] && 2.67 base_initrd=$((0x01400000)) 2.68 [ "$3" ] && base_initrd=$(($3)) 2.69 @@ -95,16 +94,16 @@ 2.70 [ $(get $(($menu -3)) "$1" 2) -eq 24937 ] && skip=4 || skip=0 2.71 ddq bs=1 skip=$menu count=$((0x1F3 - $menu)) if="$1" | \ 2.72 od -v -t u1 -w1 -An | awk -vx=$skip '{ 2.73 - if (--skip >= 0) next 2.74 + if (--skip >= 0) next # crc, len 2.75 if (--bytes < 0) { 2.76 - if ($1 == 0) { 2.77 - if (mul > 0) { 2.78 + if ($1 == 0) { # eos 2.79 + if (mul > 0) { # menu label 2.80 if (sector == 0) exit 2.81 skip=x; print sector " " s 2.82 } 2.83 - s=""; sector=0; mul=1; bytes=2 2.84 + s=""; sector=0; mul=1; bytes=2 # menu title 2.85 } 2.86 - else { c=sprintf("%c",$1); s=s c } 2.87 + else { c=sprintf("%c",$1); s=s c } # menu title/label 2.88 } 2.89 else { sector += $0*mul; mul *= 256 } 2.90 }' | while read s name; do 2.91 @@ -114,11 +113,12 @@ 2.92 if [ $(get $(($s*512 + 0x202)) "$1" 2) -eq 25672 ]; then 2.93 x=$(get $(($s*512 + 0x21C)) "$1") 2.94 [ $x -ne 0 ] && x=$(((($cnt+31)/32)*512+$x)) && 2.95 - cnt=$((($x+15)/16)) 2.96 + cnt=$((($x+15)/16)) # initrd 2.97 fi 2.98 ddq bs=16 skip=$((32*$s)) count=$cnt if="$1" of="$name" 2.99 [ $x -ne 0 ] && ddq bs=1 seek=$x count=0 of="$name" 2.100 - ls -l "$name" 2.101 + printf "S%04X %9d " $s $(($cnt*16)) 2.102 + ls -l "$name" | cut -c35- 2.103 done 2.104 else 2.105 base_initrd=$(get 0x218 "$1")
3.1 --- a/linux/stuff/bundle.S Tue Sep 10 09:02:43 2019 +0200 3.2 +++ b/linux/stuff/bundle.S Sun Sep 15 19:49:24 2019 +0200 3.3 @@ -52,29 +52,31 @@ 3.4 call putcr 3.5 movw %bp, %cx 3.6 menulp: 3.7 - movb $' ', %bh 3.8 + .macro entry 3.9 + movb $' ', %bl 3.10 lodsw 3.11 loop notcur 3.12 xchgw %ax, %di 3.13 - movb $'>', %bh 3.14 + movb $'>', %bl 3.15 notcur: 3.16 - movb %bh, %al 3.17 - call putcs 3.18 + xchgw %ax, %bx 3.19 + .endm 3.20 #ifdef CHECK_FILES 3.21 + call putentry 3.22 lodsw // CRC16 3.23 lodsw // sector count 3.24 +#else 3.25 + entry 3.26 + call putcs 3.27 #endif 3.28 cmpw $0, (%si) 3.29 jne menulp 3.30 #ifdef CHECK_FILES 3.31 - movw $msgcrc, %si 3.32 - movb $' ', %al 3.33 - loop notcrc 3.34 - movb $'>', %al 3.35 -notcrc: 3.36 - call putcs 3.37 + movw $msgcrc-2, %si 3.38 + call putentry 3.39 #endif 3.40 menustartz: 3.41 + .macro waitkbdcode 3.42 #ifdef TIMEOUT 3.43 clock = 0x46C 3.44 wait: 3.45 @@ -88,18 +90,25 @@ 3.46 waitkbd: 3.47 movw $0x10D, %ax // test keyboard, timeout => CR 3.48 cmpb (%si), %ah 3.49 +clock_patch: 3.50 je waitdone 3.51 int $0x16 3.52 jz waitkbd 3.53 cbw 3.54 int $0x16 // eat char 3.55 - movw %si, wait4key+0x7C02 // disable timeout 3.56 + movb $0xA8, clock_patch+0x7C00 // disable timeout 3.57 waitdone: 3.58 popw %ds 3.59 #else 3.60 xorb %ax, %ax 3.61 int $0x16 3.62 #endif 3.63 + .endm 3.64 +#ifdef CHECK_FILES 3.65 + call wait4kbd 3.66 +#else 3.67 + waitkbdcode 3.68 +#endif 3.69 cmpb $0x0D, %al // CR ? 3.70 je doit 3.71 cmpb $0x48, %ah // UP ? 3.72 @@ -112,14 +121,32 @@ 3.73 loope menudown 3.74 jmp menustartlp 3.75 3.76 +#ifdef CHECK_FILES 3.77 +toeos: 3.78 + lodsb 3.79 + orb %al, %al 3.80 + jnz toeos 3.81 + lodsw // crc, count 3.82 + lodsw 3.83 + cmpw $0, (%si) 3.84 + jne nextchk 3.85 + call wait4kbd 3.86 + jmp start 3.87 +#endif 3.88 + 3.89 .macro tochs // %di -> %cx, %dx & %bp=sector max 3.90 movw $64, %cx 3.91 - movw $0x200, %bx 3.92 sectlp: 3.93 - movw $0x201, %ax 3.94 movb %ch, %dh 3.95 decw %cx 3.96 +#define BUFFER 0x200 3.97 +#ifdef CHECK_FILES 3.98 + call readsector 3.99 +#else 3.100 + movw $BUFFER, %bx 3.101 + movw $0x201, %ax 3.102 int $0x13 3.103 +#endif 3.104 jc sectlp 3.105 movw %cx, %bp 3.106 movw %di, %ax 3.107 @@ -135,29 +162,26 @@ 3.108 #ifdef CHECK_FILES 3.109 jcxz docrc 3.110 call getsectors 3.111 + call readsector2 3.112 #else 3.113 tochs // %di -> %cx, %dx & %bp=sector max 3.114 -#endif 3.115 - pushw %cx 3.116 movw $0x201, %ax 3.117 int $0x13 3.118 - popw %cx 3.119 +#endif 3.120 jc menustart 3.121 3.122 // scan boot code 3.123 - movw %bx, %di // =0x200 3.124 scanboot: 3.125 - incw %di 3.126 - je found 3.127 - cmpw $0x5897, -3(%di) // xchgw %ax, %di; popw %ax 3.128 + incw %bx 3.129 + cmpw $0x5897, -3(%bx) // xchgw %ax, %di; popw %ax 3.130 jne scanboot 3.131 - cmpw $0xE841, -1(%di) // incw %cx ; call ... 3.132 + cmpw $0xE841, -1(%bx) // incw %cx ; call ... 3.133 jne scanboot 3.134 found: 3.135 pushw %ds 3.136 - pushw %di 3.137 + pushw %bx 3.138 cli 3.139 - movb 0x1F1(%bx), %al // setup size 3.140 + movb 0x1F1+BUFFER, %al // setup size 3.141 pushw %ss 3.142 popw %ds 3.143 pushw %ss 3.144 @@ -175,29 +199,29 @@ 3.145 lodsb 3.146 orb %al, %al 3.147 jnz skiptitle 3.148 +nextchklp: 3.149 + pushw %si // start of menu 3.150 nextchk: 3.151 lodsw // sector offset 3.152 - xchgw %ax, %di 3.153 - movw %di, %cx 3.154 - movw $1, %bp 3.155 - jcxz menustartz 3.156 + cmpw %ax, %di // next sector offset 3.157 + jne toeos 3.158 call puts // menu entry 3.159 - call getsectors 3.160 + call getsectors // %di -> %cx, %dx & %bp=sector max 3.161 lodsw 3.162 + addw (%si), %di 3.163 + pushw %di // next sector offset 3.164 xchgw %ax, %di // crc 3.165 - movw $0x201, %ax 3.166 - int $0x13 3.167 lodsw // sector count 3.168 - pushw %si 3.169 - jc chkfail 3.170 xchgw %ax, %si 3.171 chksector: 3.172 + call readsector 3.173 + jc chkfail 3.174 +chksectorz: 3.175 subw (%bx), %di 3.176 incw %bx 3.177 incw %bx 3.178 cmpb $4, %bh 3.179 - jne chksector 3.180 - movb $2, %bh 3.181 + jne chksectorz 3.182 decw %si 3.183 je chkend 3.184 movw %bp, %ax 3.185 @@ -208,10 +232,16 @@ 3.186 xorb %cl, %dh 3.187 jne rdit 3.188 incb %ch 3.189 + cmp $80, %ch 3.190 + jb rdit 3.191 + push %si 3.192 + mov $msgnext, %si 3.193 + call puts 3.194 + call wait4kbd 3.195 + pop %si 3.196 + mov $0, %ch 3.197 rdit: 3.198 - movw $0x201, %ax 3.199 - int $0x13 3.200 - jnc chksector 3.201 + jmp chksector 3.202 chkend: 3.203 movw $msgok, %si 3.204 orw %di, %di 3.205 @@ -220,18 +250,34 @@ 3.206 movw $msgko, %si 3.207 chkok: 3.208 call puts 3.209 - popw %si 3.210 - jmp nextchk 3.211 + popw %di // next sector offset 3.212 + popw %si // start of menu 3.213 + jmp nextchklp 3.214 + 3.215 +readsector: 3.216 + movw $BUFFER, %bx 3.217 +readsector2: 3.218 + movw $0x201, %ax 3.219 + int $0x13 3.220 + ret 3.221 3.222 getsectors: 3.223 tochs // %di -> %cx, %dx & %bp=sector max 3.224 ret 3.225 + 3.226 +wait4kbd: 3.227 + waitkbdcode 3.228 + ret 3.229 + 3.230 +putentry: 3.231 + entry 3.232 + jmp putcs 3.233 #endif 3.234 3.235 puts: 3.236 lodsb 3.237 - orb %al, %al 3.238 - jnz putcs 3.239 + cmpb $2, %al 3.240 + jnc putcs 3.241 putcr: 3.242 movb $10, %al 3.243 putlf: 3.244 @@ -249,7 +295,8 @@ 3.245 msgok: 3.246 .asciz " OK" 3.247 msgko: 3.248 - .asciz " Broken" 3.249 + .ascii " Broken" 3.250 + .word 1 // next sector offset 3.251 msgcrc: 3.252 .asciz "Check media" // used to detect CHECK_FILES 3.253 #endif 3.254 @@ -263,7 +310,12 @@ 3.255 syssz: 3.256 .long 0 // updated by bundle 3.257 ramsize: 3.258 +#ifdef CHECK_FILES 3.259 +msgnext: 3.260 + .asciz "Next!" 3.261 +#else 3.262 .ascii "SliTaz" 3.263 +#endif 3.264 // .word 0 3.265 //vidmode: 3.266 // .word 0