wok rev 17160

syslinux/iso2exe: full zImage support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Sep 17 11:38:34 2014 +0200 (2014-09-17)
parents f4afbc468065
children c15bb3c9e12d
files syslinux/stuff/iso2exe/Makefile syslinux/stuff/iso2exe/README syslinux/stuff/iso2exe/a20.c syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/bootlinux.c syslinux/stuff/iso2exe/init syslinux/stuff/iso2exe/libdos.c syslinux/stuff/iso2exe/libdos.h syslinux/stuff/iso2exe/meminfo.S
line diff
     1.1 --- a/syslinux/stuff/iso2exe/Makefile	Tue Sep 16 14:21:09 2014 +0200
     1.2 +++ b/syslinux/stuff/iso2exe/Makefile	Wed Sep 17 11:38:34 2014 +0200
     1.3 @@ -7,6 +7,7 @@
     1.4  meminfo.exe: meminfo.S
     1.5  	cc -o meminfo.o -Wa,-a=meminfo.lst -c meminfo.S
     1.6  	objcopy -O binary meminfo.o meminfo.exe
     1.7 +	chmod +x $@
     1.8  
     1.9  iso2exe: iso2exe.sh boot.com bootiso.bin init win32.exe
    1.10  	cp iso2exe.sh $@
    1.11 @@ -32,6 +33,7 @@
    1.12  
    1.13  tazboot.exe: boot.com
    1.14  	com2exe $< > $@
    1.15 +	chmod +x $@
    1.16  
    1.17  OBJS = boot.o iso9660.o libdos.o bootlinux.o
    1.18  boot.com: $(OBJS)
     2.1 --- a/syslinux/stuff/iso2exe/README	Tue Sep 16 14:21:09 2014 +0200
     2.2 +++ b/syslinux/stuff/iso2exe/README	Wed Sep 17 11:38:34 2014 +0200
     2.3 @@ -36,7 +36,7 @@
     2.4  - text	 	launch SliTaz in RAM with text mode
     2.5  - install	SliTaz UMSDOS like installation
     2.6  
     2.7 -If the prognam name includes one of the supported modes, the according mode is
     2.8 +If the program name includes one of the supported modes, the according mode is
     2.9  assumed. Example 'C:\> slitazlive.exe' starts SliTaz in RAM with graphics.
    2.10  
    2.11  
     3.1 --- a/syslinux/stuff/iso2exe/a20.c	Tue Sep 16 14:21:09 2014 +0200
     3.2 +++ b/syslinux/stuff/iso2exe/a20.c	Wed Sep 17 11:38:34 2014 +0200
     3.3 @@ -1,83 +1,6 @@
     3.4  #ifndef __A20
     3.5  #define __A20
     3.6  
     3.7 -// http://www.win.tue.nl/~aeb/linux/kbd/A20.html
     3.8 -static void a20enable(void)
     3.9 -{
    3.10 -#asm
    3.11 -		call	a20test
    3.12 -
    3.13 -		in	al, 0x92	// fast A20
    3.14 -		test	al, #0x2
    3.15 -		jnz	no92
    3.16 -		or	al, #0x2	// Enable A20
    3.17 -		and	al, #0xFE	// Do not reset machine
    3.18 -		out	0x92, al
    3.19 -		call	a20test
    3.20 -no92:
    3.21 -		call	empty_8042
    3.22 -		mov	al, #0xD1	// command write
    3.23 -		out	0x64, al 
    3.24 -		call	empty_8042
    3.25 -		mov	al, #0xDF	// Enable A20
    3.26 -		out	0x60, al 
    3.27 -		call	empty_8042
    3.28 -
    3.29 -		mov	al, #0xFF	// Null command, but UHCI wants it
    3.30 -		out	0x64, al 
    3.31 -		call	empty_8042
    3.32 -		call	a20test
    3.33 -		
    3.34 -		mov	ax, #0x2401
    3.35 -		int	0x15
    3.36 -		call	a20test
    3.37 -		
    3.38 -		in	al, 0xEE	// fast enable A20
    3.39 -		jmp	a20test
    3.40 -
    3.41 -empty_8042:
    3.42 -		mov	ah, #-32
    3.43 -wait_8042:
    3.44 -		in	al, 0x64
    3.45 -		inc	ax		// FF 32x : no kbd
    3.46 -		jz	enabled
    3.47 -		dec	ax
    3.48 -		shr	ax, #1		// Bit 0: input data
    3.49 -		jc	data
    3.50 -		shr	ax, #1		// Bit 1: buffer empty
    3.51 -		jc	wait_8042
    3.52 -		ret
    3.53 -data:
    3.54 -		in	al, 0x60	// read data
    3.55 -		jmp	wait_8042
    3.56 -a20test:
    3.57 -		push	ds
    3.58 -		xor	cx, cx
    3.59 -		xor	bx, bx
    3.60 -		mov	ds, cx		// ds = 0000
    3.61 -		dec	cx
    3.62 -		mov	gs, cx		// gs = FFFF
    3.63 -		cli
    3.64 -a1:
    3.65 -		mov	ax, [bx]
    3.66 -		not	ax
    3.67 -		mov	dx, ax
    3.68 -		seg	gs
    3.69 -		xchg	dx, [bx+10]
    3.70 -		cmp	ax, [bx]
    3.71 -		seg	gs
    3.72 -		mov	[bx+10], dx
    3.73 -		loopne	a1
    3.74 -		pop	ds
    3.75 -		xchg	ax, cx
    3.76 -		sti
    3.77 -		jne	enabled
    3.78 -		pop	cx		// quit a20enable
    3.79 -enabled:
    3.80 -		ret			// ax != 0 : enabled
    3.81 -#endasm
    3.82 -}
    3.83 -
    3.84  #define A20HOLDBUFFER	0x80000
    3.85  static int a20buffer = 0;
    3.86  static void movehia20(void)
    3.87 @@ -88,7 +11,7 @@
    3.88  	}
    3.89  	a20buffer = 1;
    3.90  #asm
    3.91 -		pusha
    3.92 +		pusha			// more than 1Mb => 286+
    3.93  		push	#A20HOLDBUFFER/16
    3.94  		pop	es
    3.95  		mov	di, _mem	// mem.base & 0xFFFF
    3.96 @@ -106,9 +29,8 @@
    3.97  static void realmode_switch_a20(void)
    3.98  {
    3.99  	if (!a20buffer) return;
   3.100 -	a20enable();
   3.101  #asm
   3.102 -		pusha
   3.103 +		pusha			// more than 1Mb => 286+
   3.104  		xor	di, di		// 30
   3.105  		mov	cx, #9		// 2E..1E
   3.106  a20z1:
     4.1 --- a/syslinux/stuff/iso2exe/bootiso.S	Tue Sep 16 14:21:09 2014 +0200
     4.2 +++ b/syslinux/stuff/iso2exe/bootiso.S	Wed Sep 17 11:38:34 2014 +0200
     4.3 @@ -127,36 +127,28 @@
     4.4  exestart:
     4.5  	cld
     4.6  	movw	$0x100, %si
     4.7 -	movw	-127(%si), %ax
     4.8 +	movw	-126(%si), %ax
     4.9  	cwd				// clear dx
    4.10  	pushw	%dx			// dos exit
    4.11 -	cmpw	$0x2F20, %ax
    4.12 -	movw	$0x1000+EXESTR(help), %ax
    4.13 -	je	abort
    4.14 -	pushfw			// save flags
    4.15 -		// bits  15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
    4.16 -		// flags  0 NT  IOPL OF DF IF TF SF ZF  0 AF  0 PF  1 CF
    4.17 -	// movb	$0x10, %ah
    4.18 -	pushw	%ax
    4.19 -	popfw			// < 286 : flags[12..15] are forced 1
    4.20 -	pushfw			// = 286 : flags[12..15] are forced 0
    4.21 -	popw	%cx		// > 286 : only flags[15] is forced 0
    4.22 -	popfw			// restore flags
    4.23 -	addb	%ah, %ch	// test F0 and 00 cases
    4.24 -	cmpb	%ah, %ch
    4.25 -	movb	$EXESTR(no386), %al
    4.26 -	jbe	abort		// C=8086/80186, Z=80286
    4.27 +	cmpb	$0x2F, %al
    4.28 +	movw	$0x3000+EXESTR(help), %ax
    4.29 +	jbe	abort
    4.30 +	int	$0x21
    4.31 +	cmpb	$3, %al
    4.32 +	movb	$EXESTR(noDOS3), %al
    4.33 +	jb	abort
    4.34  #if 1
    4.35 -	movw	(%si), %cx
    4.36 -	jcxz	is386
    4.37 +	cmpw	(%si), %dx	// checksum not set
    4.38 +	je	chked
    4.39  #endif
    4.40  	movw	$(EXELOC(0x8000))/2, %cx
    4.41  chklp:
    4.42  	lodsw
    4.43  	addw	%ax, %dx
    4.44  	loop	chklp
    4.45 -	movb	$EXESTR(chkerr), %al
    4.46 -	je	is386		// dx == 0 ?
    4.47 +chked:
    4.48 +	movw	$0x1000+EXESTR(chkerr), %ax
    4.49 +	je	tst386		// dx == 0 ?
    4.50  abort:
    4.51  puts:
    4.52  	movb	$0x80, %ah
    4.53 @@ -171,21 +163,37 @@
    4.54  	int	$0x10
    4.55  	jmp	putslp
    4.56  
    4.57 +tst386:
    4.58 +	pushfw			// save flags
    4.59 +		// bits  15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
    4.60 +		// flags  0 NT  IOPL OF DF IF TF SF ZF  0 AF  0 PF  1 CF
    4.61 +	// movb	$0x10, %ah
    4.62 +	pushw	%ax
    4.63 +	popfw			// < 286 : flags[12..15] are forced 1
    4.64 +	pushfw			// = 286 : flags[12..15] are forced 0
    4.65 +	popw	%bx		// > 286 : only flags[15] is forced 0
    4.66 +	popfw			// restore flags
    4.67 +	addb	%ah, %bh	// test F0 and 00 cases
    4.68 +	cmpb	%ah, %bh
    4.69 +	movb	$EXESTR(no386), %al
    4.70 +#undef NEED386
    4.71 +#ifdef NEED386
    4.72 +	jbe	abort		// C=8086/80186, Z=80286
    4.73 +#else
    4.74 +	jbe	is86		// C=8086/80186, Z=80286
    4.75 +#endif
    4.76  is386:
    4.77 -	movl	%cr0, %eax
    4.78 +	smsww	%ax		// not privileged
    4.79  	andb	$1, %al
    4.80  	jne	tstvcpi
    4.81 +	movl	%cr0, %eax	// privileged
    4.82  	incl	%eax
    4.83  	movb	$EXESTR(rmPaging), %al
    4.84  	js	abort
    4.85  	movb	$EXESTR(realmodemsg), %al
    4.86  realmode:
    4.87 +is86:
    4.88  	call	puts
    4.89 -	movb	$0x30, %ah
    4.90 -	int	$0x21
    4.91 -	cmpb	$3, %al
    4.92 -	movb	$EXESTR(noDOS3), %al
    4.93 -	jb	abort
    4.94  	movw	$0x0100, %di
    4.95  	movw	comstart-end_header(%di), %si		// .com address
    4.96  	pushw	%di
    4.97 @@ -202,7 +210,7 @@
    4.98  	jmp	realmode
    4.99  tstvcpi:
   4.100  	pushw	%ds
   4.101 -	movw	%cx, %ds		// %cx = 0
   4.102 +	movw	%dx, %ds		// %dx = 0
   4.103  	movw	0x67*4+2, %ds
   4.104  	movw	$10, %si
   4.105  	lodsl
   4.106 @@ -241,7 +249,7 @@
   4.107  	.ascii	"No EMM386/VCPI 4"	// No EMM386/VCPI 4.0+
   4.108  	.byte	EXESTR(dot0)
   4.109  chkerr:
   4.110 -	.ascii	"Broken ISO image fil"	// Broken ISO image file.
   4.111 +	.ascii	"Broken ISO9660 fil"	// Broken ISO9660 file.
   4.112  	.byte	EXESTR(eeol)
   4.113  vm86modemsg:
   4.114  	.ascii	"vm86"			// vm86 mode.
     5.1 --- a/syslinux/stuff/iso2exe/bootlinux.c	Tue Sep 16 14:21:09 2014 +0200
     5.2 +++ b/syslinux/stuff/iso2exe/bootlinux.c	Wed Sep 17 11:38:34 2014 +0200
     5.3 @@ -1,7 +1,9 @@
     5.4  #include <stdio.h>
     5.5 +#include "libdos.h"
     5.6  #include "iso9660.h"
     5.7  
     5.8  static unsigned setup_version;
     5.9 +#define ELKSSIG		0x1E6
    5.10  #define SETUPSECTORS	0x1F1
    5.11  #define ROFLAG		0x1F2
    5.12  #define SYSSIZE		0x1F4
    5.13 @@ -39,11 +41,16 @@
    5.14  	while (1);
    5.15  }
    5.16  
    5.17 +static int iselks;
    5.18  static int vm86(void)
    5.19  {
    5.20  #asm
    5.21 -		smsw	ax
    5.22 +		xor	ax, ax
    5.23 +		cmp	ax, _iselks
    5.24 +		jne	fakerealmode	// elks may run on a 8086
    5.25 +		smsw	ax		// 286+
    5.26  		and	ax, #1		// 0:realmode	1:vm86
    5.27 +fakerealmode:
    5.28  #endasm
    5.29  } 
    5.30  
    5.31 @@ -55,13 +62,31 @@
    5.32  static void movehi(void)
    5.33  {
    5.34  #asm
    5.35 -		pusha
    5.36 +		push	si
    5.37 +		push	di
    5.38 +
    5.39 +		mov	si, #_mem
    5.40 +		cmp	word ptr [si+2], #0x10
    5.41 +		jnc	movehiz
    5.42 +		mov	ax, [si+1]
    5.43 +		mov	cl, #4
    5.44 +		shl	ax, cl		// 8086 support for elks
    5.45 +		mov	es, ax
    5.46 +		mov	di, #0x00FF
    5.47 +		and	di, [si]
    5.48 +		mov	si, #_buffer
    5.49 +		mov	cx, #BUFFERSZ/2
    5.50 +		cld
    5.51 +		rep
    5.52 +		  movw
    5.53 +		jmp	movedone
    5.54 +movehiz:
    5.55  		xor	di, di		// 30
    5.56  		mov	cx, #9		// 2E..1E
    5.57  zero1:
    5.58  		push	di
    5.59  		loop	zero1
    5.60 -		push	dword [_mem]	// 1A mem.base
    5.61 +		push	dword [si]	// 1A mem.base
    5.62  		push	#-1		// 18
    5.63  		push	di		// 16
    5.64  		xor	eax, eax
    5.65 @@ -86,15 +111,17 @@
    5.66  		xchg	[si+0x1F], al	// bits 24..31
    5.67  		int	0x15
    5.68  		add	sp, #0x30
    5.69 -		popa
    5.70 +movedone:
    5.71 +		pop	di
    5.72 +		pop	si
    5.73  #endasm
    5.74  }
    5.75  
    5.76  #define ZIMAGE_SUPPORT
    5.77 +#define FULL_ZIMAGE
    5.78  
    5.79  #ifdef ZIMAGE_SUPPORT
    5.80  static unsigned zimage = 0;
    5.81 -#ifndef FULL_ZIMAGE 
    5.82  static unsigned getss(void)
    5.83  {
    5.84  #asm
    5.85 @@ -102,18 +129,6 @@
    5.86  #endasm
    5.87  }
    5.88  #endif
    5.89 -#endif
    5.90 -
    5.91 -static int versiondos;
    5.92 -static int dosversion(void)
    5.93 -{
    5.94 -#asm
    5.95 -		mov	ah, #0x30
    5.96 -		int	0x21
    5.97 -		cbw
    5.98 -		mov	_versiondos, ax
    5.99 -#endasm
   5.100 -}
   5.101  
   5.102  static unsigned extendedramsizeinkb(void)
   5.103  {
   5.104 @@ -135,10 +150,12 @@
   5.105  		die("Need real mode");
   5.106  	switch (mem.align) {
   5.107  	case 0:	// kernel
   5.108 +#ifdef __MSDOS__ 
   5.109  		if ((unsigned) (dosversion() - 3) > 7 - 3) {
   5.110  			printf("DOS %d not supported.\nTrying anyway...\n",
   5.111  				versiondos);
   5.112  		}
   5.113 +#endif
   5.114  		mem.align = PAGE_SIZE;
   5.115  		break;
   5.116  	case PAGE_SIZE: // first initrd : keep 16M..48M for the kernel
   5.117 @@ -165,21 +182,21 @@
   5.118  	mem.base &= - mem.align;
   5.119  }
   5.120  
   5.121 +static unsigned setupseg = SETUP_SEGMENT;
   5.122  static unsigned setupofs = 0;
   5.123  
   5.124  void movesetup(void)
   5.125  {
   5.126  #asm
   5.127 -		pusha
   5.128 -		push	#SETUP_SEGMENT
   5.129 -		pop	es
   5.130 +		push	si
   5.131 +		mov	es, _setupseg
   5.132  		mov	si, #_buffer
   5.133 -		mov	di, _setupofs
   5.134 +		xchg	di, _setupofs
   5.135  		mov	cx, #BUFFERSZ/2
   5.136  		rep
   5.137  		  movsw
   5.138 -		mov	_setupofs, di
   5.139 -		popa
   5.140 +		xchg	_setupofs, di
   5.141 +		pop	si
   5.142  #endasm
   5.143  }
   5.144  
   5.145 @@ -190,23 +207,40 @@
   5.146  #endasm
   5.147  }
   5.148  
   5.149 +static unsigned long kernel_version = 0;
   5.150  unsigned long loadkernel(void)
   5.151  {
   5.152  	unsigned setup, n = BUFFERSZ;
   5.153 -	unsigned long syssize = 0, kernel_version = 0;
   5.154 +	unsigned long syssize = 0;
   5.155  
   5.156  	do {
   5.157  		isoread(buffer, n);
   5.158  		if (setupofs == 0) {
   5.159  			if (* (unsigned short *) (buffer + BOOTFLAG) != 0xAA55)
   5.160  				die("The kernel is not bootable");
   5.161 +#asm
   5.162 +			int	0x12
   5.163 +			jc	has640k
   5.164 +			dec	ax
   5.165 +			and	al, #0xC0
   5.166 +			mov	cl, #6
   5.167 +			shl	ax, cl
   5.168 +			cmp	ax, _setupseg
   5.169 +			jnc	has640k
   5.170 +			mov	_setupseg, ax
   5.171 +has640k:
   5.172 +#endasm
   5.173  			setup = (1 + buffer[SETUPSECTORS]) << 9;
   5.174  			if (setup == 512) setup = 5 << 9;
   5.175  			syssize = * (unsigned long  *) (buffer + SYSSIZE) << 4;
   5.176 +			if (!syssize) syssize = 0x7F000;
   5.177  			setup_version = * (unsigned short *) (buffer + VERSION);
   5.178  #define HDRS	0x53726448
   5.179  			if (* (unsigned long *) (buffer + HEADER) != HDRS)
   5.180  				setup_version = 0;
   5.181 +#define ELKS	0x534B4C45
   5.182 +			if (* (unsigned long *) (buffer + ELKSSIG) == ELKS)
   5.183 +				iselks = 1;
   5.184  			if (setup_version < 0x204)
   5.185  				syssize &= 0x000FFFFFUL;
   5.186  			if (setup_version) {
   5.187 @@ -237,16 +271,16 @@
   5.188  			}
   5.189  			if (!setup_version || !(buffer[LOADFLAGS] & 1)) {
   5.190  #ifdef ZIMAGE_SUPPORT
   5.191 -#ifndef FULL_ZIMAGE 
   5.192  				zimage = getss() + 0x1000;
   5.193  				mem.base = zimage * 16L; 
   5.194 -				if (mem.base + syssize > SETUP_SEGMENT*16L - 32)
   5.195 +				if (mem.base + syssize > setupseg*16L - 32) {
   5.196 +#ifdef FULL_ZIMAGE
   5.197 +					zimage = 0x11;
   5.198 +					mem.base = 0x110000L;	// 1M + 64K HMA 
   5.199 +#else
   5.200  					die("Out of memory");
   5.201 -#else
   5.202 -				zimage = 0x11;
   5.203 -				mem.base = 0x110000L;	// 1M + 64K HMA 
   5.204 -
   5.205  #endif
   5.206 +				}
   5.207  #else
   5.208  				die("Not a bzImage format");
   5.209  #endif
   5.210 @@ -258,17 +292,16 @@
   5.211  	} while (setup > 0);
   5.212  
   5.213  #asm
   5.214 +		push	si
   5.215 +		mov	si, #0x200
   5.216 +		cmp	si, _setup_version
   5.217 +		jae	noversion
   5.218  		push	ds
   5.219 -		push	#SETUP_SEGMENT
   5.220 -		pop	ds
   5.221 -		mov	si, #0x200
   5.222 -		mov	eax, #0x53726448	// HdrS
   5.223 +		mov	ds, _setupseg		// setup > 2.00 => 386+
   5.224 +		xor	eax, eax
   5.225  		cdq				// clear edx
   5.226 -		cmp	[si+2], eax
   5.227 -		jne	noversion
   5.228  		add	si, [si+14]
   5.229  		mov	cx, #3
   5.230 -		xor	ax, ax
   5.231  nextdigit:
   5.232  		shl	al, #4
   5.233  		shl	ax, #4
   5.234 @@ -281,10 +314,9 @@
   5.235  		shld	edx, eax, #8
   5.236  		loop	next
   5.237  		pop	ds
   5.238 -		mov	.loadkernel.kernel_version[bp], edx
   5.239 -		push	ds
   5.240 +		mov	_kernel_version, edx
   5.241  noversion:
   5.242 -		pop	ds
   5.243 +		pop	si
   5.244  #endasm
   5.245  	load(syssize);
   5.246  	return kernel_version;
   5.247 @@ -292,15 +324,15 @@
   5.248  
   5.249  void loadinitrd(void)
   5.250  {
   5.251 -	if (setup_version && zimage == 0)
   5.252 +	if (setup_version)
   5.253  		load(isofilesize);
   5.254  }
   5.255  
   5.256  void bootlinux(char *cmdline)
   5.257  {
   5.258 +	dosshutdown();
   5.259  #asm
   5.260 -	push	#SETUP_SEGMENT
   5.261 -	pop	es
   5.262 +	mov	es, _setupseg
   5.263  #endasm
   5.264  	if (cmdline) {
   5.265  		if (setup_version <= 0x201) {
   5.266 @@ -345,82 +377,111 @@
   5.267  #endasm
   5.268  #ifdef ZIMAGE_SUPPORT
   5.269  #asm
   5.270 +	cld
   5.271 +	mov	ax, _mem
   5.272 +	mov	dx, _mem+2
   5.273  	mov	bx, _zimage
   5.274 +	mov	bp, _iselks
   5.275 +	mov	si, #sysmove
   5.276 +	mov	di, #SETUP_END
   5.277 +	mov	cx, #endsysmove-sysmove
   5.278  	or	bx, bx
   5.279  	jz	notzimage
   5.280 -		mov	eax, _mem
   5.281 -#ifndef FULL_ZIMAGE 
   5.282 -		shr	eax, #4		// top
   5.283 -		mov	dx, #SYSTEM_SEGMENT
   5.284 -#else
   5.285 -		dec	eax
   5.286 -		shr	eax, #16
   5.287 -		inc	ax
   5.288 -		mov	dx, #SYSTEM_SEGMENT/0x1000
   5.289 -#endif
   5.290  		push	cs
   5.291  		pop	ds
   5.292 -		push	ss
   5.293 -		pop	es
   5.294  		push	es
   5.295 -		mov	si, #sysmove
   5.296 -		mov	di, #SETUP_END
   5.297  		push	di
   5.298 -		mov	cx, #endsysmove-sysmove
   5.299 -		cld
   5.300  		rep
   5.301  		  movsb
   5.302  		retf
   5.303  sysmove:
   5.304 -#ifndef FULL_ZIMAGE 
   5.305 -		mov	ds, bx
   5.306 -		mov	es, dx
   5.307 -		xor	di, di
   5.308 -		xor	si, si
   5.309 -		mov	cl, #8
   5.310 -		rep
   5.311 -		  movsw
   5.312 -		inc	bx
   5.313 +#ifdef FULL_ZIMAGE
   5.314 +		cmp	dx, #0x0010
   5.315 +		jb	lowsys
   5.316 +// bx first 64k page, dx:ax last byte+1
   5.317 +		xchg	ax, cx			// clear ax
   5.318 +		jcxz	aligned
   5.319  		inc	dx
   5.320 -		cmp	ax, bx
   5.321 -		jne	sysmove
   5.322 -#else
   5.323 -		xchg	ax, cx
   5.324 +aligned:
   5.325  		mov	si, di
   5.326 -		push	es
   5.327 -		pop	ds
   5.328 -		push	cx
   5.329  		mov	cx, #0x18
   5.330  		rep
   5.331  		  stosw
   5.332 +		push	es
   5.333 +		pop	ds
   5.334  		dec	cx
   5.335 -		mov	[si+0x10], cx
   5.336 -		mov	[si+0x18], cx
   5.337 -		pop	cx
   5.338 +		mov	[si+0x10], cx	// limit = -1
   5.339 +		mov	[si+0x18], cx	// limit = -1
   5.340 +		mov	cx, #0x9300+SYSTEM_SEGMENT/0x1000
   5.341  		mov	bh, #0x93
   5.342 -		mov	dh, #0x93
   5.343  mvdown:
   5.344  		mov	[si+0x12+2], bx	// srce
   5.345 -		mov	[si+0x1A+2], dx	// dest
   5.346 -		pusha
   5.347 +		mov	[si+0x1A+2], cx	// dest
   5.348 +		pusha			// more than 1Mb => 286+
   5.349  		mov	cx, #0x8000
   5.350  		mov	ah, #0x87
   5.351 -		int	0x15	// catched by himem.sys: may need dos=high,umb
   5.352 +		int	0x15
   5.353  		popa
   5.354  		inc	bx
   5.355 -		inc	dx
   5.356 -		cmp	cl, bl
   5.357 +		inc	cx
   5.358 +		cmp	dl, bl
   5.359  		jne	mvdown
   5.360 +		jmp	notzimage
   5.361  #endif
   5.362 +lowsys:
   5.363 +// bx first segment, dx:ax last byte+1 (paragraph aligned)
   5.364 +		mov	cl, #4
   5.365 +		shr	ax, cl
   5.366 +		mov	cl, #12
   5.367 +		shl	dx, cl
   5.368 +		or	ax, dx		// last segment+1
   5.369 +		mov	dx, #SYSTEM_SEGMENT
   5.370 +		sub	ax, bx		// ax = paragraph count
   5.371 +		sub	bx, dx
   5.372 +		jnc	sysmovelp
   5.373 +		add	dx, ax		// top down
   5.374 +		dec	dx
   5.375 +sysmovelp:		// move ax paragraphs from bx+dx:0 to dx:0
   5.376 +		mov	es, dx
   5.377 +		mov	cx, dx
   5.378 +		add	cx, bx
   5.379 +		mov	ds, cx
   5.380 +		sbb	cx, cx		// cx = 0 : -1
   5.381 +		cmc			// C  = 1 :  0
   5.382 +		adc	dx, cx
   5.383 +		xor	di, di
   5.384 +		xor	si, si
   5.385 +		mov	cx, #8
   5.386 +		rep
   5.387 +		  movsw
   5.388 +		dec	ax
   5.389 +		jne	sysmovelp
   5.390  notzimage:
   5.391 +	or	bp, bp
   5.392 +	jz	notelks
   5.393 +	push	ss
   5.394 +	pop	ds
   5.395 +	mov	cx, #0x100
   5.396 +	mov	es, cx
   5.397 +	mov	ch, #0x78	// do not overload SYSTEM_SEGMENT
   5.398 +	xor	si, si
   5.399 +	xor	di, di
   5.400 +	push	es
   5.401 +	rep
   5.402 +	  movsw
   5.403 +	pop	ss
   5.404 +notelks:
   5.405  #endasm
   5.406  #endif
   5.407  #asm
   5.408 -	push	ss
   5.409 -	pop	ds
   5.410 -	push	ds
   5.411 -	pop	es
   5.412 -	jmpi	0, #0x9020
   5.413 +	mov	ax, ss
   5.414 +	mov	ds, ax
   5.415 +	mov	es, ax
   5.416 +	add	ax, #0x20
   5.417 +	push	ax
   5.418 +	xor	dx, dx
   5.419 +	push	dx
   5.420 +	retf
   5.421  endsysmove:
   5.422  #endasm
   5.423  }
     6.1 --- a/syslinux/stuff/iso2exe/init	Tue Sep 16 14:21:09 2014 +0200
     6.2 +++ b/syslinux/stuff/iso2exe/init	Wed Sep 17 11:38:34 2014 +0200
     6.3 @@ -67,10 +67,10 @@
     6.4  {
     6.5  	echo "Extracting $(basename $1) ..."
     6.6  	case $(get 0 $1) in
     6.7 -	*35615)	zcat $1 ;;
     6.8 -	*\ 93)	unlzma -c $1 ;;
     6.9 -	*)	cat $1 ;;
    6.10 -	esac | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
    6.11 +	*35615)	( zcat || gunzip ) ;;
    6.12 +	*\ 93)	unlzma ;;
    6.13 +	*)	cat ;;
    6.14 +	esac < $1 | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
    6.15  }
    6.16  
    6.17  getuuid()
     7.1 --- a/syslinux/stuff/iso2exe/libdos.c	Tue Sep 16 14:21:09 2014 +0200
     7.2 +++ b/syslinux/stuff/iso2exe/libdos.c	Wed Sep 17 11:38:34 2014 +0200
     7.3 @@ -128,3 +128,58 @@
     7.4  		sbb	ax, ax
     7.5  #endasm
     7.6  }
     7.7 +
     7.8 +void dosshutdown(void)
     7.9 +{
    7.10 +#asm
    7.11 +		push	bp
    7.12 +		push	si
    7.13 +		push	di
    7.14 +		push	ds
    7.15 +		seg	cs
    7.16 +		mov	stack+2, ss
    7.17 +		seg	cs
    7.18 +		mov	stack,sp
    7.19 +		xor	bx, bx
    7.20 +		mov	ds, bx		// ds = 0
    7.21 +		mov	[bx+4], #step
    7.22 +		mov	[bx+6], cs
    7.23 +		pushf
    7.24 +		pop	ax
    7.25 +		or	ax, #0x100	// set TF
    7.26 +		push	ax
    7.27 +		popf
    7.28 +		jmp	far [bx+4*0x19]
    7.29 +stack:
    7.30 +		.long	0
    7.31 +stepagain:
    7.32 +		iret
    7.33 +step:
    7.34 +		push	si
    7.35 +		push	ds
    7.36 +		mov	si, sp
    7.37 +		seg	ss
    7.38 +		lds	si, [si+4]
    7.39 +		cmp	word ptr [si], #0x19CD
    7.40 +		pop	ds
    7.41 +		pop	si
    7.42 +		jne	stepagain
    7.43 +		seg	cs
    7.44 +		lss	sp, stack
    7.45 +		pop	ds
    7.46 +		pop	di
    7.47 +		pop	si
    7.48 +		pop	bp
    7.49 +#endasm
    7.50 +}
    7.51 +
    7.52 +int versiondos;
    7.53 +int dosversion(void)
    7.54 +{
    7.55 +#asm
    7.56 +		mov	ah, #0x30
    7.57 +		int	0x21
    7.58 +		cbw
    7.59 +		mov	_versiondos, ax
    7.60 +#endasm
    7.61 +}
     8.1 --- a/syslinux/stuff/iso2exe/libdos.h	Tue Sep 16 14:21:09 2014 +0200
     8.2 +++ b/syslinux/stuff/iso2exe/libdos.h	Wed Sep 17 11:38:34 2014 +0200
     8.3 @@ -6,8 +6,13 @@
     8.4  extern char *progname(void);
     8.5  extern int chdir(char *path);
     8.6  extern int chdirname(char *path);
     8.7 +extern void dosshutdown(void);
     8.8 +extern int versiondos;
     8.9 +extern int dosversion(void);
    8.10  # else
    8.11 -#define progname() argv[0]
    8.12 +#define progname() (argv[0])
    8.13  #define chdirname(x) chdir(dirname(x))
    8.14 +#define dosshutdown()
    8.15 +#define dosversion() (0)
    8.16  # endif
    8.17  #endif
     9.1 --- a/syslinux/stuff/iso2exe/meminfo.S	Tue Sep 16 14:21:09 2014 +0200
     9.2 +++ b/syslinux/stuff/iso2exe/meminfo.S	Wed Sep 17 11:38:34 2014 +0200
     9.3 @@ -53,6 +53,20 @@
     9.4  	popw	%ds
     9.5  	pushw	%cs
     9.6  	popw	%es
     9.7 +#if 1
     9.8 +	pushfw			// save flags
     9.9 +		// bits  15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
    9.10 +		// flags  0 NT  IOPL OF DF IF TF SF ZF  0 AF  0 PF  1 CF
    9.11 +	movb	$0x10, %ah
    9.12 +	pushw	%ax
    9.13 +	popfw			// < 286 : flags[12..15] are forced 1
    9.14 +	pushfw			// = 286 : flags[12..15] are forced 0
    9.15 +	popw	%bx		// > 286 : only flags[15] is forced 0
    9.16 +	popfw			// restore flags
    9.17 +	addb	%ah, %bh	// test F0 and 00 cases
    9.18 +	cmpb	%ah, %bh
    9.19 +	jbe	fail		// C=8086/80186, Z=80286
    9.20 +#endif
    9.21  	xorl	%ebx, %ebx
    9.22  e820lp:
    9.23  	movl	$0xe820, %eax
    9.24 @@ -104,13 +118,15 @@
    9.25  	movw	%bx, 24+2(%di)
    9.26  	incb	%dh
    9.27  	movw	%dx, 56+2(%di)
    9.28 -	shrw	$6, %ax		// 1K -> 64K
    9.29 +	movw	%cx, %dx
    9.30 +	movb	$6, %cl
    9.31 +	shrw	%cl, %ax		// 1K -> 64K
    9.32  	jz	e801_configured
    9.33 -	shrw	$6, %cx		// 1K -> 64K
    9.34 +	shrw	%cl, %dx		// 1K -> 64K
    9.35  	addw	$0x10, %ax
    9.36 -	addw	$0x10, %cx
    9.37 +	addw	$0x10, %dx
    9.38  	movw	%ax, 8+2(%di)
    9.39 -	movw	%cx, 40+2(%di)
    9.40 +	movw	%dx, 40+2(%di)
    9.41  	movw	$extended, %si
    9.42  	call	pute801
    9.43  	call	pute801
    9.44 @@ -133,7 +149,8 @@
    9.45  	popw	%di
    9.46  	jc	fail3
    9.47  	movb	$0x10, 0+2(%di)		// 1M
    9.48 -	shrw	$6, %ax		// 1K -> 64K
    9.49 +	movb	$6, %cl
    9.50 +	shrw	%cl, %ax		// 1K -> 64K
    9.51  	jz	fail3
    9.52  	addw	$0x10, %ax
    9.53  	movw	%ax, 8+2(%di)