wok-current rev 15203

linux: update boot sector
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Sep 08 22:26:29 2013 +0000 (2013-09-08)
parents 223b265f40fd
children bb8582ed7012
files linux/stuff/linux-header.u
line diff
     1.1 --- a/linux/stuff/linux-header.u	Sat Sep 07 22:59:13 2013 +0000
     1.2 +++ b/linux/stuff/linux-header.u	Sun Sep 08 22:26:29 2013 +0000
     1.3 @@ -1,6 +1,6 @@
     1.4  --- linux-3.2.14/arch/x86/boot/header.S
     1.5  +++ linux-3.2.14/arch/x86/boot/header.S
     1.6 -@@ -7,6 +7,7 @@
     1.7 +@@ -7,12 +7,14 @@
     1.8    *	modified by more people than can be counted
     1.9    *
    1.10    *	Rewritten as a common file by H. Peter Anvin (Apr 2007)
    1.11 @@ -8,23 +8,97 @@
    1.12    *
    1.13    * BIG FAT NOTE: We're in real mode using 64k segments.  Therefore segment
    1.14    * addresses must be multiplied by 16 to obtain their respective linear
    1.15 -@@ -27,7 +28,12 @@
    1.16 +  * addresses. To avoid confusion, linear addresses are written using leading
    1.17 +  * hex while segment addresses are written as segment:offset.
    1.18 +  *
    1.19 ++ * Assume protocol 2.00+ (kernel >= 1.3.73)
    1.20 +  */
    1.21 + 
    1.22 + #include <asm/segment.h>
    1.23 +@@ -27,6 +29,8 @@
    1.24   
    1.25   BOOTSEG		= 0x07C0		/* original address of boot-sector */
    1.26   SYSSEG		= 0x1000		/* historical load address >> 4 */
    1.27  +INITSEG		= 0x9000		/* boot address >> 4 */
    1.28  +SETUPSEG	= 0x9020		/* setup address >> 4 */
    1.29   
    1.30 -+#define LOADSEG	 0x0800
    1.31 -+#define LOADSZ	 (LOADSEG*0x10)
    1.32 -+
    1.33   #ifndef SVGA_MODE
    1.34   #define SVGA_MODE ASK_VGA
    1.35 +@@ -40,53 +44,476 @@
    1.36 + #define ROOT_RDONLY 1
    1.37   #endif
    1.38 -@@ -45,48 +51,362 @@
    1.39 + 
    1.40 ++setup_sects	= 497
    1.41 ++syssize		= 500
    1.42 ++cmd_line_ptr	= 0x228
    1.43 ++
    1.44 ++/* some extra features */
    1.45 ++#define EXE_SUPPORT		real mode dos .exe file support (no himem.sys)
    1.46 ++#define CMDLINE			kernel >= 2.4
    1.47 ++#define OLDCMDLINE		kernel  < 2.4
    1.48 ++#define HELP			display version for ? argument
    1.49 ++#define MORETHAN16M		up to 4Gb RAM, not 16Mb
    1.50 ++#define KEYBOARDLESS_SUPPORT	scan floppy swap each 5 seconds
    1.51 ++#define FULL_ZIMAGE		Up to 512K system zImage
    1.52 ++
    1.53 ++/* some limitations to reduce code size */
    1.54 ++//#define FLOPPY_1440K_ONLY	1.44M floppies support only
    1.55 ++
    1.56 + 	.code16
    1.57 + 	.section ".bstext", "ax"
    1.58   
    1.59   	.global bootsect_start
    1.60   bootsect_start:
    1.61 + 
    1.62 +-	# Normalize the start address
    1.63 +-	ljmp	$BOOTSEG, $start2
    1.64 ++#ifdef EXE_SUPPORT
    1.65 ++#define CODESZ		0x8000
    1.66 ++#define EXEADRS(x)	x+0xE0
    1.67 ++stacktop	= 0x9E00		# in 0x8000 .. 0xA000
    1.68 ++	decw	%bp			// Magic number: MZ
    1.69 ++	popw	%dx
    1.70 ++	jmp	start			// Bytes on last page of file
    1.71 ++	.word	(CODESZ+511)/512	// Pages in file
    1.72 ++	.word	0			// Relocations
    1.73 ++	.word	2			// Size of header in paragraphs
    1.74 ++	.word	4096			// Minimum extra paragraphs needed
    1.75 ++	.word	-1			// Maximum extra paragraphs needed
    1.76 ++	.word	(CODESZ+15)/16		// Initial (relative) SS value
    1.77 ++	.word	stacktop		// Initial SP value
    1.78 ++	.word	0			// Checksum
    1.79 ++	.word	EXEADRS(comstart)	// Initial IP value
    1.80 ++	.word	0xFFF0			// Initial (relative) CS value
    1.81 ++//	.word	0x001C			// File address of relocation table
    1.82 ++//	.word	0,0,0			// Overlay number
    1.83 ++swap_floppy:
    1.84 ++	.ascii	"Next!"
    1.85 ++	.byte	7,13,0			# swap detection needs 13, 0
    1.86 ++#ifdef OLDCMDLINE
    1.87 ++	.word	0xA33F
    1.88 ++	.word	stacktop
    1.89 ++#endif
    1.90 ++start:
    1.91 ++	pushw	%dx
    1.92 ++#endif
    1.93 + 
    1.94 +-start2:
    1.95 +-	movw	%cs, %ax
    1.96 +-	movw	%ax, %ds
    1.97 +-	movw	%ax, %es
    1.98 +-	movw	%ax, %ss
    1.99 +-	xorw	%sp, %sp
   1.100 +-	sti
   1.101 +-	cld
   1.102 ++#ifdef FULL_ZIMAGE
   1.103 ++#define LOADSEG	0x8800		// Up to 512K zImage
   1.104 ++#else
   1.105 ++#define LOADSEG	 0x8000		// 0x1000 multiple, up to 480K zImage
   1.106 ++#endif
   1.107 ++#define LOADSZ	 0x8000
   1.108 + 
   1.109 +-	movw	$bugger_off_msg, %si
   1.110 ++bootsect_start:
   1.111  +	cld				# assume nothing
   1.112  +stacktop	= 0x9E00		# in 0x8000 .. 0xA000
   1.113  +zeroed		= 48+12			# gdt + zeroed registers
   1.114 @@ -35,9 +109,7 @@
   1.115  +	pushw	$INITSEG
   1.116  +	popw	%ss			# %ss contain INITSEG
   1.117  +	movw	%di, %sp		# put stack at INITSEG:stacktop-...
   1.118 - 
   1.119 --	# Normalize the start address
   1.120 --	ljmp	$BOOTSEG, $start2
   1.121 ++
   1.122  +# Many BIOS's default disk parameter tables will not recognize
   1.123  +# multi-sector reads beyond the maximum sector number specified
   1.124  +# in the default diskette parameter tables - this may mean 7
   1.125 @@ -49,35 +121,23 @@
   1.126  +# count to 36 - the most we will encounter on an ED 2.88.  
   1.127  +#
   1.128  +# High doesn't hurt.  Low does.  Let's use the max: 63
   1.129 - 
   1.130 --start2:
   1.131 --	movw	%cs, %ax
   1.132 --	movw	%ax, %ds
   1.133 --	movw	%ax, %es
   1.134 --	movw	%ax, %ss
   1.135 --	xorw	%sp, %sp
   1.136 --	sti
   1.137 --	cld
   1.138 ++
   1.139  +	pushw	%ss
   1.140  +	popw	%es			# %es = %ss = INITSEG
   1.141  +	xorw	%ax, %ax		# %ax = 0
   1.142 ++#ifdef EXE_SUPPORT
   1.143 ++	cwd				# floppy = head = 0
   1.144 ++#endif
   1.145  +	movw	$zeroed/2, %cx		# clear gdt + offset, %ds, limits
   1.146  +	rep				# don't worry about cld
   1.147  +	stosw				# already done above
   1.148  +	popw	%bx			# offset = 0
   1.149  +	popw	%ds			# %ds = 0
   1.150  +	popw	%fs			# %fs = 0
   1.151 - 
   1.152 --	movw	$bugger_off_msg, %si
   1.153 ++
   1.154  +	movb	setup_sects+0x7C00, %al	# read bootsector + setup (%ds = 0)
   1.155  +	incw	%ax
   1.156 - 
   1.157 --msg_loop:
   1.158 --	lodsb
   1.159 --	andb	%al, %al
   1.160 --	jz	bs_die
   1.161 --	movb	$0xe, %ah
   1.162 --	movw	$7, %bx
   1.163 ++
   1.164  +	ldsw	0x78(%bx), %si		# %ds:%bx+0x78 is parameter table address
   1.165  +	pushw	%es
   1.166  +	pushw	%di
   1.167 @@ -94,131 +154,94 @@
   1.168  +	popw	%ax			# limits = 0
   1.169  +	incw	%cx			# cylinder 0, sector 1, clear Z
   1.170  +	call	read_first_sectors	# read setup
   1.171 -+
   1.172 ++loadsys:
   1.173  +	movw	$0x200,%si
   1.174 -+#define kernel_version	0xE
   1.175  +type_of_loader	=	0x10
   1.176  +loadflags	=	0x11
   1.177  +heap_end_ptr	=	0x24
   1.178  +	orw	$0x8020, type_of_loader(%si) # loader type = 0x20 = bootsect-loader
   1.179  +	movb	$(stacktop-0x300)/256, heap_end_ptr+1(%si)
   1.180 -+	addw	kernel_version(%si),%si	# starting protocol 2.00, Kernel 1.3.73
   1.181 -+	call	puts			# show which kernel we are loading
   1.182 ++	call	puts_version		# show which kernel we are loading
   1.183  +
   1.184 -+# The cmdline can be entered and modifed at boot time.
   1.185 -+# Only characters before the cursor are passed to the kernel.
   1.186 -+	popw	%bx			# clear %bx
   1.187 -+	orw	cmd_line_ptr, %bx
   1.188 -+	jz	nocmdline
   1.189 -+	pushw	%bx
   1.190 -+	incw	%di
   1.191 -+	call	read_sectors
   1.192 -+	popw	%si
   1.193 -+	call	puts
   1.194 -+cmdlp:
   1.195 -+	movb	$0x20, %al		# clear end of line
   1.196 -+	int	$0x10			#  with Space
   1.197 -+	movb	$8, %al			#   and BackSpace
   1.198 - 	int	$0x10
   1.199 --	jmp	msg_loop
   1.200 -+	decw	%si
   1.201 -+cmdget:
   1.202 -+	call	wait4key
   1.203 -+	cmpb	$8, %al			# BackSpace ?
   1.204 -+	je	cmdbs
   1.205 -+	movb	%al, (%si)		# store char
   1.206 -+	lodsw				# %si += 2
   1.207 -+cmdbs:
   1.208 -+	cmpw	%si,cmd_line_ptr
   1.209 -+	je	cmdget
   1.210 -+	call	putc			# set %ah and %bx
   1.211 -+	cmpb	$10, %al		# Enter ?
   1.212 -+	jne	cmdlp
   1.213 -+	movb	%bh,-2(%si)		# set end of string and remove CR
   1.214 -+endcmdline:
   1.215 -+nocmdline:
   1.216 - 
   1.217 --bs_die:
   1.218 --	# Allow the user to press a key, then reboot
   1.219 --	xorw	%ax, %ax
   1.220 --	int	$0x16
   1.221 --	int	$0x19
   1.222  +# This routine loads the system at address LOADSEG, making sure
   1.223  +# no 64kB boundaries are crossed. We try to load it as fast as
   1.224  +# possible, loading whole tracks whenever we can.
   1.225 - 
   1.226 --	# int 0x19 should never return.  In case it does anyway,
   1.227 --	# invoke the BIOS reset code...
   1.228 --	ljmp	$0xf000,$0xfff0
   1.229 ++
   1.230  +ramdisk_image	=	0x0218
   1.231  +ramdisk_size	=	0x021C
   1.232  +bootsect_src_limit	= 16
   1.233  +bootsect_dst_limit	= 24
   1.234  +bootsect_src_base	= 18
   1.235 -+bootsect_dst_base	= 26
   1.236 ++bootsect_dst_base	= 26		# bits  0..23
   1.237 ++bootsect_dst_base_hi	= 31		# bits 24..31
   1.238  +	popw	%bx			# clear %bx
   1.239  +	movw	%sp, %si		# for bootsect_gdt
   1.240  +init_gdt:
   1.241  +	decw	bootsect_src_limit(%bx,%si)	# max 64Kb
   1.242 -+	movb	$0x93, bootsect_src_base+3(%bx,%si)
   1.243 ++#if LOADSEG % 0x1000 == 0
   1.244 ++	movw	$0x9300+(LOADSEG/0x1000), bootsect_src_base+2(%bx,%si)
   1.245 ++#else
   1.246 ++	movl	$0x93000000+(LOADSEG*0x10), bootsect_src_base(%bx,%si)
   1.247 ++#endif
   1.248  +	xorb	$bootsect_dst_limit-bootsect_src_limit, %bl
   1.249  +	jne	init_gdt
   1.250 -+	movw	$syssize, %bx
   1.251  +code32_start	=	0x214
   1.252 ++#ifdef MORETHAN16M
   1.253 ++	movb	code32_start+3, %al		# destination = 0x00100000 or 0x00010000
   1.254 ++	movb	%al, bootsect_dst_base_hi(%si)	# load high (> 16M) ?
   1.255 ++#endif
   1.256  +	movw	code32_start+1, %ax		# destination = 0x00100000 or 0x00010000
   1.257 -+	movb	$5, %cl
   1.258 -+initrdlp:
   1.259 -+	movl	(%bx),%ebx
   1.260 ++	movl	syssize, %ebx
   1.261  +	decl	%ebx
   1.262 -+	shrl	%cl, %ebx
   1.263 -+	incw	%bx
   1.264 ++	shrl	$5, %ebx
   1.265 ++	incl	%ebx
   1.266  +syslp:
   1.267 -+	pushw	$LOADSEG
   1.268 -+	popw	%es
   1.269 -+	movw	$LOADSZ/256,%di		# size in pages
   1.270 -+	movw	%di, bootsect_src_base+1(%si) # assume LOADSZ == LOADSEG*16
   1.271  +	movw	%ax, bootsect_dst_base+1(%si)
   1.272 -+	addw	%di, %ax		# next dest
   1.273 -+	shrw	$1, %di			# pages to sectors
   1.274 -+	subw	%di, %bx		# max 32M > int 15 limit
   1.275 ++	movw	$LOADSZ/512, %di	# size in sectors
   1.276 ++	subl	$LOADSZ/512, %ebx
   1.277  +	pushf
   1.278  +	jnc	not_last
   1.279  +	addw	%bx, %di
   1.280  +not_last:
   1.281  +	pushw	%ax
   1.282 -+	pushw	%di
   1.283  +	pushw	%si
   1.284  +	pushw	%bx
   1.285  +	xorw	%bx,%bx
   1.286 ++	pushw	$LOADSEG
   1.287 ++	popw	%es
   1.288 ++patchcall:
   1.289  +	call	read_sectors		# update %bp
   1.290  +	popw	%bx
   1.291  +	popw	%si
   1.292 -+	popw	%cx			# sectors to word count:
   1.293 -+	xchgb	%cl, %ch		# %cx <<= 8
   1.294 ++	movw	$LOADSZ/2, %cx		# word count
   1.295  +	movb	$0x87, %ah
   1.296  +	pushw	%ss
   1.297  +	popw	%es			# restore es
   1.298 -+	int	$0x15			# max 16M
   1.299 ++	int	$0x15			# max 16M, maybe more...
   1.300  +	popw	%ax
   1.301 ++	addw	$LOADSZ/256, %ax	# next dest
   1.302 ++#ifdef MORETHAN16M
   1.303 ++	adcb	%cl, bootsect_dst_base_hi(%si)	# breaks 16M limit ?
   1.304 ++#endif
   1.305  +	popf
   1.306  +	ja	syslp
   1.307 -+	movw	ramdisk_image+1,%ax
   1.308 -+	movw	$ramdisk_size,%bx
   1.309 -+	movb	$9, %cl
   1.310 -+	cmpw	%ax, bootsect_dst_base+1(%si)
   1.311 -+	jb	initrdlp
   1.312   
   1.313 --	.section ".bsdata", "a"
   1.314 --bugger_off_msg:
   1.315 --	.ascii	"Direct booting from floppy is no longer supported.\r\n"
   1.316 --	.ascii	"Please use a boot loader program instead.\r\n"
   1.317 --	.ascii	"\n"
   1.318 --	.ascii	"Remove disk and press any key to reboot . . .\r\n"
   1.319 --	.byte	0
   1.320 +-msg_loop:
   1.321 +-	lodsb
   1.322 +-	andb	%al, %al
   1.323 +-	jz	bs_die
   1.324 +-	movb	$0xe, %ah
   1.325 +-	movw	$7, %bx
   1.326 +-	int	$0x10
   1.327 +-	jmp	msg_loop
   1.328 +-
   1.329 +-bs_die:
   1.330 +-	# Allow the user to press a key, then reboot
   1.331 +-	xorw	%ax, %ax
   1.332  +# This procedure turns off the floppy drive motor, so
   1.333  +# that we enter the kernel in a known state, and
   1.334  +# don't have to worry about it later.
   1.335 - 
   1.336 ++
   1.337  +kill_motor:
   1.338  +	xchgw	%ax, %di		# reset FDC (%di < 128)
   1.339  +	int	$0x13
   1.340 @@ -240,15 +263,9 @@
   1.341  +#define FLOPPY_HEADS		2	/* 2 heads minimum */
   1.342  +#define FLOPPY_SECTORS		18	/* 18 sectors minimum */
   1.343  +
   1.344 -+print_loop:
   1.345 -+	movb	$0x6 + 'A' - 1, %al
   1.346 -+	subb	%cl, %al
   1.347 -+	movw	$regs, %si		# caller %si is saved
   1.348 -+	call	putcs			# putc(%al) + puts(%si)
   1.349 -+# it will print out all of the registers.
   1.350 -+	popw	%bp			# load word into %si
   1.351 -+	jmp	print_all		# print %bp (status)
   1.352  +check_limits:
   1.353 ++#ifndef FLOPPY_1440K_ONLY
   1.354 ++	popw	%dx
   1.355  +	cmpb	$FLOPPY_SECTORS+1, %cl	# 18 sectors minimum
   1.356  +	jb	check_head
   1.357  +        cmpb    %al, %cl		# max sector known ?
   1.358 @@ -259,45 +276,28 @@
   1.359  +        cmpb    %ah, %dh		# max head known ?
   1.360  +        ja	next_cylinder		#   no -> store it
   1.361  +check_cylinder:
   1.362 ++#endif
   1.363  +	pushaw
   1.364 -+	cmpw	$0x600,%bp		# disk changed ?
   1.365 -+	je	reset_floppy
   1.366 -+	pushw	%es			# print %es (named EX)
   1.367 -+	pushw	%dx			# print %dx
   1.368 -+	pushw	%cx			# print %cx
   1.369 -+	pushw	%bx			# print %bx
   1.370 -+	xchgw	%ax, %si
   1.371 -+	movb	$2,%ah
   1.372 -+	pushw	%ax			# print %ax
   1.373 -+	movb	$6,%cl
   1.374 -+print_all:
   1.375 -+	movb	$4, %ch			# 4 hex digits
   1.376 -+print_digit:
   1.377 -+	rolw	$4, %bp			# rotate to use low 4 bits
   1.378 -+	movb	$0x0f, %al
   1.379 -+	andw	%bp, %ax		# %al = mask for nybble
   1.380 -+	addb	$0x90, %al		# convert %al to ascii hex
   1.381 -+	daa				# in only four instructions!
   1.382 -+	adcb	$0x40, %al
   1.383 -+	daa
   1.384 -+	call	putc			# set %ah and %bx
   1.385 -+	decb	%ch
   1.386 -+	jnz	print_digit
   1.387 -+	movb	$0x20, %al		# SPACE
   1.388 -+	int	$0x10
   1.389 -+	loop	print_loop
   1.390 -+	call	wait
   1.391 ++#ifndef FLOPPY_1440K_ONLY
   1.392  +	cbw				# %ah = 0
   1.393 -+reset_floppy:
   1.394 ++#endif
   1.395  +        int     $0x13			# reset controler
   1.396 ++	stc
   1.397 ++	call	putcdot			# print '-'
   1.398 ++read_sectorslp:
   1.399  +	popaw
   1.400 -+read_sectorslp:
   1.401 ++bdendlp:
   1.402  +	pushw	%dx			# some bios break dx...
   1.403 ++#ifndef FLOPPY_1440K_ONLY
   1.404  +        pushw   %ax			# limits
   1.405  +	subb	%cl, %al		# sectors remaining in track
   1.406  +	ja	tolastsect
   1.407  +	movb	$1, %al			# 1 sector mini
   1.408  +tolastsect:
   1.409 ++#else
   1.410 ++	mov	$FLOPPY_SECTORS+1, %al
   1.411 ++	subb	%cl, %al		# sectors remaining in track
   1.412 ++#endif
   1.413  +	cbw
   1.414  +	cmpw	%di, %ax
   1.415  +	jb	more1trk
   1.416 @@ -306,46 +306,69 @@
   1.417  +	pushw	%ax			# save context
   1.418  +	movb	$2, %ah			# cmd: read chs
   1.419  +        int     $0x13
   1.420 -+	xchgw	%ax, %bp		# status
   1.421 -+	popw	%si			# save %ax
   1.422 ++#ifndef FLOPPY_1440K_ONLY
   1.423 ++	popw	%dx			# save %ax
   1.424  +        popw    %ax			# limits
   1.425 ++#else
   1.426 ++	popw	%ax			# restore context
   1.427  +	popw	%dx
   1.428 ++#endif
   1.429  +	jc	check_limits
   1.430 ++#ifndef FLOPPY_1440K_ONLY
   1.431  +	xchgw	%ax, %bp
   1.432 -+update_regs:
   1.433 -+	incw	%cx			# next sector
   1.434 ++	addw	%dx,%cx			# next sector
   1.435  +	movw	%cx, %gs
   1.436 -+	addb	$2,%bh			# next location
   1.437 -+	decw	%di			# update sector counter
   1.438 ++	addb	%dl,%bh
   1.439 ++	addb	%dl,%bh			# next location
   1.440 ++	subw	%dx,%di			# update sector counter
   1.441 ++	popw	%dx
   1.442  +	jz	putcdot
   1.443 -+	decw	%si
   1.444 -+	jnz	update_regs
   1.445 ++#else
   1.446 ++	addw	%ax,%cx			# next sector
   1.447 ++	movw	%cx, %gs
   1.448 ++	addb	%al,%bh
   1.449 ++	addb	%al,%bh			# next location
   1.450 ++	subw	%ax,%di			# update sector counter
   1.451 ++	jz	putcdot
   1.452 ++#endif
   1.453  +read_sectors:
   1.454  +	movw	%gs, %cx
   1.455 ++#ifndef FLOPPY_1440K_ONLY
   1.456  +#   al is last sector+1
   1.457  +#   ah is last cylinder+1
   1.458  +	xchgw	%ax, %bp
   1.459 ++#endif
   1.460 ++#ifndef FLOPPY_1440K_ONLY
   1.461  +        cmpb    %al,%cl			# reach sector limit ?
   1.462  +        jne     bdendlp
   1.463  +next_head:
   1.464  +        movb    %cl,%al
   1.465 ++#else
   1.466 ++        cmpb    $FLOPPY_SECTORS+1,%cl	# reach sector limit ?
   1.467 ++        jne     bdendlp
   1.468 ++#endif
   1.469  +        incb    %dh			# next head
   1.470  +        movb    $1,%cl			# first sector
   1.471 ++#ifndef FLOPPY_1440K_ONLY
   1.472  +        cmpb    %ah, %dh		# reach head limit ?
   1.473  +        jne     bdendlp
   1.474  +next_cylinder:
   1.475  +        movb    %dh,%ah
   1.476 ++#else
   1.477 ++        cmpb    %cl,%dh			# reach head limit ?
   1.478 ++        je	bdendlp
   1.479 ++#endif
   1.480  +# NOTE : support 256 cylinders max
   1.481  +        incb    %ch			# next cylinder
   1.482 -+        cmpb    $FLOPPY_CYLINDERS, %ch	# reach cylinder limit ?
   1.483  +read_first_sectors:
   1.484 ++        cmpb    $FLOPPY_CYLINDERS,%ch	# reach cylinder limit ?
   1.485  +        movb    $0,%dh			# first head
   1.486  +        jne	bdendlp
   1.487  +next_floppy:
   1.488  +	movb	$0,%ch			# first cylinder
   1.489  +	pushaw
   1.490  +	movw	$swap_floppy,%si
   1.491 -+	incb	12(%si)
   1.492 ++#ifdef KEYBOARDLESS_SUPPORT
   1.493  +	pushw	%bx
   1.494  +	call	puts
   1.495  +	popw	%bx
   1.496 @@ -362,17 +385,46 @@
   1.497  +	cmpb	-2(%si), %ah		# 0D then 00
   1.498  +	jne	waitfloppy		# no => try again
   1.499  +	incw	%si
   1.500 -+	orb	%ah,%ah			# was 00 ?
   1.501 ++	decw	%ax			# was 0001 ?
   1.502  +	jne	waitfloppy
   1.503  +waitfloppydone:
   1.504 -+	popaw
   1.505 -+bdendlp:
   1.506 ++#else
   1.507 ++	call	puts
   1.508 ++	cbw				# %ah = 0, get keyboard character
   1.509 + 	int	$0x16
   1.510 +-	int	$0x19
   1.511 ++#endif
   1.512  +        jmp	read_sectorslp
   1.513  +
   1.514 ++#ifdef EXE_SUPPORT
   1.515 ++read_sectors_dos:
   1.516 ++	pushw	%es
   1.517 ++	popw	%ds
   1.518 ++	movb	$0x3F, %ah	// read
   1.519 ++	cwd			// write to %ds:%dx, not %es:%bx
   1.520 ++	movw	%di, %cx
   1.521 ++	shlw	$9, %cx		// byte count
   1.522 ++	movw	%bp, %bx
   1.523 ++	int	$0x21
   1.524 ++	pushw	%ss
   1.525 ++	popw	%ds
   1.526 ++#endif
   1.527 + 
   1.528 +-	# int 0x19 should never return.  In case it does anyway,
   1.529 +-	# invoke the BIOS reset code...
   1.530 +-	ljmp	$0xf000,$0xfff0
   1.531 +-
   1.532 +-	.section ".bsdata", "a"
   1.533 +-bugger_off_msg:
   1.534 +-	.ascii	"Direct booting from floppy is no longer supported.\r\n"
   1.535 +-	.ascii	"Please use a boot loader program instead.\r\n"
   1.536 +-	.ascii	"\n"
   1.537 +-	.ascii	"Remove disk and press any key to reboot . . .\r\n"
   1.538 +-	.byte	0
   1.539  +putcdot:
   1.540 -+	movb	$0x2e+3, %al 		# loading... message 2e = .
   1.541 ++	movb	$'.'+3, %al	// . = success, - = failure
   1.542  +putclf:
   1.543 -+	subb	$3, %al
   1.544 ++	sbbb	$3, %al
   1.545  +putc:
   1.546  +	movb	$0xe, %ah
   1.547  +	movw	$7, %bx			#   one dot each 64k
   1.548 @@ -381,25 +433,16 @@
   1.549  +	je	putclf
   1.550  +	ret
   1.551  +
   1.552 -+puts:
   1.553 -+	movb	$0xd, %al		# CR
   1.554 -+putcs:
   1.555 -+	call	putc
   1.556 -+	lodsb
   1.557 -+	orb	%al,%al			# end of string is \0
   1.558 -+	jnz	putcs
   1.559 -+	ret
   1.560 -+
   1.561 ++#ifdef KEYBOARDLESS_SUPPORT
   1.562  +clock	= 0x46C
   1.563  +wait:
   1.564  +wait4key:
   1.565  +	movw	$clock, %di
   1.566  +#define DELAY 5
   1.567 -+	movb	$(DELAY*182)/10,%cl
   1.568 -+	addb	%fs:(%di),%cl
   1.569 ++	movb	$257-(DELAY*182)/10, %fs:(%di)
   1.570  +waitkbd:
   1.571  +	movw	$0x10D, %ax		# test keyboard, timeout => CR
   1.572 -+	cmpb	%fs:(%di),%cl
   1.573 ++	cmpb	%fs:(%di),%ah
   1.574  +	je	waitdone
   1.575  +	int	$0x16
   1.576  +	jz	waitkbd
   1.577 @@ -409,11 +452,87 @@
   1.578  +	incw	%di			# clear Z
   1.579  +waitdone:
   1.580  +	ret
   1.581 -+
   1.582 -+regs:	.asciz	"X:"
   1.583 -+
   1.584 -+swap_floppy:	.ascii	"Insert disk 1"
   1.585 -+		.byte	7,13,0
   1.586 ++#endif
   1.587 + 
   1.588 ++#ifdef EXE_SUPPORT
   1.589 ++comstart:
   1.590 ++	cld				# assume nothing
   1.591 ++	pushw	$INITSEG
   1.592 ++	popw	%es
   1.593 ++	pushw	%es
   1.594 ++	popw	%ss
   1.595 ++#ifdef CMDLINE
   1.596 ++	movw	%sp, %di
   1.597 ++	movw	$0x80, %si
   1.598 ++	lodsb
   1.599 ++	cbw
   1.600 ++	xchgw	%ax, %cx
   1.601 ++	rep
   1.602 ++	  movsb
   1.603 ++	movb	$(48+2)/2, %cl
   1.604 ++	xorw	%bx, %bx
   1.605 ++clearstacklp:
   1.606 ++	pushw	%bx
   1.607 ++	loop	clearstacklp
   1.608 ++# ifdef HELP
   1.609 ++	cmpb	$'?', -1(%si)
   1.610 ++	movw	$EXEADRS(0x200), %si
   1.611 ++	movw	setup_sects-0x200(%si), %di	// bits 0..6
   1.612 ++	je	puts_version
   1.613 ++	smsww	%ax
   1.614 ++	andb	$1, %al
   1.615 ++	jne	puts_version			// real mode only...
   1.616 ++# endif
   1.617 ++#else
   1.618 ++	movw	$(48+2)/2, %cx
   1.619 ++	xorw	%bx, %bx
   1.620 ++clearstacklp:
   1.621 ++	pushw	%bx
   1.622 ++	loop	clearstacklp
   1.623 ++#endif
   1.624 ++#if !defined(CMDLINE) || !defined(HELP)
   1.625 ++	movw	EXEADRS(setup_sects), %di	// bits 0..6
   1.626 ++	movb	$0, %al	// access = RO
   1.627 ++#endif
   1.628 ++	movw	0x2C(%bx), %ds	// DOS 3.0+
   1.629 ++loop1:
   1.630 ++	incw	%bx
   1.631 ++	cmpw	%cx, (%bx)
   1.632 ++	jne	loop1
   1.633 ++	leaw	4(%bx), %dx 	// %ds:%dx filename
   1.634 ++	movb	$0x3D, %ah	// open, access = RO
   1.635 ++	int	$0x21
   1.636 ++	jc	dosexit
   1.637 ++	xchgw	%ax, %bp	// fd
   1.638 ++	incw	%di
   1.639 ++	call	read_sectors_dos	// update %ds
   1.640 ++	addb	$read_sectors_dos-read_sectors, patchcall+1
   1.641 ++#ifdef CMDLINE
   1.642 ++# ifdef OLDCMDLINE
   1.643 ++	movw	$0x202, %bx
   1.644 ++	cmpw	%bx, 0x206-0x202(%bx)
   1.645 ++	jb	oldcmdline
   1.646 ++	movw	$INITSEG/16+stacktop/256, cmd_line_ptr+1-0x202(%bx)
   1.647 ++oldcmdline:
   1.648 ++# else
   1.649 ++	movw	$INITSEG/16+stacktop/256, cmd_line_ptr+1
   1.650 ++# endif
   1.651 ++#endif
   1.652 ++	ljmp	$INITSEG, $loadsys
   1.653 ++#endif
   1.654 ++	
   1.655 ++#define kernel_version	0xE
   1.656 ++puts_version:
   1.657 ++	addw	kernel_version(%si),%si	# starting protocol 2.00, Kernel 1.3.73
   1.658 ++puts:
   1.659 ++	movb	$0xd, %al		# CR
   1.660 ++putcs:
   1.661 ++	call	putc
   1.662 ++	lodsb
   1.663 ++	cmpb	$0, %al			# end of string is any byte <= 0
   1.664 ++	jg	putcs
   1.665 ++dosexit:
   1.666 ++	ret	
   1.667   
   1.668   	# Kernel attributes; used by setup.  This is part 1 of the
   1.669   	# header, from the old boot sector.