wok-current rev 5060

linux/boot: keyboardless support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Mar 09 13:32:08 2010 +0100 (2010-03-09)
parents f642eb9dd1b4
children b4fa2f5e2632
files linux/stuff/linux-header-2.6.30.6.u
line diff
     1.1 --- a/linux/stuff/linux-header-2.6.30.6.u	Tue Mar 09 00:20:04 2010 +0100
     1.2 +++ b/linux/stuff/linux-header-2.6.30.6.u	Tue Mar 09 13:32:08 2010 +0100
     1.3 @@ -18,37 +18,34 @@
     1.4   
     1.5   #ifndef SVGA_MODE
     1.6   #define SVGA_MODE ASK_VGA
     1.7 -@@ -39,53 +41,394 @@
     1.8 +@@ -39,53 +41,412 @@
     1.9   #define ROOT_RDONLY 1
    1.10   #endif
    1.11   
    1.12 -+#define SHOW_REGS	show int13 status & parameters
    1.13 -+#define EDIT_CMDLINE	add kernel command line support
    1.14 ++/* some extra features */
    1.15 ++#define	EDIT_CMDLINE		on hotkey
    1.16 ++#define SHOW_REGS		show int13 status & parameters
    1.17  +
    1.18   	.code16
    1.19   	.section ".bstext", "ax"
    1.20   
    1.21   	.global bootsect_start
    1.22   bootsect_start:
    1.23 ++	cld				# assume nothing
    1.24  +stacktop	= 0x9E00		# in 0x8000 .. 0xA000
    1.25 -+					# with 512 bytes for cmdline
    1.26 -+	movw	$stacktop-12, %di	# stacktop is an arbitrary value >=
    1.27 ++zeroed		= 48+10			# gdt + zeroed registers
    1.28 ++	movw	$stacktop-12-zeroed, %di	# stacktop is an arbitrary value >=
    1.29  +					# length of bootsect + length of
    1.30  +					# setup + room for stack;
    1.31  +					# 12 is disk parm size.
    1.32 -+					# gdt will heat 48 more bytes.
    1.33 -+curcx	=	0
    1.34 -+curdx	=	curcx+2
    1.35 -+	cld				# assume nothing
    1.36 -+#ifndef FLOPPY_1440K_ONLY
    1.37 -+limits	=	4
    1.38 -+#endif
    1.39 ++	pushw	$INITSEG
    1.40 ++	popw	%es			# %es = INITSEG
    1.41   
    1.42  -	# Normalize the start address
    1.43  -	ljmp	$BOOTSEG, $start2
    1.44 -+	pushw	$INITSEG
    1.45 -+	popw	%es			# %es = INITSEG
    1.46 -+	xorw	%cx, %cx		# %cx = 0
    1.47 ++	pushw	%es
    1.48 ++	popw	%ss			# %ss and %es already contain INITSEG
    1.49 ++	movw	%di, %sp		# put stack at INITSEG:stacktop-...
    1.50   
    1.51  -start2:
    1.52  -	movw	%cs, %ax
    1.53 @@ -58,11 +55,6 @@
    1.54  -	xorw	%sp, %sp
    1.55  -	sti
    1.56  -	cld
    1.57 -+	pushw	%es
    1.58 -+	popw	%ss			# %ss and %es already contain INITSEG
    1.59 -+	movw	%di, %sp		# put stack at INITSEG:stacktop-12.
    1.60 - 
    1.61 --	movw	$bugger_off_msg, %si
    1.62  +# Many BIOS's default disk parameter tables will not recognize
    1.63  +# multi-sector reads beyond the maximum sector number specified
    1.64  +# in the default diskette parameter tables - this may mean 7
    1.65 @@ -76,7 +68,15 @@
    1.66  +# High doesn't hurt.  Low does.  Let's use the max: 63
    1.67  +#
    1.68  +# Segments are as follows: %es = %ss = INITSEG,
    1.69 -+# %fs and %gs are unused.
    1.70 + 
    1.71 +-	movw	$bugger_off_msg, %si
    1.72 ++	xorw	%ax, %ax		# %ax = 0
    1.73 ++	movw	$zeroed/2, %cx		# clear gdt + offset, %ds, limits
    1.74 ++	rep				# don't worry about cld
    1.75 ++	stosw				# already done above
    1.76 ++	popw	%bx			# offset = 0
    1.77 ++	popw	%ds			# %ds = 0
    1.78 ++	popw	%gs			# %gs = 0
    1.79   
    1.80  -msg_loop:
    1.81  -	lodsb
    1.82 @@ -84,133 +84,127 @@
    1.83  -	jz	bs_die
    1.84  -	movb	$0xe, %ah
    1.85  -	movw	$7, %bx
    1.86 -+	movw	$0x78, %bx		# %ds:%bx is parameter table address
    1.87 -+	movw	%cx, %ds		# %ds = 0
    1.88 -+	ldsw	(%bx), %si		# %ds:%si is source
    1.89 ++	movb	setup_sects+0x7C00, %al	# read bootsector + setup (%ds = 0)
    1.90 ++	incw	%ax
    1.91 ++
    1.92 ++	pushw	%es
    1.93 ++	pushw	%di			# %ds:%bx+0x78 is parameter table address
    1.94 ++	ldsw	0x78(%bx), %si		# %ds:%si is source
    1.95  +	movb	$6, %cl			# copy 12 bytes
    1.96  +	rep				# don't worry about cld
    1.97  +	movsw				# already done above
    1.98 -+	movw	%cx, %ds		# %ds = 0
    1.99 -+	movw	%sp, (%bx)		# %sp = stacktop-12
   1.100 -+	movw	%es, 2(%bx)
   1.101 -+
   1.102 -+	movb	setup_sects+0x7C00, %al	# read bootsector + setup (%ds = 0)
   1.103 -+	cbw
   1.104 -+	incw	%ax
   1.105 -+
   1.106 ++	popl	%gs:0x78(%bx)		# update parameter table address
   1.107  +	pushw	%es
   1.108  +	popw	%ds			# now %ds = %es = %ss = INITSEG
   1.109  +	movb	$63, 0x4-12(%di)	# patch sector count, %di = stacktop
   1.110 -+
   1.111  +	cli
   1.112  +
   1.113 -+	movb	$24, %bl		# allocate 48 bytes in stack
   1.114 -+init_gdt:
   1.115 -+	pushw	%cx			#   initialized with 0
   1.116 -+	decw	%bx
   1.117 -+	jnz	init_gdt
   1.118 -+
   1.119  +	xchg	%ax, %di		# sector count
   1.120 -+	cbw				# limits = 0
   1.121 ++	popw	%ax			# limits = 0
   1.122  +	incw	%cx			# cylinder 0, sector 1
   1.123  +	call	read_first_sectors	# read setup
   1.124  +
   1.125 -+#define version_offset		0xE
   1.126 -+#define loadflags_offset	0x11
   1.127 -+#define heap_end_ptr_offset	0x24
   1.128 -+
   1.129 -+	movw	$_start,%si
   1.130 -+	orb	$0x80, loadflags_offset(%si)
   1.131 -+	movw	$stacktop-0x200, heap_end_ptr_offset(%si)
   1.132 -+
   1.133 -+	addw	version_offset(%si),%si	# starting protocol 2.00, Kernel 1.3.73
   1.134 ++#define kernel_version	0xE
   1.135 ++	movw	$0x200,%si
   1.136 ++	addw	kernel_version(%si),%si	# starting protocol 2.00, Kernel 1.3.73
   1.137  +	call	puts			# show which kernel we are loading
   1.138  +
   1.139 ++# The cmdline can be entered and modifed at boot time.
   1.140 ++# Only characters before the cursor are passed to the kernel.
   1.141 ++	popw	%bx			# clear %bx
   1.142 ++	orw	cmd_line_ptr, %bx
   1.143 ++	jz	nocmdline
   1.144 ++	pushw	%bx
   1.145 ++	call	read_one_sector
   1.146 ++	popw	%si
   1.147 ++	call	puts
   1.148  +#ifdef	EDIT_CMDLINE
   1.149 -+# The cmdline can be entered and modifed on hot key.
   1.150 -+# Only characters before the cursor are passed to the kernel.
   1.151 -+	movw	$cmd_line_ptr, %si
   1.152 -+	cmpw	%bx,(%si)		# %bx = 7
   1.153 -+	jb	nocmdline
   1.154 -+	incw	%di			# read 1 sector
   1.155 -+	movw	(%si), %bx
   1.156 -+	pushw	%si
   1.157 -+	call	read_sectors
   1.158 -+	popw	%di
   1.159 -+	movw	(%di), %si
   1.160 -+	call	puts
   1.161  +cmdlp:
   1.162 -+	movb	$32, %al		# clear end of line
   1.163 ++	movb	$0x20, %al		# clear end of line
   1.164  +	int	$0x10			#  with Space
   1.165  +	movb	$8, %al			#   and BackSpace
   1.166   	int	$0x10
   1.167  -	jmp	msg_loop
   1.168  +	decw	%si
   1.169  +cmdget:
   1.170 -+	cbw				# %ah = 0, get keyboard character
   1.171 -+	int	$0x16
   1.172 ++	call	wait4key
   1.173  +	cmpb	$8, %al			# BackSpace ?
   1.174  +	je	cmdbs
   1.175  +	movb	%al, (%si)		# store char
   1.176  +	lodsw				# %si += 2
   1.177  +cmdbs:
   1.178 -+	cmpw	(%di), %si		# lower limit is checked
   1.179 -+	je	cmdget			#   but upper limit not
   1.180 ++#if 1
   1.181 ++	cmpw	%si,cmd_line_ptr
   1.182 ++	je	cmdget
   1.183 ++#endif
   1.184  +	call	putc			# set %ah and %bx
   1.185  +	cmpb	$10, %al		# Enter ?
   1.186  +	jne	cmdlp
   1.187 -+	movb	%bh,-2(%si)		# set end of line, remove CR
   1.188 ++	movb	%bh,-2(%si)		# set end of string and remove CR
   1.189  +endcmdline:
   1.190 -+	
   1.191 ++#endif
   1.192  +nocmdline:
   1.193 -+#endif
   1.194   
   1.195  -bs_die:
   1.196  -	# Allow the user to press a key, then reboot
   1.197  -	xorw	%ax, %ax
   1.198 +-	int	$0x16
   1.199 +-	int	$0x19
   1.200  +# This routine loads the system at address SYSSEG, making sure
   1.201  +# no 64kB boundaries are crossed. We try to load it as fast as
   1.202  +# possible, loading whole tracks whenever we can.
   1.203 -+
   1.204 + 
   1.205 +-	# int 0x19 should never return.  In case it does anyway,
   1.206 +-	# invoke the BIOS reset code...
   1.207 +-	ljmp	$0xf000,$0xfff0
   1.208 ++ramdisk_image	=	0x0218
   1.209 ++ramdisk_size	=	0x021C
   1.210  +	movw	%sp, %si		# for bootsect_gdt
   1.211 ++	decw	16(%si)			# bootsect_src = 64Kb
   1.212 ++	decw	24(%si)			# bootsect_dst = 64Kb
   1.213 ++	movw	$syssize, %di
   1.214 ++type_of_loader	=	0x210
   1.215 ++loadflags	=	0x211
   1.216 ++heap_end_ptr	=	0x224
   1.217 ++ksyssize	= 	500
   1.218 ++	orw	$0x80FF, type_of_loader-ksyssize(%di) # loader type = 0xFF
   1.219 ++	movw	$stacktop-0x200, heap_end_ptr-ksyssize(%di)
   1.220  +	movb	$0x0F, %al		# destination = 0x100000
   1.221 -+	movw	$syssize, %di
   1.222 -+#define type_of_loader_offset	0x1C	/* type_of_loader - syssize */
   1.223 -+	decb	type_of_loader_offset(%di)	# loader type = 0xFF
   1.224  +	movb	$5, %cl
   1.225  +initrdlp:
   1.226  +	movb	$0x93,%ah
   1.227  +	movw	%ax, 28(%si)		# bootsect_dst_base+2
   1.228  +	movb	$(SYSSEG/4096), %al	# source = SYSSEG
   1.229  +	movw	%ax, 20(%si)		# bootsect_src_base+2
   1.230 -+	cwd
   1.231 -+	movw	%dx, 16(%si)		# bootsect_src = 64Kb
   1.232 -+	movw	%dx, 24(%si)		# bootsect_dst = 64Kb
   1.233 -+	xorl	%ebx, %ebx
   1.234 -+	incw	%bx
   1.235 -+	shlw	%cl,%bx
   1.236 -+	decw	%bx
   1.237 -+	addl	(%di),%ebx
   1.238 -+	shrl	%cl, %ebx
   1.239 ++	cbw
   1.240 ++	cwde
   1.241 ++	shlw	%cl, %ax
   1.242 ++	decw	%ax
   1.243 ++	addl	(%di),%eax
   1.244 ++	shrl	%cl, %eax
   1.245  +syslp:
   1.246  +	pushw	$SYSSEG
   1.247  +	popw	%es
   1.248  +	movw	$128,%di		# 64Kb
   1.249 -+	subw	%di, %bx		# max 32M > int 15 limit
   1.250 ++	subw	%di, %ax		# max 32M > int 15 limit
   1.251  +	pushf
   1.252  +	jnc	not_last
   1.253 -+	addw	%bx, %di
   1.254 ++	addw	%ax, %di
   1.255  +not_last:
   1.256 -+	pushw	%bx
   1.257 ++	xorw	%bx, %bx		# clear %bx
   1.258 ++	pushw	%ax
   1.259 ++#if defined(SHOW_REGS)
   1.260  +	pushw	%si
   1.261 -+	xorw	%bx, %bx
   1.262  +	call	read_sectors
   1.263  +	popw	%si
   1.264 ++#else
   1.265 ++	call	read_sectors
   1.266 ++#endif
   1.267  +	movw	$0x8000, %cx		# full 64K
   1.268  +	movb	$0x87, %ah
   1.269  +	incb	28(%si)			# bootsect_dst_base+2
   1.270  +	int	$0x15			# max 16M
   1.271 -+	popw	%bx
   1.272 ++	popw	%ax
   1.273  +	popf
   1.274  +	ja	syslp
   1.275  +	movw	ramdisk_image+2,%ax
   1.276 @@ -219,14 +213,28 @@
   1.277  +	movb	$9, %cl
   1.278  +	cmpb	%al,28(%si)
   1.279  +	jb	initrdlp
   1.280 -+
   1.281 + 
   1.282 +-	.section ".bsdata", "a"
   1.283 +-bugger_off_msg:
   1.284 +-	.ascii	"Direct booting from floppy is no longer supported.\r\n"
   1.285 +-	.ascii	"Please use a boot loader program instead.\r\n"
   1.286 +-	.ascii	"\n"
   1.287 +-	.ascii	"Remove disk and press any key to reboot . . .\r\n"
   1.288 +-	.byte	0
   1.289  +# This procedure turns off the floppy drive motor, so
   1.290  +# that we enter the kernel in a known state, and
   1.291  +# don't have to worry about it later.
   1.292 -+
   1.293 + 
   1.294 ++#if 1
   1.295  +kill_motor:
   1.296 -+	xorw	%ax, %ax		# reset FDC
   1.297 ++	xchgw	%ax, %bx		# reset FDC
   1.298  +	int	$0x13
   1.299 ++#else
   1.300 ++kill_motor:
   1.301 ++	movw	$0x3f2, %dx
   1.302 ++	xchgw	%ax, %bx
   1.303 ++	outb	%al, %dx
   1.304 ++#endif
   1.305  +
   1.306  +# After that (everything loaded), we jump to the setup-routine
   1.307  +# loaded directly after the bootblock:
   1.308 @@ -252,11 +260,13 @@
   1.309  +	movw	$regs, %si		# caller %si is saved
   1.310  +	call	putcs			# putc(%al) + puts(%si)
   1.311  +# it will print out all of the registers.
   1.312 -+	popw	%bp			# load word into %bp
   1.313 ++	popw	%bp			# load word into %si
   1.314  +	jmp	print_all		# print %bp (status)
   1.315  +#endif
   1.316  +check_limits:
   1.317 -+#ifndef FLOPPY_1440K_ONLY
   1.318 ++#ifndef SHOW_REGS
   1.319 ++	popw	%dx
   1.320 ++#endif
   1.321  +	cmpb	$FLOPPY_SECTORS+1, %cl	# 18 sectors minimum
   1.322  +	jb	check_head
   1.323  +        cmpb    %al, %cl		# max sector known ?
   1.324 @@ -267,9 +277,6 @@
   1.325  +        cmpb    %ah, %dh		# max head known ?
   1.326  +        ja	next_cylinder		#   no -> store it
   1.327  +check_cylinder:
   1.328 -+	cmpb	$FLOPPY_CYLINDERS, %ch	# 80 cylinders minimum
   1.329 -+	jae	next_floppy
   1.330 -+#endif
   1.331  +	pushaw
   1.332  +#ifdef SHOW_REGS
   1.333  +	cmpw	$0x600,%bp		# disk changed ?
   1.334 @@ -278,15 +285,12 @@
   1.335  +	pushw	%dx			# print %dx
   1.336  +	pushw	%cx			# print %cx
   1.337  +	pushw	%bx			# print %bx
   1.338 -+#ifndef FLOPPY_1440K_ONLY
   1.339  +	xchgw	%ax, %si
   1.340 -+#endif
   1.341  +	movb	$2,%ah
   1.342  +	pushw	%ax			# print %ax
   1.343 -+	movw	$6,%cx
   1.344 ++	movb	$6,%cl
   1.345  +print_all:
   1.346 -+	pushw	%cx			# save count remaining
   1.347 -+	movb	$4, %cl			# 4 hex digits
   1.348 ++	movb	$4, %ch			# 4 hex digits
   1.349  +print_digit:
   1.350  +	rolw	$4, %bp			# rotate to use low 4 bits
   1.351  +	movb	$0x0f, %al
   1.352 @@ -296,118 +300,121 @@
   1.353  +	adcb	$0x40, %al
   1.354  +	daa
   1.355  +	call	putc			# set %ah and %bx
   1.356 -+	loop	print_digit
   1.357 ++	decb	%ch
   1.358 ++	jnz	print_digit
   1.359  +	movb	$0x20, %al		# SPACE
   1.360  +	int	$0x10
   1.361 -+	popw	%cx
   1.362  +	loop	print_loop
   1.363 ++	call	wait
   1.364 ++	cbw				# %ah = 0
   1.365  +reset_floppy:
   1.366 ++#else
   1.367 ++	cbw				# %ah = 0
   1.368  +#endif
   1.369 -+	cbw				# %ah = 0
   1.370  +        int     $0x13			# reset controler
   1.371  +	popaw
   1.372  +read_sectorslp:
   1.373 -+	xorw	%si, %si
   1.374 -+	lodsw
   1.375 -+	xchgw	%ax,%cx			# restore disk state
   1.376 -+	lodsw
   1.377 -+	xchgw	%ax,%dx
   1.378 -+#ifndef FLOPPY_1440K_ONLY
   1.379 -+#   al is last sector+1
   1.380 -+#   ah is last cylinder+1
   1.381 -+	lodsw
   1.382 -+#endif
   1.383 -+#ifndef FLOPPY_1440K_ONLY
   1.384 ++	pushw	%dx			# some bios break dx...
   1.385  +        pushw   %ax			# limits
   1.386  +	subb	%cl, %al		# sectors remaining in track
   1.387  +	ja	tolastsect
   1.388  +	movb	$1, %al			# 1 sector mini
   1.389  +tolastsect:
   1.390 -+#else
   1.391 -+	mov	$FLOPPY_SECTORS+1, %al
   1.392 -+	subb	%cl, %al		# sectors remaining in track
   1.393 -+#endif
   1.394  +	cbw
   1.395  +	cmpw	%di, %ax
   1.396  +	jb	more1trk
   1.397  +	movw	%di, %ax		# sectors to read
   1.398  +more1trk:
   1.399  +	pushw	%ax			# save context
   1.400 -+	pushw	%dx			# some bios break dx...
   1.401  +	movb	$2, %ah			# cmd: read chs
   1.402  +        int     $0x13
   1.403 -+	popw	%dx
   1.404 ++#ifdef SHOW_REGS
   1.405  +	xchgw	%ax, %bp		# status
   1.406 -+#ifndef FLOPPY_1440K_ONLY
   1.407 ++#endif
   1.408 ++# ifdef SHOW_REGS
   1.409  +	popw	%si			# save %ax
   1.410  +        popw    %ax			# limits
   1.411 -+#else
   1.412 -+	popw	%ax			# restore context
   1.413 -+#endif
   1.414 ++	popw	%dx
   1.415 ++# else
   1.416 ++	popw	%dx			# save %ax
   1.417 ++        popw    %ax			# limits
   1.418 ++# endif
   1.419  +	jc	check_limits
   1.420 -+#ifndef FLOPPY_1440K_ONLY
   1.421 -+	subw	%si,%di			# update sector counter
   1.422 -+	addw	%si,%cx			# next sector
   1.423 -+	shlw	$9,%si
   1.424 -+	addw	%si,%bx			# next location
   1.425 -+#else
   1.426 -+	subw	%ax,%di			# update sector counter
   1.427 -+	addw	%ax,%cx			# next sector
   1.428 -+	addw	%ax,%ax
   1.429 -+	addb	%al,%bh			# next location
   1.430 -+#endif
   1.431 -+#ifndef FLOPPY_1440K_ONLY
   1.432 ++# ifdef SHOW_REGS
   1.433 ++update_regs:
   1.434 ++	decw	%di			# update sector counter
   1.435 ++	incw	%cx			# next sector
   1.436 ++	addb	$2,%bh			# next location
   1.437 ++	decw	%si
   1.438 ++	jnz	update_regs
   1.439 ++# else
   1.440 ++	subw	%dx,%di			# update sector counter
   1.441 ++	addw	%dx,%cx			# next sector
   1.442 ++	addw	%dx,%dx
   1.443 ++	addb	%dl,%bh			# next location
   1.444 ++	popw	%dx
   1.445 ++# endif
   1.446  +        cmpb    %al,%cl			# reach sector limit ?
   1.447  +        jne     bdendlp
   1.448  +next_head:
   1.449  +        movb    %cl,%al
   1.450 -+#else
   1.451 -+        cmpb    $FLOPPY_SECTORS+1,%cl	# reach sector limit ?
   1.452 -+        jne     bdendlp
   1.453 -+#endif
   1.454  +        incb    %dh			# next head
   1.455  +        movb    $1,%cl			# first sector
   1.456 -+#ifndef FLOPPY_1440K_ONLY
   1.457  +        cmpb    %ah, %dh		# reach head limit ?
   1.458  +        jne     bdendlp
   1.459  +next_cylinder:
   1.460  +        movb    %dh,%ah
   1.461 -+#else
   1.462 -+        cmpb    %cl,%dh			# reach head limit ?
   1.463 -+        je	bdendlp
   1.464 -+#endif
   1.465  +# NOTE : support 256 cylinders max
   1.466  +        incb    %ch			# next cylinder
   1.467  +read_first_sectors:
   1.468  +        movb    $0,%dh			# first head
   1.469 -+#ifndef FLOPPY_1440K_ONLY
   1.470 -+	cmpb	$FLOPPY_SECTORS+1,%al	# 1.44M floppy ?
   1.471 -+        jne	bdendlp
   1.472 -+#endif
   1.473 ++cylinder_count	= 496
   1.474 ++	cmpb	cylinder_count, %ch
   1.475 ++        jb	bdendlp
   1.476  +        cmpb    $FLOPPY_CYLINDERS,%ch	# reach cylinder limit ?
   1.477  +        jb	bdendlp
   1.478  +next_floppy:
   1.479  +	movb	$0,%ch			# first cylinder
   1.480  +	pushaw
   1.481  +	movw	$swap_floppy,%si
   1.482 ++	incb	12(%si)
   1.483 ++	pushw	%bx
   1.484  +	call	puts
   1.485 -+	cbw				# %ah = 0, get keyboard character
   1.486 - 	int	$0x16
   1.487 --	int	$0x19
   1.488 ++	popw	%bx
   1.489 ++waitfloppy:
   1.490 ++	call	wait
   1.491 ++	jne	waitfloppydone
   1.492 ++	pushw	%dx			# some bios break dx...
   1.493 ++	cbw
   1.494 ++	int	$0x13			# reset FDC
   1.495 ++	movw	$0x201,%ax
   1.496 ++#	cwd
   1.497 ++#	movw	$1,%cx
   1.498 ++	int	$0x13			# read first sector
   1.499 ++	popw	%dx
   1.500 ++	rclb	$1,%ah			# floppy changed 06=>0D no error 00
   1.501 ++	cmpb	-2(%si), %ah		# 0D then 00
   1.502 ++	jne	waitfloppy		# no => try again
   1.503 ++	incw	%si
   1.504 ++	orb	%ah,%ah			# was 00 ?
   1.505 ++	jne	waitfloppy
   1.506 ++waitfloppydone:
   1.507  +	popaw
   1.508  +bdendlp:
   1.509 -+#ifndef FLOPPY_1440K_ONLY
   1.510 -+	movw	%ax, limits
   1.511 -+#endif
   1.512 -+	pushw	%dx
   1.513 -+	pushw	%cx
   1.514 -+	popl	curcx			# save disk state
   1.515 ++	xchgw	%ax, %bp
   1.516 ++	movw	%cx, %fs
   1.517  +read_sectors:
   1.518 -+	orw	%di,%di
   1.519 -+        jne	read_sectorslp
   1.520 ++	decw	%di
   1.521 ++read_one_sector:
   1.522 ++	movw	%fs, %cx
   1.523 ++#   al is last sector+1
   1.524 ++#   ah is last cylinder+1
   1.525 ++	movw	%bp, %ax
   1.526 ++	incw	%di
   1.527 ++        jnz	read_sectorslp
   1.528  +	pushw	%ss
   1.529  +	popw	%es			# restore es
   1.530 -+	movb	$0x2e+3, %al 		# 2e = .
   1.531 ++	movb	$0x2e+3, %al 		# loading... message 2e = .
   1.532  +putclf:
   1.533  +	subb	$3, %al
   1.534  +putc:
   1.535 @@ -417,10 +424,7 @@
   1.536  +	cmp	$0xd, %al		# CR ?
   1.537  +	je	putclf
   1.538  +	ret
   1.539 - 
   1.540 --	# int 0x19 should never return.  In case it does anyway,
   1.541 --	# invoke the BIOS reset code...
   1.542 --	ljmp	$0xf000,$0xfff0
   1.543 ++
   1.544  +puts:
   1.545  +	movb	$0xd, %al		# CR
   1.546  +putcs:
   1.547 @@ -429,19 +433,34 @@
   1.548  +	orb	%al,%al			# end of string is \0
   1.549  +	jnz	putcs
   1.550  +	ret
   1.551 - 
   1.552 --	.section ".bsdata", "a"
   1.553 --bugger_off_msg:
   1.554 --	.ascii	"Direct booting from floppy is no longer supported.\r\n"
   1.555 --	.ascii	"Please use a boot loader program instead.\r\n"
   1.556 --	.ascii	"\n"
   1.557 --	.ascii	"Remove disk and press any key to reboot . . .\r\n"
   1.558 --	.byte	0
   1.559 ++
   1.560 ++clock	= 0x46C
   1.561 ++wait:
   1.562 ++wait4key:
   1.563 ++	movw	$clock, %di
   1.564 ++#define DELAY 5
   1.565 ++	movb	$(DELAY*182)/10,%cl
   1.566 ++	addb	%gs:(%di),%cl
   1.567 ++waitkbd:
   1.568 ++	movw	$0x10D, %ax		# test keyboard, timeout => CR
   1.569 ++	cmpb	%gs:(%di),%cl
   1.570 ++	je	waitdone
   1.571 ++	int	$0x16
   1.572 ++	jz	waitkbd
   1.573 ++	cbw
   1.574 ++	int	$0x16			# eat char
   1.575 ++	movw	%di, %gs		# disable timeout
   1.576 ++	incw	%di			# clear Z
   1.577 ++waitdone:
   1.578 ++	ret
   1.579 ++
   1.580 ++#ifdef SHOW_REGS
   1.581  +regs:	.asciz	"X:"
   1.582 - 
   1.583 -+swap_floppy:
   1.584 -+	.ascii	"Insert next floppy and press any key to continue."
   1.585 -+	.byte	7,13,0
   1.586 ++#endif
   1.587 ++
   1.588 ++swap_floppy:	.ascii	"Insert disk 1"
   1.589 ++		.ascii	"."
   1.590 ++		.byte	7,13,0
   1.591   
   1.592   	# Kernel attributes; used by setup.  This is part 1 of the
   1.593   	# header, from the old boot sector.