wok rev 21791

Fix loram dos boot
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Aug 01 15:16:29 2019 +0200 (15 months ago)
parents e66efc062996
children 3937da23fe1e
files linld/stuff/src/CRTL.ASM linld/stuff/src/CRTLX.H linld/stuff/src/LINLD.CPP linld/stuff/src/MEMCPY32.ASM linld/stuff/src/MEMTOP.ASM linld/stuff/src/TAZBOOT.CPP linld/stuff/src/XMM.ASM linld/stuff/src/pipehole.awk syslinux/stuff/iso2exe/bootiso.S syslinux/stuff/iso2exe/init syslinux/stuff/iso2exe/iso2exe.sh
line diff
     1.1 --- a/linld/stuff/src/CRTL.ASM	Tue Jul 30 10:35:07 2019 +0200
     1.2 +++ b/linld/stuff/src/CRTL.ASM	Thu Aug 01 15:16:29 2019 +0200
     1.3 @@ -1327,101 +1327,6 @@
     1.4  		ifdef	EXTRA
     1.5                  p8086
     1.6  ;***************************************************************
     1.7 -;char *progname(void)
     1.8 -;***************************************************************
     1.9 -        global  _progname:near
    1.10 -        proc    _progname near
    1.11 -
    1.12 -		push	si di
    1.13 -		mov	ah,30h
    1.14 -		int	21h
    1.15 -		xor	di,di
    1.16 -		cmp	al,3
    1.17 -		mov	ax,di
    1.18 -		jb	@@skip
    1.19 -		;mov	es,[cs:2Ch]
    1.20 -		mov	es,[di+2Ch]
    1.21 -		mov	cx,sp			; big enough
    1.22 -@@loop:
    1.23 -		repne
    1.24 -		  scasb
    1.25 -		scasb
    1.26 -		jne	@@loop
    1.27 -		inc	di
    1.28 -		inc	di
    1.29 -; ax = strdup(bx) ?
    1.30 -		mov	si,di			; progname @es:di
    1.31 -		repne
    1.32 -		  scasb
    1.33 -		mov	ax,di
    1.34 -		sub	ax,si			; progname len
    1.35 -		push	ax
    1.36 -		call	malloc_or_die
    1.37 -		mov	di,ax
    1.38 -		pop	cx
    1.39 -		push	ds
    1.40 -		push	es
    1.41 -		pop	ds
    1.42 -		pop	es
    1.43 -		rep
    1.44 -		  movsb
    1.45 -		push	es
    1.46 -		pop	ds
    1.47 -@@skip:
    1.48 -		pop	di si
    1.49 -		ret
    1.50 -
    1.51 -        endp    _progname
    1.52 -
    1.53 -
    1.54 -;***************************************************************
    1.55 -;_fastcall void chdirname(bx:char *path)
    1.56 -;***************************************************************
    1.57 -        global  @chdirname$qpzc:near
    1.58 -        proc    @chdirname$qpzc near
    1.59 -
    1.60 -		cmp	[byte bx+1],3Ah		; ':'
    1.61 -		jne	@@nodisk
    1.62 -		mov	dl,20h
    1.63 -		or	dl,[bx]
    1.64 -		sub	dl,61h
    1.65 -		mov	ah,0Eh
    1.66 -		int	21h
    1.67 -		inc	bx
    1.68 -		inc	bx
    1.69 -@@nodisk:
    1.70 -		xor	cx,cx
    1.71 -@@next:
    1.72 -		mov	al,[bx]
    1.73 -		cmp	al,5Ch
    1.74 -		jne	@@tsteos
    1.75 -		mov	dx,bx
    1.76 -		inc	cx
    1.77 -@@tsteos:
    1.78 -		inc	bx
    1.79 -		or	al,al
    1.80 -		jnz	@@next
    1.81 -		jcxz	@@end
    1.82 -		mov	bx,dx
    1.83 -		push	[word bx]
    1.84 -		mov	[bx],al
    1.85 -	ifdef	LONG_FILENAME
    1.86 -		stc
    1.87 -		mov	ax,713Bh		; chdir long filename (ds:dx)
    1.88 -		int	21h
    1.89 -		jnc	@@chdirdone
    1.90 -	endif
    1.91 -		mov	ah,3Bh			; chdir(ds:dx)
    1.92 -		int	21h
    1.93 -@@chdirdone:
    1.94 -		pop	[word bx]
    1.95 -@@end:
    1.96 -		ret
    1.97 -
    1.98 -        endp    @chdirname$qpzc
    1.99 -
   1.100 -
   1.101 -;***************************************************************
   1.102  ;_fastcall char *ultoa(axdx:unsigned long n);
   1.103  ;***************************************************************
   1.104          global  @ultoa$qul:near
     2.1 --- a/linld/stuff/src/CRTLX.H	Tue Jul 30 10:35:07 2019 +0200
     2.2 +++ b/linld/stuff/src/CRTLX.H	Thu Aug 01 15:16:29 2019 +0200
     2.3 @@ -5,8 +5,6 @@
     2.4  extern _fastcall int strcmp(const char* a,const char* b);
     2.5  //extern "C" char* strstr(const char* a,const char* b);
     2.6  extern _fastcall int strstr(const char* a,const char* b);
     2.7 -extern "C" char *progname(void);
     2.8 -extern _fastcall void chdirname(char *path);
     2.9  extern _fastcall unsigned long kver2ul(char *kernel_version);
    2.10  //extern "C" char *ultoa(unsigned long n);
    2.11  extern _fastcall int ultoa(unsigned long n);
     3.1 --- a/linld/stuff/src/LINLD.CPP	Tue Jul 30 10:35:07 2019 +0200
     3.2 +++ b/linld/stuff/src/LINLD.CPP	Thu Aug 01 15:16:29 2019 +0200
     3.3 @@ -89,12 +89,7 @@
     3.4  	    load_initrd();
     3.5  	    boot_kernel();
     3.6  	}
     3.7 -        if(strhead(s,"image=") != -1) {
     3.8 -	    s+=6;
     3.9 -	set_kernel_name:
    3.10 -            kernel_name=s;
    3.11 -        }
    3.12 -        else if(strhead(s,"initrd=") != -1) {
    3.13 +        if(strhead(s,"initrd=") != -1) {
    3.14              initrd_name=s+7;
    3.15          }
    3.16          else if(strhead(s,"vga=") != -1) {
    3.17 @@ -140,6 +135,11 @@
    3.18  		((u16 *)&topmem)[1] = (u16)(strtol(s+4)>>16);
    3.19  		goto addincmdline;
    3.20  	    }
    3.21 +            else if(strhead(s,"image=") != -1) {
    3.22 +	        s+=6;
    3.23 +	    set_kernel_name:
    3.24 +                kernel_name=s;
    3.25 +            }
    3.26  	    else {
    3.27  	addincmdline:
    3.28  		if(cmdline == (const char *) buf_cmdline + 1) {
     4.1 --- a/linld/stuff/src/MEMCPY32.ASM	Tue Jul 30 10:35:07 2019 +0200
     4.2 +++ b/linld/stuff/src/MEMCPY32.ASM	Thu Aug 01 15:16:29 2019 +0200
     4.3 @@ -93,16 +93,18 @@
     4.4  		xor	bx,bx
     4.5  		xor	si,si
     4.6  		mov	ax,[srcseg]
     4.7 -		xor	dx,dx
     4.8  		extrn	N_LXLSH@4:near
     4.9  		call	near ptr N_LXLSH@4
    4.10  		add	[word srcofs],ax
    4.11  		adc	[word srcofs+2],dx
    4.12  @@2flat:
    4.13 -		mov	ax,[word si+srcofs]	; srcofs, dstofs lo
    4.14 -		mov	dx,[word si+srcofs+2]	; srcofs, dstofs hi
    4.15 -		extrn	N_LXURSH@4:near
    4.16 -		call	near N_LXURSH@4
    4.17 +		les	ax,[dword si+srcofs]	; srcofs, dstofs
    4.18 +		mov	dx,es
    4.19 +		mov	cl,4
    4.20 +@@loop:
    4.21 +		shr	dx,1
    4.22 +		rcr	ax,1
    4.23 +		loop	@@loop
    4.24  		or	bx,dx			; >=1mb flag
    4.25  		push	ax			; srcseg, dstseg
    4.26  		xor	si,-6
     5.1 --- a/linld/stuff/src/MEMTOP.ASM	Tue Jul 30 10:35:07 2019 +0200
     5.2 +++ b/linld/stuff/src/MEMTOP.ASM	Thu Aug 01 15:16:29 2019 +0200
     5.3 @@ -88,14 +88,15 @@
     5.4                  setc    dl              ;  (optimized to death)
     5.5  		shld    dx,ax,cl
     5.6  		shl     ax,cl		;  (kbytes -> bytes)
     5.7 +		ret
     5.8  		else
     5.9                  xor     dx,dx
    5.10                  add     ah,4h           ;account for 1024 low kb
    5.11                  adc     dx,dx           ;  (optimized to death)
    5.12 -		db	0A9h		; test ax,04B1h
    5.13 -        global  N_LXLSH@4:near
    5.14 -N_LXLSH@4:
    5.15 -		mov	cl,4
    5.16 +		db	0A9h		; test ax,0C28Ch
    5.17 +        global  N_LXLSH@ES:near
    5.18 +N_LXLSH@ES:
    5.19 +		mov	dx,es
    5.20          global  N_LXLSH@:near
    5.21  N_LXLSH@:
    5.22  		mov	ch,0
    5.23 @@ -103,30 +104,16 @@
    5.24  		shl	ax,1
    5.25  		rcl	dx,1
    5.26  		loop	@@lp
    5.27 +		ret
    5.28 +        global  N_LXLSH@4:near
    5.29 +N_LXLSH@4:
    5.30 +		xor	dx,dx
    5.31 +		mov	cl,4
    5.32 +		jmp	N_LXLSH@
    5.33  		endif
    5.34 -		ret
    5.35  
    5.36  ;        endp    _memtop_88
    5.37  
    5.38 -		ifdef	NO386
    5.39 -        global  N_LXURSH@:near
    5.40 -        global  N_LXURSH@4:near
    5.41 -;        proc    N_LXURSH@4 near
    5.42 -N_LXURSH@4:
    5.43 -		mov	cl,4
    5.44 -N_LXURSH@:
    5.45 -		mov	ch,0
    5.46 -@@loop:
    5.47 -		shr	dx,1
    5.48 -		rcr	ax,1
    5.49 -		loop	@@loop
    5.50 -		ret
    5.51 -
    5.52 -;        endp    N_LXURSH@4
    5.53 -
    5.54 -		endif
    5.55 -
    5.56 -
    5.57  ;        proc    _memtopz near
    5.58  
    5.59  ;                call	_memtop_e801
     6.1 --- a/linld/stuff/src/TAZBOOT.CPP	Tue Jul 30 10:35:07 2019 +0200
     6.2 +++ b/linld/stuff/src/TAZBOOT.CPP	Thu Aug 01 15:16:29 2019 +0200
     6.3 @@ -163,8 +163,6 @@
     6.4  int main(int argc, char *argv[])
     6.5  {
     6.6  	((u16*) &base_himem)[1] |= (_1m+_64k)>>16;	// base_himem = _1m+_64k
     6.7 -	argv[0] = progname();
     6.8 -	bootiso(argv);	// iso ? parsing is /init.exe stuff !
     6.9  
    6.10  	if (argc < 2) {
    6.11  		try_default_args();
    6.12 @@ -180,14 +178,38 @@
    6.13    kernel=\\slitaz\\elks\n\
    6.14    root=/dev/bda1 ro\n");
    6.15  	}
    6.16 -	bootiso(argv + 1);
    6.17 -	chdirname(*argv);
    6.18 +	bootiso(argv + 1);	// iso ? parsing is /init.exe stuff !
    6.19  	for (int i=0;;) {
    6.20  		char *s;
    6.21  	next:	argv++;
    6.22  		s=*argv;
    6.23  		i++;
    6.24 -		if (!s) break;
    6.25 +		if (!s) {
    6.26 +			if (isoreset(iso) != -1) {
    6.27 +				s = (char *) initrd_name;
    6.28 +				if (isoopen((char *) kernel_name) != -1) {
    6.29 +					isokernel();
    6.30 +				}
    6.31 +				if (s) {
    6.32 +					do {
    6.33 +						char *p, c;
    6.34 +						for (p = s; *s && *s != ','; s++);
    6.35 +						c = *s; *s = 0;
    6.36 +						if (isoopen(p) != -1) {
    6.37 +							addinitrd();
    6.38 +						}
    6.39 +						*s = c;
    6.40 +						if (c) s++;
    6.41 +					} while (*s);
    6.42 +					load_initrds();
    6.43 +				}
    6.44 +			}
    6.45 +			else {
    6.46 +				load_kernel();
    6.47 +				load_initrd();
    6.48 +			}
    6.49 +			boot_kernel();
    6.50 +		}
    6.51  #ifdef USE_ARGSTR
    6.52  	        if ((*(u16 *)s|0x2002) == 0x662F) {	// -F /f
    6.53  			skip_alloc++;
    6.54 @@ -201,32 +223,32 @@
    6.55  		else strcatb(buf_cmdline,*argv);	// FIXME mem ?
    6.56  	}
    6.57  #else
    6.58 -		if (strhead(s,"kernel=") != -1) {
    6.59 +		if (strhead(s,"initrd=") != -1) {
    6.60 +			s += 7;
    6.61 +			initrd_name = s;
    6.62 +		}
    6.63 +		else if (strhead(s,"bootfrom=") != -1) {
    6.64 +			s += 9;
    6.65 +			goto set_iso;
    6.66 +		}
    6.67 +		else if (strhead(s,"iso=") != -1) {
    6.68 +			s += 4;
    6.69 +	set_iso:
    6.70 +			iso = s;
    6.71 +		}
    6.72 +		else if (strhead(s,"image=") != -1) {
    6.73 +			goto set_kernel;
    6.74 +		}
    6.75 +		else if(strhead(s,"vga=") != -1) {
    6.76 +			*(u16*)&vid_mode = (u16)strtol(s+4);	// support normal, extended & ask
    6.77 +		}
    6.78 +		else if (strhead(s,"kernel=") != -1) {
    6.79  			s++;
    6.80  	set_kernel:
    6.81  			s += 6;
    6.82  	set_kernelz:
    6.83  			kernel_name = s;
    6.84  		}
    6.85 -		else if (strhead(s,"image=") != -1) {
    6.86 -			goto set_kernel;
    6.87 -		}
    6.88 -		else if (strhead(s,"initrd=") != -1) {
    6.89 -			s += 7;
    6.90 -			initrd_name = s;
    6.91 -		}
    6.92 -		else if (strhead(s,"bootfrom=") != -1) {
    6.93 -			s += 9;
    6.94 -	set_iso:
    6.95 -			iso = s;
    6.96 -		}
    6.97 -		else if (strhead(s,"iso=") != -1) {
    6.98 -			s += 4;
    6.99 -			goto set_iso;
   6.100 -		}
   6.101 -		else if(strhead(s,"vga=") != -1) {
   6.102 -			*(u16*)&vid_mode = (u16)strtol(s+4);	// support normal, extended & ask
   6.103 -		}
   6.104  	        else switch (*(u16 *)s|0x2002) {
   6.105  		case 0x662F:	// -F /f
   6.106  			skip_alloc++;
   6.107 @@ -255,29 +277,4 @@
   6.108  		}}
   6.109  	}
   6.110  #endif
   6.111 -	if (isoreset(iso) != -1) {
   6.112 -		char *s = (char *) initrd_name;
   6.113 -		if (isoopen((char *) kernel_name) != -1) {
   6.114 -			isokernel();
   6.115 -		}
   6.116 -		if (s) {
   6.117 -			while (*s) {
   6.118 -				char *p, c;
   6.119 -				for (p = s; *s && *s != ','; s++);
   6.120 -				c = *s; *s = 0;
   6.121 -				if (isoopen(p) != -1) {
   6.122 -					addinitrd();
   6.123 -				}
   6.124 -				*s = c;
   6.125 -				if (c) s++;
   6.126 -			}
   6.127 -			load_initrds();
   6.128 -		}
   6.129 -	}
   6.130 -	else {
   6.131 -		load_kernel();
   6.132 -		load_initrd();
   6.133 -	}
   6.134 -	boot_kernel();
   6.135 -	return _AX;
   6.136  }
     7.1 --- a/linld/stuff/src/XMM.ASM	Tue Jul 30 10:35:07 2019 +0200
     7.2 +++ b/linld/stuff/src/XMM.ASM	Thu Aug 01 15:16:29 2019 +0200
     7.3 @@ -109,11 +109,10 @@
     7.4  		;cwd
     7.5  		;add	ax,[word (image_himem bx).size]		; lo m->size
     7.6  		;adc	dx,[word (image_himem bx+2).size]	; hi m->size
     7.7 -		mov	ax,[word (image_himem bx).size]		; lo m->size
     7.8 -		mov	dx,[word (image_himem bx+2).size]	; hi m->size
     7.9 +		les	ax,[dword (image_himem bx).size]	; m->size
    7.10  		mov	cl,16-10
    7.11 -		extrn	N_LXLSH@:near
    7.12 -		call	N_LXLSH@
    7.13 +		extrn	N_LXLSH@ES:near
    7.14 +		call	N_LXLSH@ES
    7.15                  inc     dx
    7.16                  mov     ah,9h          ;allocate blk of DX kilobytes (<64Mb)
    7.17  		endif
     8.1 --- a/linld/stuff/src/pipehole.awk	Tue Jul 30 10:35:07 2019 +0200
     8.2 +++ b/linld/stuff/src/pipehole.awk	Thu Aug 01 15:16:29 2019 +0200
     8.3 @@ -1,11 +1,35 @@
     8.4 -BEGIN { hold=0; is386=0; isload=0; isiso=0; istazboot=0; wascall=0; label="none"; xlabel="" }
     8.5 +BEGIN { hold=0; is386=0; isload=0; isiso=0; istazboot=0; wascall=0; ishimem=0; label="none"; xlabel=""; file="" }
     8.6  function isnum(n) { return match(n,/^[0-9+-]/) }
     8.7  {
     8.8  	sub(/segment word public/,"segment byte public")
     8.9  
    8.10  	if (/^@.*:$/ || /	endp$/) afterjmp=0
    8.11 -	if (/dword ptr/) is386=1
    8.12 +	if (/^	\.386p$/) is386=1
    8.13 +	if (file == "" && /debug	S/) { file=$3; gsub(/\"/,"",file) }
    8.14 +	 if (file == "himem.cpp") {
    8.15 +	if (/remaining = m-/) ishimem=1
    8.16 +	if (ishimem == 1 && is386 == 0) {
    8.17 +		if (/si\+8\]$/ || /si\+4\]$/ || /si\+16\]$/) next
    8.18 +		if (/si\+6\]$/ || /si\+2\]$/ || /si\+14\]$/) sub(/mov	dx,/,"les	dx,d")
    8.19 +		if (/si\+12\],ax/ || /si\+16\],ax/ || /bp-2\],ax/) sub(/,ax/,",es")
    8.20 +		if (/do \{/) ishimem=0
    8.21 +	}
    8.22 +	 } # file == "himem.cpp"
    8.23 +	 if (file == "load.cpp") {
    8.24  	sub(/DGROUP:_imgs\+65534/,"[di-2]")
    8.25 +	if (/short @1@366$/) isload=10
    8.26 +	if (isload == 10) {  # LOAD.LST
    8.27 +		if (/^	je	/) next
    8.28 +		if (/ptr @die\$qpxzc/) {
    8.29 +			$0="	jne	@die@"
    8.30 +			isload=0
    8.31 +		}
    8.32 +	}
    8.33 +	if (/setup_sects == 0/) isload=9
    8.34 +	if (isload == 9) {  # LOAD.LST
    8.35 +		sub(/,0/,",al")
    8.36 +		if (/jne/) isload=0
    8.37 +	}
    8.38  	if (/fallback\)\[1\] == 0/) isload=8
    8.39  	if (isload == 8) {  # LOAD.LST
    8.40  		if (/load_image/) isload=0
    8.41 @@ -14,10 +38,13 @@
    8.42  	if (/cmd_line_ptr =/ && is386 == 0) isload=7
    8.43  	if (isload == 7) {  # LOAD.LST
    8.44  		if (/add/ || /xor/ || /extrn/ || /N_LXLSH@/ || /cl,4/) next
    8.45 -		if (/,ax/) {
    8.46 -			sub(/ax/,"8000h")
    8.47 +		if (/enable A20 if needed/) {
    8.48 +			print "	mov	word ptr [bx+si],8000h"
    8.49  			isload=0
    8.50  		}
    8.51 +		if (/,ax/) $0="	mov	bx,55"
    8.52 +		if (/si-463/) $0="	mov	bx,-463"
    8.53 +		if (/si-465/) $0="	mov	word ptr [bx+si-2],-23745"
    8.54  		if (/,dx/) {
    8.55  			print "	mov	cl,12"
    8.56  			print "	shr	ax,cl"
    8.57 @@ -55,7 +82,6 @@
    8.58  	if (isload == 4 && is386 == 0) {  # LOAD.LST
    8.59  		if (/push/ || /pop/) next
    8.60  		if (/ax,cs/) {
    8.61 -			print "	cwd"
    8.62  			sub(/ax,cs/,"bx,cs")
    8.63  		}
    8.64  		if (/dx,dx/) next
    8.65 @@ -68,9 +94,21 @@
    8.66  			isload=400
    8.67  		}
    8.68  	}
    8.69 -	if (isload == 400 && /,0/) {
    8.70 +	if (isload == 400) {
    8.71 +		if (/call/) {
    8.72 +			print	"	extrn	N_LXLSH@4:near"
    8.73 +			sub(/N_LXLSH@/,"N_LXLSH@4")
    8.74 +		}
    8.75  		sub(/,0/,",dh")
    8.76 -		isload=0
    8.77 +		if (/_base_himem\+2/ || /pop/ || /push/) next
    8.78 +		if (/_base_himem$/) {
    8.79 +			sub(/mov	dx,/,"les	dx,d")
    8.80 +			isload++
    8.81 +		}
    8.82 +	}
    8.83 +	if (isload == 401) {
    8.84 +		sub(/,ax/,",es")
    8.85 +		if (/load_image/) isload=0
    8.86  	}
    8.87  	if (isload == 4 && is386) {  # LOAD.LST
    8.88  		sub(/dx,cs/,"edx,cs")
    8.89 @@ -101,15 +139,39 @@
    8.90  		sub(/,ax/,",cx")
    8.91  		if (/version_string/ || /starting linux 1\.3\.73/) isload=0
    8.92  	}
    8.93 -	if (/_rm_size=0x200/ || /heap_top = _rm_buf/) isload=1
    8.94 +	if (/Not a kernel/ || /_rm_size=0x200/ || /heap_top = _rm_buf/) isload=1
    8.95  	if (isload == 1) {  # LOAD.LST
    8.96 +		if (/ptr .die\$qpxzc/) $0="@die@:\n" $0
    8.97  		if (/mov	al,byte ptr/ && is386) {
    8.98  			print "	movzx	eax,byte ptr [si]"
    8.99  			next
   8.100  		}
   8.101 +		if (is386 == 0) {
   8.102 +			if (/di-5\],ax/) print "	cwd"
   8.103 +			sub(/,0$/,",dx")
   8.104 +		}
   8.105  		if (/ax,word ptr/) next
   8.106  		if (/^	call/) isload=0
   8.107  	}
   8.108 +	 } # file == "load.cpp"
   8.109 +	 if (file == "iso9660.cpp") {
   8.110 +	if (/<< SECTORBITS/) isiso=9
   8.111 +	if (isiso == 9) { # ISO9660.LST
   8.112 +		if (/dx,/) next
   8.113 +		sub(/mov	ax,/,"les	ax,d")
   8.114 +		if (/^	call/) {
   8.115 +			print "	extrn	N_LXLSH@ES:near"
   8.116 +			sub(/N_LXLSH@/,"N_LXLSH@ES")
   8.117 +			isiso=0
   8.118 +		}
   8.119 +	}
   8.120 +	if (/filesize =/) isiso=8
   8.121 +	if (isiso == 8) { # ISO9660.LST
   8.122 +		if (/ax,/) next
   8.123 +		sub(/mov	dx,/,"les	dx,d")
   8.124 +		sub(/,ax/,",es")
   8.125 +		if (/filemod/) isiso=0
   8.126 +	}
   8.127  	if (/CD001/) isiso=7
   8.128  	if (isiso == 7) { # ISO9660.LST
   8.129  		sub(/mov	ax,-1/,"dec	ax")
   8.130 @@ -137,6 +199,8 @@
   8.131  		sub(/DGROUP:_isostate\+20/,"[si+20]")
   8.132  		if (/goto restarted/) isiso=0
   8.133  	}
   8.134 +	 } # file == "iso9660.cpp"
   8.135 +	 if (file == "iso9660.cpp" || file == "tazboot.cpp") {
   8.136  	if (/do s\+\+; while/) isiso=3
   8.137  	if (/for \(p = s; \*s && \*s \!=/) isiso=3
   8.138  	if (isiso == 3) { # ISO9660.LST, TAZBOOT.LST
   8.139 @@ -147,10 +211,15 @@
   8.140  		if (/al,0/) print "	mov	al,[" r "]"
   8.141  		if (/al,byte ptr/) sub(/mov/,"xchg")
   8.142  		if (/byte ptr \[.*\],0/) next
   8.143 -		if (/jmp/) print "	mov	bx,si"
   8.144 +		if (/jmp/) {
   8.145 +			print "	mov	bx,si"
   8.146 +			$0="	db	0A8h	; test al,xx instead of " $0
   8.147 +		}
   8.148  		if (/word ptr \[bp-4\]/) next
   8.149  		if (/\) s\+\+;/ || /\],-1/) isiso=0
   8.150  	}
   8.151 +	 } # file == "iso9660.cpp" || file == "tazboot.cpp"
   8.152 +	 if (file == "iso9660.cpp") {
   8.153  	if (/endname = NULL/) isiso=2
   8.154  	if (isiso == 2) { # ISO9660.LST
   8.155  		if (/mov	bx,cx/) next
   8.156 @@ -172,10 +241,13 @@
   8.157  		if (/jmp	@3@58$/) $0="	je	@3@58"
   8.158  		sub(/mov	ax,-1/,"dec	ax")
   8.159  	}
   8.160 +	 } # file == "iso9660.cpp"
   8.161  	if (/endp/) { xlabel = ""; goto2=0 }
   8.162  	if (/isoopen\(s\+7\)/ && xlabel == "") goto2=1
   8.163  	if (/_vid_mode,ax/ && xlabel == "") goto2=1
   8.164 +	if (/_initrd_name,si/ && xlabel == "") goto2=1
   8.165  	if (/_base_himem\+2,/ && xlabel == "@") goto2=1
   8.166 +	if (/DGROUP:_skip_alloc/ && xlabel == "@") goto2=1
   8.167  	if (/puts\(cmdline\)/ && xlabel == "@@") goto2=1
   8.168  	if (goto2 == 1 && /jmp/) { # TAZBOOT.LST && LINLD.LST
   8.169  		print $NF xlabel "@:"
   8.170 @@ -185,6 +257,30 @@
   8.171  		$0=$0 xlabel
   8.172  		if (goto2++ == 1) xlabel=xlabel "@"
   8.173  	}
   8.174 +	if (/if\(\*s>=/) isotazboot=14
   8.175 +	if (isotazboot == 14) { # LINLD.LST
   8.176 +		if (/jmp/) {
   8.177 +			$0="	db	0A9h	; test ax,xxxx instead of " $0
   8.178 +			isotazboot=0
   8.179 +		}
   8.180 +	}
   8.181 +	if (file == "tazboot.cpp" && /;					s \+= 4/) isotazboot=13
   8.182 +	if (isotazboot == 13) { # TAZBOOT.LST
   8.183 +		if (/si,4/) $0="	lea	bx,[si+4]"
   8.184 +		if (/bx,si/) next
   8.185 +		if (/DGROUP:_topmem/ || /set_iso/) isotazboot=0
   8.186 +	}
   8.187 +	if (file == "tazboot.cpp" && /case 0x652F:/) isotazboot=12
   8.188 +	if (isotazboot == 12) { # TAZBOOT.LST
   8.189 +		sub(/si,word/,"bx,word")
   8.190 +		if (/short/) isotazboot=0
   8.191 +	}
   8.192 +	if (/return load_kernel/) isotazboot=11
   8.193 +	if (isotazboot == 11) { # TAZBOOT.LST
   8.194 +		sub(/call/,"jmp")
   8.195 +		if (/ret/ || /pop/) next
   8.196 +		if (/endp/) isotazboot=0
   8.197 +	}
   8.198  	if (/cmdline=s\+=3/ || /magic \!= 0/ || /&root_dev =/) { isotazboot=10; j="" }
   8.199  	if (isotazboot == 10) { # TAZBOOT.LST && LINLD.LST
   8.200  		if (/je/ || /jne/) { j=$1; next }
   8.201 @@ -215,9 +311,8 @@
   8.202  	}
   8.203  	if (/\+\+isknoppix/) isotazboot=7
   8.204  	if (isotazboot == 7) { # TAZBOOT.LST
   8.205 -		if (/al,byte/) sub (/al,byte ptr DGROUP:/,"bx,offset ")
   8.206 -		if (/inc/) sub (/al/,"word ptr [bx]")
   8.207 -		if (/,al/) next
   8.208 +		if (/inc/ || /,al/) next
   8.209 +		if (/al,byte/) sub (/mov	al,/,"inc	")
   8.210  		if (/isokernel/) isotazboot=0
   8.211  	}
   8.212  	if (/if \(c\) s\+\+;/) isotazboot=6
   8.213 @@ -228,6 +323,12 @@
   8.214  		}
   8.215  	}
   8.216  	if (/static void next_chunk/) isotazboot=5
   8.217 +	if (isotazboot == 501) {
   8.218 +		if (/ret/) {
   8.219 +			print "@1@86:"
   8.220 +			isotazboot=0
   8.221 +		}
   8.222 +	}
   8.223  	if (isotazboot == 5 || isotazboot == 500) { # TAZBOOT.LST
   8.224  		if (/cx,ax/) $0="	xchg	ax,bx"
   8.225  		if (/ax,word ptr \[si\+28\]/ && isotazboot == 500) next
   8.226 @@ -235,7 +336,19 @@
   8.227  		if (/push/ || /pop/ || /bp,sp/ || /si,/) next
   8.228  		sub(/\[si/,"[di")
   8.229  		if (/initrd_info/) isotazboot=500
   8.230 -		if (/endp/) isotazboot=0
   8.231 +		if (/bx\+6\]/) next
   8.232 +		if (/bx\+4\]/) sub(/mov	dx,/,"les	dx,d")
   8.233 +		sub(/di\+24\],ax/,"di+24],es")
   8.234 +		sub(/call/,"jmp")
   8.235 +		if (/ret/ || /pop/ || /^@1@86:/) next
   8.236 +		if (/_isostate\+14/) next
   8.237 +		if (/_isostate\+12/) {
   8.238 +			sub(/mov	ax,/,"les	ax,d")
   8.239 +			print
   8.240 +			print "	mov	dx,es"
   8.241 +			next
   8.242 +		}
   8.243 +		if (/ax,-4/) isotazboot++
   8.244  	}
   8.245  	if (/0x7FF0/) isotazboot=4
   8.246  	if (isotazboot == 4) { # TAZBOOT.LST
   8.247 @@ -266,6 +379,12 @@
   8.248  		}
   8.249  		if (/\[bp-4\],ax/) sub(/ax/,"bx")
   8.250  		if (/ax,word ptr \[bx\+2\]/ || /bx,ax/) next
   8.251 +		if (/_base_himem\+2,dx/) {
   8.252 +			print "	mov	bx,offset DGROUP:_base_himem+2"
   8.253 +		}
   8.254 +		sub(/DGROUP:_base_himem,/,"[bx-2],")
   8.255 +		sub(/DGROUP:_base_himem\+2,/,"[bx],")
   8.256 +		sub(/DGROUP:_base_himem\+3,/,"[bx+1],")
   8.257  		if (/@strcmp\$qpxzct1/) isotazboot=0
   8.258  	}
   8.259  	if (/static void addinitrd/) isotazboot=100
     9.1 --- a/syslinux/stuff/iso2exe/bootiso.S	Tue Jul 30 10:35:07 2019 +0200
     9.2 +++ b/syslinux/stuff/iso2exe/bootiso.S	Thu Aug 01 15:16:29 2019 +0200
     9.3 @@ -177,12 +177,10 @@
     9.4  	  movsb
     9.5  	ret
     9.6  	.org	0x7E00
     9.7 -
     9.8 -	.org	0x7F78
     9.9 +	.org	0x7F40
    9.10  ////////////////////////////// DOS EXE code ///////////////////////////////////
    9.11  
    9.12  exestart:
    9.13 -	cld
    9.14  	movw	129, %ax
    9.15  	cmpb	$0x2F, %al
    9.16  	je	ishelp
    9.17 @@ -223,6 +221,51 @@
    9.18  	//movb	$EXESTR(realmodemsg), %al
    9.19  isvm86:
    9.20  	call	goputs
    9.21 +//----------
    9.22 +	pushw	%di
    9.23 +//------------- insert argv[0] in cmdline -----------------------
    9.24 +	xchgw	%ax,%dx			// %ax = 0
    9.25 +	movw	%ax,%di
    9.26 +	movw	0x2C(%di),%es
    9.27 +	movw	%sp,%cx			// big enough
    9.28 +scalp:
    9.29 +	repne
    9.30 +	  scasb
    9.31 +	scasb
    9.32 +	jne	scalp
    9.33 +	incw	%di
    9.34 +	movw	%di,%bx
    9.35 +	incw	%di
    9.36 +	pushw	%di			// %es:%di = programme pathname
    9.37 +	repne
    9.38 +	  scasb
    9.39 +	subw	%di,%bx
    9.40 +	negw	%bx
    9.41 +	movw	$128,%si
    9.42 +	addw	%bx,(%si)
    9.43 +	lodsb	
    9.44 +	xchgw	%ax,%cx
    9.45 +	incw	%cx
    9.46 +	pushw	%si
    9.47 +p2lp:
    9.48 +	lodsb
    9.49 +	movb	%al,-2(%bx,%si)
    9.50 +	loop	p2lp
    9.51 +	popw	%si
    9.52 +	popw	%bx
    9.53 +	movb	$0x20,%al
    9.54 +p1lp:
    9.55 +	movb	%al,(%si)
    9.56 +	incw	%si
    9.57 +	movb	%es:(%bx),%al
    9.58 +	incw	%bx
    9.59 +	cmpw	%bx,%di
    9.60 +	ja	p1lp
    9.61 +//----------
    9.62 +	popw	%di
    9.63 +	pushw	%cs
    9.64 +	popw	%es
    9.65 +//----------
    9.66  	movw	comstart-end_header(%di), %si		// .com address
    9.67  	pushw	%di
    9.68  	movb	$0x7C/2, %ch		// 31K-31.5K, > com length
    9.69 @@ -242,17 +285,13 @@
    9.70  	.ascii	"real"			// real mode
    9.71  // --------------- Must be in 7FC0 7FFF range ------------------------
    9.72  mode:
    9.73 -	.ascii	" m"
    9.74 -ode:
    9.75 -	.ascii	"ode"
    9.76 +	.ascii	" mode"
    9.77  	.byte	EXESTR(eol)
    9.78  noDOS3:
    9.79 -	.ascii	"DOS3"			// DOS3?
    9.80 -need:
    9.81 -	.ascii	"?"
    9.82 +	.ascii	"DOS3?"			// DOS3?
    9.83  	.byte	EXESTR(eol)
    9.84  help:
    9.85 -	.ascii	"SliTaz iso boot."	// SliTaz iso boot.
    9.86 +	.ascii	"SliTaz iso boot"	// SliTaz iso boot
    9.87  eol:
    9.88  	.ascii	"\r\n"
    9.89  	.byte	1			// puts will return
    10.1 --- a/syslinux/stuff/iso2exe/init	Tue Jul 30 10:35:07 2019 +0200
    10.2 +++ b/syslinux/stuff/iso2exe/init	Thu Aug 01 15:16:29 2019 +0200
    10.3 @@ -1077,6 +1077,8 @@
    10.4  		[ -s /tmp/initrd ] && uncpio /tmp/initrd
    10.5  	fi
    10.6  	dosync
    10.7 +	sed -i 's/ || exit//' /init
    10.8 +	[ -s /etc/inittab ] || rm -rf /etc
    10.9  	exec ${init:-/init} $cmdline
   10.10  }
   10.11  
    11.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh	Tue Jul 30 10:35:07 2019 +0200
    11.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh	Thu Aug 01 15:16:29 2019 +0200
    11.3 @@ -309,6 +309,9 @@
    11.4  	find $TMP -print0 | xargs -0 touch -t 197001010100.00
    11.5  	( cd $TMP; find dev init.exe | cpio -o -H newc ) | compress > rootfs.gz
    11.6  	rm -rf $TMP
    11.7 +	chmod 644 ${@/init/rootfs.gz}
    11.8 +	chown root.root ${@/init/rootfs.gz}
    11.9 +	touch -t 197001010100.00 ${@/init/rootfs.gz}
   11.10  	ls -l $@ rootfs.gz
   11.11  	cp $0 $0.$$
   11.12  	cat >> $0.$$ <<EOM