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