wok-current rev 21984

linld: x86 support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Oct 14 11:20:06 2019 +0200 (2019-10-14)
parents 7f4bf91f0eb9
children d741df010f45
files linld/stuff/src/A20.ASM linld/stuff/src/CRTL.ASM linld/stuff/src/CRTL.H linld/stuff/src/CRTLX.H linld/stuff/src/JUMP.ASM linld/stuff/src/LINLD.CPP linld/stuff/src/LOAD.CPP linld/stuff/src/MEMCPY32.ASM linld/stuff/src/MEMTOP.ASM linld/stuff/src/VCPI.ASM linld/stuff/src/XMM.ASM linld/stuff/src/_BEG.ASM linld/stuff/src/pipehole.awk memtest/stuff/bootloader.S
line diff
     1.1 --- a/linld/stuff/src/A20.ASM	Sat Oct 12 12:08:52 2019 +0200
     1.2 +++ b/linld/stuff/src/A20.ASM	Mon Oct 14 11:20:06 2019 +0200
     1.3 @@ -2,6 +2,7 @@
     1.4  ;****** This file is distributed under GPL
     1.5  ;***************************************************************
     1.6                  ideal
     1.7 +		%PAGESIZE 1000
     1.8                  %crefref
     1.9                  %noincl
    1.10                  %nomacs
     2.1 --- a/linld/stuff/src/CRTL.ASM	Sat Oct 12 12:08:52 2019 +0200
     2.2 +++ b/linld/stuff/src/CRTL.ASM	Mon Oct 14 11:20:06 2019 +0200
     2.3 @@ -2,6 +2,7 @@
     2.4  ;****** This file is distributed under GPL
     2.5  ;***************************************************************
     2.6                  ideal
     2.7 +		%PAGESIZE 1000
     2.8                  %crefref
     2.9                  %noincl
    2.10                  %nomacs
    2.11 @@ -220,7 +221,7 @@
    2.12  open:
    2.13  	ifdef	LONG_FILENAME
    2.14  		mov	ax,716Ch
    2.15 -		push	bx di si
    2.16 +		push	bx si di
    2.17  		mov	si,bx
    2.18  		xor	bx,bx			; R/O
    2.19  		xor	cx,cx			; attributes
    2.20 @@ -228,7 +229,7 @@
    2.21  		cwd				; action = open
    2.22  		stc
    2.23                  int	21h
    2.24 -		pop	si di bx
    2.25 +		pop	di si bx
    2.26                  jnc	doret
    2.27  	endif
    2.28                  mov	ax,3d00h		; read-only+compatibility
    2.29 @@ -355,8 +356,8 @@
    2.30  		mov	ax,[_isostate.fd]
    2.31  	global	@lseekset2$qipul:near
    2.32  @lseekset2$qipul:
    2.33 -		mov	dx,[bx]
    2.34 -		mov	cx,[bx+2]
    2.35 +		les	dx,[dword bx]
    2.36 +		mov	cx,es
    2.37  		mov	bl,0
    2.38  		jmp	lseekset
    2.39  
    2.40 @@ -456,9 +457,8 @@
    2.41  		endif
    2.42  		cmp	[byte bx],'|'
    2.43  		je	@@test
    2.44 -		mov	al,0
    2.45  		inc	bx
    2.46 -		cmp	[bx-1],al
    2.47 +		cmp	[byte bx-1],0
    2.48  		jne	@@notopt
    2.49  		stc
    2.50  		jmp	@@nokeyword
    2.51 @@ -543,7 +543,8 @@
    2.52          global  die:near			; die(bx)
    2.53  die:
    2.54  		call	puts
    2.55 -;        global  _exit:near
    2.56 +        global  @exit$qv:near
    2.57 +@exit$qv:
    2.58  _exit:
    2.59  		mov	al,[_no_exit]
    2.60  		or	al,al
    2.61 @@ -794,8 +795,8 @@
    2.62  call_memcpy32:
    2.63  		push	edx
    2.64  		else
    2.65 -		mov	ax,[word ((image_himem bx).fallback)]
    2.66 -		mov	dx,[word ((image_himem bx).fallback)+2]
    2.67 +		les	ax,[dword ((image_himem bx).fallback)]
    2.68 +		mov	dx,es
    2.69  		mov	cx,[word ((image_himem bx).buf)]
    2.70  		cmp	ax,cx			; if (m->fallback != m->buf)
    2.71  		jnz	@@do
    2.72 @@ -841,8 +842,8 @@
    2.73  		ifndef	NO386
    2.74  		mov	edx,[bx]
    2.75  		else
    2.76 -		mov	ax,[bx]
    2.77 -		mov	dx,[bx+2]
    2.78 +		les	ax,[dword bx]
    2.79 +		mov	dx,es
    2.80  		endif
    2.81  		mov	cx,offset _xfer_buf
    2.82  storepage:					; storepage(edx,cx)
    2.83 @@ -1097,16 +1098,14 @@
    2.84  		or	si,si
    2.85  		jz	@@end
    2.86  		lodsb
    2.87 -		mov	dx,ax
    2.88  		or	al,20h
    2.89 -		cmp	al,'n'			; vga=normal
    2.90 -		je	@@vga
    2.91 +		cmp	al,'a'
    2.92 +		jb	@@notvga
    2.93 +		sub	al,'n'
    2.94 +@@vgaloop:
    2.95  		dec	cx
    2.96 -		cmp	al,'e'			; vga=extended
    2.97 -		je	@@vga
    2.98 -		dec	cx
    2.99 -		cmp	al,'a'			; vga=ask
   2.100 -		jne	@@notvga
   2.101 +		add	al,6
   2.102 +		jb	@@vgaloop		; vga=normal,extended,ask
   2.103  @@vga:
   2.104  		dec	cx
   2.105  		xchg	ax,cx
   2.106 @@ -1114,14 +1113,9 @@
   2.107  		jmp	@@popsiret
   2.108  @@notvga:
   2.109  		mov	cx,10			; radix
   2.110 -		xchg	ax,dx
   2.111 -		cmp	al,'+'
   2.112 -		je	@@radixskip
   2.113  		cmp	al,'-'
   2.114 -		clc
   2.115 -		jne	@@radixkeep
   2.116 -		stc
   2.117 -@@radixskip:
   2.118 +		ja	@@radixkeep
   2.119 +		cmc				; '+'=2B:C=0 '-'=2D:C=1
   2.120  		lodsb
   2.121  @@radixkeep:
   2.122  		pushf
   2.123 @@ -1175,8 +1169,7 @@
   2.124  @@popsiret:
   2.125  		pop	si
   2.126  		else
   2.127 -		push	si
   2.128 -		push	di
   2.129 +		push	si di
   2.130  		xor	ax,ax
   2.131  		cwd
   2.132  		or	bx,bx
   2.133 @@ -1184,31 +1177,24 @@
   2.134  		xchg	ax,di
   2.135  		mov	si,bx
   2.136  		lodsb
   2.137 -		mov	bx,ax
   2.138  		or	al,20h
   2.139 -		mov	cx,-1
   2.140 -		cmp	al,'n'			; vga=normal
   2.141 -		je	@@vga
   2.142 +		cmp	al,'a'
   2.143 +		jb	@@notvga
   2.144 +		xor	cx,cx
   2.145 +		sub	al,'n'
   2.146 +@@vgaloop:
   2.147  		dec	cx
   2.148 -		cmp	al,'e'			; vga=extended
   2.149 -		je	@@vga
   2.150 -		dec	cx
   2.151 -		cmp	al,'a'			; vga=ask
   2.152 -		jne	@@notvga
   2.153 +		add	al,6
   2.154 +		jb	@@vgaloop		; vga=normal,extended,ask
   2.155  @@vga:
   2.156  		xchg	ax,cx
   2.157  @@goend:
   2.158  		jmp	@@popdisiret
   2.159  @@notvga:
   2.160  		mov	cx,10			; radix
   2.161 -		xchg	ax,bx
   2.162 -		cmp	al,'+'
   2.163 -		je	@@radixskip
   2.164  		cmp	al,'-'
   2.165 -		clc
   2.166 -		jne	@@radixkeep
   2.167 -		stc
   2.168 -@@radixskip:
   2.169 +		ja	@@radixkeep
   2.170 +		cmc				; '+'=2B:C=0 '-'=2D:C=1
   2.171  		lodsb
   2.172  @@radixkeep:
   2.173  		pushf
   2.174 @@ -1236,21 +1222,19 @@
   2.175  		jae	@@endstrtol
   2.176  
   2.177  		push	ax
   2.178 -		push	si
   2.179  		push	dx
   2.180 +		xchg	ax,bx
   2.181 +		mul	cx
   2.182 +		xchg	ax,bx
   2.183 +		xchg	ax,dx
   2.184  		xchg	ax,di
   2.185 -		mul	cx
   2.186 -		xchg	ax,di
   2.187 -		xchg	ax,dx
   2.188 -		xchg	ax,si
   2.189  		pop	ax
   2.190  		mul	cx
   2.191 -		add	ax,si
   2.192 -		pop	si
   2.193 +		add	ax,di
   2.194  		xchg	ax,dx
   2.195  		pop	ax
   2.196  		mov	ah,0
   2.197 -		add	di,ax
   2.198 +		add	bx,ax
   2.199  		adc	dx,0
   2.200  
   2.201  		jmp	@@strtollp
   2.202 @@ -1272,14 +1256,13 @@
   2.203  		popf
   2.204  		jnc	@@end
   2.205  		not	dx
   2.206 -		neg	di
   2.207 +		neg	bx
   2.208  		jne	@@end
   2.209  		inc	dx
   2.210  @@end:
   2.211 -		xchg	ax,di
   2.212 +		xchg	ax,bx
   2.213  @@popdisiret:
   2.214 -		pop	di
   2.215 -		pop	si
   2.216 +		pop	di si
   2.217  		endif
   2.218  strtol_ret:
   2.219  		ret
     3.1 --- a/linld/stuff/src/CRTL.H	Sat Oct 12 12:08:52 2019 +0200
     3.2 +++ b/linld/stuff/src/CRTL.H	Mon Oct 14 11:20:06 2019 +0200
     3.3 @@ -48,8 +48,12 @@
     3.4  #define int3() do { asm { db 0cch } } while(0)
     3.5  #define nop() do { asm { db 90h } } while(0)
     3.6  extern char no_exit;
     3.7 +extern void exit();
     3.8  extern _fastcall int die(const char* msg);
     3.9  //extern "C" char* malloc_or_die(unsigned size);
    3.10  //extern "C" unsigned long* malloc_bufv_or_die(struct image_himem *m);
    3.11  extern _fastcall int malloc_or_die(unsigned size);
    3.12  extern _fastcall int malloc_bufv_or_die(struct image_himem *m);
    3.13 +extern char cpu_features[];
    3.14 +#define CPUMASKLM  (0x20)
    3.15 +#define cpuhaslm() (cpu_features[3]&CPUMASKLM)
     4.1 --- a/linld/stuff/src/CRTLX.H	Sat Oct 12 12:08:52 2019 +0200
     4.2 +++ b/linld/stuff/src/CRTLX.H	Mon Oct 14 11:20:06 2019 +0200
     4.3 @@ -9,6 +9,3 @@
     4.4  //extern "C" char *ultoa(unsigned long n);
     4.5  extern _fastcall int ultoa(unsigned long n);
     4.6  extern "C" void try_default_args();
     4.7 -extern char cpu_features[];
     4.8 -#define CPUMASKLM  (0x20)
     4.9 -#define cpuhaslm() (cpu_features[3]&CPUMASKLM)
     5.1 --- a/linld/stuff/src/JUMP.ASM	Sat Oct 12 12:08:52 2019 +0200
     5.2 +++ b/linld/stuff/src/JUMP.ASM	Mon Oct 14 11:20:06 2019 +0200
     5.3 @@ -2,6 +2,7 @@
     5.4  ;****** This file is distributed under GPL
     5.5  ;***************************************************************
     5.6                  ideal
     5.7 +		%PAGESIZE 1000
     5.8                  %crefref
     5.9                  %noincl
    5.10                  %nomacs
    5.11 @@ -114,6 +115,7 @@
    5.12  		rep
    5.13  		  movsb
    5.14  		ifdef	NO386
    5.15 +		mov	bx,ss
    5.16  		add	bh,9
    5.17  		push	bx			; topseg()+0x0900
    5.18  		else
     6.1 --- a/linld/stuff/src/LINLD.CPP	Sat Oct 12 12:08:52 2019 +0200
     6.2 +++ b/linld/stuff/src/LINLD.CPP	Mon Oct 14 11:20:06 2019 +0200
     6.3 @@ -5,9 +5,13 @@
     6.4  #include "crtl.h"
     6.5  #include "common.h"
     6.6  
     6.7 +const char* cmdline = "auto";
     6.8  const char* kernel_name = "bzImage";
     6.9 +#ifdef	USE_ARGSTR
    6.10 +const char* initrd_name = NULL;
    6.11 +#else
    6.12  const char* initrd_name;
    6.13 -const char* cmdline = "auto";
    6.14 +#endif
    6.15  u32 root_dev;
    6.16  u32 vid_mode;		// -3 = ask
    6.17  			// -2 = Extended VGA
    6.18 @@ -21,6 +25,7 @@
    6.19          "LINLD [image=file] [initrd=files] [vga=mode] [root=num] [mem=max] [cl=cmdline]" NL
    6.20          "vga mode: ask,extended,normal or dec/oct/hex number" NL
    6.21          "-f force" NL
    6.22 +        "-64 for cpu64 only" NL
    6.23          "Defaults:" NL
    6.24          "\timage=bzImage" NL
    6.25          "\tinitrd,vga,root=(void)" NL
    6.26 @@ -50,31 +55,29 @@
    6.27      // Parse command line
    6.28  #ifdef	USE_ARGSTR
    6.29      if (!argv[1]) syntax();
    6.30 -    {for (;;) {
    6.31 +    for (;;) {
    6.32  	const char **clp = &cmdline;
    6.33 -    next:
    6.34  	argv++;
    6.35 -	if (!*argv) {
    6.36 +	if (!*argv) goto boot;
    6.37 +        if ((*(u16 *)*argv|2) == 0x362F) {	// -64 /64
    6.38 +	    if (cpuhaslm() == 0) exit();
    6.39 +	}
    6.40 +        if ((*(u16 *)*argv|0x2002) == 0x662F) {	// -F /f
    6.41 +	    skip_alloc++;
    6.42 +	}
    6.43 +	else if (argstr(*argv,"cl|image|initrd",clp) != -1);
    6.44 +	else if (fileexist(*argv) != -1)
    6.45 +            kernel_name=*argv;
    6.46 +	else if (argnum(*argv,"root|vga|mem|-b",&root_dev) != -1);
    6.47 +	else {
    6.48 +	    *clp = (const char *) buf_cmdline + 1;
    6.49 +	    strcatb((const char *) buf_cmdline,*argv);
    6.50 +	boot:
    6.51              puts(*clp);
    6.52  	    set_cmdline(*clp);
    6.53  	    puts(load_kernel());
    6.54  	    load_initrd();
    6.55  	    boot_kernel();
    6.56 -	}
    6.57 -        if ((*(u16 *)*argv|0x2002) == 0x662F) {	// -F /f
    6.58 -	    skip_alloc++;
    6.59 -	    goto next;
    6.60 -	}
    6.61 -	if (argstr(*argv,"cl|image|initrd",clp) != -1);
    6.62 -	else if (fileexist(*argv) != -1)
    6.63 -            kernel_name=*argv;
    6.64 -	else if (*argv) {
    6.65 -	    argnum(*argv,"root|vga|mem|-b",&root_dev);
    6.66 -	    *clp = (const char *) buf_cmdline + 1;
    6.67 -	    strcatb((const char *) buf_cmdline,*argv);
    6.68 -	}
    6.69 -	else
    6.70 -	    break;
    6.71          }
    6.72      }
    6.73  #else
    6.74 @@ -96,6 +99,9 @@
    6.75              *(u16*)&vid_mode = (u16)strtol(s+7);	// support normal, extended & ask
    6.76          }
    6.77          else switch (*(u16 *)s|0x2002) {
    6.78 +        case 0x362F:	// -64 /64
    6.79 +	    if (cpuhaslm() == 0) exit();
    6.80 +	    goto next;
    6.81  	case 0x662F:	// -F /f
    6.82  	    skip_alloc++;
    6.83  	    goto next;
     7.1 --- a/linld/stuff/src/LOAD.CPP	Sat Oct 12 12:08:52 2019 +0200
     7.2 +++ b/linld/stuff/src/LOAD.CPP	Mon Oct 14 11:20:06 2019 +0200
     7.3 @@ -191,13 +191,13 @@
     7.4              //   heap_end_ptr appears to be relative to the start of setup (ofs 0x0200)
     7.5              kernelparams->heap_end_ptr = _32k-0x0200;
     7.6              kernelparams->loadflags |= 0x80; // says to rm loader it's ok to use heap
     7.7 -        }
     7.8 -        // * if we will ever stop moving ourself to 0x90000
     7.9 -        //   we must say setup.S how much to move
    7.10 -        //kernelparams->setup_move_size = _32k;
    7.11 -        if(kernelparams->version >= 0x202) { // starting linux 2.4.0-test3-pre3
    7.12 -            kernelparams->cmd_line_ptr = (((u32)(topseg()+0x0800))<<4);
    7.13 -            goto cmd_line_ok;
    7.14 +            // * if we will ever stop moving ourself to 0x90000
    7.15 +            //   we must say setup.S how much to move
    7.16 +            //kernelparams->setup_move_size = _32k;
    7.17 +            if(kernelparams->version >= 0x202) { // starting linux 2.4.0-test3-pre3
    7.18 +                kernelparams->cmd_line_ptr = (((u32)(topseg()+0x0800))<<4);
    7.19 +                goto cmd_line_ok;
    7.20 +            }
    7.21          }
    7.22      }
    7.23      first1k->cl_magic_ofs = 0x8000A33F;
     8.1 --- a/linld/stuff/src/MEMCPY32.ASM	Sat Oct 12 12:08:52 2019 +0200
     8.2 +++ b/linld/stuff/src/MEMCPY32.ASM	Mon Oct 14 11:20:06 2019 +0200
     8.3 @@ -2,6 +2,7 @@
     8.4  ;****** This file is distributed under GPL
     8.5  ;***************************************************************
     8.6                  ideal
     8.7 +		%PAGESIZE 1000
     8.8                  %crefref
     8.9                  %noincl
    8.10                  %nomacs
     9.1 --- a/linld/stuff/src/MEMTOP.ASM	Sat Oct 12 12:08:52 2019 +0200
     9.2 +++ b/linld/stuff/src/MEMTOP.ASM	Mon Oct 14 11:20:06 2019 +0200
     9.3 @@ -2,6 +2,7 @@
     9.4  ;****** This file is distributed under GPL
     9.5  ;***************************************************************
     9.6                  ideal
     9.7 +		%PAGESIZE 1000
     9.8                  %crefref
     9.9                  %noincl
    9.10                  %nomacs
    10.1 --- a/linld/stuff/src/VCPI.ASM	Sat Oct 12 12:08:52 2019 +0200
    10.2 +++ b/linld/stuff/src/VCPI.ASM	Mon Oct 14 11:20:06 2019 +0200
    10.3 @@ -24,6 +24,7 @@
    10.4  
    10.5  
    10.6                  ideal
    10.7 +		%PAGESIZE 1000
    10.8                  %crefref
    10.9                  %noincl
   10.10                  %nomacs
    11.1 --- a/linld/stuff/src/XMM.ASM	Sat Oct 12 12:08:52 2019 +0200
    11.2 +++ b/linld/stuff/src/XMM.ASM	Mon Oct 14 11:20:06 2019 +0200
    11.3 @@ -2,6 +2,7 @@
    11.4  ;****** This file is distributed under GPL
    11.5  ;***************************************************************
    11.6                  ideal
    11.7 +		%PAGESIZE 1000
    11.8                  %crefref
    11.9                  %noincl
   11.10                  %nomacs
    12.1 --- a/linld/stuff/src/_BEG.ASM	Sat Oct 12 12:08:52 2019 +0200
    12.2 +++ b/linld/stuff/src/_BEG.ASM	Mon Oct 14 11:20:06 2019 +0200
    12.3 @@ -2,6 +2,7 @@
    12.4  ;****** This file is distributed under GPL
    12.5  ;***************************************************************
    12.6                  ideal
    12.7 +		%PAGESIZE 1000
    12.8                  %crefref
    12.9                  %noincl
   12.10                  %nomacs
   12.11 @@ -33,10 +34,8 @@
   12.12          label   _bss_start byte
   12.13  		db	STACK_SIZE-2 dup(?)
   12.14  stktop		dw	?
   12.15 -		ifdef	EXTRA
   12.16          global  _cpu_features:dword
   12.17  _cpu_features	dd	?
   12.18 -		endif
   12.19          ends    _BSS
   12.20  
   12.21          segment _TEXT byte public use16 'CODE'
   12.22 @@ -148,7 +147,6 @@
   12.23  		jnz	no_vcpi
   12.24  		inc	[byte bx+_vcpi-msg_badmapping]
   12.25  endcpu386:
   12.26 -		ifdef	EXTRA
   12.27  		pushfd
   12.28  		pop	dx
   12.29  		pop	ax
   12.30 @@ -166,7 +164,6 @@
   12.31  		cpuid
   12.32  		mov	[_cpu_features],edx
   12.33  @@no_cpuid:
   12.34 -		endif
   12.35  endcpu86:
   12.36                  p8086
   12.37  
    13.1 --- a/linld/stuff/src/pipehole.awk	Sat Oct 12 12:08:52 2019 +0200
    13.2 +++ b/linld/stuff/src/pipehole.awk	Mon Oct 14 11:20:06 2019 +0200
    13.3 @@ -6,16 +6,85 @@
    13.4  	if (/^@.*:$/ || /	endp$/) afterjmp=0
    13.5  	if (/^	\.386p$/) is386=1
    13.6  	if (file == "" && /debug	S/) { file=$3; gsub(/\"/,"",file) }
    13.7 +	if (/debug	S/) print "	%PAGESIZE 1000"
    13.8 +	 if (file == "tazboot.cpp") {
    13.9 +	if (/add	si,2/) $0="	lodsw	; " $0
   13.10 +	if (/add	si,4/) { print "	lodsw"; $0="	lodsw	; " $0 }
   13.11 +	if (/add	di,2/) $0="	scasw	; " $0
   13.12 +	 } # file == "tazboot.cpp"
   13.13 +	 if (file == "linld.cpp") {
   13.14 +	if (/add	si,2/) $0="	lodsw	; " $0
   13.15 +	if (/add	di,2/) $0="	scasw	; " $0
   13.16 +	if (/bx,offset DGROUP:s@\+26/) sub(/mov/,";mov")
   13.17 +	if (islinld==1) {
   13.18 +		print "; " $0
   13.19 +		if (!/word ptr/) next
   13.20 +		islinld=0
   13.21 +		sub(/,word.*/,",di	; argv")
   13.22 +		if (/di,di/) { print "; " $0; next }
   13.23 +	}
   13.24 +	if (/^_main	proc/) islinld=1
   13.25 +	if (/== 0x662F/) islinld=2
   13.26 +	if (islinld==2) {
   13.27 +		if (/cpuhaslm/) islinld=0
   13.28 +		if (/mov/) { print "; " $0; next }
   13.29 +	}
   13.30 +	if (/image\|initrd/) islinld=3
   13.31 +	if (islinld==3) {
   13.32 +		if (/bx,word ptr/) { islinld=0; print "; " $0; next }
   13.33 +	}
   13.34 +	if (/fileexist\$qpxzc/) islinld=4
   13.35 +	if (islinld==4) {
   13.36 +		if (/ax,-1/) print "	mov	bx,word ptr [si]"
   13.37 +		if (/ax,word ptr/) $0="	xchg	ax,bx"
   13.38 +		if (/\[si\]$/) { islinld=0; print "; " $0; next }
   13.39 +	}
   13.40 +	 } # file == "linld.cpp"
   13.41  	 if (file == "himem.cpp") {
   13.42 -	if (/remaining = m-/) ishimem=1
   13.43 +	if (/void load_image/) ishimem=1
   13.44  	if (ishimem == 1 && is386 == 0) {
   13.45  		if (/si\+8\]$/ || /si\+4\]$/ || /si\+16\]$/) next
   13.46  		if (/si\+6\]$/ || /si\+2\]$/ || /si\+14\]$/) sub(/mov	dx,/,"les	dx,d")
   13.47  		if (/si\+12\],ax/ || /si\+16\],ax/ || /bp-2\],ax/) sub(/,ax/,",es")
   13.48 -		if (/do \{/) ishimem=0
   13.49 +	}
   13.50 +	if (ishimem == 1) {
   13.51 +		if (/do \{/) ishimem=2
   13.52 +		if (/byte ptr DGROUP:_vcpi,0/) print "	mov	bx,si"
   13.53 +		if (/bx,si/) next
   13.54 +		if (/sp,6/) {
   13.55 +			print "	push	si"
   13.56 +			print "	push	si"
   13.57 +			next
   13.58 +		}
   13.59 +	}
   13.60 +	if (ishimem == 2) {
   13.61 +		if (/movzx/) print "	cwde"
   13.62 +		if (/bp-6/) next
   13.63 +		if (/storepage.bufv/) {
   13.64 +			print "	inc	ax"
   13.65 +			print "	push	ax"
   13.66 +		}
   13.67 +		if (/buf \+= size;/) {
   13.68 +			print "	pop	ax"
   13.69 +		}
   13.70 +		if (/Read error/) ishimem=0
   13.71  	}
   13.72  	 } # file == "himem.cpp"
   13.73  	 if (file == "load.cpp") {
   13.74 +	if (/word ptr \[si\+21\],513$/) isload=11
   13.75 +	if (isload == 12) {  # LOAD.LST
   13.76 +		if (/cmp/) next
   13.77 +		if (/jb/) isload=0
   13.78 +		sub(/jb/,"jcxz")
   13.79 +	}
   13.80 +	if (isload == 11) {  # LOAD.LST
   13.81 +		if (/cmp/) {
   13.82 +			print "	mov	cx,513"
   13.83 +			$0="	sub	cx,word ptr [si+21]"
   13.84 +		}
   13.85 +		if (/jb/) isload=12
   13.86 +		sub(/jb/,"ja")
   13.87 +	}
   13.88  	sub(/DGROUP:_imgs\+65534/,"[di-2]")
   13.89  	if (/short @1@366$/) isload=10
   13.90  	if (isload == 10) {  # LOAD.LST
   13.91 @@ -53,10 +122,7 @@
   13.92  	}
   13.93  	if (/\[0\] = m-\>fallback/) isload=6
   13.94  	if (isload == 6) {  # LOAD.LST
   13.95 -		if (/si\+2/) {
   13.96 -			print "	inc	si"
   13.97 -			$0="	inc	si"
   13.98 -		}
   13.99 +		if (/si\+2/) $0="	lodsw"
  13.100  		if (/les/) sub(/bx,/,"ax,")
  13.101  		if (/bx\+4/ || /es:/) {
  13.102  			if (/bx\+4/) isload=0
    14.1 --- a/memtest/stuff/bootloader.S	Sat Oct 12 12:08:52 2019 +0200
    14.2 +++ b/memtest/stuff/bootloader.S	Mon Oct 14 11:20:06 2019 +0200
    14.3 @@ -467,7 +467,9 @@
    14.4  # Assume no error on first track.
    14.5  
    14.6  #ifdef FLOPPY_1440K_ONLY
    14.7 +#ifndef FLOPPY_HAS_2_SIDES
    14.8  #define FLOPPY_HAS_2_SIDES	hardcore heads count to 2
    14.9 +#endif
   14.10  #define FLOPPY_SECTORS		18	/* 18 sectors */
   14.11  #else
   14.12  #define FLOPPY_HEADS		2	/* 2 heads minimum */